diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index d045ab0..6c1026a 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -180,6 +180,11 @@ conformanceDecl conformanceItem : PRIVATE attachmentDecl | operationBindingDecl + | relationshipMaterializationDecl + ; + +relationshipMaterializationDecl + : MATERIALIZE identifier IF ABSENT USING CONSTRUCTOR identifier VIA EDGE identifier DOT identifier SEMI ; operationBindingDecl @@ -230,8 +235,8 @@ dependencyBindingBlock ; dependencyBinding - : identifier TO STATE identifier SEMI - | identifier TO EDGE identifier DOT identifier SEMI + : identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI + | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO INTERFACE identifier SEMI | identifier TO CONSTRUCTOR identifier SEMI ; @@ -322,6 +327,11 @@ STATE: 'state'; EDGE: 'edge'; PROJECTION: 'projection'; WITH: 'with'; +USING: 'using'; +VIA: 'via'; +MATERIALIZE: 'materialize'; +IF: 'if'; +ABSENT: 'absent'; ON: 'on'; POLICY: 'policy'; DEFAULT: 'default'; diff --git a/proto/quixos/orch.proto b/proto/quixos/orch.proto index 6fbbce4..522332a 100644 --- a/proto/quixos/orch.proto +++ b/proto/quixos/orch.proto @@ -11,6 +11,7 @@ service OrchestratorRuntime { rpc InvokeCapability(InvokeCapabilityRequest) returns (InvokeCapabilityResponse); rpc WatchCapability(WatchCapabilityRequest) returns (stream WatchCapabilityEvent); rpc ConstructObject(ConstructObjectRequest) returns (ConstructObjectResponse); + rpc ResolveOrConstructRelatedObject(ResolveOrConstructRelatedObjectRequest) returns (ResolveOrConstructRelatedObjectResponse); rpc GetWorkspace(GetWorkspaceRequest) returns (GetWorkspaceResponse); rpc ListPackageDescriptors(ListPackageDescriptorsRequest) returns (ListPackageDescriptorsResponse); rpc ListPackageRuntimes(ListPackageRuntimesRequest) returns (ListPackageRuntimesResponse); @@ -24,6 +25,16 @@ message ConstructObjectRequest { } message ConstructObjectResponse { camino.CaminoObject object = 1; } +message ResolveOrConstructRelatedObjectRequest { + string object_id = 1; + string interface_revision_id = 2; + string member_id = 3; +} +message ResolveOrConstructRelatedObjectResponse { + camino.CaminoObject object = 1; + bool constructed = 2; +} + message InvokeCapabilityRequest { quixos.CapabilityRef capability = 1; string object_id = 2; diff --git a/proto/quixos/refs.proto b/proto/quixos/refs.proto index 08a9da6..929c450 100644 --- a/proto/quixos/refs.proto +++ b/proto/quixos/refs.proto @@ -20,6 +20,9 @@ message InjectedDependency { string receiver_interface_revision_id = 4; string constructor_atom_id = 5; } + // Defaults to the invocation receiver. A checked dependency traversal can + // select a related object explicitly before the package runtime starts. + string object_id = 6; } message EdgeDependency { diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 8a25b05..3e3c730 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -21,6 +21,11 @@ null 'edge' 'projection' 'with' +'using' +'via' +'materialize' +'if' +'absent' 'on' 'policy' 'default' @@ -119,6 +124,11 @@ STATE EDGE PROJECTION WITH +USING +VIA +MATERIALIZE +IF +ABSENT ON POLICY DEFAULT @@ -229,6 +239,7 @@ edgeDecl edgeEndpoint conformanceDecl conformanceItem +relationshipMaterializationDecl operationBindingDecl memberOperationRef operationName @@ -250,4 +261,4 @@ stringLiteral atn: -[4, 1, 95, 668, 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, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 118, 8, 1, 10, 1, 12, 1, 121, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 131, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 139, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 152, 8, 4, 10, 4, 12, 4, 155, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 172, 8, 6, 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, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 197, 8, 8, 10, 8, 12, 8, 200, 9, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 223, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 233, 8, 10, 1, 10, 1, 10, 5, 10, 237, 8, 10, 10, 10, 12, 10, 240, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 268, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 274, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 285, 8, 13, 10, 13, 12, 13, 288, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 295, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 308, 8, 15, 1, 15, 1, 15, 1, 15, 3, 15, 313, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 326, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 339, 8, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 354, 8, 20, 1, 20, 3, 20, 357, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 362, 8, 21, 10, 21, 12, 21, 365, 9, 21, 1, 22, 1, 22, 1, 22, 5, 22, 370, 8, 22, 10, 22, 12, 22, 373, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 412, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 418, 8, 24, 10, 24, 12, 24, 421, 9, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 3, 27, 432, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 446, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 456, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 474, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 484, 8, 32, 10, 32, 12, 32, 487, 9, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 494, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 517, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 536, 8, 37, 3, 37, 538, 8, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 5, 40, 547, 8, 40, 10, 40, 12, 40, 550, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 580, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 589, 8, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 618, 8, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 632, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 638, 8, 47, 10, 47, 12, 47, 641, 9, 47, 3, 47, 643, 8, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 5, 49, 655, 8, 49, 10, 49, 12, 49, 658, 9, 49, 3, 49, 660, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 0, 0, 52, 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, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 0, 7, 1, 0, 46, 50, 2, 0, 41, 45, 47, 48, 2, 0, 41, 42, 47, 48, 2, 0, 43, 45, 47, 48, 1, 0, 65, 72, 1, 0, 53, 56, 2, 0, 25, 25, 91, 91, 692, 0, 104, 1, 0, 0, 0, 2, 107, 1, 0, 0, 0, 4, 130, 1, 0, 0, 0, 6, 132, 1, 0, 0, 0, 8, 142, 1, 0, 0, 0, 10, 158, 1, 0, 0, 0, 12, 171, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 188, 1, 0, 0, 0, 18, 222, 1, 0, 0, 0, 20, 224, 1, 0, 0, 0, 22, 267, 1, 0, 0, 0, 24, 273, 1, 0, 0, 0, 26, 275, 1, 0, 0, 0, 28, 294, 1, 0, 0, 0, 30, 296, 1, 0, 0, 0, 32, 316, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 345, 1, 0, 0, 0, 40, 356, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 366, 1, 0, 0, 0, 46, 411, 1, 0, 0, 0, 48, 413, 1, 0, 0, 0, 50, 424, 1, 0, 0, 0, 52, 426, 1, 0, 0, 0, 54, 431, 1, 0, 0, 0, 56, 433, 1, 0, 0, 0, 58, 455, 1, 0, 0, 0, 60, 457, 1, 0, 0, 0, 62, 466, 1, 0, 0, 0, 64, 477, 1, 0, 0, 0, 66, 493, 1, 0, 0, 0, 68, 495, 1, 0, 0, 0, 70, 501, 1, 0, 0, 0, 72, 516, 1, 0, 0, 0, 74, 537, 1, 0, 0, 0, 76, 539, 1, 0, 0, 0, 78, 541, 1, 0, 0, 0, 80, 543, 1, 0, 0, 0, 82, 579, 1, 0, 0, 0, 84, 581, 1, 0, 0, 0, 86, 617, 1, 0, 0, 0, 88, 619, 1, 0, 0, 0, 90, 621, 1, 0, 0, 0, 92, 631, 1, 0, 0, 0, 94, 633, 1, 0, 0, 0, 96, 646, 1, 0, 0, 0, 98, 650, 1, 0, 0, 0, 100, 663, 1, 0, 0, 0, 102, 665, 1, 0, 0, 0, 104, 105, 3, 2, 1, 0, 105, 106, 5, 0, 0, 1, 106, 1, 1, 0, 0, 0, 107, 108, 5, 1, 0, 0, 108, 109, 3, 100, 50, 0, 109, 110, 5, 29, 0, 0, 110, 111, 3, 102, 51, 0, 111, 112, 5, 28, 0, 0, 112, 113, 3, 102, 51, 0, 113, 114, 5, 27, 0, 0, 114, 115, 3, 102, 51, 0, 115, 119, 5, 81, 0, 0, 116, 118, 3, 4, 2, 0, 117, 116, 1, 0, 0, 0, 118, 121, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 119, 120, 1, 0, 0, 0, 120, 122, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 122, 123, 5, 82, 0, 0, 123, 3, 1, 0, 0, 0, 124, 131, 3, 6, 3, 0, 125, 131, 3, 8, 4, 0, 126, 131, 3, 26, 13, 0, 127, 131, 3, 52, 26, 0, 128, 131, 3, 64, 32, 0, 129, 131, 3, 84, 42, 0, 130, 124, 1, 0, 0, 0, 130, 125, 1, 0, 0, 0, 130, 126, 1, 0, 0, 0, 130, 127, 1, 0, 0, 0, 130, 128, 1, 0, 0, 0, 130, 129, 1, 0, 0, 0, 131, 5, 1, 0, 0, 0, 132, 133, 5, 2, 0, 0, 133, 134, 3, 100, 50, 0, 134, 135, 5, 29, 0, 0, 135, 138, 3, 102, 51, 0, 136, 137, 5, 30, 0, 0, 137, 139, 3, 102, 51, 0, 138, 136, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 141, 5, 78, 0, 0, 141, 7, 1, 0, 0, 0, 142, 143, 5, 3, 0, 0, 143, 144, 3, 100, 50, 0, 144, 145, 5, 29, 0, 0, 145, 146, 3, 102, 51, 0, 146, 147, 5, 28, 0, 0, 147, 148, 3, 102, 51, 0, 148, 149, 3, 10, 5, 0, 149, 153, 5, 81, 0, 0, 150, 152, 3, 12, 6, 0, 151, 150, 1, 0, 0, 0, 152, 155, 1, 0, 0, 0, 153, 151, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 156, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 156, 157, 5, 82, 0, 0, 157, 9, 1, 0, 0, 0, 158, 159, 5, 25, 0, 0, 159, 160, 5, 81, 0, 0, 160, 161, 5, 26, 0, 0, 161, 162, 3, 102, 51, 0, 162, 163, 5, 78, 0, 0, 163, 164, 5, 27, 0, 0, 164, 165, 3, 102, 51, 0, 165, 166, 5, 78, 0, 0, 166, 167, 5, 82, 0, 0, 167, 11, 1, 0, 0, 0, 168, 172, 3, 16, 8, 0, 169, 172, 3, 20, 10, 0, 170, 172, 3, 14, 7, 0, 171, 168, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 171, 170, 1, 0, 0, 0, 172, 13, 1, 0, 0, 0, 173, 174, 5, 8, 0, 0, 174, 175, 3, 100, 50, 0, 175, 176, 5, 29, 0, 0, 176, 177, 3, 102, 51, 0, 177, 178, 5, 77, 0, 0, 178, 179, 3, 86, 43, 0, 179, 180, 5, 76, 0, 0, 180, 181, 3, 86, 43, 0, 181, 182, 5, 81, 0, 0, 182, 183, 5, 46, 0, 0, 183, 184, 5, 29, 0, 0, 184, 185, 3, 102, 51, 0, 185, 186, 5, 78, 0, 0, 186, 187, 5, 82, 0, 0, 187, 15, 1, 0, 0, 0, 188, 189, 5, 6, 0, 0, 189, 190, 3, 100, 50, 0, 190, 191, 5, 29, 0, 0, 191, 192, 3, 102, 51, 0, 192, 193, 5, 77, 0, 0, 193, 194, 3, 86, 43, 0, 194, 198, 5, 81, 0, 0, 195, 197, 3, 18, 9, 0, 196, 195, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 201, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 202, 5, 82, 0, 0, 202, 17, 1, 0, 0, 0, 203, 204, 5, 36, 0, 0, 204, 205, 5, 29, 0, 0, 205, 206, 3, 102, 51, 0, 206, 207, 5, 78, 0, 0, 207, 223, 1, 0, 0, 0, 208, 209, 5, 37, 0, 0, 209, 210, 5, 29, 0, 0, 210, 211, 3, 102, 51, 0, 211, 212, 5, 78, 0, 0, 212, 223, 1, 0, 0, 0, 213, 214, 5, 38, 0, 0, 214, 215, 5, 39, 0, 0, 215, 216, 5, 29, 0, 0, 216, 217, 3, 102, 51, 0, 217, 218, 5, 40, 0, 0, 218, 219, 5, 29, 0, 0, 219, 220, 3, 102, 51, 0, 220, 221, 5, 78, 0, 0, 221, 223, 1, 0, 0, 0, 222, 203, 1, 0, 0, 0, 222, 208, 1, 0, 0, 0, 222, 213, 1, 0, 0, 0, 223, 19, 1, 0, 0, 0, 224, 225, 5, 7, 0, 0, 225, 226, 3, 100, 50, 0, 226, 227, 5, 29, 0, 0, 227, 228, 3, 102, 51, 0, 228, 229, 5, 77, 0, 0, 229, 230, 3, 90, 45, 0, 230, 232, 3, 24, 12, 0, 231, 233, 5, 57, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 238, 5, 81, 0, 0, 235, 237, 3, 22, 11, 0, 236, 235, 1, 0, 0, 0, 237, 240, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 241, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 241, 242, 5, 82, 0, 0, 242, 21, 1, 0, 0, 0, 243, 244, 5, 43, 0, 0, 244, 245, 5, 29, 0, 0, 245, 246, 3, 102, 51, 0, 246, 247, 5, 78, 0, 0, 247, 268, 1, 0, 0, 0, 248, 249, 5, 44, 0, 0, 249, 250, 5, 29, 0, 0, 250, 251, 3, 102, 51, 0, 251, 252, 5, 78, 0, 0, 252, 268, 1, 0, 0, 0, 253, 254, 5, 45, 0, 0, 254, 255, 5, 29, 0, 0, 255, 256, 3, 102, 51, 0, 256, 257, 5, 78, 0, 0, 257, 268, 1, 0, 0, 0, 258, 259, 5, 38, 0, 0, 259, 260, 5, 39, 0, 0, 260, 261, 5, 29, 0, 0, 261, 262, 3, 102, 51, 0, 262, 263, 5, 40, 0, 0, 263, 264, 5, 29, 0, 0, 264, 265, 3, 102, 51, 0, 265, 266, 5, 78, 0, 0, 266, 268, 1, 0, 0, 0, 267, 243, 1, 0, 0, 0, 267, 248, 1, 0, 0, 0, 267, 253, 1, 0, 0, 0, 267, 258, 1, 0, 0, 0, 268, 23, 1, 0, 0, 0, 269, 270, 5, 2, 0, 0, 270, 274, 3, 100, 50, 0, 271, 272, 5, 3, 0, 0, 272, 274, 3, 100, 50, 0, 273, 269, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 25, 1, 0, 0, 0, 275, 276, 5, 5, 0, 0, 276, 277, 3, 100, 50, 0, 277, 278, 5, 29, 0, 0, 278, 279, 3, 102, 51, 0, 279, 280, 5, 28, 0, 0, 280, 281, 3, 102, 51, 0, 281, 282, 3, 10, 5, 0, 282, 286, 5, 81, 0, 0, 283, 285, 3, 28, 14, 0, 284, 283, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 289, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 289, 290, 5, 82, 0, 0, 290, 27, 1, 0, 0, 0, 291, 295, 3, 30, 15, 0, 292, 295, 3, 32, 16, 0, 293, 295, 3, 34, 17, 0, 294, 291, 1, 0, 0, 0, 294, 292, 1, 0, 0, 0, 294, 293, 1, 0, 0, 0, 295, 29, 1, 0, 0, 0, 296, 297, 5, 8, 0, 0, 297, 298, 3, 100, 50, 0, 298, 299, 5, 29, 0, 0, 299, 300, 3, 102, 51, 0, 300, 301, 5, 77, 0, 0, 301, 302, 3, 86, 43, 0, 302, 303, 5, 76, 0, 0, 303, 304, 3, 86, 43, 0, 304, 305, 5, 31, 0, 0, 305, 307, 3, 38, 19, 0, 306, 308, 3, 36, 18, 0, 307, 306, 1, 0, 0, 0, 307, 308, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 310, 5, 33, 0, 0, 310, 312, 3, 40, 20, 0, 311, 313, 3, 44, 22, 0, 312, 311, 1, 0, 0, 0, 312, 313, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 315, 5, 78, 0, 0, 315, 31, 1, 0, 0, 0, 316, 317, 5, 9, 0, 0, 317, 318, 3, 100, 50, 0, 318, 319, 5, 29, 0, 0, 319, 320, 3, 102, 51, 0, 320, 321, 5, 77, 0, 0, 321, 322, 3, 86, 43, 0, 322, 323, 5, 76, 0, 0, 323, 325, 3, 86, 43, 0, 324, 326, 3, 44, 22, 0, 325, 324, 1, 0, 0, 0, 325, 326, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 328, 5, 78, 0, 0, 328, 33, 1, 0, 0, 0, 329, 330, 5, 10, 0, 0, 330, 331, 3, 100, 50, 0, 331, 332, 5, 29, 0, 0, 332, 333, 3, 102, 51, 0, 333, 334, 5, 11, 0, 0, 334, 335, 3, 100, 50, 0, 335, 336, 5, 77, 0, 0, 336, 338, 3, 86, 43, 0, 337, 339, 3, 44, 22, 0, 338, 337, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 341, 5, 78, 0, 0, 341, 35, 1, 0, 0, 0, 342, 343, 5, 32, 0, 0, 343, 344, 3, 86, 43, 0, 344, 37, 1, 0, 0, 0, 345, 346, 7, 0, 0, 0, 346, 39, 1, 0, 0, 0, 347, 357, 5, 35, 0, 0, 348, 349, 5, 2, 0, 0, 349, 357, 3, 100, 50, 0, 350, 351, 5, 4, 0, 0, 351, 353, 5, 83, 0, 0, 352, 354, 3, 42, 21, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 357, 5, 84, 0, 0, 356, 347, 1, 0, 0, 0, 356, 348, 1, 0, 0, 0, 356, 350, 1, 0, 0, 0, 357, 41, 1, 0, 0, 0, 358, 363, 3, 100, 50, 0, 359, 360, 5, 79, 0, 0, 360, 362, 3, 100, 50, 0, 361, 359, 1, 0, 0, 0, 362, 365, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 363, 364, 1, 0, 0, 0, 364, 43, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 366, 367, 5, 34, 0, 0, 367, 371, 5, 81, 0, 0, 368, 370, 3, 46, 23, 0, 369, 368, 1, 0, 0, 0, 370, 373, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 374, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 374, 375, 5, 82, 0, 0, 375, 45, 1, 0, 0, 0, 376, 377, 5, 18, 0, 0, 377, 378, 3, 100, 50, 0, 378, 379, 5, 29, 0, 0, 379, 380, 3, 102, 51, 0, 380, 381, 5, 77, 0, 0, 381, 382, 3, 86, 43, 0, 382, 383, 3, 48, 24, 0, 383, 384, 5, 78, 0, 0, 384, 412, 1, 0, 0, 0, 385, 386, 5, 19, 0, 0, 386, 387, 3, 100, 50, 0, 387, 388, 5, 29, 0, 0, 388, 389, 3, 102, 51, 0, 389, 390, 5, 77, 0, 0, 390, 391, 3, 90, 45, 0, 391, 392, 3, 24, 12, 0, 392, 393, 3, 48, 24, 0, 393, 394, 5, 78, 0, 0, 394, 412, 1, 0, 0, 0, 395, 396, 5, 3, 0, 0, 396, 397, 3, 100, 50, 0, 397, 398, 5, 29, 0, 0, 398, 399, 3, 102, 51, 0, 399, 400, 5, 77, 0, 0, 400, 401, 3, 100, 50, 0, 401, 402, 5, 78, 0, 0, 402, 412, 1, 0, 0, 0, 403, 404, 5, 10, 0, 0, 404, 405, 3, 100, 50, 0, 405, 406, 5, 29, 0, 0, 406, 407, 3, 102, 51, 0, 407, 408, 5, 77, 0, 0, 408, 409, 3, 100, 50, 0, 409, 410, 5, 78, 0, 0, 410, 412, 1, 0, 0, 0, 411, 376, 1, 0, 0, 0, 411, 385, 1, 0, 0, 0, 411, 395, 1, 0, 0, 0, 411, 403, 1, 0, 0, 0, 412, 47, 1, 0, 0, 0, 413, 414, 5, 83, 0, 0, 414, 419, 3, 50, 25, 0, 415, 416, 5, 79, 0, 0, 416, 418, 3, 50, 25, 0, 417, 415, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 84, 0, 0, 423, 49, 1, 0, 0, 0, 424, 425, 7, 1, 0, 0, 425, 51, 1, 0, 0, 0, 426, 427, 5, 17, 0, 0, 427, 428, 3, 54, 27, 0, 428, 53, 1, 0, 0, 0, 429, 432, 3, 56, 28, 0, 430, 432, 3, 60, 30, 0, 431, 429, 1, 0, 0, 0, 431, 430, 1, 0, 0, 0, 432, 55, 1, 0, 0, 0, 433, 434, 5, 18, 0, 0, 434, 435, 3, 100, 50, 0, 435, 436, 5, 29, 0, 0, 436, 437, 3, 102, 51, 0, 437, 438, 5, 22, 0, 0, 438, 439, 3, 100, 50, 0, 439, 440, 5, 77, 0, 0, 440, 441, 3, 86, 43, 0, 441, 442, 5, 23, 0, 0, 442, 445, 3, 58, 29, 0, 443, 444, 5, 24, 0, 0, 444, 446, 3, 92, 46, 0, 445, 443, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 5, 78, 0, 0, 448, 57, 1, 0, 0, 0, 449, 456, 5, 51, 0, 0, 450, 451, 5, 52, 0, 0, 451, 452, 5, 85, 0, 0, 452, 453, 3, 86, 43, 0, 453, 454, 5, 86, 0, 0, 454, 456, 1, 0, 0, 0, 455, 449, 1, 0, 0, 0, 455, 450, 1, 0, 0, 0, 456, 59, 1, 0, 0, 0, 457, 458, 5, 19, 0, 0, 458, 459, 3, 100, 50, 0, 459, 460, 5, 29, 0, 0, 460, 461, 3, 102, 51, 0, 461, 462, 5, 81, 0, 0, 462, 463, 3, 62, 31, 0, 463, 464, 3, 62, 31, 0, 464, 465, 5, 82, 0, 0, 465, 61, 1, 0, 0, 0, 466, 467, 3, 24, 12, 0, 467, 468, 5, 20, 0, 0, 468, 469, 3, 100, 50, 0, 469, 470, 5, 29, 0, 0, 470, 471, 3, 102, 51, 0, 471, 473, 3, 90, 45, 0, 472, 474, 5, 57, 0, 0, 473, 472, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 5, 78, 0, 0, 476, 63, 1, 0, 0, 0, 477, 478, 5, 12, 0, 0, 478, 479, 3, 100, 50, 0, 479, 480, 5, 13, 0, 0, 480, 481, 3, 100, 50, 0, 481, 485, 5, 81, 0, 0, 482, 484, 3, 66, 33, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 82, 0, 0, 489, 65, 1, 0, 0, 0, 490, 491, 5, 16, 0, 0, 491, 494, 3, 54, 27, 0, 492, 494, 3, 68, 34, 0, 493, 490, 1, 0, 0, 0, 493, 492, 1, 0, 0, 0, 494, 67, 1, 0, 0, 0, 495, 496, 5, 14, 0, 0, 496, 497, 3, 70, 35, 0, 497, 498, 5, 15, 0, 0, 498, 499, 3, 74, 37, 0, 499, 500, 5, 78, 0, 0, 500, 69, 1, 0, 0, 0, 501, 502, 3, 100, 50, 0, 502, 503, 5, 80, 0, 0, 503, 504, 3, 72, 36, 0, 504, 71, 1, 0, 0, 0, 505, 517, 3, 100, 50, 0, 506, 517, 5, 46, 0, 0, 507, 517, 5, 36, 0, 0, 508, 517, 5, 37, 0, 0, 509, 517, 5, 43, 0, 0, 510, 517, 5, 44, 0, 0, 511, 517, 5, 45, 0, 0, 512, 517, 5, 47, 0, 0, 513, 517, 5, 48, 0, 0, 514, 517, 5, 49, 0, 0, 515, 517, 5, 50, 0, 0, 516, 505, 1, 0, 0, 0, 516, 506, 1, 0, 0, 0, 516, 507, 1, 0, 0, 0, 516, 508, 1, 0, 0, 0, 516, 509, 1, 0, 0, 0, 516, 510, 1, 0, 0, 0, 516, 511, 1, 0, 0, 0, 516, 512, 1, 0, 0, 0, 516, 513, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 516, 515, 1, 0, 0, 0, 517, 73, 1, 0, 0, 0, 518, 519, 5, 18, 0, 0, 519, 520, 3, 100, 50, 0, 520, 521, 5, 80, 0, 0, 521, 522, 3, 76, 38, 0, 522, 538, 1, 0, 0, 0, 523, 524, 5, 19, 0, 0, 524, 525, 3, 100, 50, 0, 525, 526, 5, 80, 0, 0, 526, 527, 3, 100, 50, 0, 527, 528, 5, 80, 0, 0, 528, 529, 3, 78, 39, 0, 529, 538, 1, 0, 0, 0, 530, 531, 5, 5, 0, 0, 531, 532, 3, 100, 50, 0, 532, 533, 5, 80, 0, 0, 533, 535, 3, 100, 50, 0, 534, 536, 3, 80, 40, 0, 535, 534, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 538, 1, 0, 0, 0, 537, 518, 1, 0, 0, 0, 537, 523, 1, 0, 0, 0, 537, 530, 1, 0, 0, 0, 538, 75, 1, 0, 0, 0, 539, 540, 7, 2, 0, 0, 540, 77, 1, 0, 0, 0, 541, 542, 7, 3, 0, 0, 542, 79, 1, 0, 0, 0, 543, 544, 5, 21, 0, 0, 544, 548, 5, 81, 0, 0, 545, 547, 3, 82, 41, 0, 546, 545, 1, 0, 0, 0, 547, 550, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 548, 549, 1, 0, 0, 0, 549, 551, 1, 0, 0, 0, 550, 548, 1, 0, 0, 0, 551, 552, 5, 82, 0, 0, 552, 81, 1, 0, 0, 0, 553, 554, 3, 100, 50, 0, 554, 555, 5, 15, 0, 0, 555, 556, 5, 18, 0, 0, 556, 557, 3, 100, 50, 0, 557, 558, 5, 78, 0, 0, 558, 580, 1, 0, 0, 0, 559, 560, 3, 100, 50, 0, 560, 561, 5, 15, 0, 0, 561, 562, 5, 19, 0, 0, 562, 563, 3, 100, 50, 0, 563, 564, 5, 80, 0, 0, 564, 565, 3, 100, 50, 0, 565, 566, 5, 78, 0, 0, 566, 580, 1, 0, 0, 0, 567, 568, 3, 100, 50, 0, 568, 569, 5, 15, 0, 0, 569, 570, 5, 3, 0, 0, 570, 571, 3, 100, 50, 0, 571, 572, 5, 78, 0, 0, 572, 580, 1, 0, 0, 0, 573, 574, 3, 100, 50, 0, 574, 575, 5, 15, 0, 0, 575, 576, 5, 10, 0, 0, 576, 577, 3, 100, 50, 0, 577, 578, 5, 78, 0, 0, 578, 580, 1, 0, 0, 0, 579, 553, 1, 0, 0, 0, 579, 559, 1, 0, 0, 0, 579, 567, 1, 0, 0, 0, 579, 573, 1, 0, 0, 0, 580, 83, 1, 0, 0, 0, 581, 582, 5, 10, 0, 0, 582, 583, 3, 100, 50, 0, 583, 584, 5, 15, 0, 0, 584, 585, 3, 100, 50, 0, 585, 586, 5, 80, 0, 0, 586, 588, 3, 100, 50, 0, 587, 589, 3, 80, 40, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 5, 78, 0, 0, 591, 85, 1, 0, 0, 0, 592, 618, 3, 88, 44, 0, 593, 618, 5, 58, 0, 0, 594, 618, 5, 59, 0, 0, 595, 596, 5, 60, 0, 0, 596, 618, 3, 102, 51, 0, 597, 598, 5, 61, 0, 0, 598, 599, 5, 87, 0, 0, 599, 600, 3, 100, 50, 0, 600, 601, 5, 88, 0, 0, 601, 618, 1, 0, 0, 0, 602, 603, 5, 62, 0, 0, 603, 604, 5, 87, 0, 0, 604, 605, 3, 100, 50, 0, 605, 606, 5, 88, 0, 0, 606, 618, 1, 0, 0, 0, 607, 608, 5, 63, 0, 0, 608, 609, 5, 87, 0, 0, 609, 610, 3, 86, 43, 0, 610, 611, 5, 88, 0, 0, 611, 618, 1, 0, 0, 0, 612, 613, 5, 64, 0, 0, 613, 614, 5, 87, 0, 0, 614, 615, 3, 86, 43, 0, 615, 616, 5, 88, 0, 0, 616, 618, 1, 0, 0, 0, 617, 592, 1, 0, 0, 0, 617, 593, 1, 0, 0, 0, 617, 594, 1, 0, 0, 0, 617, 595, 1, 0, 0, 0, 617, 597, 1, 0, 0, 0, 617, 602, 1, 0, 0, 0, 617, 607, 1, 0, 0, 0, 617, 612, 1, 0, 0, 0, 618, 87, 1, 0, 0, 0, 619, 620, 7, 4, 0, 0, 620, 89, 1, 0, 0, 0, 621, 622, 7, 5, 0, 0, 622, 91, 1, 0, 0, 0, 623, 632, 3, 102, 51, 0, 624, 632, 5, 89, 0, 0, 625, 632, 5, 90, 0, 0, 626, 632, 5, 73, 0, 0, 627, 632, 5, 74, 0, 0, 628, 632, 5, 75, 0, 0, 629, 632, 3, 94, 47, 0, 630, 632, 3, 98, 49, 0, 631, 623, 1, 0, 0, 0, 631, 624, 1, 0, 0, 0, 631, 625, 1, 0, 0, 0, 631, 626, 1, 0, 0, 0, 631, 627, 1, 0, 0, 0, 631, 628, 1, 0, 0, 0, 631, 629, 1, 0, 0, 0, 631, 630, 1, 0, 0, 0, 632, 93, 1, 0, 0, 0, 633, 642, 5, 81, 0, 0, 634, 639, 3, 96, 48, 0, 635, 636, 5, 79, 0, 0, 636, 638, 3, 96, 48, 0, 637, 635, 1, 0, 0, 0, 638, 641, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 642, 634, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 645, 5, 82, 0, 0, 645, 95, 1, 0, 0, 0, 646, 647, 3, 102, 51, 0, 647, 648, 5, 77, 0, 0, 648, 649, 3, 92, 46, 0, 649, 97, 1, 0, 0, 0, 650, 659, 5, 83, 0, 0, 651, 656, 3, 92, 46, 0, 652, 653, 5, 79, 0, 0, 653, 655, 3, 92, 46, 0, 654, 652, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 651, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 5, 84, 0, 0, 662, 99, 1, 0, 0, 0, 663, 664, 7, 6, 0, 0, 664, 101, 1, 0, 0, 0, 665, 666, 5, 92, 0, 0, 666, 103, 1, 0, 0, 0, 41, 119, 130, 138, 153, 171, 198, 222, 232, 238, 267, 273, 286, 294, 307, 312, 325, 338, 353, 356, 363, 371, 411, 419, 431, 445, 455, 473, 485, 493, 516, 535, 537, 548, 579, 588, 617, 631, 639, 642, 656, 659] \ No newline at end of file +[4, 1, 100, 701, 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, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 120, 8, 1, 10, 1, 12, 1, 123, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 133, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 141, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 154, 8, 4, 10, 4, 12, 4, 157, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 174, 8, 6, 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, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 199, 8, 8, 10, 8, 12, 8, 202, 9, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 225, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 235, 8, 10, 1, 10, 1, 10, 5, 10, 239, 8, 10, 10, 10, 12, 10, 242, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 270, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 276, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 287, 8, 13, 10, 13, 12, 13, 290, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 297, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 310, 8, 15, 1, 15, 1, 15, 1, 15, 3, 15, 315, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 341, 8, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 356, 8, 20, 1, 20, 3, 20, 359, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 364, 8, 21, 10, 21, 12, 21, 367, 9, 21, 1, 22, 1, 22, 1, 22, 5, 22, 372, 8, 22, 10, 22, 12, 22, 375, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 414, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 420, 8, 24, 10, 24, 12, 24, 423, 9, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 3, 27, 434, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 448, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 458, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 476, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 486, 8, 32, 10, 32, 12, 32, 489, 9, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 497, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 534, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 553, 8, 38, 3, 38, 555, 8, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 5, 41, 564, 8, 41, 10, 41, 12, 41, 567, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 581, 8, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 597, 8, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 613, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 622, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 651, 8, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 665, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 671, 8, 48, 10, 48, 12, 48, 674, 9, 48, 3, 48, 676, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 688, 8, 50, 10, 50, 12, 50, 691, 9, 50, 3, 50, 693, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 0, 0, 53, 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, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 0, 7, 1, 0, 51, 55, 2, 0, 46, 50, 52, 53, 2, 0, 46, 47, 52, 53, 2, 0, 48, 50, 52, 53, 1, 0, 70, 77, 1, 0, 58, 61, 2, 0, 30, 30, 96, 96, 727, 0, 106, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 4, 132, 1, 0, 0, 0, 6, 134, 1, 0, 0, 0, 8, 144, 1, 0, 0, 0, 10, 160, 1, 0, 0, 0, 12, 173, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 190, 1, 0, 0, 0, 18, 224, 1, 0, 0, 0, 20, 226, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 275, 1, 0, 0, 0, 26, 277, 1, 0, 0, 0, 28, 296, 1, 0, 0, 0, 30, 298, 1, 0, 0, 0, 32, 318, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 344, 1, 0, 0, 0, 38, 347, 1, 0, 0, 0, 40, 358, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 368, 1, 0, 0, 0, 46, 413, 1, 0, 0, 0, 48, 415, 1, 0, 0, 0, 50, 426, 1, 0, 0, 0, 52, 428, 1, 0, 0, 0, 54, 433, 1, 0, 0, 0, 56, 435, 1, 0, 0, 0, 58, 457, 1, 0, 0, 0, 60, 459, 1, 0, 0, 0, 62, 468, 1, 0, 0, 0, 64, 479, 1, 0, 0, 0, 66, 496, 1, 0, 0, 0, 68, 498, 1, 0, 0, 0, 70, 512, 1, 0, 0, 0, 72, 518, 1, 0, 0, 0, 74, 533, 1, 0, 0, 0, 76, 554, 1, 0, 0, 0, 78, 556, 1, 0, 0, 0, 80, 558, 1, 0, 0, 0, 82, 560, 1, 0, 0, 0, 84, 612, 1, 0, 0, 0, 86, 614, 1, 0, 0, 0, 88, 650, 1, 0, 0, 0, 90, 652, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 664, 1, 0, 0, 0, 96, 666, 1, 0, 0, 0, 98, 679, 1, 0, 0, 0, 100, 683, 1, 0, 0, 0, 102, 696, 1, 0, 0, 0, 104, 698, 1, 0, 0, 0, 106, 107, 3, 2, 1, 0, 107, 108, 5, 0, 0, 1, 108, 1, 1, 0, 0, 0, 109, 110, 5, 1, 0, 0, 110, 111, 3, 102, 51, 0, 111, 112, 5, 34, 0, 0, 112, 113, 3, 104, 52, 0, 113, 114, 5, 33, 0, 0, 114, 115, 3, 104, 52, 0, 115, 116, 5, 32, 0, 0, 116, 117, 3, 104, 52, 0, 117, 121, 5, 86, 0, 0, 118, 120, 3, 4, 2, 0, 119, 118, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 125, 5, 87, 0, 0, 125, 3, 1, 0, 0, 0, 126, 133, 3, 6, 3, 0, 127, 133, 3, 8, 4, 0, 128, 133, 3, 26, 13, 0, 129, 133, 3, 52, 26, 0, 130, 133, 3, 64, 32, 0, 131, 133, 3, 86, 43, 0, 132, 126, 1, 0, 0, 0, 132, 127, 1, 0, 0, 0, 132, 128, 1, 0, 0, 0, 132, 129, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 131, 1, 0, 0, 0, 133, 5, 1, 0, 0, 0, 134, 135, 5, 2, 0, 0, 135, 136, 3, 102, 51, 0, 136, 137, 5, 34, 0, 0, 137, 140, 3, 104, 52, 0, 138, 139, 5, 35, 0, 0, 139, 141, 3, 104, 52, 0, 140, 138, 1, 0, 0, 0, 140, 141, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 5, 83, 0, 0, 143, 7, 1, 0, 0, 0, 144, 145, 5, 3, 0, 0, 145, 146, 3, 102, 51, 0, 146, 147, 5, 34, 0, 0, 147, 148, 3, 104, 52, 0, 148, 149, 5, 33, 0, 0, 149, 150, 3, 104, 52, 0, 150, 151, 3, 10, 5, 0, 151, 155, 5, 86, 0, 0, 152, 154, 3, 12, 6, 0, 153, 152, 1, 0, 0, 0, 154, 157, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 158, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 158, 159, 5, 87, 0, 0, 159, 9, 1, 0, 0, 0, 160, 161, 5, 30, 0, 0, 161, 162, 5, 86, 0, 0, 162, 163, 5, 31, 0, 0, 163, 164, 3, 104, 52, 0, 164, 165, 5, 83, 0, 0, 165, 166, 5, 32, 0, 0, 166, 167, 3, 104, 52, 0, 167, 168, 5, 83, 0, 0, 168, 169, 5, 87, 0, 0, 169, 11, 1, 0, 0, 0, 170, 174, 3, 16, 8, 0, 171, 174, 3, 20, 10, 0, 172, 174, 3, 14, 7, 0, 173, 170, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 172, 1, 0, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 8, 0, 0, 176, 177, 3, 102, 51, 0, 177, 178, 5, 34, 0, 0, 178, 179, 3, 104, 52, 0, 179, 180, 5, 82, 0, 0, 180, 181, 3, 88, 44, 0, 181, 182, 5, 81, 0, 0, 182, 183, 3, 88, 44, 0, 183, 184, 5, 86, 0, 0, 184, 185, 5, 51, 0, 0, 185, 186, 5, 34, 0, 0, 186, 187, 3, 104, 52, 0, 187, 188, 5, 83, 0, 0, 188, 189, 5, 87, 0, 0, 189, 15, 1, 0, 0, 0, 190, 191, 5, 6, 0, 0, 191, 192, 3, 102, 51, 0, 192, 193, 5, 34, 0, 0, 193, 194, 3, 104, 52, 0, 194, 195, 5, 82, 0, 0, 195, 196, 3, 88, 44, 0, 196, 200, 5, 86, 0, 0, 197, 199, 3, 18, 9, 0, 198, 197, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 203, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 204, 5, 87, 0, 0, 204, 17, 1, 0, 0, 0, 205, 206, 5, 41, 0, 0, 206, 207, 5, 34, 0, 0, 207, 208, 3, 104, 52, 0, 208, 209, 5, 83, 0, 0, 209, 225, 1, 0, 0, 0, 210, 211, 5, 42, 0, 0, 211, 212, 5, 34, 0, 0, 212, 213, 3, 104, 52, 0, 213, 214, 5, 83, 0, 0, 214, 225, 1, 0, 0, 0, 215, 216, 5, 43, 0, 0, 216, 217, 5, 44, 0, 0, 217, 218, 5, 34, 0, 0, 218, 219, 3, 104, 52, 0, 219, 220, 5, 45, 0, 0, 220, 221, 5, 34, 0, 0, 221, 222, 3, 104, 52, 0, 222, 223, 5, 83, 0, 0, 223, 225, 1, 0, 0, 0, 224, 205, 1, 0, 0, 0, 224, 210, 1, 0, 0, 0, 224, 215, 1, 0, 0, 0, 225, 19, 1, 0, 0, 0, 226, 227, 5, 7, 0, 0, 227, 228, 3, 102, 51, 0, 228, 229, 5, 34, 0, 0, 229, 230, 3, 104, 52, 0, 230, 231, 5, 82, 0, 0, 231, 232, 3, 92, 46, 0, 232, 234, 3, 24, 12, 0, 233, 235, 5, 62, 0, 0, 234, 233, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 240, 5, 86, 0, 0, 237, 239, 3, 22, 11, 0, 238, 237, 1, 0, 0, 0, 239, 242, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 243, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 244, 5, 87, 0, 0, 244, 21, 1, 0, 0, 0, 245, 246, 5, 48, 0, 0, 246, 247, 5, 34, 0, 0, 247, 248, 3, 104, 52, 0, 248, 249, 5, 83, 0, 0, 249, 270, 1, 0, 0, 0, 250, 251, 5, 49, 0, 0, 251, 252, 5, 34, 0, 0, 252, 253, 3, 104, 52, 0, 253, 254, 5, 83, 0, 0, 254, 270, 1, 0, 0, 0, 255, 256, 5, 50, 0, 0, 256, 257, 5, 34, 0, 0, 257, 258, 3, 104, 52, 0, 258, 259, 5, 83, 0, 0, 259, 270, 1, 0, 0, 0, 260, 261, 5, 43, 0, 0, 261, 262, 5, 44, 0, 0, 262, 263, 5, 34, 0, 0, 263, 264, 3, 104, 52, 0, 264, 265, 5, 45, 0, 0, 265, 266, 5, 34, 0, 0, 266, 267, 3, 104, 52, 0, 267, 268, 5, 83, 0, 0, 268, 270, 1, 0, 0, 0, 269, 245, 1, 0, 0, 0, 269, 250, 1, 0, 0, 0, 269, 255, 1, 0, 0, 0, 269, 260, 1, 0, 0, 0, 270, 23, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 276, 3, 102, 51, 0, 273, 274, 5, 3, 0, 0, 274, 276, 3, 102, 51, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 25, 1, 0, 0, 0, 277, 278, 5, 5, 0, 0, 278, 279, 3, 102, 51, 0, 279, 280, 5, 34, 0, 0, 280, 281, 3, 104, 52, 0, 281, 282, 5, 33, 0, 0, 282, 283, 3, 104, 52, 0, 283, 284, 3, 10, 5, 0, 284, 288, 5, 86, 0, 0, 285, 287, 3, 28, 14, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 291, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 87, 0, 0, 292, 27, 1, 0, 0, 0, 293, 297, 3, 30, 15, 0, 294, 297, 3, 32, 16, 0, 295, 297, 3, 34, 17, 0, 296, 293, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 29, 1, 0, 0, 0, 298, 299, 5, 8, 0, 0, 299, 300, 3, 102, 51, 0, 300, 301, 5, 34, 0, 0, 301, 302, 3, 104, 52, 0, 302, 303, 5, 82, 0, 0, 303, 304, 3, 88, 44, 0, 304, 305, 5, 81, 0, 0, 305, 306, 3, 88, 44, 0, 306, 307, 5, 36, 0, 0, 307, 309, 3, 38, 19, 0, 308, 310, 3, 36, 18, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 312, 5, 38, 0, 0, 312, 314, 3, 40, 20, 0, 313, 315, 3, 44, 22, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 5, 83, 0, 0, 317, 31, 1, 0, 0, 0, 318, 319, 5, 9, 0, 0, 319, 320, 3, 102, 51, 0, 320, 321, 5, 34, 0, 0, 321, 322, 3, 104, 52, 0, 322, 323, 5, 82, 0, 0, 323, 324, 3, 88, 44, 0, 324, 325, 5, 81, 0, 0, 325, 327, 3, 88, 44, 0, 326, 328, 3, 44, 22, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 5, 83, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 10, 0, 0, 332, 333, 3, 102, 51, 0, 333, 334, 5, 34, 0, 0, 334, 335, 3, 104, 52, 0, 335, 336, 5, 11, 0, 0, 336, 337, 3, 102, 51, 0, 337, 338, 5, 82, 0, 0, 338, 340, 3, 88, 44, 0, 339, 341, 3, 44, 22, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 83, 0, 0, 343, 35, 1, 0, 0, 0, 344, 345, 5, 37, 0, 0, 345, 346, 3, 88, 44, 0, 346, 37, 1, 0, 0, 0, 347, 348, 7, 0, 0, 0, 348, 39, 1, 0, 0, 0, 349, 359, 5, 40, 0, 0, 350, 351, 5, 2, 0, 0, 351, 359, 3, 102, 51, 0, 352, 353, 5, 4, 0, 0, 353, 355, 5, 88, 0, 0, 354, 356, 3, 42, 21, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 5, 89, 0, 0, 358, 349, 1, 0, 0, 0, 358, 350, 1, 0, 0, 0, 358, 352, 1, 0, 0, 0, 359, 41, 1, 0, 0, 0, 360, 365, 3, 102, 51, 0, 361, 362, 5, 84, 0, 0, 362, 364, 3, 102, 51, 0, 363, 361, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 43, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 368, 369, 5, 39, 0, 0, 369, 373, 5, 86, 0, 0, 370, 372, 3, 46, 23, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 376, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 87, 0, 0, 377, 45, 1, 0, 0, 0, 378, 379, 5, 18, 0, 0, 379, 380, 3, 102, 51, 0, 380, 381, 5, 34, 0, 0, 381, 382, 3, 104, 52, 0, 382, 383, 5, 82, 0, 0, 383, 384, 3, 88, 44, 0, 384, 385, 3, 48, 24, 0, 385, 386, 5, 83, 0, 0, 386, 414, 1, 0, 0, 0, 387, 388, 5, 19, 0, 0, 388, 389, 3, 102, 51, 0, 389, 390, 5, 34, 0, 0, 390, 391, 3, 104, 52, 0, 391, 392, 5, 82, 0, 0, 392, 393, 3, 92, 46, 0, 393, 394, 3, 24, 12, 0, 394, 395, 3, 48, 24, 0, 395, 396, 5, 83, 0, 0, 396, 414, 1, 0, 0, 0, 397, 398, 5, 3, 0, 0, 398, 399, 3, 102, 51, 0, 399, 400, 5, 34, 0, 0, 400, 401, 3, 104, 52, 0, 401, 402, 5, 82, 0, 0, 402, 403, 3, 102, 51, 0, 403, 404, 5, 83, 0, 0, 404, 414, 1, 0, 0, 0, 405, 406, 5, 10, 0, 0, 406, 407, 3, 102, 51, 0, 407, 408, 5, 34, 0, 0, 408, 409, 3, 104, 52, 0, 409, 410, 5, 82, 0, 0, 410, 411, 3, 102, 51, 0, 411, 412, 5, 83, 0, 0, 412, 414, 1, 0, 0, 0, 413, 378, 1, 0, 0, 0, 413, 387, 1, 0, 0, 0, 413, 397, 1, 0, 0, 0, 413, 405, 1, 0, 0, 0, 414, 47, 1, 0, 0, 0, 415, 416, 5, 88, 0, 0, 416, 421, 3, 50, 25, 0, 417, 418, 5, 84, 0, 0, 418, 420, 3, 50, 25, 0, 419, 417, 1, 0, 0, 0, 420, 423, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 424, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 424, 425, 5, 89, 0, 0, 425, 49, 1, 0, 0, 0, 426, 427, 7, 1, 0, 0, 427, 51, 1, 0, 0, 0, 428, 429, 5, 17, 0, 0, 429, 430, 3, 54, 27, 0, 430, 53, 1, 0, 0, 0, 431, 434, 3, 56, 28, 0, 432, 434, 3, 60, 30, 0, 433, 431, 1, 0, 0, 0, 433, 432, 1, 0, 0, 0, 434, 55, 1, 0, 0, 0, 435, 436, 5, 18, 0, 0, 436, 437, 3, 102, 51, 0, 437, 438, 5, 34, 0, 0, 438, 439, 3, 104, 52, 0, 439, 440, 5, 27, 0, 0, 440, 441, 3, 102, 51, 0, 441, 442, 5, 82, 0, 0, 442, 443, 3, 88, 44, 0, 443, 444, 5, 28, 0, 0, 444, 447, 3, 58, 29, 0, 445, 446, 5, 29, 0, 0, 446, 448, 3, 94, 47, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 5, 83, 0, 0, 450, 57, 1, 0, 0, 0, 451, 458, 5, 56, 0, 0, 452, 453, 5, 57, 0, 0, 453, 454, 5, 90, 0, 0, 454, 455, 3, 88, 44, 0, 455, 456, 5, 91, 0, 0, 456, 458, 1, 0, 0, 0, 457, 451, 1, 0, 0, 0, 457, 452, 1, 0, 0, 0, 458, 59, 1, 0, 0, 0, 459, 460, 5, 19, 0, 0, 460, 461, 3, 102, 51, 0, 461, 462, 5, 34, 0, 0, 462, 463, 3, 104, 52, 0, 463, 464, 5, 86, 0, 0, 464, 465, 3, 62, 31, 0, 465, 466, 3, 62, 31, 0, 466, 467, 5, 87, 0, 0, 467, 61, 1, 0, 0, 0, 468, 469, 3, 24, 12, 0, 469, 470, 5, 20, 0, 0, 470, 471, 3, 102, 51, 0, 471, 472, 5, 34, 0, 0, 472, 473, 3, 104, 52, 0, 473, 475, 3, 92, 46, 0, 474, 476, 5, 62, 0, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 5, 83, 0, 0, 478, 63, 1, 0, 0, 0, 479, 480, 5, 12, 0, 0, 480, 481, 3, 102, 51, 0, 481, 482, 5, 13, 0, 0, 482, 483, 3, 102, 51, 0, 483, 487, 5, 86, 0, 0, 484, 486, 3, 66, 33, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 491, 5, 87, 0, 0, 491, 65, 1, 0, 0, 0, 492, 493, 5, 16, 0, 0, 493, 497, 3, 54, 27, 0, 494, 497, 3, 70, 35, 0, 495, 497, 3, 68, 34, 0, 496, 492, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 495, 1, 0, 0, 0, 497, 67, 1, 0, 0, 0, 498, 499, 5, 24, 0, 0, 499, 500, 3, 102, 51, 0, 500, 501, 5, 25, 0, 0, 501, 502, 5, 26, 0, 0, 502, 503, 5, 22, 0, 0, 503, 504, 5, 10, 0, 0, 504, 505, 3, 102, 51, 0, 505, 506, 5, 23, 0, 0, 506, 507, 5, 19, 0, 0, 507, 508, 3, 102, 51, 0, 508, 509, 5, 85, 0, 0, 509, 510, 3, 102, 51, 0, 510, 511, 5, 83, 0, 0, 511, 69, 1, 0, 0, 0, 512, 513, 5, 14, 0, 0, 513, 514, 3, 72, 36, 0, 514, 515, 5, 15, 0, 0, 515, 516, 3, 76, 38, 0, 516, 517, 5, 83, 0, 0, 517, 71, 1, 0, 0, 0, 518, 519, 3, 102, 51, 0, 519, 520, 5, 85, 0, 0, 520, 521, 3, 74, 37, 0, 521, 73, 1, 0, 0, 0, 522, 534, 3, 102, 51, 0, 523, 534, 5, 51, 0, 0, 524, 534, 5, 41, 0, 0, 525, 534, 5, 42, 0, 0, 526, 534, 5, 48, 0, 0, 527, 534, 5, 49, 0, 0, 528, 534, 5, 50, 0, 0, 529, 534, 5, 52, 0, 0, 530, 534, 5, 53, 0, 0, 531, 534, 5, 54, 0, 0, 532, 534, 5, 55, 0, 0, 533, 522, 1, 0, 0, 0, 533, 523, 1, 0, 0, 0, 533, 524, 1, 0, 0, 0, 533, 525, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 527, 1, 0, 0, 0, 533, 528, 1, 0, 0, 0, 533, 529, 1, 0, 0, 0, 533, 530, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 532, 1, 0, 0, 0, 534, 75, 1, 0, 0, 0, 535, 536, 5, 18, 0, 0, 536, 537, 3, 102, 51, 0, 537, 538, 5, 85, 0, 0, 538, 539, 3, 78, 39, 0, 539, 555, 1, 0, 0, 0, 540, 541, 5, 19, 0, 0, 541, 542, 3, 102, 51, 0, 542, 543, 5, 85, 0, 0, 543, 544, 3, 102, 51, 0, 544, 545, 5, 85, 0, 0, 545, 546, 3, 80, 40, 0, 546, 555, 1, 0, 0, 0, 547, 548, 5, 5, 0, 0, 548, 549, 3, 102, 51, 0, 549, 550, 5, 85, 0, 0, 550, 552, 3, 102, 51, 0, 551, 553, 3, 82, 41, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 555, 1, 0, 0, 0, 554, 535, 1, 0, 0, 0, 554, 540, 1, 0, 0, 0, 554, 547, 1, 0, 0, 0, 555, 77, 1, 0, 0, 0, 556, 557, 7, 2, 0, 0, 557, 79, 1, 0, 0, 0, 558, 559, 7, 3, 0, 0, 559, 81, 1, 0, 0, 0, 560, 561, 5, 21, 0, 0, 561, 565, 5, 86, 0, 0, 562, 564, 3, 84, 42, 0, 563, 562, 1, 0, 0, 0, 564, 567, 1, 0, 0, 0, 565, 563, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 568, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 568, 569, 5, 87, 0, 0, 569, 83, 1, 0, 0, 0, 570, 571, 3, 102, 51, 0, 571, 572, 5, 15, 0, 0, 572, 573, 5, 18, 0, 0, 573, 580, 3, 102, 51, 0, 574, 575, 5, 23, 0, 0, 575, 576, 5, 19, 0, 0, 576, 577, 3, 102, 51, 0, 577, 578, 5, 85, 0, 0, 578, 579, 3, 102, 51, 0, 579, 581, 1, 0, 0, 0, 580, 574, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 83, 0, 0, 583, 613, 1, 0, 0, 0, 584, 585, 3, 102, 51, 0, 585, 586, 5, 15, 0, 0, 586, 587, 5, 19, 0, 0, 587, 588, 3, 102, 51, 0, 588, 589, 5, 85, 0, 0, 589, 596, 3, 102, 51, 0, 590, 591, 5, 23, 0, 0, 591, 592, 5, 19, 0, 0, 592, 593, 3, 102, 51, 0, 593, 594, 5, 85, 0, 0, 594, 595, 3, 102, 51, 0, 595, 597, 1, 0, 0, 0, 596, 590, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 83, 0, 0, 599, 613, 1, 0, 0, 0, 600, 601, 3, 102, 51, 0, 601, 602, 5, 15, 0, 0, 602, 603, 5, 3, 0, 0, 603, 604, 3, 102, 51, 0, 604, 605, 5, 83, 0, 0, 605, 613, 1, 0, 0, 0, 606, 607, 3, 102, 51, 0, 607, 608, 5, 15, 0, 0, 608, 609, 5, 10, 0, 0, 609, 610, 3, 102, 51, 0, 610, 611, 5, 83, 0, 0, 611, 613, 1, 0, 0, 0, 612, 570, 1, 0, 0, 0, 612, 584, 1, 0, 0, 0, 612, 600, 1, 0, 0, 0, 612, 606, 1, 0, 0, 0, 613, 85, 1, 0, 0, 0, 614, 615, 5, 10, 0, 0, 615, 616, 3, 102, 51, 0, 616, 617, 5, 15, 0, 0, 617, 618, 3, 102, 51, 0, 618, 619, 5, 85, 0, 0, 619, 621, 3, 102, 51, 0, 620, 622, 3, 82, 41, 0, 621, 620, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 624, 5, 83, 0, 0, 624, 87, 1, 0, 0, 0, 625, 651, 3, 90, 45, 0, 626, 651, 5, 63, 0, 0, 627, 651, 5, 64, 0, 0, 628, 629, 5, 65, 0, 0, 629, 651, 3, 104, 52, 0, 630, 631, 5, 66, 0, 0, 631, 632, 5, 92, 0, 0, 632, 633, 3, 102, 51, 0, 633, 634, 5, 93, 0, 0, 634, 651, 1, 0, 0, 0, 635, 636, 5, 67, 0, 0, 636, 637, 5, 92, 0, 0, 637, 638, 3, 102, 51, 0, 638, 639, 5, 93, 0, 0, 639, 651, 1, 0, 0, 0, 640, 641, 5, 68, 0, 0, 641, 642, 5, 92, 0, 0, 642, 643, 3, 88, 44, 0, 643, 644, 5, 93, 0, 0, 644, 651, 1, 0, 0, 0, 645, 646, 5, 69, 0, 0, 646, 647, 5, 92, 0, 0, 647, 648, 3, 88, 44, 0, 648, 649, 5, 93, 0, 0, 649, 651, 1, 0, 0, 0, 650, 625, 1, 0, 0, 0, 650, 626, 1, 0, 0, 0, 650, 627, 1, 0, 0, 0, 650, 628, 1, 0, 0, 0, 650, 630, 1, 0, 0, 0, 650, 635, 1, 0, 0, 0, 650, 640, 1, 0, 0, 0, 650, 645, 1, 0, 0, 0, 651, 89, 1, 0, 0, 0, 652, 653, 7, 4, 0, 0, 653, 91, 1, 0, 0, 0, 654, 655, 7, 5, 0, 0, 655, 93, 1, 0, 0, 0, 656, 665, 3, 104, 52, 0, 657, 665, 5, 94, 0, 0, 658, 665, 5, 95, 0, 0, 659, 665, 5, 78, 0, 0, 660, 665, 5, 79, 0, 0, 661, 665, 5, 80, 0, 0, 662, 665, 3, 96, 48, 0, 663, 665, 3, 100, 50, 0, 664, 656, 1, 0, 0, 0, 664, 657, 1, 0, 0, 0, 664, 658, 1, 0, 0, 0, 664, 659, 1, 0, 0, 0, 664, 660, 1, 0, 0, 0, 664, 661, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 663, 1, 0, 0, 0, 665, 95, 1, 0, 0, 0, 666, 675, 5, 86, 0, 0, 667, 672, 3, 98, 49, 0, 668, 669, 5, 84, 0, 0, 669, 671, 3, 98, 49, 0, 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 676, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 667, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 5, 87, 0, 0, 678, 97, 1, 0, 0, 0, 679, 680, 3, 104, 52, 0, 680, 681, 5, 82, 0, 0, 681, 682, 3, 94, 47, 0, 682, 99, 1, 0, 0, 0, 683, 692, 5, 88, 0, 0, 684, 689, 3, 94, 47, 0, 685, 686, 5, 84, 0, 0, 686, 688, 3, 94, 47, 0, 687, 685, 1, 0, 0, 0, 688, 691, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 693, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 692, 684, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 695, 5, 89, 0, 0, 695, 101, 1, 0, 0, 0, 696, 697, 7, 6, 0, 0, 697, 103, 1, 0, 0, 0, 698, 699, 5, 97, 0, 0, 699, 105, 1, 0, 0, 0, 43, 121, 132, 140, 155, 173, 200, 224, 234, 240, 269, 275, 288, 296, 309, 314, 327, 340, 355, 358, 365, 373, 413, 421, 433, 447, 457, 475, 487, 496, 533, 552, 554, 565, 580, 596, 612, 621, 650, 664, 672, 675, 689, 692] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index ff0a567..22f078e 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -19,80 +19,85 @@ STATE=18 EDGE=19 PROJECTION=20 WITH=21 -ON=22 -POLICY=23 -DEFAULT=24 -SOURCE=25 -REPOSITORY=26 -COMMIT=27 -REVISION=28 -ID=29 -DOC=30 -MODE=31 -EMITS=32 -RECEIVER=33 -REQUIRES=34 -ANY=35 -GET=36 -SET=37 -WATCH=38 -START=39 -STOP=40 -READ=41 -WRITE=42 -RESOLVE=43 -CONNECT=44 -DISCONNECT=45 -CALL=46 -WATCH_START=47 -WATCH_STOP=48 -SUBSCRIBE=49 -UNSUBSCRIBE=50 -OPTIMISTIC_REGISTER=51 -CRDT=52 -OPTIONAL_ONE=53 -EXACTLY_ONE=54 -MANY_UNIQUE=55 -MANY=56 -ORDERED=57 -UNIT=58 -WATCH_HANDLE=59 -MESSAGE=60 -ATOM_REF=61 -INTERFACE_REF=62 -OPTIONAL=63 -LIST=64 -BOOL=65 -BYTES=66 -DOUBLE=67 -INT32=68 -INT64=69 -STRING=70 -UINT32=71 -UINT64=72 -TRUE=73 -FALSE=74 -NULL=75 -ARROW=76 -COLON=77 -SEMI=78 -COMMA=79 -DOT=80 -LBRACE=81 -RBRACE=82 -LBRACK=83 -RBRACK=84 -LPAREN=85 -RPAREN=86 -LT=87 -GT=88 -INTEGER=89 -JSON_NUMBER=90 -IDENTIFIER=91 -STRING_LITERAL=92 -LINE_COMMENT=93 -BLOCK_COMMENT=94 -WS=95 +USING=22 +VIA=23 +MATERIALIZE=24 +IF=25 +ABSENT=26 +ON=27 +POLICY=28 +DEFAULT=29 +SOURCE=30 +REPOSITORY=31 +COMMIT=32 +REVISION=33 +ID=34 +DOC=35 +MODE=36 +EMITS=37 +RECEIVER=38 +REQUIRES=39 +ANY=40 +GET=41 +SET=42 +WATCH=43 +START=44 +STOP=45 +READ=46 +WRITE=47 +RESOLVE=48 +CONNECT=49 +DISCONNECT=50 +CALL=51 +WATCH_START=52 +WATCH_STOP=53 +SUBSCRIBE=54 +UNSUBSCRIBE=55 +OPTIMISTIC_REGISTER=56 +CRDT=57 +OPTIONAL_ONE=58 +EXACTLY_ONE=59 +MANY_UNIQUE=60 +MANY=61 +ORDERED=62 +UNIT=63 +WATCH_HANDLE=64 +MESSAGE=65 +ATOM_REF=66 +INTERFACE_REF=67 +OPTIONAL=68 +LIST=69 +BOOL=70 +BYTES=71 +DOUBLE=72 +INT32=73 +INT64=74 +STRING=75 +UINT32=76 +UINT64=77 +TRUE=78 +FALSE=79 +NULL=80 +ARROW=81 +COLON=82 +SEMI=83 +COMMA=84 +DOT=85 +LBRACE=86 +RBRACE=87 +LBRACK=88 +RBRACK=89 +LPAREN=90 +RPAREN=91 +LT=92 +GT=93 +INTEGER=94 +JSON_NUMBER=95 +IDENTIFIER=96 +STRING_LITERAL=97 +LINE_COMMENT=98 +BLOCK_COMMENT=99 +WS=100 'workspace'=1 'atom'=2 'interface'=3 @@ -114,70 +119,75 @@ WS=95 'edge'=19 'projection'=20 'with'=21 -'on'=22 -'policy'=23 -'default'=24 -'source'=25 -'repository'=26 -'commit'=27 -'revision'=28 -'id'=29 -'doc'=30 -'mode'=31 -'emits'=32 -'receiver'=33 -'requires'=34 -'any'=35 -'get'=36 -'set'=37 -'watch'=38 -'start'=39 -'stop'=40 -'read'=41 -'write'=42 -'resolve'=43 -'connect'=44 -'disconnect'=45 -'call'=46 -'watch-start'=47 -'watch-stop'=48 -'subscribe'=49 -'unsubscribe'=50 -'optimistic-register'=51 -'crdt'=52 -'optional-one'=53 -'exactly-one'=54 -'many-unique'=55 -'many'=56 -'ordered'=57 -'unit'=58 -'watch-handle'=59 -'message'=60 -'atom-ref'=61 -'interface-ref'=62 -'optional'=63 -'list'=64 -'bool'=65 -'bytes'=66 -'double'=67 -'int32'=68 -'int64'=69 -'string'=70 -'uint32'=71 -'uint64'=72 -'true'=73 -'false'=74 -'null'=75 -'->'=76 -':'=77 -';'=78 -','=79 -'.'=80 -'{'=81 -'}'=82 -'['=83 -']'=84 -'('=85 -')'=86 -'<'=87 -'>'=88 +'using'=22 +'via'=23 +'materialize'=24 +'if'=25 +'absent'=26 +'on'=27 +'policy'=28 +'default'=29 +'source'=30 +'repository'=31 +'commit'=32 +'revision'=33 +'id'=34 +'doc'=35 +'mode'=36 +'emits'=37 +'receiver'=38 +'requires'=39 +'any'=40 +'get'=41 +'set'=42 +'watch'=43 +'start'=44 +'stop'=45 +'read'=46 +'write'=47 +'resolve'=48 +'connect'=49 +'disconnect'=50 +'call'=51 +'watch-start'=52 +'watch-stop'=53 +'subscribe'=54 +'unsubscribe'=55 +'optimistic-register'=56 +'crdt'=57 +'optional-one'=58 +'exactly-one'=59 +'many-unique'=60 +'many'=61 +'ordered'=62 +'unit'=63 +'watch-handle'=64 +'message'=65 +'atom-ref'=66 +'interface-ref'=67 +'optional'=68 +'list'=69 +'bool'=70 +'bytes'=71 +'double'=72 +'int32'=73 +'int64'=74 +'string'=75 +'uint32'=76 +'uint64'=77 +'true'=78 +'false'=79 +'null'=80 +'->'=81 +':'=82 +';'=83 +','=84 +'.'=85 +'{'=86 +'}'=87 +'['=88 +']'=89 +'('=90 +')'=91 +'<'=92 +'>'=93 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 793fa25..cd06e15 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -21,6 +21,11 @@ null 'edge' 'projection' 'with' +'using' +'via' +'materialize' +'if' +'absent' 'on' 'policy' 'default' @@ -119,6 +124,11 @@ STATE EDGE PROJECTION WITH +USING +VIA +MATERIALIZE +IF +ABSENT ON POLICY DEFAULT @@ -216,6 +226,11 @@ STATE EDGE PROJECTION WITH +USING +VIA +MATERIALIZE +IF +ABSENT ON POLICY DEFAULT @@ -301,4 +316,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 95, 895, 6, -1, 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, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 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, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 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, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 3, 88, 796, 8, 88, 1, 88, 4, 88, 799, 8, 88, 11, 88, 12, 88, 800, 1, 89, 3, 89, 804, 8, 89, 1, 89, 1, 89, 1, 89, 5, 89, 809, 8, 89, 10, 89, 12, 89, 812, 9, 89, 3, 89, 814, 8, 89, 1, 89, 1, 89, 4, 89, 818, 8, 89, 11, 89, 12, 89, 819, 3, 89, 822, 8, 89, 1, 89, 1, 89, 3, 89, 826, 8, 89, 1, 89, 4, 89, 829, 8, 89, 11, 89, 12, 89, 830, 3, 89, 833, 8, 89, 1, 90, 1, 90, 5, 90, 837, 8, 90, 10, 90, 12, 90, 840, 9, 90, 1, 91, 1, 91, 1, 91, 5, 91, 845, 8, 91, 10, 91, 12, 91, 848, 9, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 860, 8, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 5, 94, 868, 8, 94, 10, 94, 12, 94, 871, 9, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 5, 95, 879, 8, 95, 10, 95, 12, 95, 882, 9, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 4, 96, 890, 8, 96, 11, 96, 12, 96, 891, 1, 96, 1, 96, 1, 880, 0, 97, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 0, 187, 0, 189, 93, 191, 94, 193, 95, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 909, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 1, 195, 1, 0, 0, 0, 3, 205, 1, 0, 0, 0, 5, 210, 1, 0, 0, 0, 7, 220, 1, 0, 0, 0, 9, 231, 1, 0, 0, 0, 11, 239, 1, 0, 0, 0, 13, 245, 1, 0, 0, 0, 15, 254, 1, 0, 0, 0, 17, 264, 1, 0, 0, 0, 19, 273, 1, 0, 0, 0, 21, 285, 1, 0, 0, 0, 23, 296, 1, 0, 0, 0, 25, 304, 1, 0, 0, 0, 27, 307, 1, 0, 0, 0, 29, 312, 1, 0, 0, 0, 31, 315, 1, 0, 0, 0, 33, 323, 1, 0, 0, 0, 35, 330, 1, 0, 0, 0, 37, 336, 1, 0, 0, 0, 39, 341, 1, 0, 0, 0, 41, 352, 1, 0, 0, 0, 43, 357, 1, 0, 0, 0, 45, 360, 1, 0, 0, 0, 47, 367, 1, 0, 0, 0, 49, 375, 1, 0, 0, 0, 51, 382, 1, 0, 0, 0, 53, 393, 1, 0, 0, 0, 55, 400, 1, 0, 0, 0, 57, 409, 1, 0, 0, 0, 59, 412, 1, 0, 0, 0, 61, 416, 1, 0, 0, 0, 63, 421, 1, 0, 0, 0, 65, 427, 1, 0, 0, 0, 67, 436, 1, 0, 0, 0, 69, 445, 1, 0, 0, 0, 71, 449, 1, 0, 0, 0, 73, 453, 1, 0, 0, 0, 75, 457, 1, 0, 0, 0, 77, 463, 1, 0, 0, 0, 79, 469, 1, 0, 0, 0, 81, 474, 1, 0, 0, 0, 83, 479, 1, 0, 0, 0, 85, 485, 1, 0, 0, 0, 87, 493, 1, 0, 0, 0, 89, 501, 1, 0, 0, 0, 91, 512, 1, 0, 0, 0, 93, 517, 1, 0, 0, 0, 95, 529, 1, 0, 0, 0, 97, 540, 1, 0, 0, 0, 99, 550, 1, 0, 0, 0, 101, 562, 1, 0, 0, 0, 103, 582, 1, 0, 0, 0, 105, 587, 1, 0, 0, 0, 107, 600, 1, 0, 0, 0, 109, 612, 1, 0, 0, 0, 111, 624, 1, 0, 0, 0, 113, 629, 1, 0, 0, 0, 115, 637, 1, 0, 0, 0, 117, 642, 1, 0, 0, 0, 119, 655, 1, 0, 0, 0, 121, 663, 1, 0, 0, 0, 123, 672, 1, 0, 0, 0, 125, 686, 1, 0, 0, 0, 127, 695, 1, 0, 0, 0, 129, 700, 1, 0, 0, 0, 131, 705, 1, 0, 0, 0, 133, 711, 1, 0, 0, 0, 135, 718, 1, 0, 0, 0, 137, 724, 1, 0, 0, 0, 139, 730, 1, 0, 0, 0, 141, 737, 1, 0, 0, 0, 143, 744, 1, 0, 0, 0, 145, 751, 1, 0, 0, 0, 147, 756, 1, 0, 0, 0, 149, 762, 1, 0, 0, 0, 151, 767, 1, 0, 0, 0, 153, 770, 1, 0, 0, 0, 155, 772, 1, 0, 0, 0, 157, 774, 1, 0, 0, 0, 159, 776, 1, 0, 0, 0, 161, 778, 1, 0, 0, 0, 163, 780, 1, 0, 0, 0, 165, 782, 1, 0, 0, 0, 167, 784, 1, 0, 0, 0, 169, 786, 1, 0, 0, 0, 171, 788, 1, 0, 0, 0, 173, 790, 1, 0, 0, 0, 175, 792, 1, 0, 0, 0, 177, 795, 1, 0, 0, 0, 179, 803, 1, 0, 0, 0, 181, 834, 1, 0, 0, 0, 183, 841, 1, 0, 0, 0, 185, 851, 1, 0, 0, 0, 187, 861, 1, 0, 0, 0, 189, 863, 1, 0, 0, 0, 191, 874, 1, 0, 0, 0, 193, 889, 1, 0, 0, 0, 195, 196, 5, 119, 0, 0, 196, 197, 5, 111, 0, 0, 197, 198, 5, 114, 0, 0, 198, 199, 5, 107, 0, 0, 199, 200, 5, 115, 0, 0, 200, 201, 5, 112, 0, 0, 201, 202, 5, 97, 0, 0, 202, 203, 5, 99, 0, 0, 203, 204, 5, 101, 0, 0, 204, 2, 1, 0, 0, 0, 205, 206, 5, 97, 0, 0, 206, 207, 5, 116, 0, 0, 207, 208, 5, 111, 0, 0, 208, 209, 5, 109, 0, 0, 209, 4, 1, 0, 0, 0, 210, 211, 5, 105, 0, 0, 211, 212, 5, 110, 0, 0, 212, 213, 5, 116, 0, 0, 213, 214, 5, 101, 0, 0, 214, 215, 5, 114, 0, 0, 215, 216, 5, 102, 0, 0, 216, 217, 5, 97, 0, 0, 217, 218, 5, 99, 0, 0, 218, 219, 5, 101, 0, 0, 219, 6, 1, 0, 0, 0, 220, 221, 5, 105, 0, 0, 221, 222, 5, 110, 0, 0, 222, 223, 5, 116, 0, 0, 223, 224, 5, 101, 0, 0, 224, 225, 5, 114, 0, 0, 225, 226, 5, 102, 0, 0, 226, 227, 5, 97, 0, 0, 227, 228, 5, 99, 0, 0, 228, 229, 5, 101, 0, 0, 229, 230, 5, 115, 0, 0, 230, 8, 1, 0, 0, 0, 231, 232, 5, 112, 0, 0, 232, 233, 5, 97, 0, 0, 233, 234, 5, 99, 0, 0, 234, 235, 5, 107, 0, 0, 235, 236, 5, 97, 0, 0, 236, 237, 5, 103, 0, 0, 237, 238, 5, 101, 0, 0, 238, 10, 1, 0, 0, 0, 239, 240, 5, 118, 0, 0, 240, 241, 5, 97, 0, 0, 241, 242, 5, 108, 0, 0, 242, 243, 5, 117, 0, 0, 243, 244, 5, 101, 0, 0, 244, 12, 1, 0, 0, 0, 245, 246, 5, 114, 0, 0, 246, 247, 5, 101, 0, 0, 247, 248, 5, 108, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 111, 0, 0, 252, 253, 5, 110, 0, 0, 253, 14, 1, 0, 0, 0, 254, 255, 5, 111, 0, 0, 255, 256, 5, 112, 0, 0, 256, 257, 5, 101, 0, 0, 257, 258, 5, 114, 0, 0, 258, 259, 5, 97, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 111, 0, 0, 262, 263, 5, 110, 0, 0, 263, 16, 1, 0, 0, 0, 264, 265, 5, 102, 0, 0, 265, 266, 5, 117, 0, 0, 266, 267, 5, 110, 0, 0, 267, 268, 5, 99, 0, 0, 268, 269, 5, 116, 0, 0, 269, 270, 5, 105, 0, 0, 270, 271, 5, 111, 0, 0, 271, 272, 5, 110, 0, 0, 272, 18, 1, 0, 0, 0, 273, 274, 5, 99, 0, 0, 274, 275, 5, 111, 0, 0, 275, 276, 5, 110, 0, 0, 276, 277, 5, 115, 0, 0, 277, 278, 5, 116, 0, 0, 278, 279, 5, 114, 0, 0, 279, 280, 5, 117, 0, 0, 280, 281, 5, 99, 0, 0, 281, 282, 5, 116, 0, 0, 282, 283, 5, 111, 0, 0, 283, 284, 5, 114, 0, 0, 284, 20, 1, 0, 0, 0, 285, 286, 5, 99, 0, 0, 286, 287, 5, 111, 0, 0, 287, 288, 5, 110, 0, 0, 288, 289, 5, 115, 0, 0, 289, 290, 5, 116, 0, 0, 290, 291, 5, 114, 0, 0, 291, 292, 5, 117, 0, 0, 292, 293, 5, 99, 0, 0, 293, 294, 5, 116, 0, 0, 294, 295, 5, 115, 0, 0, 295, 22, 1, 0, 0, 0, 296, 297, 5, 99, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 110, 0, 0, 299, 300, 5, 102, 0, 0, 300, 301, 5, 111, 0, 0, 301, 302, 5, 114, 0, 0, 302, 303, 5, 109, 0, 0, 303, 24, 1, 0, 0, 0, 304, 305, 5, 97, 0, 0, 305, 306, 5, 115, 0, 0, 306, 26, 1, 0, 0, 0, 307, 308, 5, 98, 0, 0, 308, 309, 5, 105, 0, 0, 309, 310, 5, 110, 0, 0, 310, 311, 5, 100, 0, 0, 311, 28, 1, 0, 0, 0, 312, 313, 5, 116, 0, 0, 313, 314, 5, 111, 0, 0, 314, 30, 1, 0, 0, 0, 315, 316, 5, 112, 0, 0, 316, 317, 5, 114, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 118, 0, 0, 319, 320, 5, 97, 0, 0, 320, 321, 5, 116, 0, 0, 321, 322, 5, 101, 0, 0, 322, 32, 1, 0, 0, 0, 323, 324, 5, 115, 0, 0, 324, 325, 5, 104, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 101, 0, 0, 328, 329, 5, 100, 0, 0, 329, 34, 1, 0, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 116, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 116, 0, 0, 334, 335, 5, 101, 0, 0, 335, 36, 1, 0, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 100, 0, 0, 338, 339, 5, 103, 0, 0, 339, 340, 5, 101, 0, 0, 340, 38, 1, 0, 0, 0, 341, 342, 5, 112, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 111, 0, 0, 344, 345, 5, 106, 0, 0, 345, 346, 5, 101, 0, 0, 346, 347, 5, 99, 0, 0, 347, 348, 5, 116, 0, 0, 348, 349, 5, 105, 0, 0, 349, 350, 5, 111, 0, 0, 350, 351, 5, 110, 0, 0, 351, 40, 1, 0, 0, 0, 352, 353, 5, 119, 0, 0, 353, 354, 5, 105, 0, 0, 354, 355, 5, 116, 0, 0, 355, 356, 5, 104, 0, 0, 356, 42, 1, 0, 0, 0, 357, 358, 5, 111, 0, 0, 358, 359, 5, 110, 0, 0, 359, 44, 1, 0, 0, 0, 360, 361, 5, 112, 0, 0, 361, 362, 5, 111, 0, 0, 362, 363, 5, 108, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 99, 0, 0, 365, 366, 5, 121, 0, 0, 366, 46, 1, 0, 0, 0, 367, 368, 5, 100, 0, 0, 368, 369, 5, 101, 0, 0, 369, 370, 5, 102, 0, 0, 370, 371, 5, 97, 0, 0, 371, 372, 5, 117, 0, 0, 372, 373, 5, 108, 0, 0, 373, 374, 5, 116, 0, 0, 374, 48, 1, 0, 0, 0, 375, 376, 5, 115, 0, 0, 376, 377, 5, 111, 0, 0, 377, 378, 5, 117, 0, 0, 378, 379, 5, 114, 0, 0, 379, 380, 5, 99, 0, 0, 380, 381, 5, 101, 0, 0, 381, 50, 1, 0, 0, 0, 382, 383, 5, 114, 0, 0, 383, 384, 5, 101, 0, 0, 384, 385, 5, 112, 0, 0, 385, 386, 5, 111, 0, 0, 386, 387, 5, 115, 0, 0, 387, 388, 5, 105, 0, 0, 388, 389, 5, 116, 0, 0, 389, 390, 5, 111, 0, 0, 390, 391, 5, 114, 0, 0, 391, 392, 5, 121, 0, 0, 392, 52, 1, 0, 0, 0, 393, 394, 5, 99, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 109, 0, 0, 396, 397, 5, 109, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 116, 0, 0, 399, 54, 1, 0, 0, 0, 400, 401, 5, 114, 0, 0, 401, 402, 5, 101, 0, 0, 402, 403, 5, 118, 0, 0, 403, 404, 5, 105, 0, 0, 404, 405, 5, 115, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 111, 0, 0, 407, 408, 5, 110, 0, 0, 408, 56, 1, 0, 0, 0, 409, 410, 5, 105, 0, 0, 410, 411, 5, 100, 0, 0, 411, 58, 1, 0, 0, 0, 412, 413, 5, 100, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 99, 0, 0, 415, 60, 1, 0, 0, 0, 416, 417, 5, 109, 0, 0, 417, 418, 5, 111, 0, 0, 418, 419, 5, 100, 0, 0, 419, 420, 5, 101, 0, 0, 420, 62, 1, 0, 0, 0, 421, 422, 5, 101, 0, 0, 422, 423, 5, 109, 0, 0, 423, 424, 5, 105, 0, 0, 424, 425, 5, 116, 0, 0, 425, 426, 5, 115, 0, 0, 426, 64, 1, 0, 0, 0, 427, 428, 5, 114, 0, 0, 428, 429, 5, 101, 0, 0, 429, 430, 5, 99, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 105, 0, 0, 432, 433, 5, 118, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 114, 0, 0, 435, 66, 1, 0, 0, 0, 436, 437, 5, 114, 0, 0, 437, 438, 5, 101, 0, 0, 438, 439, 5, 113, 0, 0, 439, 440, 5, 117, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 114, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 115, 0, 0, 444, 68, 1, 0, 0, 0, 445, 446, 5, 97, 0, 0, 446, 447, 5, 110, 0, 0, 447, 448, 5, 121, 0, 0, 448, 70, 1, 0, 0, 0, 449, 450, 5, 103, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 116, 0, 0, 452, 72, 1, 0, 0, 0, 453, 454, 5, 115, 0, 0, 454, 455, 5, 101, 0, 0, 455, 456, 5, 116, 0, 0, 456, 74, 1, 0, 0, 0, 457, 458, 5, 119, 0, 0, 458, 459, 5, 97, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 99, 0, 0, 461, 462, 5, 104, 0, 0, 462, 76, 1, 0, 0, 0, 463, 464, 5, 115, 0, 0, 464, 465, 5, 116, 0, 0, 465, 466, 5, 97, 0, 0, 466, 467, 5, 114, 0, 0, 467, 468, 5, 116, 0, 0, 468, 78, 1, 0, 0, 0, 469, 470, 5, 115, 0, 0, 470, 471, 5, 116, 0, 0, 471, 472, 5, 111, 0, 0, 472, 473, 5, 112, 0, 0, 473, 80, 1, 0, 0, 0, 474, 475, 5, 114, 0, 0, 475, 476, 5, 101, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 100, 0, 0, 478, 82, 1, 0, 0, 0, 479, 480, 5, 119, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, 5, 116, 0, 0, 483, 484, 5, 101, 0, 0, 484, 84, 1, 0, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 101, 0, 0, 487, 488, 5, 115, 0, 0, 488, 489, 5, 111, 0, 0, 489, 490, 5, 108, 0, 0, 490, 491, 5, 118, 0, 0, 491, 492, 5, 101, 0, 0, 492, 86, 1, 0, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 111, 0, 0, 495, 496, 5, 110, 0, 0, 496, 497, 5, 110, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 99, 0, 0, 499, 500, 5, 116, 0, 0, 500, 88, 1, 0, 0, 0, 501, 502, 5, 100, 0, 0, 502, 503, 5, 105, 0, 0, 503, 504, 5, 115, 0, 0, 504, 505, 5, 99, 0, 0, 505, 506, 5, 111, 0, 0, 506, 507, 5, 110, 0, 0, 507, 508, 5, 110, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 99, 0, 0, 510, 511, 5, 116, 0, 0, 511, 90, 1, 0, 0, 0, 512, 513, 5, 99, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 108, 0, 0, 515, 516, 5, 108, 0, 0, 516, 92, 1, 0, 0, 0, 517, 518, 5, 119, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 116, 0, 0, 520, 521, 5, 99, 0, 0, 521, 522, 5, 104, 0, 0, 522, 523, 5, 45, 0, 0, 523, 524, 5, 115, 0, 0, 524, 525, 5, 116, 0, 0, 525, 526, 5, 97, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 116, 0, 0, 528, 94, 1, 0, 0, 0, 529, 530, 5, 119, 0, 0, 530, 531, 5, 97, 0, 0, 531, 532, 5, 116, 0, 0, 532, 533, 5, 99, 0, 0, 533, 534, 5, 104, 0, 0, 534, 535, 5, 45, 0, 0, 535, 536, 5, 115, 0, 0, 536, 537, 5, 116, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 112, 0, 0, 539, 96, 1, 0, 0, 0, 540, 541, 5, 115, 0, 0, 541, 542, 5, 117, 0, 0, 542, 543, 5, 98, 0, 0, 543, 544, 5, 115, 0, 0, 544, 545, 5, 99, 0, 0, 545, 546, 5, 114, 0, 0, 546, 547, 5, 105, 0, 0, 547, 548, 5, 98, 0, 0, 548, 549, 5, 101, 0, 0, 549, 98, 1, 0, 0, 0, 550, 551, 5, 117, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 115, 0, 0, 553, 554, 5, 117, 0, 0, 554, 555, 5, 98, 0, 0, 555, 556, 5, 115, 0, 0, 556, 557, 5, 99, 0, 0, 557, 558, 5, 114, 0, 0, 558, 559, 5, 105, 0, 0, 559, 560, 5, 98, 0, 0, 560, 561, 5, 101, 0, 0, 561, 100, 1, 0, 0, 0, 562, 563, 5, 111, 0, 0, 563, 564, 5, 112, 0, 0, 564, 565, 5, 116, 0, 0, 565, 566, 5, 105, 0, 0, 566, 567, 5, 109, 0, 0, 567, 568, 5, 105, 0, 0, 568, 569, 5, 115, 0, 0, 569, 570, 5, 116, 0, 0, 570, 571, 5, 105, 0, 0, 571, 572, 5, 99, 0, 0, 572, 573, 5, 45, 0, 0, 573, 574, 5, 114, 0, 0, 574, 575, 5, 101, 0, 0, 575, 576, 5, 103, 0, 0, 576, 577, 5, 105, 0, 0, 577, 578, 5, 115, 0, 0, 578, 579, 5, 116, 0, 0, 579, 580, 5, 101, 0, 0, 580, 581, 5, 114, 0, 0, 581, 102, 1, 0, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 114, 0, 0, 584, 585, 5, 100, 0, 0, 585, 586, 5, 116, 0, 0, 586, 104, 1, 0, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 112, 0, 0, 589, 590, 5, 116, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 111, 0, 0, 592, 593, 5, 110, 0, 0, 593, 594, 5, 97, 0, 0, 594, 595, 5, 108, 0, 0, 595, 596, 5, 45, 0, 0, 596, 597, 5, 111, 0, 0, 597, 598, 5, 110, 0, 0, 598, 599, 5, 101, 0, 0, 599, 106, 1, 0, 0, 0, 600, 601, 5, 101, 0, 0, 601, 602, 5, 120, 0, 0, 602, 603, 5, 97, 0, 0, 603, 604, 5, 99, 0, 0, 604, 605, 5, 116, 0, 0, 605, 606, 5, 108, 0, 0, 606, 607, 5, 121, 0, 0, 607, 608, 5, 45, 0, 0, 608, 609, 5, 111, 0, 0, 609, 610, 5, 110, 0, 0, 610, 611, 5, 101, 0, 0, 611, 108, 1, 0, 0, 0, 612, 613, 5, 109, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 110, 0, 0, 615, 616, 5, 121, 0, 0, 616, 617, 5, 45, 0, 0, 617, 618, 5, 117, 0, 0, 618, 619, 5, 110, 0, 0, 619, 620, 5, 105, 0, 0, 620, 621, 5, 113, 0, 0, 621, 622, 5, 117, 0, 0, 622, 623, 5, 101, 0, 0, 623, 110, 1, 0, 0, 0, 624, 625, 5, 109, 0, 0, 625, 626, 5, 97, 0, 0, 626, 627, 5, 110, 0, 0, 627, 628, 5, 121, 0, 0, 628, 112, 1, 0, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 114, 0, 0, 631, 632, 5, 100, 0, 0, 632, 633, 5, 101, 0, 0, 633, 634, 5, 114, 0, 0, 634, 635, 5, 101, 0, 0, 635, 636, 5, 100, 0, 0, 636, 114, 1, 0, 0, 0, 637, 638, 5, 117, 0, 0, 638, 639, 5, 110, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 116, 0, 0, 641, 116, 1, 0, 0, 0, 642, 643, 5, 119, 0, 0, 643, 644, 5, 97, 0, 0, 644, 645, 5, 116, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 104, 0, 0, 647, 648, 5, 45, 0, 0, 648, 649, 5, 104, 0, 0, 649, 650, 5, 97, 0, 0, 650, 651, 5, 110, 0, 0, 651, 652, 5, 100, 0, 0, 652, 653, 5, 108, 0, 0, 653, 654, 5, 101, 0, 0, 654, 118, 1, 0, 0, 0, 655, 656, 5, 109, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 115, 0, 0, 659, 660, 5, 97, 0, 0, 660, 661, 5, 103, 0, 0, 661, 662, 5, 101, 0, 0, 662, 120, 1, 0, 0, 0, 663, 664, 5, 97, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 111, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 45, 0, 0, 668, 669, 5, 114, 0, 0, 669, 670, 5, 101, 0, 0, 670, 671, 5, 102, 0, 0, 671, 122, 1, 0, 0, 0, 672, 673, 5, 105, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 116, 0, 0, 675, 676, 5, 101, 0, 0, 676, 677, 5, 114, 0, 0, 677, 678, 5, 102, 0, 0, 678, 679, 5, 97, 0, 0, 679, 680, 5, 99, 0, 0, 680, 681, 5, 101, 0, 0, 681, 682, 5, 45, 0, 0, 682, 683, 5, 114, 0, 0, 683, 684, 5, 101, 0, 0, 684, 685, 5, 102, 0, 0, 685, 124, 1, 0, 0, 0, 686, 687, 5, 111, 0, 0, 687, 688, 5, 112, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 105, 0, 0, 690, 691, 5, 111, 0, 0, 691, 692, 5, 110, 0, 0, 692, 693, 5, 97, 0, 0, 693, 694, 5, 108, 0, 0, 694, 126, 1, 0, 0, 0, 695, 696, 5, 108, 0, 0, 696, 697, 5, 105, 0, 0, 697, 698, 5, 115, 0, 0, 698, 699, 5, 116, 0, 0, 699, 128, 1, 0, 0, 0, 700, 701, 5, 98, 0, 0, 701, 702, 5, 111, 0, 0, 702, 703, 5, 111, 0, 0, 703, 704, 5, 108, 0, 0, 704, 130, 1, 0, 0, 0, 705, 706, 5, 98, 0, 0, 706, 707, 5, 121, 0, 0, 707, 708, 5, 116, 0, 0, 708, 709, 5, 101, 0, 0, 709, 710, 5, 115, 0, 0, 710, 132, 1, 0, 0, 0, 711, 712, 5, 100, 0, 0, 712, 713, 5, 111, 0, 0, 713, 714, 5, 117, 0, 0, 714, 715, 5, 98, 0, 0, 715, 716, 5, 108, 0, 0, 716, 717, 5, 101, 0, 0, 717, 134, 1, 0, 0, 0, 718, 719, 5, 105, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 116, 0, 0, 721, 722, 5, 51, 0, 0, 722, 723, 5, 50, 0, 0, 723, 136, 1, 0, 0, 0, 724, 725, 5, 105, 0, 0, 725, 726, 5, 110, 0, 0, 726, 727, 5, 116, 0, 0, 727, 728, 5, 54, 0, 0, 728, 729, 5, 52, 0, 0, 729, 138, 1, 0, 0, 0, 730, 731, 5, 115, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 114, 0, 0, 733, 734, 5, 105, 0, 0, 734, 735, 5, 110, 0, 0, 735, 736, 5, 103, 0, 0, 736, 140, 1, 0, 0, 0, 737, 738, 5, 117, 0, 0, 738, 739, 5, 105, 0, 0, 739, 740, 5, 110, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 51, 0, 0, 742, 743, 5, 50, 0, 0, 743, 142, 1, 0, 0, 0, 744, 745, 5, 117, 0, 0, 745, 746, 5, 105, 0, 0, 746, 747, 5, 110, 0, 0, 747, 748, 5, 116, 0, 0, 748, 749, 5, 54, 0, 0, 749, 750, 5, 52, 0, 0, 750, 144, 1, 0, 0, 0, 751, 752, 5, 116, 0, 0, 752, 753, 5, 114, 0, 0, 753, 754, 5, 117, 0, 0, 754, 755, 5, 101, 0, 0, 755, 146, 1, 0, 0, 0, 756, 757, 5, 102, 0, 0, 757, 758, 5, 97, 0, 0, 758, 759, 5, 108, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 101, 0, 0, 761, 148, 1, 0, 0, 0, 762, 763, 5, 110, 0, 0, 763, 764, 5, 117, 0, 0, 764, 765, 5, 108, 0, 0, 765, 766, 5, 108, 0, 0, 766, 150, 1, 0, 0, 0, 767, 768, 5, 45, 0, 0, 768, 769, 5, 62, 0, 0, 769, 152, 1, 0, 0, 0, 770, 771, 5, 58, 0, 0, 771, 154, 1, 0, 0, 0, 772, 773, 5, 59, 0, 0, 773, 156, 1, 0, 0, 0, 774, 775, 5, 44, 0, 0, 775, 158, 1, 0, 0, 0, 776, 777, 5, 46, 0, 0, 777, 160, 1, 0, 0, 0, 778, 779, 5, 123, 0, 0, 779, 162, 1, 0, 0, 0, 780, 781, 5, 125, 0, 0, 781, 164, 1, 0, 0, 0, 782, 783, 5, 91, 0, 0, 783, 166, 1, 0, 0, 0, 784, 785, 5, 93, 0, 0, 785, 168, 1, 0, 0, 0, 786, 787, 5, 40, 0, 0, 787, 170, 1, 0, 0, 0, 788, 789, 5, 41, 0, 0, 789, 172, 1, 0, 0, 0, 790, 791, 5, 60, 0, 0, 791, 174, 1, 0, 0, 0, 792, 793, 5, 62, 0, 0, 793, 176, 1, 0, 0, 0, 794, 796, 5, 45, 0, 0, 795, 794, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 799, 7, 0, 0, 0, 798, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 798, 1, 0, 0, 0, 800, 801, 1, 0, 0, 0, 801, 178, 1, 0, 0, 0, 802, 804, 5, 45, 0, 0, 803, 802, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 813, 1, 0, 0, 0, 805, 814, 5, 48, 0, 0, 806, 810, 7, 1, 0, 0, 807, 809, 7, 0, 0, 0, 808, 807, 1, 0, 0, 0, 809, 812, 1, 0, 0, 0, 810, 808, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 813, 805, 1, 0, 0, 0, 813, 806, 1, 0, 0, 0, 814, 821, 1, 0, 0, 0, 815, 817, 5, 46, 0, 0, 816, 818, 7, 0, 0, 0, 817, 816, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 819, 820, 1, 0, 0, 0, 820, 822, 1, 0, 0, 0, 821, 815, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 832, 1, 0, 0, 0, 823, 825, 7, 2, 0, 0, 824, 826, 7, 3, 0, 0, 825, 824, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 828, 1, 0, 0, 0, 827, 829, 7, 0, 0, 0, 828, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 833, 1, 0, 0, 0, 832, 823, 1, 0, 0, 0, 832, 833, 1, 0, 0, 0, 833, 180, 1, 0, 0, 0, 834, 838, 7, 4, 0, 0, 835, 837, 7, 5, 0, 0, 836, 835, 1, 0, 0, 0, 837, 840, 1, 0, 0, 0, 838, 836, 1, 0, 0, 0, 838, 839, 1, 0, 0, 0, 839, 182, 1, 0, 0, 0, 840, 838, 1, 0, 0, 0, 841, 846, 5, 34, 0, 0, 842, 845, 3, 185, 92, 0, 843, 845, 8, 6, 0, 0, 844, 842, 1, 0, 0, 0, 844, 843, 1, 0, 0, 0, 845, 848, 1, 0, 0, 0, 846, 844, 1, 0, 0, 0, 846, 847, 1, 0, 0, 0, 847, 849, 1, 0, 0, 0, 848, 846, 1, 0, 0, 0, 849, 850, 5, 34, 0, 0, 850, 184, 1, 0, 0, 0, 851, 859, 5, 92, 0, 0, 852, 860, 7, 7, 0, 0, 853, 854, 5, 117, 0, 0, 854, 855, 3, 187, 93, 0, 855, 856, 3, 187, 93, 0, 856, 857, 3, 187, 93, 0, 857, 858, 3, 187, 93, 0, 858, 860, 1, 0, 0, 0, 859, 852, 1, 0, 0, 0, 859, 853, 1, 0, 0, 0, 860, 186, 1, 0, 0, 0, 861, 862, 7, 8, 0, 0, 862, 188, 1, 0, 0, 0, 863, 864, 5, 47, 0, 0, 864, 865, 5, 47, 0, 0, 865, 869, 1, 0, 0, 0, 866, 868, 8, 9, 0, 0, 867, 866, 1, 0, 0, 0, 868, 871, 1, 0, 0, 0, 869, 867, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 872, 1, 0, 0, 0, 871, 869, 1, 0, 0, 0, 872, 873, 6, 94, 0, 0, 873, 190, 1, 0, 0, 0, 874, 875, 5, 47, 0, 0, 875, 876, 5, 42, 0, 0, 876, 880, 1, 0, 0, 0, 877, 879, 9, 0, 0, 0, 878, 877, 1, 0, 0, 0, 879, 882, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 881, 883, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 883, 884, 5, 42, 0, 0, 884, 885, 5, 47, 0, 0, 885, 886, 1, 0, 0, 0, 886, 887, 6, 95, 0, 0, 887, 192, 1, 0, 0, 0, 888, 890, 7, 10, 0, 0, 889, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 6, 96, 0, 0, 894, 194, 1, 0, 0, 0, 18, 0, 795, 800, 803, 810, 813, 819, 821, 825, 830, 832, 838, 844, 846, 859, 869, 880, 891, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 100, 937, 6, -1, 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, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 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, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 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, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 3, 93, 838, 8, 93, 1, 93, 4, 93, 841, 8, 93, 11, 93, 12, 93, 842, 1, 94, 3, 94, 846, 8, 94, 1, 94, 1, 94, 1, 94, 5, 94, 851, 8, 94, 10, 94, 12, 94, 854, 9, 94, 3, 94, 856, 8, 94, 1, 94, 1, 94, 4, 94, 860, 8, 94, 11, 94, 12, 94, 861, 3, 94, 864, 8, 94, 1, 94, 1, 94, 3, 94, 868, 8, 94, 1, 94, 4, 94, 871, 8, 94, 11, 94, 12, 94, 872, 3, 94, 875, 8, 94, 1, 95, 1, 95, 5, 95, 879, 8, 95, 10, 95, 12, 95, 882, 9, 95, 1, 96, 1, 96, 1, 96, 5, 96, 887, 8, 96, 10, 96, 12, 96, 890, 9, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 902, 8, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 5, 99, 910, 8, 99, 10, 99, 12, 99, 913, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 5, 100, 921, 8, 100, 10, 100, 12, 100, 924, 9, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 4, 101, 932, 8, 101, 11, 101, 12, 101, 933, 1, 101, 1, 101, 1, 922, 0, 102, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 0, 197, 0, 199, 98, 201, 99, 203, 100, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 951, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 1, 205, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 7, 230, 1, 0, 0, 0, 9, 241, 1, 0, 0, 0, 11, 249, 1, 0, 0, 0, 13, 255, 1, 0, 0, 0, 15, 264, 1, 0, 0, 0, 17, 274, 1, 0, 0, 0, 19, 283, 1, 0, 0, 0, 21, 295, 1, 0, 0, 0, 23, 306, 1, 0, 0, 0, 25, 314, 1, 0, 0, 0, 27, 317, 1, 0, 0, 0, 29, 322, 1, 0, 0, 0, 31, 325, 1, 0, 0, 0, 33, 333, 1, 0, 0, 0, 35, 340, 1, 0, 0, 0, 37, 346, 1, 0, 0, 0, 39, 351, 1, 0, 0, 0, 41, 362, 1, 0, 0, 0, 43, 367, 1, 0, 0, 0, 45, 373, 1, 0, 0, 0, 47, 377, 1, 0, 0, 0, 49, 389, 1, 0, 0, 0, 51, 392, 1, 0, 0, 0, 53, 399, 1, 0, 0, 0, 55, 402, 1, 0, 0, 0, 57, 409, 1, 0, 0, 0, 59, 417, 1, 0, 0, 0, 61, 424, 1, 0, 0, 0, 63, 435, 1, 0, 0, 0, 65, 442, 1, 0, 0, 0, 67, 451, 1, 0, 0, 0, 69, 454, 1, 0, 0, 0, 71, 458, 1, 0, 0, 0, 73, 463, 1, 0, 0, 0, 75, 469, 1, 0, 0, 0, 77, 478, 1, 0, 0, 0, 79, 487, 1, 0, 0, 0, 81, 491, 1, 0, 0, 0, 83, 495, 1, 0, 0, 0, 85, 499, 1, 0, 0, 0, 87, 505, 1, 0, 0, 0, 89, 511, 1, 0, 0, 0, 91, 516, 1, 0, 0, 0, 93, 521, 1, 0, 0, 0, 95, 527, 1, 0, 0, 0, 97, 535, 1, 0, 0, 0, 99, 543, 1, 0, 0, 0, 101, 554, 1, 0, 0, 0, 103, 559, 1, 0, 0, 0, 105, 571, 1, 0, 0, 0, 107, 582, 1, 0, 0, 0, 109, 592, 1, 0, 0, 0, 111, 604, 1, 0, 0, 0, 113, 624, 1, 0, 0, 0, 115, 629, 1, 0, 0, 0, 117, 642, 1, 0, 0, 0, 119, 654, 1, 0, 0, 0, 121, 666, 1, 0, 0, 0, 123, 671, 1, 0, 0, 0, 125, 679, 1, 0, 0, 0, 127, 684, 1, 0, 0, 0, 129, 697, 1, 0, 0, 0, 131, 705, 1, 0, 0, 0, 133, 714, 1, 0, 0, 0, 135, 728, 1, 0, 0, 0, 137, 737, 1, 0, 0, 0, 139, 742, 1, 0, 0, 0, 141, 747, 1, 0, 0, 0, 143, 753, 1, 0, 0, 0, 145, 760, 1, 0, 0, 0, 147, 766, 1, 0, 0, 0, 149, 772, 1, 0, 0, 0, 151, 779, 1, 0, 0, 0, 153, 786, 1, 0, 0, 0, 155, 793, 1, 0, 0, 0, 157, 798, 1, 0, 0, 0, 159, 804, 1, 0, 0, 0, 161, 809, 1, 0, 0, 0, 163, 812, 1, 0, 0, 0, 165, 814, 1, 0, 0, 0, 167, 816, 1, 0, 0, 0, 169, 818, 1, 0, 0, 0, 171, 820, 1, 0, 0, 0, 173, 822, 1, 0, 0, 0, 175, 824, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 828, 1, 0, 0, 0, 181, 830, 1, 0, 0, 0, 183, 832, 1, 0, 0, 0, 185, 834, 1, 0, 0, 0, 187, 837, 1, 0, 0, 0, 189, 845, 1, 0, 0, 0, 191, 876, 1, 0, 0, 0, 193, 883, 1, 0, 0, 0, 195, 893, 1, 0, 0, 0, 197, 903, 1, 0, 0, 0, 199, 905, 1, 0, 0, 0, 201, 916, 1, 0, 0, 0, 203, 931, 1, 0, 0, 0, 205, 206, 5, 119, 0, 0, 206, 207, 5, 111, 0, 0, 207, 208, 5, 114, 0, 0, 208, 209, 5, 107, 0, 0, 209, 210, 5, 115, 0, 0, 210, 211, 5, 112, 0, 0, 211, 212, 5, 97, 0, 0, 212, 213, 5, 99, 0, 0, 213, 214, 5, 101, 0, 0, 214, 2, 1, 0, 0, 0, 215, 216, 5, 97, 0, 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 111, 0, 0, 218, 219, 5, 109, 0, 0, 219, 4, 1, 0, 0, 0, 220, 221, 5, 105, 0, 0, 221, 222, 5, 110, 0, 0, 222, 223, 5, 116, 0, 0, 223, 224, 5, 101, 0, 0, 224, 225, 5, 114, 0, 0, 225, 226, 5, 102, 0, 0, 226, 227, 5, 97, 0, 0, 227, 228, 5, 99, 0, 0, 228, 229, 5, 101, 0, 0, 229, 6, 1, 0, 0, 0, 230, 231, 5, 105, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 5, 116, 0, 0, 233, 234, 5, 101, 0, 0, 234, 235, 5, 114, 0, 0, 235, 236, 5, 102, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 99, 0, 0, 238, 239, 5, 101, 0, 0, 239, 240, 5, 115, 0, 0, 240, 8, 1, 0, 0, 0, 241, 242, 5, 112, 0, 0, 242, 243, 5, 97, 0, 0, 243, 244, 5, 99, 0, 0, 244, 245, 5, 107, 0, 0, 245, 246, 5, 97, 0, 0, 246, 247, 5, 103, 0, 0, 247, 248, 5, 101, 0, 0, 248, 10, 1, 0, 0, 0, 249, 250, 5, 118, 0, 0, 250, 251, 5, 97, 0, 0, 251, 252, 5, 108, 0, 0, 252, 253, 5, 117, 0, 0, 253, 254, 5, 101, 0, 0, 254, 12, 1, 0, 0, 0, 255, 256, 5, 114, 0, 0, 256, 257, 5, 101, 0, 0, 257, 258, 5, 108, 0, 0, 258, 259, 5, 97, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 111, 0, 0, 262, 263, 5, 110, 0, 0, 263, 14, 1, 0, 0, 0, 264, 265, 5, 111, 0, 0, 265, 266, 5, 112, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 97, 0, 0, 269, 270, 5, 116, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 111, 0, 0, 272, 273, 5, 110, 0, 0, 273, 16, 1, 0, 0, 0, 274, 275, 5, 102, 0, 0, 275, 276, 5, 117, 0, 0, 276, 277, 5, 110, 0, 0, 277, 278, 5, 99, 0, 0, 278, 279, 5, 116, 0, 0, 279, 280, 5, 105, 0, 0, 280, 281, 5, 111, 0, 0, 281, 282, 5, 110, 0, 0, 282, 18, 1, 0, 0, 0, 283, 284, 5, 99, 0, 0, 284, 285, 5, 111, 0, 0, 285, 286, 5, 110, 0, 0, 286, 287, 5, 115, 0, 0, 287, 288, 5, 116, 0, 0, 288, 289, 5, 114, 0, 0, 289, 290, 5, 117, 0, 0, 290, 291, 5, 99, 0, 0, 291, 292, 5, 116, 0, 0, 292, 293, 5, 111, 0, 0, 293, 294, 5, 114, 0, 0, 294, 20, 1, 0, 0, 0, 295, 296, 5, 99, 0, 0, 296, 297, 5, 111, 0, 0, 297, 298, 5, 110, 0, 0, 298, 299, 5, 115, 0, 0, 299, 300, 5, 116, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 117, 0, 0, 302, 303, 5, 99, 0, 0, 303, 304, 5, 116, 0, 0, 304, 305, 5, 115, 0, 0, 305, 22, 1, 0, 0, 0, 306, 307, 5, 99, 0, 0, 307, 308, 5, 111, 0, 0, 308, 309, 5, 110, 0, 0, 309, 310, 5, 102, 0, 0, 310, 311, 5, 111, 0, 0, 311, 312, 5, 114, 0, 0, 312, 313, 5, 109, 0, 0, 313, 24, 1, 0, 0, 0, 314, 315, 5, 97, 0, 0, 315, 316, 5, 115, 0, 0, 316, 26, 1, 0, 0, 0, 317, 318, 5, 98, 0, 0, 318, 319, 5, 105, 0, 0, 319, 320, 5, 110, 0, 0, 320, 321, 5, 100, 0, 0, 321, 28, 1, 0, 0, 0, 322, 323, 5, 116, 0, 0, 323, 324, 5, 111, 0, 0, 324, 30, 1, 0, 0, 0, 325, 326, 5, 112, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 105, 0, 0, 328, 329, 5, 118, 0, 0, 329, 330, 5, 97, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 101, 0, 0, 332, 32, 1, 0, 0, 0, 333, 334, 5, 115, 0, 0, 334, 335, 5, 104, 0, 0, 335, 336, 5, 97, 0, 0, 336, 337, 5, 114, 0, 0, 337, 338, 5, 101, 0, 0, 338, 339, 5, 100, 0, 0, 339, 34, 1, 0, 0, 0, 340, 341, 5, 115, 0, 0, 341, 342, 5, 116, 0, 0, 342, 343, 5, 97, 0, 0, 343, 344, 5, 116, 0, 0, 344, 345, 5, 101, 0, 0, 345, 36, 1, 0, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 100, 0, 0, 348, 349, 5, 103, 0, 0, 349, 350, 5, 101, 0, 0, 350, 38, 1, 0, 0, 0, 351, 352, 5, 112, 0, 0, 352, 353, 5, 114, 0, 0, 353, 354, 5, 111, 0, 0, 354, 355, 5, 106, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 99, 0, 0, 357, 358, 5, 116, 0, 0, 358, 359, 5, 105, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 110, 0, 0, 361, 40, 1, 0, 0, 0, 362, 363, 5, 119, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 116, 0, 0, 365, 366, 5, 104, 0, 0, 366, 42, 1, 0, 0, 0, 367, 368, 5, 117, 0, 0, 368, 369, 5, 115, 0, 0, 369, 370, 5, 105, 0, 0, 370, 371, 5, 110, 0, 0, 371, 372, 5, 103, 0, 0, 372, 44, 1, 0, 0, 0, 373, 374, 5, 118, 0, 0, 374, 375, 5, 105, 0, 0, 375, 376, 5, 97, 0, 0, 376, 46, 1, 0, 0, 0, 377, 378, 5, 109, 0, 0, 378, 379, 5, 97, 0, 0, 379, 380, 5, 116, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 105, 0, 0, 383, 384, 5, 97, 0, 0, 384, 385, 5, 108, 0, 0, 385, 386, 5, 105, 0, 0, 386, 387, 5, 122, 0, 0, 387, 388, 5, 101, 0, 0, 388, 48, 1, 0, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 102, 0, 0, 391, 50, 1, 0, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 98, 0, 0, 394, 395, 5, 115, 0, 0, 395, 396, 5, 101, 0, 0, 396, 397, 5, 110, 0, 0, 397, 398, 5, 116, 0, 0, 398, 52, 1, 0, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 110, 0, 0, 401, 54, 1, 0, 0, 0, 402, 403, 5, 112, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 99, 0, 0, 407, 408, 5, 121, 0, 0, 408, 56, 1, 0, 0, 0, 409, 410, 5, 100, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 102, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 117, 0, 0, 414, 415, 5, 108, 0, 0, 415, 416, 5, 116, 0, 0, 416, 58, 1, 0, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 117, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 101, 0, 0, 423, 60, 1, 0, 0, 0, 424, 425, 5, 114, 0, 0, 425, 426, 5, 101, 0, 0, 426, 427, 5, 112, 0, 0, 427, 428, 5, 111, 0, 0, 428, 429, 5, 115, 0, 0, 429, 430, 5, 105, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 111, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 5, 121, 0, 0, 434, 62, 1, 0, 0, 0, 435, 436, 5, 99, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 109, 0, 0, 438, 439, 5, 109, 0, 0, 439, 440, 5, 105, 0, 0, 440, 441, 5, 116, 0, 0, 441, 64, 1, 0, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 105, 0, 0, 446, 447, 5, 115, 0, 0, 447, 448, 5, 105, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 110, 0, 0, 450, 66, 1, 0, 0, 0, 451, 452, 5, 105, 0, 0, 452, 453, 5, 100, 0, 0, 453, 68, 1, 0, 0, 0, 454, 455, 5, 100, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 99, 0, 0, 457, 70, 1, 0, 0, 0, 458, 459, 5, 109, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 100, 0, 0, 461, 462, 5, 101, 0, 0, 462, 72, 1, 0, 0, 0, 463, 464, 5, 101, 0, 0, 464, 465, 5, 109, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 115, 0, 0, 468, 74, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 101, 0, 0, 471, 472, 5, 99, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 105, 0, 0, 474, 475, 5, 118, 0, 0, 475, 476, 5, 101, 0, 0, 476, 477, 5, 114, 0, 0, 477, 76, 1, 0, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 113, 0, 0, 481, 482, 5, 117, 0, 0, 482, 483, 5, 105, 0, 0, 483, 484, 5, 114, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 115, 0, 0, 486, 78, 1, 0, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 110, 0, 0, 489, 490, 5, 121, 0, 0, 490, 80, 1, 0, 0, 0, 491, 492, 5, 103, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 116, 0, 0, 494, 82, 1, 0, 0, 0, 495, 496, 5, 115, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 116, 0, 0, 498, 84, 1, 0, 0, 0, 499, 500, 5, 119, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 116, 0, 0, 502, 503, 5, 99, 0, 0, 503, 504, 5, 104, 0, 0, 504, 86, 1, 0, 0, 0, 505, 506, 5, 115, 0, 0, 506, 507, 5, 116, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 114, 0, 0, 509, 510, 5, 116, 0, 0, 510, 88, 1, 0, 0, 0, 511, 512, 5, 115, 0, 0, 512, 513, 5, 116, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 112, 0, 0, 515, 90, 1, 0, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 100, 0, 0, 520, 92, 1, 0, 0, 0, 521, 522, 5, 119, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 105, 0, 0, 524, 525, 5, 116, 0, 0, 525, 526, 5, 101, 0, 0, 526, 94, 1, 0, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 101, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 108, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 101, 0, 0, 534, 96, 1, 0, 0, 0, 535, 536, 5, 99, 0, 0, 536, 537, 5, 111, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 110, 0, 0, 539, 540, 5, 101, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 116, 0, 0, 542, 98, 1, 0, 0, 0, 543, 544, 5, 100, 0, 0, 544, 545, 5, 105, 0, 0, 545, 546, 5, 115, 0, 0, 546, 547, 5, 99, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 110, 0, 0, 549, 550, 5, 110, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 116, 0, 0, 553, 100, 1, 0, 0, 0, 554, 555, 5, 99, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 5, 108, 0, 0, 557, 558, 5, 108, 0, 0, 558, 102, 1, 0, 0, 0, 559, 560, 5, 119, 0, 0, 560, 561, 5, 97, 0, 0, 561, 562, 5, 116, 0, 0, 562, 563, 5, 99, 0, 0, 563, 564, 5, 104, 0, 0, 564, 565, 5, 45, 0, 0, 565, 566, 5, 115, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 114, 0, 0, 569, 570, 5, 116, 0, 0, 570, 104, 1, 0, 0, 0, 571, 572, 5, 119, 0, 0, 572, 573, 5, 97, 0, 0, 573, 574, 5, 116, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 104, 0, 0, 576, 577, 5, 45, 0, 0, 577, 578, 5, 115, 0, 0, 578, 579, 5, 116, 0, 0, 579, 580, 5, 111, 0, 0, 580, 581, 5, 112, 0, 0, 581, 106, 1, 0, 0, 0, 582, 583, 5, 115, 0, 0, 583, 584, 5, 117, 0, 0, 584, 585, 5, 98, 0, 0, 585, 586, 5, 115, 0, 0, 586, 587, 5, 99, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 5, 105, 0, 0, 589, 590, 5, 98, 0, 0, 590, 591, 5, 101, 0, 0, 591, 108, 1, 0, 0, 0, 592, 593, 5, 117, 0, 0, 593, 594, 5, 110, 0, 0, 594, 595, 5, 115, 0, 0, 595, 596, 5, 117, 0, 0, 596, 597, 5, 98, 0, 0, 597, 598, 5, 115, 0, 0, 598, 599, 5, 99, 0, 0, 599, 600, 5, 114, 0, 0, 600, 601, 5, 105, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 101, 0, 0, 603, 110, 1, 0, 0, 0, 604, 605, 5, 111, 0, 0, 605, 606, 5, 112, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 105, 0, 0, 608, 609, 5, 109, 0, 0, 609, 610, 5, 105, 0, 0, 610, 611, 5, 115, 0, 0, 611, 612, 5, 116, 0, 0, 612, 613, 5, 105, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 45, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 5, 101, 0, 0, 617, 618, 5, 103, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 115, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 112, 1, 0, 0, 0, 624, 625, 5, 99, 0, 0, 625, 626, 5, 114, 0, 0, 626, 627, 5, 100, 0, 0, 627, 628, 5, 116, 0, 0, 628, 114, 1, 0, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 112, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 111, 0, 0, 634, 635, 5, 110, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 45, 0, 0, 638, 639, 5, 111, 0, 0, 639, 640, 5, 110, 0, 0, 640, 641, 5, 101, 0, 0, 641, 116, 1, 0, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 120, 0, 0, 644, 645, 5, 97, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 116, 0, 0, 647, 648, 5, 108, 0, 0, 648, 649, 5, 121, 0, 0, 649, 650, 5, 45, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 110, 0, 0, 652, 653, 5, 101, 0, 0, 653, 118, 1, 0, 0, 0, 654, 655, 5, 109, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 110, 0, 0, 657, 658, 5, 121, 0, 0, 658, 659, 5, 45, 0, 0, 659, 660, 5, 117, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 113, 0, 0, 663, 664, 5, 117, 0, 0, 664, 665, 5, 101, 0, 0, 665, 120, 1, 0, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 110, 0, 0, 669, 670, 5, 121, 0, 0, 670, 122, 1, 0, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 100, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 114, 0, 0, 676, 677, 5, 101, 0, 0, 677, 678, 5, 100, 0, 0, 678, 124, 1, 0, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 116, 0, 0, 683, 126, 1, 0, 0, 0, 684, 685, 5, 119, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 99, 0, 0, 688, 689, 5, 104, 0, 0, 689, 690, 5, 45, 0, 0, 690, 691, 5, 104, 0, 0, 691, 692, 5, 97, 0, 0, 692, 693, 5, 110, 0, 0, 693, 694, 5, 100, 0, 0, 694, 695, 5, 108, 0, 0, 695, 696, 5, 101, 0, 0, 696, 128, 1, 0, 0, 0, 697, 698, 5, 109, 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 701, 5, 115, 0, 0, 701, 702, 5, 97, 0, 0, 702, 703, 5, 103, 0, 0, 703, 704, 5, 101, 0, 0, 704, 130, 1, 0, 0, 0, 705, 706, 5, 97, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 109, 0, 0, 709, 710, 5, 45, 0, 0, 710, 711, 5, 114, 0, 0, 711, 712, 5, 101, 0, 0, 712, 713, 5, 102, 0, 0, 713, 132, 1, 0, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 110, 0, 0, 716, 717, 5, 116, 0, 0, 717, 718, 5, 101, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 102, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 99, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 45, 0, 0, 724, 725, 5, 114, 0, 0, 725, 726, 5, 101, 0, 0, 726, 727, 5, 102, 0, 0, 727, 134, 1, 0, 0, 0, 728, 729, 5, 111, 0, 0, 729, 730, 5, 112, 0, 0, 730, 731, 5, 116, 0, 0, 731, 732, 5, 105, 0, 0, 732, 733, 5, 111, 0, 0, 733, 734, 5, 110, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 108, 0, 0, 736, 136, 1, 0, 0, 0, 737, 738, 5, 108, 0, 0, 738, 739, 5, 105, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 138, 1, 0, 0, 0, 742, 743, 5, 98, 0, 0, 743, 744, 5, 111, 0, 0, 744, 745, 5, 111, 0, 0, 745, 746, 5, 108, 0, 0, 746, 140, 1, 0, 0, 0, 747, 748, 5, 98, 0, 0, 748, 749, 5, 121, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 5, 115, 0, 0, 752, 142, 1, 0, 0, 0, 753, 754, 5, 100, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 117, 0, 0, 756, 757, 5, 98, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 101, 0, 0, 759, 144, 1, 0, 0, 0, 760, 761, 5, 105, 0, 0, 761, 762, 5, 110, 0, 0, 762, 763, 5, 116, 0, 0, 763, 764, 5, 51, 0, 0, 764, 765, 5, 50, 0, 0, 765, 146, 1, 0, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 110, 0, 0, 768, 769, 5, 116, 0, 0, 769, 770, 5, 54, 0, 0, 770, 771, 5, 52, 0, 0, 771, 148, 1, 0, 0, 0, 772, 773, 5, 115, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 110, 0, 0, 777, 778, 5, 103, 0, 0, 778, 150, 1, 0, 0, 0, 779, 780, 5, 117, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 51, 0, 0, 784, 785, 5, 50, 0, 0, 785, 152, 1, 0, 0, 0, 786, 787, 5, 117, 0, 0, 787, 788, 5, 105, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 54, 0, 0, 791, 792, 5, 52, 0, 0, 792, 154, 1, 0, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, 5, 117, 0, 0, 796, 797, 5, 101, 0, 0, 797, 156, 1, 0, 0, 0, 798, 799, 5, 102, 0, 0, 799, 800, 5, 97, 0, 0, 800, 801, 5, 108, 0, 0, 801, 802, 5, 115, 0, 0, 802, 803, 5, 101, 0, 0, 803, 158, 1, 0, 0, 0, 804, 805, 5, 110, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 108, 0, 0, 808, 160, 1, 0, 0, 0, 809, 810, 5, 45, 0, 0, 810, 811, 5, 62, 0, 0, 811, 162, 1, 0, 0, 0, 812, 813, 5, 58, 0, 0, 813, 164, 1, 0, 0, 0, 814, 815, 5, 59, 0, 0, 815, 166, 1, 0, 0, 0, 816, 817, 5, 44, 0, 0, 817, 168, 1, 0, 0, 0, 818, 819, 5, 46, 0, 0, 819, 170, 1, 0, 0, 0, 820, 821, 5, 123, 0, 0, 821, 172, 1, 0, 0, 0, 822, 823, 5, 125, 0, 0, 823, 174, 1, 0, 0, 0, 824, 825, 5, 91, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 93, 0, 0, 827, 178, 1, 0, 0, 0, 828, 829, 5, 40, 0, 0, 829, 180, 1, 0, 0, 0, 830, 831, 5, 41, 0, 0, 831, 182, 1, 0, 0, 0, 832, 833, 5, 60, 0, 0, 833, 184, 1, 0, 0, 0, 834, 835, 5, 62, 0, 0, 835, 186, 1, 0, 0, 0, 836, 838, 5, 45, 0, 0, 837, 836, 1, 0, 0, 0, 837, 838, 1, 0, 0, 0, 838, 840, 1, 0, 0, 0, 839, 841, 7, 0, 0, 0, 840, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 188, 1, 0, 0, 0, 844, 846, 5, 45, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 855, 1, 0, 0, 0, 847, 856, 5, 48, 0, 0, 848, 852, 7, 1, 0, 0, 849, 851, 7, 0, 0, 0, 850, 849, 1, 0, 0, 0, 851, 854, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 855, 847, 1, 0, 0, 0, 855, 848, 1, 0, 0, 0, 856, 863, 1, 0, 0, 0, 857, 859, 5, 46, 0, 0, 858, 860, 7, 0, 0, 0, 859, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 857, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 874, 1, 0, 0, 0, 865, 867, 7, 2, 0, 0, 866, 868, 7, 3, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 7, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 1, 0, 0, 0, 874, 865, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 190, 1, 0, 0, 0, 876, 880, 7, 4, 0, 0, 877, 879, 7, 5, 0, 0, 878, 877, 1, 0, 0, 0, 879, 882, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 192, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 883, 888, 5, 34, 0, 0, 884, 887, 3, 195, 97, 0, 885, 887, 8, 6, 0, 0, 886, 884, 1, 0, 0, 0, 886, 885, 1, 0, 0, 0, 887, 890, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 891, 892, 5, 34, 0, 0, 892, 194, 1, 0, 0, 0, 893, 901, 5, 92, 0, 0, 894, 902, 7, 7, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 3, 197, 98, 0, 897, 898, 3, 197, 98, 0, 898, 899, 3, 197, 98, 0, 899, 900, 3, 197, 98, 0, 900, 902, 1, 0, 0, 0, 901, 894, 1, 0, 0, 0, 901, 895, 1, 0, 0, 0, 902, 196, 1, 0, 0, 0, 903, 904, 7, 8, 0, 0, 904, 198, 1, 0, 0, 0, 905, 906, 5, 47, 0, 0, 906, 907, 5, 47, 0, 0, 907, 911, 1, 0, 0, 0, 908, 910, 8, 9, 0, 0, 909, 908, 1, 0, 0, 0, 910, 913, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 914, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 914, 915, 6, 99, 0, 0, 915, 200, 1, 0, 0, 0, 916, 917, 5, 47, 0, 0, 917, 918, 5, 42, 0, 0, 918, 922, 1, 0, 0, 0, 919, 921, 9, 0, 0, 0, 920, 919, 1, 0, 0, 0, 921, 924, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 925, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 925, 926, 5, 42, 0, 0, 926, 927, 5, 47, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 6, 100, 0, 0, 929, 202, 1, 0, 0, 0, 930, 932, 7, 10, 0, 0, 931, 930, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 101, 0, 0, 936, 204, 1, 0, 0, 0, 18, 0, 837, 842, 845, 852, 855, 861, 863, 867, 872, 874, 880, 886, 888, 901, 911, 922, 933, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index ff0a567..22f078e 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -19,80 +19,85 @@ STATE=18 EDGE=19 PROJECTION=20 WITH=21 -ON=22 -POLICY=23 -DEFAULT=24 -SOURCE=25 -REPOSITORY=26 -COMMIT=27 -REVISION=28 -ID=29 -DOC=30 -MODE=31 -EMITS=32 -RECEIVER=33 -REQUIRES=34 -ANY=35 -GET=36 -SET=37 -WATCH=38 -START=39 -STOP=40 -READ=41 -WRITE=42 -RESOLVE=43 -CONNECT=44 -DISCONNECT=45 -CALL=46 -WATCH_START=47 -WATCH_STOP=48 -SUBSCRIBE=49 -UNSUBSCRIBE=50 -OPTIMISTIC_REGISTER=51 -CRDT=52 -OPTIONAL_ONE=53 -EXACTLY_ONE=54 -MANY_UNIQUE=55 -MANY=56 -ORDERED=57 -UNIT=58 -WATCH_HANDLE=59 -MESSAGE=60 -ATOM_REF=61 -INTERFACE_REF=62 -OPTIONAL=63 -LIST=64 -BOOL=65 -BYTES=66 -DOUBLE=67 -INT32=68 -INT64=69 -STRING=70 -UINT32=71 -UINT64=72 -TRUE=73 -FALSE=74 -NULL=75 -ARROW=76 -COLON=77 -SEMI=78 -COMMA=79 -DOT=80 -LBRACE=81 -RBRACE=82 -LBRACK=83 -RBRACK=84 -LPAREN=85 -RPAREN=86 -LT=87 -GT=88 -INTEGER=89 -JSON_NUMBER=90 -IDENTIFIER=91 -STRING_LITERAL=92 -LINE_COMMENT=93 -BLOCK_COMMENT=94 -WS=95 +USING=22 +VIA=23 +MATERIALIZE=24 +IF=25 +ABSENT=26 +ON=27 +POLICY=28 +DEFAULT=29 +SOURCE=30 +REPOSITORY=31 +COMMIT=32 +REVISION=33 +ID=34 +DOC=35 +MODE=36 +EMITS=37 +RECEIVER=38 +REQUIRES=39 +ANY=40 +GET=41 +SET=42 +WATCH=43 +START=44 +STOP=45 +READ=46 +WRITE=47 +RESOLVE=48 +CONNECT=49 +DISCONNECT=50 +CALL=51 +WATCH_START=52 +WATCH_STOP=53 +SUBSCRIBE=54 +UNSUBSCRIBE=55 +OPTIMISTIC_REGISTER=56 +CRDT=57 +OPTIONAL_ONE=58 +EXACTLY_ONE=59 +MANY_UNIQUE=60 +MANY=61 +ORDERED=62 +UNIT=63 +WATCH_HANDLE=64 +MESSAGE=65 +ATOM_REF=66 +INTERFACE_REF=67 +OPTIONAL=68 +LIST=69 +BOOL=70 +BYTES=71 +DOUBLE=72 +INT32=73 +INT64=74 +STRING=75 +UINT32=76 +UINT64=77 +TRUE=78 +FALSE=79 +NULL=80 +ARROW=81 +COLON=82 +SEMI=83 +COMMA=84 +DOT=85 +LBRACE=86 +RBRACE=87 +LBRACK=88 +RBRACK=89 +LPAREN=90 +RPAREN=91 +LT=92 +GT=93 +INTEGER=94 +JSON_NUMBER=95 +IDENTIFIER=96 +STRING_LITERAL=97 +LINE_COMMENT=98 +BLOCK_COMMENT=99 +WS=100 'workspace'=1 'atom'=2 'interface'=3 @@ -114,70 +119,75 @@ WS=95 'edge'=19 'projection'=20 'with'=21 -'on'=22 -'policy'=23 -'default'=24 -'source'=25 -'repository'=26 -'commit'=27 -'revision'=28 -'id'=29 -'doc'=30 -'mode'=31 -'emits'=32 -'receiver'=33 -'requires'=34 -'any'=35 -'get'=36 -'set'=37 -'watch'=38 -'start'=39 -'stop'=40 -'read'=41 -'write'=42 -'resolve'=43 -'connect'=44 -'disconnect'=45 -'call'=46 -'watch-start'=47 -'watch-stop'=48 -'subscribe'=49 -'unsubscribe'=50 -'optimistic-register'=51 -'crdt'=52 -'optional-one'=53 -'exactly-one'=54 -'many-unique'=55 -'many'=56 -'ordered'=57 -'unit'=58 -'watch-handle'=59 -'message'=60 -'atom-ref'=61 -'interface-ref'=62 -'optional'=63 -'list'=64 -'bool'=65 -'bytes'=66 -'double'=67 -'int32'=68 -'int64'=69 -'string'=70 -'uint32'=71 -'uint64'=72 -'true'=73 -'false'=74 -'null'=75 -'->'=76 -':'=77 -';'=78 -','=79 -'.'=80 -'{'=81 -'}'=82 -'['=83 -']'=84 -'('=85 -')'=86 -'<'=87 -'>'=88 +'using'=22 +'via'=23 +'materialize'=24 +'if'=25 +'absent'=26 +'on'=27 +'policy'=28 +'default'=29 +'source'=30 +'repository'=31 +'commit'=32 +'revision'=33 +'id'=34 +'doc'=35 +'mode'=36 +'emits'=37 +'receiver'=38 +'requires'=39 +'any'=40 +'get'=41 +'set'=42 +'watch'=43 +'start'=44 +'stop'=45 +'read'=46 +'write'=47 +'resolve'=48 +'connect'=49 +'disconnect'=50 +'call'=51 +'watch-start'=52 +'watch-stop'=53 +'subscribe'=54 +'unsubscribe'=55 +'optimistic-register'=56 +'crdt'=57 +'optional-one'=58 +'exactly-one'=59 +'many-unique'=60 +'many'=61 +'ordered'=62 +'unit'=63 +'watch-handle'=64 +'message'=65 +'atom-ref'=66 +'interface-ref'=67 +'optional'=68 +'list'=69 +'bool'=70 +'bytes'=71 +'double'=72 +'int32'=73 +'int64'=74 +'string'=75 +'uint32'=76 +'uint64'=77 +'true'=78 +'false'=79 +'null'=80 +'->'=81 +':'=82 +';'=83 +','=84 +'.'=85 +'{'=86 +'}'=87 +'['=88 +']'=89 +'('=90 +')'=91 +'<'=92 +'>'=93 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index b212566..b00eebb 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -25,80 +25,85 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly EDGE = 19; public static readonly PROJECTION = 20; public static readonly WITH = 21; - public static readonly ON = 22; - public static readonly POLICY = 23; - public static readonly DEFAULT = 24; - public static readonly SOURCE = 25; - public static readonly REPOSITORY = 26; - public static readonly COMMIT = 27; - public static readonly REVISION = 28; - public static readonly ID = 29; - public static readonly DOC = 30; - public static readonly MODE = 31; - public static readonly EMITS = 32; - public static readonly RECEIVER = 33; - public static readonly REQUIRES = 34; - public static readonly ANY = 35; - public static readonly GET = 36; - public static readonly SET = 37; - public static readonly WATCH = 38; - public static readonly START = 39; - public static readonly STOP = 40; - public static readonly READ = 41; - public static readonly WRITE = 42; - public static readonly RESOLVE = 43; - public static readonly CONNECT = 44; - public static readonly DISCONNECT = 45; - public static readonly CALL = 46; - public static readonly WATCH_START = 47; - public static readonly WATCH_STOP = 48; - public static readonly SUBSCRIBE = 49; - public static readonly UNSUBSCRIBE = 50; - public static readonly OPTIMISTIC_REGISTER = 51; - public static readonly CRDT = 52; - public static readonly OPTIONAL_ONE = 53; - public static readonly EXACTLY_ONE = 54; - public static readonly MANY_UNIQUE = 55; - public static readonly MANY = 56; - public static readonly ORDERED = 57; - public static readonly UNIT = 58; - public static readonly WATCH_HANDLE = 59; - public static readonly MESSAGE = 60; - public static readonly ATOM_REF = 61; - public static readonly INTERFACE_REF = 62; - public static readonly OPTIONAL = 63; - public static readonly LIST = 64; - public static readonly BOOL = 65; - public static readonly BYTES = 66; - public static readonly DOUBLE = 67; - public static readonly INT32 = 68; - public static readonly INT64 = 69; - public static readonly STRING = 70; - public static readonly UINT32 = 71; - public static readonly UINT64 = 72; - public static readonly TRUE = 73; - public static readonly FALSE = 74; - public static readonly NULL = 75; - public static readonly ARROW = 76; - public static readonly COLON = 77; - public static readonly SEMI = 78; - public static readonly COMMA = 79; - public static readonly DOT = 80; - public static readonly LBRACE = 81; - public static readonly RBRACE = 82; - public static readonly LBRACK = 83; - public static readonly RBRACK = 84; - public static readonly LPAREN = 85; - public static readonly RPAREN = 86; - public static readonly LT = 87; - public static readonly GT = 88; - public static readonly INTEGER = 89; - public static readonly JSON_NUMBER = 90; - public static readonly IDENTIFIER = 91; - public static readonly STRING_LITERAL = 92; - public static readonly LINE_COMMENT = 93; - public static readonly BLOCK_COMMENT = 94; - public static readonly WS = 95; + public static readonly USING = 22; + public static readonly VIA = 23; + public static readonly MATERIALIZE = 24; + public static readonly IF = 25; + public static readonly ABSENT = 26; + public static readonly ON = 27; + public static readonly POLICY = 28; + public static readonly DEFAULT = 29; + public static readonly SOURCE = 30; + public static readonly REPOSITORY = 31; + public static readonly COMMIT = 32; + public static readonly REVISION = 33; + public static readonly ID = 34; + public static readonly DOC = 35; + public static readonly MODE = 36; + public static readonly EMITS = 37; + public static readonly RECEIVER = 38; + public static readonly REQUIRES = 39; + public static readonly ANY = 40; + public static readonly GET = 41; + public static readonly SET = 42; + public static readonly WATCH = 43; + public static readonly START = 44; + public static readonly STOP = 45; + public static readonly READ = 46; + public static readonly WRITE = 47; + public static readonly RESOLVE = 48; + public static readonly CONNECT = 49; + public static readonly DISCONNECT = 50; + public static readonly CALL = 51; + public static readonly WATCH_START = 52; + public static readonly WATCH_STOP = 53; + public static readonly SUBSCRIBE = 54; + public static readonly UNSUBSCRIBE = 55; + public static readonly OPTIMISTIC_REGISTER = 56; + public static readonly CRDT = 57; + public static readonly OPTIONAL_ONE = 58; + public static readonly EXACTLY_ONE = 59; + public static readonly MANY_UNIQUE = 60; + public static readonly MANY = 61; + public static readonly ORDERED = 62; + public static readonly UNIT = 63; + public static readonly WATCH_HANDLE = 64; + public static readonly MESSAGE = 65; + public static readonly ATOM_REF = 66; + public static readonly INTERFACE_REF = 67; + public static readonly OPTIONAL = 68; + public static readonly LIST = 69; + public static readonly BOOL = 70; + public static readonly BYTES = 71; + public static readonly DOUBLE = 72; + public static readonly INT32 = 73; + public static readonly INT64 = 74; + public static readonly STRING = 75; + public static readonly UINT32 = 76; + public static readonly UINT64 = 77; + public static readonly TRUE = 78; + public static readonly FALSE = 79; + public static readonly NULL = 80; + public static readonly ARROW = 81; + public static readonly COLON = 82; + public static readonly SEMI = 83; + public static readonly COMMA = 84; + public static readonly DOT = 85; + public static readonly LBRACE = 86; + public static readonly RBRACE = 87; + public static readonly LBRACK = 88; + public static readonly RBRACK = 89; + public static readonly LPAREN = 90; + public static readonly RPAREN = 91; + public static readonly LT = 92; + public static readonly GT = 93; + public static readonly INTEGER = 94; + public static readonly JSON_NUMBER = 95; + public static readonly IDENTIFIER = 96; + public static readonly STRING_LITERAL = 97; + public static readonly LINE_COMMENT = 98; + public static readonly BLOCK_COMMENT = 99; + public static readonly WS = 100; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -108,37 +113,38 @@ export class QuixosCapabilityLexer extends antlr.Lexer { null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'", - "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'on'", - "'policy'", "'default'", "'source'", "'repository'", "'commit'", - "'revision'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", - "'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", - "'read'", "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", - "'watch-start'", "'watch-stop'", "'subscribe'", "'unsubscribe'", - "'optimistic-register'", "'crdt'", "'optional-one'", "'exactly-one'", - "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", - "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", - "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", - "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", - "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", - "'>'" + "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", + "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", + "'default'", "'source'", "'repository'", "'commit'", "'revision'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", + "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", + "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", + "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", + "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", + "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", + "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly modeNames = [ @@ -149,19 +155,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", - "WS", + "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", + "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", + "BLOCK_COMMENT", "WS", ]; @@ -183,7 +189,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,95,895,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,100,937,6,-1,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, @@ -197,310 +203,325 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2, 78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7, 84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2, - 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,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,3,1,3,1,3,1,3,1,3,1,3,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,5,1,5,1,5,1,5,1,5,1, - 5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15, - 1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19, - 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20, - 1,20,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24, - 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26, - 1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27, - 1,27,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30, - 1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34, - 1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37, - 1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39, - 1,39,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,42, - 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, - 1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49, - 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52, - 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54, - 1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55, - 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65,1,65, - 1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67, - 1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69, - 1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73, - 1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,76,1,76, - 1,77,1,77,1,78,1,78,1,79,1,79,1,80,1,80,1,81,1,81,1,82,1,82,1,83, - 1,83,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,3,88,796,8,88, - 1,88,4,88,799,8,88,11,88,12,88,800,1,89,3,89,804,8,89,1,89,1,89, - 1,89,5,89,809,8,89,10,89,12,89,812,9,89,3,89,814,8,89,1,89,1,89, - 4,89,818,8,89,11,89,12,89,819,3,89,822,8,89,1,89,1,89,3,89,826,8, - 89,1,89,4,89,829,8,89,11,89,12,89,830,3,89,833,8,89,1,90,1,90,5, - 90,837,8,90,10,90,12,90,840,9,90,1,91,1,91,1,91,5,91,845,8,91,10, - 91,12,91,848,9,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1, - 92,3,92,860,8,92,1,93,1,93,1,94,1,94,1,94,1,94,5,94,868,8,94,10, - 94,12,94,871,9,94,1,94,1,94,1,95,1,95,1,95,1,95,5,95,879,8,95,10, - 95,12,95,882,9,95,1,95,1,95,1,95,1,95,1,95,1,96,4,96,890,8,96,11, - 96,12,96,891,1,96,1,96,1,880,0,97,1,1,3,2,5,3,7,4,9,5,11,6,13,7, - 15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18, - 37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29, - 59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40, - 81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101, - 51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60, - 121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139, - 70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79, - 159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177, - 89,179,90,181,91,183,92,185,0,187,0,189,93,191,94,193,95,1,0,11, - 1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90, - 95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34, - 92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116, - 3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,909, - 0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11, - 1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21, - 1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, - 1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41, - 1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0,0,51, - 1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0,0,61, - 1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0,0,71, - 1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0,0,81, - 1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0,0,91, - 1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0,0,101, - 1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1,0,0,0, - 0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0,119,1, - 0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0,0,0,0, - 129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137,1,0, - 0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0,0,147, - 1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1,0,0,0, - 0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0,165,1, - 0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0,0,0,0, - 175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183,1,0, - 0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,1,195,1,0,0,0,3,205, - 1,0,0,0,5,210,1,0,0,0,7,220,1,0,0,0,9,231,1,0,0,0,11,239,1,0,0,0, - 13,245,1,0,0,0,15,254,1,0,0,0,17,264,1,0,0,0,19,273,1,0,0,0,21,285, - 1,0,0,0,23,296,1,0,0,0,25,304,1,0,0,0,27,307,1,0,0,0,29,312,1,0, - 0,0,31,315,1,0,0,0,33,323,1,0,0,0,35,330,1,0,0,0,37,336,1,0,0,0, - 39,341,1,0,0,0,41,352,1,0,0,0,43,357,1,0,0,0,45,360,1,0,0,0,47,367, - 1,0,0,0,49,375,1,0,0,0,51,382,1,0,0,0,53,393,1,0,0,0,55,400,1,0, - 0,0,57,409,1,0,0,0,59,412,1,0,0,0,61,416,1,0,0,0,63,421,1,0,0,0, - 65,427,1,0,0,0,67,436,1,0,0,0,69,445,1,0,0,0,71,449,1,0,0,0,73,453, - 1,0,0,0,75,457,1,0,0,0,77,463,1,0,0,0,79,469,1,0,0,0,81,474,1,0, - 0,0,83,479,1,0,0,0,85,485,1,0,0,0,87,493,1,0,0,0,89,501,1,0,0,0, - 91,512,1,0,0,0,93,517,1,0,0,0,95,529,1,0,0,0,97,540,1,0,0,0,99,550, - 1,0,0,0,101,562,1,0,0,0,103,582,1,0,0,0,105,587,1,0,0,0,107,600, - 1,0,0,0,109,612,1,0,0,0,111,624,1,0,0,0,113,629,1,0,0,0,115,637, - 1,0,0,0,117,642,1,0,0,0,119,655,1,0,0,0,121,663,1,0,0,0,123,672, - 1,0,0,0,125,686,1,0,0,0,127,695,1,0,0,0,129,700,1,0,0,0,131,705, - 1,0,0,0,133,711,1,0,0,0,135,718,1,0,0,0,137,724,1,0,0,0,139,730, - 1,0,0,0,141,737,1,0,0,0,143,744,1,0,0,0,145,751,1,0,0,0,147,756, - 1,0,0,0,149,762,1,0,0,0,151,767,1,0,0,0,153,770,1,0,0,0,155,772, - 1,0,0,0,157,774,1,0,0,0,159,776,1,0,0,0,161,778,1,0,0,0,163,780, - 1,0,0,0,165,782,1,0,0,0,167,784,1,0,0,0,169,786,1,0,0,0,171,788, - 1,0,0,0,173,790,1,0,0,0,175,792,1,0,0,0,177,795,1,0,0,0,179,803, - 1,0,0,0,181,834,1,0,0,0,183,841,1,0,0,0,185,851,1,0,0,0,187,861, - 1,0,0,0,189,863,1,0,0,0,191,874,1,0,0,0,193,889,1,0,0,0,195,196, - 5,119,0,0,196,197,5,111,0,0,197,198,5,114,0,0,198,199,5,107,0,0, - 199,200,5,115,0,0,200,201,5,112,0,0,201,202,5,97,0,0,202,203,5,99, - 0,0,203,204,5,101,0,0,204,2,1,0,0,0,205,206,5,97,0,0,206,207,5,116, - 0,0,207,208,5,111,0,0,208,209,5,109,0,0,209,4,1,0,0,0,210,211,5, - 105,0,0,211,212,5,110,0,0,212,213,5,116,0,0,213,214,5,101,0,0,214, - 215,5,114,0,0,215,216,5,102,0,0,216,217,5,97,0,0,217,218,5,99,0, - 0,218,219,5,101,0,0,219,6,1,0,0,0,220,221,5,105,0,0,221,222,5,110, - 0,0,222,223,5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226, - 5,102,0,0,226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229, - 230,5,115,0,0,230,8,1,0,0,0,231,232,5,112,0,0,232,233,5,97,0,0,233, - 234,5,99,0,0,234,235,5,107,0,0,235,236,5,97,0,0,236,237,5,103,0, - 0,237,238,5,101,0,0,238,10,1,0,0,0,239,240,5,118,0,0,240,241,5,97, - 0,0,241,242,5,108,0,0,242,243,5,117,0,0,243,244,5,101,0,0,244,12, - 1,0,0,0,245,246,5,114,0,0,246,247,5,101,0,0,247,248,5,108,0,0,248, - 249,5,97,0,0,249,250,5,116,0,0,250,251,5,105,0,0,251,252,5,111,0, - 0,252,253,5,110,0,0,253,14,1,0,0,0,254,255,5,111,0,0,255,256,5,112, - 0,0,256,257,5,101,0,0,257,258,5,114,0,0,258,259,5,97,0,0,259,260, - 5,116,0,0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0, - 263,16,1,0,0,0,264,265,5,102,0,0,265,266,5,117,0,0,266,267,5,110, - 0,0,267,268,5,99,0,0,268,269,5,116,0,0,269,270,5,105,0,0,270,271, - 5,111,0,0,271,272,5,110,0,0,272,18,1,0,0,0,273,274,5,99,0,0,274, - 275,5,111,0,0,275,276,5,110,0,0,276,277,5,115,0,0,277,278,5,116, - 0,0,278,279,5,114,0,0,279,280,5,117,0,0,280,281,5,99,0,0,281,282, - 5,116,0,0,282,283,5,111,0,0,283,284,5,114,0,0,284,20,1,0,0,0,285, - 286,5,99,0,0,286,287,5,111,0,0,287,288,5,110,0,0,288,289,5,115,0, - 0,289,290,5,116,0,0,290,291,5,114,0,0,291,292,5,117,0,0,292,293, - 5,99,0,0,293,294,5,116,0,0,294,295,5,115,0,0,295,22,1,0,0,0,296, - 297,5,99,0,0,297,298,5,111,0,0,298,299,5,110,0,0,299,300,5,102,0, - 0,300,301,5,111,0,0,301,302,5,114,0,0,302,303,5,109,0,0,303,24,1, - 0,0,0,304,305,5,97,0,0,305,306,5,115,0,0,306,26,1,0,0,0,307,308, - 5,98,0,0,308,309,5,105,0,0,309,310,5,110,0,0,310,311,5,100,0,0,311, - 28,1,0,0,0,312,313,5,116,0,0,313,314,5,111,0,0,314,30,1,0,0,0,315, - 316,5,112,0,0,316,317,5,114,0,0,317,318,5,105,0,0,318,319,5,118, - 0,0,319,320,5,97,0,0,320,321,5,116,0,0,321,322,5,101,0,0,322,32, - 1,0,0,0,323,324,5,115,0,0,324,325,5,104,0,0,325,326,5,97,0,0,326, - 327,5,114,0,0,327,328,5,101,0,0,328,329,5,100,0,0,329,34,1,0,0,0, - 330,331,5,115,0,0,331,332,5,116,0,0,332,333,5,97,0,0,333,334,5,116, - 0,0,334,335,5,101,0,0,335,36,1,0,0,0,336,337,5,101,0,0,337,338,5, - 100,0,0,338,339,5,103,0,0,339,340,5,101,0,0,340,38,1,0,0,0,341,342, - 5,112,0,0,342,343,5,114,0,0,343,344,5,111,0,0,344,345,5,106,0,0, - 345,346,5,101,0,0,346,347,5,99,0,0,347,348,5,116,0,0,348,349,5,105, - 0,0,349,350,5,111,0,0,350,351,5,110,0,0,351,40,1,0,0,0,352,353,5, - 119,0,0,353,354,5,105,0,0,354,355,5,116,0,0,355,356,5,104,0,0,356, - 42,1,0,0,0,357,358,5,111,0,0,358,359,5,110,0,0,359,44,1,0,0,0,360, - 361,5,112,0,0,361,362,5,111,0,0,362,363,5,108,0,0,363,364,5,105, - 0,0,364,365,5,99,0,0,365,366,5,121,0,0,366,46,1,0,0,0,367,368,5, - 100,0,0,368,369,5,101,0,0,369,370,5,102,0,0,370,371,5,97,0,0,371, - 372,5,117,0,0,372,373,5,108,0,0,373,374,5,116,0,0,374,48,1,0,0,0, - 375,376,5,115,0,0,376,377,5,111,0,0,377,378,5,117,0,0,378,379,5, - 114,0,0,379,380,5,99,0,0,380,381,5,101,0,0,381,50,1,0,0,0,382,383, - 5,114,0,0,383,384,5,101,0,0,384,385,5,112,0,0,385,386,5,111,0,0, - 386,387,5,115,0,0,387,388,5,105,0,0,388,389,5,116,0,0,389,390,5, - 111,0,0,390,391,5,114,0,0,391,392,5,121,0,0,392,52,1,0,0,0,393,394, - 5,99,0,0,394,395,5,111,0,0,395,396,5,109,0,0,396,397,5,109,0,0,397, - 398,5,105,0,0,398,399,5,116,0,0,399,54,1,0,0,0,400,401,5,114,0,0, - 401,402,5,101,0,0,402,403,5,118,0,0,403,404,5,105,0,0,404,405,5, - 115,0,0,405,406,5,105,0,0,406,407,5,111,0,0,407,408,5,110,0,0,408, - 56,1,0,0,0,409,410,5,105,0,0,410,411,5,100,0,0,411,58,1,0,0,0,412, - 413,5,100,0,0,413,414,5,111,0,0,414,415,5,99,0,0,415,60,1,0,0,0, - 416,417,5,109,0,0,417,418,5,111,0,0,418,419,5,100,0,0,419,420,5, - 101,0,0,420,62,1,0,0,0,421,422,5,101,0,0,422,423,5,109,0,0,423,424, - 5,105,0,0,424,425,5,116,0,0,425,426,5,115,0,0,426,64,1,0,0,0,427, - 428,5,114,0,0,428,429,5,101,0,0,429,430,5,99,0,0,430,431,5,101,0, - 0,431,432,5,105,0,0,432,433,5,118,0,0,433,434,5,101,0,0,434,435, - 5,114,0,0,435,66,1,0,0,0,436,437,5,114,0,0,437,438,5,101,0,0,438, - 439,5,113,0,0,439,440,5,117,0,0,440,441,5,105,0,0,441,442,5,114, - 0,0,442,443,5,101,0,0,443,444,5,115,0,0,444,68,1,0,0,0,445,446,5, - 97,0,0,446,447,5,110,0,0,447,448,5,121,0,0,448,70,1,0,0,0,449,450, - 5,103,0,0,450,451,5,101,0,0,451,452,5,116,0,0,452,72,1,0,0,0,453, - 454,5,115,0,0,454,455,5,101,0,0,455,456,5,116,0,0,456,74,1,0,0,0, - 457,458,5,119,0,0,458,459,5,97,0,0,459,460,5,116,0,0,460,461,5,99, - 0,0,461,462,5,104,0,0,462,76,1,0,0,0,463,464,5,115,0,0,464,465,5, - 116,0,0,465,466,5,97,0,0,466,467,5,114,0,0,467,468,5,116,0,0,468, - 78,1,0,0,0,469,470,5,115,0,0,470,471,5,116,0,0,471,472,5,111,0,0, - 472,473,5,112,0,0,473,80,1,0,0,0,474,475,5,114,0,0,475,476,5,101, - 0,0,476,477,5,97,0,0,477,478,5,100,0,0,478,82,1,0,0,0,479,480,5, - 119,0,0,480,481,5,114,0,0,481,482,5,105,0,0,482,483,5,116,0,0,483, - 484,5,101,0,0,484,84,1,0,0,0,485,486,5,114,0,0,486,487,5,101,0,0, - 487,488,5,115,0,0,488,489,5,111,0,0,489,490,5,108,0,0,490,491,5, - 118,0,0,491,492,5,101,0,0,492,86,1,0,0,0,493,494,5,99,0,0,494,495, - 5,111,0,0,495,496,5,110,0,0,496,497,5,110,0,0,497,498,5,101,0,0, - 498,499,5,99,0,0,499,500,5,116,0,0,500,88,1,0,0,0,501,502,5,100, - 0,0,502,503,5,105,0,0,503,504,5,115,0,0,504,505,5,99,0,0,505,506, - 5,111,0,0,506,507,5,110,0,0,507,508,5,110,0,0,508,509,5,101,0,0, - 509,510,5,99,0,0,510,511,5,116,0,0,511,90,1,0,0,0,512,513,5,99,0, - 0,513,514,5,97,0,0,514,515,5,108,0,0,515,516,5,108,0,0,516,92,1, - 0,0,0,517,518,5,119,0,0,518,519,5,97,0,0,519,520,5,116,0,0,520,521, - 5,99,0,0,521,522,5,104,0,0,522,523,5,45,0,0,523,524,5,115,0,0,524, - 525,5,116,0,0,525,526,5,97,0,0,526,527,5,114,0,0,527,528,5,116,0, - 0,528,94,1,0,0,0,529,530,5,119,0,0,530,531,5,97,0,0,531,532,5,116, - 0,0,532,533,5,99,0,0,533,534,5,104,0,0,534,535,5,45,0,0,535,536, - 5,115,0,0,536,537,5,116,0,0,537,538,5,111,0,0,538,539,5,112,0,0, - 539,96,1,0,0,0,540,541,5,115,0,0,541,542,5,117,0,0,542,543,5,98, - 0,0,543,544,5,115,0,0,544,545,5,99,0,0,545,546,5,114,0,0,546,547, - 5,105,0,0,547,548,5,98,0,0,548,549,5,101,0,0,549,98,1,0,0,0,550, - 551,5,117,0,0,551,552,5,110,0,0,552,553,5,115,0,0,553,554,5,117, - 0,0,554,555,5,98,0,0,555,556,5,115,0,0,556,557,5,99,0,0,557,558, - 5,114,0,0,558,559,5,105,0,0,559,560,5,98,0,0,560,561,5,101,0,0,561, - 100,1,0,0,0,562,563,5,111,0,0,563,564,5,112,0,0,564,565,5,116,0, - 0,565,566,5,105,0,0,566,567,5,109,0,0,567,568,5,105,0,0,568,569, - 5,115,0,0,569,570,5,116,0,0,570,571,5,105,0,0,571,572,5,99,0,0,572, - 573,5,45,0,0,573,574,5,114,0,0,574,575,5,101,0,0,575,576,5,103,0, - 0,576,577,5,105,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580, - 5,101,0,0,580,581,5,114,0,0,581,102,1,0,0,0,582,583,5,99,0,0,583, - 584,5,114,0,0,584,585,5,100,0,0,585,586,5,116,0,0,586,104,1,0,0, - 0,587,588,5,111,0,0,588,589,5,112,0,0,589,590,5,116,0,0,590,591, - 5,105,0,0,591,592,5,111,0,0,592,593,5,110,0,0,593,594,5,97,0,0,594, - 595,5,108,0,0,595,596,5,45,0,0,596,597,5,111,0,0,597,598,5,110,0, - 0,598,599,5,101,0,0,599,106,1,0,0,0,600,601,5,101,0,0,601,602,5, - 120,0,0,602,603,5,97,0,0,603,604,5,99,0,0,604,605,5,116,0,0,605, - 606,5,108,0,0,606,607,5,121,0,0,607,608,5,45,0,0,608,609,5,111,0, - 0,609,610,5,110,0,0,610,611,5,101,0,0,611,108,1,0,0,0,612,613,5, - 109,0,0,613,614,5,97,0,0,614,615,5,110,0,0,615,616,5,121,0,0,616, - 617,5,45,0,0,617,618,5,117,0,0,618,619,5,110,0,0,619,620,5,105,0, - 0,620,621,5,113,0,0,621,622,5,117,0,0,622,623,5,101,0,0,623,110, - 1,0,0,0,624,625,5,109,0,0,625,626,5,97,0,0,626,627,5,110,0,0,627, - 628,5,121,0,0,628,112,1,0,0,0,629,630,5,111,0,0,630,631,5,114,0, - 0,631,632,5,100,0,0,632,633,5,101,0,0,633,634,5,114,0,0,634,635, - 5,101,0,0,635,636,5,100,0,0,636,114,1,0,0,0,637,638,5,117,0,0,638, - 639,5,110,0,0,639,640,5,105,0,0,640,641,5,116,0,0,641,116,1,0,0, - 0,642,643,5,119,0,0,643,644,5,97,0,0,644,645,5,116,0,0,645,646,5, - 99,0,0,646,647,5,104,0,0,647,648,5,45,0,0,648,649,5,104,0,0,649, - 650,5,97,0,0,650,651,5,110,0,0,651,652,5,100,0,0,652,653,5,108,0, - 0,653,654,5,101,0,0,654,118,1,0,0,0,655,656,5,109,0,0,656,657,5, - 101,0,0,657,658,5,115,0,0,658,659,5,115,0,0,659,660,5,97,0,0,660, - 661,5,103,0,0,661,662,5,101,0,0,662,120,1,0,0,0,663,664,5,97,0,0, - 664,665,5,116,0,0,665,666,5,111,0,0,666,667,5,109,0,0,667,668,5, - 45,0,0,668,669,5,114,0,0,669,670,5,101,0,0,670,671,5,102,0,0,671, - 122,1,0,0,0,672,673,5,105,0,0,673,674,5,110,0,0,674,675,5,116,0, - 0,675,676,5,101,0,0,676,677,5,114,0,0,677,678,5,102,0,0,678,679, - 5,97,0,0,679,680,5,99,0,0,680,681,5,101,0,0,681,682,5,45,0,0,682, - 683,5,114,0,0,683,684,5,101,0,0,684,685,5,102,0,0,685,124,1,0,0, - 0,686,687,5,111,0,0,687,688,5,112,0,0,688,689,5,116,0,0,689,690, - 5,105,0,0,690,691,5,111,0,0,691,692,5,110,0,0,692,693,5,97,0,0,693, - 694,5,108,0,0,694,126,1,0,0,0,695,696,5,108,0,0,696,697,5,105,0, - 0,697,698,5,115,0,0,698,699,5,116,0,0,699,128,1,0,0,0,700,701,5, - 98,0,0,701,702,5,111,0,0,702,703,5,111,0,0,703,704,5,108,0,0,704, - 130,1,0,0,0,705,706,5,98,0,0,706,707,5,121,0,0,707,708,5,116,0,0, - 708,709,5,101,0,0,709,710,5,115,0,0,710,132,1,0,0,0,711,712,5,100, - 0,0,712,713,5,111,0,0,713,714,5,117,0,0,714,715,5,98,0,0,715,716, - 5,108,0,0,716,717,5,101,0,0,717,134,1,0,0,0,718,719,5,105,0,0,719, - 720,5,110,0,0,720,721,5,116,0,0,721,722,5,51,0,0,722,723,5,50,0, - 0,723,136,1,0,0,0,724,725,5,105,0,0,725,726,5,110,0,0,726,727,5, - 116,0,0,727,728,5,54,0,0,728,729,5,52,0,0,729,138,1,0,0,0,730,731, - 5,115,0,0,731,732,5,116,0,0,732,733,5,114,0,0,733,734,5,105,0,0, - 734,735,5,110,0,0,735,736,5,103,0,0,736,140,1,0,0,0,737,738,5,117, - 0,0,738,739,5,105,0,0,739,740,5,110,0,0,740,741,5,116,0,0,741,742, - 5,51,0,0,742,743,5,50,0,0,743,142,1,0,0,0,744,745,5,117,0,0,745, - 746,5,105,0,0,746,747,5,110,0,0,747,748,5,116,0,0,748,749,5,54,0, - 0,749,750,5,52,0,0,750,144,1,0,0,0,751,752,5,116,0,0,752,753,5,114, - 0,0,753,754,5,117,0,0,754,755,5,101,0,0,755,146,1,0,0,0,756,757, - 5,102,0,0,757,758,5,97,0,0,758,759,5,108,0,0,759,760,5,115,0,0,760, - 761,5,101,0,0,761,148,1,0,0,0,762,763,5,110,0,0,763,764,5,117,0, - 0,764,765,5,108,0,0,765,766,5,108,0,0,766,150,1,0,0,0,767,768,5, - 45,0,0,768,769,5,62,0,0,769,152,1,0,0,0,770,771,5,58,0,0,771,154, - 1,0,0,0,772,773,5,59,0,0,773,156,1,0,0,0,774,775,5,44,0,0,775,158, - 1,0,0,0,776,777,5,46,0,0,777,160,1,0,0,0,778,779,5,123,0,0,779,162, - 1,0,0,0,780,781,5,125,0,0,781,164,1,0,0,0,782,783,5,91,0,0,783,166, - 1,0,0,0,784,785,5,93,0,0,785,168,1,0,0,0,786,787,5,40,0,0,787,170, - 1,0,0,0,788,789,5,41,0,0,789,172,1,0,0,0,790,791,5,60,0,0,791,174, - 1,0,0,0,792,793,5,62,0,0,793,176,1,0,0,0,794,796,5,45,0,0,795,794, - 1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,799,7,0,0,0,798,797, - 1,0,0,0,799,800,1,0,0,0,800,798,1,0,0,0,800,801,1,0,0,0,801,178, - 1,0,0,0,802,804,5,45,0,0,803,802,1,0,0,0,803,804,1,0,0,0,804,813, - 1,0,0,0,805,814,5,48,0,0,806,810,7,1,0,0,807,809,7,0,0,0,808,807, - 1,0,0,0,809,812,1,0,0,0,810,808,1,0,0,0,810,811,1,0,0,0,811,814, - 1,0,0,0,812,810,1,0,0,0,813,805,1,0,0,0,813,806,1,0,0,0,814,821, - 1,0,0,0,815,817,5,46,0,0,816,818,7,0,0,0,817,816,1,0,0,0,818,819, - 1,0,0,0,819,817,1,0,0,0,819,820,1,0,0,0,820,822,1,0,0,0,821,815, - 1,0,0,0,821,822,1,0,0,0,822,832,1,0,0,0,823,825,7,2,0,0,824,826, - 7,3,0,0,825,824,1,0,0,0,825,826,1,0,0,0,826,828,1,0,0,0,827,829, - 7,0,0,0,828,827,1,0,0,0,829,830,1,0,0,0,830,828,1,0,0,0,830,831, - 1,0,0,0,831,833,1,0,0,0,832,823,1,0,0,0,832,833,1,0,0,0,833,180, - 1,0,0,0,834,838,7,4,0,0,835,837,7,5,0,0,836,835,1,0,0,0,837,840, - 1,0,0,0,838,836,1,0,0,0,838,839,1,0,0,0,839,182,1,0,0,0,840,838, - 1,0,0,0,841,846,5,34,0,0,842,845,3,185,92,0,843,845,8,6,0,0,844, - 842,1,0,0,0,844,843,1,0,0,0,845,848,1,0,0,0,846,844,1,0,0,0,846, - 847,1,0,0,0,847,849,1,0,0,0,848,846,1,0,0,0,849,850,5,34,0,0,850, - 184,1,0,0,0,851,859,5,92,0,0,852,860,7,7,0,0,853,854,5,117,0,0,854, - 855,3,187,93,0,855,856,3,187,93,0,856,857,3,187,93,0,857,858,3,187, - 93,0,858,860,1,0,0,0,859,852,1,0,0,0,859,853,1,0,0,0,860,186,1,0, - 0,0,861,862,7,8,0,0,862,188,1,0,0,0,863,864,5,47,0,0,864,865,5,47, - 0,0,865,869,1,0,0,0,866,868,8,9,0,0,867,866,1,0,0,0,868,871,1,0, - 0,0,869,867,1,0,0,0,869,870,1,0,0,0,870,872,1,0,0,0,871,869,1,0, - 0,0,872,873,6,94,0,0,873,190,1,0,0,0,874,875,5,47,0,0,875,876,5, - 42,0,0,876,880,1,0,0,0,877,879,9,0,0,0,878,877,1,0,0,0,879,882,1, - 0,0,0,880,881,1,0,0,0,880,878,1,0,0,0,881,883,1,0,0,0,882,880,1, - 0,0,0,883,884,5,42,0,0,884,885,5,47,0,0,885,886,1,0,0,0,886,887, - 6,95,0,0,887,192,1,0,0,0,888,890,7,10,0,0,889,888,1,0,0,0,890,891, - 1,0,0,0,891,889,1,0,0,0,891,892,1,0,0,0,892,893,1,0,0,0,893,894, - 6,96,0,0,894,194,1,0,0,0,18,0,795,800,803,810,813,819,821,825,830, - 832,838,844,846,859,869,880,891,1,6,0,0 + 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7, + 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,1,0,1,0,1,0,1,0,1, + 0,1,0,1,0,1,0,1,0,1,0,1,1,1,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,3,1,3,1,3,1,3,1,3,1,3,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,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1, + 6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, + 7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1, + 10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1, + 12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1, + 15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1, + 17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1, + 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,21,1, + 21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1, + 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,25,1,25,1, + 25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1, + 27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1, + 29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1, + 35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1, + 37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, + 38,1,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1, + 41,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1, + 44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1, + 46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1, + 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1, + 49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1, + 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1, + 52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, + 53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, + 54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1, + 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1, + 56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, + 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1, + 60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1, + 62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1, + 69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1, + 71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1, + 73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1, + 75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1, + 77,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1, + 80,1,80,1,81,1,81,1,82,1,82,1,83,1,83,1,84,1,84,1,85,1,85,1,86,1, + 86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90,1,91,1,91,1,92,1,92,1, + 93,3,93,838,8,93,1,93,4,93,841,8,93,11,93,12,93,842,1,94,3,94,846, + 8,94,1,94,1,94,1,94,5,94,851,8,94,10,94,12,94,854,9,94,3,94,856, + 8,94,1,94,1,94,4,94,860,8,94,11,94,12,94,861,3,94,864,8,94,1,94, + 1,94,3,94,868,8,94,1,94,4,94,871,8,94,11,94,12,94,872,3,94,875,8, + 94,1,95,1,95,5,95,879,8,95,10,95,12,95,882,9,95,1,96,1,96,1,96,5, + 96,887,8,96,10,96,12,96,890,9,96,1,96,1,96,1,97,1,97,1,97,1,97,1, + 97,1,97,1,97,1,97,3,97,902,8,97,1,98,1,98,1,99,1,99,1,99,1,99,5, + 99,910,8,99,10,99,12,99,913,9,99,1,99,1,99,1,100,1,100,1,100,1,100, + 5,100,921,8,100,10,100,12,100,924,9,100,1,100,1,100,1,100,1,100, + 1,100,1,101,4,101,932,8,101,11,101,12,101,933,1,101,1,101,1,922, + 0,102,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, + 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, + 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, + 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, + 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, + 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, + 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, + 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, + 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, + 187,94,189,95,191,96,193,97,195,0,197,0,199,98,201,99,203,100,1, + 0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65, + 90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34, + 34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116, + 116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32, + 951,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0, + 0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0, + 0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0, + 0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0, + 0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0, + 0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0, + 0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0, + 0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0, + 0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0, + 0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0, + 0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1, + 0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0, + 119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0, + 0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137, + 1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0, + 0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1, + 0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0, + 165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0, + 0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183, + 1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0, + 0,193,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,1,205,1, + 0,0,0,3,215,1,0,0,0,5,220,1,0,0,0,7,230,1,0,0,0,9,241,1,0,0,0,11, + 249,1,0,0,0,13,255,1,0,0,0,15,264,1,0,0,0,17,274,1,0,0,0,19,283, + 1,0,0,0,21,295,1,0,0,0,23,306,1,0,0,0,25,314,1,0,0,0,27,317,1,0, + 0,0,29,322,1,0,0,0,31,325,1,0,0,0,33,333,1,0,0,0,35,340,1,0,0,0, + 37,346,1,0,0,0,39,351,1,0,0,0,41,362,1,0,0,0,43,367,1,0,0,0,45,373, + 1,0,0,0,47,377,1,0,0,0,49,389,1,0,0,0,51,392,1,0,0,0,53,399,1,0, + 0,0,55,402,1,0,0,0,57,409,1,0,0,0,59,417,1,0,0,0,61,424,1,0,0,0, + 63,435,1,0,0,0,65,442,1,0,0,0,67,451,1,0,0,0,69,454,1,0,0,0,71,458, + 1,0,0,0,73,463,1,0,0,0,75,469,1,0,0,0,77,478,1,0,0,0,79,487,1,0, + 0,0,81,491,1,0,0,0,83,495,1,0,0,0,85,499,1,0,0,0,87,505,1,0,0,0, + 89,511,1,0,0,0,91,516,1,0,0,0,93,521,1,0,0,0,95,527,1,0,0,0,97,535, + 1,0,0,0,99,543,1,0,0,0,101,554,1,0,0,0,103,559,1,0,0,0,105,571,1, + 0,0,0,107,582,1,0,0,0,109,592,1,0,0,0,111,604,1,0,0,0,113,624,1, + 0,0,0,115,629,1,0,0,0,117,642,1,0,0,0,119,654,1,0,0,0,121,666,1, + 0,0,0,123,671,1,0,0,0,125,679,1,0,0,0,127,684,1,0,0,0,129,697,1, + 0,0,0,131,705,1,0,0,0,133,714,1,0,0,0,135,728,1,0,0,0,137,737,1, + 0,0,0,139,742,1,0,0,0,141,747,1,0,0,0,143,753,1,0,0,0,145,760,1, + 0,0,0,147,766,1,0,0,0,149,772,1,0,0,0,151,779,1,0,0,0,153,786,1, + 0,0,0,155,793,1,0,0,0,157,798,1,0,0,0,159,804,1,0,0,0,161,809,1, + 0,0,0,163,812,1,0,0,0,165,814,1,0,0,0,167,816,1,0,0,0,169,818,1, + 0,0,0,171,820,1,0,0,0,173,822,1,0,0,0,175,824,1,0,0,0,177,826,1, + 0,0,0,179,828,1,0,0,0,181,830,1,0,0,0,183,832,1,0,0,0,185,834,1, + 0,0,0,187,837,1,0,0,0,189,845,1,0,0,0,191,876,1,0,0,0,193,883,1, + 0,0,0,195,893,1,0,0,0,197,903,1,0,0,0,199,905,1,0,0,0,201,916,1, + 0,0,0,203,931,1,0,0,0,205,206,5,119,0,0,206,207,5,111,0,0,207,208, + 5,114,0,0,208,209,5,107,0,0,209,210,5,115,0,0,210,211,5,112,0,0, + 211,212,5,97,0,0,212,213,5,99,0,0,213,214,5,101,0,0,214,2,1,0,0, + 0,215,216,5,97,0,0,216,217,5,116,0,0,217,218,5,111,0,0,218,219,5, + 109,0,0,219,4,1,0,0,0,220,221,5,105,0,0,221,222,5,110,0,0,222,223, + 5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226,5,102,0,0, + 226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229,6,1,0,0, + 0,230,231,5,105,0,0,231,232,5,110,0,0,232,233,5,116,0,0,233,234, + 5,101,0,0,234,235,5,114,0,0,235,236,5,102,0,0,236,237,5,97,0,0,237, + 238,5,99,0,0,238,239,5,101,0,0,239,240,5,115,0,0,240,8,1,0,0,0,241, + 242,5,112,0,0,242,243,5,97,0,0,243,244,5,99,0,0,244,245,5,107,0, + 0,245,246,5,97,0,0,246,247,5,103,0,0,247,248,5,101,0,0,248,10,1, + 0,0,0,249,250,5,118,0,0,250,251,5,97,0,0,251,252,5,108,0,0,252,253, + 5,117,0,0,253,254,5,101,0,0,254,12,1,0,0,0,255,256,5,114,0,0,256, + 257,5,101,0,0,257,258,5,108,0,0,258,259,5,97,0,0,259,260,5,116,0, + 0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0,263,14,1, + 0,0,0,264,265,5,111,0,0,265,266,5,112,0,0,266,267,5,101,0,0,267, + 268,5,114,0,0,268,269,5,97,0,0,269,270,5,116,0,0,270,271,5,105,0, + 0,271,272,5,111,0,0,272,273,5,110,0,0,273,16,1,0,0,0,274,275,5,102, + 0,0,275,276,5,117,0,0,276,277,5,110,0,0,277,278,5,99,0,0,278,279, + 5,116,0,0,279,280,5,105,0,0,280,281,5,111,0,0,281,282,5,110,0,0, + 282,18,1,0,0,0,283,284,5,99,0,0,284,285,5,111,0,0,285,286,5,110, + 0,0,286,287,5,115,0,0,287,288,5,116,0,0,288,289,5,114,0,0,289,290, + 5,117,0,0,290,291,5,99,0,0,291,292,5,116,0,0,292,293,5,111,0,0,293, + 294,5,114,0,0,294,20,1,0,0,0,295,296,5,99,0,0,296,297,5,111,0,0, + 297,298,5,110,0,0,298,299,5,115,0,0,299,300,5,116,0,0,300,301,5, + 114,0,0,301,302,5,117,0,0,302,303,5,99,0,0,303,304,5,116,0,0,304, + 305,5,115,0,0,305,22,1,0,0,0,306,307,5,99,0,0,307,308,5,111,0,0, + 308,309,5,110,0,0,309,310,5,102,0,0,310,311,5,111,0,0,311,312,5, + 114,0,0,312,313,5,109,0,0,313,24,1,0,0,0,314,315,5,97,0,0,315,316, + 5,115,0,0,316,26,1,0,0,0,317,318,5,98,0,0,318,319,5,105,0,0,319, + 320,5,110,0,0,320,321,5,100,0,0,321,28,1,0,0,0,322,323,5,116,0,0, + 323,324,5,111,0,0,324,30,1,0,0,0,325,326,5,112,0,0,326,327,5,114, + 0,0,327,328,5,105,0,0,328,329,5,118,0,0,329,330,5,97,0,0,330,331, + 5,116,0,0,331,332,5,101,0,0,332,32,1,0,0,0,333,334,5,115,0,0,334, + 335,5,104,0,0,335,336,5,97,0,0,336,337,5,114,0,0,337,338,5,101,0, + 0,338,339,5,100,0,0,339,34,1,0,0,0,340,341,5,115,0,0,341,342,5,116, + 0,0,342,343,5,97,0,0,343,344,5,116,0,0,344,345,5,101,0,0,345,36, + 1,0,0,0,346,347,5,101,0,0,347,348,5,100,0,0,348,349,5,103,0,0,349, + 350,5,101,0,0,350,38,1,0,0,0,351,352,5,112,0,0,352,353,5,114,0,0, + 353,354,5,111,0,0,354,355,5,106,0,0,355,356,5,101,0,0,356,357,5, + 99,0,0,357,358,5,116,0,0,358,359,5,105,0,0,359,360,5,111,0,0,360, + 361,5,110,0,0,361,40,1,0,0,0,362,363,5,119,0,0,363,364,5,105,0,0, + 364,365,5,116,0,0,365,366,5,104,0,0,366,42,1,0,0,0,367,368,5,117, + 0,0,368,369,5,115,0,0,369,370,5,105,0,0,370,371,5,110,0,0,371,372, + 5,103,0,0,372,44,1,0,0,0,373,374,5,118,0,0,374,375,5,105,0,0,375, + 376,5,97,0,0,376,46,1,0,0,0,377,378,5,109,0,0,378,379,5,97,0,0,379, + 380,5,116,0,0,380,381,5,101,0,0,381,382,5,114,0,0,382,383,5,105, + 0,0,383,384,5,97,0,0,384,385,5,108,0,0,385,386,5,105,0,0,386,387, + 5,122,0,0,387,388,5,101,0,0,388,48,1,0,0,0,389,390,5,105,0,0,390, + 391,5,102,0,0,391,50,1,0,0,0,392,393,5,97,0,0,393,394,5,98,0,0,394, + 395,5,115,0,0,395,396,5,101,0,0,396,397,5,110,0,0,397,398,5,116, + 0,0,398,52,1,0,0,0,399,400,5,111,0,0,400,401,5,110,0,0,401,54,1, + 0,0,0,402,403,5,112,0,0,403,404,5,111,0,0,404,405,5,108,0,0,405, + 406,5,105,0,0,406,407,5,99,0,0,407,408,5,121,0,0,408,56,1,0,0,0, + 409,410,5,100,0,0,410,411,5,101,0,0,411,412,5,102,0,0,412,413,5, + 97,0,0,413,414,5,117,0,0,414,415,5,108,0,0,415,416,5,116,0,0,416, + 58,1,0,0,0,417,418,5,115,0,0,418,419,5,111,0,0,419,420,5,117,0,0, + 420,421,5,114,0,0,421,422,5,99,0,0,422,423,5,101,0,0,423,60,1,0, + 0,0,424,425,5,114,0,0,425,426,5,101,0,0,426,427,5,112,0,0,427,428, + 5,111,0,0,428,429,5,115,0,0,429,430,5,105,0,0,430,431,5,116,0,0, + 431,432,5,111,0,0,432,433,5,114,0,0,433,434,5,121,0,0,434,62,1,0, + 0,0,435,436,5,99,0,0,436,437,5,111,0,0,437,438,5,109,0,0,438,439, + 5,109,0,0,439,440,5,105,0,0,440,441,5,116,0,0,441,64,1,0,0,0,442, + 443,5,114,0,0,443,444,5,101,0,0,444,445,5,118,0,0,445,446,5,105, + 0,0,446,447,5,115,0,0,447,448,5,105,0,0,448,449,5,111,0,0,449,450, + 5,110,0,0,450,66,1,0,0,0,451,452,5,105,0,0,452,453,5,100,0,0,453, + 68,1,0,0,0,454,455,5,100,0,0,455,456,5,111,0,0,456,457,5,99,0,0, + 457,70,1,0,0,0,458,459,5,109,0,0,459,460,5,111,0,0,460,461,5,100, + 0,0,461,462,5,101,0,0,462,72,1,0,0,0,463,464,5,101,0,0,464,465,5, + 109,0,0,465,466,5,105,0,0,466,467,5,116,0,0,467,468,5,115,0,0,468, + 74,1,0,0,0,469,470,5,114,0,0,470,471,5,101,0,0,471,472,5,99,0,0, + 472,473,5,101,0,0,473,474,5,105,0,0,474,475,5,118,0,0,475,476,5, + 101,0,0,476,477,5,114,0,0,477,76,1,0,0,0,478,479,5,114,0,0,479,480, + 5,101,0,0,480,481,5,113,0,0,481,482,5,117,0,0,482,483,5,105,0,0, + 483,484,5,114,0,0,484,485,5,101,0,0,485,486,5,115,0,0,486,78,1,0, + 0,0,487,488,5,97,0,0,488,489,5,110,0,0,489,490,5,121,0,0,490,80, + 1,0,0,0,491,492,5,103,0,0,492,493,5,101,0,0,493,494,5,116,0,0,494, + 82,1,0,0,0,495,496,5,115,0,0,496,497,5,101,0,0,497,498,5,116,0,0, + 498,84,1,0,0,0,499,500,5,119,0,0,500,501,5,97,0,0,501,502,5,116, + 0,0,502,503,5,99,0,0,503,504,5,104,0,0,504,86,1,0,0,0,505,506,5, + 115,0,0,506,507,5,116,0,0,507,508,5,97,0,0,508,509,5,114,0,0,509, + 510,5,116,0,0,510,88,1,0,0,0,511,512,5,115,0,0,512,513,5,116,0,0, + 513,514,5,111,0,0,514,515,5,112,0,0,515,90,1,0,0,0,516,517,5,114, + 0,0,517,518,5,101,0,0,518,519,5,97,0,0,519,520,5,100,0,0,520,92, + 1,0,0,0,521,522,5,119,0,0,522,523,5,114,0,0,523,524,5,105,0,0,524, + 525,5,116,0,0,525,526,5,101,0,0,526,94,1,0,0,0,527,528,5,114,0,0, + 528,529,5,101,0,0,529,530,5,115,0,0,530,531,5,111,0,0,531,532,5, + 108,0,0,532,533,5,118,0,0,533,534,5,101,0,0,534,96,1,0,0,0,535,536, + 5,99,0,0,536,537,5,111,0,0,537,538,5,110,0,0,538,539,5,110,0,0,539, + 540,5,101,0,0,540,541,5,99,0,0,541,542,5,116,0,0,542,98,1,0,0,0, + 543,544,5,100,0,0,544,545,5,105,0,0,545,546,5,115,0,0,546,547,5, + 99,0,0,547,548,5,111,0,0,548,549,5,110,0,0,549,550,5,110,0,0,550, + 551,5,101,0,0,551,552,5,99,0,0,552,553,5,116,0,0,553,100,1,0,0,0, + 554,555,5,99,0,0,555,556,5,97,0,0,556,557,5,108,0,0,557,558,5,108, + 0,0,558,102,1,0,0,0,559,560,5,119,0,0,560,561,5,97,0,0,561,562,5, + 116,0,0,562,563,5,99,0,0,563,564,5,104,0,0,564,565,5,45,0,0,565, + 566,5,115,0,0,566,567,5,116,0,0,567,568,5,97,0,0,568,569,5,114,0, + 0,569,570,5,116,0,0,570,104,1,0,0,0,571,572,5,119,0,0,572,573,5, + 97,0,0,573,574,5,116,0,0,574,575,5,99,0,0,575,576,5,104,0,0,576, + 577,5,45,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580,5,111,0, + 0,580,581,5,112,0,0,581,106,1,0,0,0,582,583,5,115,0,0,583,584,5, + 117,0,0,584,585,5,98,0,0,585,586,5,115,0,0,586,587,5,99,0,0,587, + 588,5,114,0,0,588,589,5,105,0,0,589,590,5,98,0,0,590,591,5,101,0, + 0,591,108,1,0,0,0,592,593,5,117,0,0,593,594,5,110,0,0,594,595,5, + 115,0,0,595,596,5,117,0,0,596,597,5,98,0,0,597,598,5,115,0,0,598, + 599,5,99,0,0,599,600,5,114,0,0,600,601,5,105,0,0,601,602,5,98,0, + 0,602,603,5,101,0,0,603,110,1,0,0,0,604,605,5,111,0,0,605,606,5, + 112,0,0,606,607,5,116,0,0,607,608,5,105,0,0,608,609,5,109,0,0,609, + 610,5,105,0,0,610,611,5,115,0,0,611,612,5,116,0,0,612,613,5,105, + 0,0,613,614,5,99,0,0,614,615,5,45,0,0,615,616,5,114,0,0,616,617, + 5,101,0,0,617,618,5,103,0,0,618,619,5,105,0,0,619,620,5,115,0,0, + 620,621,5,116,0,0,621,622,5,101,0,0,622,623,5,114,0,0,623,112,1, + 0,0,0,624,625,5,99,0,0,625,626,5,114,0,0,626,627,5,100,0,0,627,628, + 5,116,0,0,628,114,1,0,0,0,629,630,5,111,0,0,630,631,5,112,0,0,631, + 632,5,116,0,0,632,633,5,105,0,0,633,634,5,111,0,0,634,635,5,110, + 0,0,635,636,5,97,0,0,636,637,5,108,0,0,637,638,5,45,0,0,638,639, + 5,111,0,0,639,640,5,110,0,0,640,641,5,101,0,0,641,116,1,0,0,0,642, + 643,5,101,0,0,643,644,5,120,0,0,644,645,5,97,0,0,645,646,5,99,0, + 0,646,647,5,116,0,0,647,648,5,108,0,0,648,649,5,121,0,0,649,650, + 5,45,0,0,650,651,5,111,0,0,651,652,5,110,0,0,652,653,5,101,0,0,653, + 118,1,0,0,0,654,655,5,109,0,0,655,656,5,97,0,0,656,657,5,110,0,0, + 657,658,5,121,0,0,658,659,5,45,0,0,659,660,5,117,0,0,660,661,5,110, + 0,0,661,662,5,105,0,0,662,663,5,113,0,0,663,664,5,117,0,0,664,665, + 5,101,0,0,665,120,1,0,0,0,666,667,5,109,0,0,667,668,5,97,0,0,668, + 669,5,110,0,0,669,670,5,121,0,0,670,122,1,0,0,0,671,672,5,111,0, + 0,672,673,5,114,0,0,673,674,5,100,0,0,674,675,5,101,0,0,675,676, + 5,114,0,0,676,677,5,101,0,0,677,678,5,100,0,0,678,124,1,0,0,0,679, + 680,5,117,0,0,680,681,5,110,0,0,681,682,5,105,0,0,682,683,5,116, + 0,0,683,126,1,0,0,0,684,685,5,119,0,0,685,686,5,97,0,0,686,687,5, + 116,0,0,687,688,5,99,0,0,688,689,5,104,0,0,689,690,5,45,0,0,690, + 691,5,104,0,0,691,692,5,97,0,0,692,693,5,110,0,0,693,694,5,100,0, + 0,694,695,5,108,0,0,695,696,5,101,0,0,696,128,1,0,0,0,697,698,5, + 109,0,0,698,699,5,101,0,0,699,700,5,115,0,0,700,701,5,115,0,0,701, + 702,5,97,0,0,702,703,5,103,0,0,703,704,5,101,0,0,704,130,1,0,0,0, + 705,706,5,97,0,0,706,707,5,116,0,0,707,708,5,111,0,0,708,709,5,109, + 0,0,709,710,5,45,0,0,710,711,5,114,0,0,711,712,5,101,0,0,712,713, + 5,102,0,0,713,132,1,0,0,0,714,715,5,105,0,0,715,716,5,110,0,0,716, + 717,5,116,0,0,717,718,5,101,0,0,718,719,5,114,0,0,719,720,5,102, + 0,0,720,721,5,97,0,0,721,722,5,99,0,0,722,723,5,101,0,0,723,724, + 5,45,0,0,724,725,5,114,0,0,725,726,5,101,0,0,726,727,5,102,0,0,727, + 134,1,0,0,0,728,729,5,111,0,0,729,730,5,112,0,0,730,731,5,116,0, + 0,731,732,5,105,0,0,732,733,5,111,0,0,733,734,5,110,0,0,734,735, + 5,97,0,0,735,736,5,108,0,0,736,136,1,0,0,0,737,738,5,108,0,0,738, + 739,5,105,0,0,739,740,5,115,0,0,740,741,5,116,0,0,741,138,1,0,0, + 0,742,743,5,98,0,0,743,744,5,111,0,0,744,745,5,111,0,0,745,746,5, + 108,0,0,746,140,1,0,0,0,747,748,5,98,0,0,748,749,5,121,0,0,749,750, + 5,116,0,0,750,751,5,101,0,0,751,752,5,115,0,0,752,142,1,0,0,0,753, + 754,5,100,0,0,754,755,5,111,0,0,755,756,5,117,0,0,756,757,5,98,0, + 0,757,758,5,108,0,0,758,759,5,101,0,0,759,144,1,0,0,0,760,761,5, + 105,0,0,761,762,5,110,0,0,762,763,5,116,0,0,763,764,5,51,0,0,764, + 765,5,50,0,0,765,146,1,0,0,0,766,767,5,105,0,0,767,768,5,110,0,0, + 768,769,5,116,0,0,769,770,5,54,0,0,770,771,5,52,0,0,771,148,1,0, + 0,0,772,773,5,115,0,0,773,774,5,116,0,0,774,775,5,114,0,0,775,776, + 5,105,0,0,776,777,5,110,0,0,777,778,5,103,0,0,778,150,1,0,0,0,779, + 780,5,117,0,0,780,781,5,105,0,0,781,782,5,110,0,0,782,783,5,116, + 0,0,783,784,5,51,0,0,784,785,5,50,0,0,785,152,1,0,0,0,786,787,5, + 117,0,0,787,788,5,105,0,0,788,789,5,110,0,0,789,790,5,116,0,0,790, + 791,5,54,0,0,791,792,5,52,0,0,792,154,1,0,0,0,793,794,5,116,0,0, + 794,795,5,114,0,0,795,796,5,117,0,0,796,797,5,101,0,0,797,156,1, + 0,0,0,798,799,5,102,0,0,799,800,5,97,0,0,800,801,5,108,0,0,801,802, + 5,115,0,0,802,803,5,101,0,0,803,158,1,0,0,0,804,805,5,110,0,0,805, + 806,5,117,0,0,806,807,5,108,0,0,807,808,5,108,0,0,808,160,1,0,0, + 0,809,810,5,45,0,0,810,811,5,62,0,0,811,162,1,0,0,0,812,813,5,58, + 0,0,813,164,1,0,0,0,814,815,5,59,0,0,815,166,1,0,0,0,816,817,5,44, + 0,0,817,168,1,0,0,0,818,819,5,46,0,0,819,170,1,0,0,0,820,821,5,123, + 0,0,821,172,1,0,0,0,822,823,5,125,0,0,823,174,1,0,0,0,824,825,5, + 91,0,0,825,176,1,0,0,0,826,827,5,93,0,0,827,178,1,0,0,0,828,829, + 5,40,0,0,829,180,1,0,0,0,830,831,5,41,0,0,831,182,1,0,0,0,832,833, + 5,60,0,0,833,184,1,0,0,0,834,835,5,62,0,0,835,186,1,0,0,0,836,838, + 5,45,0,0,837,836,1,0,0,0,837,838,1,0,0,0,838,840,1,0,0,0,839,841, + 7,0,0,0,840,839,1,0,0,0,841,842,1,0,0,0,842,840,1,0,0,0,842,843, + 1,0,0,0,843,188,1,0,0,0,844,846,5,45,0,0,845,844,1,0,0,0,845,846, + 1,0,0,0,846,855,1,0,0,0,847,856,5,48,0,0,848,852,7,1,0,0,849,851, + 7,0,0,0,850,849,1,0,0,0,851,854,1,0,0,0,852,850,1,0,0,0,852,853, + 1,0,0,0,853,856,1,0,0,0,854,852,1,0,0,0,855,847,1,0,0,0,855,848, + 1,0,0,0,856,863,1,0,0,0,857,859,5,46,0,0,858,860,7,0,0,0,859,858, + 1,0,0,0,860,861,1,0,0,0,861,859,1,0,0,0,861,862,1,0,0,0,862,864, + 1,0,0,0,863,857,1,0,0,0,863,864,1,0,0,0,864,874,1,0,0,0,865,867, + 7,2,0,0,866,868,7,3,0,0,867,866,1,0,0,0,867,868,1,0,0,0,868,870, + 1,0,0,0,869,871,7,0,0,0,870,869,1,0,0,0,871,872,1,0,0,0,872,870, + 1,0,0,0,872,873,1,0,0,0,873,875,1,0,0,0,874,865,1,0,0,0,874,875, + 1,0,0,0,875,190,1,0,0,0,876,880,7,4,0,0,877,879,7,5,0,0,878,877, + 1,0,0,0,879,882,1,0,0,0,880,878,1,0,0,0,880,881,1,0,0,0,881,192, + 1,0,0,0,882,880,1,0,0,0,883,888,5,34,0,0,884,887,3,195,97,0,885, + 887,8,6,0,0,886,884,1,0,0,0,886,885,1,0,0,0,887,890,1,0,0,0,888, + 886,1,0,0,0,888,889,1,0,0,0,889,891,1,0,0,0,890,888,1,0,0,0,891, + 892,5,34,0,0,892,194,1,0,0,0,893,901,5,92,0,0,894,902,7,7,0,0,895, + 896,5,117,0,0,896,897,3,197,98,0,897,898,3,197,98,0,898,899,3,197, + 98,0,899,900,3,197,98,0,900,902,1,0,0,0,901,894,1,0,0,0,901,895, + 1,0,0,0,902,196,1,0,0,0,903,904,7,8,0,0,904,198,1,0,0,0,905,906, + 5,47,0,0,906,907,5,47,0,0,907,911,1,0,0,0,908,910,8,9,0,0,909,908, + 1,0,0,0,910,913,1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,914, + 1,0,0,0,913,911,1,0,0,0,914,915,6,99,0,0,915,200,1,0,0,0,916,917, + 5,47,0,0,917,918,5,42,0,0,918,922,1,0,0,0,919,921,9,0,0,0,920,919, + 1,0,0,0,921,924,1,0,0,0,922,923,1,0,0,0,922,920,1,0,0,0,923,925, + 1,0,0,0,924,922,1,0,0,0,925,926,5,42,0,0,926,927,5,47,0,0,927,928, + 1,0,0,0,928,929,6,100,0,0,929,202,1,0,0,0,930,932,7,10,0,0,931,930, + 1,0,0,0,932,933,1,0,0,0,933,931,1,0,0,0,933,934,1,0,0,0,934,935, + 1,0,0,0,935,936,6,101,0,0,936,204,1,0,0,0,18,0,837,842,845,852,855, + 861,863,867,872,874,880,886,888,901,911,922,933,1,6,0,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 7e5b13d..8b4cd85 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -31,80 +31,85 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly EDGE = 19; public static readonly PROJECTION = 20; public static readonly WITH = 21; - public static readonly ON = 22; - public static readonly POLICY = 23; - public static readonly DEFAULT = 24; - public static readonly SOURCE = 25; - public static readonly REPOSITORY = 26; - public static readonly COMMIT = 27; - public static readonly REVISION = 28; - public static readonly ID = 29; - public static readonly DOC = 30; - public static readonly MODE = 31; - public static readonly EMITS = 32; - public static readonly RECEIVER = 33; - public static readonly REQUIRES = 34; - public static readonly ANY = 35; - public static readonly GET = 36; - public static readonly SET = 37; - public static readonly WATCH = 38; - public static readonly START = 39; - public static readonly STOP = 40; - public static readonly READ = 41; - public static readonly WRITE = 42; - public static readonly RESOLVE = 43; - public static readonly CONNECT = 44; - public static readonly DISCONNECT = 45; - public static readonly CALL = 46; - public static readonly WATCH_START = 47; - public static readonly WATCH_STOP = 48; - public static readonly SUBSCRIBE = 49; - public static readonly UNSUBSCRIBE = 50; - public static readonly OPTIMISTIC_REGISTER = 51; - public static readonly CRDT = 52; - public static readonly OPTIONAL_ONE = 53; - public static readonly EXACTLY_ONE = 54; - public static readonly MANY_UNIQUE = 55; - public static readonly MANY = 56; - public static readonly ORDERED = 57; - public static readonly UNIT = 58; - public static readonly WATCH_HANDLE = 59; - public static readonly MESSAGE = 60; - public static readonly ATOM_REF = 61; - public static readonly INTERFACE_REF = 62; - public static readonly OPTIONAL = 63; - public static readonly LIST = 64; - public static readonly BOOL = 65; - public static readonly BYTES = 66; - public static readonly DOUBLE = 67; - public static readonly INT32 = 68; - public static readonly INT64 = 69; - public static readonly STRING = 70; - public static readonly UINT32 = 71; - public static readonly UINT64 = 72; - public static readonly TRUE = 73; - public static readonly FALSE = 74; - public static readonly NULL = 75; - public static readonly ARROW = 76; - public static readonly COLON = 77; - public static readonly SEMI = 78; - public static readonly COMMA = 79; - public static readonly DOT = 80; - public static readonly LBRACE = 81; - public static readonly RBRACE = 82; - public static readonly LBRACK = 83; - public static readonly RBRACK = 84; - public static readonly LPAREN = 85; - public static readonly RPAREN = 86; - public static readonly LT = 87; - public static readonly GT = 88; - public static readonly INTEGER = 89; - public static readonly JSON_NUMBER = 90; - public static readonly IDENTIFIER = 91; - public static readonly STRING_LITERAL = 92; - public static readonly LINE_COMMENT = 93; - public static readonly BLOCK_COMMENT = 94; - public static readonly WS = 95; + public static readonly USING = 22; + public static readonly VIA = 23; + public static readonly MATERIALIZE = 24; + public static readonly IF = 25; + public static readonly ABSENT = 26; + public static readonly ON = 27; + public static readonly POLICY = 28; + public static readonly DEFAULT = 29; + public static readonly SOURCE = 30; + public static readonly REPOSITORY = 31; + public static readonly COMMIT = 32; + public static readonly REVISION = 33; + public static readonly ID = 34; + public static readonly DOC = 35; + public static readonly MODE = 36; + public static readonly EMITS = 37; + public static readonly RECEIVER = 38; + public static readonly REQUIRES = 39; + public static readonly ANY = 40; + public static readonly GET = 41; + public static readonly SET = 42; + public static readonly WATCH = 43; + public static readonly START = 44; + public static readonly STOP = 45; + public static readonly READ = 46; + public static readonly WRITE = 47; + public static readonly RESOLVE = 48; + public static readonly CONNECT = 49; + public static readonly DISCONNECT = 50; + public static readonly CALL = 51; + public static readonly WATCH_START = 52; + public static readonly WATCH_STOP = 53; + public static readonly SUBSCRIBE = 54; + public static readonly UNSUBSCRIBE = 55; + public static readonly OPTIMISTIC_REGISTER = 56; + public static readonly CRDT = 57; + public static readonly OPTIONAL_ONE = 58; + public static readonly EXACTLY_ONE = 59; + public static readonly MANY_UNIQUE = 60; + public static readonly MANY = 61; + public static readonly ORDERED = 62; + public static readonly UNIT = 63; + public static readonly WATCH_HANDLE = 64; + public static readonly MESSAGE = 65; + public static readonly ATOM_REF = 66; + public static readonly INTERFACE_REF = 67; + public static readonly OPTIONAL = 68; + public static readonly LIST = 69; + public static readonly BOOL = 70; + public static readonly BYTES = 71; + public static readonly DOUBLE = 72; + public static readonly INT32 = 73; + public static readonly INT64 = 74; + public static readonly STRING = 75; + public static readonly UINT32 = 76; + public static readonly UINT64 = 77; + public static readonly TRUE = 78; + public static readonly FALSE = 79; + public static readonly NULL = 80; + public static readonly ARROW = 81; + public static readonly COLON = 82; + public static readonly SEMI = 83; + public static readonly COMMA = 84; + public static readonly DOT = 85; + public static readonly LBRACE = 86; + public static readonly RBRACE = 87; + public static readonly LBRACK = 88; + public static readonly RBRACK = 89; + public static readonly LPAREN = 90; + public static readonly RPAREN = 91; + public static readonly LT = 92; + public static readonly GT = 93; + public static readonly INTEGER = 94; + public static readonly JSON_NUMBER = 95; + public static readonly IDENTIFIER = 96; + public static readonly STRING_LITERAL = 97; + public static readonly LINE_COMMENT = 98; + public static readonly BLOCK_COMMENT = 99; + public static readonly WS = 100; public static readonly RULE_document = 0; public static readonly RULE_workspaceDecl = 1; public static readonly RULE_workspaceItem = 2; @@ -139,60 +144,62 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_edgeEndpoint = 31; public static readonly RULE_conformanceDecl = 32; public static readonly RULE_conformanceItem = 33; - public static readonly RULE_operationBindingDecl = 34; - public static readonly RULE_memberOperationRef = 35; - public static readonly RULE_operationName = 36; - public static readonly RULE_operationProvider = 37; - public static readonly RULE_statePrimitive = 38; - public static readonly RULE_edgePrimitive = 39; - public static readonly RULE_dependencyBindingBlock = 40; - public static readonly RULE_dependencyBinding = 41; - public static readonly RULE_constructorBindingDecl = 42; - public static readonly RULE_valueType = 43; - public static readonly RULE_scalarType = 44; - public static readonly RULE_cardinality = 45; - public static readonly RULE_jsonLiteral = 46; - public static readonly RULE_jsonObject = 47; - public static readonly RULE_jsonMember = 48; - public static readonly RULE_jsonArray = 49; - public static readonly RULE_identifier = 50; - public static readonly RULE_stringLiteral = 51; + public static readonly RULE_relationshipMaterializationDecl = 34; + public static readonly RULE_operationBindingDecl = 35; + public static readonly RULE_memberOperationRef = 36; + public static readonly RULE_operationName = 37; + public static readonly RULE_operationProvider = 38; + public static readonly RULE_statePrimitive = 39; + public static readonly RULE_edgePrimitive = 40; + public static readonly RULE_dependencyBindingBlock = 41; + public static readonly RULE_dependencyBinding = 42; + public static readonly RULE_constructorBindingDecl = 43; + public static readonly RULE_valueType = 44; + public static readonly RULE_scalarType = 45; + public static readonly RULE_cardinality = 46; + public static readonly RULE_jsonLiteral = 47; + public static readonly RULE_jsonObject = 48; + public static readonly RULE_jsonMember = 49; + public static readonly RULE_jsonArray = 50; + public static readonly RULE_identifier = 51; + public static readonly RULE_stringLiteral = 52; public static readonly literalNames = [ null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'", - "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'on'", - "'policy'", "'default'", "'source'", "'repository'", "'commit'", - "'revision'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", - "'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", - "'read'", "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", - "'watch-start'", "'watch-stop'", "'subscribe'", "'unsubscribe'", - "'optimistic-register'", "'crdt'", "'optional-one'", "'exactly-one'", - "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", - "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", - "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", - "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", - "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", - "'>'" + "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", + "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", + "'default'", "'source'", "'repository'", "'commit'", "'revision'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", + "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", + "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", + "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", + "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", + "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", + "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly ruleNames = [ "document", "workspaceDecl", "workspaceItem", "atomDecl", "interfaceDecl", @@ -203,11 +210,12 @@ export class QuixosCapabilityParser extends antlr.Parser { "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "operationBindingDecl", "memberOperationRef", - "operationName", "operationProvider", "statePrimitive", "edgePrimitive", - "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", - "valueType", "scalarType", "cardinality", "jsonLiteral", "jsonObject", - "jsonMember", "jsonArray", "identifier", "stringLiteral", + "conformanceDecl", "conformanceItem", "relationshipMaterializationDecl", + "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", + "constructorBindingDecl", "valueType", "scalarType", "cardinality", + "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", "identifier", + "stringLiteral", ]; public get grammarFileName(): string { return "QuixosCapability.g4"; } @@ -230,9 +238,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 104; + this.state = 106; this.workspaceDecl(); - this.state = 105; + this.state = 107; this.match(QuixosCapabilityParser.EOF); } } @@ -256,39 +264,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 107; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 108; - this.identifier(); this.state = 109; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 110; - this.stringLiteral(); + this.identifier(); this.state = 111; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 112; this.stringLiteral(); this.state = 113; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.REVISION); this.state = 114; this.stringLiteral(); this.state = 115; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 116; + this.stringLiteral(); + this.state = 117; this.match(QuixosCapabilityParser.LBRACE); - this.state = 119; + this.state = 121; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 136236) !== 0)) { { { - this.state = 116; + this.state = 118; this.workspaceItem(); } } - this.state = 121; + this.state = 123; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 122; + this.state = 124; this.match(QuixosCapabilityParser.RBRACE); } } @@ -309,48 +317,48 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 4, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 130; + this.state = 132; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 124; + this.state = 126; this.atomDecl(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 125; + this.state = 127; this.interfaceDecl(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 126; + this.state = 128; this.packageDecl(); } break; case QuixosCapabilityParser.SHARED: this.enterOuterAlt(localContext, 4); { - this.state = 127; + this.state = 129; this.sharedAttachmentDecl(); } break; case QuixosCapabilityParser.CONFORM: this.enterOuterAlt(localContext, 5); { - this.state = 128; + this.state = 130; this.conformanceDecl(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 129; + this.state = 131; this.constructorBindingDecl(); } break; @@ -378,27 +386,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 132; - this.match(QuixosCapabilityParser.ATOM); - this.state = 133; - this.identifier(); this.state = 134; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 135; + this.identifier(); + this.state = 136; + this.match(QuixosCapabilityParser.ID); + this.state = 137; this.stringLiteral(); - this.state = 138; + this.state = 140; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 30) { + if (_la === 35) { { - this.state = 136; + this.state = 138; this.match(QuixosCapabilityParser.DOC); - this.state = 137; + this.state = 139; this.stringLiteral(); } } - this.state = 140; + this.state = 142; this.match(QuixosCapabilityParser.SEMI); } } @@ -422,37 +430,37 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 142; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 143; - this.identifier(); this.state = 144; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 145; - this.stringLiteral(); + this.identifier(); this.state = 146; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 147; this.stringLiteral(); this.state = 148; - this.sourceBlock(); + this.match(QuixosCapabilityParser.REVISION); this.state = 149; + this.stringLiteral(); + this.state = 150; + this.sourceBlock(); + this.state = 151; this.match(QuixosCapabilityParser.LBRACE); - this.state = 153; + this.state = 155; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 448) !== 0)) { { { - this.state = 150; + this.state = 152; this.interfaceMember(); } } - this.state = 155; + this.state = 157; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 156; + this.state = 158; this.match(QuixosCapabilityParser.RBRACE); } } @@ -475,23 +483,23 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 158; - this.match(QuixosCapabilityParser.SOURCE); - this.state = 159; - this.match(QuixosCapabilityParser.LBRACE); this.state = 160; - this.match(QuixosCapabilityParser.REPOSITORY); + this.match(QuixosCapabilityParser.SOURCE); this.state = 161; - this.stringLiteral(); + this.match(QuixosCapabilityParser.LBRACE); this.state = 162; - this.match(QuixosCapabilityParser.SEMI); + this.match(QuixosCapabilityParser.REPOSITORY); this.state = 163; - this.match(QuixosCapabilityParser.COMMIT); - this.state = 164; this.stringLiteral(); - this.state = 165; + this.state = 164; this.match(QuixosCapabilityParser.SEMI); + this.state = 165; + this.match(QuixosCapabilityParser.COMMIT); this.state = 166; + this.stringLiteral(); + this.state = 167; + this.match(QuixosCapabilityParser.SEMI); + this.state = 168; this.match(QuixosCapabilityParser.RBRACE); } } @@ -512,27 +520,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 12, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 171; + this.state = 173; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 168; + this.state = 170; this.valueMember(); } break; case QuixosCapabilityParser.RELATION: this.enterOuterAlt(localContext, 2); { - this.state = 169; + this.state = 171; this.relationshipMember(); } break; case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 3); { - this.state = 170; + this.state = 172; this.operationMember(); } break; @@ -559,33 +567,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 173; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 174; - this.identifier(); this.state = 175; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.OPERATION); this.state = 176; - this.stringLiteral(); + this.identifier(); this.state = 177; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 178; - this.valueType(); + this.stringLiteral(); this.state = 179; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 180; this.valueType(); this.state = 181; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ARROW); this.state = 182; - this.match(QuixosCapabilityParser.CALL); + this.valueType(); this.state = 183; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.LBRACE); this.state = 184; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CALL); this.state = 185; - this.match(QuixosCapabilityParser.SEMI); + this.match(QuixosCapabilityParser.ID); this.state = 186; + this.stringLiteral(); + this.state = 187; + this.match(QuixosCapabilityParser.SEMI); + this.state = 188; this.match(QuixosCapabilityParser.RBRACE); } } @@ -609,35 +617,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 188; - this.match(QuixosCapabilityParser.VALUE); - this.state = 189; - this.identifier(); this.state = 190; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.VALUE); this.state = 191; - this.stringLiteral(); + this.identifier(); this.state = 192; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 193; - this.valueType(); + this.stringLiteral(); this.state = 194; + this.match(QuixosCapabilityParser.COLON); + this.state = 195; + this.valueType(); + this.state = 196; this.match(QuixosCapabilityParser.LBRACE); - this.state = 198; + this.state = 200; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 36)) & ~0x1F) === 0 && ((1 << (_la - 36)) & 7) !== 0)) { + while (((((_la - 41)) & ~0x1F) === 0 && ((1 << (_la - 41)) & 7) !== 0)) { { { - this.state = 195; + this.state = 197; this.valueMemberOperation(); } } - this.state = 200; + this.state = 202; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 201; + this.state = 203; this.match(QuixosCapabilityParser.RBRACE); } } @@ -658,53 +666,53 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ValueMemberOperationContext(this.context, this.state); this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_valueMemberOperation); try { - this.state = 222; + this.state = 224; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 203; - this.match(QuixosCapabilityParser.GET); - this.state = 204; - this.match(QuixosCapabilityParser.ID); this.state = 205; - this.stringLiteral(); + this.match(QuixosCapabilityParser.GET); this.state = 206; + this.match(QuixosCapabilityParser.ID); + this.state = 207; + this.stringLiteral(); + this.state = 208; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 208; - this.match(QuixosCapabilityParser.SET); - this.state = 209; - this.match(QuixosCapabilityParser.ID); this.state = 210; - this.stringLiteral(); + this.match(QuixosCapabilityParser.SET); this.state = 211; + this.match(QuixosCapabilityParser.ID); + this.state = 212; + this.stringLiteral(); + this.state = 213; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 213; - this.match(QuixosCapabilityParser.WATCH); - this.state = 214; - this.match(QuixosCapabilityParser.START); this.state = 215; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 216; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 217; - this.match(QuixosCapabilityParser.STOP); - this.state = 218; this.match(QuixosCapabilityParser.ID); - this.state = 219; + this.state = 218; this.stringLiteral(); + this.state = 219; + this.match(QuixosCapabilityParser.STOP); this.state = 220; + this.match(QuixosCapabilityParser.ID); + this.state = 221; + this.stringLiteral(); + this.state = 222; this.match(QuixosCapabilityParser.SEMI); } break; @@ -732,47 +740,47 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 224; - this.match(QuixosCapabilityParser.RELATION); - this.state = 225; - this.identifier(); this.state = 226; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.RELATION); this.state = 227; - this.stringLiteral(); + this.identifier(); this.state = 228; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 229; - this.cardinality(); + this.stringLiteral(); this.state = 230; - this.targetConstraint(); + this.match(QuixosCapabilityParser.COLON); + this.state = 231; + this.cardinality(); this.state = 232; + this.targetConstraint(); + this.state = 234; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 57) { + if (_la === 62) { { - this.state = 231; + this.state = 233; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 234; + this.state = 236; this.match(QuixosCapabilityParser.LBRACE); - this.state = 238; + this.state = 240; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 225) !== 0)) { + while (((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & 225) !== 0)) { { { - this.state = 235; + this.state = 237; this.relationshipOperation(); } } - this.state = 240; + this.state = 242; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 241; + this.state = 243; this.match(QuixosCapabilityParser.RBRACE); } } @@ -793,66 +801,66 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new RelationshipOperationContext(this.context, this.state); this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_relationshipOperation); try { - this.state = 267; + this.state = 269; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 243; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 244; - this.match(QuixosCapabilityParser.ID); this.state = 245; - this.stringLiteral(); + this.match(QuixosCapabilityParser.RESOLVE); this.state = 246; + this.match(QuixosCapabilityParser.ID); + this.state = 247; + this.stringLiteral(); + this.state = 248; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 248; - this.match(QuixosCapabilityParser.CONNECT); - this.state = 249; - this.match(QuixosCapabilityParser.ID); this.state = 250; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CONNECT); this.state = 251; + this.match(QuixosCapabilityParser.ID); + this.state = 252; + this.stringLiteral(); + this.state = 253; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 253; - this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 254; - this.match(QuixosCapabilityParser.ID); this.state = 255; - this.stringLiteral(); + this.match(QuixosCapabilityParser.DISCONNECT); this.state = 256; + this.match(QuixosCapabilityParser.ID); + this.state = 257; + this.stringLiteral(); + this.state = 258; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 258; - this.match(QuixosCapabilityParser.WATCH); - this.state = 259; - this.match(QuixosCapabilityParser.START); this.state = 260; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 261; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 262; - this.match(QuixosCapabilityParser.STOP); - this.state = 263; this.match(QuixosCapabilityParser.ID); - this.state = 264; + this.state = 263; this.stringLiteral(); + this.state = 264; + this.match(QuixosCapabilityParser.STOP); this.state = 265; + this.match(QuixosCapabilityParser.ID); + this.state = 266; + this.stringLiteral(); + this.state = 267; this.match(QuixosCapabilityParser.SEMI); } break; @@ -877,24 +885,24 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TargetConstraintContext(this.context, this.state); this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_targetConstraint); try { - this.state = 273; + this.state = 275; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 269; + this.state = 271; this.match(QuixosCapabilityParser.ATOM); - this.state = 270; + this.state = 272; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 271; + this.state = 273; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 272; + this.state = 274; this.identifier(); } break; @@ -922,37 +930,37 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 275; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 276; - this.identifier(); this.state = 277; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PACKAGE); this.state = 278; - this.stringLiteral(); + this.identifier(); this.state = 279; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 280; this.stringLiteral(); this.state = 281; - this.sourceBlock(); + this.match(QuixosCapabilityParser.REVISION); this.state = 282; + this.stringLiteral(); + this.state = 283; + this.sourceBlock(); + this.state = 284; this.match(QuixosCapabilityParser.LBRACE); - this.state = 286; + this.state = 288; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1792) !== 0)) { { { - this.state = 283; + this.state = 285; this.packageExport(); } } - this.state = 288; + this.state = 290; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 289; + this.state = 291; this.match(QuixosCapabilityParser.RBRACE); } } @@ -973,27 +981,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 294; + this.state = 296; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 1); { - this.state = 291; + this.state = 293; this.packageOperationExport(); } break; case QuixosCapabilityParser.FUNCTION: this.enterOuterAlt(localContext, 2); { - this.state = 292; + this.state = 294; this.packageFunctionExport(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 3); { - this.state = 293; + this.state = 295; this.packageConstructorExport(); } break; @@ -1021,51 +1029,51 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 296; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 297; - this.identifier(); this.state = 298; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.OPERATION); this.state = 299; - this.stringLiteral(); + this.identifier(); this.state = 300; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 301; - this.valueType(); + this.stringLiteral(); this.state = 302; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 303; this.valueType(); this.state = 304; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.ARROW); this.state = 305; - this.operationMode(); + this.valueType(); + this.state = 306; + this.match(QuixosCapabilityParser.MODE); this.state = 307; + this.operationMode(); + this.state = 309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 32) { + if (_la === 37) { { - this.state = 306; + this.state = 308; this.eventClause(); } } - this.state = 309; + this.state = 311; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 310; - this.receiverRequirement(); this.state = 312; + this.receiverRequirement(); + this.state = 314; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34) { + if (_la === 39) { { - this.state = 311; + this.state = 313; this.dependencyBlock(); } } - this.state = 314; + this.state = 316; this.match(QuixosCapabilityParser.SEMI); } } @@ -1089,33 +1097,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 316; - this.match(QuixosCapabilityParser.FUNCTION); - this.state = 317; - this.identifier(); this.state = 318; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.FUNCTION); this.state = 319; - this.stringLiteral(); + this.identifier(); this.state = 320; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 321; - this.valueType(); + this.stringLiteral(); this.state = 322; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 323; this.valueType(); + this.state = 324; + this.match(QuixosCapabilityParser.ARROW); this.state = 325; + this.valueType(); + this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34) { + if (_la === 39) { { - this.state = 324; + this.state = 326; this.dependencyBlock(); } } - this.state = 327; + this.state = 329; this.match(QuixosCapabilityParser.SEMI); } } @@ -1139,33 +1147,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 329; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 330; - this.identifier(); this.state = 331; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 332; - this.stringLiteral(); - this.state = 333; - this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 334; this.identifier(); + this.state = 333; + this.match(QuixosCapabilityParser.ID); + this.state = 334; + this.stringLiteral(); this.state = 335; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTS); this.state = 336; - this.valueType(); + this.identifier(); + this.state = 337; + this.match(QuixosCapabilityParser.COLON); this.state = 338; + this.valueType(); + this.state = 340; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34) { + if (_la === 39) { { - this.state = 337; + this.state = 339; this.dependencyBlock(); } } - this.state = 340; + this.state = 342; this.match(QuixosCapabilityParser.SEMI); } } @@ -1188,9 +1196,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 342; + this.state = 344; this.match(QuixosCapabilityParser.EMITS); - this.state = 343; + this.state = 345; this.valueType(); } } @@ -1214,9 +1222,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 345; + this.state = 347; _la = this.tokenStream.LA(1); - if(!(((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 31) !== 0))) { + if(!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1243,43 +1251,43 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 356; + this.state = 358; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 347; + this.state = 349; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 348; + this.state = 350; this.match(QuixosCapabilityParser.ATOM); - this.state = 349; + this.state = 351; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 3); { - this.state = 350; + this.state = 352; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 351; - this.match(QuixosCapabilityParser.LBRACK); this.state = 353; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 355; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25 || _la === 91) { + if (_la === 30 || _la === 96) { { - this.state = 352; + this.state = 354; this.identifierList(); } } - this.state = 355; + this.state = 357; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -1307,21 +1315,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 358; + this.state = 360; this.identifier(); - this.state = 363; + this.state = 365; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 79) { + while (_la === 84) { { { - this.state = 359; + this.state = 361; this.match(QuixosCapabilityParser.COMMA); - this.state = 360; + this.state = 362; this.identifier(); } } - this.state = 365; + this.state = 367; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1347,25 +1355,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 366; + this.state = 368; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 367; + this.state = 369; this.match(QuixosCapabilityParser.LBRACE); - this.state = 371; + this.state = 373; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 787464) !== 0)) { { { - this.state = 368; + this.state = 370; this.dependencyPort(); } } - this.state = 373; + this.state = 375; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 374; + this.state = 376; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1386,88 +1394,88 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DependencyPortContext(this.context, this.state); this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_dependencyPort); try { - this.state = 411; + this.state = 413; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 376; - this.match(QuixosCapabilityParser.STATE); - this.state = 377; - this.identifier(); this.state = 378; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.STATE); this.state = 379; - this.stringLiteral(); + this.identifier(); this.state = 380; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 381; - this.valueType(); + this.stringLiteral(); this.state = 382; - this.primitiveList(); + this.match(QuixosCapabilityParser.COLON); this.state = 383; + this.valueType(); + this.state = 384; + this.primitiveList(); + this.state = 385; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 385; - this.match(QuixosCapabilityParser.EDGE); - this.state = 386; - this.identifier(); this.state = 387; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.EDGE); this.state = 388; - this.stringLiteral(); + this.identifier(); this.state = 389; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 390; - this.cardinality(); + this.stringLiteral(); this.state = 391; - this.targetConstraint(); + this.match(QuixosCapabilityParser.COLON); this.state = 392; - this.primitiveList(); + this.cardinality(); this.state = 393; + this.targetConstraint(); + this.state = 394; + this.primitiveList(); + this.state = 395; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 395; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 396; - this.identifier(); this.state = 397; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 398; - this.stringLiteral(); - this.state = 399; - this.match(QuixosCapabilityParser.COLON); - this.state = 400; this.identifier(); + this.state = 399; + this.match(QuixosCapabilityParser.ID); + this.state = 400; + this.stringLiteral(); this.state = 401; + this.match(QuixosCapabilityParser.COLON); + this.state = 402; + this.identifier(); + this.state = 403; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 403; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 404; - this.identifier(); this.state = 405; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 406; - this.stringLiteral(); - this.state = 407; - this.match(QuixosCapabilityParser.COLON); - this.state = 408; this.identifier(); + this.state = 407; + this.match(QuixosCapabilityParser.ID); + this.state = 408; + this.stringLiteral(); this.state = 409; + this.match(QuixosCapabilityParser.COLON); + this.state = 410; + this.identifier(); + this.state = 411; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1495,27 +1503,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 413; + this.state = 415; this.match(QuixosCapabilityParser.LBRACK); - this.state = 414; + this.state = 416; this.primitive(); - this.state = 419; + this.state = 421; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 79) { + while (_la === 84) { { { - this.state = 415; + this.state = 417; this.match(QuixosCapabilityParser.COMMA); - this.state = 416; + this.state = 418; this.primitive(); } } - this.state = 421; + this.state = 423; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 422; + this.state = 424; this.match(QuixosCapabilityParser.RBRACK); } } @@ -1539,9 +1547,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 424; + this.state = 426; _la = this.tokenStream.LA(1); - if(!(((((_la - 41)) & ~0x1F) === 0 && ((1 << (_la - 41)) & 223) !== 0))) { + if(!(((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1569,9 +1577,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 426; + this.state = 428; this.match(QuixosCapabilityParser.SHARED); - this.state = 427; + this.state = 429; this.attachmentDecl(); } } @@ -1592,20 +1600,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 431; + this.state = 433; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 429; + this.state = 431; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 430; + this.state = 432; this.edgeDecl(); } break; @@ -1633,39 +1641,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 433; - this.match(QuixosCapabilityParser.STATE); - this.state = 434; - this.identifier(); this.state = 435; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.STATE); this.state = 436; - this.stringLiteral(); - this.state = 437; - this.match(QuixosCapabilityParser.ON); - this.state = 438; this.identifier(); + this.state = 437; + this.match(QuixosCapabilityParser.ID); + this.state = 438; + this.stringLiteral(); this.state = 439; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ON); this.state = 440; - this.valueType(); + this.identifier(); this.state = 441; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.COLON); this.state = 442; + this.valueType(); + this.state = 443; + this.match(QuixosCapabilityParser.POLICY); + this.state = 444; this.storagePolicy(); - this.state = 445; + this.state = 447; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 24) { + if (_la === 29) { { - this.state = 443; + this.state = 445; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 444; + this.state = 446; this.jsonLiteral(); } } - this.state = 447; + this.state = 449; this.match(QuixosCapabilityParser.SEMI); } } @@ -1686,26 +1694,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 455; + this.state = 457; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 449; + this.state = 451; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 450; - this.match(QuixosCapabilityParser.CRDT); - this.state = 451; - this.match(QuixosCapabilityParser.LPAREN); this.state = 452; - this.valueType(); + this.match(QuixosCapabilityParser.CRDT); this.state = 453; + this.match(QuixosCapabilityParser.LPAREN); + this.state = 454; + this.valueType(); + this.state = 455; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -1732,21 +1740,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 457; - this.match(QuixosCapabilityParser.EDGE); - this.state = 458; - this.identifier(); this.state = 459; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.EDGE); this.state = 460; - this.stringLiteral(); + this.identifier(); this.state = 461; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ID); this.state = 462; - this.edgeEndpoint(); + this.stringLiteral(); this.state = 463; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.LBRACE); this.state = 464; + this.edgeEndpoint(); + this.state = 465; + this.edgeEndpoint(); + this.state = 466; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1770,29 +1778,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 466; - this.targetConstraint(); - this.state = 467; - this.match(QuixosCapabilityParser.PROJECTION); this.state = 468; - this.identifier(); + this.targetConstraint(); this.state = 469; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PROJECTION); this.state = 470; - this.stringLiteral(); + this.identifier(); this.state = 471; - this.cardinality(); + this.match(QuixosCapabilityParser.ID); + this.state = 472; + this.stringLiteral(); this.state = 473; + this.cardinality(); + this.state = 475; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 57) { + if (_la === 62) { { - this.state = 472; + this.state = 474; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 475; + this.state = 477; this.match(QuixosCapabilityParser.SEMI); } } @@ -1816,31 +1824,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 477; - this.match(QuixosCapabilityParser.CONFORM); - this.state = 478; - this.identifier(); this.state = 479; - this.match(QuixosCapabilityParser.AS); + this.match(QuixosCapabilityParser.CONFORM); this.state = 480; this.identifier(); this.state = 481; + this.match(QuixosCapabilityParser.AS); + this.state = 482; + this.identifier(); + this.state = 483; this.match(QuixosCapabilityParser.LBRACE); - this.state = 485; + this.state = 487; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 14 || _la === 16) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 16859136) !== 0)) { { { - this.state = 482; + this.state = 484; this.conformanceItem(); } } - this.state = 487; + this.state = 489; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 488; + this.state = 490; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1861,25 +1869,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 493; + this.state = 496; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.PRIVATE: this.enterOuterAlt(localContext, 1); { - this.state = 490; + this.state = 492; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 491; + this.state = 493; this.attachmentDecl(); } break; case QuixosCapabilityParser.BIND: this.enterOuterAlt(localContext, 2); { - this.state = 492; + this.state = 494; this.operationBindingDecl(); } break; + case QuixosCapabilityParser.MATERIALIZE: + this.enterOuterAlt(localContext, 3); + { + this.state = 495; + this.relationshipMaterializationDecl(); + } + break; default: throw new antlr.NoViableAltException(this); } @@ -1897,21 +1912,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public operationBindingDecl(): OperationBindingDeclContext { - let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_operationBindingDecl); + public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { + let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 495; - this.match(QuixosCapabilityParser.BIND); - this.state = 496; - this.memberOperationRef(); - this.state = 497; - this.match(QuixosCapabilityParser.TO); this.state = 498; - this.operationProvider(); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 499; + this.identifier(); + this.state = 500; + this.match(QuixosCapabilityParser.IF); + this.state = 501; + this.match(QuixosCapabilityParser.ABSENT); + this.state = 502; + this.match(QuixosCapabilityParser.USING); + this.state = 503; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 504; + this.identifier(); + this.state = 505; + this.match(QuixosCapabilityParser.VIA); + this.state = 506; + this.match(QuixosCapabilityParser.EDGE); + this.state = 507; + this.identifier(); + this.state = 508; + this.match(QuixosCapabilityParser.DOT); + this.state = 509; + this.identifier(); + this.state = 510; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public operationBindingDecl(): OperationBindingDeclContext { + let localContext = new OperationBindingDeclContext(this.context, this.state); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_operationBindingDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 512; + this.match(QuixosCapabilityParser.BIND); + this.state = 513; + this.memberOperationRef(); + this.state = 514; + this.match(QuixosCapabilityParser.TO); + this.state = 515; + this.operationProvider(); + this.state = 516; this.match(QuixosCapabilityParser.SEMI); } } @@ -1930,15 +1992,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 501; + this.state = 518; this.identifier(); - this.state = 502; + this.state = 519; this.match(QuixosCapabilityParser.DOT); - this.state = 503; + this.state = 520; this.operationName(); } } @@ -1957,86 +2019,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_operationName); try { - this.state = 516; + this.state = 533; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 505; + this.state = 522; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 506; + this.state = 523; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 507; + this.state = 524; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 508; + this.state = 525; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 509; + this.state = 526; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 510; + this.state = 527; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 511; + this.state = 528; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 512; + this.state = 529; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 513; + this.state = 530; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 514; + this.state = 531; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 515; + this.state = 532; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -2059,59 +2121,59 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 537; + this.state = 554; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 518; + this.state = 535; this.match(QuixosCapabilityParser.STATE); - this.state = 519; + this.state = 536; this.identifier(); - this.state = 520; + this.state = 537; this.match(QuixosCapabilityParser.DOT); - this.state = 521; + this.state = 538; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 523; + this.state = 540; this.match(QuixosCapabilityParser.EDGE); - this.state = 524; + this.state = 541; this.identifier(); - this.state = 525; + this.state = 542; this.match(QuixosCapabilityParser.DOT); - this.state = 526; + this.state = 543; this.identifier(); - this.state = 527; + this.state = 544; this.match(QuixosCapabilityParser.DOT); - this.state = 528; + this.state = 545; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 530; + this.state = 547; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 531; + this.state = 548; this.identifier(); - this.state = 532; + this.state = 549; this.match(QuixosCapabilityParser.DOT); - this.state = 533; + this.state = 550; this.identifier(); - this.state = 535; + this.state = 552; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 21) { { - this.state = 534; + this.state = 551; this.dependencyBindingBlock(); } } @@ -2137,14 +2199,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 539; + this.state = 556; _la = this.tokenStream.LA(1); - if(!(((((_la - 41)) & ~0x1F) === 0 && ((1 << (_la - 41)) & 195) !== 0))) { + if(!(((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2168,14 +2230,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 541; + this.state = 558; _la = this.tokenStream.LA(1); - if(!(((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & 55) !== 0))) { + if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2199,30 +2261,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 543; + this.state = 560; this.match(QuixosCapabilityParser.WITH); - this.state = 544; + this.state = 561; this.match(QuixosCapabilityParser.LBRACE); - this.state = 548; + this.state = 565; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 25 || _la === 91) { + while (_la === 30 || _la === 96) { { { - this.state = 545; + this.state = 562; this.dependencyBinding(); } } - this.state = 550; + this.state = 567; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 551; + this.state = 568; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2241,72 +2303,109 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_dependencyBinding); + let _la: number; try { - this.state = 579; + this.state = 612; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 33, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 35, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 553; + this.state = 570; this.identifier(); - this.state = 554; + this.state = 571; this.match(QuixosCapabilityParser.TO); - this.state = 555; + this.state = 572; this.match(QuixosCapabilityParser.STATE); - this.state = 556; + this.state = 573; this.identifier(); - this.state = 557; + this.state = 580; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 23) { + { + this.state = 574; + this.match(QuixosCapabilityParser.VIA); + this.state = 575; + this.match(QuixosCapabilityParser.EDGE); + this.state = 576; + this.identifier(); + this.state = 577; + this.match(QuixosCapabilityParser.DOT); + this.state = 578; + this.identifier(); + } + } + + this.state = 582; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 559; + this.state = 584; this.identifier(); - this.state = 560; + this.state = 585; this.match(QuixosCapabilityParser.TO); - this.state = 561; + this.state = 586; this.match(QuixosCapabilityParser.EDGE); - this.state = 562; + this.state = 587; this.identifier(); - this.state = 563; + this.state = 588; this.match(QuixosCapabilityParser.DOT); - this.state = 564; + this.state = 589; this.identifier(); - this.state = 565; + this.state = 596; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 23) { + { + this.state = 590; + this.match(QuixosCapabilityParser.VIA); + this.state = 591; + this.match(QuixosCapabilityParser.EDGE); + this.state = 592; + this.identifier(); + this.state = 593; + this.match(QuixosCapabilityParser.DOT); + this.state = 594; + this.identifier(); + } + } + + this.state = 598; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 567; + this.state = 600; this.identifier(); - this.state = 568; + this.state = 601; this.match(QuixosCapabilityParser.TO); - this.state = 569; + this.state = 602; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 570; + this.state = 603; this.identifier(); - this.state = 571; + this.state = 604; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 573; + this.state = 606; this.identifier(); - this.state = 574; + this.state = 607; this.match(QuixosCapabilityParser.TO); - this.state = 575; + this.state = 608; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 576; + this.state = 609; this.identifier(); - this.state = 577; + this.state = 610; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2327,34 +2426,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 581; + this.state = 614; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 582; + this.state = 615; this.identifier(); - this.state = 583; + this.state = 616; this.match(QuixosCapabilityParser.TO); - this.state = 584; + this.state = 617; this.identifier(); - this.state = 585; + this.state = 618; this.match(QuixosCapabilityParser.DOT); - this.state = 586; + this.state = 619; this.identifier(); - this.state = 588; + this.state = 621; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 21) { { - this.state = 587; + this.state = 620; this.dependencyBindingBlock(); } } - this.state = 590; + this.state = 623; this.match(QuixosCapabilityParser.SEMI); } } @@ -2373,9 +2472,9 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_valueType); try { - this.state = 617; + this.state = 650; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -2388,82 +2487,82 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 592; + this.state = 625; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 593; + this.state = 626; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 594; + this.state = 627; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 595; + this.state = 628; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 596; + this.state = 629; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 597; + this.state = 630; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 598; + this.state = 631; this.match(QuixosCapabilityParser.LT); - this.state = 599; + this.state = 632; this.identifier(); - this.state = 600; + this.state = 633; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 602; + this.state = 635; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 603; + this.state = 636; this.match(QuixosCapabilityParser.LT); - this.state = 604; + this.state = 637; this.identifier(); - this.state = 605; + this.state = 638; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 7); { - this.state = 607; + this.state = 640; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 608; + this.state = 641; this.match(QuixosCapabilityParser.LT); - this.state = 609; + this.state = 642; this.valueType(); - this.state = 610; + this.state = 643; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 8); { - this.state = 612; + this.state = 645; this.match(QuixosCapabilityParser.LIST); - this.state = 613; + this.state = 646; this.match(QuixosCapabilityParser.LT); - this.state = 614; + this.state = 647; this.valueType(); - this.state = 615; + this.state = 648; this.match(QuixosCapabilityParser.GT); } break; @@ -2486,14 +2585,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 619; + this.state = 652; _la = this.tokenStream.LA(1); - if(!(((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 255) !== 0))) { + if(!(((((_la - 70)) & ~0x1F) === 0 && ((1 << (_la - 70)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2517,14 +2616,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 621; + this.state = 654; _la = this.tokenStream.LA(1); - if(!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & 15) !== 0))) { + if(!(((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2548,64 +2647,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 631; + this.state = 664; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 623; + this.state = 656; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 624; + this.state = 657; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 625; + this.state = 658; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 626; + this.state = 659; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 627; + this.state = 660; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 628; + this.state = 661; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 629; + this.state = 662; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 630; + this.state = 663; this.jsonArray(); } break; @@ -2628,40 +2727,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 633; + this.state = 666; this.match(QuixosCapabilityParser.LBRACE); - this.state = 642; + this.state = 675; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 97) { { - this.state = 634; + this.state = 667; this.jsonMember(); - this.state = 639; + this.state = 672; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 79) { + while (_la === 84) { { { - this.state = 635; + this.state = 668; this.match(QuixosCapabilityParser.COMMA); - this.state = 636; + this.state = 669; this.jsonMember(); } } - this.state = 641; + this.state = 674; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 644; + this.state = 677; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2680,15 +2779,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 646; + this.state = 679; this.stringLiteral(); - this.state = 647; + this.state = 680; this.match(QuixosCapabilityParser.COLON); - this.state = 648; + this.state = 681; this.jsonLiteral(); } } @@ -2707,40 +2806,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 650; + this.state = 683; this.match(QuixosCapabilityParser.LBRACK); - this.state = 659; + this.state = 692; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 73)) & ~0x1F) === 0 && ((1 << (_la - 73)) & 722183) !== 0)) { + if (((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 722183) !== 0)) { { - this.state = 651; + this.state = 684; this.jsonLiteral(); - this.state = 656; + this.state = 689; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 79) { + while (_la === 84) { { { - this.state = 652; + this.state = 685; this.match(QuixosCapabilityParser.COMMA); - this.state = 653; + this.state = 686; this.jsonLiteral(); } } - this.state = 658; + this.state = 691; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 661; + this.state = 694; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2759,14 +2858,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 663; + this.state = 696; _la = this.tokenStream.LA(1); - if(!(_la === 25 || _la === 91)) { + if(!(_la === 30 || _la === 96)) { this.errorHandler.recoverInline(this); } else { @@ -2790,11 +2889,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 665; + this.state = 698; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -2813,245 +2912,257 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,95,668,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,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,33, - 7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,39, - 2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,46, - 7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,1,0,1,0,1, - 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,118,8,1,10,1,12,1, - 121,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,131,8,2,1,3,1,3,1,3, - 1,3,1,3,1,3,3,3,139,8,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, - 1,4,5,4,152,8,4,10,4,12,4,155,9,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,3,6,172,8,6,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,8,1,8,1,8,1,8,1,8,1,8,1, - 8,1,8,5,8,197,8,8,10,8,12,8,200,9,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,223, - 8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,233,8,10,1,10,1, - 10,5,10,237,8,10,10,10,12,10,240,9,10,1,10,1,10,1,11,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,268,8,11,1,12,1,12,1, - 12,1,12,3,12,274,8,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, - 13,5,13,285,8,13,10,13,12,13,288,9,13,1,13,1,13,1,14,1,14,1,14,3, - 14,295,8,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1, - 15,3,15,308,8,15,1,15,1,15,1,15,3,15,313,8,15,1,15,1,15,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,326,8,16,1,16,1,16,1,17, - 1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,339,8,17,1,17,1,17, - 1,18,1,18,1,18,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,3,20,354, - 8,20,1,20,3,20,357,8,20,1,21,1,21,1,21,5,21,362,8,21,10,21,12,21, - 365,9,21,1,22,1,22,1,22,5,22,370,8,22,10,22,12,22,373,9,22,1,22, - 1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, + 4,1,100,701,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,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2, + 33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7, + 39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, + 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, + 52,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,120,8, + 1,10,1,12,1,123,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,133,8,2, + 1,3,1,3,1,3,1,3,1,3,1,3,3,3,141,8,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4, + 1,4,1,4,1,4,1,4,5,4,154,8,4,10,4,12,4,157,9,4,1,4,1,4,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,3,6,174,8,6,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,8,1,8,1,8,1, + 8,1,8,1,8,1,8,1,8,5,8,199,8,8,10,8,12,8,202,9,8,1,8,1,8,1,9,1,9, + 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,9,3,9,225,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,235, + 8,10,1,10,1,10,5,10,239,8,10,10,10,12,10,242,9,10,1,10,1,10,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,270,8,11, + 1,12,1,12,1,12,1,12,3,12,276,8,12,1,13,1,13,1,13,1,13,1,13,1,13, + 1,13,1,13,1,13,5,13,287,8,13,10,13,12,13,290,9,13,1,13,1,13,1,14, + 1,14,1,14,3,14,297,8,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15, + 1,15,1,15,1,15,3,15,310,8,15,1,15,1,15,1,15,3,15,315,8,15,1,15,1, + 15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,328,8,16,1, + 16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,341,8, + 17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1, + 20,3,20,356,8,20,1,20,3,20,359,8,20,1,21,1,21,1,21,5,21,364,8,21, + 10,21,12,21,367,9,21,1,22,1,22,1,22,5,22,372,8,22,10,22,12,22,375, + 9,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,412,8,23, - 1,24,1,24,1,24,1,24,5,24,418,8,24,10,24,12,24,421,9,24,1,24,1,24, - 1,25,1,25,1,26,1,26,1,26,1,27,1,27,3,27,432,8,27,1,28,1,28,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,446,8,28,1,28, - 1,28,1,29,1,29,1,29,1,29,1,29,1,29,3,29,456,8,29,1,30,1,30,1,30, - 1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31, - 3,31,474,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,5,32,484,8, - 32,10,32,12,32,487,9,32,1,32,1,32,1,33,1,33,1,33,3,33,494,8,33,1, - 34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,517,8,36,1,37,1,37,1, - 37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1, - 37,1,37,3,37,536,8,37,3,37,538,8,37,1,38,1,38,1,39,1,39,1,40,1,40, - 1,40,5,40,547,8,40,10,40,12,40,550,9,40,1,40,1,40,1,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,580,8,41, - 1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,589,8,42,1,42,1,42,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,618, - 8,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 3,46,632,8,46,1,47,1,47,1,47,1,47,5,47,638,8,47,10,47,12,47,641, - 9,47,3,47,643,8,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49, - 1,49,5,49,655,8,49,10,49,12,49,658,9,49,3,49,660,8,49,1,49,1,49, - 1,50,1,50,1,51,1,51,1,51,0,0,52,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,56,58,60,62,64,66,68, - 70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,0,7,1,0,46, - 50,2,0,41,45,47,48,2,0,41,42,47,48,2,0,43,45,47,48,1,0,65,72,1,0, - 53,56,2,0,25,25,91,91,692,0,104,1,0,0,0,2,107,1,0,0,0,4,130,1,0, - 0,0,6,132,1,0,0,0,8,142,1,0,0,0,10,158,1,0,0,0,12,171,1,0,0,0,14, - 173,1,0,0,0,16,188,1,0,0,0,18,222,1,0,0,0,20,224,1,0,0,0,22,267, - 1,0,0,0,24,273,1,0,0,0,26,275,1,0,0,0,28,294,1,0,0,0,30,296,1,0, - 0,0,32,316,1,0,0,0,34,329,1,0,0,0,36,342,1,0,0,0,38,345,1,0,0,0, - 40,356,1,0,0,0,42,358,1,0,0,0,44,366,1,0,0,0,46,411,1,0,0,0,48,413, - 1,0,0,0,50,424,1,0,0,0,52,426,1,0,0,0,54,431,1,0,0,0,56,433,1,0, - 0,0,58,455,1,0,0,0,60,457,1,0,0,0,62,466,1,0,0,0,64,477,1,0,0,0, - 66,493,1,0,0,0,68,495,1,0,0,0,70,501,1,0,0,0,72,516,1,0,0,0,74,537, - 1,0,0,0,76,539,1,0,0,0,78,541,1,0,0,0,80,543,1,0,0,0,82,579,1,0, - 0,0,84,581,1,0,0,0,86,617,1,0,0,0,88,619,1,0,0,0,90,621,1,0,0,0, - 92,631,1,0,0,0,94,633,1,0,0,0,96,646,1,0,0,0,98,650,1,0,0,0,100, - 663,1,0,0,0,102,665,1,0,0,0,104,105,3,2,1,0,105,106,5,0,0,1,106, - 1,1,0,0,0,107,108,5,1,0,0,108,109,3,100,50,0,109,110,5,29,0,0,110, - 111,3,102,51,0,111,112,5,28,0,0,112,113,3,102,51,0,113,114,5,27, - 0,0,114,115,3,102,51,0,115,119,5,81,0,0,116,118,3,4,2,0,117,116, - 1,0,0,0,118,121,1,0,0,0,119,117,1,0,0,0,119,120,1,0,0,0,120,122, - 1,0,0,0,121,119,1,0,0,0,122,123,5,82,0,0,123,3,1,0,0,0,124,131,3, - 6,3,0,125,131,3,8,4,0,126,131,3,26,13,0,127,131,3,52,26,0,128,131, - 3,64,32,0,129,131,3,84,42,0,130,124,1,0,0,0,130,125,1,0,0,0,130, - 126,1,0,0,0,130,127,1,0,0,0,130,128,1,0,0,0,130,129,1,0,0,0,131, - 5,1,0,0,0,132,133,5,2,0,0,133,134,3,100,50,0,134,135,5,29,0,0,135, - 138,3,102,51,0,136,137,5,30,0,0,137,139,3,102,51,0,138,136,1,0,0, - 0,138,139,1,0,0,0,139,140,1,0,0,0,140,141,5,78,0,0,141,7,1,0,0,0, - 142,143,5,3,0,0,143,144,3,100,50,0,144,145,5,29,0,0,145,146,3,102, - 51,0,146,147,5,28,0,0,147,148,3,102,51,0,148,149,3,10,5,0,149,153, - 5,81,0,0,150,152,3,12,6,0,151,150,1,0,0,0,152,155,1,0,0,0,153,151, - 1,0,0,0,153,154,1,0,0,0,154,156,1,0,0,0,155,153,1,0,0,0,156,157, - 5,82,0,0,157,9,1,0,0,0,158,159,5,25,0,0,159,160,5,81,0,0,160,161, - 5,26,0,0,161,162,3,102,51,0,162,163,5,78,0,0,163,164,5,27,0,0,164, - 165,3,102,51,0,165,166,5,78,0,0,166,167,5,82,0,0,167,11,1,0,0,0, - 168,172,3,16,8,0,169,172,3,20,10,0,170,172,3,14,7,0,171,168,1,0, - 0,0,171,169,1,0,0,0,171,170,1,0,0,0,172,13,1,0,0,0,173,174,5,8,0, - 0,174,175,3,100,50,0,175,176,5,29,0,0,176,177,3,102,51,0,177,178, - 5,77,0,0,178,179,3,86,43,0,179,180,5,76,0,0,180,181,3,86,43,0,181, - 182,5,81,0,0,182,183,5,46,0,0,183,184,5,29,0,0,184,185,3,102,51, - 0,185,186,5,78,0,0,186,187,5,82,0,0,187,15,1,0,0,0,188,189,5,6,0, - 0,189,190,3,100,50,0,190,191,5,29,0,0,191,192,3,102,51,0,192,193, - 5,77,0,0,193,194,3,86,43,0,194,198,5,81,0,0,195,197,3,18,9,0,196, - 195,1,0,0,0,197,200,1,0,0,0,198,196,1,0,0,0,198,199,1,0,0,0,199, - 201,1,0,0,0,200,198,1,0,0,0,201,202,5,82,0,0,202,17,1,0,0,0,203, - 204,5,36,0,0,204,205,5,29,0,0,205,206,3,102,51,0,206,207,5,78,0, - 0,207,223,1,0,0,0,208,209,5,37,0,0,209,210,5,29,0,0,210,211,3,102, - 51,0,211,212,5,78,0,0,212,223,1,0,0,0,213,214,5,38,0,0,214,215,5, - 39,0,0,215,216,5,29,0,0,216,217,3,102,51,0,217,218,5,40,0,0,218, - 219,5,29,0,0,219,220,3,102,51,0,220,221,5,78,0,0,221,223,1,0,0,0, - 222,203,1,0,0,0,222,208,1,0,0,0,222,213,1,0,0,0,223,19,1,0,0,0,224, - 225,5,7,0,0,225,226,3,100,50,0,226,227,5,29,0,0,227,228,3,102,51, - 0,228,229,5,77,0,0,229,230,3,90,45,0,230,232,3,24,12,0,231,233,5, - 57,0,0,232,231,1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,238,5, - 81,0,0,235,237,3,22,11,0,236,235,1,0,0,0,237,240,1,0,0,0,238,236, - 1,0,0,0,238,239,1,0,0,0,239,241,1,0,0,0,240,238,1,0,0,0,241,242, - 5,82,0,0,242,21,1,0,0,0,243,244,5,43,0,0,244,245,5,29,0,0,245,246, - 3,102,51,0,246,247,5,78,0,0,247,268,1,0,0,0,248,249,5,44,0,0,249, - 250,5,29,0,0,250,251,3,102,51,0,251,252,5,78,0,0,252,268,1,0,0,0, - 253,254,5,45,0,0,254,255,5,29,0,0,255,256,3,102,51,0,256,257,5,78, - 0,0,257,268,1,0,0,0,258,259,5,38,0,0,259,260,5,39,0,0,260,261,5, - 29,0,0,261,262,3,102,51,0,262,263,5,40,0,0,263,264,5,29,0,0,264, - 265,3,102,51,0,265,266,5,78,0,0,266,268,1,0,0,0,267,243,1,0,0,0, - 267,248,1,0,0,0,267,253,1,0,0,0,267,258,1,0,0,0,268,23,1,0,0,0,269, - 270,5,2,0,0,270,274,3,100,50,0,271,272,5,3,0,0,272,274,3,100,50, - 0,273,269,1,0,0,0,273,271,1,0,0,0,274,25,1,0,0,0,275,276,5,5,0,0, - 276,277,3,100,50,0,277,278,5,29,0,0,278,279,3,102,51,0,279,280,5, - 28,0,0,280,281,3,102,51,0,281,282,3,10,5,0,282,286,5,81,0,0,283, - 285,3,28,14,0,284,283,1,0,0,0,285,288,1,0,0,0,286,284,1,0,0,0,286, - 287,1,0,0,0,287,289,1,0,0,0,288,286,1,0,0,0,289,290,5,82,0,0,290, - 27,1,0,0,0,291,295,3,30,15,0,292,295,3,32,16,0,293,295,3,34,17,0, - 294,291,1,0,0,0,294,292,1,0,0,0,294,293,1,0,0,0,295,29,1,0,0,0,296, - 297,5,8,0,0,297,298,3,100,50,0,298,299,5,29,0,0,299,300,3,102,51, - 0,300,301,5,77,0,0,301,302,3,86,43,0,302,303,5,76,0,0,303,304,3, - 86,43,0,304,305,5,31,0,0,305,307,3,38,19,0,306,308,3,36,18,0,307, - 306,1,0,0,0,307,308,1,0,0,0,308,309,1,0,0,0,309,310,5,33,0,0,310, - 312,3,40,20,0,311,313,3,44,22,0,312,311,1,0,0,0,312,313,1,0,0,0, - 313,314,1,0,0,0,314,315,5,78,0,0,315,31,1,0,0,0,316,317,5,9,0,0, - 317,318,3,100,50,0,318,319,5,29,0,0,319,320,3,102,51,0,320,321,5, - 77,0,0,321,322,3,86,43,0,322,323,5,76,0,0,323,325,3,86,43,0,324, - 326,3,44,22,0,325,324,1,0,0,0,325,326,1,0,0,0,326,327,1,0,0,0,327, - 328,5,78,0,0,328,33,1,0,0,0,329,330,5,10,0,0,330,331,3,100,50,0, - 331,332,5,29,0,0,332,333,3,102,51,0,333,334,5,11,0,0,334,335,3,100, - 50,0,335,336,5,77,0,0,336,338,3,86,43,0,337,339,3,44,22,0,338,337, - 1,0,0,0,338,339,1,0,0,0,339,340,1,0,0,0,340,341,5,78,0,0,341,35, - 1,0,0,0,342,343,5,32,0,0,343,344,3,86,43,0,344,37,1,0,0,0,345,346, - 7,0,0,0,346,39,1,0,0,0,347,357,5,35,0,0,348,349,5,2,0,0,349,357, - 3,100,50,0,350,351,5,4,0,0,351,353,5,83,0,0,352,354,3,42,21,0,353, - 352,1,0,0,0,353,354,1,0,0,0,354,355,1,0,0,0,355,357,5,84,0,0,356, - 347,1,0,0,0,356,348,1,0,0,0,356,350,1,0,0,0,357,41,1,0,0,0,358,363, - 3,100,50,0,359,360,5,79,0,0,360,362,3,100,50,0,361,359,1,0,0,0,362, - 365,1,0,0,0,363,361,1,0,0,0,363,364,1,0,0,0,364,43,1,0,0,0,365,363, - 1,0,0,0,366,367,5,34,0,0,367,371,5,81,0,0,368,370,3,46,23,0,369, - 368,1,0,0,0,370,373,1,0,0,0,371,369,1,0,0,0,371,372,1,0,0,0,372, - 374,1,0,0,0,373,371,1,0,0,0,374,375,5,82,0,0,375,45,1,0,0,0,376, - 377,5,18,0,0,377,378,3,100,50,0,378,379,5,29,0,0,379,380,3,102,51, - 0,380,381,5,77,0,0,381,382,3,86,43,0,382,383,3,48,24,0,383,384,5, - 78,0,0,384,412,1,0,0,0,385,386,5,19,0,0,386,387,3,100,50,0,387,388, - 5,29,0,0,388,389,3,102,51,0,389,390,5,77,0,0,390,391,3,90,45,0,391, - 392,3,24,12,0,392,393,3,48,24,0,393,394,5,78,0,0,394,412,1,0,0,0, - 395,396,5,3,0,0,396,397,3,100,50,0,397,398,5,29,0,0,398,399,3,102, - 51,0,399,400,5,77,0,0,400,401,3,100,50,0,401,402,5,78,0,0,402,412, - 1,0,0,0,403,404,5,10,0,0,404,405,3,100,50,0,405,406,5,29,0,0,406, - 407,3,102,51,0,407,408,5,77,0,0,408,409,3,100,50,0,409,410,5,78, - 0,0,410,412,1,0,0,0,411,376,1,0,0,0,411,385,1,0,0,0,411,395,1,0, - 0,0,411,403,1,0,0,0,412,47,1,0,0,0,413,414,5,83,0,0,414,419,3,50, - 25,0,415,416,5,79,0,0,416,418,3,50,25,0,417,415,1,0,0,0,418,421, - 1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419, - 1,0,0,0,422,423,5,84,0,0,423,49,1,0,0,0,424,425,7,1,0,0,425,51,1, - 0,0,0,426,427,5,17,0,0,427,428,3,54,27,0,428,53,1,0,0,0,429,432, - 3,56,28,0,430,432,3,60,30,0,431,429,1,0,0,0,431,430,1,0,0,0,432, - 55,1,0,0,0,433,434,5,18,0,0,434,435,3,100,50,0,435,436,5,29,0,0, - 436,437,3,102,51,0,437,438,5,22,0,0,438,439,3,100,50,0,439,440,5, - 77,0,0,440,441,3,86,43,0,441,442,5,23,0,0,442,445,3,58,29,0,443, - 444,5,24,0,0,444,446,3,92,46,0,445,443,1,0,0,0,445,446,1,0,0,0,446, - 447,1,0,0,0,447,448,5,78,0,0,448,57,1,0,0,0,449,456,5,51,0,0,450, - 451,5,52,0,0,451,452,5,85,0,0,452,453,3,86,43,0,453,454,5,86,0,0, - 454,456,1,0,0,0,455,449,1,0,0,0,455,450,1,0,0,0,456,59,1,0,0,0,457, - 458,5,19,0,0,458,459,3,100,50,0,459,460,5,29,0,0,460,461,3,102,51, - 0,461,462,5,81,0,0,462,463,3,62,31,0,463,464,3,62,31,0,464,465,5, - 82,0,0,465,61,1,0,0,0,466,467,3,24,12,0,467,468,5,20,0,0,468,469, - 3,100,50,0,469,470,5,29,0,0,470,471,3,102,51,0,471,473,3,90,45,0, - 472,474,5,57,0,0,473,472,1,0,0,0,473,474,1,0,0,0,474,475,1,0,0,0, - 475,476,5,78,0,0,476,63,1,0,0,0,477,478,5,12,0,0,478,479,3,100,50, - 0,479,480,5,13,0,0,480,481,3,100,50,0,481,485,5,81,0,0,482,484,3, - 66,33,0,483,482,1,0,0,0,484,487,1,0,0,0,485,483,1,0,0,0,485,486, - 1,0,0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,82,0,0,489,65, - 1,0,0,0,490,491,5,16,0,0,491,494,3,54,27,0,492,494,3,68,34,0,493, - 490,1,0,0,0,493,492,1,0,0,0,494,67,1,0,0,0,495,496,5,14,0,0,496, - 497,3,70,35,0,497,498,5,15,0,0,498,499,3,74,37,0,499,500,5,78,0, - 0,500,69,1,0,0,0,501,502,3,100,50,0,502,503,5,80,0,0,503,504,3,72, - 36,0,504,71,1,0,0,0,505,517,3,100,50,0,506,517,5,46,0,0,507,517, - 5,36,0,0,508,517,5,37,0,0,509,517,5,43,0,0,510,517,5,44,0,0,511, - 517,5,45,0,0,512,517,5,47,0,0,513,517,5,48,0,0,514,517,5,49,0,0, - 515,517,5,50,0,0,516,505,1,0,0,0,516,506,1,0,0,0,516,507,1,0,0,0, - 516,508,1,0,0,0,516,509,1,0,0,0,516,510,1,0,0,0,516,511,1,0,0,0, - 516,512,1,0,0,0,516,513,1,0,0,0,516,514,1,0,0,0,516,515,1,0,0,0, - 517,73,1,0,0,0,518,519,5,18,0,0,519,520,3,100,50,0,520,521,5,80, - 0,0,521,522,3,76,38,0,522,538,1,0,0,0,523,524,5,19,0,0,524,525,3, - 100,50,0,525,526,5,80,0,0,526,527,3,100,50,0,527,528,5,80,0,0,528, - 529,3,78,39,0,529,538,1,0,0,0,530,531,5,5,0,0,531,532,3,100,50,0, - 532,533,5,80,0,0,533,535,3,100,50,0,534,536,3,80,40,0,535,534,1, - 0,0,0,535,536,1,0,0,0,536,538,1,0,0,0,537,518,1,0,0,0,537,523,1, - 0,0,0,537,530,1,0,0,0,538,75,1,0,0,0,539,540,7,2,0,0,540,77,1,0, - 0,0,541,542,7,3,0,0,542,79,1,0,0,0,543,544,5,21,0,0,544,548,5,81, - 0,0,545,547,3,82,41,0,546,545,1,0,0,0,547,550,1,0,0,0,548,546,1, - 0,0,0,548,549,1,0,0,0,549,551,1,0,0,0,550,548,1,0,0,0,551,552,5, - 82,0,0,552,81,1,0,0,0,553,554,3,100,50,0,554,555,5,15,0,0,555,556, - 5,18,0,0,556,557,3,100,50,0,557,558,5,78,0,0,558,580,1,0,0,0,559, - 560,3,100,50,0,560,561,5,15,0,0,561,562,5,19,0,0,562,563,3,100,50, - 0,563,564,5,80,0,0,564,565,3,100,50,0,565,566,5,78,0,0,566,580,1, - 0,0,0,567,568,3,100,50,0,568,569,5,15,0,0,569,570,5,3,0,0,570,571, - 3,100,50,0,571,572,5,78,0,0,572,580,1,0,0,0,573,574,3,100,50,0,574, - 575,5,15,0,0,575,576,5,10,0,0,576,577,3,100,50,0,577,578,5,78,0, - 0,578,580,1,0,0,0,579,553,1,0,0,0,579,559,1,0,0,0,579,567,1,0,0, - 0,579,573,1,0,0,0,580,83,1,0,0,0,581,582,5,10,0,0,582,583,3,100, - 50,0,583,584,5,15,0,0,584,585,3,100,50,0,585,586,5,80,0,0,586,588, - 3,100,50,0,587,589,3,80,40,0,588,587,1,0,0,0,588,589,1,0,0,0,589, - 590,1,0,0,0,590,591,5,78,0,0,591,85,1,0,0,0,592,618,3,88,44,0,593, - 618,5,58,0,0,594,618,5,59,0,0,595,596,5,60,0,0,596,618,3,102,51, - 0,597,598,5,61,0,0,598,599,5,87,0,0,599,600,3,100,50,0,600,601,5, - 88,0,0,601,618,1,0,0,0,602,603,5,62,0,0,603,604,5,87,0,0,604,605, - 3,100,50,0,605,606,5,88,0,0,606,618,1,0,0,0,607,608,5,63,0,0,608, - 609,5,87,0,0,609,610,3,86,43,0,610,611,5,88,0,0,611,618,1,0,0,0, - 612,613,5,64,0,0,613,614,5,87,0,0,614,615,3,86,43,0,615,616,5,88, - 0,0,616,618,1,0,0,0,617,592,1,0,0,0,617,593,1,0,0,0,617,594,1,0, - 0,0,617,595,1,0,0,0,617,597,1,0,0,0,617,602,1,0,0,0,617,607,1,0, - 0,0,617,612,1,0,0,0,618,87,1,0,0,0,619,620,7,4,0,0,620,89,1,0,0, - 0,621,622,7,5,0,0,622,91,1,0,0,0,623,632,3,102,51,0,624,632,5,89, - 0,0,625,632,5,90,0,0,626,632,5,73,0,0,627,632,5,74,0,0,628,632,5, - 75,0,0,629,632,3,94,47,0,630,632,3,98,49,0,631,623,1,0,0,0,631,624, - 1,0,0,0,631,625,1,0,0,0,631,626,1,0,0,0,631,627,1,0,0,0,631,628, - 1,0,0,0,631,629,1,0,0,0,631,630,1,0,0,0,632,93,1,0,0,0,633,642,5, - 81,0,0,634,639,3,96,48,0,635,636,5,79,0,0,636,638,3,96,48,0,637, - 635,1,0,0,0,638,641,1,0,0,0,639,637,1,0,0,0,639,640,1,0,0,0,640, - 643,1,0,0,0,641,639,1,0,0,0,642,634,1,0,0,0,642,643,1,0,0,0,643, - 644,1,0,0,0,644,645,5,82,0,0,645,95,1,0,0,0,646,647,3,102,51,0,647, - 648,5,77,0,0,648,649,3,92,46,0,649,97,1,0,0,0,650,659,5,83,0,0,651, - 656,3,92,46,0,652,653,5,79,0,0,653,655,3,92,46,0,654,652,1,0,0,0, - 655,658,1,0,0,0,656,654,1,0,0,0,656,657,1,0,0,0,657,660,1,0,0,0, - 658,656,1,0,0,0,659,651,1,0,0,0,659,660,1,0,0,0,660,661,1,0,0,0, - 661,662,5,84,0,0,662,99,1,0,0,0,663,664,7,6,0,0,664,101,1,0,0,0, - 665,666,5,92,0,0,666,103,1,0,0,0,41,119,130,138,153,171,198,222, - 232,238,267,273,286,294,307,312,325,338,353,356,363,371,411,419, - 431,445,455,473,485,493,516,535,537,548,579,588,617,631,639,642, - 656,659 + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, + 414,8,23,1,24,1,24,1,24,1,24,5,24,420,8,24,10,24,12,24,423,9,24, + 1,24,1,24,1,25,1,25,1,26,1,26,1,26,1,27,1,27,3,27,434,8,27,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,448, + 8,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,3,29,458,8,29,1,30, + 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31, + 1,31,1,31,3,31,476,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32, + 5,32,486,8,32,10,32,12,32,489,9,32,1,32,1,32,1,33,1,33,1,33,1,33, + 3,33,497,8,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, + 1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,3,37, + 534,8,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, + 1,38,1,38,1,38,1,38,1,38,1,38,3,38,553,8,38,3,38,555,8,38,1,39,1, + 39,1,40,1,40,1,41,1,41,1,41,5,41,564,8,41,10,41,12,41,567,9,41,1, + 41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,581, + 8,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, + 1,42,1,42,3,42,597,8,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, + 1,42,1,42,1,42,1,42,1,42,1,42,3,42,613,8,42,1,43,1,43,1,43,1,43, + 1,43,1,43,1,43,3,43,622,8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,1,44,1,44,1,44,1,44,3,44,651,8,44,1,45,1,45,1,46, + 1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,665,8,47,1,48, + 1,48,1,48,1,48,5,48,671,8,48,10,48,12,48,674,9,48,3,48,676,8,48, + 1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,5,50,688,8,50, + 10,50,12,50,691,9,50,3,50,693,8,50,1,50,1,50,1,51,1,51,1,52,1,52, + 1,52,0,0,53,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,56,58,60,62,64,66,68,70,72,74,76,78,80, + 82,84,86,88,90,92,94,96,98,100,102,104,0,7,1,0,51,55,2,0,46,50,52, + 53,2,0,46,47,52,53,2,0,48,50,52,53,1,0,70,77,1,0,58,61,2,0,30,30, + 96,96,727,0,106,1,0,0,0,2,109,1,0,0,0,4,132,1,0,0,0,6,134,1,0,0, + 0,8,144,1,0,0,0,10,160,1,0,0,0,12,173,1,0,0,0,14,175,1,0,0,0,16, + 190,1,0,0,0,18,224,1,0,0,0,20,226,1,0,0,0,22,269,1,0,0,0,24,275, + 1,0,0,0,26,277,1,0,0,0,28,296,1,0,0,0,30,298,1,0,0,0,32,318,1,0, + 0,0,34,331,1,0,0,0,36,344,1,0,0,0,38,347,1,0,0,0,40,358,1,0,0,0, + 42,360,1,0,0,0,44,368,1,0,0,0,46,413,1,0,0,0,48,415,1,0,0,0,50,426, + 1,0,0,0,52,428,1,0,0,0,54,433,1,0,0,0,56,435,1,0,0,0,58,457,1,0, + 0,0,60,459,1,0,0,0,62,468,1,0,0,0,64,479,1,0,0,0,66,496,1,0,0,0, + 68,498,1,0,0,0,70,512,1,0,0,0,72,518,1,0,0,0,74,533,1,0,0,0,76,554, + 1,0,0,0,78,556,1,0,0,0,80,558,1,0,0,0,82,560,1,0,0,0,84,612,1,0, + 0,0,86,614,1,0,0,0,88,650,1,0,0,0,90,652,1,0,0,0,92,654,1,0,0,0, + 94,664,1,0,0,0,96,666,1,0,0,0,98,679,1,0,0,0,100,683,1,0,0,0,102, + 696,1,0,0,0,104,698,1,0,0,0,106,107,3,2,1,0,107,108,5,0,0,1,108, + 1,1,0,0,0,109,110,5,1,0,0,110,111,3,102,51,0,111,112,5,34,0,0,112, + 113,3,104,52,0,113,114,5,33,0,0,114,115,3,104,52,0,115,116,5,32, + 0,0,116,117,3,104,52,0,117,121,5,86,0,0,118,120,3,4,2,0,119,118, + 1,0,0,0,120,123,1,0,0,0,121,119,1,0,0,0,121,122,1,0,0,0,122,124, + 1,0,0,0,123,121,1,0,0,0,124,125,5,87,0,0,125,3,1,0,0,0,126,133,3, + 6,3,0,127,133,3,8,4,0,128,133,3,26,13,0,129,133,3,52,26,0,130,133, + 3,64,32,0,131,133,3,86,43,0,132,126,1,0,0,0,132,127,1,0,0,0,132, + 128,1,0,0,0,132,129,1,0,0,0,132,130,1,0,0,0,132,131,1,0,0,0,133, + 5,1,0,0,0,134,135,5,2,0,0,135,136,3,102,51,0,136,137,5,34,0,0,137, + 140,3,104,52,0,138,139,5,35,0,0,139,141,3,104,52,0,140,138,1,0,0, + 0,140,141,1,0,0,0,141,142,1,0,0,0,142,143,5,83,0,0,143,7,1,0,0,0, + 144,145,5,3,0,0,145,146,3,102,51,0,146,147,5,34,0,0,147,148,3,104, + 52,0,148,149,5,33,0,0,149,150,3,104,52,0,150,151,3,10,5,0,151,155, + 5,86,0,0,152,154,3,12,6,0,153,152,1,0,0,0,154,157,1,0,0,0,155,153, + 1,0,0,0,155,156,1,0,0,0,156,158,1,0,0,0,157,155,1,0,0,0,158,159, + 5,87,0,0,159,9,1,0,0,0,160,161,5,30,0,0,161,162,5,86,0,0,162,163, + 5,31,0,0,163,164,3,104,52,0,164,165,5,83,0,0,165,166,5,32,0,0,166, + 167,3,104,52,0,167,168,5,83,0,0,168,169,5,87,0,0,169,11,1,0,0,0, + 170,174,3,16,8,0,171,174,3,20,10,0,172,174,3,14,7,0,173,170,1,0, + 0,0,173,171,1,0,0,0,173,172,1,0,0,0,174,13,1,0,0,0,175,176,5,8,0, + 0,176,177,3,102,51,0,177,178,5,34,0,0,178,179,3,104,52,0,179,180, + 5,82,0,0,180,181,3,88,44,0,181,182,5,81,0,0,182,183,3,88,44,0,183, + 184,5,86,0,0,184,185,5,51,0,0,185,186,5,34,0,0,186,187,3,104,52, + 0,187,188,5,83,0,0,188,189,5,87,0,0,189,15,1,0,0,0,190,191,5,6,0, + 0,191,192,3,102,51,0,192,193,5,34,0,0,193,194,3,104,52,0,194,195, + 5,82,0,0,195,196,3,88,44,0,196,200,5,86,0,0,197,199,3,18,9,0,198, + 197,1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,200,201,1,0,0,0,201, + 203,1,0,0,0,202,200,1,0,0,0,203,204,5,87,0,0,204,17,1,0,0,0,205, + 206,5,41,0,0,206,207,5,34,0,0,207,208,3,104,52,0,208,209,5,83,0, + 0,209,225,1,0,0,0,210,211,5,42,0,0,211,212,5,34,0,0,212,213,3,104, + 52,0,213,214,5,83,0,0,214,225,1,0,0,0,215,216,5,43,0,0,216,217,5, + 44,0,0,217,218,5,34,0,0,218,219,3,104,52,0,219,220,5,45,0,0,220, + 221,5,34,0,0,221,222,3,104,52,0,222,223,5,83,0,0,223,225,1,0,0,0, + 224,205,1,0,0,0,224,210,1,0,0,0,224,215,1,0,0,0,225,19,1,0,0,0,226, + 227,5,7,0,0,227,228,3,102,51,0,228,229,5,34,0,0,229,230,3,104,52, + 0,230,231,5,82,0,0,231,232,3,92,46,0,232,234,3,24,12,0,233,235,5, + 62,0,0,234,233,1,0,0,0,234,235,1,0,0,0,235,236,1,0,0,0,236,240,5, + 86,0,0,237,239,3,22,11,0,238,237,1,0,0,0,239,242,1,0,0,0,240,238, + 1,0,0,0,240,241,1,0,0,0,241,243,1,0,0,0,242,240,1,0,0,0,243,244, + 5,87,0,0,244,21,1,0,0,0,245,246,5,48,0,0,246,247,5,34,0,0,247,248, + 3,104,52,0,248,249,5,83,0,0,249,270,1,0,0,0,250,251,5,49,0,0,251, + 252,5,34,0,0,252,253,3,104,52,0,253,254,5,83,0,0,254,270,1,0,0,0, + 255,256,5,50,0,0,256,257,5,34,0,0,257,258,3,104,52,0,258,259,5,83, + 0,0,259,270,1,0,0,0,260,261,5,43,0,0,261,262,5,44,0,0,262,263,5, + 34,0,0,263,264,3,104,52,0,264,265,5,45,0,0,265,266,5,34,0,0,266, + 267,3,104,52,0,267,268,5,83,0,0,268,270,1,0,0,0,269,245,1,0,0,0, + 269,250,1,0,0,0,269,255,1,0,0,0,269,260,1,0,0,0,270,23,1,0,0,0,271, + 272,5,2,0,0,272,276,3,102,51,0,273,274,5,3,0,0,274,276,3,102,51, + 0,275,271,1,0,0,0,275,273,1,0,0,0,276,25,1,0,0,0,277,278,5,5,0,0, + 278,279,3,102,51,0,279,280,5,34,0,0,280,281,3,104,52,0,281,282,5, + 33,0,0,282,283,3,104,52,0,283,284,3,10,5,0,284,288,5,86,0,0,285, + 287,3,28,14,0,286,285,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288, + 289,1,0,0,0,289,291,1,0,0,0,290,288,1,0,0,0,291,292,5,87,0,0,292, + 27,1,0,0,0,293,297,3,30,15,0,294,297,3,32,16,0,295,297,3,34,17,0, + 296,293,1,0,0,0,296,294,1,0,0,0,296,295,1,0,0,0,297,29,1,0,0,0,298, + 299,5,8,0,0,299,300,3,102,51,0,300,301,5,34,0,0,301,302,3,104,52, + 0,302,303,5,82,0,0,303,304,3,88,44,0,304,305,5,81,0,0,305,306,3, + 88,44,0,306,307,5,36,0,0,307,309,3,38,19,0,308,310,3,36,18,0,309, + 308,1,0,0,0,309,310,1,0,0,0,310,311,1,0,0,0,311,312,5,38,0,0,312, + 314,3,40,20,0,313,315,3,44,22,0,314,313,1,0,0,0,314,315,1,0,0,0, + 315,316,1,0,0,0,316,317,5,83,0,0,317,31,1,0,0,0,318,319,5,9,0,0, + 319,320,3,102,51,0,320,321,5,34,0,0,321,322,3,104,52,0,322,323,5, + 82,0,0,323,324,3,88,44,0,324,325,5,81,0,0,325,327,3,88,44,0,326, + 328,3,44,22,0,327,326,1,0,0,0,327,328,1,0,0,0,328,329,1,0,0,0,329, + 330,5,83,0,0,330,33,1,0,0,0,331,332,5,10,0,0,332,333,3,102,51,0, + 333,334,5,34,0,0,334,335,3,104,52,0,335,336,5,11,0,0,336,337,3,102, + 51,0,337,338,5,82,0,0,338,340,3,88,44,0,339,341,3,44,22,0,340,339, + 1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,83,0,0,343,35, + 1,0,0,0,344,345,5,37,0,0,345,346,3,88,44,0,346,37,1,0,0,0,347,348, + 7,0,0,0,348,39,1,0,0,0,349,359,5,40,0,0,350,351,5,2,0,0,351,359, + 3,102,51,0,352,353,5,4,0,0,353,355,5,88,0,0,354,356,3,42,21,0,355, + 354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,359,5,89,0,0,358, + 349,1,0,0,0,358,350,1,0,0,0,358,352,1,0,0,0,359,41,1,0,0,0,360,365, + 3,102,51,0,361,362,5,84,0,0,362,364,3,102,51,0,363,361,1,0,0,0,364, + 367,1,0,0,0,365,363,1,0,0,0,365,366,1,0,0,0,366,43,1,0,0,0,367,365, + 1,0,0,0,368,369,5,39,0,0,369,373,5,86,0,0,370,372,3,46,23,0,371, + 370,1,0,0,0,372,375,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0,374, + 376,1,0,0,0,375,373,1,0,0,0,376,377,5,87,0,0,377,45,1,0,0,0,378, + 379,5,18,0,0,379,380,3,102,51,0,380,381,5,34,0,0,381,382,3,104,52, + 0,382,383,5,82,0,0,383,384,3,88,44,0,384,385,3,48,24,0,385,386,5, + 83,0,0,386,414,1,0,0,0,387,388,5,19,0,0,388,389,3,102,51,0,389,390, + 5,34,0,0,390,391,3,104,52,0,391,392,5,82,0,0,392,393,3,92,46,0,393, + 394,3,24,12,0,394,395,3,48,24,0,395,396,5,83,0,0,396,414,1,0,0,0, + 397,398,5,3,0,0,398,399,3,102,51,0,399,400,5,34,0,0,400,401,3,104, + 52,0,401,402,5,82,0,0,402,403,3,102,51,0,403,404,5,83,0,0,404,414, + 1,0,0,0,405,406,5,10,0,0,406,407,3,102,51,0,407,408,5,34,0,0,408, + 409,3,104,52,0,409,410,5,82,0,0,410,411,3,102,51,0,411,412,5,83, + 0,0,412,414,1,0,0,0,413,378,1,0,0,0,413,387,1,0,0,0,413,397,1,0, + 0,0,413,405,1,0,0,0,414,47,1,0,0,0,415,416,5,88,0,0,416,421,3,50, + 25,0,417,418,5,84,0,0,418,420,3,50,25,0,419,417,1,0,0,0,420,423, + 1,0,0,0,421,419,1,0,0,0,421,422,1,0,0,0,422,424,1,0,0,0,423,421, + 1,0,0,0,424,425,5,89,0,0,425,49,1,0,0,0,426,427,7,1,0,0,427,51,1, + 0,0,0,428,429,5,17,0,0,429,430,3,54,27,0,430,53,1,0,0,0,431,434, + 3,56,28,0,432,434,3,60,30,0,433,431,1,0,0,0,433,432,1,0,0,0,434, + 55,1,0,0,0,435,436,5,18,0,0,436,437,3,102,51,0,437,438,5,34,0,0, + 438,439,3,104,52,0,439,440,5,27,0,0,440,441,3,102,51,0,441,442,5, + 82,0,0,442,443,3,88,44,0,443,444,5,28,0,0,444,447,3,58,29,0,445, + 446,5,29,0,0,446,448,3,94,47,0,447,445,1,0,0,0,447,448,1,0,0,0,448, + 449,1,0,0,0,449,450,5,83,0,0,450,57,1,0,0,0,451,458,5,56,0,0,452, + 453,5,57,0,0,453,454,5,90,0,0,454,455,3,88,44,0,455,456,5,91,0,0, + 456,458,1,0,0,0,457,451,1,0,0,0,457,452,1,0,0,0,458,59,1,0,0,0,459, + 460,5,19,0,0,460,461,3,102,51,0,461,462,5,34,0,0,462,463,3,104,52, + 0,463,464,5,86,0,0,464,465,3,62,31,0,465,466,3,62,31,0,466,467,5, + 87,0,0,467,61,1,0,0,0,468,469,3,24,12,0,469,470,5,20,0,0,470,471, + 3,102,51,0,471,472,5,34,0,0,472,473,3,104,52,0,473,475,3,92,46,0, + 474,476,5,62,0,0,475,474,1,0,0,0,475,476,1,0,0,0,476,477,1,0,0,0, + 477,478,5,83,0,0,478,63,1,0,0,0,479,480,5,12,0,0,480,481,3,102,51, + 0,481,482,5,13,0,0,482,483,3,102,51,0,483,487,5,86,0,0,484,486,3, + 66,33,0,485,484,1,0,0,0,486,489,1,0,0,0,487,485,1,0,0,0,487,488, + 1,0,0,0,488,490,1,0,0,0,489,487,1,0,0,0,490,491,5,87,0,0,491,65, + 1,0,0,0,492,493,5,16,0,0,493,497,3,54,27,0,494,497,3,70,35,0,495, + 497,3,68,34,0,496,492,1,0,0,0,496,494,1,0,0,0,496,495,1,0,0,0,497, + 67,1,0,0,0,498,499,5,24,0,0,499,500,3,102,51,0,500,501,5,25,0,0, + 501,502,5,26,0,0,502,503,5,22,0,0,503,504,5,10,0,0,504,505,3,102, + 51,0,505,506,5,23,0,0,506,507,5,19,0,0,507,508,3,102,51,0,508,509, + 5,85,0,0,509,510,3,102,51,0,510,511,5,83,0,0,511,69,1,0,0,0,512, + 513,5,14,0,0,513,514,3,72,36,0,514,515,5,15,0,0,515,516,3,76,38, + 0,516,517,5,83,0,0,517,71,1,0,0,0,518,519,3,102,51,0,519,520,5,85, + 0,0,520,521,3,74,37,0,521,73,1,0,0,0,522,534,3,102,51,0,523,534, + 5,51,0,0,524,534,5,41,0,0,525,534,5,42,0,0,526,534,5,48,0,0,527, + 534,5,49,0,0,528,534,5,50,0,0,529,534,5,52,0,0,530,534,5,53,0,0, + 531,534,5,54,0,0,532,534,5,55,0,0,533,522,1,0,0,0,533,523,1,0,0, + 0,533,524,1,0,0,0,533,525,1,0,0,0,533,526,1,0,0,0,533,527,1,0,0, + 0,533,528,1,0,0,0,533,529,1,0,0,0,533,530,1,0,0,0,533,531,1,0,0, + 0,533,532,1,0,0,0,534,75,1,0,0,0,535,536,5,18,0,0,536,537,3,102, + 51,0,537,538,5,85,0,0,538,539,3,78,39,0,539,555,1,0,0,0,540,541, + 5,19,0,0,541,542,3,102,51,0,542,543,5,85,0,0,543,544,3,102,51,0, + 544,545,5,85,0,0,545,546,3,80,40,0,546,555,1,0,0,0,547,548,5,5,0, + 0,548,549,3,102,51,0,549,550,5,85,0,0,550,552,3,102,51,0,551,553, + 3,82,41,0,552,551,1,0,0,0,552,553,1,0,0,0,553,555,1,0,0,0,554,535, + 1,0,0,0,554,540,1,0,0,0,554,547,1,0,0,0,555,77,1,0,0,0,556,557,7, + 2,0,0,557,79,1,0,0,0,558,559,7,3,0,0,559,81,1,0,0,0,560,561,5,21, + 0,0,561,565,5,86,0,0,562,564,3,84,42,0,563,562,1,0,0,0,564,567,1, + 0,0,0,565,563,1,0,0,0,565,566,1,0,0,0,566,568,1,0,0,0,567,565,1, + 0,0,0,568,569,5,87,0,0,569,83,1,0,0,0,570,571,3,102,51,0,571,572, + 5,15,0,0,572,573,5,18,0,0,573,580,3,102,51,0,574,575,5,23,0,0,575, + 576,5,19,0,0,576,577,3,102,51,0,577,578,5,85,0,0,578,579,3,102,51, + 0,579,581,1,0,0,0,580,574,1,0,0,0,580,581,1,0,0,0,581,582,1,0,0, + 0,582,583,5,83,0,0,583,613,1,0,0,0,584,585,3,102,51,0,585,586,5, + 15,0,0,586,587,5,19,0,0,587,588,3,102,51,0,588,589,5,85,0,0,589, + 596,3,102,51,0,590,591,5,23,0,0,591,592,5,19,0,0,592,593,3,102,51, + 0,593,594,5,85,0,0,594,595,3,102,51,0,595,597,1,0,0,0,596,590,1, + 0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599,5,83,0,0,599,613,1, + 0,0,0,600,601,3,102,51,0,601,602,5,15,0,0,602,603,5,3,0,0,603,604, + 3,102,51,0,604,605,5,83,0,0,605,613,1,0,0,0,606,607,3,102,51,0,607, + 608,5,15,0,0,608,609,5,10,0,0,609,610,3,102,51,0,610,611,5,83,0, + 0,611,613,1,0,0,0,612,570,1,0,0,0,612,584,1,0,0,0,612,600,1,0,0, + 0,612,606,1,0,0,0,613,85,1,0,0,0,614,615,5,10,0,0,615,616,3,102, + 51,0,616,617,5,15,0,0,617,618,3,102,51,0,618,619,5,85,0,0,619,621, + 3,102,51,0,620,622,3,82,41,0,621,620,1,0,0,0,621,622,1,0,0,0,622, + 623,1,0,0,0,623,624,5,83,0,0,624,87,1,0,0,0,625,651,3,90,45,0,626, + 651,5,63,0,0,627,651,5,64,0,0,628,629,5,65,0,0,629,651,3,104,52, + 0,630,631,5,66,0,0,631,632,5,92,0,0,632,633,3,102,51,0,633,634,5, + 93,0,0,634,651,1,0,0,0,635,636,5,67,0,0,636,637,5,92,0,0,637,638, + 3,102,51,0,638,639,5,93,0,0,639,651,1,0,0,0,640,641,5,68,0,0,641, + 642,5,92,0,0,642,643,3,88,44,0,643,644,5,93,0,0,644,651,1,0,0,0, + 645,646,5,69,0,0,646,647,5,92,0,0,647,648,3,88,44,0,648,649,5,93, + 0,0,649,651,1,0,0,0,650,625,1,0,0,0,650,626,1,0,0,0,650,627,1,0, + 0,0,650,628,1,0,0,0,650,630,1,0,0,0,650,635,1,0,0,0,650,640,1,0, + 0,0,650,645,1,0,0,0,651,89,1,0,0,0,652,653,7,4,0,0,653,91,1,0,0, + 0,654,655,7,5,0,0,655,93,1,0,0,0,656,665,3,104,52,0,657,665,5,94, + 0,0,658,665,5,95,0,0,659,665,5,78,0,0,660,665,5,79,0,0,661,665,5, + 80,0,0,662,665,3,96,48,0,663,665,3,100,50,0,664,656,1,0,0,0,664, + 657,1,0,0,0,664,658,1,0,0,0,664,659,1,0,0,0,664,660,1,0,0,0,664, + 661,1,0,0,0,664,662,1,0,0,0,664,663,1,0,0,0,665,95,1,0,0,0,666,675, + 5,86,0,0,667,672,3,98,49,0,668,669,5,84,0,0,669,671,3,98,49,0,670, + 668,1,0,0,0,671,674,1,0,0,0,672,670,1,0,0,0,672,673,1,0,0,0,673, + 676,1,0,0,0,674,672,1,0,0,0,675,667,1,0,0,0,675,676,1,0,0,0,676, + 677,1,0,0,0,677,678,5,87,0,0,678,97,1,0,0,0,679,680,3,104,52,0,680, + 681,5,82,0,0,681,682,3,94,47,0,682,99,1,0,0,0,683,692,5,88,0,0,684, + 689,3,94,47,0,685,686,5,84,0,0,686,688,3,94,47,0,687,685,1,0,0,0, + 688,691,1,0,0,0,689,687,1,0,0,0,689,690,1,0,0,0,690,693,1,0,0,0, + 691,689,1,0,0,0,692,684,1,0,0,0,692,693,1,0,0,0,693,694,1,0,0,0, + 694,695,5,89,0,0,695,101,1,0,0,0,696,697,7,6,0,0,697,103,1,0,0,0, + 698,699,5,97,0,0,699,105,1,0,0,0,43,121,132,140,155,173,200,224, + 234,240,269,275,288,296,309,314,327,340,355,358,365,373,413,421, + 433,447,457,475,487,496,533,552,554,565,580,596,612,621,650,664, + 672,675,689,692 ]; private static __ATN: antlr.ATN; @@ -4502,6 +4613,9 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { public operationBindingDecl(): OperationBindingDeclContext | null { return this.getRuleContext(0, OperationBindingDeclContext); } + public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext | null { + return this.getRuleContext(0, RelationshipMaterializationDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_conformanceItem; } @@ -4515,6 +4629,59 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { } +export class RelationshipMaterializationDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MATERIALIZE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.MATERIALIZE, 0)!; + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public IF(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.IF, 0)!; + } + public ABSENT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ABSENT, 0)!; + } + public USING(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.USING, 0)!; + } + public CONSTRUCTOR(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0)!; + } + public VIA(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.VIA, 0)!; + } + public EDGE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.EDGE, 0)!; + } + public DOT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.DOT, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_relationshipMaterializationDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitRelationshipMaterializationDecl) { + return visitor.visitRelationshipMaterializationDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class OperationBindingDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -4794,11 +4961,26 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } - public EDGE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.EDGE, 0); + public VIA(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.VIA, 0); } - public DOT(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.DOT, 0); + public EDGE(): antlr.TerminalNode[]; + public EDGE(i: number): antlr.TerminalNode | null; + public EDGE(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.EDGE); + } else { + return this.getToken(QuixosCapabilityParser.EDGE, i); + } + } + public DOT(): antlr.TerminalNode[]; + public DOT(i: number): antlr.TerminalNode | null; + public DOT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.DOT); + } else { + return this.getToken(QuixosCapabilityParser.DOT, i); + } } public INTERFACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE, 0); diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 35f8891..f95efea 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -36,6 +36,7 @@ import { EdgeDeclContext } from "./QuixosCapabilityParser.js"; import { EdgeEndpointContext } from "./QuixosCapabilityParser.js"; import { ConformanceDeclContext } from "./QuixosCapabilityParser.js"; import { ConformanceItemContext } from "./QuixosCapabilityParser.js"; +import { RelationshipMaterializationDeclContext } from "./QuixosCapabilityParser.js"; import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js"; import { MemberOperationRefContext } from "./QuixosCapabilityParser.js"; import { OperationNameContext } from "./QuixosCapabilityParser.js"; @@ -268,6 +269,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.relationshipMaterializationDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitRelationshipMaterializationDecl?: (ctx: RelationshipMaterializationDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.operationBindingDecl`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 0786029..7a25071 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -22,6 +22,7 @@ import { type EdgeEndpoint, type EdgeEndpointConstraint, type EdgePrimitive, + type EdgeTraversal, type InterfaceMember, type InterfaceOperation, type InterfaceOperationMode, @@ -56,6 +57,7 @@ import { QuixosCapabilityParser, type ValueMemberContext, type ValueTypeContext, type RelationshipMemberContext, + type RelationshipMaterializationDeclContext, type WorkspaceDeclContext, } from "./generated/QuixosCapabilityParser.js"; @@ -91,6 +93,7 @@ interface InterfaceSymbol { members: Map< string, { + memberId: InterfaceMember["id"]; operations: Map; } >; @@ -556,6 +559,7 @@ const lowerInterface = ( symbol.members, member.displayName, { + memberId: member.id, operations: new Map( member.operations.map((operation) => [operation.displayName, operation.id]), ), @@ -1003,6 +1007,34 @@ const lowerBoundDependencies = ( if (!portId) { return []; } + const traversal = ( + edgeName: string, + projectionName: string, + ): EdgeTraversal | undefined => { + const attachment = requireSymbol( + state, + state.attachments, + edgeName, + entry, + "attachment", + ); + if (!attachment || attachment.attachment.kind !== "edge") { + if (attachment) { + loweringIssue(state, entry, "wrong-attachment-kind", `${edgeName} is state, not an edge`); + } + return undefined; + } + const projectionId = requireSymbol( + state, + attachment.projections, + projectionName, + entry, + `projection on ${edgeName}`, + ); + return projectionId + ? { edgeTypeId: attachment.attachment.id, projectionId } + : undefined; + }; if (entry.STATE()) { const attachmentName = identifier(entry.identifier(1)); const attachment = requireSymbol( @@ -1023,9 +1055,16 @@ const lowerBoundDependencies = ( } return []; } - return [{ portId, binding: { kind: "state", slotId: attachment.attachment.id } }]; + const via = entry.VIA() + ? traversal(identifier(entry.identifier(2)), identifier(entry.identifier(3))) + : undefined; + if (entry.VIA() && !via) return []; + return [{ + portId, + binding: { kind: "state", slotId: attachment.attachment.id, ...(via ? { via } : {}) }, + }]; } - if (entry.EDGE()) { + if (entry.EDGE(0)) { const attachmentName = identifier(entry.identifier(1)); const projectionName = identifier(entry.identifier(2)); const attachment = requireSymbol( @@ -1053,6 +1092,10 @@ const lowerBoundDependencies = ( entry, `projection on ${attachmentName}`, ); + const via = entry.VIA() + ? traversal(identifier(entry.identifier(3)), identifier(entry.identifier(4))) + : undefined; + if (entry.VIA() && !via) return []; return projectionId ? [ { @@ -1061,6 +1104,7 @@ const lowerBoundDependencies = ( kind: "edge", edgeTypeId: attachment.attachment.id, projectionId, + ...(via ? { via } : {}), }, }, ] @@ -1095,6 +1139,50 @@ const lowerBoundDependencies = ( }); }; +const lowerRelationshipMaterialization = ( + state: LoweringState, + interfaceName: string, + context: RelationshipMaterializationDeclContext, +): WorkspaceRevision["conformances"][number]["relationshipMaterializations"][number] | undefined => { + const memberName = identifier(context.identifier(0)); + const member = requireSymbol( + state, + state.interfaces.get(interfaceName)?.members ?? new Map(), + memberName, + context, + `member on ${interfaceName}`, + ); + const constructorAtom = requireSymbol( + state, + state.atoms, + identifier(context.identifier(1)), + context, + "constructor atom", + ); + const edgeName = identifier(context.identifier(2)); + const edge = requireSymbol(state, state.attachments, edgeName, context, "attachment"); + if (edge && edge.attachment.kind !== "edge") { + loweringIssue(state, context, "wrong-attachment-kind", `${edgeName} is state, not an edge`); + } + const projectionId = edge?.attachment.kind === "edge" + ? requireSymbol( + state, + edge.projections, + identifier(context.identifier(3)), + context, + `projection on ${edgeName}`, + ) + : undefined; + return member && constructorAtom && edge?.attachment.kind === "edge" && projectionId + ? { + memberId: member.memberId, + constructorAtomId: constructorAtom, + edgeTypeId: edge.attachment.id, + constructedProjectionId: projectionId, + } + : undefined; +}; + const lowerConformance = ( state: LoweringState, context: ConformanceDeclContext, @@ -1246,11 +1334,18 @@ const lowerConformance = ( ] : []; }); + const relationshipMaterializations = context.conformanceItem().flatMap((item) => { + const materialization = item.relationshipMaterializationDecl(); + if (!materialization) return []; + const lowered = lowerRelationshipMaterialization(state, interfaceName, materialization); + return lowered ? [lowered] : []; + }); return { atomId, interfaceRevisionId: interfaceSymbol.revisionId, privateAttachments, operationBindings, + relationshipMaterializations, }; }; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index dd4c920..18d8b78 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -291,11 +291,12 @@ export interface PackageRevision { } export type DependencyBinding = - | { kind: "state"; slotId: SlotId } + | { kind: "state"; slotId: SlotId; via?: EdgeTraversal } | { kind: "edge"; edgeTypeId: EdgeTypeId; projectionId: EdgeProjectionId; + via?: EdgeTraversal; } | { kind: "receiver-interface"; @@ -308,6 +309,24 @@ export interface BoundDependency { binding: DependencyBinding; } +/** Selects the object at the other end of an exactly-one relationship. */ +export interface EdgeTraversal { + edgeTypeId: EdgeTypeId; + projectionId: EdgeProjectionId; +} + +/** + * Provisional get-or-create recipe for a relationship implementation. The + * host projection is supplied by the relationship's resolve binding; this + * projection originates at the object constructed for the relationship. + */ +export interface RelationshipMaterialization { + memberId: MemberId; + constructorAtomId: AtomId; + edgeTypeId: EdgeTypeId; + constructedProjectionId: EdgeProjectionId; +} + export type Binding = | { kind: "state"; @@ -337,6 +356,7 @@ export interface Conformance { interfaceRevisionId: InterfaceRevisionId; privateAttachments: PersistentAttachment[]; operationBindings: OperationBinding[]; + relationshipMaterializations: RelationshipMaterialization[]; } export interface AtomConstructorBinding { diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index dac1d42..01f99b3 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -51,6 +51,7 @@ export type CapabilityValidationIssueCode = | "duplicate-dependency-port" | "duplicate-conformance" | "duplicate-operation-binding" + | "duplicate-relationship-materialization" | "duplicate-constructor" | "unresolved-reference" | "invalid-attachment" @@ -64,7 +65,8 @@ export type CapabilityValidationIssueCode = | "cyclic-conformance-requirement" | "missing-operation-binding" | "unknown-operation-binding" - | "invalid-constructor"; + | "invalid-constructor" + | "invalid-relationship-materialization"; export interface CapabilityValidationIssue { code: CapabilityValidationIssueCode; @@ -460,6 +462,16 @@ const atomSatisfiesConstraint = ( ? constraint.atomId === atomId : conformances.has(conformanceKey(atomId, constraint.interfaceRevisionId)); +const constraintSatisfiesConstraint = ( + actual: EdgeEndpointConstraint, + required: EdgeEndpointConstraint, + conformances: ReadonlyMap, +) => constraintsEqual(actual, required) || ( + actual.kind === "atom" && + required.kind === "interface" && + atomSatisfiesConstraint(actual.atomId, required, conformances) +); + const canAccessAttachment = ( owner: AttachmentOwner, conformance: Pick | undefined, @@ -958,6 +970,52 @@ const validateAttachmentAccess = ( return true; }; +const validateTraversal = ( + issues: CapabilityValidationIssue[], + indexes: ValidationIndexes, + atomId: AtomId, + traversal: { edgeTypeId: EdgeTypeId; projectionId: EdgeProjectionId }, + path: string, +) => { + const attachment = findAttachment(indexes, "edge", traversal.edgeTypeId); + if (!attachment || attachment.attachment.kind !== "edge") { + issue( + issues, + "invalid-dependency-binding", + `${path}.edgeTypeId`, + `Unknown traversal edge ${traversal.edgeTypeId}`, + ); + return undefined; + } + const projection = edgeProjection(attachment.attachment, traversal.projectionId); + if (!projection) { + issue( + issues, + "invalid-dependency-binding", + `${path}.projectionId`, + `Traversal projection ${traversal.projectionId} is not on edge ${traversal.edgeTypeId}`, + ); + return undefined; + } + if (!atomSatisfiesConstraint(atomId, projection.endpoint.constraint, indexes.conformances)) { + issue( + issues, + "invalid-dependency-binding", + `${path}.projectionId`, + `Traversal projection ${traversal.projectionId} cannot originate at receiver atom ${atomId}`, + ); + } + if (projection.endpoint.cardinality !== "exactly-one") { + issue( + issues, + "invalid-dependency-binding", + `${path}.projectionId`, + "Dependency traversal must select exactly one object", + ); + } + return projection; +}; + const validateBoundDependencies = ( issues: CapabilityValidationIssue[], params: { @@ -1020,12 +1078,31 @@ const validateBoundDependencies = ( break; } validateAttachmentAccess(issues, attachment, params.conformance, `${path}.binding.slotId`); - if (attachment.attachment.attachedTo !== params.atomId) { + const traversal = stateBinding.via + ? validateTraversal( + issues, + params.indexes, + params.atomId, + stateBinding.via, + `${path}.binding.via`, + ) + : undefined; + if ( + stateBinding.via + ? traversal && !atomSatisfiesConstraint( + attachment.attachment.attachedTo, + traversal.target.constraint, + params.indexes.conformances, + ) + : attachment.attachment.attachedTo !== params.atomId + ) { issue( issues, "invalid-dependency-binding", `${path}.binding.slotId`, - `State ${stateBinding.slotId} is not attached to receiver atom ${params.atomId}`, + stateBinding.via + ? `State ${stateBinding.slotId} is not attached to the traversal target` + : `State ${stateBinding.slotId} is not attached to receiver atom ${params.atomId}`, ); } if (!valueTypesEqual(requirement.valueType, attachment.attachment.valueType)) { @@ -1061,16 +1138,46 @@ const validateBoundDependencies = ( ); break; } - if (!atomSatisfiesConstraint(params.atomId, projection.endpoint.constraint, params.indexes.conformances)) { + const traversal = edgeBinding.via + ? validateTraversal( + issues, + params.indexes, + params.atomId, + edgeBinding.via, + `${path}.binding.via`, + ) + : undefined; + const originMatches = edgeBinding.via + ? traversal && ( + projection.endpoint.constraint.kind === "atom" + ? atomSatisfiesConstraint( + projection.endpoint.constraint.atomId, + traversal.target.constraint, + params.indexes.conformances, + ) + : constraintsEqual(projection.endpoint.constraint, traversal.target.constraint) + ) + : atomSatisfiesConstraint( + params.atomId, + projection.endpoint.constraint, + params.indexes.conformances, + ); + if (!originMatches) { issue( issues, "invalid-dependency-binding", `${path}.binding.projectionId`, - `Projection ${edgeBinding.projectionId} cannot originate at receiver atom ${params.atomId}`, + edgeBinding.via + ? `Projection ${edgeBinding.projectionId} cannot originate at the traversal target` + : `Projection ${edgeBinding.projectionId} cannot originate at receiver atom ${params.atomId}`, ); } if ( - !constraintsEqual(requirement.target, projection.target.constraint) || + !constraintSatisfiesConstraint( + projection.target.constraint, + requirement.target, + params.indexes.conformances, + ) || requirement.cardinality !== projection.endpoint.cardinality ) { issue( @@ -1290,8 +1397,21 @@ const validateConformances = ( } validateAttachmentAccess(issues, attachment, conformance, `${bindingPath}.binding.edgeTypeId`); const projection = edgeProjection(attachment.attachment, binding.projectionId); + const relationshipMember = operationEntry.member.kind === "relationship" + ? operationEntry.member + : undefined; + const operationEdge = relationshipMember + ? { + ...attachment.attachment, + endpoints: attachment.attachment.endpoints.map((endpoint, index) => + index === (projection?.endpointIndex === 0 ? 1 : 0) + ? { ...endpoint, constraint: relationshipMember.target } + : endpoint, + ) as [EdgeEndpoint, EdgeEndpoint], + } + : attachment.attachment; const expected = edgePrimitiveSignature( - attachment.attachment, + operationEdge, binding.projectionId, binding.primitive, ); @@ -1320,7 +1440,11 @@ const validateConformances = ( "Edge primitives may only implement relationship members", ); } else if ( - !constraintsEqual(operationEntry.member.target, projection.target.constraint) || + !constraintSatisfiesConstraint( + projection.target.constraint, + operationEntry.member.target, + indexes.conformances, + ) || operationEntry.member.cardinality !== projection.endpoint.cardinality ) { issue( @@ -1398,6 +1522,148 @@ const validateConformances = ( }); } + const materializedMembers = new Set(); + for (const [materializationIndex, materialization] of + (conformance.relationshipMaterializations ?? []).entries()) { + const materializationPath = + `${path}.relationshipMaterializations[${materializationIndex}]`; + if (materializedMembers.has(materialization.memberId)) { + issue( + issues, + "duplicate-relationship-materialization", + materializationPath, + `Relationship ${materialization.memberId} has more than one materialization recipe`, + ); + continue; + } + materializedMembers.add(materialization.memberId); + const member = interfaceEntry.revision.members.find((entry) => + entry.id === materialization.memberId); + if (!member || member.kind !== "relationship") { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.memberId`, + `Member ${materialization.memberId} is not a relationship on ${conformance.interfaceRevisionId}`, + ); + continue; + } + if (member.cardinality !== "optional-one") { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.memberId`, + "A lazily constructed relationship must be optional-one before construction", + ); + } + const resolveOperation = member.operations.find((entry) => + entry.displayName === "resolve"); + const resolveBinding = resolveOperation + ? bindings.get(resolveOperation.id) + : undefined; + if (!resolveBinding || resolveBinding.kind !== "edge") { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.memberId`, + "A materialized relationship must bind its resolve operation to an edge", + ); + continue; + } + if (resolveBinding.edgeTypeId !== materialization.edgeTypeId) { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.edgeTypeId`, + "Materialization and relationship resolution must use the same edge", + ); + } + const attachment = findAttachment(indexes, "edge", materialization.edgeTypeId); + if (!attachment || attachment.attachment.kind !== "edge") { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.edgeTypeId`, + `Unknown materialization edge ${materialization.edgeTypeId}`, + ); + continue; + } + validateAttachmentAccess( + issues, + attachment, + conformance, + `${materializationPath}.edgeTypeId`, + ); + const hostProjection = edgeProjection( + attachment.attachment, + resolveBinding.projectionId, + ); + const constructedProjection = edgeProjection( + attachment.attachment, + materialization.constructedProjectionId, + ); + if (!hostProjection || !constructedProjection || + hostProjection.endpointIndex === constructedProjection.endpointIndex) { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.constructedProjectionId`, + "Materialization must connect through the opposite projection of the resolved edge", + ); + continue; + } + if (!atomSatisfiesConstraint( + materialization.constructorAtomId, + member.target, + indexes.conformances, + )) { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.constructorAtomId`, + `Constructed atom ${materialization.constructorAtomId} does not satisfy the relationship target`, + ); + } + if (!atomSatisfiesConstraint( + materialization.constructorAtomId, + constructedProjection.endpoint.constraint, + indexes.conformances, + ) || !atomSatisfiesConstraint( + conformance.atomId, + constructedProjection.target.constraint, + indexes.conformances, + )) { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.constructedProjectionId`, + "Constructed projection does not connect the constructed atom back to the host atom", + ); + } + const constructor = indexes.constructors.get(materialization.constructorAtomId); + const constructorExport = constructor + ? indexes.packages.get(constructor.packageRevisionId)?.exports.get(constructor.exportId) + : undefined; + if (!constructor || !constructorExport || constructorExport.kind !== "constructor") { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.constructorAtomId`, + `Constructed atom ${materialization.constructorAtomId} has no valid constructor`, + ); + } else if (!valueTypesEqual( + constructorExport.inputType, + valueType.atomRef(conformance.atomId), + )) { + issue( + issues, + "invalid-relationship-materialization", + `${materializationPath}.constructorAtomId`, + `Component constructor must accept ${typeLabel(valueType.atomRef(conformance.atomId))}`, + ); + } + } + for (const operation of interfaceEntry.operations.values()) { if (!bindings.has(operation.operation.id)) { issue( @@ -1714,9 +1980,15 @@ export const computeCapabilityClosure = ( switch (dependency.binding.kind) { case "state": attachments.add(dependency.binding.slotId); + if (dependency.binding.via) { + attachments.add(dependency.binding.via.edgeTypeId); + } break; case "edge": attachments.add(dependency.binding.edgeTypeId); + if (dependency.binding.via) { + attachments.add(dependency.binding.via.edgeTypeId); + } break; case "receiver-interface": queued.push({ @@ -1772,6 +2044,16 @@ export const computeCapabilityClosure = ( } } } + for (const materialization of + conformance.source.relationshipMaterializations ?? []) { + attachments.add(materialization.edgeTypeId); + constructors.add(materialization.constructorAtomId); + const constructor = plan.constructors.get(materialization.constructorAtomId); + if (constructor) { + packages.add(constructor.packageRevisionId); + includeDependencies(materialization.constructorAtomId, constructor.dependencies); + } + } } return { diff --git a/src/gen/quixos/orch_pb.ts b/src/gen/quixos/orch_pb.ts index bd60b17..d6a8963 100644 --- a/src/gen/quixos/orch_pb.ts +++ b/src/gen/quixos/orch_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/orch.proto. */ export const file_quixos_orch: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCLUAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpgBChhJbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi4wEKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0ImcKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0ynwYKE09yY2hlc3RyYXRvclJ1bnRpbWUSXwoQSW52b2tlQ2FwYWJpbGl0eRIkLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlElsKD1dhdGNoQ2FwYWJpbGl0eRIjLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlFdmVudDABElwKD0NvbnN0cnVjdE9iamVjdBIjLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QaJC5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLUAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpgBChhJbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIrCgphY3RpdmF0aW9uGAIgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbhIKCgJvaxgDIAEoCBIdCgZyZXN1bHQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYBSABKAki0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi4wEKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0ImcKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yrgcKE09yY2hlc3RyYXRvclJ1bnRpbWUSXwoQSW52b2tlQ2FwYWJpbGl0eRIkLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlElsKD1dhdGNoQ2FwYWJpbGl0eRIjLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlFdmVudDABElwKD0NvbnN0cnVjdE9iamVjdBIjLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QaJC5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXNwb25zZRKMAQofUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdBIzLnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXF1ZXN0GjQucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlElMKDEdldFdvcmtzcGFjZRIgLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlcXVlc3QaIS5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXNwb25zZRJxChZMaXN0UGFja2FnZURlc2NyaXB0b3JzEioucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QaKy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVzcG9uc2USaAoTTGlzdFBhY2thZ2VSdW50aW1lcxInLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0GigucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1Jlc3BvbnNlElwKD0xpc3RBY3RpdmF0aW9ucxIjLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QaJC5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXNwb25zZRJcCg9DbG9zZUFjdGl2YXRpb24SIy5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXF1ZXN0GiQucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVzcG9uc2ViBnByb3RvMw", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]); /** * @generated from message quixos.orch.ConstructObjectRequest @@ -59,6 +59,55 @@ export type ConstructObjectResponse = Message<"quixos.orch.ConstructObjectRespon export const ConstructObjectResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_orch, 1); +/** + * @generated from message quixos.orch.ResolveOrConstructRelatedObjectRequest + */ +export type ResolveOrConstructRelatedObjectRequest = Message<"quixos.orch.ResolveOrConstructRelatedObjectRequest"> & { + /** + * @generated from field: string object_id = 1; + */ + objectId: string; + + /** + * @generated from field: string interface_revision_id = 2; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string member_id = 3; + */ + memberId: string; +}; + +/** + * Describes the message quixos.orch.ResolveOrConstructRelatedObjectRequest. + * Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message. + */ +export const ResolveOrConstructRelatedObjectRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 2); + +/** + * @generated from message quixos.orch.ResolveOrConstructRelatedObjectResponse + */ +export type ResolveOrConstructRelatedObjectResponse = Message<"quixos.orch.ResolveOrConstructRelatedObjectResponse"> & { + /** + * @generated from field: camino.CaminoObject object = 1; + */ + object?: CaminoObject | undefined; + + /** + * @generated from field: bool constructed = 2; + */ + constructed: boolean; +}; + +/** + * Describes the message quixos.orch.ResolveOrConstructRelatedObjectResponse. + * Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message. + */ +export const ResolveOrConstructRelatedObjectResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 3); + /** * @generated from message quixos.orch.InvokeCapabilityRequest */ @@ -84,7 +133,7 @@ export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityReque * Use `create(InvokeCapabilityRequestSchema)` to create a new message. */ export const InvokeCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 2); + messageDesc(file_quixos_orch, 4); /** * @generated from message quixos.orch.InvokeCapabilityResponse @@ -121,7 +170,7 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp * Use `create(InvokeCapabilityResponseSchema)` to create a new message. */ export const InvokeCapabilityResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 3); + messageDesc(file_quixos_orch, 5); /** * @generated from message quixos.orch.WatchCapabilityRequest @@ -148,7 +197,7 @@ export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest * Use `create(WatchCapabilityRequestSchema)` to create a new message. */ export const WatchCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 4); + messageDesc(file_quixos_orch, 6); /** * @generated from message quixos.orch.WatchCapabilityEvent @@ -195,7 +244,7 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & * Use `create(WatchCapabilityEventSchema)` to create a new message. */ export const WatchCapabilityEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 5); + messageDesc(file_quixos_orch, 7); /** * @generated from message quixos.orch.GetWorkspaceRequest @@ -208,7 +257,7 @@ export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & { * Use `create(GetWorkspaceRequestSchema)` to create a new message. */ export const GetWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 6); + messageDesc(file_quixos_orch, 8); /** * @generated from message quixos.orch.GetWorkspaceResponse @@ -235,7 +284,7 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> & * Use `create(GetWorkspaceResponseSchema)` to create a new message. */ export const GetWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 7); + messageDesc(file_quixos_orch, 9); /** * @generated from message quixos.orch.ListActivationsRequest @@ -248,7 +297,7 @@ export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest * Use `create(ListActivationsRequestSchema)` to create a new message. */ export const ListActivationsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 8); + messageDesc(file_quixos_orch, 10); /** * @generated from message quixos.orch.ListPackageDescriptorsRequest @@ -261,7 +310,7 @@ export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDesc * Use `create(ListPackageDescriptorsRequestSchema)` to create a new message. */ export const ListPackageDescriptorsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 9); + messageDesc(file_quixos_orch, 11); /** * @generated from message quixos.orch.ListPackageDescriptorsResponse @@ -278,7 +327,7 @@ export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDes * Use `create(ListPackageDescriptorsResponseSchema)` to create a new message. */ export const ListPackageDescriptorsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 10); + messageDesc(file_quixos_orch, 12); /** * @generated from message quixos.orch.ListPackageRuntimesRequest @@ -291,7 +340,7 @@ export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntime * Use `create(ListPackageRuntimesRequestSchema)` to create a new message. */ export const ListPackageRuntimesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 11); + messageDesc(file_quixos_orch, 13); /** * @generated from message quixos.orch.ListPackageRuntimesResponse @@ -308,7 +357,7 @@ export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntim * Use `create(ListPackageRuntimesResponseSchema)` to create a new message. */ export const ListPackageRuntimesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 12); + messageDesc(file_quixos_orch, 14); /** * @generated from message quixos.orch.ListActivationsResponse @@ -325,7 +374,7 @@ export type ListActivationsResponse = Message<"quixos.orch.ListActivationsRespon * Use `create(ListActivationsResponseSchema)` to create a new message. */ export const ListActivationsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 13); + messageDesc(file_quixos_orch, 15); /** * @generated from message quixos.orch.CloseActivationRequest @@ -347,7 +396,7 @@ export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest * Use `create(CloseActivationRequestSchema)` to create a new message. */ export const CloseActivationRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 14); + messageDesc(file_quixos_orch, 16); /** * @generated from message quixos.orch.CloseActivationResponse @@ -364,7 +413,7 @@ export type CloseActivationResponse = Message<"quixos.orch.CloseActivationRespon * Use `create(CloseActivationResponseSchema)` to create a new message. */ export const CloseActivationResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 15); + messageDesc(file_quixos_orch, 17); /** * @generated from message quixos.orch.Activation @@ -426,7 +475,7 @@ export type Activation = Message<"quixos.orch.Activation"> & { * Use `create(ActivationSchema)` to create a new message. */ export const ActivationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 16); + messageDesc(file_quixos_orch, 18); /** * @generated from message quixos.orch.PackageRuntimeStatus @@ -498,7 +547,7 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> & * Use `create(PackageRuntimeStatusSchema)` to create a new message. */ export const PackageRuntimeStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 17); + messageDesc(file_quixos_orch, 19); /** * @generated from service quixos.orch.OrchestratorRuntime @@ -528,6 +577,14 @@ export const OrchestratorRuntime: GenService<{ input: typeof ConstructObjectRequestSchema; output: typeof ConstructObjectResponseSchema; }, + /** + * @generated from rpc quixos.orch.OrchestratorRuntime.ResolveOrConstructRelatedObject + */ + resolveOrConstructRelatedObject: { + methodKind: "unary"; + input: typeof ResolveOrConstructRelatedObjectRequestSchema; + output: typeof ResolveOrConstructRelatedObjectResponseSchema; + }, /** * @generated from rpc quixos.orch.OrchestratorRuntime.GetWorkspace */ diff --git a/src/gen/quixos/refs_pb.ts b/src/gen/quixos/refs_pb.ts index 6e1e8a6..89650d9 100644 --- a/src/gen/quixos/refs_pb.ts +++ b/src/gen/quixos/refs_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/refs.proto. */ export const file_quixos_refs: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIroBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIAEIJCgdiaW5kaW5nIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM"); + fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIs0BChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z"); /** * @generated from message quixos.CapabilityRef @@ -93,6 +93,14 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { value: string; case: "constructorAtomId"; } | { case: undefined; value?: undefined }; + + /** + * Defaults to the invocation receiver. A checked dependency traversal can + * select a related object explicitly before the package runtime starts. + * + * @generated from field: string object_id = 6; + */ + objectId: string; }; /** diff --git a/test/capability-language.test.ts b/test/capability-language.test.ts index a9b8cbf..44fb93c 100644 --- a/test/capability-language.test.ts +++ b/test/capability-language.test.ts @@ -1,4 +1,6 @@ import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { resolve } from "node:path"; import { test } from "node:test"; import { compileCapabilitySource } from "../src/capability-language/index.js"; import { @@ -146,3 +148,56 @@ test("well-formed but invalid programs report semantic paths", () => { assert.equal(diagnostic.phase, "validation"); assert.ok(diagnostic.path?.includes("operationBindings")); }); + +test("Web Studio sidecars declare lazy materialization and checked cross-object ports", () => { + const source = readFileSync( + resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"), + "utf8", + ); + const result = compileCapabilitySource(source, "web-studio.capabilities.qx"); + assert.equal(result.ok, true); + if (!result.ok) return; + + const host = result.workspace.conformances.find((entry) => + entry.atomId === "atom:project" && + entry.interfaceRevisionId === "interface:org.quixos.web-studio.has-react-component@1" + ); + assert.deepEqual(host?.relationshipMaterializations, [{ + memberId: "member:org.quixos.web-studio.has-react-component:component", + constructorAtomId: "atom:project-component", + edgeTypeId: "edge:project:component", + constructedProjectionId: "projection:component:subject", + }]); + + const component = result.workspace.conformances.find((entry) => + entry.atomId === "atom:project-component" + ); + const binding = component?.operationBindings[0]?.binding; + assert.equal(binding?.kind, "package"); + if (binding?.kind !== "package") return; + assert.deepEqual(binding.dependencies[1]?.binding, { + kind: "state", + slotId: "slot:project:name", + via: { + edgeTypeId: "edge:project:component", + projectionId: "projection:component:subject", + }, + }); +}); + +test("relationship materializers require a constructor from the host atom", () => { + const source = readFileSync( + resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"), + "utf8", + ).replace( + "constructs ProjectComponent : atom-ref;", + "constructs ProjectComponent : unit;", + ); + const result = compileCapabilitySource(source, "invalid-materializer.qx"); + assert.equal(result.ok, false); + if (result.ok) return; + assert.ok(result.diagnostics.some((entry) => + entry.code === "invalid-relationship-materialization" && + entry.message.includes("must accept") + )); +}); diff --git a/test/fixtures/web-studio.capabilities.qx b/test/fixtures/web-studio.capabilities.qx new file mode 100644 index 0000000..8f4aed0 --- /dev/null +++ b/test/fixtures/web-studio.capabilities.qx @@ -0,0 +1,53 @@ +workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace:web-studio-fixture@1" commit "1111111111111111111111111111111111111111" { + atom Project id "atom:project"; + atom ProjectComponent id "atom:project-component"; + + interface ReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" source { + repository "https://repos.quixos.org/org-quixos-web-studio/interface-react-component.git"; + commit "2222222222222222222222222222222222222222"; + } { + value props id "member:org.quixos.web-studio.react-component:props" : string { + get id "operation:org.quixos.web-studio.react-component:props:get"; + } + } + + interface HasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" source { + repository "https://repos.quixos.org/org-quixos-web-studio/interface-has-react-component.git"; + commit "3333333333333333333333333333333333333333"; + } { + relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface ReactComponent { + resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve"; + } + } + + package ComponentRuntime id "package:component-runtime" revision "package:component-runtime@1" source { + repository "https://repos.quixos.org/quixos-test/package-component-runtime.git"; + commit "4444444444444444444444444444444444444444"; + } { + constructor createComponent id "export:component-runtime:create-component" constructs ProjectComponent : atom-ref; + operation propsGet id "export:component-runtime:props-get" : unit -> string mode call receiver atom ProjectComponent requires { + edge subject id "port:component:subject" : exactly-one atom Project [resolve]; + state projectName id "port:component:project-name" : string [read]; + }; + } + + shared state ProjectName id "slot:project:name" on Project : string + policy optimistic-register default "Untitled project"; + shared edge ProjectComponentEdge id "edge:project:component" { + atom ProjectComponent projection subject id "projection:component:subject" exactly-one; + atom Project projection component id "projection:project:component" optional-one; + } + + conform Project as HasReactComponent { + bind component.resolve to edge ProjectComponentEdge.component.resolve; + materialize component if absent using constructor ProjectComponent via edge ProjectComponentEdge.subject; + } + conform ProjectComponent as ReactComponent { + bind props.get to package ComponentRuntime.propsGet with { + subject to edge ProjectComponentEdge.subject; + projectName to state ProjectName via edge ProjectComponentEdge.subject; + }; + } + + constructor ProjectComponent to ComponentRuntime.createComponent; +}