Fix supervised credentials and declare typed RPC records for canvas placement

This commit is contained in:
Timothy J. Aveni
2026-09-13 16:30:17 -07:00
parent 483bc68a94
commit 42af87f8bd
13 changed files with 1618 additions and 1450 deletions
+6
View File
@@ -280,6 +280,11 @@ valueType
| INTERFACE_REF LT identifier GT | INTERFACE_REF LT identifier GT
| OPTIONAL LT valueType GT | OPTIONAL LT valueType GT
| LIST LT valueType GT | LIST LT valueType GT
| RECORD LBRACE recordField* RBRACE
;
recordField
: identifier COLON valueType SEMI
; ;
scalarType scalarType
@@ -410,6 +415,7 @@ ATOM_REF: 'atom-ref';
INTERFACE_REF: 'interface-ref'; INTERFACE_REF: 'interface-ref';
OPTIONAL: 'optional'; OPTIONAL: 'optional';
LIST: 'list'; LIST: 'list';
RECORD: 'record';
BOOL: 'bool'; BOOL: 'bool';
BYTES: 'bytes'; BYTES: 'bytes';
DOUBLE: 'double'; DOUBLE: 'double';
+1
View File
@@ -37,6 +37,7 @@ export const generateTypeScriptBindings = (
case "object-ref": return `QxObjectRef<${q(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>`; case "object-ref": return `QxObjectRef<${q(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>`;
case "optional": return `(${type(value.value)} | null)`; case "optional": return `(${type(value.value)} | null)`;
case "list": return `Array<${type(value.value)}>`; case "list": return `Array<${type(value.value)}>`;
case "record": return `{ ${Object.entries(value.fields).map(([name, field]) => `${q(name)}: ${type(field)}`).join("; ")} }`;
case "message": { case "message": {
if (!options.messages?.[value.descriptorId]) throw new Error(`Missing TypeScript message binding for ${value.descriptorId}`); if (!options.messages?.[value.descriptorId]) throw new Error(`Missing TypeScript message binding for ${value.descriptorId}`);
if (!messages.has(value.descriptorId)) messages.set(value.descriptorId, `message${messages.size}`); if (!messages.has(value.descriptorId)) messages.set(value.descriptorId, `message${messages.size}`);
File diff suppressed because one or more lines are too long
@@ -76,37 +76,38 @@ ATOM_REF=75
INTERFACE_REF=76 INTERFACE_REF=76
OPTIONAL=77 OPTIONAL=77
LIST=78 LIST=78
BOOL=79 RECORD=79
BYTES=80 BOOL=80
DOUBLE=81 BYTES=81
INT32=82 DOUBLE=82
INT64=83 INT32=83
STRING=84 INT64=84
UINT32=85 STRING=85
UINT64=86 UINT32=86
TRUE=87 UINT64=87
FALSE=88 TRUE=88
NULL=89 FALSE=89
ARROW=90 NULL=90
COLON=91 ARROW=91
SEMI=92 COLON=92
COMMA=93 SEMI=93
DOT=94 COMMA=94
LBRACE=95 DOT=95
RBRACE=96 LBRACE=96
LBRACK=97 RBRACE=97
RBRACK=98 LBRACK=98
LPAREN=99 RBRACK=99
RPAREN=100 LPAREN=100
LT=101 RPAREN=101
GT=102 LT=102
INTEGER=103 GT=103
JSON_NUMBER=104 INTEGER=104
IDENTIFIER=105 JSON_NUMBER=105
STRING_LITERAL=106 IDENTIFIER=106
LINE_COMMENT=107 STRING_LITERAL=107
BLOCK_COMMENT=108 LINE_COMMENT=108
WS=109 BLOCK_COMMENT=109
WS=110
'workspace'=1 'workspace'=1
'fragment'=2 'fragment'=2
'import'=3 'import'=3
@@ -185,27 +186,28 @@ WS=109
'interface-ref'=76 'interface-ref'=76
'optional'=77 'optional'=77
'list'=78 'list'=78
'bool'=79 'record'=79
'bytes'=80 'bool'=80
'double'=81 'bytes'=81
'int32'=82 'double'=82
'int64'=83 'int32'=83
'string'=84 'int64'=84
'uint32'=85 'string'=85
'uint64'=86 'uint32'=86
'true'=87 'uint64'=87
'false'=88 'true'=88
'null'=89 'false'=89
'->'=90 'null'=90
':'=91 '->'=91
';'=92 ':'=92
','=93 ';'=93
'.'=94 ','=94
'{'=95 '.'=95
'}'=96 '{'=96
'['=97 '}'=97
']'=98 '['=98
'('=99 ']'=99
')'=100 '('=100
'<'=101 ')'=101
'>'=102 '<'=102
'>'=103
File diff suppressed because one or more lines are too long
@@ -76,37 +76,38 @@ ATOM_REF=75
INTERFACE_REF=76 INTERFACE_REF=76
OPTIONAL=77 OPTIONAL=77
LIST=78 LIST=78
BOOL=79 RECORD=79
BYTES=80 BOOL=80
DOUBLE=81 BYTES=81
INT32=82 DOUBLE=82
INT64=83 INT32=83
STRING=84 INT64=84
UINT32=85 STRING=85
UINT64=86 UINT32=86
TRUE=87 UINT64=87
FALSE=88 TRUE=88
NULL=89 FALSE=89
ARROW=90 NULL=90
COLON=91 ARROW=91
SEMI=92 COLON=92
COMMA=93 SEMI=93
DOT=94 COMMA=94
LBRACE=95 DOT=95
RBRACE=96 LBRACE=96
LBRACK=97 RBRACE=97
RBRACK=98 LBRACK=98
LPAREN=99 RBRACK=99
RPAREN=100 LPAREN=100
LT=101 RPAREN=101
GT=102 LT=102
INTEGER=103 GT=103
JSON_NUMBER=104 INTEGER=104
IDENTIFIER=105 JSON_NUMBER=105
STRING_LITERAL=106 IDENTIFIER=106
LINE_COMMENT=107 STRING_LITERAL=107
BLOCK_COMMENT=108 LINE_COMMENT=108
WS=109 BLOCK_COMMENT=109
WS=110
'workspace'=1 'workspace'=1
'fragment'=2 'fragment'=2
'import'=3 'import'=3
@@ -185,27 +186,28 @@ WS=109
'interface-ref'=76 'interface-ref'=76
'optional'=77 'optional'=77
'list'=78 'list'=78
'bool'=79 'record'=79
'bytes'=80 'bool'=80
'double'=81 'bytes'=81
'int32'=82 'double'=82
'int64'=83 'int32'=83
'string'=84 'int64'=84
'uint32'=85 'string'=85
'uint64'=86 'uint32'=86
'true'=87 'uint64'=87
'false'=88 'true'=88
'null'=89 'false'=89
'->'=90 'null'=90
':'=91 '->'=91
';'=92 ':'=92
','=93 ';'=93
'.'=94 ','=94
'{'=95 '.'=95
'}'=96 '{'=96
'['=97 '}'=97
']'=98 '['=98
'('=99 ']'=99
')'=100 '('=100
'<'=101 ')'=101
'>'=102 '<'=102
'>'=103
@@ -82,37 +82,38 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
public static readonly INTERFACE_REF = 76; public static readonly INTERFACE_REF = 76;
public static readonly OPTIONAL = 77; public static readonly OPTIONAL = 77;
public static readonly LIST = 78; public static readonly LIST = 78;
public static readonly BOOL = 79; public static readonly RECORD = 79;
public static readonly BYTES = 80; public static readonly BOOL = 80;
public static readonly DOUBLE = 81; public static readonly BYTES = 81;
public static readonly INT32 = 82; public static readonly DOUBLE = 82;
public static readonly INT64 = 83; public static readonly INT32 = 83;
public static readonly STRING = 84; public static readonly INT64 = 84;
public static readonly UINT32 = 85; public static readonly STRING = 85;
public static readonly UINT64 = 86; public static readonly UINT32 = 86;
public static readonly TRUE = 87; public static readonly UINT64 = 87;
public static readonly FALSE = 88; public static readonly TRUE = 88;
public static readonly NULL = 89; public static readonly FALSE = 89;
public static readonly ARROW = 90; public static readonly NULL = 90;
public static readonly COLON = 91; public static readonly ARROW = 91;
public static readonly SEMI = 92; public static readonly COLON = 92;
public static readonly COMMA = 93; public static readonly SEMI = 93;
public static readonly DOT = 94; public static readonly COMMA = 94;
public static readonly LBRACE = 95; public static readonly DOT = 95;
public static readonly RBRACE = 96; public static readonly LBRACE = 96;
public static readonly LBRACK = 97; public static readonly RBRACE = 97;
public static readonly RBRACK = 98; public static readonly LBRACK = 98;
public static readonly LPAREN = 99; public static readonly RBRACK = 99;
public static readonly RPAREN = 100; public static readonly LPAREN = 100;
public static readonly LT = 101; public static readonly RPAREN = 101;
public static readonly GT = 102; public static readonly LT = 102;
public static readonly INTEGER = 103; public static readonly GT = 103;
public static readonly JSON_NUMBER = 104; public static readonly INTEGER = 104;
public static readonly IDENTIFIER = 105; public static readonly JSON_NUMBER = 105;
public static readonly STRING_LITERAL = 106; public static readonly IDENTIFIER = 106;
public static readonly LINE_COMMENT = 107; public static readonly STRING_LITERAL = 107;
public static readonly BLOCK_COMMENT = 108; public static readonly LINE_COMMENT = 108;
public static readonly WS = 109; public static readonly BLOCK_COMMENT = 109;
public static readonly WS = 110;
public static readonly channelNames = [ public static readonly channelNames = [
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
@@ -133,10 +134,10 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
"'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'",
"'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'",
"'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'",
"'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", "'interface-ref'", "'optional'", "'list'", "'record'", "'bool'",
"'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'",
"'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'",
"'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" "','", "'.'", "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'"
]; ];
public static readonly symbolicNames = [ public static readonly symbolicNames = [
@@ -152,12 +153,12 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
"DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE",
"UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE",
"MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE",
"ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL",
"DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64",
"FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT",
"RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT",
"JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL",
"WS" "LINE_COMMENT", "BLOCK_COMMENT", "WS"
]; ];
public static readonly modeNames = [ public static readonly modeNames = [
@@ -177,12 +178,12 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
"DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE",
"UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE",
"MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE",
"ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL",
"DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64",
"FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT",
"RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT",
"JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL",
"BLOCK_COMMENT", "WS", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS",
]; ];
@@ -204,7 +205,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; }
public static readonly _serializedATN: number[] = [ public static readonly _serializedATN: number[] = [
4,0,109,1047,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, 4,0,110,1056,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, 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, 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, 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,
@@ -221,364 +222,368 @@ export class QuixosCapabilityLexer extends antlr.Lexer {
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, 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,2,102,7,102,2,103, 7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103,
7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108, 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108,
2,109,7,109,2,110,7,110,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, 2,109,7,109,2,110,7,110,2,111,7,111,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,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2, 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,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,4,1,4,1,4,1,4,1,4,1,5,1,5, 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,4,1,4,1,4,1,4,
1,5,1,5,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,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,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,8,1,8,1,8,1,8,1,8, 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,8,1,8,
1,8,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,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,10,1,10,1,
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, 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,
1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, 11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,
1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14, 12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,
1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16, 13,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,
1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,19, 15,1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,
1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21, 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,
1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23, 20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,
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, 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,
1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27,1,27, 24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,
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, 27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,
1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31, 28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,
1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33, 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,
1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, 32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,
1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, 34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,
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, 36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,
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, 37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,
1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,
1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41, 39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,
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, 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,
1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44, 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,
1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46, 44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,
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,48, 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,
1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,51,1,51, 47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,
1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, 50,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,
1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55, 53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,
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, 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,
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, 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,
1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60, 58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,
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, 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,
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,62, 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,
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, 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,
1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64, 63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,
1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,66,1,66, 64,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,
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, 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,
1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68, 66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,
1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69, 68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,
1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71, 69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,
1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, 71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,
1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74, 72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,
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,75, 74,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,
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, 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,
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,79, 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,
1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81, 78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,
1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83, 80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,
1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85, 82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,
1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,87,1,87, 84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,
1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,90, 86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,
1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,1,95,1,96,1,96, 88,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,91,1,91,1,92,1,92,1,
1,97,1,97,1,98,1,98,1,99,1,99,1,100,1,100,1,101,1,101,1,102,3,102, 93,1,93,1,94,1,94,1,95,1,95,1,96,1,96,1,97,1,97,1,98,1,98,1,99,1,
948,8,102,1,102,4,102,951,8,102,11,102,12,102,952,1,103,3,103,956, 99,1,100,1,100,1,101,1,101,1,102,1,102,1,103,3,103,957,8,103,1,103,
8,103,1,103,1,103,1,103,5,103,961,8,103,10,103,12,103,964,9,103, 4,103,960,8,103,11,103,12,103,961,1,104,3,104,965,8,104,1,104,1,
3,103,966,8,103,1,103,1,103,4,103,970,8,103,11,103,12,103,971,3, 104,1,104,5,104,970,8,104,10,104,12,104,973,9,104,3,104,975,8,104,
103,974,8,103,1,103,1,103,3,103,978,8,103,1,103,4,103,981,8,103, 1,104,1,104,4,104,979,8,104,11,104,12,104,980,3,104,983,8,104,1,
11,103,12,103,982,3,103,985,8,103,1,104,1,104,5,104,989,8,104,10, 104,1,104,3,104,987,8,104,1,104,4,104,990,8,104,11,104,12,104,991,
104,12,104,992,9,104,1,105,1,105,1,105,5,105,997,8,105,10,105,12, 3,104,994,8,104,1,105,1,105,5,105,998,8,105,10,105,12,105,1001,9,
105,1000,9,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1, 105,1,106,1,106,1,106,5,106,1006,8,106,10,106,12,106,1009,9,106,
106,1,106,3,106,1012,8,106,1,107,1,107,1,108,1,108,1,108,1,108,5, 1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,3,107,
108,1020,8,108,10,108,12,108,1023,9,108,1,108,1,108,1,109,1,109, 1021,8,107,1,108,1,108,1,109,1,109,1,109,1,109,5,109,1029,8,109,
1,109,1,109,5,109,1031,8,109,10,109,12,109,1034,9,109,1,109,1,109, 10,109,12,109,1032,9,109,1,109,1,109,1,110,1,110,1,110,1,110,5,110,
1,109,1,109,1,109,1,110,4,110,1042,8,110,11,110,12,110,1043,1,110, 1040,8,110,10,110,12,110,1043,9,110,1,110,1,110,1,110,1,110,1,110,
1,110,1,1032,0,111,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, 1,111,4,111,1051,8,111,11,111,12,111,1052,1,111,1,111,1,1041,0,112,
21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, 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,
43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,
65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,
87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,
54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,
127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,
73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,
165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,
92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,
101,203,102,205,103,207,104,209,105,211,106,213,0,215,0,217,107, 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,
219,108,221,109,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0, 207,104,209,105,211,106,213,107,215,0,217,0,219,108,221,109,223,
43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122, 110,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,
4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102, 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,
110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3, 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,
0,9,10,13,13,32,32,1061,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7, 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,
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, 32,1070,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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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, 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,
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,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,
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,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,
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,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,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,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,
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, 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,
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,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,
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,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,
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,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,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,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,
0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,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,
199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0, 0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,
0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221, 1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,
1,0,0,0,1,223,1,0,0,0,3,233,1,0,0,0,5,242,1,0,0,0,7,249,1,0,0,0, 0,211,1,0,0,0,0,213,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,
9,258,1,0,0,0,11,263,1,0,0,0,13,273,1,0,0,0,15,284,1,0,0,0,17,292, 0,0,0,1,225,1,0,0,0,3,235,1,0,0,0,5,244,1,0,0,0,7,251,1,0,0,0,9,
1,0,0,0,19,298,1,0,0,0,21,307,1,0,0,0,23,317,1,0,0,0,25,326,1,0, 260,1,0,0,0,11,265,1,0,0,0,13,275,1,0,0,0,15,286,1,0,0,0,17,294,
0,0,27,338,1,0,0,0,29,349,1,0,0,0,31,355,1,0,0,0,33,363,1,0,0,0, 1,0,0,0,19,300,1,0,0,0,21,309,1,0,0,0,23,319,1,0,0,0,25,328,1,0,
35,366,1,0,0,0,37,371,1,0,0,0,39,374,1,0,0,0,41,382,1,0,0,0,43,389, 0,0,27,340,1,0,0,0,29,351,1,0,0,0,31,357,1,0,0,0,33,365,1,0,0,0,
1,0,0,0,45,395,1,0,0,0,47,400,1,0,0,0,49,411,1,0,0,0,51,416,1,0, 35,368,1,0,0,0,37,373,1,0,0,0,39,376,1,0,0,0,41,384,1,0,0,0,43,391,
0,0,53,422,1,0,0,0,55,426,1,0,0,0,57,438,1,0,0,0,59,441,1,0,0,0, 1,0,0,0,45,397,1,0,0,0,47,402,1,0,0,0,49,413,1,0,0,0,51,418,1,0,
61,448,1,0,0,0,63,451,1,0,0,0,65,458,1,0,0,0,67,466,1,0,0,0,69,473, 0,0,53,424,1,0,0,0,55,428,1,0,0,0,57,440,1,0,0,0,59,443,1,0,0,0,
1,0,0,0,71,484,1,0,0,0,73,491,1,0,0,0,75,500,1,0,0,0,77,515,1,0, 61,450,1,0,0,0,63,453,1,0,0,0,65,460,1,0,0,0,67,468,1,0,0,0,69,475,
0,0,79,525,1,0,0,0,81,538,1,0,0,0,83,544,1,0,0,0,85,561,1,0,0,0, 1,0,0,0,71,486,1,0,0,0,73,493,1,0,0,0,75,502,1,0,0,0,77,517,1,0,
87,564,1,0,0,0,89,568,1,0,0,0,91,573,1,0,0,0,93,579,1,0,0,0,95,588, 0,0,79,527,1,0,0,0,81,540,1,0,0,0,83,546,1,0,0,0,85,563,1,0,0,0,
1,0,0,0,97,597,1,0,0,0,99,601,1,0,0,0,101,605,1,0,0,0,103,609,1, 87,566,1,0,0,0,89,570,1,0,0,0,91,575,1,0,0,0,93,581,1,0,0,0,95,590,
0,0,0,105,615,1,0,0,0,107,621,1,0,0,0,109,626,1,0,0,0,111,631,1, 1,0,0,0,97,599,1,0,0,0,99,603,1,0,0,0,101,607,1,0,0,0,103,611,1,
0,0,0,113,637,1,0,0,0,115,645,1,0,0,0,117,653,1,0,0,0,119,664,1, 0,0,0,105,617,1,0,0,0,107,623,1,0,0,0,109,628,1,0,0,0,111,633,1,
0,0,0,121,669,1,0,0,0,123,681,1,0,0,0,125,692,1,0,0,0,127,702,1, 0,0,0,113,639,1,0,0,0,115,647,1,0,0,0,117,655,1,0,0,0,119,666,1,
0,0,0,129,714,1,0,0,0,131,734,1,0,0,0,133,739,1,0,0,0,135,752,1, 0,0,0,121,671,1,0,0,0,123,683,1,0,0,0,125,694,1,0,0,0,127,704,1,
0,0,0,137,764,1,0,0,0,139,776,1,0,0,0,141,781,1,0,0,0,143,789,1, 0,0,0,129,716,1,0,0,0,131,736,1,0,0,0,133,741,1,0,0,0,135,754,1,
0,0,0,145,794,1,0,0,0,147,807,1,0,0,0,149,815,1,0,0,0,151,824,1, 0,0,0,137,766,1,0,0,0,139,778,1,0,0,0,141,783,1,0,0,0,143,791,1,
0,0,0,153,838,1,0,0,0,155,847,1,0,0,0,157,852,1,0,0,0,159,857,1, 0,0,0,145,796,1,0,0,0,147,809,1,0,0,0,149,817,1,0,0,0,151,826,1,
0,0,0,161,863,1,0,0,0,163,870,1,0,0,0,165,876,1,0,0,0,167,882,1, 0,0,0,153,840,1,0,0,0,155,849,1,0,0,0,157,854,1,0,0,0,159,861,1,
0,0,0,169,889,1,0,0,0,171,896,1,0,0,0,173,903,1,0,0,0,175,908,1, 0,0,0,161,866,1,0,0,0,163,872,1,0,0,0,165,879,1,0,0,0,167,885,1,
0,0,0,177,914,1,0,0,0,179,919,1,0,0,0,181,922,1,0,0,0,183,924,1, 0,0,0,169,891,1,0,0,0,171,898,1,0,0,0,173,905,1,0,0,0,175,912,1,
0,0,0,185,926,1,0,0,0,187,928,1,0,0,0,189,930,1,0,0,0,191,932,1, 0,0,0,177,917,1,0,0,0,179,923,1,0,0,0,181,928,1,0,0,0,183,931,1,
0,0,0,193,934,1,0,0,0,195,936,1,0,0,0,197,938,1,0,0,0,199,940,1, 0,0,0,185,933,1,0,0,0,187,935,1,0,0,0,189,937,1,0,0,0,191,939,1,
0,0,0,201,942,1,0,0,0,203,944,1,0,0,0,205,947,1,0,0,0,207,955,1, 0,0,0,193,941,1,0,0,0,195,943,1,0,0,0,197,945,1,0,0,0,199,947,1,
0,0,0,209,986,1,0,0,0,211,993,1,0,0,0,213,1003,1,0,0,0,215,1013, 0,0,0,201,949,1,0,0,0,203,951,1,0,0,0,205,953,1,0,0,0,207,956,1,
1,0,0,0,217,1015,1,0,0,0,219,1026,1,0,0,0,221,1041,1,0,0,0,223,224, 0,0,0,209,964,1,0,0,0,211,995,1,0,0,0,213,1002,1,0,0,0,215,1012,
5,119,0,0,224,225,5,111,0,0,225,226,5,114,0,0,226,227,5,107,0,0, 1,0,0,0,217,1022,1,0,0,0,219,1024,1,0,0,0,221,1035,1,0,0,0,223,1050,
227,228,5,115,0,0,228,229,5,112,0,0,229,230,5,97,0,0,230,231,5,99, 1,0,0,0,225,226,5,119,0,0,226,227,5,111,0,0,227,228,5,114,0,0,228,
0,0,231,232,5,101,0,0,232,2,1,0,0,0,233,234,5,102,0,0,234,235,5, 229,5,107,0,0,229,230,5,115,0,0,230,231,5,112,0,0,231,232,5,97,0,
114,0,0,235,236,5,97,0,0,236,237,5,103,0,0,237,238,5,109,0,0,238, 0,232,233,5,99,0,0,233,234,5,101,0,0,234,2,1,0,0,0,235,236,5,102,
239,5,101,0,0,239,240,5,110,0,0,240,241,5,116,0,0,241,4,1,0,0,0, 0,0,236,237,5,114,0,0,237,238,5,97,0,0,238,239,5,103,0,0,239,240,
242,243,5,105,0,0,243,244,5,109,0,0,244,245,5,112,0,0,245,246,5, 5,109,0,0,240,241,5,101,0,0,241,242,5,110,0,0,242,243,5,116,0,0,
111,0,0,246,247,5,114,0,0,247,248,5,116,0,0,248,6,1,0,0,0,249,250, 243,4,1,0,0,0,244,245,5,105,0,0,245,246,5,109,0,0,246,247,5,112,
5,101,0,0,250,251,5,120,0,0,251,252,5,116,0,0,252,253,5,101,0,0, 0,0,247,248,5,111,0,0,248,249,5,114,0,0,249,250,5,116,0,0,250,6,
253,254,5,114,0,0,254,255,5,110,0,0,255,256,5,97,0,0,256,257,5,108, 1,0,0,0,251,252,5,101,0,0,252,253,5,120,0,0,253,254,5,116,0,0,254,
0,0,257,8,1,0,0,0,258,259,5,97,0,0,259,260,5,116,0,0,260,261,5,111, 255,5,101,0,0,255,256,5,114,0,0,256,257,5,110,0,0,257,258,5,97,0,
0,0,261,262,5,109,0,0,262,10,1,0,0,0,263,264,5,105,0,0,264,265,5, 0,258,259,5,108,0,0,259,8,1,0,0,0,260,261,5,97,0,0,261,262,5,116,
110,0,0,265,266,5,116,0,0,266,267,5,101,0,0,267,268,5,114,0,0,268, 0,0,262,263,5,111,0,0,263,264,5,109,0,0,264,10,1,0,0,0,265,266,5,
269,5,102,0,0,269,270,5,97,0,0,270,271,5,99,0,0,271,272,5,101,0, 105,0,0,266,267,5,110,0,0,267,268,5,116,0,0,268,269,5,101,0,0,269,
0,272,12,1,0,0,0,273,274,5,105,0,0,274,275,5,110,0,0,275,276,5,116, 270,5,114,0,0,270,271,5,102,0,0,271,272,5,97,0,0,272,273,5,99,0,
0,0,276,277,5,101,0,0,277,278,5,114,0,0,278,279,5,102,0,0,279,280, 0,273,274,5,101,0,0,274,12,1,0,0,0,275,276,5,105,0,0,276,277,5,110,
5,97,0,0,280,281,5,99,0,0,281,282,5,101,0,0,282,283,5,115,0,0,283, 0,0,277,278,5,116,0,0,278,279,5,101,0,0,279,280,5,114,0,0,280,281,
14,1,0,0,0,284,285,5,112,0,0,285,286,5,97,0,0,286,287,5,99,0,0,287, 5,102,0,0,281,282,5,97,0,0,282,283,5,99,0,0,283,284,5,101,0,0,284,
288,5,107,0,0,288,289,5,97,0,0,289,290,5,103,0,0,290,291,5,101,0, 285,5,115,0,0,285,14,1,0,0,0,286,287,5,112,0,0,287,288,5,97,0,0,
0,291,16,1,0,0,0,292,293,5,118,0,0,293,294,5,97,0,0,294,295,5,108, 288,289,5,99,0,0,289,290,5,107,0,0,290,291,5,97,0,0,291,292,5,103,
0,0,295,296,5,117,0,0,296,297,5,101,0,0,297,18,1,0,0,0,298,299,5, 0,0,292,293,5,101,0,0,293,16,1,0,0,0,294,295,5,118,0,0,295,296,5,
114,0,0,299,300,5,101,0,0,300,301,5,108,0,0,301,302,5,97,0,0,302, 97,0,0,296,297,5,108,0,0,297,298,5,117,0,0,298,299,5,101,0,0,299,
303,5,116,0,0,303,304,5,105,0,0,304,305,5,111,0,0,305,306,5,110, 18,1,0,0,0,300,301,5,114,0,0,301,302,5,101,0,0,302,303,5,108,0,0,
0,0,306,20,1,0,0,0,307,308,5,111,0,0,308,309,5,112,0,0,309,310,5, 303,304,5,97,0,0,304,305,5,116,0,0,305,306,5,105,0,0,306,307,5,111,
101,0,0,310,311,5,114,0,0,311,312,5,97,0,0,312,313,5,116,0,0,313, 0,0,307,308,5,110,0,0,308,20,1,0,0,0,309,310,5,111,0,0,310,311,5,
314,5,105,0,0,314,315,5,111,0,0,315,316,5,110,0,0,316,22,1,0,0,0, 112,0,0,311,312,5,101,0,0,312,313,5,114,0,0,313,314,5,97,0,0,314,
317,318,5,102,0,0,318,319,5,117,0,0,319,320,5,110,0,0,320,321,5, 315,5,116,0,0,315,316,5,105,0,0,316,317,5,111,0,0,317,318,5,110,
99,0,0,321,322,5,116,0,0,322,323,5,105,0,0,323,324,5,111,0,0,324, 0,0,318,22,1,0,0,0,319,320,5,102,0,0,320,321,5,117,0,0,321,322,5,
325,5,110,0,0,325,24,1,0,0,0,326,327,5,99,0,0,327,328,5,111,0,0, 110,0,0,322,323,5,99,0,0,323,324,5,116,0,0,324,325,5,105,0,0,325,
328,329,5,110,0,0,329,330,5,115,0,0,330,331,5,116,0,0,331,332,5, 326,5,111,0,0,326,327,5,110,0,0,327,24,1,0,0,0,328,329,5,99,0,0,
114,0,0,332,333,5,117,0,0,333,334,5,99,0,0,334,335,5,116,0,0,335, 329,330,5,111,0,0,330,331,5,110,0,0,331,332,5,115,0,0,332,333,5,
336,5,111,0,0,336,337,5,114,0,0,337,26,1,0,0,0,338,339,5,99,0,0, 116,0,0,333,334,5,114,0,0,334,335,5,117,0,0,335,336,5,99,0,0,336,
339,340,5,111,0,0,340,341,5,110,0,0,341,342,5,115,0,0,342,343,5, 337,5,116,0,0,337,338,5,111,0,0,338,339,5,114,0,0,339,26,1,0,0,0,
116,0,0,343,344,5,114,0,0,344,345,5,117,0,0,345,346,5,99,0,0,346, 340,341,5,99,0,0,341,342,5,111,0,0,342,343,5,110,0,0,343,344,5,115,
347,5,116,0,0,347,348,5,115,0,0,348,28,1,0,0,0,349,350,5,105,0,0, 0,0,344,345,5,116,0,0,345,346,5,114,0,0,346,347,5,117,0,0,347,348,
350,351,5,110,0,0,351,352,5,112,0,0,352,353,5,117,0,0,353,354,5, 5,99,0,0,348,349,5,116,0,0,349,350,5,115,0,0,350,28,1,0,0,0,351,
116,0,0,354,30,1,0,0,0,355,356,5,99,0,0,356,357,5,111,0,0,357,358, 352,5,105,0,0,352,353,5,110,0,0,353,354,5,112,0,0,354,355,5,117,
5,110,0,0,358,359,5,102,0,0,359,360,5,111,0,0,360,361,5,114,0,0, 0,0,355,356,5,116,0,0,356,30,1,0,0,0,357,358,5,99,0,0,358,359,5,
361,362,5,109,0,0,362,32,1,0,0,0,363,364,5,97,0,0,364,365,5,115, 111,0,0,359,360,5,110,0,0,360,361,5,102,0,0,361,362,5,111,0,0,362,
0,0,365,34,1,0,0,0,366,367,5,98,0,0,367,368,5,105,0,0,368,369,5, 363,5,114,0,0,363,364,5,109,0,0,364,32,1,0,0,0,365,366,5,97,0,0,
110,0,0,369,370,5,100,0,0,370,36,1,0,0,0,371,372,5,116,0,0,372,373, 366,367,5,115,0,0,367,34,1,0,0,0,368,369,5,98,0,0,369,370,5,105,
5,111,0,0,373,38,1,0,0,0,374,375,5,112,0,0,375,376,5,114,0,0,376, 0,0,370,371,5,110,0,0,371,372,5,100,0,0,372,36,1,0,0,0,373,374,5,
377,5,105,0,0,377,378,5,118,0,0,378,379,5,97,0,0,379,380,5,116,0, 116,0,0,374,375,5,111,0,0,375,38,1,0,0,0,376,377,5,112,0,0,377,378,
0,380,381,5,101,0,0,381,40,1,0,0,0,382,383,5,115,0,0,383,384,5,104, 5,114,0,0,378,379,5,105,0,0,379,380,5,118,0,0,380,381,5,97,0,0,381,
0,0,384,385,5,97,0,0,385,386,5,114,0,0,386,387,5,101,0,0,387,388, 382,5,116,0,0,382,383,5,101,0,0,383,40,1,0,0,0,384,385,5,115,0,0,
5,100,0,0,388,42,1,0,0,0,389,390,5,115,0,0,390,391,5,116,0,0,391, 385,386,5,104,0,0,386,387,5,97,0,0,387,388,5,114,0,0,388,389,5,101,
392,5,97,0,0,392,393,5,116,0,0,393,394,5,101,0,0,394,44,1,0,0,0, 0,0,389,390,5,100,0,0,390,42,1,0,0,0,391,392,5,115,0,0,392,393,5,
395,396,5,101,0,0,396,397,5,100,0,0,397,398,5,103,0,0,398,399,5, 116,0,0,393,394,5,97,0,0,394,395,5,116,0,0,395,396,5,101,0,0,396,
101,0,0,399,46,1,0,0,0,400,401,5,112,0,0,401,402,5,114,0,0,402,403, 44,1,0,0,0,397,398,5,101,0,0,398,399,5,100,0,0,399,400,5,103,0,0,
5,111,0,0,403,404,5,106,0,0,404,405,5,101,0,0,405,406,5,99,0,0,406, 400,401,5,101,0,0,401,46,1,0,0,0,402,403,5,112,0,0,403,404,5,114,
407,5,116,0,0,407,408,5,105,0,0,408,409,5,111,0,0,409,410,5,110, 0,0,404,405,5,111,0,0,405,406,5,106,0,0,406,407,5,101,0,0,407,408,
0,0,410,48,1,0,0,0,411,412,5,119,0,0,412,413,5,105,0,0,413,414,5, 5,99,0,0,408,409,5,116,0,0,409,410,5,105,0,0,410,411,5,111,0,0,411,
116,0,0,414,415,5,104,0,0,415,50,1,0,0,0,416,417,5,117,0,0,417,418, 412,5,110,0,0,412,48,1,0,0,0,413,414,5,119,0,0,414,415,5,105,0,0,
5,115,0,0,418,419,5,105,0,0,419,420,5,110,0,0,420,421,5,103,0,0, 415,416,5,116,0,0,416,417,5,104,0,0,417,50,1,0,0,0,418,419,5,117,
421,52,1,0,0,0,422,423,5,118,0,0,423,424,5,105,0,0,424,425,5,97, 0,0,419,420,5,115,0,0,420,421,5,105,0,0,421,422,5,110,0,0,422,423,
0,0,425,54,1,0,0,0,426,427,5,109,0,0,427,428,5,97,0,0,428,429,5, 5,103,0,0,423,52,1,0,0,0,424,425,5,118,0,0,425,426,5,105,0,0,426,
116,0,0,429,430,5,101,0,0,430,431,5,114,0,0,431,432,5,105,0,0,432, 427,5,97,0,0,427,54,1,0,0,0,428,429,5,109,0,0,429,430,5,97,0,0,430,
433,5,97,0,0,433,434,5,108,0,0,434,435,5,105,0,0,435,436,5,122,0, 431,5,116,0,0,431,432,5,101,0,0,432,433,5,114,0,0,433,434,5,105,
0,436,437,5,101,0,0,437,56,1,0,0,0,438,439,5,105,0,0,439,440,5,102, 0,0,434,435,5,97,0,0,435,436,5,108,0,0,436,437,5,105,0,0,437,438,
0,0,440,58,1,0,0,0,441,442,5,97,0,0,442,443,5,98,0,0,443,444,5,115, 5,122,0,0,438,439,5,101,0,0,439,56,1,0,0,0,440,441,5,105,0,0,441,
0,0,444,445,5,101,0,0,445,446,5,110,0,0,446,447,5,116,0,0,447,60, 442,5,102,0,0,442,58,1,0,0,0,443,444,5,97,0,0,444,445,5,98,0,0,445,
1,0,0,0,448,449,5,111,0,0,449,450,5,110,0,0,450,62,1,0,0,0,451,452, 446,5,115,0,0,446,447,5,101,0,0,447,448,5,110,0,0,448,449,5,116,
5,112,0,0,452,453,5,111,0,0,453,454,5,108,0,0,454,455,5,105,0,0, 0,0,449,60,1,0,0,0,450,451,5,111,0,0,451,452,5,110,0,0,452,62,1,
455,456,5,99,0,0,456,457,5,121,0,0,457,64,1,0,0,0,458,459,5,100, 0,0,0,453,454,5,112,0,0,454,455,5,111,0,0,455,456,5,108,0,0,456,
0,0,459,460,5,101,0,0,460,461,5,102,0,0,461,462,5,97,0,0,462,463, 457,5,105,0,0,457,458,5,99,0,0,458,459,5,121,0,0,459,64,1,0,0,0,
5,117,0,0,463,464,5,108,0,0,464,465,5,116,0,0,465,66,1,0,0,0,466, 460,461,5,100,0,0,461,462,5,101,0,0,462,463,5,102,0,0,463,464,5,
467,5,115,0,0,467,468,5,111,0,0,468,469,5,117,0,0,469,470,5,114, 97,0,0,464,465,5,117,0,0,465,466,5,108,0,0,466,467,5,116,0,0,467,
0,0,470,471,5,99,0,0,471,472,5,101,0,0,472,68,1,0,0,0,473,474,5, 66,1,0,0,0,468,469,5,115,0,0,469,470,5,111,0,0,470,471,5,117,0,0,
114,0,0,474,475,5,101,0,0,475,476,5,112,0,0,476,477,5,111,0,0,477, 471,472,5,114,0,0,472,473,5,99,0,0,473,474,5,101,0,0,474,68,1,0,
478,5,115,0,0,478,479,5,105,0,0,479,480,5,116,0,0,480,481,5,111, 0,0,475,476,5,114,0,0,476,477,5,101,0,0,477,478,5,112,0,0,478,479,
0,0,481,482,5,114,0,0,482,483,5,121,0,0,483,70,1,0,0,0,484,485,5, 5,111,0,0,479,480,5,115,0,0,480,481,5,105,0,0,481,482,5,116,0,0,
99,0,0,485,486,5,111,0,0,486,487,5,109,0,0,487,488,5,109,0,0,488, 482,483,5,111,0,0,483,484,5,114,0,0,484,485,5,121,0,0,485,70,1,0,
489,5,105,0,0,489,490,5,116,0,0,490,72,1,0,0,0,491,492,5,114,0,0, 0,0,486,487,5,99,0,0,487,488,5,111,0,0,488,489,5,109,0,0,489,490,
492,493,5,101,0,0,493,494,5,118,0,0,494,495,5,105,0,0,495,496,5, 5,109,0,0,490,491,5,105,0,0,491,492,5,116,0,0,492,72,1,0,0,0,493,
115,0,0,496,497,5,105,0,0,497,498,5,111,0,0,498,499,5,110,0,0,499, 494,5,114,0,0,494,495,5,101,0,0,495,496,5,118,0,0,496,497,5,105,
74,1,0,0,0,500,501,5,115,0,0,501,502,5,101,0,0,502,503,5,109,0,0, 0,0,497,498,5,115,0,0,498,499,5,105,0,0,499,500,5,111,0,0,500,501,
503,504,5,97,0,0,504,505,5,110,0,0,505,506,5,116,0,0,506,507,5,105, 5,110,0,0,501,74,1,0,0,0,502,503,5,115,0,0,503,504,5,101,0,0,504,
0,0,507,508,5,99,0,0,508,509,5,45,0,0,509,510,5,109,0,0,510,511, 505,5,109,0,0,505,506,5,97,0,0,506,507,5,110,0,0,507,508,5,116,0,
5,97,0,0,511,512,5,106,0,0,512,513,5,111,0,0,513,514,5,114,0,0,514, 0,508,509,5,105,0,0,509,510,5,99,0,0,510,511,5,45,0,0,511,512,5,
76,1,0,0,0,515,516,5,111,0,0,516,517,5,110,0,0,517,518,5,45,0,0, 109,0,0,512,513,5,97,0,0,513,514,5,106,0,0,514,515,5,111,0,0,515,
518,519,5,100,0,0,519,520,5,101,0,0,520,521,5,108,0,0,521,522,5, 516,5,114,0,0,516,76,1,0,0,0,517,518,5,111,0,0,518,519,5,110,0,0,
101,0,0,522,523,5,116,0,0,523,524,5,101,0,0,524,78,1,0,0,0,525,526, 519,520,5,45,0,0,520,521,5,100,0,0,521,522,5,101,0,0,522,523,5,108,
5,114,0,0,526,527,5,101,0,0,527,528,5,116,0,0,528,529,5,97,0,0,529, 0,0,523,524,5,101,0,0,524,525,5,116,0,0,525,526,5,101,0,0,526,78,
530,5,105,0,0,530,531,5,110,0,0,531,532,5,45,0,0,532,533,5,111,0, 1,0,0,0,527,528,5,114,0,0,528,529,5,101,0,0,529,530,5,116,0,0,530,
0,533,534,5,116,0,0,534,535,5,104,0,0,535,536,5,101,0,0,536,537, 531,5,97,0,0,531,532,5,105,0,0,532,533,5,110,0,0,533,534,5,45,0,
5,114,0,0,537,80,1,0,0,0,538,539,5,107,0,0,539,540,5,101,0,0,540, 0,534,535,5,111,0,0,535,536,5,116,0,0,536,537,5,104,0,0,537,538,
541,5,121,0,0,541,542,5,101,0,0,542,543,5,100,0,0,543,82,1,0,0,0, 5,101,0,0,538,539,5,114,0,0,539,80,1,0,0,0,540,541,5,107,0,0,541,
544,545,5,112,0,0,545,546,5,117,0,0,546,547,5,98,0,0,547,548,5,108, 542,5,101,0,0,542,543,5,121,0,0,543,544,5,101,0,0,544,545,5,100,
0,0,548,549,5,105,0,0,549,550,5,99,0,0,550,551,5,45,0,0,551,552, 0,0,545,82,1,0,0,0,546,547,5,112,0,0,547,548,5,117,0,0,548,549,5,
5,116,0,0,552,553,5,114,0,0,553,554,5,97,0,0,554,555,5,118,0,0,555, 98,0,0,549,550,5,108,0,0,550,551,5,105,0,0,551,552,5,99,0,0,552,
556,5,101,0,0,556,557,5,114,0,0,557,558,5,115,0,0,558,559,5,97,0, 553,5,45,0,0,553,554,5,116,0,0,554,555,5,114,0,0,555,556,5,97,0,
0,559,560,5,108,0,0,560,84,1,0,0,0,561,562,5,105,0,0,562,563,5,100, 0,556,557,5,118,0,0,557,558,5,101,0,0,558,559,5,114,0,0,559,560,
0,0,563,86,1,0,0,0,564,565,5,100,0,0,565,566,5,111,0,0,566,567,5, 5,115,0,0,560,561,5,97,0,0,561,562,5,108,0,0,562,84,1,0,0,0,563,
99,0,0,567,88,1,0,0,0,568,569,5,109,0,0,569,570,5,111,0,0,570,571, 564,5,105,0,0,564,565,5,100,0,0,565,86,1,0,0,0,566,567,5,100,0,0,
5,100,0,0,571,572,5,101,0,0,572,90,1,0,0,0,573,574,5,101,0,0,574, 567,568,5,111,0,0,568,569,5,99,0,0,569,88,1,0,0,0,570,571,5,109,
575,5,109,0,0,575,576,5,105,0,0,576,577,5,116,0,0,577,578,5,115, 0,0,571,572,5,111,0,0,572,573,5,100,0,0,573,574,5,101,0,0,574,90,
0,0,578,92,1,0,0,0,579,580,5,114,0,0,580,581,5,101,0,0,581,582,5, 1,0,0,0,575,576,5,101,0,0,576,577,5,109,0,0,577,578,5,105,0,0,578,
99,0,0,582,583,5,101,0,0,583,584,5,105,0,0,584,585,5,118,0,0,585, 579,5,116,0,0,579,580,5,115,0,0,580,92,1,0,0,0,581,582,5,114,0,0,
586,5,101,0,0,586,587,5,114,0,0,587,94,1,0,0,0,588,589,5,114,0,0, 582,583,5,101,0,0,583,584,5,99,0,0,584,585,5,101,0,0,585,586,5,105,
589,590,5,101,0,0,590,591,5,113,0,0,591,592,5,117,0,0,592,593,5, 0,0,586,587,5,118,0,0,587,588,5,101,0,0,588,589,5,114,0,0,589,94,
105,0,0,593,594,5,114,0,0,594,595,5,101,0,0,595,596,5,115,0,0,596, 1,0,0,0,590,591,5,114,0,0,591,592,5,101,0,0,592,593,5,113,0,0,593,
96,1,0,0,0,597,598,5,97,0,0,598,599,5,110,0,0,599,600,5,121,0,0, 594,5,117,0,0,594,595,5,105,0,0,595,596,5,114,0,0,596,597,5,101,
600,98,1,0,0,0,601,602,5,103,0,0,602,603,5,101,0,0,603,604,5,116, 0,0,597,598,5,115,0,0,598,96,1,0,0,0,599,600,5,97,0,0,600,601,5,
0,0,604,100,1,0,0,0,605,606,5,115,0,0,606,607,5,101,0,0,607,608, 110,0,0,601,602,5,121,0,0,602,98,1,0,0,0,603,604,5,103,0,0,604,605,
5,116,0,0,608,102,1,0,0,0,609,610,5,119,0,0,610,611,5,97,0,0,611, 5,101,0,0,605,606,5,116,0,0,606,100,1,0,0,0,607,608,5,115,0,0,608,
612,5,116,0,0,612,613,5,99,0,0,613,614,5,104,0,0,614,104,1,0,0,0, 609,5,101,0,0,609,610,5,116,0,0,610,102,1,0,0,0,611,612,5,119,0,
615,616,5,115,0,0,616,617,5,116,0,0,617,618,5,97,0,0,618,619,5,114, 0,612,613,5,97,0,0,613,614,5,116,0,0,614,615,5,99,0,0,615,616,5,
0,0,619,620,5,116,0,0,620,106,1,0,0,0,621,622,5,115,0,0,622,623, 104,0,0,616,104,1,0,0,0,617,618,5,115,0,0,618,619,5,116,0,0,619,
5,116,0,0,623,624,5,111,0,0,624,625,5,112,0,0,625,108,1,0,0,0,626, 620,5,97,0,0,620,621,5,114,0,0,621,622,5,116,0,0,622,106,1,0,0,0,
627,5,114,0,0,627,628,5,101,0,0,628,629,5,97,0,0,629,630,5,100,0, 623,624,5,115,0,0,624,625,5,116,0,0,625,626,5,111,0,0,626,627,5,
0,630,110,1,0,0,0,631,632,5,119,0,0,632,633,5,114,0,0,633,634,5, 112,0,0,627,108,1,0,0,0,628,629,5,114,0,0,629,630,5,101,0,0,630,
105,0,0,634,635,5,116,0,0,635,636,5,101,0,0,636,112,1,0,0,0,637, 631,5,97,0,0,631,632,5,100,0,0,632,110,1,0,0,0,633,634,5,119,0,0,
638,5,114,0,0,638,639,5,101,0,0,639,640,5,115,0,0,640,641,5,111, 634,635,5,114,0,0,635,636,5,105,0,0,636,637,5,116,0,0,637,638,5,
0,0,641,642,5,108,0,0,642,643,5,118,0,0,643,644,5,101,0,0,644,114, 101,0,0,638,112,1,0,0,0,639,640,5,114,0,0,640,641,5,101,0,0,641,
1,0,0,0,645,646,5,99,0,0,646,647,5,111,0,0,647,648,5,110,0,0,648, 642,5,115,0,0,642,643,5,111,0,0,643,644,5,108,0,0,644,645,5,118,
649,5,110,0,0,649,650,5,101,0,0,650,651,5,99,0,0,651,652,5,116,0, 0,0,645,646,5,101,0,0,646,114,1,0,0,0,647,648,5,99,0,0,648,649,5,
0,652,116,1,0,0,0,653,654,5,100,0,0,654,655,5,105,0,0,655,656,5, 111,0,0,649,650,5,110,0,0,650,651,5,110,0,0,651,652,5,101,0,0,652,
115,0,0,656,657,5,99,0,0,657,658,5,111,0,0,658,659,5,110,0,0,659, 653,5,99,0,0,653,654,5,116,0,0,654,116,1,0,0,0,655,656,5,100,0,0,
660,5,110,0,0,660,661,5,101,0,0,661,662,5,99,0,0,662,663,5,116,0, 656,657,5,105,0,0,657,658,5,115,0,0,658,659,5,99,0,0,659,660,5,111,
0,663,118,1,0,0,0,664,665,5,99,0,0,665,666,5,97,0,0,666,667,5,108, 0,0,660,661,5,110,0,0,661,662,5,110,0,0,662,663,5,101,0,0,663,664,
0,0,667,668,5,108,0,0,668,120,1,0,0,0,669,670,5,119,0,0,670,671, 5,99,0,0,664,665,5,116,0,0,665,118,1,0,0,0,666,667,5,99,0,0,667,
5,97,0,0,671,672,5,116,0,0,672,673,5,99,0,0,673,674,5,104,0,0,674, 668,5,97,0,0,668,669,5,108,0,0,669,670,5,108,0,0,670,120,1,0,0,0,
675,5,45,0,0,675,676,5,115,0,0,676,677,5,116,0,0,677,678,5,97,0, 671,672,5,119,0,0,672,673,5,97,0,0,673,674,5,116,0,0,674,675,5,99,
0,678,679,5,114,0,0,679,680,5,116,0,0,680,122,1,0,0,0,681,682,5, 0,0,675,676,5,104,0,0,676,677,5,45,0,0,677,678,5,115,0,0,678,679,
119,0,0,682,683,5,97,0,0,683,684,5,116,0,0,684,685,5,99,0,0,685, 5,116,0,0,679,680,5,97,0,0,680,681,5,114,0,0,681,682,5,116,0,0,682,
686,5,104,0,0,686,687,5,45,0,0,687,688,5,115,0,0,688,689,5,116,0, 122,1,0,0,0,683,684,5,119,0,0,684,685,5,97,0,0,685,686,5,116,0,0,
0,689,690,5,111,0,0,690,691,5,112,0,0,691,124,1,0,0,0,692,693,5, 686,687,5,99,0,0,687,688,5,104,0,0,688,689,5,45,0,0,689,690,5,115,
115,0,0,693,694,5,117,0,0,694,695,5,98,0,0,695,696,5,115,0,0,696, 0,0,690,691,5,116,0,0,691,692,5,111,0,0,692,693,5,112,0,0,693,124,
697,5,99,0,0,697,698,5,114,0,0,698,699,5,105,0,0,699,700,5,98,0, 1,0,0,0,694,695,5,115,0,0,695,696,5,117,0,0,696,697,5,98,0,0,697,
0,700,701,5,101,0,0,701,126,1,0,0,0,702,703,5,117,0,0,703,704,5, 698,5,115,0,0,698,699,5,99,0,0,699,700,5,114,0,0,700,701,5,105,0,
110,0,0,704,705,5,115,0,0,705,706,5,117,0,0,706,707,5,98,0,0,707, 0,701,702,5,98,0,0,702,703,5,101,0,0,703,126,1,0,0,0,704,705,5,117,
708,5,115,0,0,708,709,5,99,0,0,709,710,5,114,0,0,710,711,5,105,0, 0,0,705,706,5,110,0,0,706,707,5,115,0,0,707,708,5,117,0,0,708,709,
0,711,712,5,98,0,0,712,713,5,101,0,0,713,128,1,0,0,0,714,715,5,111, 5,98,0,0,709,710,5,115,0,0,710,711,5,99,0,0,711,712,5,114,0,0,712,
0,0,715,716,5,112,0,0,716,717,5,116,0,0,717,718,5,105,0,0,718,719, 713,5,105,0,0,713,714,5,98,0,0,714,715,5,101,0,0,715,128,1,0,0,0,
5,109,0,0,719,720,5,105,0,0,720,721,5,115,0,0,721,722,5,116,0,0, 716,717,5,111,0,0,717,718,5,112,0,0,718,719,5,116,0,0,719,720,5,
722,723,5,105,0,0,723,724,5,99,0,0,724,725,5,45,0,0,725,726,5,114, 105,0,0,720,721,5,109,0,0,721,722,5,105,0,0,722,723,5,115,0,0,723,
0,0,726,727,5,101,0,0,727,728,5,103,0,0,728,729,5,105,0,0,729,730, 724,5,116,0,0,724,725,5,105,0,0,725,726,5,99,0,0,726,727,5,45,0,
5,115,0,0,730,731,5,116,0,0,731,732,5,101,0,0,732,733,5,114,0,0, 0,727,728,5,114,0,0,728,729,5,101,0,0,729,730,5,103,0,0,730,731,
733,130,1,0,0,0,734,735,5,99,0,0,735,736,5,114,0,0,736,737,5,100, 5,105,0,0,731,732,5,115,0,0,732,733,5,116,0,0,733,734,5,101,0,0,
0,0,737,738,5,116,0,0,738,132,1,0,0,0,739,740,5,111,0,0,740,741, 734,735,5,114,0,0,735,130,1,0,0,0,736,737,5,99,0,0,737,738,5,114,
5,112,0,0,741,742,5,116,0,0,742,743,5,105,0,0,743,744,5,111,0,0, 0,0,738,739,5,100,0,0,739,740,5,116,0,0,740,132,1,0,0,0,741,742,
744,745,5,110,0,0,745,746,5,97,0,0,746,747,5,108,0,0,747,748,5,45, 5,111,0,0,742,743,5,112,0,0,743,744,5,116,0,0,744,745,5,105,0,0,
0,0,748,749,5,111,0,0,749,750,5,110,0,0,750,751,5,101,0,0,751,134, 745,746,5,111,0,0,746,747,5,110,0,0,747,748,5,97,0,0,748,749,5,108,
1,0,0,0,752,753,5,101,0,0,753,754,5,120,0,0,754,755,5,97,0,0,755, 0,0,749,750,5,45,0,0,750,751,5,111,0,0,751,752,5,110,0,0,752,753,
756,5,99,0,0,756,757,5,116,0,0,757,758,5,108,0,0,758,759,5,121,0, 5,101,0,0,753,134,1,0,0,0,754,755,5,101,0,0,755,756,5,120,0,0,756,
0,759,760,5,45,0,0,760,761,5,111,0,0,761,762,5,110,0,0,762,763,5, 757,5,97,0,0,757,758,5,99,0,0,758,759,5,116,0,0,759,760,5,108,0,
101,0,0,763,136,1,0,0,0,764,765,5,109,0,0,765,766,5,97,0,0,766,767, 0,760,761,5,121,0,0,761,762,5,45,0,0,762,763,5,111,0,0,763,764,5,
5,110,0,0,767,768,5,121,0,0,768,769,5,45,0,0,769,770,5,117,0,0,770, 110,0,0,764,765,5,101,0,0,765,136,1,0,0,0,766,767,5,109,0,0,767,
771,5,110,0,0,771,772,5,105,0,0,772,773,5,113,0,0,773,774,5,117, 768,5,97,0,0,768,769,5,110,0,0,769,770,5,121,0,0,770,771,5,45,0,
0,0,774,775,5,101,0,0,775,138,1,0,0,0,776,777,5,109,0,0,777,778, 0,771,772,5,117,0,0,772,773,5,110,0,0,773,774,5,105,0,0,774,775,
5,97,0,0,778,779,5,110,0,0,779,780,5,121,0,0,780,140,1,0,0,0,781, 5,113,0,0,775,776,5,117,0,0,776,777,5,101,0,0,777,138,1,0,0,0,778,
782,5,111,0,0,782,783,5,114,0,0,783,784,5,100,0,0,784,785,5,101, 779,5,109,0,0,779,780,5,97,0,0,780,781,5,110,0,0,781,782,5,121,0,
0,0,785,786,5,114,0,0,786,787,5,101,0,0,787,788,5,100,0,0,788,142, 0,782,140,1,0,0,0,783,784,5,111,0,0,784,785,5,114,0,0,785,786,5,
1,0,0,0,789,790,5,117,0,0,790,791,5,110,0,0,791,792,5,105,0,0,792, 100,0,0,786,787,5,101,0,0,787,788,5,114,0,0,788,789,5,101,0,0,789,
793,5,116,0,0,793,144,1,0,0,0,794,795,5,119,0,0,795,796,5,97,0,0, 790,5,100,0,0,790,142,1,0,0,0,791,792,5,117,0,0,792,793,5,110,0,
796,797,5,116,0,0,797,798,5,99,0,0,798,799,5,104,0,0,799,800,5,45, 0,793,794,5,105,0,0,794,795,5,116,0,0,795,144,1,0,0,0,796,797,5,
0,0,800,801,5,104,0,0,801,802,5,97,0,0,802,803,5,110,0,0,803,804, 119,0,0,797,798,5,97,0,0,798,799,5,116,0,0,799,800,5,99,0,0,800,
5,100,0,0,804,805,5,108,0,0,805,806,5,101,0,0,806,146,1,0,0,0,807, 801,5,104,0,0,801,802,5,45,0,0,802,803,5,104,0,0,803,804,5,97,0,
808,5,109,0,0,808,809,5,101,0,0,809,810,5,115,0,0,810,811,5,115, 0,804,805,5,110,0,0,805,806,5,100,0,0,806,807,5,108,0,0,807,808,
0,0,811,812,5,97,0,0,812,813,5,103,0,0,813,814,5,101,0,0,814,148, 5,101,0,0,808,146,1,0,0,0,809,810,5,109,0,0,810,811,5,101,0,0,811,
1,0,0,0,815,816,5,97,0,0,816,817,5,116,0,0,817,818,5,111,0,0,818, 812,5,115,0,0,812,813,5,115,0,0,813,814,5,97,0,0,814,815,5,103,0,
819,5,109,0,0,819,820,5,45,0,0,820,821,5,114,0,0,821,822,5,101,0, 0,815,816,5,101,0,0,816,148,1,0,0,0,817,818,5,97,0,0,818,819,5,116,
0,822,823,5,102,0,0,823,150,1,0,0,0,824,825,5,105,0,0,825,826,5, 0,0,819,820,5,111,0,0,820,821,5,109,0,0,821,822,5,45,0,0,822,823,
110,0,0,826,827,5,116,0,0,827,828,5,101,0,0,828,829,5,114,0,0,829, 5,114,0,0,823,824,5,101,0,0,824,825,5,102,0,0,825,150,1,0,0,0,826,
830,5,102,0,0,830,831,5,97,0,0,831,832,5,99,0,0,832,833,5,101,0, 827,5,105,0,0,827,828,5,110,0,0,828,829,5,116,0,0,829,830,5,101,
0,833,834,5,45,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837,5, 0,0,830,831,5,114,0,0,831,832,5,102,0,0,832,833,5,97,0,0,833,834,
102,0,0,837,152,1,0,0,0,838,839,5,111,0,0,839,840,5,112,0,0,840, 5,99,0,0,834,835,5,101,0,0,835,836,5,45,0,0,836,837,5,114,0,0,837,
841,5,116,0,0,841,842,5,105,0,0,842,843,5,111,0,0,843,844,5,110, 838,5,101,0,0,838,839,5,102,0,0,839,152,1,0,0,0,840,841,5,111,0,
0,0,844,845,5,97,0,0,845,846,5,108,0,0,846,154,1,0,0,0,847,848,5, 0,841,842,5,112,0,0,842,843,5,116,0,0,843,844,5,105,0,0,844,845,
108,0,0,848,849,5,105,0,0,849,850,5,115,0,0,850,851,5,116,0,0,851, 5,111,0,0,845,846,5,110,0,0,846,847,5,97,0,0,847,848,5,108,0,0,848,
156,1,0,0,0,852,853,5,98,0,0,853,854,5,111,0,0,854,855,5,111,0,0, 154,1,0,0,0,849,850,5,108,0,0,850,851,5,105,0,0,851,852,5,115,0,
855,856,5,108,0,0,856,158,1,0,0,0,857,858,5,98,0,0,858,859,5,121, 0,852,853,5,116,0,0,853,156,1,0,0,0,854,855,5,114,0,0,855,856,5,
0,0,859,860,5,116,0,0,860,861,5,101,0,0,861,862,5,115,0,0,862,160, 101,0,0,856,857,5,99,0,0,857,858,5,111,0,0,858,859,5,114,0,0,859,
1,0,0,0,863,864,5,100,0,0,864,865,5,111,0,0,865,866,5,117,0,0,866, 860,5,100,0,0,860,158,1,0,0,0,861,862,5,98,0,0,862,863,5,111,0,0,
867,5,98,0,0,867,868,5,108,0,0,868,869,5,101,0,0,869,162,1,0,0,0, 863,864,5,111,0,0,864,865,5,108,0,0,865,160,1,0,0,0,866,867,5,98,
870,871,5,105,0,0,871,872,5,110,0,0,872,873,5,116,0,0,873,874,5, 0,0,867,868,5,121,0,0,868,869,5,116,0,0,869,870,5,101,0,0,870,871,
51,0,0,874,875,5,50,0,0,875,164,1,0,0,0,876,877,5,105,0,0,877,878, 5,115,0,0,871,162,1,0,0,0,872,873,5,100,0,0,873,874,5,111,0,0,874,
5,110,0,0,878,879,5,116,0,0,879,880,5,54,0,0,880,881,5,52,0,0,881, 875,5,117,0,0,875,876,5,98,0,0,876,877,5,108,0,0,877,878,5,101,0,
166,1,0,0,0,882,883,5,115,0,0,883,884,5,116,0,0,884,885,5,114,0, 0,878,164,1,0,0,0,879,880,5,105,0,0,880,881,5,110,0,0,881,882,5,
0,885,886,5,105,0,0,886,887,5,110,0,0,887,888,5,103,0,0,888,168, 116,0,0,882,883,5,51,0,0,883,884,5,50,0,0,884,166,1,0,0,0,885,886,
1,0,0,0,889,890,5,117,0,0,890,891,5,105,0,0,891,892,5,110,0,0,892, 5,105,0,0,886,887,5,110,0,0,887,888,5,116,0,0,888,889,5,54,0,0,889,
893,5,116,0,0,893,894,5,51,0,0,894,895,5,50,0,0,895,170,1,0,0,0, 890,5,52,0,0,890,168,1,0,0,0,891,892,5,115,0,0,892,893,5,116,0,0,
896,897,5,117,0,0,897,898,5,105,0,0,898,899,5,110,0,0,899,900,5, 893,894,5,114,0,0,894,895,5,105,0,0,895,896,5,110,0,0,896,897,5,
116,0,0,900,901,5,54,0,0,901,902,5,52,0,0,902,172,1,0,0,0,903,904, 103,0,0,897,170,1,0,0,0,898,899,5,117,0,0,899,900,5,105,0,0,900,
5,116,0,0,904,905,5,114,0,0,905,906,5,117,0,0,906,907,5,101,0,0, 901,5,110,0,0,901,902,5,116,0,0,902,903,5,51,0,0,903,904,5,50,0,
907,174,1,0,0,0,908,909,5,102,0,0,909,910,5,97,0,0,910,911,5,108, 0,904,172,1,0,0,0,905,906,5,117,0,0,906,907,5,105,0,0,907,908,5,
0,0,911,912,5,115,0,0,912,913,5,101,0,0,913,176,1,0,0,0,914,915, 110,0,0,908,909,5,116,0,0,909,910,5,54,0,0,910,911,5,52,0,0,911,
5,110,0,0,915,916,5,117,0,0,916,917,5,108,0,0,917,918,5,108,0,0, 174,1,0,0,0,912,913,5,116,0,0,913,914,5,114,0,0,914,915,5,117,0,
918,178,1,0,0,0,919,920,5,45,0,0,920,921,5,62,0,0,921,180,1,0,0, 0,915,916,5,101,0,0,916,176,1,0,0,0,917,918,5,102,0,0,918,919,5,
0,922,923,5,58,0,0,923,182,1,0,0,0,924,925,5,59,0,0,925,184,1,0, 97,0,0,919,920,5,108,0,0,920,921,5,115,0,0,921,922,5,101,0,0,922,
0,0,926,927,5,44,0,0,927,186,1,0,0,0,928,929,5,46,0,0,929,188,1, 178,1,0,0,0,923,924,5,110,0,0,924,925,5,117,0,0,925,926,5,108,0,
0,0,0,930,931,5,123,0,0,931,190,1,0,0,0,932,933,5,125,0,0,933,192, 0,926,927,5,108,0,0,927,180,1,0,0,0,928,929,5,45,0,0,929,930,5,62,
1,0,0,0,934,935,5,91,0,0,935,194,1,0,0,0,936,937,5,93,0,0,937,196, 0,0,930,182,1,0,0,0,931,932,5,58,0,0,932,184,1,0,0,0,933,934,5,59,
1,0,0,0,938,939,5,40,0,0,939,198,1,0,0,0,940,941,5,41,0,0,941,200, 0,0,934,186,1,0,0,0,935,936,5,44,0,0,936,188,1,0,0,0,937,938,5,46,
1,0,0,0,942,943,5,60,0,0,943,202,1,0,0,0,944,945,5,62,0,0,945,204, 0,0,938,190,1,0,0,0,939,940,5,123,0,0,940,192,1,0,0,0,941,942,5,
1,0,0,0,946,948,5,45,0,0,947,946,1,0,0,0,947,948,1,0,0,0,948,950, 125,0,0,942,194,1,0,0,0,943,944,5,91,0,0,944,196,1,0,0,0,945,946,
1,0,0,0,949,951,7,0,0,0,950,949,1,0,0,0,951,952,1,0,0,0,952,950, 5,93,0,0,946,198,1,0,0,0,947,948,5,40,0,0,948,200,1,0,0,0,949,950,
1,0,0,0,952,953,1,0,0,0,953,206,1,0,0,0,954,956,5,45,0,0,955,954, 5,41,0,0,950,202,1,0,0,0,951,952,5,60,0,0,952,204,1,0,0,0,953,954,
1,0,0,0,955,956,1,0,0,0,956,965,1,0,0,0,957,966,5,48,0,0,958,962, 5,62,0,0,954,206,1,0,0,0,955,957,5,45,0,0,956,955,1,0,0,0,956,957,
7,1,0,0,959,961,7,0,0,0,960,959,1,0,0,0,961,964,1,0,0,0,962,960, 1,0,0,0,957,959,1,0,0,0,958,960,7,0,0,0,959,958,1,0,0,0,960,961,
1,0,0,0,962,963,1,0,0,0,963,966,1,0,0,0,964,962,1,0,0,0,965,957, 1,0,0,0,961,959,1,0,0,0,961,962,1,0,0,0,962,208,1,0,0,0,963,965,
1,0,0,0,965,958,1,0,0,0,966,973,1,0,0,0,967,969,5,46,0,0,968,970, 5,45,0,0,964,963,1,0,0,0,964,965,1,0,0,0,965,974,1,0,0,0,966,975,
7,0,0,0,969,968,1,0,0,0,970,971,1,0,0,0,971,969,1,0,0,0,971,972, 5,48,0,0,967,971,7,1,0,0,968,970,7,0,0,0,969,968,1,0,0,0,970,973,
1,0,0,0,972,974,1,0,0,0,973,967,1,0,0,0,973,974,1,0,0,0,974,984, 1,0,0,0,971,969,1,0,0,0,971,972,1,0,0,0,972,975,1,0,0,0,973,971,
1,0,0,0,975,977,7,2,0,0,976,978,7,3,0,0,977,976,1,0,0,0,977,978, 1,0,0,0,974,966,1,0,0,0,974,967,1,0,0,0,975,982,1,0,0,0,976,978,
1,0,0,0,978,980,1,0,0,0,979,981,7,0,0,0,980,979,1,0,0,0,981,982, 5,46,0,0,977,979,7,0,0,0,978,977,1,0,0,0,979,980,1,0,0,0,980,978,
1,0,0,0,982,980,1,0,0,0,982,983,1,0,0,0,983,985,1,0,0,0,984,975, 1,0,0,0,980,981,1,0,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,983,
1,0,0,0,984,985,1,0,0,0,985,208,1,0,0,0,986,990,7,4,0,0,987,989, 1,0,0,0,983,993,1,0,0,0,984,986,7,2,0,0,985,987,7,3,0,0,986,985,
7,5,0,0,988,987,1,0,0,0,989,992,1,0,0,0,990,988,1,0,0,0,990,991, 1,0,0,0,986,987,1,0,0,0,987,989,1,0,0,0,988,990,7,0,0,0,989,988,
1,0,0,0,991,210,1,0,0,0,992,990,1,0,0,0,993,998,5,34,0,0,994,997, 1,0,0,0,990,991,1,0,0,0,991,989,1,0,0,0,991,992,1,0,0,0,992,994,
3,213,106,0,995,997,8,6,0,0,996,994,1,0,0,0,996,995,1,0,0,0,997, 1,0,0,0,993,984,1,0,0,0,993,994,1,0,0,0,994,210,1,0,0,0,995,999,
1000,1,0,0,0,998,996,1,0,0,0,998,999,1,0,0,0,999,1001,1,0,0,0,1000, 7,4,0,0,996,998,7,5,0,0,997,996,1,0,0,0,998,1001,1,0,0,0,999,997,
998,1,0,0,0,1001,1002,5,34,0,0,1002,212,1,0,0,0,1003,1011,5,92,0, 1,0,0,0,999,1000,1,0,0,0,1000,212,1,0,0,0,1001,999,1,0,0,0,1002,
0,1004,1012,7,7,0,0,1005,1006,5,117,0,0,1006,1007,3,215,107,0,1007, 1007,5,34,0,0,1003,1006,3,215,107,0,1004,1006,8,6,0,0,1005,1003,
1008,3,215,107,0,1008,1009,3,215,107,0,1009,1010,3,215,107,0,1010, 1,0,0,0,1005,1004,1,0,0,0,1006,1009,1,0,0,0,1007,1005,1,0,0,0,1007,
1012,1,0,0,0,1011,1004,1,0,0,0,1011,1005,1,0,0,0,1012,214,1,0,0, 1008,1,0,0,0,1008,1010,1,0,0,0,1009,1007,1,0,0,0,1010,1011,5,34,
0,1013,1014,7,8,0,0,1014,216,1,0,0,0,1015,1016,5,47,0,0,1016,1017, 0,0,1011,214,1,0,0,0,1012,1020,5,92,0,0,1013,1021,7,7,0,0,1014,1015,
5,47,0,0,1017,1021,1,0,0,0,1018,1020,8,9,0,0,1019,1018,1,0,0,0,1020, 5,117,0,0,1015,1016,3,217,108,0,1016,1017,3,217,108,0,1017,1018,
1023,1,0,0,0,1021,1019,1,0,0,0,1021,1022,1,0,0,0,1022,1024,1,0,0, 3,217,108,0,1018,1019,3,217,108,0,1019,1021,1,0,0,0,1020,1013,1,
0,1023,1021,1,0,0,0,1024,1025,6,108,0,0,1025,218,1,0,0,0,1026,1027, 0,0,0,1020,1014,1,0,0,0,1021,216,1,0,0,0,1022,1023,7,8,0,0,1023,
5,47,0,0,1027,1028,5,42,0,0,1028,1032,1,0,0,0,1029,1031,9,0,0,0, 218,1,0,0,0,1024,1025,5,47,0,0,1025,1026,5,47,0,0,1026,1030,1,0,
1030,1029,1,0,0,0,1031,1034,1,0,0,0,1032,1033,1,0,0,0,1032,1030, 0,0,1027,1029,8,9,0,0,1028,1027,1,0,0,0,1029,1032,1,0,0,0,1030,1028,
1,0,0,0,1033,1035,1,0,0,0,1034,1032,1,0,0,0,1035,1036,5,42,0,0,1036, 1,0,0,0,1030,1031,1,0,0,0,1031,1033,1,0,0,0,1032,1030,1,0,0,0,1033,
1037,5,47,0,0,1037,1038,1,0,0,0,1038,1039,6,109,0,0,1039,220,1,0, 1034,6,109,0,0,1034,220,1,0,0,0,1035,1036,5,47,0,0,1036,1037,5,42,
0,0,1040,1042,7,10,0,0,1041,1040,1,0,0,0,1042,1043,1,0,0,0,1043, 0,0,1037,1041,1,0,0,0,1038,1040,9,0,0,0,1039,1038,1,0,0,0,1040,1043,
1041,1,0,0,0,1043,1044,1,0,0,0,1044,1045,1,0,0,0,1045,1046,6,110, 1,0,0,0,1041,1042,1,0,0,0,1041,1039,1,0,0,0,1042,1044,1,0,0,0,1043,
0,0,1046,222,1,0,0,0,18,0,947,952,955,962,965,971,973,977,982,984, 1041,1,0,0,0,1044,1045,5,42,0,0,1045,1046,5,47,0,0,1046,1047,1,0,
990,996,998,1011,1021,1032,1043,1,0,1,0 0,0,1047,1048,6,110,0,0,1048,222,1,0,0,0,1049,1051,7,10,0,0,1050,
1049,1,0,0,0,1051,1052,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0,
0,1053,1054,1,0,0,0,1054,1055,6,111,0,0,1055,224,1,0,0,0,18,0,956,
961,964,971,974,980,982,986,991,993,999,1005,1007,1020,1030,1041,
1052,1,0,1,0
]; ];
private static __ATN: antlr.ATN; private static __ATN: antlr.ATN;
File diff suppressed because it is too large Load Diff
@@ -52,6 +52,7 @@ import { DependencyBindingBlockContext } from "./QuixosCapabilityParser.js";
import { DependencyBindingContext } from "./QuixosCapabilityParser.js"; import { DependencyBindingContext } from "./QuixosCapabilityParser.js";
import { ConstructorBindingDeclContext } from "./QuixosCapabilityParser.js"; import { ConstructorBindingDeclContext } from "./QuixosCapabilityParser.js";
import { ValueTypeContext } from "./QuixosCapabilityParser.js"; import { ValueTypeContext } from "./QuixosCapabilityParser.js";
import { RecordFieldContext } from "./QuixosCapabilityParser.js";
import { ScalarTypeContext } from "./QuixosCapabilityParser.js"; import { ScalarTypeContext } from "./QuixosCapabilityParser.js";
import { CardinalityContext } from "./QuixosCapabilityParser.js"; import { CardinalityContext } from "./QuixosCapabilityParser.js";
import { JsonLiteralContext } from "./QuixosCapabilityParser.js"; import { JsonLiteralContext } from "./QuixosCapabilityParser.js";
@@ -370,6 +371,12 @@ export class QuixosCapabilityVisitor<Result> extends AbstractParseTreeVisitor<Re
* @return the visitor result * @return the visitor result
*/ */
visitValueType?: (ctx: ValueTypeContext) => Result; visitValueType?: (ctx: ValueTypeContext) => Result;
/**
* Visit a parse tree produced by `QuixosCapabilityParser.recordField`.
* @param ctx the parse tree
* @return the visitor result
*/
visitRecordField?: (ctx: RecordFieldContext) => Result;
/** /**
* Visit a parse tree produced by `QuixosCapabilityParser.scalarType`. * Visit a parse tree produced by `QuixosCapabilityParser.scalarType`.
* @param ctx the parse tree * @param ctx the parse tree
+5
View File
@@ -319,6 +319,11 @@ const lowerValueType = (
if (context.MESSAGE()) { if (context.MESSAGE()) {
return valueType.message(stringValue(context.stringLiteral())); return valueType.message(stringValue(context.stringLiteral()));
} }
if (context.RECORD()) {
const fields = context.recordField().map((field) => [identifier(field.identifier()), lowerValueType(state, field.valueType())] as const);
if (new Set(fields.map(([name]) => name)).size !== fields.length) loweringIssue(state, context, "invalid-type", "Duplicate record field");
return {kind: "record", fields: Object.fromEntries(fields)};
}
if (context.ATOM_REF()) { if (context.ATOM_REF()) {
const name = identifier(context.identifier()); const name = identifier(context.identifier());
const atomId = requireSymbol(state, state.atoms, name, context, "atom"); const atomId = requireSymbol(state, state.atoms, name, context, "atom");
+1
View File
@@ -74,6 +74,7 @@ export type ValueType =
| { kind: "builtin"; name: "unit" | "watch-handle" } | { kind: "builtin"; name: "unit" | "watch-handle" }
| { kind: "scalar"; name: ScalarValueTypeName } | { kind: "scalar"; name: ScalarValueTypeName }
| { kind: "message"; descriptorId: string } | { kind: "message"; descriptorId: string }
| { kind: "record"; fields: Record<string, ValueType> }
| { kind: "object-ref"; expectation: ObjectExpectation } | { kind: "object-ref"; expectation: ObjectExpectation }
| { kind: "optional"; value: ValueType } | { kind: "optional"; value: ValueType }
| { kind: "list"; value: ValueType }; | { kind: "list"; value: ValueType };
+15 -3
View File
@@ -144,6 +144,8 @@ const typeLabel = (type: ValueType): string => {
return type.name; return type.name;
case "message": case "message":
return `message:${type.descriptorId}`; return `message:${type.descriptorId}`;
case "record":
return `record{${Object.keys(type.fields).sort().map((key) => `${key}:${typeLabel(type.fields[key])}`).join(";")}}`;
case "object-ref": case "object-ref":
return type.expectation.kind === "atom" return type.expectation.kind === "atom"
? `object:atom:${type.expectation.atomId}` ? `object:atom:${type.expectation.atomId}`
@@ -165,6 +167,10 @@ export const valueTypesEqual = (left: ValueType, right: ValueType): boolean => {
return left.name === (right as typeof left).name; return left.name === (right as typeof left).name;
case "message": case "message":
return left.descriptorId === (right as typeof left).descriptorId; return left.descriptorId === (right as typeof left).descriptorId;
case "record": {
const other = (right as typeof left).fields;
return Object.keys(left.fields).length === Object.keys(other).length && Object.entries(left.fields).every(([key, value]) => Object.hasOwn(other, key) && valueTypesEqual(value, other[key]));
}
case "object-ref": { case "object-ref": {
const other = (right as typeof left).expectation; const other = (right as typeof left).expectation;
if (left.expectation.kind !== other.kind) { if (left.expectation.kind !== other.kind) {
@@ -220,6 +226,12 @@ const validateValueType = (
indexes: Pick<ValidationIndexes, "atoms" | "interfaces">, indexes: Pick<ValidationIndexes, "atoms" | "interfaces">,
) => { ) => {
switch (type.kind) { switch (type.kind) {
case "record":
for (const [name, field] of Object.entries(type.fields)) {
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) issue(issues, "invalid-value-type", path, "Invalid record field name");
validateValueType(issues, field, `${path}.fields.${name}`, indexes);
}
return;
case "builtin": case "builtin":
case "scalar": case "scalar":
return; return;
@@ -777,9 +789,9 @@ const validateAttachments = (
); );
} }
validateValueType(issues, attachment.valueType, `${path}.valueType`, indexes); validateValueType(issues, attachment.valueType, `${path}.valueType`, indexes);
const containsReference = (type: ValueType): boolean => type.kind === "object-ref" || ((type.kind === "optional" || type.kind === "list") && containsReference(type.value)); const containsRpcType = (type: ValueType): boolean => type.kind === "object-ref" || type.kind === "record" || ((type.kind === "optional" || type.kind === "list") && containsRpcType(type.value));
if (containsReference(attachment.valueType) || (attachment.storagePolicy.kind === "crdt-document" && containsReference(attachment.storagePolicy.updateType))) { if (containsRpcType(attachment.valueType) || (attachment.storagePolicy.kind === "crdt-document" && containsRpcType(attachment.storagePolicy.updateType))) {
issue(issues, "invalid-attachment", `${path}.valueType`, "Managed object references belong in graph relationships, not ordinary state"); issue(issues, "invalid-attachment", `${path}.valueType`, "Managed object references belong in graph relationships, not ordinary state; record types are RPC-only");
} }
if (attachment.storagePolicy.kind === "crdt-document") { if (attachment.storagePolicy.kind === "crdt-document") {
validateValueType( validateValueType(
+11
View File
@@ -13,6 +13,17 @@ import {
fixtureId, fixtureId,
} from "./fixtures/capability-model.js"; } from "./fixtures/capability-model.js";
test("RPC record fields retain declared reference targets and reject duplicate fields", () => {
const compile = (fields: string) => compileCapabilityResourceSource(`
external atom Board id "atom:board";
package Runtime id "package:runtime" revision "package:runtime@1" {
function move id "export:move" : record { ${fields} } -> unit;
}`, {source: {repository: "https://example.test/runtime.git", commit: "a".repeat(40)}});
const result = compile("board: atom-ref<Board>; position: record { x: double; y: double; }; note: optional<string>;");
assert.equal(result.ok, true, JSON.stringify(result.diagnostics));
assert.equal(compile("board: atom-ref<Board>; board: string;").ok, false);
});
const compileWebStudioFixture = (packageTransform = (source: string) => source) => { const compileWebStudioFixture = (packageTransform = (source: string) => source) => {
const fixture = (name: string) => readFileSync( const fixture = (name: string) => readFileSync(
resolve(process.cwd(), "test/fixtures", name), resolve(process.cwd(), "test/fixtures", name),