From 043639156aef89f75b8a43db7feed80c569e39a8 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 12:00:36 +0300 Subject: [PATCH 1/6] CE-160 oap-template: A default value (`??`) can follow the function call --- oap-formats/oap-template/README.md | 9 ++++ .../main/antlr4/TemplateGrammarExpression.g4 | 2 +- .../template/TemplateGrammarExpression.interp | 2 +- .../template/TemplateGrammarExpression.java | 20 ++++----- .../java/oap/template/TemplateMacros.java | 24 +++++++++++ .../oap/template/render/TemplateAstUtils.java | 7 +++ .../java/oap/template/TemplateMacrosTest.java | 43 ++++++++++++++++++- pom.xml | 2 +- 8 files changed, 94 insertions(+), 15 deletions(-) diff --git a/oap-formats/oap-template/README.md b/oap-formats/oap-template/README.md index 3256ccac46..32e33ad3ac 100644 --- a/oap-formats/oap-template/README.md +++ b/oap-formats/oap-template/README.md @@ -616,6 +616,14 @@ All range forms accept an optional `{{% else %}}` branch. It renders when the co {{ obj ; toJson() }} ``` +A default value (`??`) can follow the function call: + +``` +{{ byteField ; toString() ?? 'n/a' }} +``` + +This renders `'n/a'` when `byteField` is null. + ### Cast types `${ field ?? 0.0 }` — forces the expression result to be interpreted as the given type. Useful when the field is typed as `Object` (e.g., in `Map`) but the actual runtime type is known. @@ -651,6 +659,7 @@ Registered automatically from `META-INF/oap-template-macros.list` on the classpa | `toLowerCase()` | `(String src)` | Converts to lower case; null-safe | | `format(pattern)` | `(DateTime dt, String pattern)` | Formats a Joda `DateTime`; predefined patterns: `SIMPLE`, `MILLIS`, `SIMPLE_CLEAN`, `DATE` | | `toJson()` | `(Object obj)` | Serialises the value to JSON | +| `toString()` | `(Byte\|Short\|Integer\|Long\|Float\|Double src)` | Converts a numeric wrapper to its string representation; returns `null` for `null` input (so `?? default` applies) | | `default(fallback)` | `(Object in, Object fallback)` | Returns fallback if in is null or empty | --- diff --git a/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 b/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 index a7995bebad..ae868f4c92 100644 --- a/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 +++ b/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 @@ -32,7 +32,7 @@ import oap.util.Lists; } expression returns [Expression ret] - : (BLOCK_COMMENT)? (CAST_TYPE)? (ifCode | pipeCode | withCode | exprsCode) defaultValue? function? (IF ifCondition)? { + : (BLOCK_COMMENT)? (CAST_TYPE)? (ifCode | pipeCode | withCode | exprsCode) function? defaultValue? (IF ifCondition)? { $ret = new Expression( $BLOCK_COMMENT.text, $CAST_TYPE.text != null ? $CAST_TYPE.text.substring( 1, $CAST_TYPE.text.length() - 1 ) : null, diff --git a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp index 44a4730443..43e2d768cf 100644 --- a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp +++ b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp @@ -136,4 +136,4 @@ mathOperation atn: -[4, 1, 50, 438, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 1, 0, 3, 0, 58, 8, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 67, 8, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 3, 0, 73, 8, 0, 1, 0, 1, 0, 3, 0, 77, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 87, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 109, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 128, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 4, 5, 136, 8, 5, 11, 5, 12, 5, 137, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 146, 8, 6, 11, 6, 12, 6, 147, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 156, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 167, 8, 9, 10, 9, 12, 9, 170, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 178, 8, 10, 10, 10, 12, 10, 181, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 190, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 205, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 223, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 243, 8, 15, 1, 16, 3, 16, 246, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 254, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 265, 8, 18, 10, 18, 12, 18, 268, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 284, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 294, 8, 20, 10, 20, 12, 20, 297, 9, 20, 1, 20, 3, 20, 300, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 310, 8, 20, 10, 20, 12, 20, 313, 9, 20, 1, 20, 3, 20, 316, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 322, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 329, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 340, 8, 20, 10, 20, 12, 20, 343, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 359, 8, 20, 10, 20, 12, 20, 362, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 368, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 373, 8, 20, 1, 20, 1, 20, 3, 20, 377, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 382, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 389, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 402, 8, 23, 10, 23, 12, 23, 405, 9, 23, 1, 24, 1, 24, 1, 24, 4, 24, 410, 8, 24, 11, 24, 12, 24, 411, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 434, 8, 26, 1, 27, 1, 27, 1, 27, 0, 0, 28, 0, 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, 0, 3, 1, 0, 7, 8, 1, 0, 9, 18, 2, 0, 34, 36, 38, 38, 479, 0, 57, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 108, 1, 0, 0, 0, 6, 110, 1, 0, 0, 0, 8, 127, 1, 0, 0, 0, 10, 129, 1, 0, 0, 0, 12, 139, 1, 0, 0, 0, 14, 155, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 160, 1, 0, 0, 0, 20, 171, 1, 0, 0, 0, 22, 189, 1, 0, 0, 0, 24, 204, 1, 0, 0, 0, 26, 222, 1, 0, 0, 0, 28, 224, 1, 0, 0, 0, 30, 242, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 249, 1, 0, 0, 0, 36, 258, 1, 0, 0, 0, 38, 283, 1, 0, 0, 0, 40, 376, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 390, 1, 0, 0, 0, 46, 395, 1, 0, 0, 0, 48, 424, 1, 0, 0, 0, 50, 426, 1, 0, 0, 0, 52, 433, 1, 0, 0, 0, 54, 435, 1, 0, 0, 0, 56, 58, 5, 21, 0, 0, 57, 56, 1, 0, 0, 0, 57, 58, 1, 0, 0, 0, 58, 60, 1, 0, 0, 0, 59, 61, 5, 46, 0, 0, 60, 59, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 66, 1, 0, 0, 0, 62, 67, 3, 2, 1, 0, 63, 67, 3, 6, 3, 0, 64, 67, 3, 8, 4, 0, 65, 67, 3, 14, 7, 0, 66, 62, 1, 0, 0, 0, 66, 63, 1, 0, 0, 0, 66, 64, 1, 0, 0, 0, 66, 65, 1, 0, 0, 0, 67, 69, 1, 0, 0, 0, 68, 70, 3, 28, 14, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 72, 1, 0, 0, 0, 71, 73, 3, 34, 17, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 76, 1, 0, 0, 0, 74, 75, 5, 1, 0, 0, 75, 77, 3, 16, 8, 0, 76, 74, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 6, 0, -1, 0, 79, 1, 1, 0, 0, 0, 80, 81, 5, 1, 0, 0, 81, 82, 3, 16, 8, 0, 82, 83, 5, 2, 0, 0, 83, 86, 3, 4, 2, 0, 84, 85, 5, 3, 0, 0, 85, 87, 3, 4, 2, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 89, 5, 4, 0, 0, 89, 90, 6, 1, -1, 0, 90, 3, 1, 0, 0, 0, 91, 92, 3, 40, 20, 0, 92, 93, 6, 2, -1, 0, 93, 109, 1, 0, 0, 0, 94, 95, 5, 41, 0, 0, 95, 109, 6, 2, -1, 0, 96, 97, 5, 40, 0, 0, 97, 109, 6, 2, -1, 0, 98, 99, 5, 42, 0, 0, 99, 109, 6, 2, -1, 0, 100, 101, 5, 38, 0, 0, 101, 102, 5, 42, 0, 0, 102, 109, 6, 2, -1, 0, 103, 104, 5, 43, 0, 0, 104, 109, 6, 2, -1, 0, 105, 106, 5, 38, 0, 0, 106, 107, 5, 43, 0, 0, 107, 109, 6, 2, -1, 0, 108, 91, 1, 0, 0, 0, 108, 94, 1, 0, 0, 0, 108, 96, 1, 0, 0, 0, 108, 98, 1, 0, 0, 0, 108, 100, 1, 0, 0, 0, 108, 103, 1, 0, 0, 0, 108, 105, 1, 0, 0, 0, 109, 5, 1, 0, 0, 0, 110, 111, 3, 40, 20, 0, 111, 112, 5, 39, 0, 0, 112, 113, 3, 40, 20, 0, 113, 114, 6, 3, -1, 0, 114, 7, 1, 0, 0, 0, 115, 116, 3, 40, 20, 0, 116, 117, 5, 24, 0, 0, 117, 118, 3, 10, 5, 0, 118, 119, 5, 25, 0, 0, 119, 120, 6, 4, -1, 0, 120, 128, 1, 0, 0, 0, 121, 122, 3, 40, 20, 0, 122, 123, 5, 24, 0, 0, 123, 124, 3, 14, 7, 0, 124, 125, 5, 25, 0, 0, 125, 126, 6, 4, -1, 0, 126, 128, 1, 0, 0, 0, 127, 115, 1, 0, 0, 0, 127, 121, 1, 0, 0, 0, 128, 9, 1, 0, 0, 0, 129, 130, 3, 48, 24, 0, 130, 135, 6, 5, -1, 0, 131, 132, 5, 37, 0, 0, 132, 133, 3, 48, 24, 0, 133, 134, 6, 5, -1, 0, 134, 136, 1, 0, 0, 0, 135, 131, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 11, 1, 0, 0, 0, 139, 140, 3, 48, 24, 0, 140, 145, 6, 6, -1, 0, 141, 142, 5, 37, 0, 0, 142, 143, 3, 48, 24, 0, 143, 144, 6, 6, -1, 0, 144, 146, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 13, 1, 0, 0, 0, 149, 150, 3, 12, 6, 0, 150, 151, 6, 7, -1, 0, 151, 156, 1, 0, 0, 0, 152, 153, 3, 40, 20, 0, 153, 154, 6, 7, -1, 0, 154, 156, 1, 0, 0, 0, 155, 149, 1, 0, 0, 0, 155, 152, 1, 0, 0, 0, 156, 15, 1, 0, 0, 0, 157, 158, 3, 18, 9, 0, 158, 159, 6, 8, -1, 0, 159, 17, 1, 0, 0, 0, 160, 161, 3, 20, 10, 0, 161, 168, 6, 9, -1, 0, 162, 163, 5, 6, 0, 0, 163, 164, 3, 20, 10, 0, 164, 165, 6, 9, -1, 0, 165, 167, 1, 0, 0, 0, 166, 162, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 19, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 3, 22, 11, 0, 172, 179, 6, 10, -1, 0, 173, 174, 5, 5, 0, 0, 174, 175, 3, 22, 11, 0, 175, 176, 6, 10, -1, 0, 176, 178, 1, 0, 0, 0, 177, 173, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 21, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 7, 0, 0, 0, 183, 184, 3, 22, 11, 0, 184, 185, 6, 11, -1, 0, 185, 190, 1, 0, 0, 0, 186, 187, 3, 24, 12, 0, 187, 188, 6, 11, -1, 0, 188, 190, 1, 0, 0, 0, 189, 182, 1, 0, 0, 0, 189, 186, 1, 0, 0, 0, 190, 23, 1, 0, 0, 0, 191, 192, 5, 27, 0, 0, 192, 193, 3, 16, 8, 0, 193, 194, 5, 28, 0, 0, 194, 195, 6, 12, -1, 0, 195, 205, 1, 0, 0, 0, 196, 197, 3, 40, 20, 0, 197, 198, 7, 1, 0, 0, 198, 199, 3, 26, 13, 0, 199, 200, 6, 12, -1, 0, 200, 205, 1, 0, 0, 0, 201, 202, 3, 40, 20, 0, 202, 203, 6, 12, -1, 0, 203, 205, 1, 0, 0, 0, 204, 191, 1, 0, 0, 0, 204, 196, 1, 0, 0, 0, 204, 201, 1, 0, 0, 0, 205, 25, 1, 0, 0, 0, 206, 207, 5, 41, 0, 0, 207, 223, 6, 13, -1, 0, 208, 209, 5, 40, 0, 0, 209, 223, 6, 13, -1, 0, 210, 211, 5, 42, 0, 0, 211, 223, 6, 13, -1, 0, 212, 213, 5, 38, 0, 0, 213, 214, 5, 42, 0, 0, 214, 223, 6, 13, -1, 0, 215, 216, 5, 43, 0, 0, 216, 223, 6, 13, -1, 0, 217, 218, 5, 38, 0, 0, 218, 219, 5, 43, 0, 0, 219, 223, 6, 13, -1, 0, 220, 221, 5, 44, 0, 0, 221, 223, 6, 13, -1, 0, 222, 206, 1, 0, 0, 0, 222, 208, 1, 0, 0, 0, 222, 210, 1, 0, 0, 0, 222, 212, 1, 0, 0, 0, 222, 215, 1, 0, 0, 0, 222, 217, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 223, 27, 1, 0, 0, 0, 224, 225, 5, 31, 0, 0, 225, 226, 3, 30, 15, 0, 226, 227, 6, 14, -1, 0, 227, 29, 1, 0, 0, 0, 228, 229, 5, 41, 0, 0, 229, 243, 6, 15, -1, 0, 230, 231, 5, 40, 0, 0, 231, 243, 6, 15, -1, 0, 232, 233, 3, 32, 16, 0, 233, 234, 6, 15, -1, 0, 234, 243, 1, 0, 0, 0, 235, 236, 5, 43, 0, 0, 236, 243, 6, 15, -1, 0, 237, 238, 5, 44, 0, 0, 238, 243, 6, 15, -1, 0, 239, 240, 5, 29, 0, 0, 240, 241, 5, 30, 0, 0, 241, 243, 6, 15, -1, 0, 242, 228, 1, 0, 0, 0, 242, 230, 1, 0, 0, 0, 242, 232, 1, 0, 0, 0, 242, 235, 1, 0, 0, 0, 242, 237, 1, 0, 0, 0, 242, 239, 1, 0, 0, 0, 243, 31, 1, 0, 0, 0, 244, 246, 5, 38, 0, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 42, 0, 0, 248, 33, 1, 0, 0, 0, 249, 250, 5, 32, 0, 0, 250, 251, 5, 45, 0, 0, 251, 253, 5, 27, 0, 0, 252, 254, 3, 36, 18, 0, 253, 252, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 5, 28, 0, 0, 256, 257, 6, 17, -1, 0, 257, 35, 1, 0, 0, 0, 258, 259, 3, 38, 19, 0, 259, 266, 6, 18, -1, 0, 260, 261, 5, 33, 0, 0, 261, 262, 3, 38, 19, 0, 262, 263, 6, 18, -1, 0, 263, 265, 1, 0, 0, 0, 264, 260, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 37, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 42, 0, 0, 270, 284, 6, 19, -1, 0, 271, 272, 5, 38, 0, 0, 272, 273, 5, 42, 0, 0, 273, 284, 6, 19, -1, 0, 274, 275, 5, 43, 0, 0, 275, 284, 6, 19, -1, 0, 276, 277, 5, 38, 0, 0, 277, 278, 5, 43, 0, 0, 278, 284, 6, 19, -1, 0, 279, 280, 5, 41, 0, 0, 280, 284, 6, 19, -1, 0, 281, 282, 5, 40, 0, 0, 282, 284, 6, 19, -1, 0, 283, 269, 1, 0, 0, 0, 283, 271, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 276, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 39, 1, 0, 0, 0, 285, 286, 5, 20, 0, 0, 286, 287, 5, 26, 0, 0, 287, 288, 3, 42, 21, 0, 288, 295, 6, 20, -1, 0, 289, 290, 5, 26, 0, 0, 290, 291, 3, 42, 21, 0, 291, 292, 6, 20, -1, 0, 292, 294, 1, 0, 0, 0, 293, 289, 1, 0, 0, 0, 294, 297, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 298, 300, 3, 50, 25, 0, 299, 298, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 6, 20, -1, 0, 302, 377, 1, 0, 0, 0, 303, 304, 5, 19, 0, 0, 304, 311, 6, 20, -1, 0, 305, 306, 5, 26, 0, 0, 306, 307, 3, 42, 21, 0, 307, 308, 6, 20, -1, 0, 308, 310, 1, 0, 0, 0, 309, 305, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 314, 316, 3, 50, 25, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 377, 6, 20, -1, 0, 318, 319, 3, 42, 21, 0, 319, 321, 6, 20, -1, 0, 320, 322, 3, 50, 25, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 6, 20, -1, 0, 324, 377, 1, 0, 0, 0, 325, 326, 3, 42, 21, 0, 326, 328, 6, 20, -1, 0, 327, 329, 5, 26, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 3, 44, 22, 0, 331, 332, 6, 20, -1, 0, 332, 377, 1, 0, 0, 0, 333, 334, 3, 42, 21, 0, 334, 341, 6, 20, -1, 0, 335, 336, 5, 26, 0, 0, 336, 337, 3, 42, 21, 0, 337, 338, 6, 20, -1, 0, 338, 340, 1, 0, 0, 0, 339, 335, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 26, 0, 0, 345, 346, 3, 42, 21, 0, 346, 348, 6, 20, -1, 0, 347, 349, 3, 50, 25, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 6, 20, -1, 0, 351, 377, 1, 0, 0, 0, 352, 353, 3, 42, 21, 0, 353, 360, 6, 20, -1, 0, 354, 355, 5, 26, 0, 0, 355, 356, 3, 42, 21, 0, 356, 357, 6, 20, -1, 0, 357, 359, 1, 0, 0, 0, 358, 354, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 363, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 363, 364, 5, 26, 0, 0, 364, 365, 3, 42, 21, 0, 365, 367, 6, 20, -1, 0, 366, 368, 5, 26, 0, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 3, 44, 22, 0, 370, 372, 6, 20, -1, 0, 371, 373, 3, 50, 25, 0, 372, 371, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 20, -1, 0, 375, 377, 1, 0, 0, 0, 376, 285, 1, 0, 0, 0, 376, 303, 1, 0, 0, 0, 376, 318, 1, 0, 0, 0, 376, 325, 1, 0, 0, 0, 376, 333, 1, 0, 0, 0, 376, 352, 1, 0, 0, 0, 377, 41, 1, 0, 0, 0, 378, 379, 5, 45, 0, 0, 379, 381, 5, 27, 0, 0, 380, 382, 3, 36, 18, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 28, 0, 0, 384, 385, 1, 0, 0, 0, 385, 389, 6, 21, -1, 0, 386, 387, 5, 45, 0, 0, 387, 389, 6, 21, -1, 0, 388, 378, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 43, 1, 0, 0, 0, 390, 391, 5, 24, 0, 0, 391, 392, 3, 46, 23, 0, 392, 393, 6, 22, -1, 0, 393, 394, 5, 25, 0, 0, 394, 45, 1, 0, 0, 0, 395, 396, 3, 48, 24, 0, 396, 403, 6, 23, -1, 0, 397, 398, 5, 37, 0, 0, 398, 399, 3, 48, 24, 0, 399, 400, 6, 23, -1, 0, 400, 402, 1, 0, 0, 0, 401, 397, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 47, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 409, 5, 45, 0, 0, 407, 408, 5, 26, 0, 0, 408, 410, 5, 45, 0, 0, 409, 407, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 425, 6, 24, -1, 0, 414, 415, 5, 45, 0, 0, 415, 425, 6, 24, -1, 0, 416, 417, 5, 40, 0, 0, 417, 425, 6, 24, -1, 0, 418, 419, 5, 41, 0, 0, 419, 425, 6, 24, -1, 0, 420, 421, 5, 42, 0, 0, 421, 425, 6, 24, -1, 0, 422, 423, 5, 43, 0, 0, 423, 425, 6, 24, -1, 0, 424, 406, 1, 0, 0, 0, 424, 414, 1, 0, 0, 0, 424, 416, 1, 0, 0, 0, 424, 418, 1, 0, 0, 0, 424, 420, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 425, 49, 1, 0, 0, 0, 426, 427, 3, 54, 27, 0, 427, 428, 3, 52, 26, 0, 428, 429, 6, 25, -1, 0, 429, 51, 1, 0, 0, 0, 430, 434, 1, 0, 0, 0, 431, 434, 5, 42, 0, 0, 432, 434, 5, 43, 0, 0, 433, 430, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 432, 1, 0, 0, 0, 434, 53, 1, 0, 0, 0, 435, 436, 7, 2, 0, 0, 436, 55, 1, 0, 0, 0, 40, 57, 60, 66, 69, 72, 76, 86, 108, 127, 137, 147, 155, 168, 179, 189, 204, 222, 242, 245, 253, 266, 283, 295, 299, 311, 315, 321, 328, 341, 348, 360, 367, 372, 376, 381, 388, 403, 411, 424, 433] \ No newline at end of file +[4, 1, 50, 438, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 1, 0, 3, 0, 58, 8, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 67, 8, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 3, 0, 73, 8, 0, 1, 0, 1, 0, 3, 0, 77, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 87, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 109, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 128, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 4, 5, 136, 8, 5, 11, 5, 12, 5, 137, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 146, 8, 6, 11, 6, 12, 6, 147, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 156, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 167, 8, 9, 10, 9, 12, 9, 170, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 178, 8, 10, 10, 10, 12, 10, 181, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 190, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 205, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 223, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 243, 8, 15, 1, 16, 3, 16, 246, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 254, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 265, 8, 18, 10, 18, 12, 18, 268, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 284, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 294, 8, 20, 10, 20, 12, 20, 297, 9, 20, 1, 20, 3, 20, 300, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 310, 8, 20, 10, 20, 12, 20, 313, 9, 20, 1, 20, 3, 20, 316, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 322, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 329, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 340, 8, 20, 10, 20, 12, 20, 343, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 359, 8, 20, 10, 20, 12, 20, 362, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 368, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 373, 8, 20, 1, 20, 1, 20, 3, 20, 377, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 382, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 389, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 402, 8, 23, 10, 23, 12, 23, 405, 9, 23, 1, 24, 1, 24, 1, 24, 4, 24, 410, 8, 24, 11, 24, 12, 24, 411, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 434, 8, 26, 1, 27, 1, 27, 1, 27, 0, 0, 28, 0, 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, 0, 3, 1, 0, 7, 8, 1, 0, 9, 18, 2, 0, 34, 36, 38, 38, 479, 0, 57, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 108, 1, 0, 0, 0, 6, 110, 1, 0, 0, 0, 8, 127, 1, 0, 0, 0, 10, 129, 1, 0, 0, 0, 12, 139, 1, 0, 0, 0, 14, 155, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 160, 1, 0, 0, 0, 20, 171, 1, 0, 0, 0, 22, 189, 1, 0, 0, 0, 24, 204, 1, 0, 0, 0, 26, 222, 1, 0, 0, 0, 28, 224, 1, 0, 0, 0, 30, 242, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 249, 1, 0, 0, 0, 36, 258, 1, 0, 0, 0, 38, 283, 1, 0, 0, 0, 40, 376, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 390, 1, 0, 0, 0, 46, 395, 1, 0, 0, 0, 48, 424, 1, 0, 0, 0, 50, 426, 1, 0, 0, 0, 52, 433, 1, 0, 0, 0, 54, 435, 1, 0, 0, 0, 56, 58, 5, 21, 0, 0, 57, 56, 1, 0, 0, 0, 57, 58, 1, 0, 0, 0, 58, 60, 1, 0, 0, 0, 59, 61, 5, 46, 0, 0, 60, 59, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 66, 1, 0, 0, 0, 62, 67, 3, 2, 1, 0, 63, 67, 3, 6, 3, 0, 64, 67, 3, 8, 4, 0, 65, 67, 3, 14, 7, 0, 66, 62, 1, 0, 0, 0, 66, 63, 1, 0, 0, 0, 66, 64, 1, 0, 0, 0, 66, 65, 1, 0, 0, 0, 67, 69, 1, 0, 0, 0, 68, 70, 3, 34, 17, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 72, 1, 0, 0, 0, 71, 73, 3, 28, 14, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 76, 1, 0, 0, 0, 74, 75, 5, 1, 0, 0, 75, 77, 3, 16, 8, 0, 76, 74, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 6, 0, -1, 0, 79, 1, 1, 0, 0, 0, 80, 81, 5, 1, 0, 0, 81, 82, 3, 16, 8, 0, 82, 83, 5, 2, 0, 0, 83, 86, 3, 4, 2, 0, 84, 85, 5, 3, 0, 0, 85, 87, 3, 4, 2, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 89, 5, 4, 0, 0, 89, 90, 6, 1, -1, 0, 90, 3, 1, 0, 0, 0, 91, 92, 3, 40, 20, 0, 92, 93, 6, 2, -1, 0, 93, 109, 1, 0, 0, 0, 94, 95, 5, 41, 0, 0, 95, 109, 6, 2, -1, 0, 96, 97, 5, 40, 0, 0, 97, 109, 6, 2, -1, 0, 98, 99, 5, 42, 0, 0, 99, 109, 6, 2, -1, 0, 100, 101, 5, 38, 0, 0, 101, 102, 5, 42, 0, 0, 102, 109, 6, 2, -1, 0, 103, 104, 5, 43, 0, 0, 104, 109, 6, 2, -1, 0, 105, 106, 5, 38, 0, 0, 106, 107, 5, 43, 0, 0, 107, 109, 6, 2, -1, 0, 108, 91, 1, 0, 0, 0, 108, 94, 1, 0, 0, 0, 108, 96, 1, 0, 0, 0, 108, 98, 1, 0, 0, 0, 108, 100, 1, 0, 0, 0, 108, 103, 1, 0, 0, 0, 108, 105, 1, 0, 0, 0, 109, 5, 1, 0, 0, 0, 110, 111, 3, 40, 20, 0, 111, 112, 5, 39, 0, 0, 112, 113, 3, 40, 20, 0, 113, 114, 6, 3, -1, 0, 114, 7, 1, 0, 0, 0, 115, 116, 3, 40, 20, 0, 116, 117, 5, 24, 0, 0, 117, 118, 3, 10, 5, 0, 118, 119, 5, 25, 0, 0, 119, 120, 6, 4, -1, 0, 120, 128, 1, 0, 0, 0, 121, 122, 3, 40, 20, 0, 122, 123, 5, 24, 0, 0, 123, 124, 3, 14, 7, 0, 124, 125, 5, 25, 0, 0, 125, 126, 6, 4, -1, 0, 126, 128, 1, 0, 0, 0, 127, 115, 1, 0, 0, 0, 127, 121, 1, 0, 0, 0, 128, 9, 1, 0, 0, 0, 129, 130, 3, 48, 24, 0, 130, 135, 6, 5, -1, 0, 131, 132, 5, 37, 0, 0, 132, 133, 3, 48, 24, 0, 133, 134, 6, 5, -1, 0, 134, 136, 1, 0, 0, 0, 135, 131, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 11, 1, 0, 0, 0, 139, 140, 3, 48, 24, 0, 140, 145, 6, 6, -1, 0, 141, 142, 5, 37, 0, 0, 142, 143, 3, 48, 24, 0, 143, 144, 6, 6, -1, 0, 144, 146, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 13, 1, 0, 0, 0, 149, 150, 3, 12, 6, 0, 150, 151, 6, 7, -1, 0, 151, 156, 1, 0, 0, 0, 152, 153, 3, 40, 20, 0, 153, 154, 6, 7, -1, 0, 154, 156, 1, 0, 0, 0, 155, 149, 1, 0, 0, 0, 155, 152, 1, 0, 0, 0, 156, 15, 1, 0, 0, 0, 157, 158, 3, 18, 9, 0, 158, 159, 6, 8, -1, 0, 159, 17, 1, 0, 0, 0, 160, 161, 3, 20, 10, 0, 161, 168, 6, 9, -1, 0, 162, 163, 5, 6, 0, 0, 163, 164, 3, 20, 10, 0, 164, 165, 6, 9, -1, 0, 165, 167, 1, 0, 0, 0, 166, 162, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 19, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 3, 22, 11, 0, 172, 179, 6, 10, -1, 0, 173, 174, 5, 5, 0, 0, 174, 175, 3, 22, 11, 0, 175, 176, 6, 10, -1, 0, 176, 178, 1, 0, 0, 0, 177, 173, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 21, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 7, 0, 0, 0, 183, 184, 3, 22, 11, 0, 184, 185, 6, 11, -1, 0, 185, 190, 1, 0, 0, 0, 186, 187, 3, 24, 12, 0, 187, 188, 6, 11, -1, 0, 188, 190, 1, 0, 0, 0, 189, 182, 1, 0, 0, 0, 189, 186, 1, 0, 0, 0, 190, 23, 1, 0, 0, 0, 191, 192, 5, 27, 0, 0, 192, 193, 3, 16, 8, 0, 193, 194, 5, 28, 0, 0, 194, 195, 6, 12, -1, 0, 195, 205, 1, 0, 0, 0, 196, 197, 3, 40, 20, 0, 197, 198, 7, 1, 0, 0, 198, 199, 3, 26, 13, 0, 199, 200, 6, 12, -1, 0, 200, 205, 1, 0, 0, 0, 201, 202, 3, 40, 20, 0, 202, 203, 6, 12, -1, 0, 203, 205, 1, 0, 0, 0, 204, 191, 1, 0, 0, 0, 204, 196, 1, 0, 0, 0, 204, 201, 1, 0, 0, 0, 205, 25, 1, 0, 0, 0, 206, 207, 5, 41, 0, 0, 207, 223, 6, 13, -1, 0, 208, 209, 5, 40, 0, 0, 209, 223, 6, 13, -1, 0, 210, 211, 5, 42, 0, 0, 211, 223, 6, 13, -1, 0, 212, 213, 5, 38, 0, 0, 213, 214, 5, 42, 0, 0, 214, 223, 6, 13, -1, 0, 215, 216, 5, 43, 0, 0, 216, 223, 6, 13, -1, 0, 217, 218, 5, 38, 0, 0, 218, 219, 5, 43, 0, 0, 219, 223, 6, 13, -1, 0, 220, 221, 5, 44, 0, 0, 221, 223, 6, 13, -1, 0, 222, 206, 1, 0, 0, 0, 222, 208, 1, 0, 0, 0, 222, 210, 1, 0, 0, 0, 222, 212, 1, 0, 0, 0, 222, 215, 1, 0, 0, 0, 222, 217, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 223, 27, 1, 0, 0, 0, 224, 225, 5, 31, 0, 0, 225, 226, 3, 30, 15, 0, 226, 227, 6, 14, -1, 0, 227, 29, 1, 0, 0, 0, 228, 229, 5, 41, 0, 0, 229, 243, 6, 15, -1, 0, 230, 231, 5, 40, 0, 0, 231, 243, 6, 15, -1, 0, 232, 233, 3, 32, 16, 0, 233, 234, 6, 15, -1, 0, 234, 243, 1, 0, 0, 0, 235, 236, 5, 43, 0, 0, 236, 243, 6, 15, -1, 0, 237, 238, 5, 44, 0, 0, 238, 243, 6, 15, -1, 0, 239, 240, 5, 29, 0, 0, 240, 241, 5, 30, 0, 0, 241, 243, 6, 15, -1, 0, 242, 228, 1, 0, 0, 0, 242, 230, 1, 0, 0, 0, 242, 232, 1, 0, 0, 0, 242, 235, 1, 0, 0, 0, 242, 237, 1, 0, 0, 0, 242, 239, 1, 0, 0, 0, 243, 31, 1, 0, 0, 0, 244, 246, 5, 38, 0, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 42, 0, 0, 248, 33, 1, 0, 0, 0, 249, 250, 5, 32, 0, 0, 250, 251, 5, 45, 0, 0, 251, 253, 5, 27, 0, 0, 252, 254, 3, 36, 18, 0, 253, 252, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 5, 28, 0, 0, 256, 257, 6, 17, -1, 0, 257, 35, 1, 0, 0, 0, 258, 259, 3, 38, 19, 0, 259, 266, 6, 18, -1, 0, 260, 261, 5, 33, 0, 0, 261, 262, 3, 38, 19, 0, 262, 263, 6, 18, -1, 0, 263, 265, 1, 0, 0, 0, 264, 260, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 37, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 42, 0, 0, 270, 284, 6, 19, -1, 0, 271, 272, 5, 38, 0, 0, 272, 273, 5, 42, 0, 0, 273, 284, 6, 19, -1, 0, 274, 275, 5, 43, 0, 0, 275, 284, 6, 19, -1, 0, 276, 277, 5, 38, 0, 0, 277, 278, 5, 43, 0, 0, 278, 284, 6, 19, -1, 0, 279, 280, 5, 41, 0, 0, 280, 284, 6, 19, -1, 0, 281, 282, 5, 40, 0, 0, 282, 284, 6, 19, -1, 0, 283, 269, 1, 0, 0, 0, 283, 271, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 276, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 39, 1, 0, 0, 0, 285, 286, 5, 20, 0, 0, 286, 287, 5, 26, 0, 0, 287, 288, 3, 42, 21, 0, 288, 295, 6, 20, -1, 0, 289, 290, 5, 26, 0, 0, 290, 291, 3, 42, 21, 0, 291, 292, 6, 20, -1, 0, 292, 294, 1, 0, 0, 0, 293, 289, 1, 0, 0, 0, 294, 297, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 298, 300, 3, 50, 25, 0, 299, 298, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 6, 20, -1, 0, 302, 377, 1, 0, 0, 0, 303, 304, 5, 19, 0, 0, 304, 311, 6, 20, -1, 0, 305, 306, 5, 26, 0, 0, 306, 307, 3, 42, 21, 0, 307, 308, 6, 20, -1, 0, 308, 310, 1, 0, 0, 0, 309, 305, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 314, 316, 3, 50, 25, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 377, 6, 20, -1, 0, 318, 319, 3, 42, 21, 0, 319, 321, 6, 20, -1, 0, 320, 322, 3, 50, 25, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 6, 20, -1, 0, 324, 377, 1, 0, 0, 0, 325, 326, 3, 42, 21, 0, 326, 328, 6, 20, -1, 0, 327, 329, 5, 26, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 3, 44, 22, 0, 331, 332, 6, 20, -1, 0, 332, 377, 1, 0, 0, 0, 333, 334, 3, 42, 21, 0, 334, 341, 6, 20, -1, 0, 335, 336, 5, 26, 0, 0, 336, 337, 3, 42, 21, 0, 337, 338, 6, 20, -1, 0, 338, 340, 1, 0, 0, 0, 339, 335, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 26, 0, 0, 345, 346, 3, 42, 21, 0, 346, 348, 6, 20, -1, 0, 347, 349, 3, 50, 25, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 6, 20, -1, 0, 351, 377, 1, 0, 0, 0, 352, 353, 3, 42, 21, 0, 353, 360, 6, 20, -1, 0, 354, 355, 5, 26, 0, 0, 355, 356, 3, 42, 21, 0, 356, 357, 6, 20, -1, 0, 357, 359, 1, 0, 0, 0, 358, 354, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 363, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 363, 364, 5, 26, 0, 0, 364, 365, 3, 42, 21, 0, 365, 367, 6, 20, -1, 0, 366, 368, 5, 26, 0, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 3, 44, 22, 0, 370, 372, 6, 20, -1, 0, 371, 373, 3, 50, 25, 0, 372, 371, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 20, -1, 0, 375, 377, 1, 0, 0, 0, 376, 285, 1, 0, 0, 0, 376, 303, 1, 0, 0, 0, 376, 318, 1, 0, 0, 0, 376, 325, 1, 0, 0, 0, 376, 333, 1, 0, 0, 0, 376, 352, 1, 0, 0, 0, 377, 41, 1, 0, 0, 0, 378, 379, 5, 45, 0, 0, 379, 381, 5, 27, 0, 0, 380, 382, 3, 36, 18, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 28, 0, 0, 384, 385, 1, 0, 0, 0, 385, 389, 6, 21, -1, 0, 386, 387, 5, 45, 0, 0, 387, 389, 6, 21, -1, 0, 388, 378, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 43, 1, 0, 0, 0, 390, 391, 5, 24, 0, 0, 391, 392, 3, 46, 23, 0, 392, 393, 6, 22, -1, 0, 393, 394, 5, 25, 0, 0, 394, 45, 1, 0, 0, 0, 395, 396, 3, 48, 24, 0, 396, 403, 6, 23, -1, 0, 397, 398, 5, 37, 0, 0, 398, 399, 3, 48, 24, 0, 399, 400, 6, 23, -1, 0, 400, 402, 1, 0, 0, 0, 401, 397, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 47, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 409, 5, 45, 0, 0, 407, 408, 5, 26, 0, 0, 408, 410, 5, 45, 0, 0, 409, 407, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 425, 6, 24, -1, 0, 414, 415, 5, 45, 0, 0, 415, 425, 6, 24, -1, 0, 416, 417, 5, 40, 0, 0, 417, 425, 6, 24, -1, 0, 418, 419, 5, 41, 0, 0, 419, 425, 6, 24, -1, 0, 420, 421, 5, 42, 0, 0, 421, 425, 6, 24, -1, 0, 422, 423, 5, 43, 0, 0, 423, 425, 6, 24, -1, 0, 424, 406, 1, 0, 0, 0, 424, 414, 1, 0, 0, 0, 424, 416, 1, 0, 0, 0, 424, 418, 1, 0, 0, 0, 424, 420, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 425, 49, 1, 0, 0, 0, 426, 427, 3, 54, 27, 0, 427, 428, 3, 52, 26, 0, 428, 429, 6, 25, -1, 0, 429, 51, 1, 0, 0, 0, 430, 434, 1, 0, 0, 0, 431, 434, 5, 42, 0, 0, 432, 434, 5, 43, 0, 0, 433, 430, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 432, 1, 0, 0, 0, 434, 53, 1, 0, 0, 0, 435, 436, 7, 2, 0, 0, 436, 55, 1, 0, 0, 0, 40, 57, 60, 66, 69, 72, 76, 86, 108, 127, 137, 147, 155, 168, 179, 189, 204, 222, 242, 245, 253, 266, 283, 295, 299, 311, 315, 321, 328, 341, 348, 360, 367, 372, 376, 381, 388, 403, 411, 424, 433] \ No newline at end of file diff --git a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java index a6d10734e2..c45a29e8d9 100644 --- a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java +++ b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java @@ -146,8 +146,8 @@ public static class ExpressionContext extends ParserRuleContext { public PipeCodeContext pipeCode; public WithCodeContext withCode; public ExprsCodeContext exprsCode; - public DefaultValueContext defaultValue; public FunctionContext function; + public DefaultValueContext defaultValue; public IfCodeContext ifCode() { return getRuleContext(IfCodeContext.class,0); } @@ -162,12 +162,12 @@ public ExprsCodeContext exprsCode() { } public TerminalNode BLOCK_COMMENT() { return getToken(TemplateGrammarExpression.BLOCK_COMMENT, 0); } public TerminalNode CAST_TYPE() { return getToken(TemplateGrammarExpression.CAST_TYPE, 0); } - public DefaultValueContext defaultValue() { - return getRuleContext(DefaultValueContext.class,0); - } public FunctionContext function() { return getRuleContext(FunctionContext.class,0); } + public DefaultValueContext defaultValue() { + return getRuleContext(DefaultValueContext.class,0); + } public TerminalNode IF() { return getToken(TemplateGrammarExpression.IF, 0); } public IfConditionContext ifCondition() { return getRuleContext(IfConditionContext.class,0); @@ -244,20 +244,20 @@ public final ExpressionContext expression() throws RecognitionException { setState(69); _errHandler.sync(this); _la = _input.LA(1); - if (_la==DQUESTION) { + if (_la==SEMI) { { setState(68); - ((ExpressionContext)_localctx).defaultValue = defaultValue(); + ((ExpressionContext)_localctx).function = function(); } } setState(72); _errHandler.sync(this); _la = _input.LA(1); - if (_la==SEMI) { + if (_la==DQUESTION) { { setState(71); - ((ExpressionContext)_localctx).function = function(); + ((ExpressionContext)_localctx).defaultValue = defaultValue(); } } @@ -2616,8 +2616,8 @@ public final MathOperationContext mathOperation() throws RecognitionException { "\u0000?C\u0003\u0006\u0003\u0000@C\u0003\b\u0004\u0000AC\u0003\u000e\u0007"+ "\u0000B>\u0001\u0000\u0000\u0000B?\u0001\u0000\u0000\u0000B@\u0001\u0000"+ "\u0000\u0000BA\u0001\u0000\u0000\u0000CE\u0001\u0000\u0000\u0000DF\u0003"+ - "\u001c\u000e\u0000ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000"+ - "FH\u0001\u0000\u0000\u0000GI\u0003\"\u0011\u0000HG\u0001\u0000\u0000\u0000"+ + "\"\u0011\u0000ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000FH\u0001"+ + "\u0000\u0000\u0000GI\u0003\u001c\u000e\u0000HG\u0001\u0000\u0000\u0000"+ "HI\u0001\u0000\u0000\u0000IL\u0001\u0000\u0000\u0000JK\u0005\u0001\u0000"+ "\u0000KM\u0003\u0010\b\u0000LJ\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000"+ "\u0000MN\u0001\u0000\u0000\u0000NO\u0006\u0000\uffff\uffff\u0000O\u0001"+ diff --git a/oap-formats/oap-template/src/main/java/oap/template/TemplateMacros.java b/oap-formats/oap-template/src/main/java/oap/template/TemplateMacros.java index f5c47ac762..524f16190a 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/TemplateMacros.java +++ b/oap-formats/oap-template/src/main/java/oap/template/TemplateMacros.java @@ -131,4 +131,28 @@ public static String format( DateTime dateTime, String pattern ) { public static String toJson( Object obj ) { return Binder.json.marshal( obj ); } + + public static String toString( Byte b ) { + return b == null ? null : String.valueOf( ( byte ) b ); + } + + public static String toString( Short s ) { + return s == null ? null : String.valueOf( ( short ) s ); + } + + public static String toString( Integer i ) { + return i == null ? null : String.valueOf( ( int ) i ); + } + + public static String toString( Long l ) { + return l == null ? null : String.valueOf( ( long ) l ); + } + + public static String toString( Float f ) { + return f == null ? null : String.valueOf( ( float ) f ); + } + + public static String toString( Double d ) { + return d == null ? null : String.valueOf( ( double ) d ); + } } diff --git a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java index 0bf94b58f4..bd79912fe4 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java +++ b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java @@ -203,6 +203,13 @@ private static AstRender toAst( Expression expression, TemplateType templateType ? rangeVarTypes.get( item.varName ) : templateType; TemplateType expressionResultType = TemplateAstUtils.findExpressionResultType( effectiveType, item, errorStrategy, rangeVarTypes ); + if( expression.function != null ) { + List methods = builtInFunction.get( expression.function.name ); + if( methods != null && !methods.isEmpty() ) { + Method m = methods.get( 0 ); + expressionResultType = new TemplateType( m.getGenericReturnType(), m.isAnnotationPresent( javax.annotation.Nullable.class ) ); + } + } AstRender itemAst = TemplateAstUtils.toAst( item, expression.function, effectiveType, rootTemplateType, expressionResultType, castType, defaultValue, builtInFunction, errorStrategy, rangeVarTypes ); list.add( itemAst ); diff --git a/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java b/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java index bbfd958327..0811ae85d3 100644 --- a/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java +++ b/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java @@ -25,8 +25,11 @@ package oap.template; import oap.reflect.TypeRef; +import oap.testng.Fixtures; +import oap.testng.TestDirectoryFixture; import oap.util.Dates; import org.joda.time.DateTime; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.List; @@ -35,7 +38,19 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.joda.time.DateTimeZone.UTC; -public class TemplateMacrosTest { +public class TemplateMacrosTest extends Fixtures { + private final TestDirectoryFixture testDirectoryFixture; + private TemplateEngine templateEngine; + + public TemplateMacrosTest() { + testDirectoryFixture = fixture( new TestDirectoryFixture() ); + } + + @BeforeMethod + public void beforeMethod() { + templateEngine = new TemplateEngine( testDirectoryFixture.testDirectory(), Dates.d( 10 ) ); + } + @Test public void testUrlencode() { assertThat( TemplateMacros.urlencode( "12 ?3", 2 ) ).isEqualTo( "12%2B%253F3" ); @@ -59,7 +74,31 @@ public void testListFieldDefaultValue() { .isEqualTo( "[]" ); c.listString = List.of( "1", "2", "3" ); - assertThat( new TemplateEngine( Dates.d( 10 ) ).getTemplate( "testListFieldDefaultValue", new TypeRef() {}, "{{ listString; toJson() ?? [] }}", STRING, null, null ).render( c ).get() ) + assertThat( templateEngine.getTemplate( "testListFieldDefaultValue", new TypeRef() {}, "{{ listString; toJson() ?? [] }}", STRING, null, null ).render( c ).get() ) .isEqualTo( "[\"1\",\"2\",\"3\"]" ); } + + @Test + public void testToString() { + TestTemplateClass c = new TestTemplateClass(); + c.byteObjectField = null; + c.shortObjectField = null; + c.intObjectField = null; + c.longObjectField = null; + c.floatObjectField = null; + c.doubleObjectField = null; + + assertThat( templateEngine.getTemplate( "testToString_byte", new TypeRef() {}, "{{ byteObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_short", new TypeRef() {}, "{{ shortObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_int", new TypeRef() {}, "{{ intObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_long", new TypeRef() {}, "{{ longObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_float", new TypeRef() {}, "{{ floatObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_double", new TypeRef() {}, "{{ doubleObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "str" ); + } } diff --git a/pom.xml b/pom.xml index 17af7259e0..394b2ae613 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ - 25.6.9 + 25.6.10 25.0.1 25.0.0 From 284d2a5402886d4a6a44b14912d9e7ae62f44c6b Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 12:28:43 +0300 Subject: [PATCH 2/6] CE-160 oap-template: A default value (`??`) can follow the function call --- .../src/main/java/oap/template/render/TemplateType.java | 9 +++++++-- .../src/test/java/oap/template/TemplateMacrosTest.java | 5 +++++ .../src/test/java/oap/template/TestTemplateClass.java | 6 ++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateType.java b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateType.java index a6e51c8533..e3c8e494d6 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateType.java +++ b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateType.java @@ -30,6 +30,7 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; import java.util.List; import java.util.Optional; @@ -53,8 +54,12 @@ public TemplateType( Type type ) { * todo rewrite on TypeRef based type resolution */ public static Class getTypeClass( Type type ) { - if( type instanceof ParameterizedType ) return getTypeClass( ( ( ParameterizedType ) type ).getRawType() ); - return ( Class ) type; + return switch( type ) { + case ParameterizedType parameterizedType -> getTypeClass( parameterizedType.getRawType() ); + case TypeVariable typeVariable -> getTypeClass( typeVariable.getBounds()[0] ); + case null, default -> ( Class ) type; + }; + } public Class getTypeClass() { diff --git a/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java b/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java index 0811ae85d3..b14337b230 100644 --- a/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java +++ b/oap-formats/oap-template/src/test/java/oap/template/TemplateMacrosTest.java @@ -88,12 +88,17 @@ public void testToString() { c.floatObjectField = null; c.doubleObjectField = null; + c.genericChild = new TestTemplateClass.TestTemplateClassGeneric(); + c.genericChild.intField = 12; + assertThat( templateEngine.getTemplate( "testToString_byte", new TypeRef() {}, "{{ byteObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) .isEqualTo( "str" ); assertThat( templateEngine.getTemplate( "testToString_short", new TypeRef() {}, "{{ shortObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) .isEqualTo( "str" ); assertThat( templateEngine.getTemplate( "testToString_int", new TypeRef() {}, "{{ intObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) .isEqualTo( "str" ); + assertThat( templateEngine.getTemplate( "testToString_int2", new TypeRef() {}, "{{ genericChild.intField; toString() ?? '' }}", STRING, null, null ).render( c ).get() ) + .isEqualTo( "12" ); assertThat( templateEngine.getTemplate( "testToString_long", new TypeRef() {}, "{{ longObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) .isEqualTo( "str" ); assertThat( templateEngine.getTemplate( "testToString_float", new TypeRef() {}, "{{ floatObjectField; toString() ?? 'str' }}", STRING, null, null ).render( c ).get() ) diff --git a/oap-formats/oap-template/src/test/java/oap/template/TestTemplateClass.java b/oap-formats/oap-template/src/test/java/oap/template/TestTemplateClass.java index 297f7b6f6c..b225e03310 100644 --- a/oap-formats/oap-template/src/test/java/oap/template/TestTemplateClass.java +++ b/oap-formats/oap-template/src/test/java/oap/template/TestTemplateClass.java @@ -92,6 +92,8 @@ public class TestTemplateClass { @JsonAlias( { "jsonTestAlias1", "jsonTestAlias2" } ) public String jsonTest; + public TestTemplateClassGeneric genericChild; + public String fieldM() { return field; } @@ -115,4 +117,8 @@ public TestTemplateClass childM() { public static class ITestTemplateClassExt extends Ext { } + + public static class TestTemplateClassGeneric { + public int intField; + } } From 0954da7b06ad691b2aac1ddd66b94bec69740be3 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 12:58:28 +0300 Subject: [PATCH 3/6] CE-160 oap-template: A default value (`??`) can follow the function call --- .../oap/template/render/TemplateAstUtils.java | 18 ++++++++++-------- .../java/oap/template/render/TemplateType.java | 2 -- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java index bd79912fe4..973060883e 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java +++ b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java @@ -64,6 +64,7 @@ import javax.annotation.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -77,6 +78,8 @@ @Slf4j public class TemplateAstUtils { + private static final Pattern STEP_PATTERN = Pattern.compile( "(?:^|\\s)step\\s" ); + @SuppressWarnings( "checkstyle:ModifiedControlVariable" ) public static TemplateType findExpressionResultType( TemplateType rootTemplateType, Exprs exprs, ErrorStrategy errorStrategy ) { return findExpressionResultType( rootTemplateType, exprs, errorStrategy, Map.of() ); @@ -200,7 +203,7 @@ private static AstRender toAst( Expression expression, TemplateType templateType Exprs item = expression.or.getFirst(); TemplateType effectiveType = item.rootScoped ? rootTemplateType : ( item.varName != null && rangeVarTypes.containsKey( item.varName ) ) - ? rangeVarTypes.get( item.varName ) + ? rangeVarTypes.get( item.varName ) : templateType; TemplateType expressionResultType = TemplateAstUtils.findExpressionResultType( effectiveType, item, errorStrategy, rangeVarTypes ); if( expression.function != null ) { @@ -357,7 +360,7 @@ private static AstRender toConditionAst( Exprs conditionExprs, TemplateType temp @SuppressWarnings( { "checkstyle:ModifiedControlVariable", "checkstyle:ParameterAssignment" } ) private static AstRender toCompareConditionAst( Exprs conditionExprs, String op, String literal, - TemplateType templateType, ErrorStrategy errorStrategy ) { + TemplateType templateType, ErrorStrategy errorStrategy ) { try { TemplateType currentTemplateType = templateType; Chain result = new Chain(); @@ -429,8 +432,6 @@ private static AstRender toCompareConditionAst( Exprs conditionExprs, String op, } } - private record ScopeAstResult( AstRender scopeAst, TemplateType scopeType ) {} - @SuppressWarnings( { "checkstyle:ModifiedControlVariable", "checkstyle:ParameterAssignment" } ) private static ScopeAstResult toScopeAst( Exprs scopeExprs, TemplateType templateType, ErrorStrategy errorStrategy ) { try { @@ -584,7 +585,7 @@ private static AstRender toAst( Exprs exprs, Func function, TemplateType templat boolean nullable = field.isAnnotationPresent( Nullable.class ) || ( !field.getType().isPrimitive() && !field.isAnnotationPresent( Nonnull.class ) ); - TemplateType fieldType = new TemplateType( field.getGenericType(), nullable ); + TemplateType fieldType = new TemplateType( field.getGenericType() instanceof TypeVariable ? field.getType() : field.getGenericType(), nullable ); boolean forceCast = false; if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); @@ -667,7 +668,8 @@ private static AstRender wrap( Exprs exprs, Func function, TemplateType parentTe return toAst( mathExprs, function, parentTemplateType, resultType, null, defaultValue, builtInFunction, errorStrategy ); } - } catch( NoSuchFieldException ignored ) { } + } catch( NoSuchFieldException ignored ) { + } } ArrayList items = new ArrayList<>(); @@ -818,8 +820,6 @@ private static AstRenderRoot toAst( Elements elements, TemplateType templateType return astRoot; } - private static final Pattern STEP_PATTERN = Pattern.compile( "(?:^|\\s)step\\s" ); - private static AstRender buildRangeAst( BlockRangeElement r, TemplateType templateType, TemplateType rootTemplateType, Map> builtInFunction, ErrorStrategy errorStrategy ) throws NoSuchFieldException { String spec = r.rangeSpec; @@ -975,4 +975,6 @@ public static AstRender getFunction( String name, List args, Map getTypeClass( Type type ) { return switch( type ) { case ParameterizedType parameterizedType -> getTypeClass( parameterizedType.getRawType() ); - case TypeVariable typeVariable -> getTypeClass( typeVariable.getBounds()[0] ); case null, default -> ( Class ) type; }; From 177209188ccd62465f1a18a27fe55c0604087731 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 13:23:49 +0300 Subject: [PATCH 4/6] CE-160 oap-template: A default value (`??`) can follow the function call --- .../src/main/java/oap/template/render/TemplateAstUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java index 973060883e..4910e9f299 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java +++ b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java @@ -119,7 +119,7 @@ static TemplateType findExpressionResultType( TemplateType rootTemplateType, Exp } else { Field field = findField( parentClass, expr.name ); - TemplateType fieldType = new TemplateType( field.getGenericType(), field.isAnnotationPresent( Nullable.class ) ); + TemplateType fieldType = new TemplateType( field.getGenericType() instanceof TypeVariable ? field.getType() : field.getGenericType(), field.isAnnotationPresent( Nullable.class ) ); if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); if( extClass != null ) { From 37e7b16fe80ce6e8fb59dbc95e4955bb8b31c030 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 13:24:43 +0300 Subject: [PATCH 5/6] CE-160 oap-template: A default value (`??`) can follow the function call --- .../oap/template/render/TemplateAstUtils.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java index 4910e9f299..8a23a57abc 100644 --- a/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java +++ b/oap-formats/oap-template/src/main/java/oap/template/render/TemplateAstUtils.java @@ -59,11 +59,13 @@ import oap.util.Lists; import org.antlr.v4.runtime.BufferedTokenStream; import org.antlr.v4.runtime.CharStreams; +import org.jspecify.annotations.NonNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.HashMap; @@ -119,7 +121,7 @@ static TemplateType findExpressionResultType( TemplateType rootTemplateType, Exp } else { Field field = findField( parentClass, expr.name ); - TemplateType fieldType = new TemplateType( field.getGenericType() instanceof TypeVariable ? field.getType() : field.getGenericType(), field.isAnnotationPresent( Nullable.class ) ); + TemplateType fieldType = new TemplateType( getTypeFromField( field ), field.isAnnotationPresent( Nullable.class ) ); if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); if( extClass != null ) { @@ -149,6 +151,10 @@ static TemplateType findExpressionResultType( TemplateType rootTemplateType, Exp } } + private static @NonNull Type getTypeFromField( Field field ) { + return field.getGenericType() instanceof TypeVariable ? field.getType() : field.getGenericType(); + } + static Field findField( Class clazz, String fieldName ) throws NoSuchFieldException { try { return clazz.getField( fieldName ); @@ -308,7 +314,7 @@ private static AstRender toConditionAst( Exprs conditionExprs, TemplateType temp java.lang.reflect.Field field = findField( parentClass, expr.name ); boolean nullable = field.isAnnotationPresent( Nullable.class ) || !field.getType().isPrimitive() && !field.isAnnotationPresent( Nonnull.class ); - TemplateType fieldType = new TemplateType( field.getGenericType(), nullable ); + TemplateType fieldType = new TemplateType( getTypeFromField( field ), nullable ); boolean forceCast = false; if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); @@ -390,7 +396,7 @@ private static AstRender toCompareConditionAst( Exprs conditionExprs, String op, java.lang.reflect.Field field = findField( parentClass, expr.name ); boolean nullable = field.isAnnotationPresent( Nullable.class ) || !field.getType().isPrimitive() && !field.isAnnotationPresent( Nonnull.class ); - TemplateType fieldType = new TemplateType( field.getGenericType(), nullable ); + TemplateType fieldType = new TemplateType( getTypeFromField( field ), nullable ); AstRenderField ast = new AstRenderField( field.getName(), fieldType, false, null ); result.add( ast ); currentTemplateType = fieldType; @@ -458,7 +464,7 @@ private static ScopeAstResult toScopeAst( Exprs scopeExprs, TemplateType templat java.lang.reflect.Field field = findField( parentClass, expr.name ); boolean nullable = field.isAnnotationPresent( Nullable.class ) || !field.getType().isPrimitive() && !field.isAnnotationPresent( Nonnull.class ); - TemplateType fieldType = new TemplateType( field.getGenericType(), nullable ); + TemplateType fieldType = new TemplateType( getTypeFromField( field ), nullable ); boolean forceCast = false; if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); @@ -585,7 +591,7 @@ private static AstRender toAst( Exprs exprs, Func function, TemplateType templat boolean nullable = field.isAnnotationPresent( Nullable.class ) || ( !field.getType().isPrimitive() && !field.isAnnotationPresent( Nonnull.class ) ); - TemplateType fieldType = new TemplateType( field.getGenericType() instanceof TypeVariable ? field.getType() : field.getGenericType(), nullable ); + TemplateType fieldType = new TemplateType( getTypeFromField( field ), nullable ); boolean forceCast = false; if( fieldType.isInstanceOf( Ext.class ) ) { Class extClass = ExtDeserializer.extensionOf( parentClass, expr.name ); From d6674965ecec5d2faa3f8956cd1c5e2e1b543d51 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 14 May 2026 13:48:57 +0300 Subject: [PATCH 6/6] CE-160 oap-template: A default value (`??`) can follow the function call --- oap-formats/oap-template/README.md | 19 + .../main/antlr4/TemplateGrammarExpression.g4 | 18 + .../template/TemplateGrammarExpression.interp | 2 +- .../template/TemplateGrammarExpression.java | 913 ++++++++++-------- .../java/oap/template/TemplateEngineTest.java | 12 + 5 files changed, 549 insertions(+), 415 deletions(-) diff --git a/oap-formats/oap-template/README.md b/oap-formats/oap-template/README.md index 32e33ad3ac..c0bd222324 100644 --- a/oap-formats/oap-template/README.md +++ b/oap-formats/oap-template/README.md @@ -10,6 +10,7 @@ A compile-time template engine for the OAP framework. Each unique template strin - [Delimiters](#delimiters) - [Custom expression delimiters](#custom-expression-delimiters) - [Whitespace trimming](#whitespace-trimming) + - [Literal value expressions](#literal-value-expressions) - [Field access](#field-access) - [Null safety](#null-safety) - [Default values (`??`)](#default-values-) @@ -163,6 +164,24 @@ line1 Renders as `line1content` when `flag` is `true` (the `\n` after `line1` is stripped). +### Literal value expressions + +A template expression can contain a bare literal — no field access required: + +| Template | Output | +|---|---| +| `{{ 1 }}` | `1` | +| `{{ 1.2 }}` | `1.2` | +| `{{ -1.2 }}` | `-1.2` | +| `{{ 'text' }}` | `text` | + +Useful for static values in otherwise-dynamic templates, or as branch values in if-then-else: + +``` +price={{ 0.0 }}, label={{ 'unknown' }} +{{ if premium then user.discount else 0 end }} +``` + ### Field access ``` diff --git a/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 b/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 index ae868f4c92..db643dfc63 100644 --- a/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 +++ b/oap-formats/oap-template/src/main/antlr4/TemplateGrammarExpression.g4 @@ -106,6 +106,24 @@ exprsCode returns [ArrayList ret = new ArrayList<>()] | exprs { $ret.add( $exprs.ret ); } + | SSTRING { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( sdStringToString( $SSTRING.text ) ) ); $ret.add( e ); + } + | DSTRING { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( sdStringToString( $DSTRING.text ) ) ); $ret.add( e ); + } + | DECDIGITS { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( $DECDIGITS.text ) ) ); $ret.add( e ); + } + | MINUS DECDIGITS { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( "-" + $DECDIGITS.text ) ) ); $ret.add( e ); + } + | FLOAT { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( $FLOAT.text ) ) ); $ret.add( e ); + } + | MINUS FLOAT { + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( "-" + $FLOAT.text ) ) ); $ret.add( e ); + } ; ifCondition returns [ConditionExpr ret] diff --git a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp index 43e2d768cf..37c5f54d41 100644 --- a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp +++ b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.interp @@ -136,4 +136,4 @@ mathOperation atn: -[4, 1, 50, 438, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 1, 0, 3, 0, 58, 8, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 67, 8, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 3, 0, 73, 8, 0, 1, 0, 1, 0, 3, 0, 77, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 87, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 109, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 128, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 4, 5, 136, 8, 5, 11, 5, 12, 5, 137, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 146, 8, 6, 11, 6, 12, 6, 147, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 156, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 167, 8, 9, 10, 9, 12, 9, 170, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 178, 8, 10, 10, 10, 12, 10, 181, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 190, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 205, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 223, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 243, 8, 15, 1, 16, 3, 16, 246, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 254, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 265, 8, 18, 10, 18, 12, 18, 268, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 284, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 294, 8, 20, 10, 20, 12, 20, 297, 9, 20, 1, 20, 3, 20, 300, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 310, 8, 20, 10, 20, 12, 20, 313, 9, 20, 1, 20, 3, 20, 316, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 322, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 329, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 340, 8, 20, 10, 20, 12, 20, 343, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 349, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 359, 8, 20, 10, 20, 12, 20, 362, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 368, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 373, 8, 20, 1, 20, 1, 20, 3, 20, 377, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 382, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 389, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 402, 8, 23, 10, 23, 12, 23, 405, 9, 23, 1, 24, 1, 24, 1, 24, 4, 24, 410, 8, 24, 11, 24, 12, 24, 411, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 434, 8, 26, 1, 27, 1, 27, 1, 27, 0, 0, 28, 0, 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, 0, 3, 1, 0, 7, 8, 1, 0, 9, 18, 2, 0, 34, 36, 38, 38, 479, 0, 57, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 108, 1, 0, 0, 0, 6, 110, 1, 0, 0, 0, 8, 127, 1, 0, 0, 0, 10, 129, 1, 0, 0, 0, 12, 139, 1, 0, 0, 0, 14, 155, 1, 0, 0, 0, 16, 157, 1, 0, 0, 0, 18, 160, 1, 0, 0, 0, 20, 171, 1, 0, 0, 0, 22, 189, 1, 0, 0, 0, 24, 204, 1, 0, 0, 0, 26, 222, 1, 0, 0, 0, 28, 224, 1, 0, 0, 0, 30, 242, 1, 0, 0, 0, 32, 245, 1, 0, 0, 0, 34, 249, 1, 0, 0, 0, 36, 258, 1, 0, 0, 0, 38, 283, 1, 0, 0, 0, 40, 376, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 390, 1, 0, 0, 0, 46, 395, 1, 0, 0, 0, 48, 424, 1, 0, 0, 0, 50, 426, 1, 0, 0, 0, 52, 433, 1, 0, 0, 0, 54, 435, 1, 0, 0, 0, 56, 58, 5, 21, 0, 0, 57, 56, 1, 0, 0, 0, 57, 58, 1, 0, 0, 0, 58, 60, 1, 0, 0, 0, 59, 61, 5, 46, 0, 0, 60, 59, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 66, 1, 0, 0, 0, 62, 67, 3, 2, 1, 0, 63, 67, 3, 6, 3, 0, 64, 67, 3, 8, 4, 0, 65, 67, 3, 14, 7, 0, 66, 62, 1, 0, 0, 0, 66, 63, 1, 0, 0, 0, 66, 64, 1, 0, 0, 0, 66, 65, 1, 0, 0, 0, 67, 69, 1, 0, 0, 0, 68, 70, 3, 34, 17, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 72, 1, 0, 0, 0, 71, 73, 3, 28, 14, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 76, 1, 0, 0, 0, 74, 75, 5, 1, 0, 0, 75, 77, 3, 16, 8, 0, 76, 74, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 6, 0, -1, 0, 79, 1, 1, 0, 0, 0, 80, 81, 5, 1, 0, 0, 81, 82, 3, 16, 8, 0, 82, 83, 5, 2, 0, 0, 83, 86, 3, 4, 2, 0, 84, 85, 5, 3, 0, 0, 85, 87, 3, 4, 2, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 89, 5, 4, 0, 0, 89, 90, 6, 1, -1, 0, 90, 3, 1, 0, 0, 0, 91, 92, 3, 40, 20, 0, 92, 93, 6, 2, -1, 0, 93, 109, 1, 0, 0, 0, 94, 95, 5, 41, 0, 0, 95, 109, 6, 2, -1, 0, 96, 97, 5, 40, 0, 0, 97, 109, 6, 2, -1, 0, 98, 99, 5, 42, 0, 0, 99, 109, 6, 2, -1, 0, 100, 101, 5, 38, 0, 0, 101, 102, 5, 42, 0, 0, 102, 109, 6, 2, -1, 0, 103, 104, 5, 43, 0, 0, 104, 109, 6, 2, -1, 0, 105, 106, 5, 38, 0, 0, 106, 107, 5, 43, 0, 0, 107, 109, 6, 2, -1, 0, 108, 91, 1, 0, 0, 0, 108, 94, 1, 0, 0, 0, 108, 96, 1, 0, 0, 0, 108, 98, 1, 0, 0, 0, 108, 100, 1, 0, 0, 0, 108, 103, 1, 0, 0, 0, 108, 105, 1, 0, 0, 0, 109, 5, 1, 0, 0, 0, 110, 111, 3, 40, 20, 0, 111, 112, 5, 39, 0, 0, 112, 113, 3, 40, 20, 0, 113, 114, 6, 3, -1, 0, 114, 7, 1, 0, 0, 0, 115, 116, 3, 40, 20, 0, 116, 117, 5, 24, 0, 0, 117, 118, 3, 10, 5, 0, 118, 119, 5, 25, 0, 0, 119, 120, 6, 4, -1, 0, 120, 128, 1, 0, 0, 0, 121, 122, 3, 40, 20, 0, 122, 123, 5, 24, 0, 0, 123, 124, 3, 14, 7, 0, 124, 125, 5, 25, 0, 0, 125, 126, 6, 4, -1, 0, 126, 128, 1, 0, 0, 0, 127, 115, 1, 0, 0, 0, 127, 121, 1, 0, 0, 0, 128, 9, 1, 0, 0, 0, 129, 130, 3, 48, 24, 0, 130, 135, 6, 5, -1, 0, 131, 132, 5, 37, 0, 0, 132, 133, 3, 48, 24, 0, 133, 134, 6, 5, -1, 0, 134, 136, 1, 0, 0, 0, 135, 131, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 11, 1, 0, 0, 0, 139, 140, 3, 48, 24, 0, 140, 145, 6, 6, -1, 0, 141, 142, 5, 37, 0, 0, 142, 143, 3, 48, 24, 0, 143, 144, 6, 6, -1, 0, 144, 146, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 13, 1, 0, 0, 0, 149, 150, 3, 12, 6, 0, 150, 151, 6, 7, -1, 0, 151, 156, 1, 0, 0, 0, 152, 153, 3, 40, 20, 0, 153, 154, 6, 7, -1, 0, 154, 156, 1, 0, 0, 0, 155, 149, 1, 0, 0, 0, 155, 152, 1, 0, 0, 0, 156, 15, 1, 0, 0, 0, 157, 158, 3, 18, 9, 0, 158, 159, 6, 8, -1, 0, 159, 17, 1, 0, 0, 0, 160, 161, 3, 20, 10, 0, 161, 168, 6, 9, -1, 0, 162, 163, 5, 6, 0, 0, 163, 164, 3, 20, 10, 0, 164, 165, 6, 9, -1, 0, 165, 167, 1, 0, 0, 0, 166, 162, 1, 0, 0, 0, 167, 170, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 19, 1, 0, 0, 0, 170, 168, 1, 0, 0, 0, 171, 172, 3, 22, 11, 0, 172, 179, 6, 10, -1, 0, 173, 174, 5, 5, 0, 0, 174, 175, 3, 22, 11, 0, 175, 176, 6, 10, -1, 0, 176, 178, 1, 0, 0, 0, 177, 173, 1, 0, 0, 0, 178, 181, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 179, 180, 1, 0, 0, 0, 180, 21, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 182, 183, 7, 0, 0, 0, 183, 184, 3, 22, 11, 0, 184, 185, 6, 11, -1, 0, 185, 190, 1, 0, 0, 0, 186, 187, 3, 24, 12, 0, 187, 188, 6, 11, -1, 0, 188, 190, 1, 0, 0, 0, 189, 182, 1, 0, 0, 0, 189, 186, 1, 0, 0, 0, 190, 23, 1, 0, 0, 0, 191, 192, 5, 27, 0, 0, 192, 193, 3, 16, 8, 0, 193, 194, 5, 28, 0, 0, 194, 195, 6, 12, -1, 0, 195, 205, 1, 0, 0, 0, 196, 197, 3, 40, 20, 0, 197, 198, 7, 1, 0, 0, 198, 199, 3, 26, 13, 0, 199, 200, 6, 12, -1, 0, 200, 205, 1, 0, 0, 0, 201, 202, 3, 40, 20, 0, 202, 203, 6, 12, -1, 0, 203, 205, 1, 0, 0, 0, 204, 191, 1, 0, 0, 0, 204, 196, 1, 0, 0, 0, 204, 201, 1, 0, 0, 0, 205, 25, 1, 0, 0, 0, 206, 207, 5, 41, 0, 0, 207, 223, 6, 13, -1, 0, 208, 209, 5, 40, 0, 0, 209, 223, 6, 13, -1, 0, 210, 211, 5, 42, 0, 0, 211, 223, 6, 13, -1, 0, 212, 213, 5, 38, 0, 0, 213, 214, 5, 42, 0, 0, 214, 223, 6, 13, -1, 0, 215, 216, 5, 43, 0, 0, 216, 223, 6, 13, -1, 0, 217, 218, 5, 38, 0, 0, 218, 219, 5, 43, 0, 0, 219, 223, 6, 13, -1, 0, 220, 221, 5, 44, 0, 0, 221, 223, 6, 13, -1, 0, 222, 206, 1, 0, 0, 0, 222, 208, 1, 0, 0, 0, 222, 210, 1, 0, 0, 0, 222, 212, 1, 0, 0, 0, 222, 215, 1, 0, 0, 0, 222, 217, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 223, 27, 1, 0, 0, 0, 224, 225, 5, 31, 0, 0, 225, 226, 3, 30, 15, 0, 226, 227, 6, 14, -1, 0, 227, 29, 1, 0, 0, 0, 228, 229, 5, 41, 0, 0, 229, 243, 6, 15, -1, 0, 230, 231, 5, 40, 0, 0, 231, 243, 6, 15, -1, 0, 232, 233, 3, 32, 16, 0, 233, 234, 6, 15, -1, 0, 234, 243, 1, 0, 0, 0, 235, 236, 5, 43, 0, 0, 236, 243, 6, 15, -1, 0, 237, 238, 5, 44, 0, 0, 238, 243, 6, 15, -1, 0, 239, 240, 5, 29, 0, 0, 240, 241, 5, 30, 0, 0, 241, 243, 6, 15, -1, 0, 242, 228, 1, 0, 0, 0, 242, 230, 1, 0, 0, 0, 242, 232, 1, 0, 0, 0, 242, 235, 1, 0, 0, 0, 242, 237, 1, 0, 0, 0, 242, 239, 1, 0, 0, 0, 243, 31, 1, 0, 0, 0, 244, 246, 5, 38, 0, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 42, 0, 0, 248, 33, 1, 0, 0, 0, 249, 250, 5, 32, 0, 0, 250, 251, 5, 45, 0, 0, 251, 253, 5, 27, 0, 0, 252, 254, 3, 36, 18, 0, 253, 252, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 5, 28, 0, 0, 256, 257, 6, 17, -1, 0, 257, 35, 1, 0, 0, 0, 258, 259, 3, 38, 19, 0, 259, 266, 6, 18, -1, 0, 260, 261, 5, 33, 0, 0, 261, 262, 3, 38, 19, 0, 262, 263, 6, 18, -1, 0, 263, 265, 1, 0, 0, 0, 264, 260, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 37, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 42, 0, 0, 270, 284, 6, 19, -1, 0, 271, 272, 5, 38, 0, 0, 272, 273, 5, 42, 0, 0, 273, 284, 6, 19, -1, 0, 274, 275, 5, 43, 0, 0, 275, 284, 6, 19, -1, 0, 276, 277, 5, 38, 0, 0, 277, 278, 5, 43, 0, 0, 278, 284, 6, 19, -1, 0, 279, 280, 5, 41, 0, 0, 280, 284, 6, 19, -1, 0, 281, 282, 5, 40, 0, 0, 282, 284, 6, 19, -1, 0, 283, 269, 1, 0, 0, 0, 283, 271, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 276, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 39, 1, 0, 0, 0, 285, 286, 5, 20, 0, 0, 286, 287, 5, 26, 0, 0, 287, 288, 3, 42, 21, 0, 288, 295, 6, 20, -1, 0, 289, 290, 5, 26, 0, 0, 290, 291, 3, 42, 21, 0, 291, 292, 6, 20, -1, 0, 292, 294, 1, 0, 0, 0, 293, 289, 1, 0, 0, 0, 294, 297, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 298, 300, 3, 50, 25, 0, 299, 298, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 6, 20, -1, 0, 302, 377, 1, 0, 0, 0, 303, 304, 5, 19, 0, 0, 304, 311, 6, 20, -1, 0, 305, 306, 5, 26, 0, 0, 306, 307, 3, 42, 21, 0, 307, 308, 6, 20, -1, 0, 308, 310, 1, 0, 0, 0, 309, 305, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 314, 316, 3, 50, 25, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 377, 6, 20, -1, 0, 318, 319, 3, 42, 21, 0, 319, 321, 6, 20, -1, 0, 320, 322, 3, 50, 25, 0, 321, 320, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 6, 20, -1, 0, 324, 377, 1, 0, 0, 0, 325, 326, 3, 42, 21, 0, 326, 328, 6, 20, -1, 0, 327, 329, 5, 26, 0, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 3, 44, 22, 0, 331, 332, 6, 20, -1, 0, 332, 377, 1, 0, 0, 0, 333, 334, 3, 42, 21, 0, 334, 341, 6, 20, -1, 0, 335, 336, 5, 26, 0, 0, 336, 337, 3, 42, 21, 0, 337, 338, 6, 20, -1, 0, 338, 340, 1, 0, 0, 0, 339, 335, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 26, 0, 0, 345, 346, 3, 42, 21, 0, 346, 348, 6, 20, -1, 0, 347, 349, 3, 50, 25, 0, 348, 347, 1, 0, 0, 0, 348, 349, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 6, 20, -1, 0, 351, 377, 1, 0, 0, 0, 352, 353, 3, 42, 21, 0, 353, 360, 6, 20, -1, 0, 354, 355, 5, 26, 0, 0, 355, 356, 3, 42, 21, 0, 356, 357, 6, 20, -1, 0, 357, 359, 1, 0, 0, 0, 358, 354, 1, 0, 0, 0, 359, 362, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 363, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 363, 364, 5, 26, 0, 0, 364, 365, 3, 42, 21, 0, 365, 367, 6, 20, -1, 0, 366, 368, 5, 26, 0, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 3, 44, 22, 0, 370, 372, 6, 20, -1, 0, 371, 373, 3, 50, 25, 0, 372, 371, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 6, 20, -1, 0, 375, 377, 1, 0, 0, 0, 376, 285, 1, 0, 0, 0, 376, 303, 1, 0, 0, 0, 376, 318, 1, 0, 0, 0, 376, 325, 1, 0, 0, 0, 376, 333, 1, 0, 0, 0, 376, 352, 1, 0, 0, 0, 377, 41, 1, 0, 0, 0, 378, 379, 5, 45, 0, 0, 379, 381, 5, 27, 0, 0, 380, 382, 3, 36, 18, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 28, 0, 0, 384, 385, 1, 0, 0, 0, 385, 389, 6, 21, -1, 0, 386, 387, 5, 45, 0, 0, 387, 389, 6, 21, -1, 0, 388, 378, 1, 0, 0, 0, 388, 386, 1, 0, 0, 0, 389, 43, 1, 0, 0, 0, 390, 391, 5, 24, 0, 0, 391, 392, 3, 46, 23, 0, 392, 393, 6, 22, -1, 0, 393, 394, 5, 25, 0, 0, 394, 45, 1, 0, 0, 0, 395, 396, 3, 48, 24, 0, 396, 403, 6, 23, -1, 0, 397, 398, 5, 37, 0, 0, 398, 399, 3, 48, 24, 0, 399, 400, 6, 23, -1, 0, 400, 402, 1, 0, 0, 0, 401, 397, 1, 0, 0, 0, 402, 405, 1, 0, 0, 0, 403, 401, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 47, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 406, 409, 5, 45, 0, 0, 407, 408, 5, 26, 0, 0, 408, 410, 5, 45, 0, 0, 409, 407, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 425, 6, 24, -1, 0, 414, 415, 5, 45, 0, 0, 415, 425, 6, 24, -1, 0, 416, 417, 5, 40, 0, 0, 417, 425, 6, 24, -1, 0, 418, 419, 5, 41, 0, 0, 419, 425, 6, 24, -1, 0, 420, 421, 5, 42, 0, 0, 421, 425, 6, 24, -1, 0, 422, 423, 5, 43, 0, 0, 423, 425, 6, 24, -1, 0, 424, 406, 1, 0, 0, 0, 424, 414, 1, 0, 0, 0, 424, 416, 1, 0, 0, 0, 424, 418, 1, 0, 0, 0, 424, 420, 1, 0, 0, 0, 424, 422, 1, 0, 0, 0, 425, 49, 1, 0, 0, 0, 426, 427, 3, 54, 27, 0, 427, 428, 3, 52, 26, 0, 428, 429, 6, 25, -1, 0, 429, 51, 1, 0, 0, 0, 430, 434, 1, 0, 0, 0, 431, 434, 5, 42, 0, 0, 432, 434, 5, 43, 0, 0, 433, 430, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 433, 432, 1, 0, 0, 0, 434, 53, 1, 0, 0, 0, 435, 436, 7, 2, 0, 0, 436, 55, 1, 0, 0, 0, 40, 57, 60, 66, 69, 72, 76, 86, 108, 127, 137, 147, 155, 168, 179, 189, 204, 222, 242, 245, 253, 266, 283, 295, 299, 311, 315, 321, 328, 341, 348, 360, 367, 372, 376, 381, 388, 403, 411, 424, 433] \ No newline at end of file +[4, 1, 50, 452, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 1, 0, 3, 0, 58, 8, 0, 1, 0, 3, 0, 61, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 67, 8, 0, 1, 0, 3, 0, 70, 8, 0, 1, 0, 3, 0, 73, 8, 0, 1, 0, 1, 0, 3, 0, 77, 8, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 87, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 109, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 128, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 4, 5, 136, 8, 5, 11, 5, 12, 5, 137, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 4, 6, 146, 8, 6, 11, 6, 12, 6, 147, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 170, 8, 7, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 181, 8, 9, 10, 9, 12, 9, 184, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 192, 8, 10, 10, 10, 12, 10, 195, 9, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 204, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 219, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 237, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 257, 8, 15, 1, 16, 3, 16, 260, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 268, 8, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 279, 8, 18, 10, 18, 12, 18, 282, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 298, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 308, 8, 20, 10, 20, 12, 20, 311, 9, 20, 1, 20, 3, 20, 314, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 324, 8, 20, 10, 20, 12, 20, 327, 9, 20, 1, 20, 3, 20, 330, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 336, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 343, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 354, 8, 20, 10, 20, 12, 20, 357, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 363, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 373, 8, 20, 10, 20, 12, 20, 376, 9, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 382, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 387, 8, 20, 1, 20, 1, 20, 3, 20, 391, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 396, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 403, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 416, 8, 23, 10, 23, 12, 23, 419, 9, 23, 1, 24, 1, 24, 1, 24, 4, 24, 424, 8, 24, 11, 24, 12, 24, 425, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 439, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 3, 26, 448, 8, 26, 1, 27, 1, 27, 1, 27, 0, 0, 28, 0, 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, 0, 3, 1, 0, 7, 8, 1, 0, 9, 18, 2, 0, 34, 36, 38, 38, 499, 0, 57, 1, 0, 0, 0, 2, 80, 1, 0, 0, 0, 4, 108, 1, 0, 0, 0, 6, 110, 1, 0, 0, 0, 8, 127, 1, 0, 0, 0, 10, 129, 1, 0, 0, 0, 12, 139, 1, 0, 0, 0, 14, 169, 1, 0, 0, 0, 16, 171, 1, 0, 0, 0, 18, 174, 1, 0, 0, 0, 20, 185, 1, 0, 0, 0, 22, 203, 1, 0, 0, 0, 24, 218, 1, 0, 0, 0, 26, 236, 1, 0, 0, 0, 28, 238, 1, 0, 0, 0, 30, 256, 1, 0, 0, 0, 32, 259, 1, 0, 0, 0, 34, 263, 1, 0, 0, 0, 36, 272, 1, 0, 0, 0, 38, 297, 1, 0, 0, 0, 40, 390, 1, 0, 0, 0, 42, 402, 1, 0, 0, 0, 44, 404, 1, 0, 0, 0, 46, 409, 1, 0, 0, 0, 48, 438, 1, 0, 0, 0, 50, 440, 1, 0, 0, 0, 52, 447, 1, 0, 0, 0, 54, 449, 1, 0, 0, 0, 56, 58, 5, 21, 0, 0, 57, 56, 1, 0, 0, 0, 57, 58, 1, 0, 0, 0, 58, 60, 1, 0, 0, 0, 59, 61, 5, 46, 0, 0, 60, 59, 1, 0, 0, 0, 60, 61, 1, 0, 0, 0, 61, 66, 1, 0, 0, 0, 62, 67, 3, 2, 1, 0, 63, 67, 3, 6, 3, 0, 64, 67, 3, 8, 4, 0, 65, 67, 3, 14, 7, 0, 66, 62, 1, 0, 0, 0, 66, 63, 1, 0, 0, 0, 66, 64, 1, 0, 0, 0, 66, 65, 1, 0, 0, 0, 67, 69, 1, 0, 0, 0, 68, 70, 3, 34, 17, 0, 69, 68, 1, 0, 0, 0, 69, 70, 1, 0, 0, 0, 70, 72, 1, 0, 0, 0, 71, 73, 3, 28, 14, 0, 72, 71, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 76, 1, 0, 0, 0, 74, 75, 5, 1, 0, 0, 75, 77, 3, 16, 8, 0, 76, 74, 1, 0, 0, 0, 76, 77, 1, 0, 0, 0, 77, 78, 1, 0, 0, 0, 78, 79, 6, 0, -1, 0, 79, 1, 1, 0, 0, 0, 80, 81, 5, 1, 0, 0, 81, 82, 3, 16, 8, 0, 82, 83, 5, 2, 0, 0, 83, 86, 3, 4, 2, 0, 84, 85, 5, 3, 0, 0, 85, 87, 3, 4, 2, 0, 86, 84, 1, 0, 0, 0, 86, 87, 1, 0, 0, 0, 87, 88, 1, 0, 0, 0, 88, 89, 5, 4, 0, 0, 89, 90, 6, 1, -1, 0, 90, 3, 1, 0, 0, 0, 91, 92, 3, 40, 20, 0, 92, 93, 6, 2, -1, 0, 93, 109, 1, 0, 0, 0, 94, 95, 5, 41, 0, 0, 95, 109, 6, 2, -1, 0, 96, 97, 5, 40, 0, 0, 97, 109, 6, 2, -1, 0, 98, 99, 5, 42, 0, 0, 99, 109, 6, 2, -1, 0, 100, 101, 5, 38, 0, 0, 101, 102, 5, 42, 0, 0, 102, 109, 6, 2, -1, 0, 103, 104, 5, 43, 0, 0, 104, 109, 6, 2, -1, 0, 105, 106, 5, 38, 0, 0, 106, 107, 5, 43, 0, 0, 107, 109, 6, 2, -1, 0, 108, 91, 1, 0, 0, 0, 108, 94, 1, 0, 0, 0, 108, 96, 1, 0, 0, 0, 108, 98, 1, 0, 0, 0, 108, 100, 1, 0, 0, 0, 108, 103, 1, 0, 0, 0, 108, 105, 1, 0, 0, 0, 109, 5, 1, 0, 0, 0, 110, 111, 3, 40, 20, 0, 111, 112, 5, 39, 0, 0, 112, 113, 3, 40, 20, 0, 113, 114, 6, 3, -1, 0, 114, 7, 1, 0, 0, 0, 115, 116, 3, 40, 20, 0, 116, 117, 5, 24, 0, 0, 117, 118, 3, 10, 5, 0, 118, 119, 5, 25, 0, 0, 119, 120, 6, 4, -1, 0, 120, 128, 1, 0, 0, 0, 121, 122, 3, 40, 20, 0, 122, 123, 5, 24, 0, 0, 123, 124, 3, 14, 7, 0, 124, 125, 5, 25, 0, 0, 125, 126, 6, 4, -1, 0, 126, 128, 1, 0, 0, 0, 127, 115, 1, 0, 0, 0, 127, 121, 1, 0, 0, 0, 128, 9, 1, 0, 0, 0, 129, 130, 3, 48, 24, 0, 130, 135, 6, 5, -1, 0, 131, 132, 5, 37, 0, 0, 132, 133, 3, 48, 24, 0, 133, 134, 6, 5, -1, 0, 134, 136, 1, 0, 0, 0, 135, 131, 1, 0, 0, 0, 136, 137, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 137, 138, 1, 0, 0, 0, 138, 11, 1, 0, 0, 0, 139, 140, 3, 48, 24, 0, 140, 145, 6, 6, -1, 0, 141, 142, 5, 37, 0, 0, 142, 143, 3, 48, 24, 0, 143, 144, 6, 6, -1, 0, 144, 146, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 146, 147, 1, 0, 0, 0, 147, 145, 1, 0, 0, 0, 147, 148, 1, 0, 0, 0, 148, 13, 1, 0, 0, 0, 149, 150, 3, 12, 6, 0, 150, 151, 6, 7, -1, 0, 151, 170, 1, 0, 0, 0, 152, 153, 3, 40, 20, 0, 153, 154, 6, 7, -1, 0, 154, 170, 1, 0, 0, 0, 155, 156, 5, 41, 0, 0, 156, 170, 6, 7, -1, 0, 157, 158, 5, 40, 0, 0, 158, 170, 6, 7, -1, 0, 159, 160, 5, 42, 0, 0, 160, 170, 6, 7, -1, 0, 161, 162, 5, 38, 0, 0, 162, 163, 5, 42, 0, 0, 163, 170, 6, 7, -1, 0, 164, 165, 5, 43, 0, 0, 165, 170, 6, 7, -1, 0, 166, 167, 5, 38, 0, 0, 167, 168, 5, 43, 0, 0, 168, 170, 6, 7, -1, 0, 169, 149, 1, 0, 0, 0, 169, 152, 1, 0, 0, 0, 169, 155, 1, 0, 0, 0, 169, 157, 1, 0, 0, 0, 169, 159, 1, 0, 0, 0, 169, 161, 1, 0, 0, 0, 169, 164, 1, 0, 0, 0, 169, 166, 1, 0, 0, 0, 170, 15, 1, 0, 0, 0, 171, 172, 3, 18, 9, 0, 172, 173, 6, 8, -1, 0, 173, 17, 1, 0, 0, 0, 174, 175, 3, 20, 10, 0, 175, 182, 6, 9, -1, 0, 176, 177, 5, 6, 0, 0, 177, 178, 3, 20, 10, 0, 178, 179, 6, 9, -1, 0, 179, 181, 1, 0, 0, 0, 180, 176, 1, 0, 0, 0, 181, 184, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 19, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 185, 186, 3, 22, 11, 0, 186, 193, 6, 10, -1, 0, 187, 188, 5, 5, 0, 0, 188, 189, 3, 22, 11, 0, 189, 190, 6, 10, -1, 0, 190, 192, 1, 0, 0, 0, 191, 187, 1, 0, 0, 0, 192, 195, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 21, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 196, 197, 7, 0, 0, 0, 197, 198, 3, 22, 11, 0, 198, 199, 6, 11, -1, 0, 199, 204, 1, 0, 0, 0, 200, 201, 3, 24, 12, 0, 201, 202, 6, 11, -1, 0, 202, 204, 1, 0, 0, 0, 203, 196, 1, 0, 0, 0, 203, 200, 1, 0, 0, 0, 204, 23, 1, 0, 0, 0, 205, 206, 5, 27, 0, 0, 206, 207, 3, 16, 8, 0, 207, 208, 5, 28, 0, 0, 208, 209, 6, 12, -1, 0, 209, 219, 1, 0, 0, 0, 210, 211, 3, 40, 20, 0, 211, 212, 7, 1, 0, 0, 212, 213, 3, 26, 13, 0, 213, 214, 6, 12, -1, 0, 214, 219, 1, 0, 0, 0, 215, 216, 3, 40, 20, 0, 216, 217, 6, 12, -1, 0, 217, 219, 1, 0, 0, 0, 218, 205, 1, 0, 0, 0, 218, 210, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 219, 25, 1, 0, 0, 0, 220, 221, 5, 41, 0, 0, 221, 237, 6, 13, -1, 0, 222, 223, 5, 40, 0, 0, 223, 237, 6, 13, -1, 0, 224, 225, 5, 42, 0, 0, 225, 237, 6, 13, -1, 0, 226, 227, 5, 38, 0, 0, 227, 228, 5, 42, 0, 0, 228, 237, 6, 13, -1, 0, 229, 230, 5, 43, 0, 0, 230, 237, 6, 13, -1, 0, 231, 232, 5, 38, 0, 0, 232, 233, 5, 43, 0, 0, 233, 237, 6, 13, -1, 0, 234, 235, 5, 44, 0, 0, 235, 237, 6, 13, -1, 0, 236, 220, 1, 0, 0, 0, 236, 222, 1, 0, 0, 0, 236, 224, 1, 0, 0, 0, 236, 226, 1, 0, 0, 0, 236, 229, 1, 0, 0, 0, 236, 231, 1, 0, 0, 0, 236, 234, 1, 0, 0, 0, 237, 27, 1, 0, 0, 0, 238, 239, 5, 31, 0, 0, 239, 240, 3, 30, 15, 0, 240, 241, 6, 14, -1, 0, 241, 29, 1, 0, 0, 0, 242, 243, 5, 41, 0, 0, 243, 257, 6, 15, -1, 0, 244, 245, 5, 40, 0, 0, 245, 257, 6, 15, -1, 0, 246, 247, 3, 32, 16, 0, 247, 248, 6, 15, -1, 0, 248, 257, 1, 0, 0, 0, 249, 250, 5, 43, 0, 0, 250, 257, 6, 15, -1, 0, 251, 252, 5, 44, 0, 0, 252, 257, 6, 15, -1, 0, 253, 254, 5, 29, 0, 0, 254, 255, 5, 30, 0, 0, 255, 257, 6, 15, -1, 0, 256, 242, 1, 0, 0, 0, 256, 244, 1, 0, 0, 0, 256, 246, 1, 0, 0, 0, 256, 249, 1, 0, 0, 0, 256, 251, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 257, 31, 1, 0, 0, 0, 258, 260, 5, 38, 0, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 42, 0, 0, 262, 33, 1, 0, 0, 0, 263, 264, 5, 32, 0, 0, 264, 265, 5, 45, 0, 0, 265, 267, 5, 27, 0, 0, 266, 268, 3, 36, 18, 0, 267, 266, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 270, 5, 28, 0, 0, 270, 271, 6, 17, -1, 0, 271, 35, 1, 0, 0, 0, 272, 273, 3, 38, 19, 0, 273, 280, 6, 18, -1, 0, 274, 275, 5, 33, 0, 0, 275, 276, 3, 38, 19, 0, 276, 277, 6, 18, -1, 0, 277, 279, 1, 0, 0, 0, 278, 274, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 37, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 42, 0, 0, 284, 298, 6, 19, -1, 0, 285, 286, 5, 38, 0, 0, 286, 287, 5, 42, 0, 0, 287, 298, 6, 19, -1, 0, 288, 289, 5, 43, 0, 0, 289, 298, 6, 19, -1, 0, 290, 291, 5, 38, 0, 0, 291, 292, 5, 43, 0, 0, 292, 298, 6, 19, -1, 0, 293, 294, 5, 41, 0, 0, 294, 298, 6, 19, -1, 0, 295, 296, 5, 40, 0, 0, 296, 298, 6, 19, -1, 0, 297, 283, 1, 0, 0, 0, 297, 285, 1, 0, 0, 0, 297, 288, 1, 0, 0, 0, 297, 290, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 298, 39, 1, 0, 0, 0, 299, 300, 5, 20, 0, 0, 300, 301, 5, 26, 0, 0, 301, 302, 3, 42, 21, 0, 302, 309, 6, 20, -1, 0, 303, 304, 5, 26, 0, 0, 304, 305, 3, 42, 21, 0, 305, 306, 6, 20, -1, 0, 306, 308, 1, 0, 0, 0, 307, 303, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 314, 3, 50, 25, 0, 313, 312, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 6, 20, -1, 0, 316, 391, 1, 0, 0, 0, 317, 318, 5, 19, 0, 0, 318, 325, 6, 20, -1, 0, 319, 320, 5, 26, 0, 0, 320, 321, 3, 42, 21, 0, 321, 322, 6, 20, -1, 0, 322, 324, 1, 0, 0, 0, 323, 319, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 328, 330, 3, 50, 25, 0, 329, 328, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 391, 6, 20, -1, 0, 332, 333, 3, 42, 21, 0, 333, 335, 6, 20, -1, 0, 334, 336, 3, 50, 25, 0, 335, 334, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 338, 6, 20, -1, 0, 338, 391, 1, 0, 0, 0, 339, 340, 3, 42, 21, 0, 340, 342, 6, 20, -1, 0, 341, 343, 5, 26, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 3, 44, 22, 0, 345, 346, 6, 20, -1, 0, 346, 391, 1, 0, 0, 0, 347, 348, 3, 42, 21, 0, 348, 355, 6, 20, -1, 0, 349, 350, 5, 26, 0, 0, 350, 351, 3, 42, 21, 0, 351, 352, 6, 20, -1, 0, 352, 354, 1, 0, 0, 0, 353, 349, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 358, 1, 0, 0, 0, 357, 355, 1, 0, 0, 0, 358, 359, 5, 26, 0, 0, 359, 360, 3, 42, 21, 0, 360, 362, 6, 20, -1, 0, 361, 363, 3, 50, 25, 0, 362, 361, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 365, 6, 20, -1, 0, 365, 391, 1, 0, 0, 0, 366, 367, 3, 42, 21, 0, 367, 374, 6, 20, -1, 0, 368, 369, 5, 26, 0, 0, 369, 370, 3, 42, 21, 0, 370, 371, 6, 20, -1, 0, 371, 373, 1, 0, 0, 0, 372, 368, 1, 0, 0, 0, 373, 376, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 377, 1, 0, 0, 0, 376, 374, 1, 0, 0, 0, 377, 378, 5, 26, 0, 0, 378, 379, 3, 42, 21, 0, 379, 381, 6, 20, -1, 0, 380, 382, 5, 26, 0, 0, 381, 380, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 3, 44, 22, 0, 384, 386, 6, 20, -1, 0, 385, 387, 3, 50, 25, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 6, 20, -1, 0, 389, 391, 1, 0, 0, 0, 390, 299, 1, 0, 0, 0, 390, 317, 1, 0, 0, 0, 390, 332, 1, 0, 0, 0, 390, 339, 1, 0, 0, 0, 390, 347, 1, 0, 0, 0, 390, 366, 1, 0, 0, 0, 391, 41, 1, 0, 0, 0, 392, 393, 5, 45, 0, 0, 393, 395, 5, 27, 0, 0, 394, 396, 3, 36, 18, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 5, 28, 0, 0, 398, 399, 1, 0, 0, 0, 399, 403, 6, 21, -1, 0, 400, 401, 5, 45, 0, 0, 401, 403, 6, 21, -1, 0, 402, 392, 1, 0, 0, 0, 402, 400, 1, 0, 0, 0, 403, 43, 1, 0, 0, 0, 404, 405, 5, 24, 0, 0, 405, 406, 3, 46, 23, 0, 406, 407, 6, 22, -1, 0, 407, 408, 5, 25, 0, 0, 408, 45, 1, 0, 0, 0, 409, 410, 3, 48, 24, 0, 410, 417, 6, 23, -1, 0, 411, 412, 5, 37, 0, 0, 412, 413, 3, 48, 24, 0, 413, 414, 6, 23, -1, 0, 414, 416, 1, 0, 0, 0, 415, 411, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 47, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 420, 423, 5, 45, 0, 0, 421, 422, 5, 26, 0, 0, 422, 424, 5, 45, 0, 0, 423, 421, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 423, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 439, 6, 24, -1, 0, 428, 429, 5, 45, 0, 0, 429, 439, 6, 24, -1, 0, 430, 431, 5, 40, 0, 0, 431, 439, 6, 24, -1, 0, 432, 433, 5, 41, 0, 0, 433, 439, 6, 24, -1, 0, 434, 435, 5, 42, 0, 0, 435, 439, 6, 24, -1, 0, 436, 437, 5, 43, 0, 0, 437, 439, 6, 24, -1, 0, 438, 420, 1, 0, 0, 0, 438, 428, 1, 0, 0, 0, 438, 430, 1, 0, 0, 0, 438, 432, 1, 0, 0, 0, 438, 434, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 439, 49, 1, 0, 0, 0, 440, 441, 3, 54, 27, 0, 441, 442, 3, 52, 26, 0, 442, 443, 6, 25, -1, 0, 443, 51, 1, 0, 0, 0, 444, 448, 1, 0, 0, 0, 445, 448, 5, 42, 0, 0, 446, 448, 5, 43, 0, 0, 447, 444, 1, 0, 0, 0, 447, 445, 1, 0, 0, 0, 447, 446, 1, 0, 0, 0, 448, 53, 1, 0, 0, 0, 449, 450, 7, 2, 0, 0, 450, 55, 1, 0, 0, 0, 40, 57, 60, 66, 69, 72, 76, 86, 108, 127, 137, 147, 169, 182, 193, 203, 218, 236, 256, 259, 267, 280, 297, 309, 313, 325, 329, 335, 342, 355, 362, 374, 381, 386, 390, 395, 402, 417, 425, 438, 447] \ No newline at end of file diff --git a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java index c45a29e8d9..a874cc401e 100644 --- a/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java +++ b/oap-formats/oap-template/src/main/java-antlr-generated/oap/template/TemplateGrammarExpression.java @@ -777,12 +777,21 @@ public static class ExprsCodeContext extends ParserRuleContext { public ArrayList ret = new ArrayList<>(); public TopLevelConcatContext topLevelConcat; public ExprsContext exprs; + public Token SSTRING; + public Token DSTRING; + public Token DECDIGITS; + public Token FLOAT; public TopLevelConcatContext topLevelConcat() { return getRuleContext(TopLevelConcatContext.class,0); } public ExprsContext exprs() { return getRuleContext(ExprsContext.class,0); } + public TerminalNode SSTRING() { return getToken(TemplateGrammarExpression.SSTRING, 0); } + public TerminalNode DSTRING() { return getToken(TemplateGrammarExpression.DSTRING, 0); } + public TerminalNode DECDIGITS() { return getToken(TemplateGrammarExpression.DECDIGITS, 0); } + public TerminalNode MINUS() { return getToken(TemplateGrammarExpression.MINUS, 0); } + public TerminalNode FLOAT() { return getToken(TemplateGrammarExpression.FLOAT, 0); } public ExprsCodeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -801,7 +810,7 @@ public final ExprsCodeContext exprsCode() throws RecognitionException { ExprsCodeContext _localctx = new ExprsCodeContext(_ctx, getState()); enterRule(_localctx, 14, RULE_exprsCode); try { - setState(155); + setState(169); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: @@ -822,6 +831,70 @@ public final ExprsCodeContext exprsCode() throws RecognitionException { _localctx.ret.add( ((ExprsCodeContext)_localctx).exprs.ret ); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(155); + ((ExprsCodeContext)_localctx).SSTRING = match(SSTRING); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( sdStringToString( (((ExprsCodeContext)_localctx).SSTRING!=null?((ExprsCodeContext)_localctx).SSTRING.getText():null) ) ) ); _localctx.ret.add( e ); + + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(157); + ((ExprsCodeContext)_localctx).DSTRING = match(DSTRING); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( sdStringToString( (((ExprsCodeContext)_localctx).DSTRING!=null?((ExprsCodeContext)_localctx).DSTRING.getText():null) ) ) ); _localctx.ret.add( e ); + + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(159); + ((ExprsCodeContext)_localctx).DECDIGITS = match(DECDIGITS); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( (((ExprsCodeContext)_localctx).DECDIGITS!=null?((ExprsCodeContext)_localctx).DECDIGITS.getText():null) ) ) ); _localctx.ret.add( e ); + + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(161); + match(MINUS); + setState(162); + ((ExprsCodeContext)_localctx).DECDIGITS = match(DECDIGITS); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( "-" + (((ExprsCodeContext)_localctx).DECDIGITS!=null?((ExprsCodeContext)_localctx).DECDIGITS.getText():null) ) ) ); _localctx.ret.add( e ); + + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(164); + ((ExprsCodeContext)_localctx).FLOAT = match(FLOAT); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( (((ExprsCodeContext)_localctx).FLOAT!=null?((ExprsCodeContext)_localctx).FLOAT.getText():null) ) ) ); _localctx.ret.add( e ); + + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(166); + match(MINUS); + setState(167); + ((ExprsCodeContext)_localctx).FLOAT = match(FLOAT); + + Exprs e = new Exprs(); e.concatenation = new Concatenation( List.of( new NumericLiteral( "-" + (((ExprsCodeContext)_localctx).FLOAT!=null?((ExprsCodeContext)_localctx).FLOAT.getText():null) ) ) ); _localctx.ret.add( e ); + } break; } @@ -864,7 +937,7 @@ public final IfConditionContext ifCondition() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(157); + setState(171); ((IfConditionContext)_localctx).conditionOr = conditionOr(); ((IfConditionContext)_localctx).ret = ((IfConditionContext)_localctx).conditionOr.ret; } @@ -916,23 +989,23 @@ public final ConditionOrContext conditionOr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(160); + setState(174); ((ConditionOrContext)_localctx).left = conditionAnd(); ((ConditionOrContext)_localctx).ret = ((ConditionOrContext)_localctx).left.ret; - setState(168); + setState(182); _errHandler.sync(this); _la = _input.LA(1); while (_la==OR) { { { - setState(162); + setState(176); match(OR); - setState(163); + setState(177); ((ConditionOrContext)_localctx).right = conditionAnd(); ((ConditionOrContext)_localctx).ret = new OrConditionExpr( _localctx.ret, ((ConditionOrContext)_localctx).right.ret ); } } - setState(170); + setState(184); _errHandler.sync(this); _la = _input.LA(1); } @@ -985,23 +1058,23 @@ public final ConditionAndContext conditionAnd() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(171); + setState(185); ((ConditionAndContext)_localctx).left = conditionNot(); ((ConditionAndContext)_localctx).ret = ((ConditionAndContext)_localctx).left.ret; - setState(179); + setState(193); _errHandler.sync(this); _la = _input.LA(1); while (_la==AND) { { { - setState(173); + setState(187); match(AND); - setState(174); + setState(188); ((ConditionAndContext)_localctx).right = conditionNot(); ((ConditionAndContext)_localctx).ret = new AndConditionExpr( _localctx.ret, ((ConditionAndContext)_localctx).right.ret ); } } - setState(181); + setState(195); _errHandler.sync(this); _la = _input.LA(1); } @@ -1050,14 +1123,14 @@ public final ConditionNotContext conditionNot() throws RecognitionException { enterRule(_localctx, 22, RULE_conditionNot); int _la; try { - setState(189); + setState(203); _errHandler.sync(this); switch (_input.LA(1)) { case NOT: case BANG: enterOuterAlt(_localctx, 1); { - setState(182); + setState(196); _la = _input.LA(1); if ( !(_la==NOT || _la==BANG) ) { _errHandler.recoverInline(this); @@ -1067,7 +1140,7 @@ public final ConditionNotContext conditionNot() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(183); + setState(197); ((ConditionNotContext)_localctx).inner = conditionNot(); ((ConditionNotContext)_localctx).ret = new NotConditionExpr( ((ConditionNotContext)_localctx).inner.ret ); } @@ -1078,7 +1151,7 @@ public final ConditionNotContext conditionNot() throws RecognitionException { case ID: enterOuterAlt(_localctx, 2); { - setState(186); + setState(200); ((ConditionNotContext)_localctx).conditionAtom = conditionAtom(); ((ConditionNotContext)_localctx).ret = ((ConditionNotContext)_localctx).conditionAtom.ret; } @@ -1146,17 +1219,17 @@ public final ConditionAtomContext conditionAtom() throws RecognitionException { enterRule(_localctx, 24, RULE_conditionAtom); int _la; try { - setState(204); + setState(218); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(191); + setState(205); match(LPAREN); - setState(192); + setState(206); ((ConditionAtomContext)_localctx).ifCondition = ifCondition(); - setState(193); + setState(207); match(RPAREN); ((ConditionAtomContext)_localctx).ret = ((ConditionAtomContext)_localctx).ifCondition.ret; } @@ -1164,9 +1237,9 @@ public final ConditionAtomContext conditionAtom() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(196); + setState(210); ((ConditionAtomContext)_localctx).left = exprs(); - setState(197); + setState(211); ((ConditionAtomContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 523776L) != 0)) ) { @@ -1177,7 +1250,7 @@ public final ConditionAtomContext conditionAtom() throws RecognitionException { _errHandler.reportMatch(this); consume(); } - setState(198); + setState(212); ((ConditionAtomContext)_localctx).right = compareRhs(); ((ConditionAtomContext)_localctx).ret = new CompareConditionExpr( ((ConditionAtomContext)_localctx).left.ret, ((ConditionAtomContext)_localctx).op.getText(), ((ConditionAtomContext)_localctx).right.ret ); @@ -1187,7 +1260,7 @@ public final ConditionAtomContext conditionAtom() throws RecognitionException { case 3: enterOuterAlt(_localctx, 3); { - setState(201); + setState(215); ((ConditionAtomContext)_localctx).exprs = exprs(); ((ConditionAtomContext)_localctx).ret = new FieldConditionExpr( ((ConditionAtomContext)_localctx).exprs.ret ); } @@ -1237,13 +1310,13 @@ public final CompareRhsContext compareRhs() throws RecognitionException { CompareRhsContext _localctx = new CompareRhsContext(_ctx, getState()); enterRule(_localctx, 26, RULE_compareRhs); try { - setState(222); + setState(236); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(206); + setState(220); ((CompareRhsContext)_localctx).SSTRING = match(SSTRING); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( sdStringToString( (((CompareRhsContext)_localctx).SSTRING!=null?((CompareRhsContext)_localctx).SSTRING.getText():null) ) ); } @@ -1251,7 +1324,7 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(208); + setState(222); ((CompareRhsContext)_localctx).DSTRING = match(DSTRING); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( sdStringToString( (((CompareRhsContext)_localctx).DSTRING!=null?((CompareRhsContext)_localctx).DSTRING.getText():null) ) ); } @@ -1259,7 +1332,7 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 3: enterOuterAlt(_localctx, 3); { - setState(210); + setState(224); ((CompareRhsContext)_localctx).DECDIGITS = match(DECDIGITS); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( (((CompareRhsContext)_localctx).DECDIGITS!=null?((CompareRhsContext)_localctx).DECDIGITS.getText():null) ); } @@ -1267,9 +1340,9 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 4: enterOuterAlt(_localctx, 4); { - setState(212); + setState(226); match(MINUS); - setState(213); + setState(227); ((CompareRhsContext)_localctx).DECDIGITS = match(DECDIGITS); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( "-" + (((CompareRhsContext)_localctx).DECDIGITS!=null?((CompareRhsContext)_localctx).DECDIGITS.getText():null) ); } @@ -1277,7 +1350,7 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 5: enterOuterAlt(_localctx, 5); { - setState(215); + setState(229); ((CompareRhsContext)_localctx).FLOAT = match(FLOAT); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( (((CompareRhsContext)_localctx).FLOAT!=null?((CompareRhsContext)_localctx).FLOAT.getText():null) ); } @@ -1285,9 +1358,9 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 6: enterOuterAlt(_localctx, 6); { - setState(217); + setState(231); match(MINUS); - setState(218); + setState(232); ((CompareRhsContext)_localctx).FLOAT = match(FLOAT); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( "-" + (((CompareRhsContext)_localctx).FLOAT!=null?((CompareRhsContext)_localctx).FLOAT.getText():null) ); } @@ -1295,7 +1368,7 @@ public final CompareRhsContext compareRhs() throws RecognitionException { case 7: enterOuterAlt(_localctx, 7); { - setState(220); + setState(234); ((CompareRhsContext)_localctx).BOOLEAN = match(BOOLEAN); ((CompareRhsContext)_localctx).ret = new LiteralCompareValue( (((CompareRhsContext)_localctx).BOOLEAN!=null?((CompareRhsContext)_localctx).BOOLEAN.getText():null) ); } @@ -1341,9 +1414,9 @@ public final DefaultValueContext defaultValue() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(224); + setState(238); match(DQUESTION); - setState(225); + setState(239); ((DefaultValueContext)_localctx).defaultValueType = defaultValueType(); ((DefaultValueContext)_localctx).ret = ((DefaultValueContext)_localctx).defaultValueType.ret; } @@ -1394,13 +1467,13 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept DefaultValueTypeContext _localctx = new DefaultValueTypeContext(_ctx, getState()); enterRule(_localctx, 30, RULE_defaultValueType); try { - setState(242); + setState(256); _errHandler.sync(this); switch (_input.LA(1)) { case SSTRING: enterOuterAlt(_localctx, 1); { - setState(228); + setState(242); ((DefaultValueTypeContext)_localctx).SSTRING = match(SSTRING); ((DefaultValueTypeContext)_localctx).ret = sdStringToString( (((DefaultValueTypeContext)_localctx).SSTRING!=null?((DefaultValueTypeContext)_localctx).SSTRING.getText():null) ); } @@ -1408,7 +1481,7 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept case DSTRING: enterOuterAlt(_localctx, 2); { - setState(230); + setState(244); ((DefaultValueTypeContext)_localctx).DSTRING = match(DSTRING); ((DefaultValueTypeContext)_localctx).ret = sdStringToString((((DefaultValueTypeContext)_localctx).DSTRING!=null?((DefaultValueTypeContext)_localctx).DSTRING.getText():null)); } @@ -1417,7 +1490,7 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept case DECDIGITS: enterOuterAlt(_localctx, 3); { - setState(232); + setState(246); ((DefaultValueTypeContext)_localctx).longRule = longRule(); ((DefaultValueTypeContext)_localctx).ret = (((DefaultValueTypeContext)_localctx).longRule!=null?_input.getText(((DefaultValueTypeContext)_localctx).longRule.start,((DefaultValueTypeContext)_localctx).longRule.stop):null); } @@ -1425,7 +1498,7 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept case FLOAT: enterOuterAlt(_localctx, 4); { - setState(235); + setState(249); ((DefaultValueTypeContext)_localctx).FLOAT = match(FLOAT); ((DefaultValueTypeContext)_localctx).ret = (((DefaultValueTypeContext)_localctx).FLOAT!=null?((DefaultValueTypeContext)_localctx).FLOAT.getText():null); } @@ -1433,7 +1506,7 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept case BOOLEAN: enterOuterAlt(_localctx, 5); { - setState(237); + setState(251); ((DefaultValueTypeContext)_localctx).BOOLEAN = match(BOOLEAN); ((DefaultValueTypeContext)_localctx).ret = (((DefaultValueTypeContext)_localctx).BOOLEAN!=null?((DefaultValueTypeContext)_localctx).BOOLEAN.getText():null); } @@ -1441,9 +1514,9 @@ public final DefaultValueTypeContext defaultValueType() throws RecognitionExcept case LBRACK: enterOuterAlt(_localctx, 6); { - setState(239); + setState(253); match(LBRACK); - setState(240); + setState(254); match(RBRACK); ((DefaultValueTypeContext)_localctx).ret = "[]"; } @@ -1488,17 +1561,17 @@ public final LongRuleContext longRule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(245); + setState(259); _errHandler.sync(this); _la = _input.LA(1); if (_la==MINUS) { { - setState(244); + setState(258); match(MINUS); } } - setState(247); + setState(261); match(DECDIGITS); } } @@ -1546,23 +1619,23 @@ public final FunctionContext function() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(249); + setState(263); match(SEMI); - setState(250); + setState(264); ((FunctionContext)_localctx).ID = match(ID); - setState(251); + setState(265); match(LPAREN); - setState(253); + setState(267); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 16767552323584L) != 0)) { { - setState(252); + setState(266); ((FunctionContext)_localctx).functionArgs = functionArgs(); } } - setState(255); + setState(269); match(RPAREN); ((FunctionContext)_localctx).ret = new Func( (((FunctionContext)_localctx).ID!=null?((FunctionContext)_localctx).ID.getText():null), ((FunctionContext)_localctx).functionArgs != null ? ((FunctionContext)_localctx).functionArgs.ret : List.of() ); } @@ -1613,23 +1686,23 @@ public final FunctionArgsContext functionArgs() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(258); + setState(272); ((FunctionArgsContext)_localctx).functionArg = functionArg(); _localctx.ret.add( ((FunctionArgsContext)_localctx).functionArg.ret ); - setState(266); + setState(280); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(260); + setState(274); match(COMMA); - setState(261); + setState(275); ((FunctionArgsContext)_localctx).functionArg = functionArg(); _localctx.ret.add( ((FunctionArgsContext)_localctx).functionArg.ret ); } } - setState(268); + setState(282); _errHandler.sync(this); _la = _input.LA(1); } @@ -1676,13 +1749,13 @@ public final FunctionArgContext functionArg() throws RecognitionException { FunctionArgContext _localctx = new FunctionArgContext(_ctx, getState()); enterRule(_localctx, 38, RULE_functionArg); try { - setState(283); + setState(297); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(269); + setState(283); ((FunctionArgContext)_localctx).DECDIGITS = match(DECDIGITS); ((FunctionArgContext)_localctx).ret = (((FunctionArgContext)_localctx).DECDIGITS!=null?((FunctionArgContext)_localctx).DECDIGITS.getText():null); } @@ -1690,9 +1763,9 @@ public final FunctionArgContext functionArg() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(271); + setState(285); match(MINUS); - setState(272); + setState(286); ((FunctionArgContext)_localctx).DECDIGITS = match(DECDIGITS); ((FunctionArgContext)_localctx).ret = "-" + (((FunctionArgContext)_localctx).DECDIGITS!=null?((FunctionArgContext)_localctx).DECDIGITS.getText():null); } @@ -1700,7 +1773,7 @@ public final FunctionArgContext functionArg() throws RecognitionException { case 3: enterOuterAlt(_localctx, 3); { - setState(274); + setState(288); ((FunctionArgContext)_localctx).FLOAT = match(FLOAT); ((FunctionArgContext)_localctx).ret = (((FunctionArgContext)_localctx).FLOAT!=null?((FunctionArgContext)_localctx).FLOAT.getText():null); } @@ -1708,9 +1781,9 @@ public final FunctionArgContext functionArg() throws RecognitionException { case 4: enterOuterAlt(_localctx, 4); { - setState(276); + setState(290); match(MINUS); - setState(277); + setState(291); ((FunctionArgContext)_localctx).FLOAT = match(FLOAT); ((FunctionArgContext)_localctx).ret = "-" + (((FunctionArgContext)_localctx).FLOAT!=null?((FunctionArgContext)_localctx).FLOAT.getText():null); } @@ -1718,7 +1791,7 @@ public final FunctionArgContext functionArg() throws RecognitionException { case 5: enterOuterAlt(_localctx, 5); { - setState(279); + setState(293); ((FunctionArgContext)_localctx).SSTRING = match(SSTRING); ((FunctionArgContext)_localctx).ret = sStringToDString( (((FunctionArgContext)_localctx).SSTRING!=null?((FunctionArgContext)_localctx).SSTRING.getText():null) ); } @@ -1726,7 +1799,7 @@ public final FunctionArgContext functionArg() throws RecognitionException { case 6: enterOuterAlt(_localctx, 6); { - setState(281); + setState(295); ((FunctionArgContext)_localctx).DSTRING = match(DSTRING); ((FunctionArgContext)_localctx).ret = (((FunctionArgContext)_localctx).DSTRING!=null?((FunctionArgContext)_localctx).DSTRING.getText():null); } @@ -1789,42 +1862,42 @@ public final ExprsContext exprs() throws RecognitionException { int _la; try { int _alt; - setState(376); + setState(390); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(285); + setState(299); match(ROOT); - setState(286); + setState(300); match(DOT); - setState(287); + setState(301); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.rootScoped = true; _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(295); + setState(309); _errHandler.sync(this); _la = _input.LA(1); while (_la==DOT) { { { - setState(289); + setState(303); match(DOT); - setState(290); + setState(304); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); } } - setState(297); + setState(311); _errHandler.sync(this); _la = _input.LA(1); } - setState(299); + setState(313); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) { { - setState(298); + setState(312); ((ExprsContext)_localctx).math = math(); } } @@ -1835,32 +1908,32 @@ public final ExprsContext exprs() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(303); + setState(317); ((ExprsContext)_localctx).VAR_ID = match(VAR_ID); _localctx.ret.varName = (((ExprsContext)_localctx).VAR_ID!=null?((ExprsContext)_localctx).VAR_ID.getText():null).substring( 1 ); - setState(311); + setState(325); _errHandler.sync(this); _la = _input.LA(1); while (_la==DOT) { { { - setState(305); + setState(319); match(DOT); - setState(306); + setState(320); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); } } - setState(313); + setState(327); _errHandler.sync(this); _la = _input.LA(1); } - setState(315); + setState(329); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) { { - setState(314); + setState(328); ((ExprsContext)_localctx).math = math(); } } @@ -1871,15 +1944,15 @@ public final ExprsContext exprs() throws RecognitionException { case 3: enterOuterAlt(_localctx, 3); { - setState(318); + setState(332); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(321); + setState(335); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) { { - setState(320); + setState(334); ((ExprsContext)_localctx).math = math(); } } @@ -1890,20 +1963,20 @@ public final ExprsContext exprs() throws RecognitionException { case 4: enterOuterAlt(_localctx, 4); { - setState(325); + setState(339); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(328); + setState(342); _errHandler.sync(this); _la = _input.LA(1); if (_la==DOT) { { - setState(327); + setState(341); match(DOT); } } - setState(330); + setState(344); ((ExprsContext)_localctx).concatenation = concatenation(); _localctx.ret.concatenation = ((ExprsContext)_localctx).concatenation.ret; } @@ -1911,19 +1984,19 @@ public final ExprsContext exprs() throws RecognitionException { case 5: enterOuterAlt(_localctx, 5); { - setState(333); + setState(347); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(341); + setState(355); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(335); + setState(349); match(DOT); - setState(336); + setState(350); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); @@ -1931,21 +2004,21 @@ public final ExprsContext exprs() throws RecognitionException { } } } - setState(343); + setState(357); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } - setState(344); + setState(358); match(DOT); - setState(345); + setState(359); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(348); + setState(362); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) { { - setState(347); + setState(361); ((ExprsContext)_localctx).math = math(); } } @@ -1956,52 +2029,52 @@ public final ExprsContext exprs() throws RecognitionException { case 6: enterOuterAlt(_localctx, 6); { - setState(352); + setState(366); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(360); + setState(374); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,30,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(354); + setState(368); match(DOT); - setState(355); + setState(369); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); } } } - setState(362); + setState(376); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,30,_ctx); } - setState(363); + setState(377); match(DOT); - setState(364); + setState(378); ((ExprsContext)_localctx).expr = expr(); _localctx.ret.exprs.add( ((ExprsContext)_localctx).expr.ret ); - setState(367); + setState(381); _errHandler.sync(this); _la = _input.LA(1); if (_la==DOT) { { - setState(366); + setState(380); match(DOT); } } - setState(369); + setState(383); ((ExprsContext)_localctx).concatenation = concatenation(); _localctx.ret.concatenation = ((ExprsContext)_localctx).concatenation.ret; - setState(372); + setState(386); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) { { - setState(371); + setState(385); ((ExprsContext)_localctx).math = math(); } } @@ -2052,28 +2125,28 @@ public final ExprContext expr() throws RecognitionException { enterRule(_localctx, 42, RULE_expr); int _la; try { - setState(388); + setState(402); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { { - setState(378); + setState(392); ((ExprContext)_localctx).ID = match(ID); - setState(379); + setState(393); match(LPAREN); - setState(381); + setState(395); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 16767552323584L) != 0)) { { - setState(380); + setState(394); ((ExprContext)_localctx).functionArgs = functionArgs(); } } - setState(383); + setState(397); match(RPAREN); } ((ExprContext)_localctx).ret = new Expr((((ExprContext)_localctx).ID!=null?((ExprContext)_localctx).ID.getText():null), true, ((ExprContext)_localctx).functionArgs != null ? ((ExprContext)_localctx).functionArgs.ret : List.of() ); @@ -2082,7 +2155,7 @@ public final ExprContext expr() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(386); + setState(400); ((ExprContext)_localctx).ID = match(ID); ((ExprContext)_localctx).ret = new Expr((((ExprContext)_localctx).ID!=null?((ExprContext)_localctx).ID.getText():null), false, List.of() ); } @@ -2129,12 +2202,12 @@ public final ConcatenationContext concatenation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(390); + setState(404); match(LBRACE); - setState(391); + setState(405); ((ConcatenationContext)_localctx).citems = citems(); ((ConcatenationContext)_localctx).ret = new Concatenation( ((ConcatenationContext)_localctx).citems.ret ); - setState(393); + setState(407); match(RBRACE); } } @@ -2184,23 +2257,23 @@ public final CitemsContext citems() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(395); + setState(409); ((CitemsContext)_localctx).citem = citem(); _localctx.ret.add( ((CitemsContext)_localctx).citem.ret ); - setState(403); + setState(417); _errHandler.sync(this); _la = _input.LA(1); while (_la==PLUS) { { { - setState(397); + setState(411); match(PLUS); - setState(398); + setState(412); ((CitemsContext)_localctx).citem = citem(); _localctx.ret.add( ((CitemsContext)_localctx).citem.ret ); } } - setState(405); + setState(419); _errHandler.sync(this); _la = _input.LA(1); } @@ -2258,28 +2331,28 @@ public final CitemContext citem() throws RecognitionException { enterRule(_localctx, 48, RULE_citem); int _la; try { - setState(424); + setState(438); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(406); + setState(420); ((CitemContext)_localctx).firstId = match(ID); - setState(409); + setState(423); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(407); + setState(421); match(DOT); - setState(408); + setState(422); ((CitemContext)_localctx).ID = match(ID); ((CitemContext)_localctx).ids.add(((CitemContext)_localctx).ID); } } - setState(411); + setState(425); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==DOT ); @@ -2294,7 +2367,7 @@ public final CitemContext citem() throws RecognitionException { case 2: enterOuterAlt(_localctx, 2); { - setState(414); + setState(428); ((CitemContext)_localctx).ID = match(ID); ((CitemContext)_localctx).ret = new Expr( (((CitemContext)_localctx).ID!=null?((CitemContext)_localctx).ID.getText():null), false, List.of() ); } @@ -2302,7 +2375,7 @@ public final CitemContext citem() throws RecognitionException { case 3: enterOuterAlt(_localctx, 3); { - setState(416); + setState(430); ((CitemContext)_localctx).DSTRING = match(DSTRING); ((CitemContext)_localctx).ret = sdStringToString( (((CitemContext)_localctx).DSTRING!=null?((CitemContext)_localctx).DSTRING.getText():null) ); } @@ -2310,7 +2383,7 @@ public final CitemContext citem() throws RecognitionException { case 4: enterOuterAlt(_localctx, 4); { - setState(418); + setState(432); ((CitemContext)_localctx).SSTRING = match(SSTRING); ((CitemContext)_localctx).ret = sdStringToString( (((CitemContext)_localctx).SSTRING!=null?((CitemContext)_localctx).SSTRING.getText():null) ); } @@ -2318,7 +2391,7 @@ public final CitemContext citem() throws RecognitionException { case 5: enterOuterAlt(_localctx, 5); { - setState(420); + setState(434); ((CitemContext)_localctx).DECDIGITS = match(DECDIGITS); ((CitemContext)_localctx).ret = new NumericLiteral( (((CitemContext)_localctx).DECDIGITS!=null?((CitemContext)_localctx).DECDIGITS.getText():null) ); } @@ -2326,7 +2399,7 @@ public final CitemContext citem() throws RecognitionException { case 6: enterOuterAlt(_localctx, 6); { - setState(422); + setState(436); ((CitemContext)_localctx).FLOAT = match(FLOAT); ((CitemContext)_localctx).ret = new NumericLiteral( (((CitemContext)_localctx).FLOAT!=null?((CitemContext)_localctx).FLOAT.getText():null) ); } @@ -2375,9 +2448,9 @@ public final MathContext math() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(426); + setState(440); ((MathContext)_localctx).mathOperation = mathOperation(); - setState(427); + setState(441); ((MathContext)_localctx).number = number(); ((MathContext)_localctx).ret = new Math( (((MathContext)_localctx).mathOperation!=null?_input.getText(((MathContext)_localctx).mathOperation.start,((MathContext)_localctx).mathOperation.stop):null), (((MathContext)_localctx).number!=null?_input.getText(((MathContext)_localctx).number.start,((MathContext)_localctx).number.stop):null) ); } @@ -2415,7 +2488,7 @@ public final NumberContext number() throws RecognitionException { NumberContext _localctx = new NumberContext(_ctx, getState()); enterRule(_localctx, 52, RULE_number); try { - setState(433); + setState(447); _errHandler.sync(this); switch (_input.LA(1)) { case EOF: @@ -2448,14 +2521,14 @@ public final NumberContext number() throws RecognitionException { case DECDIGITS: enterOuterAlt(_localctx, 2); { - setState(431); + setState(445); match(DECDIGITS); } break; case FLOAT: enterOuterAlt(_localctx, 3); { - setState(432); + setState(446); match(FLOAT); } break; @@ -2501,7 +2574,7 @@ public final MathOperationContext mathOperation() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(435); + setState(449); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 395136991232L) != 0)) ) { _errHandler.recoverInline(this); @@ -2525,7 +2598,7 @@ public final MathOperationContext mathOperation() throws RecognitionException { } public static final String _serializedATN = - "\u0004\u00012\u01b6\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u00012\u01c4\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -2550,280 +2623,292 @@ public final MathOperationContext mathOperation() throws RecognitionException { "\u0004\u0005\u0088\b\u0005\u000b\u0005\f\u0005\u0089\u0001\u0006\u0001"+ "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0004\u0006\u0092"+ "\b\u0006\u000b\u0006\f\u0006\u0093\u0001\u0007\u0001\u0007\u0001\u0007"+ - "\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u009c\b\u0007\u0001\b"+ - "\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0005"+ - "\t\u00a7\b\t\n\t\f\t\u00aa\t\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n"+ - "\u0001\n\u0005\n\u00b2\b\n\n\n\f\n\u00b5\t\n\u0001\u000b\u0001\u000b\u0001"+ - "\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u00be"+ - "\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ - "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u00cd\b\f\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ - "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u00df\b\r\u0001\u000e"+ - "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ - "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+ - "\u00f3\b\u000f\u0001\u0010\u0003\u0010\u00f6\b\u0010\u0001\u0010\u0001"+ - "\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u00fe"+ - "\b\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u0109\b\u0012\n"+ - "\u0012\f\u0012\u010c\t\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0003\u0007"+ + "\u00aa\b\u0007\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t"+ + "\u0001\t\u0001\t\u0005\t\u00b5\b\t\n\t\f\t\u00b8\t\t\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0005\n\u00c0\b\n\n\n\f\n\u00c3\t\n\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0003\u000b\u00cc\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0003\f\u00db"+ + "\b\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0003\r\u00ed"+ + "\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0003\u000f\u0101\b\u000f\u0001\u0010\u0003\u0010\u0104\b\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0003\u0011\u010c\b\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0012"+ + "\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012"+ + "\u0117\b\u0012\n\u0012\f\u0012\u011a\t\u0012\u0001\u0013\u0001\u0013\u0001"+ "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u011c"+ - "\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0126\b\u0014\n\u0014\f\u0014"+ - "\u0129\t\u0014\u0001\u0014\u0003\u0014\u012c\b\u0014\u0001\u0014\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003"+ + "\u0013\u012a\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005\u0014\u0134\b\u0014\n"+ + "\u0014\f\u0014\u0137\t\u0014\u0001\u0014\u0003\u0014\u013a\b\u0014\u0001"+ "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0005\u0014\u0136\b\u0014\n\u0014\f\u0014\u0139\t\u0014\u0001\u0014"+ - "\u0003\u0014\u013c\b\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0003\u0014\u0142\b\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0001\u0014\u0003\u0014\u0149\b\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0014\u0001\u0014\u0005\u0014\u0144\b\u0014\n\u0014\f\u0014\u0147\t\u0014"+ + "\u0001\u0014\u0003\u0014\u014a\b\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0003\u0014\u0150\b\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ + "\u0001\u0014\u0001\u0014\u0003\u0014\u0157\b\u0014\u0001\u0014\u0001\u0014"+ "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014"+ - "\u0005\u0014\u0154\b\u0014\n\u0014\f\u0014\u0157\t\u0014\u0001\u0014\u0001"+ - "\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u015d\b\u0014\u0001\u0014\u0001"+ + "\u0001\u0014\u0005\u0014\u0162\b\u0014\n\u0014\f\u0014\u0165\t\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u016b\b\u0014\u0001"+ "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ - "\u0014\u0005\u0014\u0167\b\u0014\n\u0014\f\u0014\u016a\t\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u0170\b\u0014\u0001\u0014"+ - "\u0001\u0014\u0001\u0014\u0003\u0014\u0175\b\u0014\u0001\u0014\u0001\u0014"+ - "\u0003\u0014\u0179\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015"+ - "\u017e\b\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ - "\u0003\u0015\u0185\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016"+ - "\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ - "\u0001\u0017\u0005\u0017\u0192\b\u0017\n\u0017\f\u0017\u0195\t\u0017\u0001"+ - "\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u019a\b\u0018\u000b\u0018\f"+ - "\u0018\u019b\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0014\u0001\u0014\u0005\u0014\u0175\b\u0014\n\u0014\f\u0014\u0178\t\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u017e\b\u0014"+ + "\u0001\u0014\u0001\u0014\u0001\u0014\u0003\u0014\u0183\b\u0014\u0001\u0014"+ + "\u0001\u0014\u0003\u0014\u0187\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0003\u0015\u018c\b\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0003\u0015\u0193\b\u0015\u0001\u0016\u0001\u0016\u0001\u0016"+ + "\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0005\u0017\u01a0\b\u0017\n\u0017\f\u0017\u01a3"+ + "\t\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0004\u0018\u01a8\b\u0018"+ + "\u000b\u0018\f\u0018\u01a9\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ - "\u0003\u0018\u01a9\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ - "\u0001\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u01b2\b\u001a\u0001\u001b"+ - "\u0001\u001b\u0001\u001b\u0000\u0000\u001c\u0000\u0002\u0004\u0006\b\n"+ - "\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,.0246"+ - "\u0000\u0003\u0001\u0000\u0007\b\u0001\u0000\t\u0012\u0002\u0000\"$&&"+ - "\u01df\u00009\u0001\u0000\u0000\u0000\u0002P\u0001\u0000\u0000\u0000\u0004"+ - "l\u0001\u0000\u0000\u0000\u0006n\u0001\u0000\u0000\u0000\b\u007f\u0001"+ - "\u0000\u0000\u0000\n\u0081\u0001\u0000\u0000\u0000\f\u008b\u0001\u0000"+ - "\u0000\u0000\u000e\u009b\u0001\u0000\u0000\u0000\u0010\u009d\u0001\u0000"+ - "\u0000\u0000\u0012\u00a0\u0001\u0000\u0000\u0000\u0014\u00ab\u0001\u0000"+ - "\u0000\u0000\u0016\u00bd\u0001\u0000\u0000\u0000\u0018\u00cc\u0001\u0000"+ - "\u0000\u0000\u001a\u00de\u0001\u0000\u0000\u0000\u001c\u00e0\u0001\u0000"+ - "\u0000\u0000\u001e\u00f2\u0001\u0000\u0000\u0000 \u00f5\u0001\u0000\u0000"+ - "\u0000\"\u00f9\u0001\u0000\u0000\u0000$\u0102\u0001\u0000\u0000\u0000"+ - "&\u011b\u0001\u0000\u0000\u0000(\u0178\u0001\u0000\u0000\u0000*\u0184"+ - "\u0001\u0000\u0000\u0000,\u0186\u0001\u0000\u0000\u0000.\u018b\u0001\u0000"+ - "\u0000\u00000\u01a8\u0001\u0000\u0000\u00002\u01aa\u0001\u0000\u0000\u0000"+ - "4\u01b1\u0001\u0000\u0000\u00006\u01b3\u0001\u0000\u0000\u00008:\u0005"+ - "\u0015\u0000\u000098\u0001\u0000\u0000\u00009:\u0001\u0000\u0000\u0000"+ - ":<\u0001\u0000\u0000\u0000;=\u0005.\u0000\u0000<;\u0001\u0000\u0000\u0000"+ - "<=\u0001\u0000\u0000\u0000=B\u0001\u0000\u0000\u0000>C\u0003\u0002\u0001"+ - "\u0000?C\u0003\u0006\u0003\u0000@C\u0003\b\u0004\u0000AC\u0003\u000e\u0007"+ - "\u0000B>\u0001\u0000\u0000\u0000B?\u0001\u0000\u0000\u0000B@\u0001\u0000"+ - "\u0000\u0000BA\u0001\u0000\u0000\u0000CE\u0001\u0000\u0000\u0000DF\u0003"+ - "\"\u0011\u0000ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000FH\u0001"+ - "\u0000\u0000\u0000GI\u0003\u001c\u000e\u0000HG\u0001\u0000\u0000\u0000"+ - "HI\u0001\u0000\u0000\u0000IL\u0001\u0000\u0000\u0000JK\u0005\u0001\u0000"+ - "\u0000KM\u0003\u0010\b\u0000LJ\u0001\u0000\u0000\u0000LM\u0001\u0000\u0000"+ - "\u0000MN\u0001\u0000\u0000\u0000NO\u0006\u0000\uffff\uffff\u0000O\u0001"+ - "\u0001\u0000\u0000\u0000PQ\u0005\u0001\u0000\u0000QR\u0003\u0010\b\u0000"+ - "RS\u0005\u0002\u0000\u0000SV\u0003\u0004\u0002\u0000TU\u0005\u0003\u0000"+ - "\u0000UW\u0003\u0004\u0002\u0000VT\u0001\u0000\u0000\u0000VW\u0001\u0000"+ - "\u0000\u0000WX\u0001\u0000\u0000\u0000XY\u0005\u0004\u0000\u0000YZ\u0006"+ - "\u0001\uffff\uffff\u0000Z\u0003\u0001\u0000\u0000\u0000[\\\u0003(\u0014"+ - "\u0000\\]\u0006\u0002\uffff\uffff\u0000]m\u0001\u0000\u0000\u0000^_\u0005"+ - ")\u0000\u0000_m\u0006\u0002\uffff\uffff\u0000`a\u0005(\u0000\u0000am\u0006"+ - "\u0002\uffff\uffff\u0000bc\u0005*\u0000\u0000cm\u0006\u0002\uffff\uffff"+ - "\u0000de\u0005&\u0000\u0000ef\u0005*\u0000\u0000fm\u0006\u0002\uffff\uffff"+ - "\u0000gh\u0005+\u0000\u0000hm\u0006\u0002\uffff\uffff\u0000ij\u0005&\u0000"+ - "\u0000jk\u0005+\u0000\u0000km\u0006\u0002\uffff\uffff\u0000l[\u0001\u0000"+ - "\u0000\u0000l^\u0001\u0000\u0000\u0000l`\u0001\u0000\u0000\u0000lb\u0001"+ - "\u0000\u0000\u0000ld\u0001\u0000\u0000\u0000lg\u0001\u0000\u0000\u0000"+ - "li\u0001\u0000\u0000\u0000m\u0005\u0001\u0000\u0000\u0000no\u0003(\u0014"+ - "\u0000op\u0005\'\u0000\u0000pq\u0003(\u0014\u0000qr\u0006\u0003\uffff"+ - "\uffff\u0000r\u0007\u0001\u0000\u0000\u0000st\u0003(\u0014\u0000tu\u0005"+ - "\u0018\u0000\u0000uv\u0003\n\u0005\u0000vw\u0005\u0019\u0000\u0000wx\u0006"+ - "\u0004\uffff\uffff\u0000x\u0080\u0001\u0000\u0000\u0000yz\u0003(\u0014"+ - "\u0000z{\u0005\u0018\u0000\u0000{|\u0003\u000e\u0007\u0000|}\u0005\u0019"+ - "\u0000\u0000}~\u0006\u0004\uffff\uffff\u0000~\u0080\u0001\u0000\u0000"+ - "\u0000\u007fs\u0001\u0000\u0000\u0000\u007fy\u0001\u0000\u0000\u0000\u0080"+ - "\t\u0001\u0000\u0000\u0000\u0081\u0082\u00030\u0018\u0000\u0082\u0087"+ - "\u0006\u0005\uffff\uffff\u0000\u0083\u0084\u0005%\u0000\u0000\u0084\u0085"+ - "\u00030\u0018\u0000\u0085\u0086\u0006\u0005\uffff\uffff\u0000\u0086\u0088"+ - "\u0001\u0000\u0000\u0000\u0087\u0083\u0001\u0000\u0000\u0000\u0088\u0089"+ - "\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000\u0089\u008a"+ - "\u0001\u0000\u0000\u0000\u008a\u000b\u0001\u0000\u0000\u0000\u008b\u008c"+ - "\u00030\u0018\u0000\u008c\u0091\u0006\u0006\uffff\uffff\u0000\u008d\u008e"+ - "\u0005%\u0000\u0000\u008e\u008f\u00030\u0018\u0000\u008f\u0090\u0006\u0006"+ - "\uffff\uffff\u0000\u0090\u0092\u0001\u0000\u0000\u0000\u0091\u008d\u0001"+ - "\u0000\u0000\u0000\u0092\u0093\u0001\u0000\u0000\u0000\u0093\u0091\u0001"+ - "\u0000\u0000\u0000\u0093\u0094\u0001\u0000\u0000\u0000\u0094\r\u0001\u0000"+ - "\u0000\u0000\u0095\u0096\u0003\f\u0006\u0000\u0096\u0097\u0006\u0007\uffff"+ - "\uffff\u0000\u0097\u009c\u0001\u0000\u0000\u0000\u0098\u0099\u0003(\u0014"+ - "\u0000\u0099\u009a\u0006\u0007\uffff\uffff\u0000\u009a\u009c\u0001\u0000"+ - "\u0000\u0000\u009b\u0095\u0001\u0000\u0000\u0000\u009b\u0098\u0001\u0000"+ - "\u0000\u0000\u009c\u000f\u0001\u0000\u0000\u0000\u009d\u009e\u0003\u0012"+ - "\t\u0000\u009e\u009f\u0006\b\uffff\uffff\u0000\u009f\u0011\u0001\u0000"+ - "\u0000\u0000\u00a0\u00a1\u0003\u0014\n\u0000\u00a1\u00a8\u0006\t\uffff"+ - "\uffff\u0000\u00a2\u00a3\u0005\u0006\u0000\u0000\u00a3\u00a4\u0003\u0014"+ - "\n\u0000\u00a4\u00a5\u0006\t\uffff\uffff\u0000\u00a5\u00a7\u0001\u0000"+ - "\u0000\u0000\u00a6\u00a2\u0001\u0000\u0000\u0000\u00a7\u00aa\u0001\u0000"+ - "\u0000\u0000\u00a8\u00a6\u0001\u0000\u0000\u0000\u00a8\u00a9\u0001\u0000"+ - "\u0000\u0000\u00a9\u0013\u0001\u0000\u0000\u0000\u00aa\u00a8\u0001\u0000"+ - "\u0000\u0000\u00ab\u00ac\u0003\u0016\u000b\u0000\u00ac\u00b3\u0006\n\uffff"+ - "\uffff\u0000\u00ad\u00ae\u0005\u0005\u0000\u0000\u00ae\u00af\u0003\u0016"+ - "\u000b\u0000\u00af\u00b0\u0006\n\uffff\uffff\u0000\u00b0\u00b2\u0001\u0000"+ - "\u0000\u0000\u00b1\u00ad\u0001\u0000\u0000\u0000\u00b2\u00b5\u0001\u0000"+ - "\u0000\u0000\u00b3\u00b1\u0001\u0000\u0000\u0000\u00b3\u00b4\u0001\u0000"+ - "\u0000\u0000\u00b4\u0015\u0001\u0000\u0000\u0000\u00b5\u00b3\u0001\u0000"+ - "\u0000\u0000\u00b6\u00b7\u0007\u0000\u0000\u0000\u00b7\u00b8\u0003\u0016"+ - "\u000b\u0000\u00b8\u00b9\u0006\u000b\uffff\uffff\u0000\u00b9\u00be\u0001"+ - "\u0000\u0000\u0000\u00ba\u00bb\u0003\u0018\f\u0000\u00bb\u00bc\u0006\u000b"+ - "\uffff\uffff\u0000\u00bc\u00be\u0001\u0000\u0000\u0000\u00bd\u00b6\u0001"+ - "\u0000\u0000\u0000\u00bd\u00ba\u0001\u0000\u0000\u0000\u00be\u0017\u0001"+ - "\u0000\u0000\u0000\u00bf\u00c0\u0005\u001b\u0000\u0000\u00c0\u00c1\u0003"+ - "\u0010\b\u0000\u00c1\u00c2\u0005\u001c\u0000\u0000\u00c2\u00c3\u0006\f"+ - "\uffff\uffff\u0000\u00c3\u00cd\u0001\u0000\u0000\u0000\u00c4\u00c5\u0003"+ - "(\u0014\u0000\u00c5\u00c6\u0007\u0001\u0000\u0000\u00c6\u00c7\u0003\u001a"+ - "\r\u0000\u00c7\u00c8\u0006\f\uffff\uffff\u0000\u00c8\u00cd\u0001\u0000"+ - "\u0000\u0000\u00c9\u00ca\u0003(\u0014\u0000\u00ca\u00cb\u0006\f\uffff"+ - "\uffff\u0000\u00cb\u00cd\u0001\u0000\u0000\u0000\u00cc\u00bf\u0001\u0000"+ - "\u0000\u0000\u00cc\u00c4\u0001\u0000\u0000\u0000\u00cc\u00c9\u0001\u0000"+ - "\u0000\u0000\u00cd\u0019\u0001\u0000\u0000\u0000\u00ce\u00cf\u0005)\u0000"+ - "\u0000\u00cf\u00df\u0006\r\uffff\uffff\u0000\u00d0\u00d1\u0005(\u0000"+ - "\u0000\u00d1\u00df\u0006\r\uffff\uffff\u0000\u00d2\u00d3\u0005*\u0000"+ - "\u0000\u00d3\u00df\u0006\r\uffff\uffff\u0000\u00d4\u00d5\u0005&\u0000"+ - "\u0000\u00d5\u00d6\u0005*\u0000\u0000\u00d6\u00df\u0006\r\uffff\uffff"+ - "\u0000\u00d7\u00d8\u0005+\u0000\u0000\u00d8\u00df\u0006\r\uffff\uffff"+ - "\u0000\u00d9\u00da\u0005&\u0000\u0000\u00da\u00db\u0005+\u0000\u0000\u00db"+ - "\u00df\u0006\r\uffff\uffff\u0000\u00dc\u00dd\u0005,\u0000\u0000\u00dd"+ - "\u00df\u0006\r\uffff\uffff\u0000\u00de\u00ce\u0001\u0000\u0000\u0000\u00de"+ - "\u00d0\u0001\u0000\u0000\u0000\u00de\u00d2\u0001\u0000\u0000\u0000\u00de"+ - "\u00d4\u0001\u0000\u0000\u0000\u00de\u00d7\u0001\u0000\u0000\u0000\u00de"+ - "\u00d9\u0001\u0000\u0000\u0000\u00de\u00dc\u0001\u0000\u0000\u0000\u00df"+ - "\u001b\u0001\u0000\u0000\u0000\u00e0\u00e1\u0005\u001f\u0000\u0000\u00e1"+ - "\u00e2\u0003\u001e\u000f\u0000\u00e2\u00e3\u0006\u000e\uffff\uffff\u0000"+ - "\u00e3\u001d\u0001\u0000\u0000\u0000\u00e4\u00e5\u0005)\u0000\u0000\u00e5"+ - "\u00f3\u0006\u000f\uffff\uffff\u0000\u00e6\u00e7\u0005(\u0000\u0000\u00e7"+ - "\u00f3\u0006\u000f\uffff\uffff\u0000\u00e8\u00e9\u0003 \u0010\u0000\u00e9"+ - "\u00ea\u0006\u000f\uffff\uffff\u0000\u00ea\u00f3\u0001\u0000\u0000\u0000"+ - "\u00eb\u00ec\u0005+\u0000\u0000\u00ec\u00f3\u0006\u000f\uffff\uffff\u0000"+ - "\u00ed\u00ee\u0005,\u0000\u0000\u00ee\u00f3\u0006\u000f\uffff\uffff\u0000"+ - "\u00ef\u00f0\u0005\u001d\u0000\u0000\u00f0\u00f1\u0005\u001e\u0000\u0000"+ - "\u00f1\u00f3\u0006\u000f\uffff\uffff\u0000\u00f2\u00e4\u0001\u0000\u0000"+ - "\u0000\u00f2\u00e6\u0001\u0000\u0000\u0000\u00f2\u00e8\u0001\u0000\u0000"+ - "\u0000\u00f2\u00eb\u0001\u0000\u0000\u0000\u00f2\u00ed\u0001\u0000\u0000"+ - "\u0000\u00f2\u00ef\u0001\u0000\u0000\u0000\u00f3\u001f\u0001\u0000\u0000"+ - "\u0000\u00f4\u00f6\u0005&\u0000\u0000\u00f5\u00f4\u0001\u0000\u0000\u0000"+ - "\u00f5\u00f6\u0001\u0000\u0000\u0000\u00f6\u00f7\u0001\u0000\u0000\u0000"+ - "\u00f7\u00f8\u0005*\u0000\u0000\u00f8!\u0001\u0000\u0000\u0000\u00f9\u00fa"+ - "\u0005 \u0000\u0000\u00fa\u00fb\u0005-\u0000\u0000\u00fb\u00fd\u0005\u001b"+ - "\u0000\u0000\u00fc\u00fe\u0003$\u0012\u0000\u00fd\u00fc\u0001\u0000\u0000"+ - "\u0000\u00fd\u00fe\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000"+ - "\u0000\u00ff\u0100\u0005\u001c\u0000\u0000\u0100\u0101\u0006\u0011\uffff"+ - "\uffff\u0000\u0101#\u0001\u0000\u0000\u0000\u0102\u0103\u0003&\u0013\u0000"+ - "\u0103\u010a\u0006\u0012\uffff\uffff\u0000\u0104\u0105\u0005!\u0000\u0000"+ - "\u0105\u0106\u0003&\u0013\u0000\u0106\u0107\u0006\u0012\uffff\uffff\u0000"+ - "\u0107\u0109\u0001\u0000\u0000\u0000\u0108\u0104\u0001\u0000\u0000\u0000"+ - "\u0109\u010c\u0001\u0000\u0000\u0000\u010a\u0108\u0001\u0000\u0000\u0000"+ - "\u010a\u010b\u0001\u0000\u0000\u0000\u010b%\u0001\u0000\u0000\u0000\u010c"+ - "\u010a\u0001\u0000\u0000\u0000\u010d\u010e\u0005*\u0000\u0000\u010e\u011c"+ - "\u0006\u0013\uffff\uffff\u0000\u010f\u0110\u0005&\u0000\u0000\u0110\u0111"+ - "\u0005*\u0000\u0000\u0111\u011c\u0006\u0013\uffff\uffff\u0000\u0112\u0113"+ - "\u0005+\u0000\u0000\u0113\u011c\u0006\u0013\uffff\uffff\u0000\u0114\u0115"+ - "\u0005&\u0000\u0000\u0115\u0116\u0005+\u0000\u0000\u0116\u011c\u0006\u0013"+ - "\uffff\uffff\u0000\u0117\u0118\u0005)\u0000\u0000\u0118\u011c\u0006\u0013"+ - "\uffff\uffff\u0000\u0119\u011a\u0005(\u0000\u0000\u011a\u011c\u0006\u0013"+ - "\uffff\uffff\u0000\u011b\u010d\u0001\u0000\u0000\u0000\u011b\u010f\u0001"+ - "\u0000\u0000\u0000\u011b\u0112\u0001\u0000\u0000\u0000\u011b\u0114\u0001"+ - "\u0000\u0000\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119\u0001"+ - "\u0000\u0000\u0000\u011c\'\u0001\u0000\u0000\u0000\u011d\u011e\u0005\u0014"+ - "\u0000\u0000\u011e\u011f\u0005\u001a\u0000\u0000\u011f\u0120\u0003*\u0015"+ - "\u0000\u0120\u0127\u0006\u0014\uffff\uffff\u0000\u0121\u0122\u0005\u001a"+ - "\u0000\u0000\u0122\u0123\u0003*\u0015\u0000\u0123\u0124\u0006\u0014\uffff"+ - "\uffff\u0000\u0124\u0126\u0001\u0000\u0000\u0000\u0125\u0121\u0001\u0000"+ - "\u0000\u0000\u0126\u0129\u0001\u0000\u0000\u0000\u0127\u0125\u0001\u0000"+ - "\u0000\u0000\u0127\u0128\u0001\u0000\u0000\u0000\u0128\u012b\u0001\u0000"+ - "\u0000\u0000\u0129\u0127\u0001\u0000\u0000\u0000\u012a\u012c\u00032\u0019"+ - "\u0000\u012b\u012a\u0001\u0000\u0000\u0000\u012b\u012c\u0001\u0000\u0000"+ - "\u0000\u012c\u012d\u0001\u0000\u0000\u0000\u012d\u012e\u0006\u0014\uffff"+ - "\uffff\u0000\u012e\u0179\u0001\u0000\u0000\u0000\u012f\u0130\u0005\u0013"+ - "\u0000\u0000\u0130\u0137\u0006\u0014\uffff\uffff\u0000\u0131\u0132\u0005"+ - "\u001a\u0000\u0000\u0132\u0133\u0003*\u0015\u0000\u0133\u0134\u0006\u0014"+ - "\uffff\uffff\u0000\u0134\u0136\u0001\u0000\u0000\u0000\u0135\u0131\u0001"+ - "\u0000\u0000\u0000\u0136\u0139\u0001\u0000\u0000\u0000\u0137\u0135\u0001"+ - "\u0000\u0000\u0000\u0137\u0138\u0001\u0000\u0000\u0000\u0138\u013b\u0001"+ - "\u0000\u0000\u0000\u0139\u0137\u0001\u0000\u0000\u0000\u013a\u013c\u0003"+ - "2\u0019\u0000\u013b\u013a\u0001\u0000\u0000\u0000\u013b\u013c\u0001\u0000"+ - "\u0000\u0000\u013c\u013d\u0001\u0000\u0000\u0000\u013d\u0179\u0006\u0014"+ - "\uffff\uffff\u0000\u013e\u013f\u0003*\u0015\u0000\u013f\u0141\u0006\u0014"+ - "\uffff\uffff\u0000\u0140\u0142\u00032\u0019\u0000\u0141\u0140\u0001\u0000"+ - "\u0000\u0000\u0141\u0142\u0001\u0000\u0000\u0000\u0142\u0143\u0001\u0000"+ - "\u0000\u0000\u0143\u0144\u0006\u0014\uffff\uffff\u0000\u0144\u0179\u0001"+ - "\u0000\u0000\u0000\u0145\u0146\u0003*\u0015\u0000\u0146\u0148\u0006\u0014"+ - "\uffff\uffff\u0000\u0147\u0149\u0005\u001a\u0000\u0000\u0148\u0147\u0001"+ - "\u0000\u0000\u0000\u0148\u0149\u0001\u0000\u0000\u0000\u0149\u014a\u0001"+ - "\u0000\u0000\u0000\u014a\u014b\u0003,\u0016\u0000\u014b\u014c\u0006\u0014"+ - "\uffff\uffff\u0000\u014c\u0179\u0001\u0000\u0000\u0000\u014d\u014e\u0003"+ - "*\u0015\u0000\u014e\u0155\u0006\u0014\uffff\uffff\u0000\u014f\u0150\u0005"+ - "\u001a\u0000\u0000\u0150\u0151\u0003*\u0015\u0000\u0151\u0152\u0006\u0014"+ - "\uffff\uffff\u0000\u0152\u0154\u0001\u0000\u0000\u0000\u0153\u014f\u0001"+ - "\u0000\u0000\u0000\u0154\u0157\u0001\u0000\u0000\u0000\u0155\u0153\u0001"+ - "\u0000\u0000\u0000\u0155\u0156\u0001\u0000\u0000\u0000\u0156\u0158\u0001"+ - "\u0000\u0000\u0000\u0157\u0155\u0001\u0000\u0000\u0000\u0158\u0159\u0005"+ - "\u001a\u0000\u0000\u0159\u015a\u0003*\u0015\u0000\u015a\u015c\u0006\u0014"+ - "\uffff\uffff\u0000\u015b\u015d\u00032\u0019\u0000\u015c\u015b\u0001\u0000"+ - "\u0000\u0000\u015c\u015d\u0001\u0000\u0000\u0000\u015d\u015e\u0001\u0000"+ - "\u0000\u0000\u015e\u015f\u0006\u0014\uffff\uffff\u0000\u015f\u0179\u0001"+ - "\u0000\u0000\u0000\u0160\u0161\u0003*\u0015\u0000\u0161\u0168\u0006\u0014"+ - "\uffff\uffff\u0000\u0162\u0163\u0005\u001a\u0000\u0000\u0163\u0164\u0003"+ - "*\u0015\u0000\u0164\u0165\u0006\u0014\uffff\uffff\u0000\u0165\u0167\u0001"+ - "\u0000\u0000\u0000\u0166\u0162\u0001\u0000\u0000\u0000\u0167\u016a\u0001"+ - "\u0000\u0000\u0000\u0168\u0166\u0001\u0000\u0000\u0000\u0168\u0169\u0001"+ - "\u0000\u0000\u0000\u0169\u016b\u0001\u0000\u0000\u0000\u016a\u0168\u0001"+ - "\u0000\u0000\u0000\u016b\u016c\u0005\u001a\u0000\u0000\u016c\u016d\u0003"+ - "*\u0015\u0000\u016d\u016f\u0006\u0014\uffff\uffff\u0000\u016e\u0170\u0005"+ - "\u001a\u0000\u0000\u016f\u016e\u0001\u0000\u0000\u0000\u016f\u0170\u0001"+ - "\u0000\u0000\u0000\u0170\u0171\u0001\u0000\u0000\u0000\u0171\u0172\u0003"+ - ",\u0016\u0000\u0172\u0174\u0006\u0014\uffff\uffff\u0000\u0173\u0175\u0003"+ - "2\u0019\u0000\u0174\u0173\u0001\u0000\u0000\u0000\u0174\u0175\u0001\u0000"+ - "\u0000\u0000\u0175\u0176\u0001\u0000\u0000\u0000\u0176\u0177\u0006\u0014"+ - "\uffff\uffff\u0000\u0177\u0179\u0001\u0000\u0000\u0000\u0178\u011d\u0001"+ - "\u0000\u0000\u0000\u0178\u012f\u0001\u0000\u0000\u0000\u0178\u013e\u0001"+ - "\u0000\u0000\u0000\u0178\u0145\u0001\u0000\u0000\u0000\u0178\u014d\u0001"+ - "\u0000\u0000\u0000\u0178\u0160\u0001\u0000\u0000\u0000\u0179)\u0001\u0000"+ - "\u0000\u0000\u017a\u017b\u0005-\u0000\u0000\u017b\u017d\u0005\u001b\u0000"+ - "\u0000\u017c\u017e\u0003$\u0012\u0000\u017d\u017c\u0001\u0000\u0000\u0000"+ - "\u017d\u017e\u0001\u0000\u0000\u0000\u017e\u017f\u0001\u0000\u0000\u0000"+ - "\u017f\u0180\u0005\u001c\u0000\u0000\u0180\u0181\u0001\u0000\u0000\u0000"+ - "\u0181\u0185\u0006\u0015\uffff\uffff\u0000\u0182\u0183\u0005-\u0000\u0000"+ - "\u0183\u0185\u0006\u0015\uffff\uffff\u0000\u0184\u017a\u0001\u0000\u0000"+ - "\u0000\u0184\u0182\u0001\u0000\u0000\u0000\u0185+\u0001\u0000\u0000\u0000"+ - "\u0186\u0187\u0005\u0018\u0000\u0000\u0187\u0188\u0003.\u0017\u0000\u0188"+ - "\u0189\u0006\u0016\uffff\uffff\u0000\u0189\u018a\u0005\u0019\u0000\u0000"+ - "\u018a-\u0001\u0000\u0000\u0000\u018b\u018c\u00030\u0018\u0000\u018c\u0193"+ - "\u0006\u0017\uffff\uffff\u0000\u018d\u018e\u0005%\u0000\u0000\u018e\u018f"+ - "\u00030\u0018\u0000\u018f\u0190\u0006\u0017\uffff\uffff\u0000\u0190\u0192"+ - "\u0001\u0000\u0000\u0000\u0191\u018d\u0001\u0000\u0000\u0000\u0192\u0195"+ - "\u0001\u0000\u0000\u0000\u0193\u0191\u0001\u0000\u0000\u0000\u0193\u0194"+ - "\u0001\u0000\u0000\u0000\u0194/\u0001\u0000\u0000\u0000\u0195\u0193\u0001"+ - "\u0000\u0000\u0000\u0196\u0199\u0005-\u0000\u0000\u0197\u0198\u0005\u001a"+ - "\u0000\u0000\u0198\u019a\u0005-\u0000\u0000\u0199\u0197\u0001\u0000\u0000"+ - "\u0000\u019a\u019b\u0001\u0000\u0000\u0000\u019b\u0199\u0001\u0000\u0000"+ - "\u0000\u019b\u019c\u0001\u0000\u0000\u0000\u019c\u019d\u0001\u0000\u0000"+ - "\u0000\u019d\u01a9\u0006\u0018\uffff\uffff\u0000\u019e\u019f\u0005-\u0000"+ - "\u0000\u019f\u01a9\u0006\u0018\uffff\uffff\u0000\u01a0\u01a1\u0005(\u0000"+ - "\u0000\u01a1\u01a9\u0006\u0018\uffff\uffff\u0000\u01a2\u01a3\u0005)\u0000"+ - "\u0000\u01a3\u01a9\u0006\u0018\uffff\uffff\u0000\u01a4\u01a5\u0005*\u0000"+ - "\u0000\u01a5\u01a9\u0006\u0018\uffff\uffff\u0000\u01a6\u01a7\u0005+\u0000"+ - "\u0000\u01a7\u01a9\u0006\u0018\uffff\uffff\u0000\u01a8\u0196\u0001\u0000"+ - "\u0000\u0000\u01a8\u019e\u0001\u0000\u0000\u0000\u01a8\u01a0\u0001\u0000"+ - "\u0000\u0000\u01a8\u01a2\u0001\u0000\u0000\u0000\u01a8\u01a4\u0001\u0000"+ - "\u0000\u0000\u01a8\u01a6\u0001\u0000\u0000\u0000\u01a91\u0001\u0000\u0000"+ - "\u0000\u01aa\u01ab\u00036\u001b\u0000\u01ab\u01ac\u00034\u001a\u0000\u01ac"+ - "\u01ad\u0006\u0019\uffff\uffff\u0000\u01ad3\u0001\u0000\u0000\u0000\u01ae"+ - "\u01b2\u0001\u0000\u0000\u0000\u01af\u01b2\u0005*\u0000\u0000\u01b0\u01b2"+ - "\u0005+\u0000\u0000\u01b1\u01ae\u0001\u0000\u0000\u0000\u01b1\u01af\u0001"+ - "\u0000\u0000\u0000\u01b1\u01b0\u0001\u0000\u0000\u0000\u01b25\u0001\u0000"+ - "\u0000\u0000\u01b3\u01b4\u0007\u0002\u0000\u0000\u01b47\u0001\u0000\u0000"+ - "\u0000(9C\u0003\u0002"+ + "\u0001\u0000?C\u0003\u0006\u0003\u0000@C\u0003\b\u0004\u0000AC\u0003\u000e"+ + "\u0007\u0000B>\u0001\u0000\u0000\u0000B?\u0001\u0000\u0000\u0000B@\u0001"+ + "\u0000\u0000\u0000BA\u0001\u0000\u0000\u0000CE\u0001\u0000\u0000\u0000"+ + "DF\u0003\"\u0011\u0000ED\u0001\u0000\u0000\u0000EF\u0001\u0000\u0000\u0000"+ + "FH\u0001\u0000\u0000\u0000GI\u0003\u001c\u000e\u0000HG\u0001\u0000\u0000"+ + "\u0000HI\u0001\u0000\u0000\u0000IL\u0001\u0000\u0000\u0000JK\u0005\u0001"+ + "\u0000\u0000KM\u0003\u0010\b\u0000LJ\u0001\u0000\u0000\u0000LM\u0001\u0000"+ + "\u0000\u0000MN\u0001\u0000\u0000\u0000NO\u0006\u0000\uffff\uffff\u0000"+ + "O\u0001\u0001\u0000\u0000\u0000PQ\u0005\u0001\u0000\u0000QR\u0003\u0010"+ + "\b\u0000RS\u0005\u0002\u0000\u0000SV\u0003\u0004\u0002\u0000TU\u0005\u0003"+ + "\u0000\u0000UW\u0003\u0004\u0002\u0000VT\u0001\u0000\u0000\u0000VW\u0001"+ + "\u0000\u0000\u0000WX\u0001\u0000\u0000\u0000XY\u0005\u0004\u0000\u0000"+ + "YZ\u0006\u0001\uffff\uffff\u0000Z\u0003\u0001\u0000\u0000\u0000[\\\u0003"+ + "(\u0014\u0000\\]\u0006\u0002\uffff\uffff\u0000]m\u0001\u0000\u0000\u0000"+ + "^_\u0005)\u0000\u0000_m\u0006\u0002\uffff\uffff\u0000`a\u0005(\u0000\u0000"+ + "am\u0006\u0002\uffff\uffff\u0000bc\u0005*\u0000\u0000cm\u0006\u0002\uffff"+ + "\uffff\u0000de\u0005&\u0000\u0000ef\u0005*\u0000\u0000fm\u0006\u0002\uffff"+ + "\uffff\u0000gh\u0005+\u0000\u0000hm\u0006\u0002\uffff\uffff\u0000ij\u0005"+ + "&\u0000\u0000jk\u0005+\u0000\u0000km\u0006\u0002\uffff\uffff\u0000l[\u0001"+ + "\u0000\u0000\u0000l^\u0001\u0000\u0000\u0000l`\u0001\u0000\u0000\u0000"+ + "lb\u0001\u0000\u0000\u0000ld\u0001\u0000\u0000\u0000lg\u0001\u0000\u0000"+ + "\u0000li\u0001\u0000\u0000\u0000m\u0005\u0001\u0000\u0000\u0000no\u0003"+ + "(\u0014\u0000op\u0005\'\u0000\u0000pq\u0003(\u0014\u0000qr\u0006\u0003"+ + "\uffff\uffff\u0000r\u0007\u0001\u0000\u0000\u0000st\u0003(\u0014\u0000"+ + "tu\u0005\u0018\u0000\u0000uv\u0003\n\u0005\u0000vw\u0005\u0019\u0000\u0000"+ + "wx\u0006\u0004\uffff\uffff\u0000x\u0080\u0001\u0000\u0000\u0000yz\u0003"+ + "(\u0014\u0000z{\u0005\u0018\u0000\u0000{|\u0003\u000e\u0007\u0000|}\u0005"+ + "\u0019\u0000\u0000}~\u0006\u0004\uffff\uffff\u0000~\u0080\u0001\u0000"+ + "\u0000\u0000\u007fs\u0001\u0000\u0000\u0000\u007fy\u0001\u0000\u0000\u0000"+ + "\u0080\t\u0001\u0000\u0000\u0000\u0081\u0082\u00030\u0018\u0000\u0082"+ + "\u0087\u0006\u0005\uffff\uffff\u0000\u0083\u0084\u0005%\u0000\u0000\u0084"+ + "\u0085\u00030\u0018\u0000\u0085\u0086\u0006\u0005\uffff\uffff\u0000\u0086"+ + "\u0088\u0001\u0000\u0000\u0000\u0087\u0083\u0001\u0000\u0000\u0000\u0088"+ + "\u0089\u0001\u0000\u0000\u0000\u0089\u0087\u0001\u0000\u0000\u0000\u0089"+ + "\u008a\u0001\u0000\u0000\u0000\u008a\u000b\u0001\u0000\u0000\u0000\u008b"+ + "\u008c\u00030\u0018\u0000\u008c\u0091\u0006\u0006\uffff\uffff\u0000\u008d"+ + "\u008e\u0005%\u0000\u0000\u008e\u008f\u00030\u0018\u0000\u008f\u0090\u0006"+ + "\u0006\uffff\uffff\u0000\u0090\u0092\u0001\u0000\u0000\u0000\u0091\u008d"+ + "\u0001\u0000\u0000\u0000\u0092\u0093\u0001\u0000\u0000\u0000\u0093\u0091"+ + "\u0001\u0000\u0000\u0000\u0093\u0094\u0001\u0000\u0000\u0000\u0094\r\u0001"+ + "\u0000\u0000\u0000\u0095\u0096\u0003\f\u0006\u0000\u0096\u0097\u0006\u0007"+ + "\uffff\uffff\u0000\u0097\u00aa\u0001\u0000\u0000\u0000\u0098\u0099\u0003"+ + "(\u0014\u0000\u0099\u009a\u0006\u0007\uffff\uffff\u0000\u009a\u00aa\u0001"+ + "\u0000\u0000\u0000\u009b\u009c\u0005)\u0000\u0000\u009c\u00aa\u0006\u0007"+ + "\uffff\uffff\u0000\u009d\u009e\u0005(\u0000\u0000\u009e\u00aa\u0006\u0007"+ + "\uffff\uffff\u0000\u009f\u00a0\u0005*\u0000\u0000\u00a0\u00aa\u0006\u0007"+ + "\uffff\uffff\u0000\u00a1\u00a2\u0005&\u0000\u0000\u00a2\u00a3\u0005*\u0000"+ + "\u0000\u00a3\u00aa\u0006\u0007\uffff\uffff\u0000\u00a4\u00a5\u0005+\u0000"+ + "\u0000\u00a5\u00aa\u0006\u0007\uffff\uffff\u0000\u00a6\u00a7\u0005&\u0000"+ + "\u0000\u00a7\u00a8\u0005+\u0000\u0000\u00a8\u00aa\u0006\u0007\uffff\uffff"+ + "\u0000\u00a9\u0095\u0001\u0000\u0000\u0000\u00a9\u0098\u0001\u0000\u0000"+ + "\u0000\u00a9\u009b\u0001\u0000\u0000\u0000\u00a9\u009d\u0001\u0000\u0000"+ + "\u0000\u00a9\u009f\u0001\u0000\u0000\u0000\u00a9\u00a1\u0001\u0000\u0000"+ + "\u0000\u00a9\u00a4\u0001\u0000\u0000\u0000\u00a9\u00a6\u0001\u0000\u0000"+ + "\u0000\u00aa\u000f\u0001\u0000\u0000\u0000\u00ab\u00ac\u0003\u0012\t\u0000"+ + "\u00ac\u00ad\u0006\b\uffff\uffff\u0000\u00ad\u0011\u0001\u0000\u0000\u0000"+ + "\u00ae\u00af\u0003\u0014\n\u0000\u00af\u00b6\u0006\t\uffff\uffff\u0000"+ + "\u00b0\u00b1\u0005\u0006\u0000\u0000\u00b1\u00b2\u0003\u0014\n\u0000\u00b2"+ + "\u00b3\u0006\t\uffff\uffff\u0000\u00b3\u00b5\u0001\u0000\u0000\u0000\u00b4"+ + "\u00b0\u0001\u0000\u0000\u0000\u00b5\u00b8\u0001\u0000\u0000\u0000\u00b6"+ + "\u00b4\u0001\u0000\u0000\u0000\u00b6\u00b7\u0001\u0000\u0000\u0000\u00b7"+ + "\u0013\u0001\u0000\u0000\u0000\u00b8\u00b6\u0001\u0000\u0000\u0000\u00b9"+ + "\u00ba\u0003\u0016\u000b\u0000\u00ba\u00c1\u0006\n\uffff\uffff\u0000\u00bb"+ + "\u00bc\u0005\u0005\u0000\u0000\u00bc\u00bd\u0003\u0016\u000b\u0000\u00bd"+ + "\u00be\u0006\n\uffff\uffff\u0000\u00be\u00c0\u0001\u0000\u0000\u0000\u00bf"+ + "\u00bb\u0001\u0000\u0000\u0000\u00c0\u00c3\u0001\u0000\u0000\u0000\u00c1"+ + "\u00bf\u0001\u0000\u0000\u0000\u00c1\u00c2\u0001\u0000\u0000\u0000\u00c2"+ + "\u0015\u0001\u0000\u0000\u0000\u00c3\u00c1\u0001\u0000\u0000\u0000\u00c4"+ + "\u00c5\u0007\u0000\u0000\u0000\u00c5\u00c6\u0003\u0016\u000b\u0000\u00c6"+ + "\u00c7\u0006\u000b\uffff\uffff\u0000\u00c7\u00cc\u0001\u0000\u0000\u0000"+ + "\u00c8\u00c9\u0003\u0018\f\u0000\u00c9\u00ca\u0006\u000b\uffff\uffff\u0000"+ + "\u00ca\u00cc\u0001\u0000\u0000\u0000\u00cb\u00c4\u0001\u0000\u0000\u0000"+ + "\u00cb\u00c8\u0001\u0000\u0000\u0000\u00cc\u0017\u0001\u0000\u0000\u0000"+ + "\u00cd\u00ce\u0005\u001b\u0000\u0000\u00ce\u00cf\u0003\u0010\b\u0000\u00cf"+ + "\u00d0\u0005\u001c\u0000\u0000\u00d0\u00d1\u0006\f\uffff\uffff\u0000\u00d1"+ + "\u00db\u0001\u0000\u0000\u0000\u00d2\u00d3\u0003(\u0014\u0000\u00d3\u00d4"+ + "\u0007\u0001\u0000\u0000\u00d4\u00d5\u0003\u001a\r\u0000\u00d5\u00d6\u0006"+ + "\f\uffff\uffff\u0000\u00d6\u00db\u0001\u0000\u0000\u0000\u00d7\u00d8\u0003"+ + "(\u0014\u0000\u00d8\u00d9\u0006\f\uffff\uffff\u0000\u00d9\u00db\u0001"+ + "\u0000\u0000\u0000\u00da\u00cd\u0001\u0000\u0000\u0000\u00da\u00d2\u0001"+ + "\u0000\u0000\u0000\u00da\u00d7\u0001\u0000\u0000\u0000\u00db\u0019\u0001"+ + "\u0000\u0000\u0000\u00dc\u00dd\u0005)\u0000\u0000\u00dd\u00ed\u0006\r"+ + "\uffff\uffff\u0000\u00de\u00df\u0005(\u0000\u0000\u00df\u00ed\u0006\r"+ + "\uffff\uffff\u0000\u00e0\u00e1\u0005*\u0000\u0000\u00e1\u00ed\u0006\r"+ + "\uffff\uffff\u0000\u00e2\u00e3\u0005&\u0000\u0000\u00e3\u00e4\u0005*\u0000"+ + "\u0000\u00e4\u00ed\u0006\r\uffff\uffff\u0000\u00e5\u00e6\u0005+\u0000"+ + "\u0000\u00e6\u00ed\u0006\r\uffff\uffff\u0000\u00e7\u00e8\u0005&\u0000"+ + "\u0000\u00e8\u00e9\u0005+\u0000\u0000\u00e9\u00ed\u0006\r\uffff\uffff"+ + "\u0000\u00ea\u00eb\u0005,\u0000\u0000\u00eb\u00ed\u0006\r\uffff\uffff"+ + "\u0000\u00ec\u00dc\u0001\u0000\u0000\u0000\u00ec\u00de\u0001\u0000\u0000"+ + "\u0000\u00ec\u00e0\u0001\u0000\u0000\u0000\u00ec\u00e2\u0001\u0000\u0000"+ + "\u0000\u00ec\u00e5\u0001\u0000\u0000\u0000\u00ec\u00e7\u0001\u0000\u0000"+ + "\u0000\u00ec\u00ea\u0001\u0000\u0000\u0000\u00ed\u001b\u0001\u0000\u0000"+ + "\u0000\u00ee\u00ef\u0005\u001f\u0000\u0000\u00ef\u00f0\u0003\u001e\u000f"+ + "\u0000\u00f0\u00f1\u0006\u000e\uffff\uffff\u0000\u00f1\u001d\u0001\u0000"+ + "\u0000\u0000\u00f2\u00f3\u0005)\u0000\u0000\u00f3\u0101\u0006\u000f\uffff"+ + "\uffff\u0000\u00f4\u00f5\u0005(\u0000\u0000\u00f5\u0101\u0006\u000f\uffff"+ + "\uffff\u0000\u00f6\u00f7\u0003 \u0010\u0000\u00f7\u00f8\u0006\u000f\uffff"+ + "\uffff\u0000\u00f8\u0101\u0001\u0000\u0000\u0000\u00f9\u00fa\u0005+\u0000"+ + "\u0000\u00fa\u0101\u0006\u000f\uffff\uffff\u0000\u00fb\u00fc\u0005,\u0000"+ + "\u0000\u00fc\u0101\u0006\u000f\uffff\uffff\u0000\u00fd\u00fe\u0005\u001d"+ + "\u0000\u0000\u00fe\u00ff\u0005\u001e\u0000\u0000\u00ff\u0101\u0006\u000f"+ + "\uffff\uffff\u0000\u0100\u00f2\u0001\u0000\u0000\u0000\u0100\u00f4\u0001"+ + "\u0000\u0000\u0000\u0100\u00f6\u0001\u0000\u0000\u0000\u0100\u00f9\u0001"+ + "\u0000\u0000\u0000\u0100\u00fb\u0001\u0000\u0000\u0000\u0100\u00fd\u0001"+ + "\u0000\u0000\u0000\u0101\u001f\u0001\u0000\u0000\u0000\u0102\u0104\u0005"+ + "&\u0000\u0000\u0103\u0102\u0001\u0000\u0000\u0000\u0103\u0104\u0001\u0000"+ + "\u0000\u0000\u0104\u0105\u0001\u0000\u0000\u0000\u0105\u0106\u0005*\u0000"+ + "\u0000\u0106!\u0001\u0000\u0000\u0000\u0107\u0108\u0005 \u0000\u0000\u0108"+ + "\u0109\u0005-\u0000\u0000\u0109\u010b\u0005\u001b\u0000\u0000\u010a\u010c"+ + "\u0003$\u0012\u0000\u010b\u010a\u0001\u0000\u0000\u0000\u010b\u010c\u0001"+ + "\u0000\u0000\u0000\u010c\u010d\u0001\u0000\u0000\u0000\u010d\u010e\u0005"+ + "\u001c\u0000\u0000\u010e\u010f\u0006\u0011\uffff\uffff\u0000\u010f#\u0001"+ + "\u0000\u0000\u0000\u0110\u0111\u0003&\u0013\u0000\u0111\u0118\u0006\u0012"+ + "\uffff\uffff\u0000\u0112\u0113\u0005!\u0000\u0000\u0113\u0114\u0003&\u0013"+ + "\u0000\u0114\u0115\u0006\u0012\uffff\uffff\u0000\u0115\u0117\u0001\u0000"+ + "\u0000\u0000\u0116\u0112\u0001\u0000\u0000\u0000\u0117\u011a\u0001\u0000"+ + "\u0000\u0000\u0118\u0116\u0001\u0000\u0000\u0000\u0118\u0119\u0001\u0000"+ + "\u0000\u0000\u0119%\u0001\u0000\u0000\u0000\u011a\u0118\u0001\u0000\u0000"+ + "\u0000\u011b\u011c\u0005*\u0000\u0000\u011c\u012a\u0006\u0013\uffff\uffff"+ + "\u0000\u011d\u011e\u0005&\u0000\u0000\u011e\u011f\u0005*\u0000\u0000\u011f"+ + "\u012a\u0006\u0013\uffff\uffff\u0000\u0120\u0121\u0005+\u0000\u0000\u0121"+ + "\u012a\u0006\u0013\uffff\uffff\u0000\u0122\u0123\u0005&\u0000\u0000\u0123"+ + "\u0124\u0005+\u0000\u0000\u0124\u012a\u0006\u0013\uffff\uffff\u0000\u0125"+ + "\u0126\u0005)\u0000\u0000\u0126\u012a\u0006\u0013\uffff\uffff\u0000\u0127"+ + "\u0128\u0005(\u0000\u0000\u0128\u012a\u0006\u0013\uffff\uffff\u0000\u0129"+ + "\u011b\u0001\u0000\u0000\u0000\u0129\u011d\u0001\u0000\u0000\u0000\u0129"+ + "\u0120\u0001\u0000\u0000\u0000\u0129\u0122\u0001\u0000\u0000\u0000\u0129"+ + "\u0125\u0001\u0000\u0000\u0000\u0129\u0127\u0001\u0000\u0000\u0000\u012a"+ + "\'\u0001\u0000\u0000\u0000\u012b\u012c\u0005\u0014\u0000\u0000\u012c\u012d"+ + "\u0005\u001a\u0000\u0000\u012d\u012e\u0003*\u0015\u0000\u012e\u0135\u0006"+ + "\u0014\uffff\uffff\u0000\u012f\u0130\u0005\u001a\u0000\u0000\u0130\u0131"+ + "\u0003*\u0015\u0000\u0131\u0132\u0006\u0014\uffff\uffff\u0000\u0132\u0134"+ + "\u0001\u0000\u0000\u0000\u0133\u012f\u0001\u0000\u0000\u0000\u0134\u0137"+ + "\u0001\u0000\u0000\u0000\u0135\u0133\u0001\u0000\u0000\u0000\u0135\u0136"+ + "\u0001\u0000\u0000\u0000\u0136\u0139\u0001\u0000\u0000\u0000\u0137\u0135"+ + "\u0001\u0000\u0000\u0000\u0138\u013a\u00032\u0019\u0000\u0139\u0138\u0001"+ + "\u0000\u0000\u0000\u0139\u013a\u0001\u0000\u0000\u0000\u013a\u013b\u0001"+ + "\u0000\u0000\u0000\u013b\u013c\u0006\u0014\uffff\uffff\u0000\u013c\u0187"+ + "\u0001\u0000\u0000\u0000\u013d\u013e\u0005\u0013\u0000\u0000\u013e\u0145"+ + "\u0006\u0014\uffff\uffff\u0000\u013f\u0140\u0005\u001a\u0000\u0000\u0140"+ + "\u0141\u0003*\u0015\u0000\u0141\u0142\u0006\u0014\uffff\uffff\u0000\u0142"+ + "\u0144\u0001\u0000\u0000\u0000\u0143\u013f\u0001\u0000\u0000\u0000\u0144"+ + "\u0147\u0001\u0000\u0000\u0000\u0145\u0143\u0001\u0000\u0000\u0000\u0145"+ + "\u0146\u0001\u0000\u0000\u0000\u0146\u0149\u0001\u0000\u0000\u0000\u0147"+ + "\u0145\u0001\u0000\u0000\u0000\u0148\u014a\u00032\u0019\u0000\u0149\u0148"+ + "\u0001\u0000\u0000\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014b"+ + "\u0001\u0000\u0000\u0000\u014b\u0187\u0006\u0014\uffff\uffff\u0000\u014c"+ + "\u014d\u0003*\u0015\u0000\u014d\u014f\u0006\u0014\uffff\uffff\u0000\u014e"+ + "\u0150\u00032\u0019\u0000\u014f\u014e\u0001\u0000\u0000\u0000\u014f\u0150"+ + "\u0001\u0000\u0000\u0000\u0150\u0151\u0001\u0000\u0000\u0000\u0151\u0152"+ + "\u0006\u0014\uffff\uffff\u0000\u0152\u0187\u0001\u0000\u0000\u0000\u0153"+ + "\u0154\u0003*\u0015\u0000\u0154\u0156\u0006\u0014\uffff\uffff\u0000\u0155"+ + "\u0157\u0005\u001a\u0000\u0000\u0156\u0155\u0001\u0000\u0000\u0000\u0156"+ + "\u0157\u0001\u0000\u0000\u0000\u0157\u0158\u0001\u0000\u0000\u0000\u0158"+ + "\u0159\u0003,\u0016\u0000\u0159\u015a\u0006\u0014\uffff\uffff\u0000\u015a"+ + "\u0187\u0001\u0000\u0000\u0000\u015b\u015c\u0003*\u0015\u0000\u015c\u0163"+ + "\u0006\u0014\uffff\uffff\u0000\u015d\u015e\u0005\u001a\u0000\u0000\u015e"+ + "\u015f\u0003*\u0015\u0000\u015f\u0160\u0006\u0014\uffff\uffff\u0000\u0160"+ + "\u0162\u0001\u0000\u0000\u0000\u0161\u015d\u0001\u0000\u0000\u0000\u0162"+ + "\u0165\u0001\u0000\u0000\u0000\u0163\u0161\u0001\u0000\u0000\u0000\u0163"+ + "\u0164\u0001\u0000\u0000\u0000\u0164\u0166\u0001\u0000\u0000\u0000\u0165"+ + "\u0163\u0001\u0000\u0000\u0000\u0166\u0167\u0005\u001a\u0000\u0000\u0167"+ + "\u0168\u0003*\u0015\u0000\u0168\u016a\u0006\u0014\uffff\uffff\u0000\u0169"+ + "\u016b\u00032\u0019\u0000\u016a\u0169\u0001\u0000\u0000\u0000\u016a\u016b"+ + "\u0001\u0000\u0000\u0000\u016b\u016c\u0001\u0000\u0000\u0000\u016c\u016d"+ + "\u0006\u0014\uffff\uffff\u0000\u016d\u0187\u0001\u0000\u0000\u0000\u016e"+ + "\u016f\u0003*\u0015\u0000\u016f\u0176\u0006\u0014\uffff\uffff\u0000\u0170"+ + "\u0171\u0005\u001a\u0000\u0000\u0171\u0172\u0003*\u0015\u0000\u0172\u0173"+ + "\u0006\u0014\uffff\uffff\u0000\u0173\u0175\u0001\u0000\u0000\u0000\u0174"+ + "\u0170\u0001\u0000\u0000\u0000\u0175\u0178\u0001\u0000\u0000\u0000\u0176"+ + "\u0174\u0001\u0000\u0000\u0000\u0176\u0177\u0001\u0000\u0000\u0000\u0177"+ + "\u0179\u0001\u0000\u0000\u0000\u0178\u0176\u0001\u0000\u0000\u0000\u0179"+ + "\u017a\u0005\u001a\u0000\u0000\u017a\u017b\u0003*\u0015\u0000\u017b\u017d"+ + "\u0006\u0014\uffff\uffff\u0000\u017c\u017e\u0005\u001a\u0000\u0000\u017d"+ + "\u017c\u0001\u0000\u0000\u0000\u017d\u017e\u0001\u0000\u0000\u0000\u017e"+ + "\u017f\u0001\u0000\u0000\u0000\u017f\u0180\u0003,\u0016\u0000\u0180\u0182"+ + "\u0006\u0014\uffff\uffff\u0000\u0181\u0183\u00032\u0019\u0000\u0182\u0181"+ + "\u0001\u0000\u0000\u0000\u0182\u0183\u0001\u0000\u0000\u0000\u0183\u0184"+ + "\u0001\u0000\u0000\u0000\u0184\u0185\u0006\u0014\uffff\uffff\u0000\u0185"+ + "\u0187\u0001\u0000\u0000\u0000\u0186\u012b\u0001\u0000\u0000\u0000\u0186"+ + "\u013d\u0001\u0000\u0000\u0000\u0186\u014c\u0001\u0000\u0000\u0000\u0186"+ + "\u0153\u0001\u0000\u0000\u0000\u0186\u015b\u0001\u0000\u0000\u0000\u0186"+ + "\u016e\u0001\u0000\u0000\u0000\u0187)\u0001\u0000\u0000\u0000\u0188\u0189"+ + "\u0005-\u0000\u0000\u0189\u018b\u0005\u001b\u0000\u0000\u018a\u018c\u0003"+ + "$\u0012\u0000\u018b\u018a\u0001\u0000\u0000\u0000\u018b\u018c\u0001\u0000"+ + "\u0000\u0000\u018c\u018d\u0001\u0000\u0000\u0000\u018d\u018e\u0005\u001c"+ + "\u0000\u0000\u018e\u018f\u0001\u0000\u0000\u0000\u018f\u0193\u0006\u0015"+ + "\uffff\uffff\u0000\u0190\u0191\u0005-\u0000\u0000\u0191\u0193\u0006\u0015"+ + "\uffff\uffff\u0000\u0192\u0188\u0001\u0000\u0000\u0000\u0192\u0190\u0001"+ + "\u0000\u0000\u0000\u0193+\u0001\u0000\u0000\u0000\u0194\u0195\u0005\u0018"+ + "\u0000\u0000\u0195\u0196\u0003.\u0017\u0000\u0196\u0197\u0006\u0016\uffff"+ + "\uffff\u0000\u0197\u0198\u0005\u0019\u0000\u0000\u0198-\u0001\u0000\u0000"+ + "\u0000\u0199\u019a\u00030\u0018\u0000\u019a\u01a1\u0006\u0017\uffff\uffff"+ + "\u0000\u019b\u019c\u0005%\u0000\u0000\u019c\u019d\u00030\u0018\u0000\u019d"+ + "\u019e\u0006\u0017\uffff\uffff\u0000\u019e\u01a0\u0001\u0000\u0000\u0000"+ + "\u019f\u019b\u0001\u0000\u0000\u0000\u01a0\u01a3\u0001\u0000\u0000\u0000"+ + "\u01a1\u019f\u0001\u0000\u0000\u0000\u01a1\u01a2\u0001\u0000\u0000\u0000"+ + "\u01a2/\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000\u01a4"+ + "\u01a7\u0005-\u0000\u0000\u01a5\u01a6\u0005\u001a\u0000\u0000\u01a6\u01a8"+ + "\u0005-\u0000\u0000\u01a7\u01a5\u0001\u0000\u0000\u0000\u01a8\u01a9\u0001"+ + "\u0000\u0000\u0000\u01a9\u01a7\u0001\u0000\u0000\u0000\u01a9\u01aa\u0001"+ + "\u0000\u0000\u0000\u01aa\u01ab\u0001\u0000\u0000\u0000\u01ab\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01ac\u01ad\u0005-\u0000\u0000\u01ad\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01ae\u01af\u0005(\u0000\u0000\u01af\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01b0\u01b1\u0005)\u0000\u0000\u01b1\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01b2\u01b3\u0005*\u0000\u0000\u01b3\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01b4\u01b5\u0005+\u0000\u0000\u01b5\u01b7\u0006"+ + "\u0018\uffff\uffff\u0000\u01b6\u01a4\u0001\u0000\u0000\u0000\u01b6\u01ac"+ + "\u0001\u0000\u0000\u0000\u01b6\u01ae\u0001\u0000\u0000\u0000\u01b6\u01b0"+ + "\u0001\u0000\u0000\u0000\u01b6\u01b2\u0001\u0000\u0000\u0000\u01b6\u01b4"+ + "\u0001\u0000\u0000\u0000\u01b71\u0001\u0000\u0000\u0000\u01b8\u01b9\u0003"+ + "6\u001b\u0000\u01b9\u01ba\u00034\u001a\u0000\u01ba\u01bb\u0006\u0019\uffff"+ + "\uffff\u0000\u01bb3\u0001\u0000\u0000\u0000\u01bc\u01c0\u0001\u0000\u0000"+ + "\u0000\u01bd\u01c0\u0005*\u0000\u0000\u01be\u01c0\u0005+\u0000\u0000\u01bf"+ + "\u01bc\u0001\u0000\u0000\u0000\u01bf\u01bd\u0001\u0000\u0000\u0000\u01bf"+ + "\u01be\u0001\u0000\u0000\u0000\u01c05\u0001\u0000\u0000\u0000\u01c1\u01c2"+ + "\u0007\u0002\u0000\u0000\u01c27\u0001\u0000\u0000\u0000(9>() {}, "{{ 1 }}", STRING, null ).render( null ).get() ) + .isEqualTo( "1" ); + assertThat( getTemplate( testMethodName, new TypeRef>() {}, "{{ 1.2 }}", STRING, null ).render( null ).get() ) + .isEqualTo( "1.2" ); + assertThat( getTemplate( testMethodName, new TypeRef>() {}, "{{ -1.2 }}", STRING, null ).render( null ).get() ) + .isEqualTo( "-1.2" ); + assertThat( getTemplate( testMethodName, new TypeRef>() {}, "{{ 'a' }}", STRING, null ).render( null ).get() ) + .isEqualTo( "a" ); + } + @Test public void testWithoutDefaultValue() { TestTemplateClass c = new TestTemplateClass();