diff --git a/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java b/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java index e88f6c2321f..eff8cae5803 100644 --- a/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/ESNextParser.java @@ -314,6 +314,7 @@ public class ESNextParser extends JSXParser { this.parseExportSpecifiersMaybe(specifiers, exports); } Literal source = (Literal) this.parseExportFrom(specifiers, null, true); + Expression assertion = this.parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST return this.finishNode(new ExportNamedDeclaration(exportStart, null, specifiers, source)); } @@ -330,6 +331,7 @@ public class ESNextParser extends JSXParser { List specifiers = CollectionUtil.makeList(nsSpec); this.parseExportSpecifiersMaybe(specifiers, exports); Literal source = (Literal) this.parseExportFrom(specifiers, null, true); + Expression assertion = this.parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST return this.finishNode(new ExportNamedDeclaration(exportStart, null, specifiers, source)); } @@ -435,6 +437,10 @@ public class ESNextParser extends JSXParser { */ private DynamicImport parseDynamicImport(Position startLoc) { Expression source = parseMaybeAssign(false, null, null); + Expression assertion = null; + if (this.eat(TokenType.comma)) { + assertion = this.parseMaybeAssign(false, null, null); // TODO: store in AST + } this.expect(TokenType.parenR); DynamicImport di = this.finishNode(new DynamicImport(new SourceLocation(startLoc), source)); return di; diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 3b9b184a988..135c5221eb5 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -2783,7 +2783,7 @@ public class Parser { boolean isBreak = keyword.equals("break"); this.next(); Identifier label = null; - if (this.eat(TokenType.semi) || this.insertSemicolon()) { + if (this.eagerlyTrySemicolon()) { label = null; } else if (this.type != TokenType.name) { this.unexpected(); @@ -2893,6 +2893,15 @@ public class Parser { new IfStatement(new SourceLocation(startLoc), test, consequent, alternate)); } + /** + * Consumes or inserts a semicolon if possible, and returns true if a semicolon was consumed or inserted. + * + * Returns false if there was no semicolon and insertion was not possible. + */ + protected boolean eagerlyTrySemicolon() { + return this.eat(TokenType.semi) || this.insertSemicolon(); + } + protected ReturnStatement parseReturnStatement(Position startLoc) { if (!this.inFunction && !this.options.allowReturnOutsideFunction()) this.raise(this.start, "'return' outside of function"); @@ -2902,7 +2911,7 @@ public class Parser { // optional arguments, we eagerly look for a semicolon or the // possibility to insert one. Expression argument; - if (this.eat(TokenType.semi) || this.insertSemicolon()) { + if (this.eagerlyTrySemicolon()) { argument = null; } else { argument = this.parseExpression(false, null); @@ -3404,6 +3413,7 @@ public class Parser { Statement declaration; List specifiers; Expression source = null; + Expression assertion = null; if (this.shouldParseExportStatement()) { declaration = this.parseStatement(true, false); if (declaration == null) return null; @@ -3419,11 +3429,13 @@ public class Parser { declaration = null; specifiers = this.parseExportSpecifiers(exports); source = parseExportFrom(specifiers, source, false); + assertion = parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST } return this.finishNode( new ExportNamedDeclaration(loc, declaration, specifiers, (Literal) source)); } + /** Parses the 'from' clause of an export, not including the assertion or semicolon. */ protected Expression parseExportFrom( List specifiers, Expression source, boolean expectFrom) { if (this.eatContextual("from")) { @@ -3442,13 +3454,13 @@ public class Parser { source = null; } - this.semicolon(); return source; } protected ExportDeclaration parseExportAll( SourceLocation loc, Position starLoc, Set exports) { Expression source = parseExportFrom(null, null, true); + Expression assertion = parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST return this.finishNode(new ExportAllDeclaration(loc, (Literal) source)); } @@ -3514,6 +3526,16 @@ public class Parser { return parseImportRest(loc); } + protected Expression parseImportOrExportAssertionAndSemicolon() { + Expression result = null; + if (!this.eagerlyTrySemicolon()) { + this.expectContextual("assert"); + result = this.parseObj(false, null); + this.semicolon(); + } + return result; + } + protected ImportDeclaration parseImportRest(SourceLocation loc) { List specifiers; Literal source; @@ -3527,7 +3549,7 @@ public class Parser { if (this.type != TokenType.string) this.unexpected(); source = (Literal) this.parseExprAtom(null); } - this.semicolon(); + Expression assertion = this.parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST if (specifiers == null) return null; return this.finishNode(new ImportDeclaration(loc, specifiers, source)); } diff --git a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java index 7b01f40bee5..8785eb111bf 100644 --- a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java @@ -943,10 +943,12 @@ public class FlowParser extends ESNextParser { // `export type { foo, bar };` List specifiers = this.parseExportSpecifiers(exports); this.parseExportFrom(specifiers, null, false); + this.parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST? return null; } else if (this.eat(TokenType.star)) { if (this.eatContextual("as")) this.parseIdent(true); this.parseExportFrom(null, null, true); + this.parseImportOrExportAssertionAndSemicolon(); // TODO: store in AST? return null; } else { // `export type Foo = Bar;` diff --git a/javascript/extractor/tests/esnext/output/trap/import-assertion.js.trap b/javascript/extractor/tests/esnext/output/trap/import-assertion.js.trap index e69de29bb2d..4ab0cc54f6d 100644 --- a/javascript/extractor/tests/esnext/output/trap/import-assertion.js.trap +++ b/javascript/extractor/tests/esnext/output/trap/import-assertion.js.trap @@ -0,0 +1,1047 @@ +#10000=@"/import-assertion.js;sourcefile" +files(#10000,"/import-assertion.js") +#10001=@"/;folder" +folders(#10001,"/") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +#20002=* +comments(#20002,0,#20001," missing semicolon","// missing semicolon") +#20003=@"loc,{#10000},12,17,12,36" +locations_default(#20003,#10000,12,17,12,36) +hasLocation(#20002,#20003) +#20004=* +comments(#20004,0,#20001," function call, not import assertion","// func ... sertion") +#20005=@"loc,{#10000},13,25,13,62" +locations_default(#20005,#10000,13,25,13,62) +hasLocation(#20004,#20005) +#20006=* +lines(#20006,#20001,"import ""module"" assert { type: ""json"" };"," +") +#20007=@"loc,{#10000},1,1,1,40" +locations_default(#20007,#10000,1,1,1,40) +hasLocation(#20006,#20007) +#20008=* +lines(#20008,#20001,"import * as v1 from ""module"" assert { type: ""json"" };"," +") +#20009=@"loc,{#10000},2,1,2,53" +locations_default(#20009,#10000,2,1,2,53) +hasLocation(#20008,#20009) +#20010=* +lines(#20010,#20001,"import { v2 } from ""module"" assert { type: ""json"" };"," +") +#20011=@"loc,{#10000},3,1,3,52" +locations_default(#20011,#10000,3,1,3,52) +hasLocation(#20010,#20011) +#20012=* +lines(#20012,#20001,"import v3 from ""module"" assert { type: ""json"" };"," +") +#20013=@"loc,{#10000},4,1,4,48" +locations_default(#20013,#10000,4,1,4,48) +hasLocation(#20012,#20013) +#20014=* +lines(#20014,#20001,""," +") +#20015=@"loc,{#10000},5,1,5,0" +locations_default(#20015,#10000,5,1,5,0) +hasLocation(#20014,#20015) +#20016=* +lines(#20016,#20001,"export { v4 } from ""module"" assert { type: ""json"" };"," +") +#20017=@"loc,{#10000},6,1,6,52" +locations_default(#20017,#10000,6,1,6,52) +hasLocation(#20016,#20017) +#20018=* +lines(#20018,#20001,"export * from ""module"" assert { type: ""json"" };"," +") +#20019=@"loc,{#10000},7,1,7,47" +locations_default(#20019,#10000,7,1,7,47) +hasLocation(#20018,#20019) +#20020=* +lines(#20020,#20001,"export * as v5 from ""module"" assert { type: ""json"" };"," +") +#20021=@"loc,{#10000},8,1,8,53" +locations_default(#20021,#10000,8,1,8,53) +hasLocation(#20020,#20021) +#20022=* +lines(#20022,#20001,""," +") +#20023=@"loc,{#10000},9,1,9,0" +locations_default(#20023,#10000,9,1,9,0) +hasLocation(#20022,#20023) +#20024=* +lines(#20024,#20001,"const v6 = import(""module"", { assert: { type: ""json"" } });"," +") +#20025=@"loc,{#10000},10,1,10,58" +locations_default(#20025,#10000,10,1,10,58) +hasLocation(#20024,#20025) +#20026=* +lines(#20026,#20001,""," +") +#20027=@"loc,{#10000},11,1,11,0" +locations_default(#20027,#10000,11,1,11,0) +hasLocation(#20026,#20027) +#20028=* +lines(#20028,#20001,"import ""module"" // missing semicolon"," +") +#20029=@"loc,{#10000},12,1,12,36" +locations_default(#20029,#10000,12,1,12,36) +hasLocation(#20028,#20029) +#20030=* +lines(#20030,#20001,"assert({type: ""json""}); // function call, not import assertion"," +") +#20031=@"loc,{#10000},13,1,13,62" +locations_default(#20031,#10000,13,1,13,62) +hasLocation(#20030,#20031) +numlines(#20001,13,10,2) +#20032=* +tokeninfo(#20032,7,#20001,0,"import") +#20033=@"loc,{#10000},1,1,1,6" +locations_default(#20033,#10000,1,1,1,6) +hasLocation(#20032,#20033) +#20034=* +tokeninfo(#20034,4,#20001,1,"""module""") +#20035=@"loc,{#10000},1,8,1,15" +locations_default(#20035,#10000,1,8,1,15) +hasLocation(#20034,#20035) +#20036=* +tokeninfo(#20036,6,#20001,2,"assert") +#20037=@"loc,{#10000},1,17,1,22" +locations_default(#20037,#10000,1,17,1,22) +hasLocation(#20036,#20037) +#20038=* +tokeninfo(#20038,8,#20001,3,"{") +#20039=@"loc,{#10000},1,24,1,24" +locations_default(#20039,#10000,1,24,1,24) +hasLocation(#20038,#20039) +#20040=* +tokeninfo(#20040,6,#20001,4,"type") +#20041=@"loc,{#10000},1,26,1,29" +locations_default(#20041,#10000,1,26,1,29) +hasLocation(#20040,#20041) +#20042=* +tokeninfo(#20042,8,#20001,5,":") +#20043=@"loc,{#10000},1,30,1,30" +locations_default(#20043,#10000,1,30,1,30) +hasLocation(#20042,#20043) +#20044=* +tokeninfo(#20044,4,#20001,6,"""json""") +#20045=@"loc,{#10000},1,32,1,37" +locations_default(#20045,#10000,1,32,1,37) +hasLocation(#20044,#20045) +#20046=* +tokeninfo(#20046,8,#20001,7,"}") +#20047=@"loc,{#10000},1,39,1,39" +locations_default(#20047,#10000,1,39,1,39) +hasLocation(#20046,#20047) +#20048=* +tokeninfo(#20048,8,#20001,8,";") +#20049=@"loc,{#10000},1,40,1,40" +locations_default(#20049,#10000,1,40,1,40) +hasLocation(#20048,#20049) +#20050=* +tokeninfo(#20050,7,#20001,9,"import") +#20051=@"loc,{#10000},2,1,2,6" +locations_default(#20051,#10000,2,1,2,6) +hasLocation(#20050,#20051) +#20052=* +tokeninfo(#20052,8,#20001,10,"*") +#20053=@"loc,{#10000},2,8,2,8" +locations_default(#20053,#10000,2,8,2,8) +hasLocation(#20052,#20053) +#20054=* +tokeninfo(#20054,6,#20001,11,"as") +#20055=@"loc,{#10000},2,10,2,11" +locations_default(#20055,#10000,2,10,2,11) +hasLocation(#20054,#20055) +#20056=* +tokeninfo(#20056,6,#20001,12,"v1") +#20057=@"loc,{#10000},2,13,2,14" +locations_default(#20057,#10000,2,13,2,14) +hasLocation(#20056,#20057) +#20058=* +tokeninfo(#20058,6,#20001,13,"from") +#20059=@"loc,{#10000},2,16,2,19" +locations_default(#20059,#10000,2,16,2,19) +hasLocation(#20058,#20059) +#20060=* +tokeninfo(#20060,4,#20001,14,"""module""") +#20061=@"loc,{#10000},2,21,2,28" +locations_default(#20061,#10000,2,21,2,28) +hasLocation(#20060,#20061) +#20062=* +tokeninfo(#20062,6,#20001,15,"assert") +#20063=@"loc,{#10000},2,30,2,35" +locations_default(#20063,#10000,2,30,2,35) +hasLocation(#20062,#20063) +#20064=* +tokeninfo(#20064,8,#20001,16,"{") +#20065=@"loc,{#10000},2,37,2,37" +locations_default(#20065,#10000,2,37,2,37) +hasLocation(#20064,#20065) +#20066=* +tokeninfo(#20066,6,#20001,17,"type") +#20067=@"loc,{#10000},2,39,2,42" +locations_default(#20067,#10000,2,39,2,42) +hasLocation(#20066,#20067) +#20068=* +tokeninfo(#20068,8,#20001,18,":") +#20069=@"loc,{#10000},2,43,2,43" +locations_default(#20069,#10000,2,43,2,43) +hasLocation(#20068,#20069) +#20070=* +tokeninfo(#20070,4,#20001,19,"""json""") +#20071=@"loc,{#10000},2,45,2,50" +locations_default(#20071,#10000,2,45,2,50) +hasLocation(#20070,#20071) +#20072=* +tokeninfo(#20072,8,#20001,20,"}") +#20073=@"loc,{#10000},2,52,2,52" +locations_default(#20073,#10000,2,52,2,52) +hasLocation(#20072,#20073) +#20074=* +tokeninfo(#20074,8,#20001,21,";") +#20075=@"loc,{#10000},2,53,2,53" +locations_default(#20075,#10000,2,53,2,53) +hasLocation(#20074,#20075) +#20076=* +tokeninfo(#20076,7,#20001,22,"import") +#20077=@"loc,{#10000},3,1,3,6" +locations_default(#20077,#10000,3,1,3,6) +hasLocation(#20076,#20077) +#20078=* +tokeninfo(#20078,8,#20001,23,"{") +#20079=@"loc,{#10000},3,8,3,8" +locations_default(#20079,#10000,3,8,3,8) +hasLocation(#20078,#20079) +#20080=* +tokeninfo(#20080,6,#20001,24,"v2") +#20081=@"loc,{#10000},3,10,3,11" +locations_default(#20081,#10000,3,10,3,11) +hasLocation(#20080,#20081) +#20082=* +tokeninfo(#20082,8,#20001,25,"}") +#20083=@"loc,{#10000},3,13,3,13" +locations_default(#20083,#10000,3,13,3,13) +hasLocation(#20082,#20083) +#20084=* +tokeninfo(#20084,6,#20001,26,"from") +#20085=@"loc,{#10000},3,15,3,18" +locations_default(#20085,#10000,3,15,3,18) +hasLocation(#20084,#20085) +#20086=* +tokeninfo(#20086,4,#20001,27,"""module""") +#20087=@"loc,{#10000},3,20,3,27" +locations_default(#20087,#10000,3,20,3,27) +hasLocation(#20086,#20087) +#20088=* +tokeninfo(#20088,6,#20001,28,"assert") +#20089=@"loc,{#10000},3,29,3,34" +locations_default(#20089,#10000,3,29,3,34) +hasLocation(#20088,#20089) +#20090=* +tokeninfo(#20090,8,#20001,29,"{") +#20091=@"loc,{#10000},3,36,3,36" +locations_default(#20091,#10000,3,36,3,36) +hasLocation(#20090,#20091) +#20092=* +tokeninfo(#20092,6,#20001,30,"type") +#20093=@"loc,{#10000},3,38,3,41" +locations_default(#20093,#10000,3,38,3,41) +hasLocation(#20092,#20093) +#20094=* +tokeninfo(#20094,8,#20001,31,":") +#20095=@"loc,{#10000},3,42,3,42" +locations_default(#20095,#10000,3,42,3,42) +hasLocation(#20094,#20095) +#20096=* +tokeninfo(#20096,4,#20001,32,"""json""") +#20097=@"loc,{#10000},3,44,3,49" +locations_default(#20097,#10000,3,44,3,49) +hasLocation(#20096,#20097) +#20098=* +tokeninfo(#20098,8,#20001,33,"}") +#20099=@"loc,{#10000},3,51,3,51" +locations_default(#20099,#10000,3,51,3,51) +hasLocation(#20098,#20099) +#20100=* +tokeninfo(#20100,8,#20001,34,";") +#20101=@"loc,{#10000},3,52,3,52" +locations_default(#20101,#10000,3,52,3,52) +hasLocation(#20100,#20101) +#20102=* +tokeninfo(#20102,7,#20001,35,"import") +#20103=@"loc,{#10000},4,1,4,6" +locations_default(#20103,#10000,4,1,4,6) +hasLocation(#20102,#20103) +#20104=* +tokeninfo(#20104,6,#20001,36,"v3") +#20105=@"loc,{#10000},4,8,4,9" +locations_default(#20105,#10000,4,8,4,9) +hasLocation(#20104,#20105) +#20106=* +tokeninfo(#20106,6,#20001,37,"from") +#20107=@"loc,{#10000},4,11,4,14" +locations_default(#20107,#10000,4,11,4,14) +hasLocation(#20106,#20107) +#20108=* +tokeninfo(#20108,4,#20001,38,"""module""") +#20109=@"loc,{#10000},4,16,4,23" +locations_default(#20109,#10000,4,16,4,23) +hasLocation(#20108,#20109) +#20110=* +tokeninfo(#20110,6,#20001,39,"assert") +#20111=@"loc,{#10000},4,25,4,30" +locations_default(#20111,#10000,4,25,4,30) +hasLocation(#20110,#20111) +#20112=* +tokeninfo(#20112,8,#20001,40,"{") +#20113=@"loc,{#10000},4,32,4,32" +locations_default(#20113,#10000,4,32,4,32) +hasLocation(#20112,#20113) +#20114=* +tokeninfo(#20114,6,#20001,41,"type") +#20115=@"loc,{#10000},4,34,4,37" +locations_default(#20115,#10000,4,34,4,37) +hasLocation(#20114,#20115) +#20116=* +tokeninfo(#20116,8,#20001,42,":") +#20117=@"loc,{#10000},4,38,4,38" +locations_default(#20117,#10000,4,38,4,38) +hasLocation(#20116,#20117) +#20118=* +tokeninfo(#20118,4,#20001,43,"""json""") +#20119=@"loc,{#10000},4,40,4,45" +locations_default(#20119,#10000,4,40,4,45) +hasLocation(#20118,#20119) +#20120=* +tokeninfo(#20120,8,#20001,44,"}") +#20121=@"loc,{#10000},4,47,4,47" +locations_default(#20121,#10000,4,47,4,47) +hasLocation(#20120,#20121) +#20122=* +tokeninfo(#20122,8,#20001,45,";") +#20123=@"loc,{#10000},4,48,4,48" +locations_default(#20123,#10000,4,48,4,48) +hasLocation(#20122,#20123) +#20124=* +tokeninfo(#20124,7,#20001,46,"export") +#20125=@"loc,{#10000},6,1,6,6" +locations_default(#20125,#10000,6,1,6,6) +hasLocation(#20124,#20125) +#20126=* +tokeninfo(#20126,8,#20001,47,"{") +#20127=@"loc,{#10000},6,8,6,8" +locations_default(#20127,#10000,6,8,6,8) +hasLocation(#20126,#20127) +#20128=* +tokeninfo(#20128,6,#20001,48,"v4") +#20129=@"loc,{#10000},6,10,6,11" +locations_default(#20129,#10000,6,10,6,11) +hasLocation(#20128,#20129) +#20130=* +tokeninfo(#20130,8,#20001,49,"}") +#20131=@"loc,{#10000},6,13,6,13" +locations_default(#20131,#10000,6,13,6,13) +hasLocation(#20130,#20131) +#20132=* +tokeninfo(#20132,6,#20001,50,"from") +#20133=@"loc,{#10000},6,15,6,18" +locations_default(#20133,#10000,6,15,6,18) +hasLocation(#20132,#20133) +#20134=* +tokeninfo(#20134,4,#20001,51,"""module""") +#20135=@"loc,{#10000},6,20,6,27" +locations_default(#20135,#10000,6,20,6,27) +hasLocation(#20134,#20135) +#20136=* +tokeninfo(#20136,6,#20001,52,"assert") +#20137=@"loc,{#10000},6,29,6,34" +locations_default(#20137,#10000,6,29,6,34) +hasLocation(#20136,#20137) +#20138=* +tokeninfo(#20138,8,#20001,53,"{") +#20139=@"loc,{#10000},6,36,6,36" +locations_default(#20139,#10000,6,36,6,36) +hasLocation(#20138,#20139) +#20140=* +tokeninfo(#20140,6,#20001,54,"type") +#20141=@"loc,{#10000},6,38,6,41" +locations_default(#20141,#10000,6,38,6,41) +hasLocation(#20140,#20141) +#20142=* +tokeninfo(#20142,8,#20001,55,":") +#20143=@"loc,{#10000},6,42,6,42" +locations_default(#20143,#10000,6,42,6,42) +hasLocation(#20142,#20143) +#20144=* +tokeninfo(#20144,4,#20001,56,"""json""") +#20145=@"loc,{#10000},6,44,6,49" +locations_default(#20145,#10000,6,44,6,49) +hasLocation(#20144,#20145) +#20146=* +tokeninfo(#20146,8,#20001,57,"}") +#20147=@"loc,{#10000},6,51,6,51" +locations_default(#20147,#10000,6,51,6,51) +hasLocation(#20146,#20147) +#20148=* +tokeninfo(#20148,8,#20001,58,";") +#20149=@"loc,{#10000},6,52,6,52" +locations_default(#20149,#10000,6,52,6,52) +hasLocation(#20148,#20149) +#20150=* +tokeninfo(#20150,7,#20001,59,"export") +#20151=@"loc,{#10000},7,1,7,6" +locations_default(#20151,#10000,7,1,7,6) +hasLocation(#20150,#20151) +#20152=* +tokeninfo(#20152,8,#20001,60,"*") +#20153=@"loc,{#10000},7,8,7,8" +locations_default(#20153,#10000,7,8,7,8) +hasLocation(#20152,#20153) +#20154=* +tokeninfo(#20154,6,#20001,61,"from") +#20155=@"loc,{#10000},7,10,7,13" +locations_default(#20155,#10000,7,10,7,13) +hasLocation(#20154,#20155) +#20156=* +tokeninfo(#20156,4,#20001,62,"""module""") +#20157=@"loc,{#10000},7,15,7,22" +locations_default(#20157,#10000,7,15,7,22) +hasLocation(#20156,#20157) +#20158=* +tokeninfo(#20158,6,#20001,63,"assert") +#20159=@"loc,{#10000},7,24,7,29" +locations_default(#20159,#10000,7,24,7,29) +hasLocation(#20158,#20159) +#20160=* +tokeninfo(#20160,8,#20001,64,"{") +#20161=@"loc,{#10000},7,31,7,31" +locations_default(#20161,#10000,7,31,7,31) +hasLocation(#20160,#20161) +#20162=* +tokeninfo(#20162,6,#20001,65,"type") +#20163=@"loc,{#10000},7,33,7,36" +locations_default(#20163,#10000,7,33,7,36) +hasLocation(#20162,#20163) +#20164=* +tokeninfo(#20164,8,#20001,66,":") +#20165=@"loc,{#10000},7,37,7,37" +locations_default(#20165,#10000,7,37,7,37) +hasLocation(#20164,#20165) +#20166=* +tokeninfo(#20166,4,#20001,67,"""json""") +#20167=@"loc,{#10000},7,39,7,44" +locations_default(#20167,#10000,7,39,7,44) +hasLocation(#20166,#20167) +#20168=* +tokeninfo(#20168,8,#20001,68,"}") +#20169=@"loc,{#10000},7,46,7,46" +locations_default(#20169,#10000,7,46,7,46) +hasLocation(#20168,#20169) +#20170=* +tokeninfo(#20170,8,#20001,69,";") +#20171=@"loc,{#10000},7,47,7,47" +locations_default(#20171,#10000,7,47,7,47) +hasLocation(#20170,#20171) +#20172=* +tokeninfo(#20172,7,#20001,70,"export") +#20173=@"loc,{#10000},8,1,8,6" +locations_default(#20173,#10000,8,1,8,6) +hasLocation(#20172,#20173) +#20174=* +tokeninfo(#20174,8,#20001,71,"*") +#20175=@"loc,{#10000},8,8,8,8" +locations_default(#20175,#10000,8,8,8,8) +hasLocation(#20174,#20175) +#20176=* +tokeninfo(#20176,6,#20001,72,"as") +#20177=@"loc,{#10000},8,10,8,11" +locations_default(#20177,#10000,8,10,8,11) +hasLocation(#20176,#20177) +#20178=* +tokeninfo(#20178,6,#20001,73,"v5") +#20179=@"loc,{#10000},8,13,8,14" +locations_default(#20179,#10000,8,13,8,14) +hasLocation(#20178,#20179) +#20180=* +tokeninfo(#20180,6,#20001,74,"from") +#20181=@"loc,{#10000},8,16,8,19" +locations_default(#20181,#10000,8,16,8,19) +hasLocation(#20180,#20181) +#20182=* +tokeninfo(#20182,4,#20001,75,"""module""") +#20183=@"loc,{#10000},8,21,8,28" +locations_default(#20183,#10000,8,21,8,28) +hasLocation(#20182,#20183) +#20184=* +tokeninfo(#20184,6,#20001,76,"assert") +#20185=@"loc,{#10000},8,30,8,35" +locations_default(#20185,#10000,8,30,8,35) +hasLocation(#20184,#20185) +#20186=* +tokeninfo(#20186,8,#20001,77,"{") +#20187=@"loc,{#10000},8,37,8,37" +locations_default(#20187,#10000,8,37,8,37) +hasLocation(#20186,#20187) +#20188=* +tokeninfo(#20188,6,#20001,78,"type") +#20189=@"loc,{#10000},8,39,8,42" +locations_default(#20189,#10000,8,39,8,42) +hasLocation(#20188,#20189) +#20190=* +tokeninfo(#20190,8,#20001,79,":") +#20191=@"loc,{#10000},8,43,8,43" +locations_default(#20191,#10000,8,43,8,43) +hasLocation(#20190,#20191) +#20192=* +tokeninfo(#20192,4,#20001,80,"""json""") +#20193=@"loc,{#10000},8,45,8,50" +locations_default(#20193,#10000,8,45,8,50) +hasLocation(#20192,#20193) +#20194=* +tokeninfo(#20194,8,#20001,81,"}") +#20195=@"loc,{#10000},8,52,8,52" +locations_default(#20195,#10000,8,52,8,52) +hasLocation(#20194,#20195) +#20196=* +tokeninfo(#20196,8,#20001,82,";") +#20197=@"loc,{#10000},8,53,8,53" +locations_default(#20197,#10000,8,53,8,53) +hasLocation(#20196,#20197) +#20198=* +tokeninfo(#20198,7,#20001,83,"const") +#20199=@"loc,{#10000},10,1,10,5" +locations_default(#20199,#10000,10,1,10,5) +hasLocation(#20198,#20199) +#20200=* +tokeninfo(#20200,6,#20001,84,"v6") +#20201=@"loc,{#10000},10,7,10,8" +locations_default(#20201,#10000,10,7,10,8) +hasLocation(#20200,#20201) +#20202=* +tokeninfo(#20202,8,#20001,85,"=") +#20203=@"loc,{#10000},10,10,10,10" +locations_default(#20203,#10000,10,10,10,10) +hasLocation(#20202,#20203) +#20204=* +tokeninfo(#20204,7,#20001,86,"import") +#20205=@"loc,{#10000},10,12,10,17" +locations_default(#20205,#10000,10,12,10,17) +hasLocation(#20204,#20205) +#20206=* +tokeninfo(#20206,8,#20001,87,"(") +#20207=@"loc,{#10000},10,18,10,18" +locations_default(#20207,#10000,10,18,10,18) +hasLocation(#20206,#20207) +#20208=* +tokeninfo(#20208,4,#20001,88,"""module""") +#20209=@"loc,{#10000},10,19,10,26" +locations_default(#20209,#10000,10,19,10,26) +hasLocation(#20208,#20209) +#20210=* +tokeninfo(#20210,8,#20001,89,",") +#20211=@"loc,{#10000},10,27,10,27" +locations_default(#20211,#10000,10,27,10,27) +hasLocation(#20210,#20211) +#20212=* +tokeninfo(#20212,8,#20001,90,"{") +#20213=@"loc,{#10000},10,29,10,29" +locations_default(#20213,#10000,10,29,10,29) +hasLocation(#20212,#20213) +#20214=* +tokeninfo(#20214,6,#20001,91,"assert") +#20215=@"loc,{#10000},10,31,10,36" +locations_default(#20215,#10000,10,31,10,36) +hasLocation(#20214,#20215) +#20216=* +tokeninfo(#20216,8,#20001,92,":") +#20217=@"loc,{#10000},10,37,10,37" +locations_default(#20217,#10000,10,37,10,37) +hasLocation(#20216,#20217) +#20218=* +tokeninfo(#20218,8,#20001,93,"{") +#20219=@"loc,{#10000},10,39,10,39" +locations_default(#20219,#10000,10,39,10,39) +hasLocation(#20218,#20219) +#20220=* +tokeninfo(#20220,6,#20001,94,"type") +#20221=@"loc,{#10000},10,41,10,44" +locations_default(#20221,#10000,10,41,10,44) +hasLocation(#20220,#20221) +#20222=* +tokeninfo(#20222,8,#20001,95,":") +#20223=@"loc,{#10000},10,45,10,45" +locations_default(#20223,#10000,10,45,10,45) +hasLocation(#20222,#20223) +#20224=* +tokeninfo(#20224,4,#20001,96,"""json""") +#20225=@"loc,{#10000},10,47,10,52" +locations_default(#20225,#10000,10,47,10,52) +hasLocation(#20224,#20225) +#20226=* +tokeninfo(#20226,8,#20001,97,"}") +#20227=@"loc,{#10000},10,54,10,54" +locations_default(#20227,#10000,10,54,10,54) +hasLocation(#20226,#20227) +#20228=* +tokeninfo(#20228,8,#20001,98,"}") +#20229=@"loc,{#10000},10,56,10,56" +locations_default(#20229,#10000,10,56,10,56) +hasLocation(#20228,#20229) +#20230=* +tokeninfo(#20230,8,#20001,99,")") +#20231=@"loc,{#10000},10,57,10,57" +locations_default(#20231,#10000,10,57,10,57) +hasLocation(#20230,#20231) +#20232=* +tokeninfo(#20232,8,#20001,100,";") +#20233=@"loc,{#10000},10,58,10,58" +locations_default(#20233,#10000,10,58,10,58) +hasLocation(#20232,#20233) +#20234=* +tokeninfo(#20234,7,#20001,101,"import") +#20235=@"loc,{#10000},12,1,12,6" +locations_default(#20235,#10000,12,1,12,6) +hasLocation(#20234,#20235) +#20236=* +tokeninfo(#20236,4,#20001,102,"""module""") +#20237=@"loc,{#10000},12,8,12,15" +locations_default(#20237,#10000,12,8,12,15) +hasLocation(#20236,#20237) +#20238=* +tokeninfo(#20238,6,#20001,103,"assert") +#20239=@"loc,{#10000},13,1,13,6" +locations_default(#20239,#10000,13,1,13,6) +hasLocation(#20238,#20239) +next_token(#20002,#20238) +#20240=* +tokeninfo(#20240,8,#20001,104,"(") +#20241=@"loc,{#10000},13,7,13,7" +locations_default(#20241,#10000,13,7,13,7) +hasLocation(#20240,#20241) +#20242=* +tokeninfo(#20242,8,#20001,105,"{") +#20243=@"loc,{#10000},13,8,13,8" +locations_default(#20243,#10000,13,8,13,8) +hasLocation(#20242,#20243) +#20244=* +tokeninfo(#20244,6,#20001,106,"type") +#20245=@"loc,{#10000},13,9,13,12" +locations_default(#20245,#10000,13,9,13,12) +hasLocation(#20244,#20245) +#20246=* +tokeninfo(#20246,8,#20001,107,":") +#20247=@"loc,{#10000},13,13,13,13" +locations_default(#20247,#10000,13,13,13,13) +hasLocation(#20246,#20247) +#20248=* +tokeninfo(#20248,4,#20001,108,"""json""") +#20249=@"loc,{#10000},13,15,13,20" +locations_default(#20249,#10000,13,15,13,20) +hasLocation(#20248,#20249) +#20250=* +tokeninfo(#20250,8,#20001,109,"}") +#20251=@"loc,{#10000},13,21,13,21" +locations_default(#20251,#10000,13,21,13,21) +hasLocation(#20250,#20251) +#20252=* +tokeninfo(#20252,8,#20001,110,")") +#20253=@"loc,{#10000},13,22,13,22" +locations_default(#20253,#10000,13,22,13,22) +hasLocation(#20252,#20253) +#20254=* +tokeninfo(#20254,8,#20001,111,";") +#20255=@"loc,{#10000},13,23,13,23" +locations_default(#20255,#10000,13,23,13,23) +hasLocation(#20254,#20255) +#20256=* +tokeninfo(#20256,0,#20001,112,"") +#20257=@"loc,{#10000},14,1,14,0" +locations_default(#20257,#10000,14,1,14,0) +hasLocation(#20256,#20257) +next_token(#20004,#20256) +toplevels(#20001,0) +#20258=@"loc,{#10000},1,1,14,0" +locations_default(#20258,#10000,1,1,14,0) +hasLocation(#20001,#20258) +#20259=@"module;{#10000},1,1" +scopes(#20259,3) +scopenodes(#20001,#20259) +scopenesting(#20259,#20000) +is_module(#20001) +is_es2015_module(#20001) +#20260=@"var;{v1};{#20259}" +variables(#20260,"v1",#20259) +#20261=@"var;{v2};{#20259}" +variables(#20261,"v2",#20259) +#20262=@"var;{v3};{#20259}" +variables(#20262,"v3",#20259) +#20263=@"local_type_name;{v1};{#20259}" +local_type_names(#20263,"v1",#20259) +#20264=@"local_type_name;{v2};{#20259}" +local_type_names(#20264,"v2",#20259) +#20265=@"local_type_name;{v3};{#20259}" +local_type_names(#20265,"v3",#20259) +#20266=@"local_namespace_name;{v1};{#20259}" +local_namespace_names(#20266,"v1",#20259) +#20267=@"local_namespace_name;{v2};{#20259}" +local_namespace_names(#20267,"v2",#20259) +#20268=@"local_namespace_name;{v3};{#20259}" +local_namespace_names(#20268,"v3",#20259) +variables(#20260,"v1",#20259) +variables(#20261,"v2",#20259) +variables(#20262,"v3",#20259) +#20269=@"var;{v6};{#20259}" +variables(#20269,"v6",#20259) +local_type_names(#20263,"v1",#20259) +local_type_names(#20264,"v2",#20259) +local_type_names(#20265,"v3",#20259) +local_namespace_names(#20266,"v1",#20259) +local_namespace_names(#20267,"v2",#20259) +local_namespace_names(#20268,"v3",#20259) +#20270=* +stmts(#20270,27,#20001,0,"import ... son"" };") +hasLocation(#20270,#20007) +stmt_containers(#20270,#20001) +#20271=* +exprs(#20271,4,#20270,-1,"""module""") +hasLocation(#20271,#20035) +enclosing_stmt(#20271,#20270) +expr_containers(#20271,#20001) +literals("module","""module""",#20271) +#20272=* +regexpterm(#20272,14,#20271,0,"module") +#20273=@"loc,{#10000},1,9,1,14" +locations_default(#20273,#10000,1,9,1,14) +hasLocation(#20272,#20273) +regexp_const_value(#20272,"module") +#20274=* +stmts(#20274,27,#20001,1,"import ... son"" };") +hasLocation(#20274,#20009) +stmt_containers(#20274,#20001) +#20275=* +exprs(#20275,4,#20274,-1,"""module""") +hasLocation(#20275,#20061) +enclosing_stmt(#20275,#20274) +expr_containers(#20275,#20001) +literals("module","""module""",#20275) +#20276=* +regexpterm(#20276,14,#20275,0,"module") +#20277=@"loc,{#10000},2,22,2,27" +locations_default(#20277,#10000,2,22,2,27) +hasLocation(#20276,#20277) +regexp_const_value(#20276,"module") +#20278=* +exprs(#20278,85,#20274,0,"* as v1") +#20279=@"loc,{#10000},2,8,2,14" +locations_default(#20279,#10000,2,8,2,14) +hasLocation(#20278,#20279) +enclosing_stmt(#20278,#20274) +expr_containers(#20278,#20001) +#20280=* +exprs(#20280,78,#20278,1,"v1") +hasLocation(#20280,#20057) +enclosing_stmt(#20280,#20274) +expr_containers(#20280,#20001) +literals("v1","v1",#20280) +decl(#20280,#20260) +typedecl(#20280,#20263) +namespacedecl(#20280,#20266) +#20281=* +stmts(#20281,27,#20001,2,"import ... son"" };") +hasLocation(#20281,#20011) +stmt_containers(#20281,#20001) +#20282=* +exprs(#20282,4,#20281,-1,"""module""") +hasLocation(#20282,#20087) +enclosing_stmt(#20282,#20281) +expr_containers(#20282,#20001) +literals("module","""module""",#20282) +#20283=* +regexpterm(#20283,14,#20282,0,"module") +#20284=@"loc,{#10000},3,21,3,26" +locations_default(#20284,#10000,3,21,3,26) +hasLocation(#20283,#20284) +regexp_const_value(#20283,"module") +#20285=* +exprs(#20285,83,#20281,0,"v2") +hasLocation(#20285,#20081) +enclosing_stmt(#20285,#20281) +expr_containers(#20285,#20001) +#20286=* +exprs(#20286,0,#20285,0,"v2") +hasLocation(#20286,#20081) +enclosing_stmt(#20286,#20281) +expr_containers(#20286,#20001) +literals("v2","v2",#20286) +#20287=* +exprs(#20287,78,#20285,1,"v2") +hasLocation(#20287,#20081) +enclosing_stmt(#20287,#20281) +expr_containers(#20287,#20001) +literals("v2","v2",#20287) +decl(#20287,#20261) +typedecl(#20287,#20264) +namespacedecl(#20287,#20267) +#20288=* +stmts(#20288,27,#20001,3,"import ... son"" };") +hasLocation(#20288,#20013) +stmt_containers(#20288,#20001) +#20289=* +exprs(#20289,4,#20288,-1,"""module""") +hasLocation(#20289,#20109) +enclosing_stmt(#20289,#20288) +expr_containers(#20289,#20001) +literals("module","""module""",#20289) +#20290=* +regexpterm(#20290,14,#20289,0,"module") +#20291=@"loc,{#10000},4,17,4,22" +locations_default(#20291,#10000,4,17,4,22) +hasLocation(#20290,#20291) +regexp_const_value(#20290,"module") +#20292=* +exprs(#20292,84,#20288,0,"v3") +hasLocation(#20292,#20105) +enclosing_stmt(#20292,#20288) +expr_containers(#20292,#20001) +#20293=* +exprs(#20293,78,#20292,1,"v3") +hasLocation(#20293,#20105) +enclosing_stmt(#20293,#20288) +expr_containers(#20293,#20001) +literals("v3","v3",#20293) +decl(#20293,#20262) +typedecl(#20293,#20265) +namespacedecl(#20293,#20268) +#20294=* +stmts(#20294,30,#20001,4,"export ... son"" };") +hasLocation(#20294,#20017) +stmt_containers(#20294,#20001) +#20295=* +exprs(#20295,4,#20294,-2,"""module""") +hasLocation(#20295,#20135) +enclosing_stmt(#20295,#20294) +expr_containers(#20295,#20001) +literals("module","""module""",#20295) +#20296=* +regexpterm(#20296,14,#20295,0,"module") +#20297=@"loc,{#10000},6,21,6,26" +locations_default(#20297,#10000,6,21,6,26) +hasLocation(#20296,#20297) +regexp_const_value(#20296,"module") +#20298=* +exprs(#20298,86,#20294,0,"v4") +hasLocation(#20298,#20129) +enclosing_stmt(#20298,#20294) +expr_containers(#20298,#20001) +#20299=* +exprs(#20299,0,#20298,0,"v4") +hasLocation(#20299,#20129) +enclosing_stmt(#20299,#20294) +expr_containers(#20299,#20001) +literals("v4","v4",#20299) +#20300=* +exprs(#20300,0,#20298,1,"v4") +hasLocation(#20300,#20129) +enclosing_stmt(#20300,#20294) +expr_containers(#20300,#20001) +literals("v4","v4",#20300) +#20301=* +stmts(#20301,28,#20001,5,"export ... son"" };") +hasLocation(#20301,#20019) +stmt_containers(#20301,#20001) +#20302=* +exprs(#20302,4,#20301,0,"""module""") +hasLocation(#20302,#20157) +enclosing_stmt(#20302,#20301) +expr_containers(#20302,#20001) +literals("module","""module""",#20302) +#20303=* +regexpterm(#20303,14,#20302,0,"module") +#20304=@"loc,{#10000},7,16,7,21" +locations_default(#20304,#10000,7,16,7,21) +hasLocation(#20303,#20304) +regexp_const_value(#20303,"module") +#20305=* +stmts(#20305,30,#20001,6,"export ... son"" };") +hasLocation(#20305,#20021) +stmt_containers(#20305,#20001) +#20306=* +exprs(#20306,4,#20305,-2,"""module""") +hasLocation(#20306,#20183) +enclosing_stmt(#20306,#20305) +expr_containers(#20306,#20001) +literals("module","""module""",#20306) +#20307=* +regexpterm(#20307,14,#20306,0,"module") +#20308=@"loc,{#10000},8,22,8,27" +locations_default(#20308,#10000,8,22,8,27) +hasLocation(#20307,#20308) +regexp_const_value(#20307,"module") +#20309=* +exprs(#20309,96,#20305,0,"* as v5") +#20310=@"loc,{#10000},8,8,8,14" +locations_default(#20310,#10000,8,8,8,14) +hasLocation(#20309,#20310) +enclosing_stmt(#20309,#20305) +expr_containers(#20309,#20001) +#20311=* +exprs(#20311,0,#20309,1,"v5") +hasLocation(#20311,#20179) +enclosing_stmt(#20311,#20305) +expr_containers(#20311,#20001) +literals("v5","v5",#20311) +#20312=* +stmts(#20312,22,#20001,7,"const v ... "" } });") +hasLocation(#20312,#20025) +stmt_containers(#20312,#20001) +#20313=* +exprs(#20313,64,#20312,0,"v6 = im ... n"" } })") +#20314=@"loc,{#10000},10,7,10,57" +locations_default(#20314,#10000,10,7,10,57) +hasLocation(#20313,#20314) +enclosing_stmt(#20313,#20312) +expr_containers(#20313,#20001) +#20315=* +exprs(#20315,78,#20313,0,"v6") +hasLocation(#20315,#20201) +enclosing_stmt(#20315,#20312) +expr_containers(#20315,#20001) +literals("v6","v6",#20315) +decl(#20315,#20269) +#20316=* +exprs(#20316,99,#20313,1,"import( ... n"" } })") +#20317=@"loc,{#10000},10,12,10,57" +locations_default(#20317,#10000,10,12,10,57) +hasLocation(#20316,#20317) +enclosing_stmt(#20316,#20312) +expr_containers(#20316,#20001) +#20318=* +exprs(#20318,4,#20316,0,"""module""") +hasLocation(#20318,#20209) +enclosing_stmt(#20318,#20312) +expr_containers(#20318,#20001) +literals("module","""module""",#20318) +#20319=* +regexpterm(#20319,14,#20318,0,"module") +#20320=@"loc,{#10000},10,20,10,25" +locations_default(#20320,#10000,10,20,10,25) +hasLocation(#20319,#20320) +regexp_const_value(#20319,"module") +#20321=* +stmts(#20321,27,#20001,8,"import ""module""") +#20322=@"loc,{#10000},12,1,12,15" +locations_default(#20322,#10000,12,1,12,15) +hasLocation(#20321,#20322) +stmt_containers(#20321,#20001) +#20323=* +exprs(#20323,4,#20321,-1,"""module""") +hasLocation(#20323,#20237) +enclosing_stmt(#20323,#20321) +expr_containers(#20323,#20001) +literals("module","""module""",#20323) +#20324=* +regexpterm(#20324,14,#20323,0,"module") +#20325=@"loc,{#10000},12,9,12,14" +locations_default(#20325,#10000,12,9,12,14) +hasLocation(#20324,#20325) +regexp_const_value(#20324,"module") +#20326=* +stmts(#20326,2,#20001,9,"assert( ... son""});") +#20327=@"loc,{#10000},13,1,13,23" +locations_default(#20327,#10000,13,1,13,23) +hasLocation(#20326,#20327) +stmt_containers(#20326,#20001) +#20328=* +exprs(#20328,13,#20326,0,"assert( ... json""})") +#20329=@"loc,{#10000},13,1,13,22" +locations_default(#20329,#10000,13,1,13,22) +hasLocation(#20328,#20329) +enclosing_stmt(#20328,#20326) +expr_containers(#20328,#20001) +#20330=* +exprs(#20330,79,#20328,-1,"assert") +hasLocation(#20330,#20239) +enclosing_stmt(#20330,#20326) +expr_containers(#20330,#20001) +literals("assert","assert",#20330) +#20331=@"var;{assert};{#20000}" +variables(#20331,"assert",#20000) +bind(#20330,#20331) +#20332=* +exprs(#20332,8,#20328,0,"{type: ""json""}") +#20333=@"loc,{#10000},13,8,13,21" +locations_default(#20333,#10000,13,8,13,21) +hasLocation(#20332,#20333) +enclosing_stmt(#20332,#20326) +expr_containers(#20332,#20001) +#20334=* +properties(#20334,#20332,0,0,"type: ""json""") +#20335=@"loc,{#10000},13,9,13,20" +locations_default(#20335,#10000,13,9,13,20) +hasLocation(#20334,#20335) +#20336=* +exprs(#20336,0,#20334,0,"type") +hasLocation(#20336,#20245) +enclosing_stmt(#20336,#20326) +expr_containers(#20336,#20001) +literals("type","type",#20336) +#20337=* +exprs(#20337,4,#20334,1,"""json""") +hasLocation(#20337,#20249) +enclosing_stmt(#20337,#20326) +expr_containers(#20337,#20001) +literals("json","""json""",#20337) +#20338=* +regexpterm(#20338,14,#20337,0,"json") +#20339=@"loc,{#10000},13,16,13,19" +locations_default(#20339,#10000,13,16,13,19) +hasLocation(#20338,#20339) +regexp_const_value(#20338,"json") +#20340=* +entry_cfg_node(#20340,#20001) +#20341=@"loc,{#10000},1,1,1,0" +locations_default(#20341,#10000,1,1,1,0) +hasLocation(#20340,#20341) +#20342=* +exit_cfg_node(#20342,#20001) +hasLocation(#20342,#20257) +successor(#20326,#20330) +successor(#20332,#20336) +successor(#20337,#20334) +successor(#20336,#20337) +successor(#20334,#20328) +successor(#20330,#20332) +successor(#20328,#20342) +successor(#20321,#20326) +successor(#20312,#20315) +successor(#20318,#20316) +successor(#20316,#20313) +successor(#20315,#20318) +successor(#20313,#20321) +successor(#20305,#20306) +successor(#20309,#20311) +successor(#20311,#20312) +successor(#20306,#20309) +successor(#20301,#20302) +successor(#20302,#20305) +successor(#20294,#20295) +successor(#20298,#20299) +successor(#20300,#20301) +successor(#20299,#20300) +successor(#20295,#20298) +successor(#20288,#20294) +successor(#20281,#20288) +successor(#20274,#20281) +successor(#20270,#20274) +successor(#20292,#20270) +successor(#20285,#20292) +successor(#20278,#20285) +successor(#20340,#20278) +numlines(#10000,13,10,2) +filetype(#10000,"javascript")