CARVIEW |
Navigation Menu
-
Notifications
You must be signed in to change notification settings - Fork 7
Interface
This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-07-21, 11:40:32 UTC presenting an overview of flowR's interfaces (v2.2.16, using R v4.5.0). Please do not edit this file/wiki page directly.
Although far from being as detailed as the in-depth explanation of flowR, this wiki page explains how to interface with flowR in more detail. In general, command line arguments and other options provide short descriptions on hover over.
As explained in the Overview, you can simply run the TCP server by adding the --server
flag (and, due to the interactive mode, exit with the conventional CTRL+C).
Currently, every connection is handled by the same underlying RShell
- so the server is not designed to handle many clients at a time.
Additionally, the server is not well guarded against attacks (e.g., you can theoretically spawn an arbitrary number of RShell sessions on the target machine).
Every message has to be given in a single line (i.e., without a newline in-between) and end with a newline character. Nevertheless, we will pretty-print example given in the following segments for the ease of reading.
Note
The default --server
uses a simple TCP
connection. If you want flowR to expose a WebSocket server instead, add the --ws
flag (i.e., --server
--ws
) when starting flowR from the command line.
-
Hello Message (
hello
)View Details. The server informs the client about the successful connection and provides Meta-Information.
sequenceDiagram autonumber participant Client participant Server Client-->Server: connects Server->>Client: hello
After launching flowR, for example, with
docker run -it --rm eagleoutice/flowr --server
(🐳️), simply connecting should present you with ahello
message, that amongst others should reveal the versions of flowR and R, using the semver 2.0 versioning scheme. The message looks like this:{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
There are currently a few messages that you can send after the hello message. If you want to slice a piece of R code you first have to send an analysis request, so that you can send one or multiple slice requests afterward. Requests for the REPL are independent of that.
Message schema (
hello
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-hello.ts
.-
. object [required]
- type string [required] The type of the hello message. Allows only the values: 'hello'
- id any [forbidden] The id of the message is always undefined (as it is the initial message and not requested).
- clientName string [required] A unique name that is assigned to each client. It has no semantic meaning and is only used/useful for debugging.
-
versions object [required]
- flowr string [required] The version of the flowr server running in semver format.
- r string [required] The version of the underlying R shell running in semver format.
- engine string [required] The parser backend that is used to parse the R code.
-
. object [required]
-
Analysis Message (
request-file-analysis
)View Details. The server builds the dataflow graph for a given input file (or a set of files).
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-file-analysis alt Server-->>Client: response-file-analysis else Server-->>Client: error end deactivate Server
The request allows the server to analyze a file and prepare it for slicing. The message can contain a
filetoken
, which is used to identify the file in later slice or lineage requests (if you do not add one, the request will not be stored and therefore, it is not available for subsequent requests).Please note!
If you want to send and process a lot of analysis requests, but do not want to slice them, please do not pass thefiletoken
field. This will save the server a lot of memory allocation.Furthermore, the request must contain either a
content
field to directly pass the file's content or afilepath
field which contains the path to the file (this path must be accessible for the server to be useful). If you add theid
field, the answer will use the sameid
so you can match requests and the corresponding answers. See the implementation of the request-file-analysis message for more information.Example of the
request-file-analysis
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let' suppose you simply want to analyze the following script:
x <- 1 x + 1
For this, you can send the following request:
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
The
results
field of the response effectively contains three keys of importance:-
parse
: which contains 1:1 the parse result in CSV format that we received from theRShell
(i.e., the AST produced by the parser of the R interpreter). -
normalize
: which contains the normalized AST, including ids (see theinfo
field and the Normalized AST wiki page). -
dataflow
: especially important is thegraph
field which contains the dataflow graph as a set of root vertices (see the Dataflow Graph wiki page).
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11382-kggRYsN5yByf-.R","role":"root","index":0}},".meta":{"timing":3}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":12,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11382-kggRYsN5yByf-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":4}}}}
-
The complete round-trip took 18.2 ms (including time required to validate the messages, start, and stop the internal mock server).
You receive an error if, for whatever reason, the analysis fails (e.g., the message or code you sent contained syntax errors). It contains a human-readable description why the analysis failed (see the error message implementation for more details).
Example Error Message
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filename": "sample.R", "content": "x <-" }
-
error
(response)Show Details
{ "id": "1", "type": "error", "fatal": false, "reason": "Error while analyzing file sample.R: GuardError: unable to parse R code (see the log for more information) for request {\"request\":\"file\",\"content\":\"/tmp/tmp-11382-WEBtVjviDZph-.R\"}}\n Report a Bug: https://github.com/flowr-analysis/flowr/issues/new?body=%3C!%2D%2D%20Please%20describe%20your%20issue%20in%20more%20detail%20below!%20%2D%2D%3E%0A%0A%0A%3C!%2D%2D%20Automatically%20generated%20issue%20metadata%2C%20please%20do%20not%20edit%20or%20delete%20content%20below%20this%20line%20%2D%2D%3E%0A%2D%2D%2D%0A%0AflowR%20version%3A%202.2.16%0Anode%20version%3A%20v22.14.0%0Anode%20arch%3A%20x64%0Anode%20platform%3A%20linux%0Amessage%3A%20%60unable%20to%20parse%20R%20code%20%28see%20the%20log%20for%20more%20information%29%20for%20request%20%7B%22request%22%3A%22file%22%2C%22content%22%3A%22%2Ftmp%2Ftmp%2D11382%2DWEBtVjviDZph%2D.R%22%7D%7D%60%0Astack%20trace%3A%0A%60%60%60%0A%20%20%20%20at%20guard%20%28%3C%3E%2Fsrc%2Futil%2Fassert.ts%3A75%3A9%29%0A%20%20%20%20at%20guardRetrievedOutput%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A184%3A7%29%0A%20%20%20%20at%20%2Fhome%2Frunner%2Fwork%2Fflowr%2Fflowr%2Fsrc%2Fr%2Dbridge%2Fretriever.ts%3A148%3A4%0A%20%20%20%20at%20processTicksAndRejections%20%28node%3Ainternal%2Fprocess%2Ftask_queues%3A105%3A5%29%0A%20%20%20%20at%20async%20Object.parseRequests%20%5Bas%20processor%5D%20%28%3C%3E%2Fsrc%2Fr%2Dbridge%2Fparser.ts%3A58%3A18%29%0A%20%20%20%20at%20async%20PipelineExecutor.nextStep%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A207%3A25%29%0A%20%20%20%20at%20async%20PipelineExecutor.allRemainingSteps%20%28%3C%3E%2Fsrc%2Fcore%2Fpipeline%2Dexecutor.ts%3A266%3A4%29%0A%20%20%20%20at%20async%20FlowRServerConnection.handleFileAnalysisRequest%20%28%3C%3E%2Fsrc%2Fcli%2Frepl%2Fserver%2Fconnection.ts%3A152%3A3%29%0A%60%60%60%0A%0A%2D%2D%2D%0A%09" }
The complete round-trip took 8.5 ms (including time required to validate the messages, start, and stop the internal mock server).
Including the Control Flow Graph
While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add
cfg: true
to its list of options.Requesting a Control Flow Graph
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "if(unknown > 0) { x <- 2 } else { x <- 5 }\nfor(i in 1:x) { print(x); print(i) }", "cfg": true }
-
response-file-analysis
(response)Show Details
The response looks basically the same as a response sent without the
cfg
flag. However, additionally it contains acfg
field. If you are interested in a visual representation of the control flow graph, see the visualization with mermaid.As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","cfg":{"returns":[],"entryPoints":[32],"exitPoints":["32-exit"],"breaks":[],"nexts":[],"graph":{"rootVertices":[32,15,"15-condition","15-exit",0,1,2,"2-exit",8,5,6,7,"7-exit","8-exit",14,11,12,13,"13-exit","14-exit",16,31,17,18,19,"19-exit",30,22,25,"25-name","25-exit",24,"24-before-value",23,"24-exit",26,29,"29-name","29-exit",28,"28-before-value",27,"28-exit","30-exit","31-head","31-exit","32-exit"],"vertexInformation":[[32,{"id":32,"type":"expr","end":["32-exit"]}],[15,{"id":15,"type":"stm","mid":["15-condition"],"end":["15-exit"]}],["15-condition",{"id":"15-condition","kind":"condition","type":"mid","root":15}],["15-exit",{"id":"15-exit","type":"end","root":15}],[0,{"id":0,"type":"expr"}],[1,{"id":1,"type":"expr"}],[2,{"id":2,"type":"expr","end":["2-exit"]}],["2-exit",{"id":"2-exit","type":"end","root":2}],[8,{"id":8,"type":"expr","end":["8-exit"]}],[5,{"id":5,"type":"expr"}],[6,{"id":6,"type":"expr"}],[7,{"id":7,"type":"expr","end":["7-exit"]}],["7-exit",{"id":"7-exit","type":"end","root":7}],["8-exit",{"id":"8-exit","type":"end","root":8}],[14,{"id":14,"type":"expr","end":["14-exit"]}],[11,{"id":11,"type":"expr"}],[12,{"id":12,"type":"expr"}],[13,{"id":13,"type":"expr","end":["13-exit"]}],["13-exit",{"id":"13-exit","type":"end","root":13}],["14-exit",{"id":"14-exit","type":"end","root":14}],[16,{"id":16,"type":"expr"}],[31,{"id":31,"type":"stm","end":["31-exit"],"mid":["31-head"]}],[17,{"id":17,"type":"expr"}],[18,{"id":18,"type":"expr"}],[19,{"id":19,"type":"expr","end":["19-exit"]}],["19-exit",{"id":"19-exit","type":"end","root":19}],[30,{"id":30,"type":"expr","end":["30-exit"]}],[22,{"id":22,"type":"expr"}],[25,{"id":25,"type":"stm","mid":["25-name"],"end":["25-exit"]}],["25-name",{"id":"25-name","kind":"name","type":"mid","root":25}],["25-exit",{"id":"25-exit","type":"end","root":25}],[24,{"id":24,"type":"expr","mid":["24-before-value"],"end":["24-exit"]}],["24-before-value",{"id":"24-before-value","kind":"before-value","type":"mid","root":24}],[23,{"id":23,"type":"expr"}],["24-exit",{"id":"24-exit","type":"end","root":24}],[26,{"id":26,"type":"expr"}],[29,{"id":29,"type":"stm","mid":["29-name"],"end":["29-exit"]}],["29-name",{"id":"29-name","kind":"name","type":"mid","root":29}],["29-exit",{"id":"29-exit","type":"end","root":29}],[28,{"id":28,"type":"expr","mid":["28-before-value"],"end":["28-exit"]}],["28-before-value",{"id":"28-before-value","kind":"before-value","type":"mid","root":28}],[27,{"id":27,"type":"expr"}],["28-exit",{"id":"28-exit","type":"end","root":28}],["30-exit",{"id":"30-exit","type":"end","root":30}],["31-head",{"id":"31-head","type":"mid","root":31,"kind":"head"}],["31-exit",{"id":"31-exit","type":"end","root":31}],["32-exit",{"id":"32-exit","type":"end","root":32}]],"bbChildren":[],"edgeInformation":[[15,[[32,{"label":0}]]],[1,[[0,{"label":0}]]],[0,[[2,{"label":0}]]],["2-exit",[[1,{"label":0}]]],[7,[[8,{"label":0}]]],[6,[[5,{"label":0}]]],[5,[[7,{"label":0}]]],["7-exit",[[6,{"label":0}]]],["8-exit",[["7-exit",{"label":0}]]],[13,[[14,{"label":0}]]],[12,[[11,{"label":0}]]],[11,[[13,{"label":0}]]],["13-exit",[[12,{"label":0}]]],["14-exit",[["13-exit",{"label":0}]]],["15-condition",[["2-exit",{"label":0}]]],[8,[["15-condition",{"label":1,"when":"TRUE","caused":15}]]],[14,[["15-condition",{"label":1,"when":"FALSE","caused":15}]]],[2,[[15,{"label":0}]]],["15-exit",[["8-exit",{"label":0}],["14-exit",{"label":0}]]],[31,[["15-exit",{"label":0}],["30-exit",{"label":0}]]],[18,[[17,{"label":0}]]],[17,[[19,{"label":0}]]],["19-exit",[[18,{"label":0}]]],[25,[[30,{"label":0}]]],[22,[[25,{"label":0}]]],["25-name",[[22,{"label":0}]]],["24-before-value",[[24,{"label":0}]]],[23,[["24-before-value",{"label":0}]]],["24-exit",[[23,{"label":0}]]],[24,[["25-name",{"label":0}]]],["25-exit",[["24-exit",{"label":0}]]],[29,[["25-exit",{"label":0}]]],[26,[[29,{"label":0}]]],["29-name",[[26,{"label":0}]]],["28-before-value",[[28,{"label":0}]]],[27,[["28-before-value",{"label":0}]]],["28-exit",[[27,{"label":0}]]],[28,[["29-name",{"label":0}]]],["29-exit",[["28-exit",{"label":0}]]],["30-exit",[["29-exit",{"label":0}]]],[19,[[31,{"label":0}]]],[16,[["19-exit",{"label":0}]]],["31-head",[[16,{"label":0}]]],[30,[["31-head",{"label":1,"when":"TRUE","caused":31}]]],["31-exit",[["31-head",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RIfThenElse","condition":{"type":"RBinaryOp","location":[1,12,1,12],"lhs":{"type":"RSymbol","location":[1,4,1,10],"content":"unknown","lexeme":"unknown","info":{"fullRange":[1,4,1,10],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"rhs":{"location":[1,14,1,14],"lexeme":"0","info":{"fullRange":[1,14,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"},"type":"RNumber","content":{"num":0,"complexNumber":false,"markedAsInt":false}},"operator":">","lexeme":">","info":{"fullRange":[1,4,1,14],"additionalTokens":[],"id":2,"parent":15,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","role":"if-cond"}},"then":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,21,1,22],"lhs":{"type":"RSymbol","location":[1,19,1,19],"content":"x","lexeme":"x","info":{"fullRange":[1,19,1,19],"additionalTokens":[],"id":5,"parent":7,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"rhs":{"location":[1,24,1,24],"lexeme":"2","info":{"fullRange":[1,24,1,24],"additionalTokens":[],"id":6,"parent":7,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"},"type":"RNumber","content":{"num":2,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,19,1,24],"additionalTokens":[],"id":7,"parent":8,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,17,1,17],"content":"{","lexeme":"{","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":3,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},{"type":"RSymbol","location":[1,26,1,26],"content":"}","lexeme":"}","info":{"fullRange":[1,17,1,26],"additionalTokens":[],"id":4,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"if-then"}},"location":[1,1,1,2],"lexeme":"if","info":{"fullRange":[1,1,1,42],"additionalTokens":[],"id":15,"parent":32,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":0,"role":"expr-list-child"},"otherwise":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,37,1,38],"lhs":{"type":"RSymbol","location":[1,35,1,35],"content":"x","lexeme":"x","info":{"fullRange":[1,35,1,35],"additionalTokens":[],"id":11,"parent":13,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"rhs":{"location":[1,40,1,40],"lexeme":"5","info":{"fullRange":[1,40,1,40],"additionalTokens":[],"id":12,"parent":13,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"},"type":"RNumber","content":{"num":5,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,35,1,40],"additionalTokens":[],"id":13,"parent":14,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":0,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[1,33,1,33],"content":"{","lexeme":"{","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":9,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},{"type":"RSymbol","location":[1,42,1,42],"content":"}","lexeme":"}","info":{"fullRange":[1,33,1,42],"additionalTokens":[],"id":10,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":2,"role":"if-otherwise"}}},{"type":"RForLoop","variable":{"type":"RSymbol","location":[2,5,2,5],"content":"i","lexeme":"i","info":{"additionalTokens":[],"id":16,"parent":31,"role":"for-variable","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"vector":{"type":"RBinaryOp","location":[2,11,2,11],"lhs":{"location":[2,10,2,10],"lexeme":"1","info":{"fullRange":[2,10,2,10],"additionalTokens":[],"id":17,"parent":19,"role":"binop-lhs","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"rhs":{"type":"RSymbol","location":[2,12,2,12],"content":"x","lexeme":"x","info":{"fullRange":[2,12,2,12],"additionalTokens":[],"id":18,"parent":19,"role":"binop-rhs","index":1,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"for-vector"}},"body":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[2,17,2,21],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,17,2,21],"content":"print","lexeme":"print","info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":22,"parent":25,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"arguments":[{"type":"RArgument","location":[2,23,2,23],"lexeme":"x","value":{"type":"RSymbol","location":[2,23,2,23],"content":"x","lexeme":"x","info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":23,"parent":24,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,27,2,31],"lexeme":"print","functionName":{"type":"RSymbol","location":[2,27,2,31],"content":"print","lexeme":"print","info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":26,"parent":29,"role":"call-name","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"arguments":[{"type":"RArgument","location":[2,33,2,33],"lexeme":"i","value":{"type":"RSymbol","location":[2,33,2,33],"content":"i","lexeme":"i","info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"expr-list-child"}}],"grouping":[{"type":"RSymbol","location":[2,15,2,15],"content":"{","lexeme":"{","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":20,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}},{"type":"RSymbol","location":[2,36,2,36],"content":"}","lexeme":"}","info":{"fullRange":[2,15,2,36],"additionalTokens":[],"id":21,"role":"root","index":0,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-11382-5wUQEFHE47IZ-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":15,"name":"if","type":2},{"nodeId":0,"name":"unknown","type":1},{"nodeId":2,"name":">","type":2},{"nodeId":7,"name":"<-","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":13,"name":"<-","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":8,"name":"{","controlDependencies":[{"id":15,"when":true}],"type":2},{"nodeId":14,"name":"{","controlDependencies":[{"id":15,"when":false}],"type":2},{"nodeId":31,"name":"for","type":2},{"name":":","nodeId":19,"type":2},{"name":"print","nodeId":25,"type":2},{"name":"print","nodeId":29,"type":2}],"out":[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":true},{"id":15,"when":true}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false},{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]},{"nodeId":16,"name":"i","type":1}],"environment":{"current":{"id":93,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":5,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":7,"value":[6]},{"nodeId":11,"name":"x","controlDependencies":[{"id":15,"when":false}],"type":4,"definedAt":13,"value":[12]}]],["i",[{"nodeId":16,"name":"i","type":4,"definedAt":31}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11382-5wUQEFHE47IZ-.R"],"_unknownSideEffects":[{"id":25,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":29,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[0,1,2,6,5,7,8,12,11,13,14,15,16,17,18,19,23,25,27,29,30,31],"vertexInformation":[[0,{"tag":"use","id":0}],[1,{"tag":"value","id":1}],[2,{"tag":"function-call","id":2,"name":">","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:default"]}],[6,{"tag":"value","id":6}],[5,{"tag":"variable-definition","id":5,"cds":[{"id":15,"when":true}]}],[7,{"tag":"function-call","id":7,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":5,"type":32},{"nodeId":6,"type":32}],"origin":["builtin:assignment"]}],[8,{"tag":"function-call","id":8,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":true}],"args":[{"nodeId":7,"type":32}],"origin":["builtin:expression-list"]}],[12,{"tag":"value","id":12}],[11,{"tag":"variable-definition","id":11,"cds":[{"id":15,"when":false}]}],[13,{"tag":"function-call","id":13,"name":"<-","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":11,"type":32},{"nodeId":12,"type":32}],"origin":["builtin:assignment"]}],[14,{"tag":"function-call","id":14,"name":"{","onlyBuiltin":true,"cds":[{"id":15,"when":false}],"args":[{"nodeId":13,"type":32}],"origin":["builtin:expression-list"]}],[15,{"tag":"function-call","id":15,"name":"if","onlyBuiltin":true,"args":[{"nodeId":2,"type":32},{"nodeId":8,"type":32},{"nodeId":14,"type":32}],"origin":["builtin:if-then-else"]}],[16,{"tag":"variable-definition","id":16}],[17,{"tag":"value","id":17}],[18,{"tag":"use","id":18}],[19,{"tag":"function-call","id":19,"name":":","onlyBuiltin":true,"args":[{"nodeId":17,"type":32},{"nodeId":18,"type":32}],"origin":["builtin:default"]}],[23,{"tag":"use","id":23,"cds":[{"id":31,"when":true}]}],[25,{"tag":"function-call","id":25,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":23,"type":32}],"origin":["builtin:default"]}],[27,{"tag":"use","id":27,"cds":[{"id":31,"when":true}]}],[29,{"tag":"function-call","id":29,"name":"print","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":27,"type":32}],"origin":["builtin:default"]}],[30,{"tag":"function-call","id":30,"name":"{","onlyBuiltin":true,"cds":[{"id":31,"when":true}],"args":[{"nodeId":25,"type":32},{"nodeId":29,"type":32}],"origin":["builtin:expression-list"]}],[31,{"tag":"function-call","id":31,"name":"for","onlyBuiltin":true,"args":[{"nodeId":16,"type":32},{"nodeId":19,"type":32},{"nodeId":30,"type":32}],"origin":["builtin:for-loop"]}]],"edgeInformation":[[2,[[0,{"types":65}],[1,{"types":65}],["built-in:>",{"types":5}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":5}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":5}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":5}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":5}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":5}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":5}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":5}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":5}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":5}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":64}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":5}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
The complete round-trip took 11.1 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output as RDF N-Quads
The default response is formatted as JSON. However, by specifying
format: "n-quads"
, you can retrieve the individual results (e.g., the Normalized AST), as RDF N-Quads. This works with and without the control flow graph as described above.Requesting RDF N-Quads
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "n-quads", "cfg": true }
-
response-file-analysis
(response)Show Details
Please note, that the base message format is still JSON. Only the individual results get converted. While the context is derived from the
filename
, we currently offer no way to customize other parts of the quads (please open a new issue if you require this).As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"n-quads","id":"1","cfg":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"6-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"5-exit\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/exitPoints> \"6-exit\" <unknown> .\n","results":{"parse":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/token> \"exprlist\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/text> \"\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/id> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/text> \"x <- 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/token> \"LEFT_ASSIGN\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/text> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/text> \"x + 1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/token> \"SYMBOL\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/text> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/token> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/text> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/token> \"expr\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line1> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/token> \"NUM_CONST\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/terminal> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/text> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/terminal> \"false\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n","normalize":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/type> \"RExpressionList\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/num> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/operator> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/lexeme> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/children> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/type> \"RBinaryOp\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lhs> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"RSymbol\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/content> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/lexeme> \"x\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/rhs> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/lexeme> \"1\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/type> \"RNumber\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/content> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/num> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/operator> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/lexeme> \"+\" <unknown> .\n","dataflow":"<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/1> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/2> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/tag> \"variable-definition\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/3> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/name> \"<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/5> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/nodeId> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/6> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/nodeId> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/origin> \"builtin:assignment\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/4> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/tag> \"use\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/7> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/tag> \"value\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/vertices> <https://uni-ulm.de/r-ast/unknown/8> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/tag> \"function-call\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/name> \"+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/onlyBuiltin> \"true\"^^<https://www.w3.org/2001/XMLSchema#boolean> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/9> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/nodeId> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/args> <https://uni-ulm.de/r-ast/unknown/10> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/nodeId> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/origin> \"builtin:default\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/11> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/from> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/12> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/from> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"returns\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/13> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/from> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"built-in:<-\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/14> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/from> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/15> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/from> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/type> \"defined-by\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/16> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/from> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/17> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/from> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/18> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/next> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/from> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"argument\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/edges> <https://uni-ulm.de/r-ast/unknown/19> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/from> \"5\"^^<https://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/to> \"built-in:+\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"reads\" <unknown> .\n<https://uni-ulm.de/r-ast/unknown/19> <https://uni-ulm.de/r-ast/type> \"calls\" <unknown> .\n"}}
The complete round-trip took 6.7 ms (including time required to validate the messages, start, and stop the internal mock server).
Retrieve the Output in a Compacted Form
The default response is formatted as JSON. But this can get very big quickly. By specifying
format: "compact"
, you can retrieve the results heavily compacted (using lz-string). This works with and without the control flow graph as described above.Requesting Compacted Results
Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1", "format": "compact", "cfg": true }
-
response-file-analysis
(response)Show Details
Please note, that the base message format is still JSON. Only the individual results are printed as binary objects.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
嶤ࢆ坪᮴㞰纡⒕撦ਭᄱ瑎ឿ䤏↉⋢䖵ቴト刂˃Ⰲ昃凈⑊ㄫ⢮儼䈔理成㊰梱擂略䬯౫橒䡇⤆冁⌚䛮⌈䋴⣘ᕀⵡ⣻礨婛䩊梵ᆉ糘н癢ᓑ厈䫱滍冀મⴽ婑㒋塴♙⊖䛎ໄᒤ㚰䕘ᯃ傰溬崻к棍樻⋢䒝ේἰ⌐䏱⹂佤媭紲穄ಉɗ凙⏻䯘Ꮜ၅и緐簣䞤攐夿ц和ゴ兜氺䟝ࡦ᭔㬸䐠ⱂ籀પ⼠爦挫⤂㆐岤䘯眒ጸ㖀䳁哃፥䊯ጻ䙗ᑳᣨㆥⲔ牊ɜ俽䃈枘㣨崦伭⌳牖咀ᇗ゙䒓䆭ᱸ䖘ߨⅦ㚫₯㘡ᤙㄸĵ䘝ଘᙔ⑸統ڃㅦ圇模1坆ଵ㈚扈凫ପᲀჺ㫪劃曦ⶭ牠䩓灲⣿ᅺ扆䕩↊ᆌ╊㚱㢂㛤㶭ӂ橒๙㰳烶掂䠛࢛仌ㇸ烑ੂݧǠᔲ๐ᱸᣐ凑抓墪ަᜠظ呱㒘է殴⌶㉙⣫ᆈ掉䓹࿆ᬌ⠈䇀㰼⦦㎫癌ᑴ兀燙⎋䟻ऺᖄ⧸撑䟂拤媨㜻䣣岉夎䙍⋗㇐ϖᱴ㇈熠ȃΦ⃖า䙒⡰夔㈃⎌䔋ൊቜ垑戃⏧⮭䔼䃳Ɋ籧ỽ⏞䟏ࣧ䗜◯⥎ผ˥➩匽䟹汼碲熛抱瀿ຆᴨ✘忾笔䀐組៌繝楃㤊凳挫䒃ಚ榮丘炞缕翧䆔Ϗ⫵যἯ爙拟䞿ඎᐬ㜌㠩磨㴘ⳁ翤簾汞༥ᅛ痨壀䢖㊘畑ঢ়忦枮᜶犹ʊӖ㩄ች䧢ល䗷ત䐩䆂柤䴬Ⴙ䙌琭Ԙ搬È≎ূ䞘䛼串懦䚩㜾ቃ㢋兖ॴ槁Ⴈ䭱⟢ᑰഩ䨘剄ᑃ炼湂ᲀ䓪ᅵㆄⓧ䞬䫂⇴ᒩ儲㉆硭傺㹟ʔӅॱ扉憈䫼椝哤擘◩㥦圄❮䀦ഴₕⅽ⎁䕋䋑ᚃ囤綩䜳牄ᢹ扔Ⱬ屷ॖሧ�䤴ዦ嗳i䤱湅㔠㢲क़⛖ᱷঢ়巢⨁琄ᘔ㊄㦔⸡㥤ቯ刎牕溤磜熔ሬ䣞ᑢ㊼㱩ዽॆ㇠憌摔剥を䦿䍌⟄䰊愈ཀ箒曡榢炴䵵扵‴礻R㋂ྊ傈掎ቃ၇桩㘳ŏ技屎䧼ᖺ⟻։ၒ㌦㓩⚳㵇晭囇ु劂倾㷋Ƽ坏欂㎄湱١㝄匾^Ѻ䣚ㅬፄᐌ伄➄䧩㝅㙪奝㊌ࡦ䨝ԫ㧊ȯ⡜ⷀ勩侳䶣ⷲ⼳䅏ኞ䒵䅞ቿ᩿࿐〒▏⁉ᾳỤ屨㒽楖ગ撣⃜䣾✅༉ឰ⪠嘡㾲䣄晩珇⁚䂉擅䆌≎┷ᴪ㼴狩ᱳ旦港粽䕈䪌ℬ⦝㳉官杬ො㧤壘檳ᰡ奯㈡敐籰焎⹇挐➢䱉ᅒ㭸痩ڲॆྦྷ犱嘦炂浔䨏ኅ⟒侵ὲ㸄圠涄焈幪湫偵抆哢擻Ꭾ੦ᡠ㐴棉曣ࡤ╩㬵╃⪇M⥦厖▤䢉ႊ㭴緩怳䐐祩ⲿ楓璀സ⑾剺┚䬑ᔢ㱴冩㜃繇╫ᒸ൙掹縠榓ኣⓒ䡙䫸准➲ⳤ卩ኸ㑌䩾棫㻐ቃ⟜䩭ᐌ㧴䆉害䧇六䃥畘䈫湕℀甖♦䧉ᕺₐඉ㔲ڬ缶᥊橸㓜楳ᐋ✒䲍ᠪ㛔熉ಲ敇筮㚾啗ᑣC⺄䈄䠕劧Ⓤ⊔唉້ⷄ䙯撶ᕜ㉷㓩䥲叾♮䵄ǵሄ䍩ᷳ叇䝫ᤂ娱檎哜⨏፶犾䧵ኊ❘姉㛳⍄੯⺻煒⪍唋লᇏ⟚䱹ჲ⬔姀㏲ễ硧亵࠵橦歔匍䲂ئ⽤䗉癃幚樔劲⥅檝哣⥰㎦竦乣ᤦ㊰ᠹᙲ壄⨅✾͓ᓌ燡剛⒑ಥᱲ⠬帹ቒ䏄㹭䲰⍗ڗԵ廱同㢔䷈ጪ㚄彩ᣳ䯇ҭ⺹㕜䙯䝤ᥴ㊸暑䵹Ḛ㸄牉兒ৄ⭩纱ैቴⓂ榚厄摕枳ᙺⲘ䞱岲࿅磫䆳⟻䷏磗榎፴收䣣ᦚ嶩Ւ囦ᣮⲵ䥝剷ᒬЬ厊ⓠй㋈嚹び粇惫榱⧫㩱ഋᥩᏛ⥴仅Ᏺ⛬爉㱓⏄怤ິ卂♡ᔐ妣卓Ⓨယᙄ☔䷉冇᙭䖶兟㩺Ⲿ䤹㎯╆䭣ᤴ㙟ᴉ㓳₇僩熵♚ᡳ瓮槩㋁⛅䷪ᾶ㬬稹ⳓ疆䭨ᖺୄ⚗唔愃巳䜟☳ᄈ粉⻓⒅⫨র䍟♽ⲯ䤣㋘敱Է抸⿌柩ᙒء㞑䦺㍅⚙䴟榤㌬柍䧝᱖ⶔ畹䊇䉫ㅇ㚍ೠ䧻㋟ⓒ䡩ᬶ⮸嬹罳㷄䷱Ⴄ浂ᙰ折奟䐘♈䧋ᥦ㋔叹dz⾇㊳㭘穢⓳奱㎧⓴䵛ㅈ䟹ᨂ䕆㶹݀ᳫ奋㎜攅丛፺㜌嶹⪨ǩ䆹⭏㚈泏粜旱䲛ᵺ☌碹㒒礥Ǫ嶶⥎ᒹ榸ඬ䖚䢇ᾨᵬ乩慳㡄২离十徽ᝀᤩዹ敏੧Ὦ㔴筙㳓◇ת㎰烰丩ⴉ㧛㎙柷瘡洭䠬憉熒⌇ဗ䮱坉ᲀ峒䦍㍳䡗ᔮ⇸䱙Ȳ焇䛫殳⥘溈崋㦭㊿ԝ䣇厌痹ಒᆅ༫庺獅㪛䲽᧪狧立䲗ᴖ㧼洹垒伄ֲᷪ寶⪉呮⥝㍱ゑ䰅ᴾぴ礑⺓曄秭箺យ妱獵☄ဧ᥆⅜䃉盓榅差二ⲯ㥧搏竇䪌Ế㮠傩ቹ㤆䯫常啙幸㴃榳剝䜎䦷᩵孥⮩⼓歈篬⮿⽟㒘㒾槻勴术䷃ᡞⵐㄙ䓳◆楬涴䵉㺞᳚稄功䞙䡓ዞ⦴嵉㜒ᭆ澼㵜皝䓵稅牯敤䵿⧘瞩僲徇懭வ♵粠㤷猩⟆Ȑ⢺㭅㑩兣柅滫⮽罓扺紓䥙勬ޖ䵇ၲ坈倥ፓ疆I䒰婕洛प猭晟䲩ᘒ⠴䝙̣᪇㷭䆱彑䊅峃奯珶擀⦠咡Ⅼ仙悒故Oឰ䥚ƙⳓ䧹勷Ҏ䶝ᅖ⺢簥ၽƇᕮ偱惘窟羉稅琘ᔾ丠員㼈痉嫒䂅ы溵坁剴䋽㤮㊈ᑾ仇ᐞ㑄瘙盲⎆㳯玾ῡ˺ᦘ㍜䫹ᣁ䀜䥹稪䍅ྕ熳睟ť峍礳㊳❠⠧ᾁ㞢喹r嵠ด䴄⭋泜㳠⧿ⷃ炨ᨡ㵨䐙㒒⣆碤G僃噯䌗ק独杀⨿᱁㴜汥琇ы⡸結了䊵㨓沠旟伏᪱㘜剥⨒䟄奩ƶ㽉←᧒璯栘ⷺ᳡㼜愥䱓ۄ忩䡱͉共粷֙˒⚍䯣ᗱ⛂己ዢж汏䶹棉ት᳒㥽੪ᙴ⣠弪㎌䠹刪శ䥨ѷ⣀癣⋶䖐畨ᐣ䮸奡⺼䵩䕓攵ר暰壋ᩲ拑Ռੲ敻丅ᲆ㛼日䭓࠶❨ᨩ䕫碙㴛䖐ľᖀ⣊ၸ㛜䠥斫ʆ噈⺰磓縢ᔎ⤧卷㫜Ⱔ啡⛄拹滓Ḷ竫䚽ᭉ㙨紋摝䪤噑⅄婅䌫槄剌敮⽐媜⋅樆௸߈⣨埮⭂氦㖒匄ॊɿ㍀繶擜䘕⤰猈⥨ᣠᠨ撲细⑉携擝䦂ዠ䖷ጞᕤڄ媸䜚ㆫ䊶䢐ᤫ擅慪潾䘅爫朔⭨巆⤲姥फ爆ᕏ枱歂ㆂ˜ᥱ⡅៉勅⬫粴⥬响憘⋒ֶ䫢ᝧ憴垰㣢癙咳爅䱉㦹磍晾˓▻物搹䡏ᄁ◂䡥䝫丵᥊ᑻ䓜冟缦☏૿㤸ଔ向Ⲍ僥圳ᆷ⥏੶ೞ→䴜剰ᙄ⳼ચ㺂充壪樄問呸䳃㋪և㉟▆叉⏌湹吪䆷䧪浀奷䣂旾䬦⢻ၾ㻒䷅㫫☄Ϥ䱰畊ᦌ拉䕃䬚ᙅ䳶Ჩ㡂䕥懪⦶棫䱲䳑䚄勖┻痿暀୮ጩ⹜繉ᗫ沷坏倱᳃Ⱡ䒲敽䮤朎⭼峱⮢儹珪ᆅ៩汻敌ᠡ偹簾௰ⓓ䩗ᔙ⃦㯅⇃㠷孏䙼❀哧昑㦺ਦⶅᐥ㨒幹瀒攴䱈沵˚兩勘旇੯ᐡⶢ嘃ᾒ煉䜪灴㿮㊻ⳙ㊖㌒䗖䪆ᘾ⼮ᬮ㪒䗅䍪ᖵ筋慳Ⳉ応㳜㤦䰚擳䵏ᬖ⤂䉹⏫ᾄ噍ᙽ䭅㞾ᖿᎉ晀⸝ᅈᴪ湉ᡋဆ佪徺拝癢䓲ᗊ䩱ឩⰝᦙ⺌儥ो洶烌粵吸䤣ભᔬ䣄坣䦲庎Ⲫ圵䛫ᩴ楉掱ཏႉ䪸䗧㋂䧬屡㻤燙㵋✄ೈ䊻磘料˲姍猅撆⽠囶⏂䓎ⵊѴ४奼⋌湻䪤旇䨼暥Ⰲ妅㜤᠙㑊ⲵ╋ੰ泋ዂ⪱◩⯒➀⥯ᨉ㠒刵乊其僎ॴ䫕㦅┅ᕥ⯏ណՊ屾㾪䮙溫綴㯫պ狎繡⪴ᗼ⪸噕Ⰲ句⻊噅湫ᚲ⫗䥳⫻积卺垈⯄奵㑲奵穳፵竎啰ຐ⬅䦰玼哿䤭ᙕ㷪慵泒礦ᇭŷ䍇㙰狣⦛圅౼尪㗒䣉㳊̴汎浶㫌㥦㓭䔯⯫⛱ⶰ帲婢⩵耜到硃牷糋Ⅰ㳗嗿⩮䠗䰦坁ᄢ搥⽋䰇㿪㥹㫛亚粮旗⫺因⭢厎㐪䑕罋惶湨൳搷疞⫍啨毢⦃ⷃ႒⛊幡⤒䘆勋憾⛍⩨檭嘛㐑呭⧺塾⚺汵暊砊廊㍵䥚ঋ猂奡㉦ᑴ䪨ᵾ♀埥優㝵ೋ嵾ᣉኌ泹喼櫅噫䫹់啊劉䖊ࡷ⻈̾ᛀ䶒嫥⻤歫☊熅‟仪䒅䢋㓵䣬摿睛ᅲ㌃㖄ਭ埻䰀嵑ㆼ曹䣫ᑵ囉ቴ坃Ṻឝ纶橖ᚡ⪖妡㤔䠹⇊⥷䯨ݱ䫚啩媭ք䯭呲⿵ᕑず䳵縒欷曎䩸䃁ቼ㪷㦅ዳ垧ⵄ堎㍜柕ߓ᧵䡍❺໙ᵧᬗ槙䬟⚇⿒媚⃚䯕璪滴ᯮ⢷⡥╥㬂畉⫨ᔩ⪺念⇲掹孓㈄糏㕳滗൸嫙ᕓ䨵᠙䬸噝⋄徊畋デ李楻ệঔ㋐櫤䬋嚯䷭᧚⿲摥秪嵵爩滆䚜笚᧹报垹श劑㢚爵䚋ප棩潿䍀䱤泩槗ॖ晟⹘佉ᛚ狅Ҋ⿊䐢绗ㅚ剰ᗟ橮გ䬏ᅹ㨂緕姷毋྾À晨۟㕓珠㓝ⴕ⥚傕旊㵄母䍶㻖兾唤欐搷峒ⵚ䭉▁⥵䢍⭿ۏ疙ዌ秎ቈ㐣䩶㐲寥䞋䱗䅌䃶廌Ŧ窩娟簡ᗀլ埣㈨䴕⥒浇櫌ㅹ歁㉧܂昃⨡启ⱻံ㳊岭䇒ୄˏ勗㶖笗痆䯈㕧ⷁ劣㲒歕㸋橴㒍粺㫌云䳍ඨ⩏哨棖心㈊绵䍫㜶䯉罺䇃䦉獀ᦳ卐㖞⸹ᦁ⫦竕ላʶ㲍㝿ໟ嵢璲ᩖ晳⤋⬦湵⨻㡗罎罰⽏㕵狩姛⩱杘棤峃㛕⩵ⲻ炷ᳬ箱瓇禜✋ബ殄㞣丅ὃ㴲咉治叶㊉哰⍗፣✃畢厯䗣⼘傳䀊涭渫Ⴕ⮩槆喌務㕱ᯤ㖓⨾怃㌚祭㒻ງ◈❸泌㎗㫣㖆ᨫ擣⼑冁⋌䥭㙗⏈奵㛈䎇撬㗮ᬐ敌溔姲┦櫭䊻徶粋䭛㍾䛆㗈歲㜼淖倵ⴲ䣭Ẳ潖⢈瓺⧏Ͳ✂᧹ᮆ㚤歇ᦩ≆䧵去沆皈壻厗曍䶅ᯚ㙖⫘儃㱦俑篪ᠶ籉䞵峈୰峋◦䭌㓼檼倳⏪乍㭪⁶劉ዱ䗔淐抩ෞ叼㑙䱻ṓ㜆籍ᶺ䳴ᦈ䑼奁䭫ᓗ禵毪ធ温士ザ擭ѻṶࢍŷ旆禄ଘ䩪毒⠪湜垓⽚䆉䓴斋⋺䅹Ⓒ嘘孖㕒渙啓⅄䱵殫ŷ午⥵४嶊䡉檩㑫⤎噑⛶瞕桋惗滨ཹዚக服ⶢ尅㛦垯ᓅ♺掅㯫࠷◬䓾⽐᭬⛕䵋機唈淮嘋⇄䢍⿳㒆掎᪱ӗ䩣回痶烝ⓚ欭塹㷶峍晻睔⪉ॷ彛┟ⷮᰟ祟ⴚ壮ᘚ泍๋㧔ᖍ收ⷊ宍ದ涟毌嚆⸲劓㕖䡕፻痦淈嫹ස涔㜎涛㕶⾍匓㌺囩˓䂇㗋扺歞溔皽⺝孚㓰母塭㊖納ᖋี枈刦䄡㭧ᵰ斀孛㓳䌖墑㗶䛭塺㫖ኊ䳼䳓⺊⚻淦娷⒖櫥嚻䗭ᐋ㧥抈廱痖宀盧淝嫨᙮䱙岣ㅶ娵籊晔⇏晹䷍妖㚺淚宥㑡泂妥㐮䴵恛භ䃌拳曋憎朔ᵩ牔攅⦥婍⸶尽ᙺ梔㽈⪴ׅ㍹禊㎿哱橽吓⬖烍娒晴嵉ɺ䗀᭮岢涻㌣㒆泙吃㴖愽䯺嵔䤌䩇歼曱ᵼ㪮嗪獑嬊㫖沵ⅺ⊕攈⣉ᮀ竆䵕ቢ柱橃壧⑮晩爋絖㔏ેݸ䚾䧆㯔甩楽尛Ⲽ䖽嚋⚕冋⣿壞了䛓涬௯唉渳垻㖴䆭䍺䙗ᲈ䍴嫜ޗ糰涜㯶㟙槡僧⯮欍䃚燕䡍䗸䷛嵯ᜅ䴽㋜㖥漭巃㦖溭嗺؆䖊㳺䯟䮔亵ע㕲咡䮔康⭖堍䒗㴋ᗻ僌䅽礠㉆摿䳻㋮砍⯗嬏㝴䣚䝰ᴣ㩚睵淳帇㊔僽[潴绋⋶ᧃ➏ᓹ嵿ᬤ皕活嫛㽮䃕檺䚗圉㊿്䚽嵹⩞ᕼ栳切⫮白᭛箕䙈巸ス徼(䃅员㍗ᐆ⚸༎䶦ߛ䎖愉ⷸṲ㠭溷崦þ甊㊛宗㼎盄⸱䤑ሡ㷦篒㼡偄䊀穁矩汒喋⺷㑝籵愔ܧ緻ོt㸈>瑪ㆧ喯☎⪠⥭礗㈊篁➇囷⋨箁琮͇叉匾楝ႚ┗ᣒ䏰柘▶囊崿㯂疝殇弴㺾獝ر㳨㻂ᬌ乭据䮁⅕嵢碧݇傯ㅮ穎⊤䘎嘢ᘢ廩㷂筫恫漩⭸⤖涘嶤昈䕹篕梺弍㷫ؕ矐懑એ⧰༤璅ࢲ兖对ᆮ澀嫶䵕獟㕍椻巯⓾囝ᮛ㲤䤧寿ಱ澍廥₨䢥癋濼д昽怉✔␋ᖶ珑ㆄ⻯᷶㯝眫殯帅㕾囝甛ᬕ后妀矋㻥嵇㮶疛櫋ିマ䋔̚穹䐉圍歸㛓ཛ姆笋皖攧⬊䰽ચ㿖同⯼濈➷煆經㑤笙╗彮৴攜ሚቒ潯㻿㵀䞑㻯㵉竫疋洿儒㿞匝䨚㨖ᘈ㟸痔澋㺪巰㭙皗欋塜䞞楺嘛䌕ࠊ寵埂䊱㭦絷筃;ㄇ刏⮾䌝֥䌗』ᇹ俍羝绳㙛箦㎚盿嗏㦉㫔碚䜖䰍㿹忏羙弓綰ڋ盎琉‡烝磲❆俼翌瞗㺺滨ݘᓆൗ嶠懴㖀噠㞖㲁滸߄ë⫎絵ㄨධ䑠槦獨樧丙挤ᖋ㽴㔩ǚύ䁸ส㢏⊡初揕ᠾ⨥悁改䒴憬߆䊍㋁扤楔ว䰭̖窈႒Nj穥窳皽檭偀繡炣䔦掳ᐼ灔℡䈆ͻ箕瓈⅐㱀瞞甝⾒滔ဍ䯹⟊䄅䇭嚝笿塨ᴀ㆟↡玣䫻僰竳௳彽愓ǹ䓄䆦栽榬忟⨞戝掚丬琼涌惣掏БݢΩ倀悍Ҁᅣ 䠼浿悅►⇕ᙹࠉ䠠㙸怶埡潦Ყ瓵爼緎⢉ᾠ䵺䍩戼͋槲䥟ু殢塭⠬㐹៲翘⇃ᒌ⤚ಫ㇑۰曗✩ᛡ椭⇱Ǭ㔸∅疵㭂ౘ᳀ㄺઁ壣˱傰嘻伤惷攴戙楚ᢖ൸䳈㑮Ⱑ潣☡喠殕汞墔焛䨧ڝ揨䑦‶弁狁甧紷ᐈ恝㟩烪开碿س拀伧⧙㩞簄ⰲ怣縼᱖㛋⃩也䎁䄫㝥䘤㨨涸沲⌀刖杨朲橑ࣿỮ䏏ݔమ浢暨牐Ὕ⦂碭ᄻ⼻䩋⠶ᴓ͝⋢䖲ᬤ㤽∱懱⩧羅ඨ㉒⒓ᡣ3烜刺燷㻨橀❃帧㤯∿剛ੑ䀯ᇞ⏫接ි᷇䯨旎᭑䐀䫥滨ᔷᒆ䣮㪼⍵ㄵೕ枮᬴⥱孑椝眕ޭ䔻咅澒㳖䷸ྔᾘ㑈猴偪䁻❤媬ᩒ撓硝婎⎮䞵⢲ᛈ旈䯃䵧㥤崹橕怼䤓盲沖䠝ᢎ岂㷘塱◩ಮῑ猲䲊N〈䠙൴ᰴ㴼◈劃照㥤ጻ㌽攧ಕ梶凙䠑䚦ạ巣憃ᡦ䆭䊯ᙒ撑औ{䥕嶛嘦ᬖỜ㰞綃ᇍ䖯埍ば⩖夘㈾䜏䔖ᮌ㝳䀓ୱᅧ㔑㤻๕澐嬗㶈ۂ༼Ḧᘴ㊑帑旦泥恆⨧᪨咒壅掼兗ྵ༨㻿㻡栣ầயԽ湒સඓㇼ刋䝹~㳿䙮揍滦ྫྷ㬺烵沍࣫爏⎩Ꮇ䃒᭐㓸旦⽱氲ਗ๊瑟ῂ棺㇙凇窃มᢃ桬◈缀撘ヰ䡣ਣࢸ瑷ᆤᐘ䂕Đ┴ત箈犃⎦➬⌺橒Ӷ፻⍏డᬪᆤ椩瘳屆浦䜿ṕ横ၚ㱳൯䜸䲎ᣜ㋤杰㜛浔ᘾṞʔ礕燆Ꭲ䇘䳖ƃ哂È七㷧扭ႋ䅓⹀⡏㳔㚴䞂䑟挜ጐ犒堳㩦ၭ咺⥗㹝⓲㣥⍦ࡲ僔Ỽ㗈擩撣埦䄷䛮ᥑオ擷燦匌䷓ਓ⤈ʁ橃ῂ䗱畆奐ᓖ憆㤏ۏ൝搪㋨爠Ῥ⢬ٗ♖㢓祾绣挢✘ໆḲ㘝ᙉ䠝䫧ㅧ䊼絣ⲕ壿㇎⎣䜒倁ἤ㫈狱硪峆䶅᤹㙞⼷声眤嗢⭥䤤噐ԭ䍳㹰䵭ઽ剒⪙႞攏种⚾䦬⢦埴槉婍Ⳇᢕ⊾湳槗䪈槼ᶼ牭ᴢ㺠杩縤⽳卬㜊䵖䪒⮐䫅⏲嫰垍ᳲ㻥㺑愳糳䣵㚸機纖冨䶳䟅Ვ嶾⽀痳ㅧ㒼ⵕ檙㔎曧厇⠖㓍甚㏼㔮瓭橧潔圔͟媄䖂戊䏽➖㒣Ἒ㦅㥒ક㊲嗰ᣇ⫳⥑爃⎎箇瑍ᱚ㑄筼݈㠮綍㊺䚍➜䛃⹒俇⸉徳ⲹ䬦આᵬ唿㩔滕⚺㎭⛶䳲瀐૬抹嵳䱲↬皾ᕷ暔ഘ⫄匫䞑䱵ⱊ桌椮䃓丠烯檊᧳粎㞗熢⃞⟭ᜲ歉ᅿ媽⇍ඇ͕爪ൖ㏅㞾娚㎎䜻敓ᠾ墌眚廓ⓚ㍇摖≜杗䵠竌⥖晵䴚偷⧄叓登ᶹ⑮བⵢ娕൪枫次ᮂ嘬灩勳ㆆ绯ᖼ筒ᣇ礗㪹᎗䚡䱝ᴲ㿘溁䑣㧧惯ኸ䝘泞᳷⠩甽㊓俊ͥ唸犹潉挆䛭䌿ྺ❕ᶄ姰ᗵ暅䲳ứ嗬翉拓䗒䷯媺ଡ଼櫀⤈娃双卻侻᱕埼粹罳ẇ泥䅊䌋㚖皰ᷥ⮀䍃朾㴌珒曕瀓则枻᱐᪙㴌秺㲋昢囍ᾙ垰㞙䞓凊⦯㮸侼僀紞朝猻⟛圏ᱞ媴扉䌓䒊罗䒏䗓犊榠啔⛨䴁ᣂ㚇Ⲻ䤳䱇䡯㾻⅞⺄夋̊朠⿱ᯮ㳒∥崳 ŵ㴸ݕ璐糽᪢ፘ暛丁乡㆜斩䰠❦⏯㖿獟⭓磪׳㖽✹乣Ế㑢慹秳㑋嫯矍亄ᔛ䦧獿櫆㐷䮒㐄珹猹僆ŵ揋㝛纕掟ְ䟮ᑙ䰁㿼瘙幡然䏯ڿ䍓⥙㤂妥ୄᙃ呓ᥖㅢ罖劫䍻⮯ಋ㊻㪂䤙䫆㖛➾䰽ᣮ㊜璼啕⿇瑽㛺㵀䋹圁ᔤ឴⾇⹖㣽㵥䨉㿳์ᝰ熅磨稓岈䏧ะ夷宸༰ᩓ㱚獮ㆻᩝ劍瓶㧔嘕⟁皤彾㋴慅礃Ë۬ο᭜㆔᳨姃叇曩摨快峒㋹享澇㴈νᓟォ拴ڱஊ䩰㑴壯嗻㥢絫㕛䵎ᖽ㓕⦓䍭䧕㍕ᏺ⸺溉㷽⻥稭↻呍㉾୕溗ጙ䗍◤ᚁ丧᭳墢秮䵩搷⍎㮾ὑᦀ晢Ⓦ曪✚ᢩ噼眙妓ື剕ᘻ㣛䯆崁●㎑䙂㛠彂㰢眙痫‶确嫷ះᝧⴛ䭰ᛘ⸟ᵂ㤢縥岫平ïᆿ糒拘ᴔ䫃玈៣䴗崸煦纍橦⏬㔠᠁ᄴ笾ጅ玨垛㣐屧帝∺䉋䔜䣌স䧽䖍૩㝕ᷟ♫侒᪴㔔搵纵ぷ䕯䡿㵙䫧ᇫఄ嫪⚲堪側烿㨭享敭⯮乚㻞㓴◷厔垂ⴔ⨅㴢硌壋Êੌκ⣜妆䫹וఔ垴ᚈ嫑㷂椆纓䥦乇瑽ㇰỖ⫵ᖷᘒ坴⻘婵㵓╵秫ῇᫍ唏ⓐ妗䪆☝Ⰻ⭨ⴺ弬㤪泄䅫ᡷⳇ⫝̸纟ഞ娝獞垤ⷞᴱ㯓㢹柫〈㻍ጎ嘭䄷櫤妪ⁱ嘣ⶔ墶媒癕曓堆⮙ᴦ⛚⛃䳰䖠珄服⸑ᵔ㌔笹䑋㲷咄妻㫘⚔嬕᧯Ⱏ☵ᖪ岁瞵穓᧧ᅎᣖ妛奶勚毗樻ⴋ㶊敎碭島㉌ㅹ㳓㏝䋹㘁毁嚧⻳Ḿ㠒晕岋䁷珍ο曐ᖕ嫸㦸䭎嚚奭㋪殕䚋ḇ绌ι۔禟宐喬ତ厯⾀幆㕊獵䷳ķⓏ捻祘䶀䩣痶㖌嚔ⰷ᷅壄⇬栋ᇷฮ䶾⫝̸亜⫲㧮Ꮩ曱㜞山㐦爕櫓ঊॄ斈ۺ䭟朵䳁帡㊚歎熋⬆敇僼㳘㗏۽䄘禣暇⿕ᷞ㉦涹琻ឆ俬᛬㝞ⶂ➘瘘☜៛垍ᯙ㚔湵樫婷ૌ䕻㳜斝櫡㳫卾噐㘓Ὁ㡌掭揋仌䭸ኰ㦛̑㨄ᬺ䜷ⴸ忕㬍㏅吋ʊ⫆ත滛敐✟榬┬Ⲑ嶸テ䍎徭汦柍牿槜憐枅⚾ᘡⶒ墵氪斕䮋ጷ毌⳼䳜奚䗘⭚ᚬ氨怓㕦熙䴻暲姏秛憛㫠䘔殑坐浥澍㵫♍伋繖㊍⋽㳷⎒㫮㖬寄㜟⼼奕㥺疄傫烗妍妹䷷ⶑ㫯㗀宯朕㟋ᬍ㗌牵崋椶㦍婾Ӵ⮜⛪䗩᮵柶ⲇⶋ㽦棖佫廗䏏㯏䳐ᶓ牲斵ᯋ檮ⱣΎㇶ㎅秋㲢㭎⣴㝕䕀ᛒ涹䧙㟆漓㍻㓲㭭㛻㽀8㞫ᓇ䈢其嘟挬㔠᪀䉛㓸ԍ䛻䴇浸巓ⷻ佝⇣宍ᖮ澁扉⹚唳μ熍帾懟ᵪᝏ淶䩃惷⭿枂छ帒М厸╞亝朗ฌ粇ࠝ橪ᅧ㵺唡⎃䁦璃旒盋㮌拭⑬㮧梩澀栗୬爽乛㊗っ䁑᧟ᢁ☔௳䃉潛呞䳮篭㊦ᴏ媕Ổ䞖گ䵕㇟㘙氻ຒᙄ抽拤奨忲懽淏箃㬒㸩㯈盉⎵撷㚤宐⼊恒䶠沁廂ḽ⼃㘐䭘㘂湓媲䗎所䛛ៃ䜌痸ⵂ㞂㳿㴎⑆၍澓嫣㭎梹ᷛ㱁ᆑⷸ㪬瞥䔘㉖ᏺ嚴⊛奡ᅄ瘝庖堣緾篙ኆ⼱獏㮡癅燫悶㕽᪤㊳痂〱⏺㨠侀栰㷂歮睓ʛ孯㢧ɝ戠崗䯳現㡊磗⥑㷤筚ʀ䝏㺾榚瓛獖∌ᧃៗ侒廳ᨶ笵癓澗䍏げ䝾姻⼤㘎篼柖涐漓㷡筬ᤂய峗峲 Ԯ䙙箻壤灩柽䕶Ɲ粄㨗嬲ᬤ糢搫㻺屟ᚣᇒ咽曠ƾ⭦Ḗ൏Ῑڼ续混ᅗ皍犄摮悞榑㈛ಡ⠎㹇忐ő綣偦恗㜉怸ʜඎ敩啤籡<ᇧ濑䠺❈ㅷ篆ǿ泛䔠熞楼ȧ䦑碡ㄧ䀩斟纊Дߚ睠`㲈࢞絈ਛ❭僫ぜ惥䄆溺漨愈!ྭ᧧㶜׆烀㰯㙠忺ႛ幾䇺䮊ࠕ畖䯜呏ⷡ狓〄☮倾ࢱ䂗.Ȉ≞ݡ♨慍ᗹ⽊ࢤࠔ㈱乚娽䛟ᄀᎾ緇箰ศἺր篰祣椨唯熱摛梖ᰶ⇡䏆ྞ㏏啼๛๐㚦晉⼴堌㾏ㄙ垘ࡾ䋮䆧湃幕㈣瑄ᜯ夂Ꮑ८懽ʖṂṨ∨狝二䑧ႛ㧍傝ଭખ瘾㣑烁拭丬Ͱᬠ繁摠㟲ợ1㊩碑ኮ悎≪埤ұ攊ᥧ杲⩞ⶾ摎㠲羚䞊熒ὙH烼壃䞨⓴殉ᮂ㠈椓翝⏍ʓ䃪ᄰᢈ県䶠ョ⚯瀠婜丨⤖ⓛ⎥ࢽ༦ᶬ㡏䟨冃磧㺯⌿ٞ惡䔮繀ᔰI䜞ⓨ翤Ḙ²涯߱乘١ࣲ㽆瀻ب炮ᵀp᠂ᮮ䞪䀥⊎礌┵Ɐ䜸楠䠈✼㝡GⰫᒢⱛ䀭ㄙ⡍䎭ݧ㣢ɦ;༄ƀौ息ᡓᅟ䪧愵Ꮾ唏祼䍖ш約ᥠд⢀Ṡ⍤抑䚯䈺ᐔ➳秐ʂ㸜䶩綨ژ祡碾य़焬┘๕Ꮦᔌ倅†Ł棣攍⸽ᏼ➬亀2㹽俤ᦪ磨㲿敠 ᇱ䭉羳繜ᱮ಼怢㊚ᔈ⌨�⠑䦅῟䐏㶮穌⭤䍑眐澑☺梧⨍ṇ䘝泪Ꮊ㤇ᒉ竳嬴⭮⸡㟒绘⏥滕张䩛ⶌᢲҜ嶈ᐆះ简捣仡䋧甇槧⎀朡久ᮕ僯㪩䴯㲨⣮弾汅℠廬㏄朮兢䉯攪৵ᵕ暠㠡篢Ñἠৢᵟ䢋⡿䐢䁁䇱䬶á㚇峯燨ἄ᚜抽ᘷ煄ᣏモ懽䵃࠹扔㮇桩涼十ፍ瓻┸℞❬㘑˚本乬絳䳑䇮掰ݝ咜椵㡙㰼፮₇ᵷ嫾㣙秨ᾇ仈䒰䞣䀬倹৲ⱥャ丬ʮ䀗孬絳紇粂剃㟐崒稙ᒢdz‗゜珊᠒Ῐ眹殼䩇嚑儚姾㎠燡℮䍑⚜盥ࠫ糈愠劂⠃Ɛ䜦0乐Û俈⁴枂৻᜴⤤緮㿐⤡暛紎姾䢆ᒰ⿁ቡ㴢瑆ᰫ羖ぎ⪂彘嬵刣秭≏栘࿀彏⎢熷ᄫ戇㯰喓僙嚟䴟秦〼ឤ傱㢕 ಯ䗮䘡ᜨ燫憒ȁથ槣哀彠#咕䯦ڂ䱅稲シ祱ɾ兕⦙檴☘䮣箲⺄巩㽴绅挺₷祰 綬崈敒牅戠ᢷ晏琠䦓6☗Ⴈ乃⁹㺤䆅擫禷䭏噼ⓛ妛匉昋Ꭺ㢆屚䙒瑥漌塷䄂⋟㦑匷敖ⱁᤛㄎ摅㸻کૌ㙈Ⳇऎ洔㴼坱⹉戤ୗ⁵繴ഠ嘡ᐓ䫜ᖛ㬪嘔ቊ堂ᔛ怏凋嘥ⷮ榢䁆䦒氫⠮ᐑ烓㗗᷈斊祎ᄢས瀰䨌剪⛂ᬅ堸殤㤍⾮狎䌊猭់朰甩⛚滫㷎㚚殹埸ᤆ庛揺盎杷滏䭿圡⦀㬘Ⓘ毌励✒弟❫䵵爘㷷㎕箎䊄採㮪⦤傏ࠑ仕㳂㚁ซ宧ԉ◣䛛窾伩Ὰ⮨梀渫浣㺐⋨᳝牋缌䗳懛ӟℷ欽㙢傻愆屢㾲粭ऻ嬢烽̇䪥䐶㋆戟獚ᡩ徦⌺乭橶㿬沎⤢掐⬕؋㥨惨祼䂤װ糈დ尦ݠဓ着䚩✌丆Ẉ③濉徫昒䖨ᚰዛᐑ◟䪲⯘歒㚚㠀慑廕㥶炞疻朠皎ᒢ㧚嚽朏᮶ℜ濚ᶀ糹ᅻ䙔玎㋼၉墨¶⪑砰㟇不崿Ȉ䖡眇ඎᨾ殆掑֡㪤傚亝䦳䰕̔佊⇻寗筮懾巜ܽ漥咭ϻ堏䢻R揑䈍浐ៗ簮䏐槑囮䶷淰㙔咻慭屓⎮灕ᣛ䳤崇䯞続棲师⍢珣箚㦏䔣勹㏈䚻焣嵧ㆧ稍㎢枚↮⇳ᄚᲙ粓玷㑠癣癛䀩妴⡊堻䅥 °䀬䞽※ၢዬ⢰፝♟懽渊㻆̡ڐ㲽疿䐯㷽搊怸⺛岑㡤穝悛䤇㫧䏿爭氲㸔篴៓渷嵏㥾笇ඛ戗㜎树㿜嵯羛塜㯩珺ᘑ 繞童猫澗䏁緾ཚྚ㴄㷯Q眯瀑䕟㡟㌝熛䔗砎㤒㿘ᠪȕ榨ަᥛ渠㽺◰⾣瑰㗄ⳮ⟽壛纘ⴚВ杗漀㷿㼾礝棄ڧ㐾濼ഠ羞䆴䐙ުⱜṻ弼杏澨ၧ嫘漏汼條粢ᐦϣ偬Ằ㵯㶁羡綧䘯举塟㢞渢樯Ϧ䞼⅛澮㌰箈᱃擶㤯䎯ᑜᾟȖ搵簚ྃ伸㹨翞煝礧抯孁䩟៝⤒㮻Ͼ䟒ߺḸ:⠟㮰䜋倯ຑ丙ణĚ㼜⏿㯩ྲྀᾀ㻨篑糣燧䴗粃咝⾞刟揷䟔倏⡉ƂҀཕᔳ㋀沾嬻琪ゕ⬿Ꮾ⟟埑兪㸴粷ੈDz╯岿㨨檝䵥䨌吘Е݄梀ɔ築繳櫂❯暾啞奁忸痃ᣠ䏖倔案䊰啖濠傇濛䫵䍞´ᠼ抪㐚⦡ᓹ䞀㍞杏滓浣䋯琹᭝倇ⴞ嵴⡓梬橛喾䚕♉瓑䔇䥱泃嶠≟ㅿ⤝Ⲡ䩃ῖ㲳✌㼉狉揯⏤⦼ണ澙0ਟ㮏侐ƞ㺧ૹ耓妪⁏恾燧樌䚔؆㸿柄煟矰ɢ窖犆儷牏嚾⽝䚛⌗ఀ▓簈怄ᆸ惬䗈ᴷ矆≿媢䦛ᴚᨊ䄙ឲ⽘廁䀆旅火汩⥏䨘ʢ⦞㴖ؙ൛⼥皙㹏䞥礭检᫉⊠ᾥ窝甌㑈堑⿀幱㭑≎ो摷甧ŋ֞䬑湽縺⠢‵䃑Ȝ紌ݏᾛ簄䩡䘘疛欐㘃௷ឲ㓦忕㺐熹ί疒䤎⛞涛ᬘ瘓Ⱃ垽帿永簮௷堛፮嫜㻽祯瘒厗⯰磈䵣㵝札狹⟷畏儏仟⎙䍡พᤴ㠆弧ᒦ稭礩㶃Ჩ䣿姝䎙⇇上䰆㰥庳㳐䪗乻絗笩⳿ៃ䢬᭾琅吒漭徬Ŗ穉缻濷殏ᛡෟ㬦甓§寡䁞漰挋㳺窨ൢᔍ廇㵐凞➘嬗ᘙൌ矈Ę圈慎纋嚻织䮏䓿槟枞缌抣㯠矟㯵怆叚缽翉ᝋ息ቐ凟依漙㻿㰙㞻濞䠿㺀䖼矢哰⧿焼枟ᜑ縖篽㮛澩徟㵞簣猸ᶗ福䞪晭滪䜑Ѓ儜柫⾃῀纟䇲䪻簯刿ঝ㹳嶯Ⳋ䪘㛙埴⚸㻳碕紐玷䌏碝㌿嬛䐞ᥙ 弩㰲À俽坁ㅏ㿿䶛ᣆ㈛ክ愍ឧ⢻恩∁秽啵ӗ簿㩨ʟ㾋搈㕁冟㎨湦ⷡ絃癓潊ô备ڨ䡥橯䞥௮綆恰ô籽拠尋檜⪿ℕ癖ῒ樓吞䄝ㄲࢥⷴ絷峓璇瞩䁤絟㞁㔚娛吀㕍個‒偣ˆ⋴Ұ䠣犛┰府稚搂࿓忺䆢罢✫琇笘༿▐璄漠䰖⯾砄㑩㾖㲃❫紫䋪Ȁⱡ唔㔘සد᠆Ằ弱㖸儵翫目坏敿᳟っଛ爘⽺堁偡ὄ㽲粳糷汯䪁ໞⓂ欛䀫咮㡀㭲ྒ绰傀矨ᇯ揷凟Ν⬛嘖ᰞ廎〄徭㼊罅稳罇竝⋿縊㜞昔ί᠗⚖䛫䀚簽糉㫷漗牔⋞➞ၚ助㰀猫絯ᾭ倵㵤样樏嚗ᓟ果䧅㸜簞ᥗ濌瞈伿᷽仠হ缊䊮㙾❘⢕∶栯䠧ᒮ慓Ὸ禁绉砿䦇䠌⤜ᵦИࠑ殆ᾷ枖↣絞થ爿槈ᢟ盡戟礠䠎Ꮲ䠄㽠⿁ᄃ磧纯挳损済Ԟ筥愣ᴄ倛䘧ュ佑Ƀ義瑹獐㕇䳮撿刘力⠊䨝‚䓌繁粓罬੯箿橸䪟牜傞⍤᠘⿷煕㿯憦剏䋧獓翤ഘ႞礜㭦䰔⠖〔῎䀄署愊䐇絯恿禸ᠡ欞ΐ瞦ⴗ敓忽㿭儋籗炀弿絇炟✝ᆴ琛ࠏ摂怋㽴繵粳⎗窯敐咟朤撣Ḝ⪢汾ῡ忼㽞羭縛籇炞碿峟ஞ∝ᾥ琞ဉ揯㺄罚翃绌み䶨ଞ༟帞伞⾤怅䀏㼡ঝ縪㮇翨䆠禟㈢Ⱀ爖瀓翔考ᄯ竏烠泦ऎ㇎༞ᐚ㈑槴耆耉৳緗禷砿束炟碞戟ᘚ᠔Ხ㿼䑾↮翤ฏ硿痏楊О瘝㾛⦯爞㿥翴罍羷罊㵿稙綟奟㴟䐜渘䠖ᨆ耞翆羅缶椟硏禯磦息穿硇㧱䐘穏窵䂻禇窗算篟福簗禟磲礸ȿ竌㉠ڿ磸䉠֠پ磈⊠ՠܕ䃠҈㮇箻碏硳穀Ճ移简ࠟ硠ࠀڀڔ႓ऀܭ祲䊗䀰Ս䄰ࠀ㢰֗笇窏砷箏篊㫐Ӱۋ橐߰ؐ䋐Րܠ㩬䎨߿祏穖�۹Ɛߠߣ稗穰ݑ⍨ӹぷ䂡㬙⊏ᮐh࠙磼↯᭯硗䏨ߓ秏窰ן笐ֻȷ篊㤈ԸҔ㈸ܠӃ⇯磯秽䫸ܯ窣碇篗穈ԐްؐՀԏ秌⁘׀ٍ变٘ѽ≷竘ٚ桤ӓ禘ݟ祱㫟硋簇祸ࠐ磤Ҥױ䂄ڨࠝ̏;稈ѭ㦸䂄אԹ䂸җ禸ސְڧ簘ۈ݃⌴Ԩף䆍␄Ԅձ⁇笔ቦǔի篤Ч磟箸݄ӈࠓ秈ҔӇ箻檐ǔܓᆬݔߔ٬֛磨ݠޔ۠ѴՈؘۄФШܬ۬ڬۧ禩㍰㠴ؚ䥰㪪´ك䆴Ԙմӄـ秌砼ڄݥ䍼Ԅݼ،ھぜذьܰנܘݴی۴ҳ⍜Ґ㨼٘ظ㠻㥱ɜҹ儢գ砸ļۗ祟礔لؔԗ砬Я筃⎢ں䃼ډ↓㡢آ҂ۂڢԏ僂߆�Ի秨לڐҜּҟ筸簂Ңׂ䍲٢٘ݨ㬈դ؋祒ۤژӏ竢Ѣջ磴جѽ硨㫲ը㨪Ԅגޫ簗ㆪբٟ簛穌ܔٴѸӌѼԜ֬穪єЧ刪٘֒㬂Э冊Ӝߐޔܼ䊼ъܒޜࠒҳ⌊ב⁺ޒ㮪䦊ժܲڒغֲܺܗ硰ֺ֬秺ұ䊚њ䍪㮊գ刚؊ڴк٨示ࠔךՂҳ∦ב⍦Ӫ㣺ٚ樚ߺ߀»祚Ռڜۚؒ٦֬穆֚ղ䄆ۤ䁓戂ńဦ㡆Ȑ䎿䁼揠䉋ɀ䋜䂊䃱ȼ䆁Ѐ䍸䁓愈ֽ㥒ϗᎋጪƵᯡ㤮猋抗͇ɵˇëÃʇ!ƚn磂灗Н¯͚憉¤ᨳ磨ͰǭĴƚʂ冿⋙ͨ㬃Ͳ㠰̲š憀VضƱ0䍨Ͱ̎ࠑ<䃨秠̨ό䏳«䄋息ʬ�Ũ箾ۘૡᄋ抮悥Ċ䍊͌抈�㤃㪐ԃ扠䄫⌮˟HϟʟƬ䎱ʡҠ䅒ǒΒ䂿䌋悴㦡⊗磧折ňƾր̄㨾ќ㬾ހȘ�چ>ٗĘܴ́1Եą㧞خȝs䈠䎞ڪ̞߬㰞шءѡݡ䎝ْ͡Ǒݴ䇓ʑڠ䎦℩关慁ـʝባᅖذ䏀ʁ�ސ㦎ހȤΎ՞Ӎ̖ƨ䌁ھӄ䌖ưáؐ䇉䊥X䌖ȴì䊘ͰI؉۲́ؤʹןȹݨňͲ㧉ՉԹހ̴Ͳ㯁߉Հ̰9ژЁߙƙݔ䇉䏛ɹ֙ݖ݉φƭŜቐㆅƴ穥ԀうΥ䂎ī␙ނȂ͋ˏ䇧ȡ愠 "}">{"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾⩬ᰡ暁∠ᰠ䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭埋ℜঋ殍ᯕ獺䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰 ","results":"ᯡࠣ䄬Ԁ朥ᢠ⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥう᧡㉕ࡉᨨ漡╁Řోⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ气䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䮥怴'ῬჅԠᷲ䙰䦽吆̯籁カ䀦⅚綁℉ᵶ月㨲؊㠼枺㍼ࡸ⦂橻䭪浹⥺澳⣻᭶滹㬾沋筡恠䜣Ⅸ㍠䈢❸ᖠ杶⽙‰᳘⥵恺႒᧚ժ⍩ݝ悙ん暘侙斚澛椘彗戙㼿栘æ≉䵀抳ಐ朡⪹䝞Ⅸ㓄即欤ᢕᧇ㓤Α䰰ǩ₎溠戸±⣄΅°ݙ㔇⛩〱ම楈˖እ祒慹⬺椧撂ùᬶ机ऎ慪箌੧䜪ំ䢆◙磽戣瞚ᦸ䒱ᦛ⽛愛ί漚㾏氛罄ᇦ᥋ᄥ曈ಁ්畬Ц䵠榸ⵋ┠浛ⓩ䃸欈፧䇐ᐸሥ礠溈䎐椻⎐ඕ䙓ᜆ㌢楕惩Ⲕ䁂扸⋔ᴶソ劒ࠤ徧ዮǺ匔妶၅බ༂䭥✦᭛来泵圡ា碽港ૃ晇䪩ᕷ⓺坄ᠧᒶ䁉儦曮䜨想喢ა喖䁨庤拜㠒㩇咷ᔴ履箅桙簿冹绖堭ᤁম䇮ᷧ狈㱘戁ᜭ䒪奇⪹擦哅ᤵ囄㓐旄瓊ំ䀣Ꭹೆ⊅䁓ᆆ嗋ᎅᦛᤇ᳷ᆸ㴅ḅⁿᖄ䁅䠷ˌഎ䧴ᔴヺ毖槼ᢴࣷ呥劲ይၟ媠狆⏧㞞ቍӲ幌⼤㕄櫹ὴᓆ囤嫎ᅘǬ懶㡎叴畝⺯箄ᙯ礠猕廆ㆵ䏤ழ探崬Ꮀٴ▴絏ᆬ罎ㅎ㦺✶㏐㥢㳼⾪অ噪宩糇傇℡堧┛փŪ㭶┘⥉✡塍ᢈ㖙⨼⼘抋ᤶ⫘ቡ捥官ᖳѬⓎႚ⾡㘋眢瀐紼缌⩨㘉௰契䂆☕㈻琼෯纇⌝⩱ù喓睆煙㔲㈠Β灳Δध⑾䢉ᡄ䥇ʱ煁檠ۆᡈӂ೪#䒅㠦碹ቘ⡥棠姕晖┴捭䁀ٱ㨷√ጚ忑̀䈔刬ƨೢ�䲁㪻啉ᄠѰ䖀中爣䀈繊ᦨ偛紧ᙧ撇Ɉ䕆⣲䐱䁁Ⴞㄸ⌦垱䑳Ⴠ撯₦ᙑ匼冖ᛃ᰷̰፦㡖䙪੦磋皡眰凢ӂ⅊抌≁╉₤㶪ç༱吵ᅒᝃᅉ␂ㅆㅖܘ潂䉻႞䥫䥩ᴼ忧絓ୄ䱴▸祭䔉Ġࢬ䧂ᚳ⹚≂⻄犞⟈刦ᓀ䫠嚹⨁፲Ṟ匰ᗄ䖤梅Éᄸ䅮ሠ⹍˚㲇㉹䗬䋨咰I㼺㛬䜢堷㌶⽥⪁䛴枯᳄䦹暶ࢍዒᵃ㍒⊅ᑳ攘凨ⱁ䳬⾶दᷳ㝉匘‡綾⢋㙓䒫㴀ⲹࡷ囪俙籴-ᇐ戥ヤᐢ刭ᝬ廬⧪⩲堩ଡ㫅ಖ晀ш㳞ྖ斵؞̫歃ሱ⥦j㍁ृ⋺Ꭰ䱽䗘循呰䩒ᢶ了㈠纨劻䲹枋╀ഝ刡抬䦷ᱼᛒ囩瓓ဩ旈屈ᣉ搥⼷䡡䂪榣૧燵⥽㤿᷋ લஙᨵ喚◘曌礇斦喫ᰧ੭₴ڈ嘜双峑䳅䃮彋ޥ橵㦷喇哦枬⛿⿵㹠෦告曌ᩍ≖㎙啌✙⠠㵄欂啻Ծ姓槒㏋⭗㥡嘒凊ۡⵕ獷¶奈ⷔ嫹⳧⮜吠ℭ㗚綌甗䫅৺渞击ǘᰓ㟗筶Ϯ儊竩䢽祰Ĝ䧷ⵌ嚺㋉∯↗実ᖖ䢎ૢ氍ࣾ㵻哺柁欽⟴ᦋ唾檌㛳歑㟾囹庪䯏⼗垆㐞棪̍橱翿ᔠ௯Χ劺ූ㮃ㄬû㔆瀾廵欣ࣱ䍰㵊监P粕ჲ哄犏㪹渽䐦ᴴ㯊⣋ڠ欔垈เᅈ䚦᪭桜綆Ꮷ狀ę䢆䠁☭䱨䱾瘻㈎洭乞േᤜ劉箟ㄠ䔜嘨⢾休 䐥史㫧ᷝ䠄殭ᓨ⬑焺勍ḳੑ練㏆⚤熭畫༒油庢桳⋾㍸̇ᚌ它⁎㓽佊涉⇺ᢳ絚珬㣛ẏڜ缕紆㈨⌹嫚᭫ݰÄ泝叧吚⒗ᝐ繏仾剿ưً≔ாᱷ狛ᜯཎ⤋祮䅻√庋ዙ㶅㘆毂᪺旎哱⾕捼㪶忓ࣖ፮㛇如㚚晭笂ⶹ䥌暙帻ೝ㎷ᒲ㟢総㾇登淥婓旾⯾㫗拚囮盍椉汲ṿ䫬斋䐸㯈㝦澉䜝㟎⼟、䩺性庫䳯ᔦ䅔厓盂潮∙沙狸熻岞碚ސ眠皾Ⰰ\"Ḓ植椎᱃溍戄㱳㗒d纮檈俑渠燴⋡ᇇ㷦ⲫ嵓⠔磯ڸ亐擬⫪Ṫ⹚理㤻⩴ᝬ焊䌋䆵ڰ娇痓泹ᇉ㢔ᷨ㎨瀮⮜侎祼昀⸳杞䮽揇Ვ䒴䩝儋竞穎爉巙Ꮮ㻛繖皎笚瀉盽՜啲దᡐ柧⮗叞耎㴁ᛩ矬⧨㰧留ለ碕⟣哺䠿ㄍ✳撳ᐝ弓嗸㽯䴚៑徾媡橕ᎠԲ灻䋙Ẳଖཨ窇伒⤋慳巾仗忇䬆懤効⼧㦏⨄䚛濜᯦屧牸厱管◨⾾ᵞ碫忌㧇䥓ᵷ䳹埊⵿㈒ͭ礿㞛㾃殞⤣咒ㇷ壶㽛穮簒㸯戣亶渉丟䫓㫲砡唆灟嘐囉␜栭罻穛坜ᔈÏ窯ຝፁØ̠㬽缏?祱媍᠏罸樛䱐䠲¼礣䊽ᠽ䃃碀ㄣ碪㾇⊇䌜ᶇ⌮‸Ü溊⮑篿䫌㐰⼷秉䖢☍䜼㥠ᤢ消ᾖ㥋客倿℟嬏徽丅䀸Ĩ㷜㔍ᄙ⡠ଢ⨀⡈㚜∴学ި㾝傹ұ坢ᄆƖᅈㅼ哉ᱭ犀ଢ଼戄您殸㣢䐹煛ࠕᦜ籊帶∙℈姘⏣㾈Ε㦨⧽娹ᑿމǣፆࣲ秠ᝰթ烴ޘ⏜ㄴ㰘㷬་䃪塦䔙ㄺ䣖۷奂խ䞎⡲Ұ氢ニ窘兰咪⤒䕸㇜娰缷㢴Ⳃ稶᜶䞴㹴傡⁴㴣ṍ棾䟴㍣䄴棩∬ⷃ㇁ᤙ⡚ᙽᐰ➈嫬✣ą䤀㥌≂䩄墹䓒㠩⁞䜽厂㬷夅䚋䑂堫ᢳ䒌⳥复䕲ῠܷ⍹䙜㢂䄶û壜㊃ṅ碤ԋṂㄌ儂ࠜⵂా磜ދ僩圸䁟㤋Ṵ碭ⱇ䝥䄲⌎傫客㖂ᔂ䔏䙬嬳狉帲℃圤¿想ۦ䂲䒰䁗䗿凂喁│❠⥥環䂙⩠ၰ咿ᣀ秉䶲榪㢩祵䞲咸擓ਪ⇵ʿ墲☟儂⊰ᑔ恪㐳∳⓱䐪㙲瀯ᔜ䕲屲່㕌₊ءᡄ䒬㩖ᝳ窷撻ܣ䝲窰㔈♺㓳瀃L․僲檆呧◁ೳ㒱൷╚㨳庾甙⮋୨ᨌ璲ᨦ⨡䆽⓰Ѣ㈘憱ഁ⠘張憻椙њ㭱倡�秋ቲᰏ棩䠪ᝲ媮䳬枤ⅲᨱ䒡㦀ὒ榿㚂攂⥤喸Ⲻ旆᭨⦵睘ʁ᱃Ჴἵњ␜ᶱ甅⑦归綵䴘朮⍹綺泹䒇䮠↳泌⍮⧰冩೬䑶㍑禸峹杢⎒㬳拖㙒䌵泀⚘当ްᲯ䔈⇳枽崋晆㡓ⶳℐ枿堜㦽ᓤІ⨒⒮㩔☤⥳ឹᑯ杚ᨒ疶ㅀᔸᰓ媸扫ܾⲳʫ杦㉰倠䊻⑁⁓Ꭾ庌旀㸒ᒩ䋤ᚂ㜌硲摌៦㢫毠捎㘫ᔹ䒍֒⬶崆ⅱ㐫繊拎䖭搲⾌ᙄ䘪ᒎᛰ㞫▾䔟敁⬡ɼዶռ亭剳抧⭂ṱપ瑞ᑌ⽭䩰咍剑ⴂ挵䁍ᛉ⑼᪻ൣឍṴᰭ缯ӱ㝒䩉㊣Ș㠒ᤴ抩چỪ縲㋯◒⸷㉕≊ᕼ㙾紒⎉㕂乽伷ូ㍐ⅰૹ㯦♊䔻猜敏°墦悛㈆ᵪ岿傧Ⓟ∠楱䫁➥㫣Ẽބ坏Ë❋㳌∅㋊禭漪埅⫊䅷⍺啕㍊扷糈昱㈘浸⫖ᘕ㔄ƿ䪶⎲អᾊ⓺ᕈ䷐墪᪶怱㦪㍷᫈ڙ⺪⍶ᬍ⒱㒜好泸檁㮋ᵼ狝ᕵ徊㐆拳噏䇵孲欈堽㣊സᴀ㠽㖋卶㬙⧒ᖑᶺ粼ᗱ䐋⎿㪱䐡⬠署ⲷ喸䐺ໄ杊‸ឪ㝷午㓣↋瑣⍣㑪惸䀤㚐⥊ᒣ愽咾⽓㣴䛈堒ࢻ宴✎禲ຓ㇃澂㠉㍑㓽Ӻ㟢㠫ၿ䛘ᜂ㖺㾷➕㦪徼罙ᝂ⮻☊䋘㗉䍱⡸㪨圽㭂勱䛩㓎ଋ喽⛯औ㇒瓵⮕㝠ණ嫳犻ঠᴠ甾ᚲᨻ⻃勲⫧味䳺汳㜙⠠ૢ⢓༚缴䣱渍䳶䒋巎ᔸ漖壆˅洺⼄塴秌夲⨊擁䀯ᅢ毳ᒔ椾⩯䅼ष篥Ơ䤆努Ꮭ䓩洖庙Ꮣ碌ⳮ稣㏕䥌䐴ఠ㔼ᦀܺ歙彎䚀Վ姈⯄䡵槮痔ᯜ嶵楺䲗㥝嵭榎糈ᠿ⬌檺妪ߍ嫚〄䒉䟇淽楃㔔ᵦ㡇䂠ᑚϛᕴ呾䝀⚢洯⨦䵨嬳㶌⣾猕䕃ẉ䆜檖⛖敂䵞嬀⟜槶槞惗⍻䦯浏Р䡥䡱ǖ焕⿑n䄞堕巗㠞攂�洪澞堭淗昚亖䘕═亸Ꭺ䁗䭙ඐᮂ䘯敬ᣇ䕶擨炋㷈Ἦ猴緘ᬈ奧㷛⠸支�糄䎀Ю柊䪬ᴈ澴#▘㰺⢷٩䷝䂌䦆ㄘ㛥ᄿ䪱Ꮐ�烹䑄㏡椻徉⩉权⤻ㅪ䟄ㄍᛦ㙬䜰ྍⴿ綈㯤埭撋棡䇔㴩匾棷⊔㱁䌺疊玱嗽栉ᇗ岲先癡椒竔䈩∾ᣩ㈃淯㣼堳ᎋᡯ䜬㊕ၨ捧䟾啽㣡❿̰㴶㧥㘺䌌㡹ᠥᐶ碗䅨㟥⸨₸㜡冫渻ၯ䰺廧爥ㄠ䄺㒼⓻ఊ㳈☑壆稭䞭炾忒篺ギᗤざ䃸ذ丆翖槡䩲ƺ೯⍻ऎ㎵ᐪ↊㰮㚼瀾ᰂ巳斸㫚䃶ㇳ樸፲䕖㘠ẻ⮿☸œ憽捌ԑઓ⦻䘬栞❓ָ叞朮㼹➿ⳬ拖㏃猐ᴚ暮㻤纼杦㷤㠲峨枵ஓဣѝ曊易枸掌㬣ྐྵ羛犀ಫ从ᴈទ䰫䮸̕柡㖖妿䳵⳱㸓ᖸ掉ᚚ㽊氳ዮ䚉㴓忬拾ᛡ㼸ᱻ䀶ᚎ㡫㮾ዤ㘉㐓磫狯⯀摼甇䑥㭫徸焧ᚆ䛫判ᛁ㏫悐䫼ᙸ㬺啼⋭䖴ੋᶿ❹䒕㥋౻糩枹㶫₷䬂埁ㄺ䍻⬓䛉⮋㒠õ㫐䇺睥嗶䛘斳睹暉㗎竷䄅痛⸑䵬懔痞祆ỗ厔ⴚ究曚ᨛ炢敖ӕ獂ⱜ眍棑䚯䶔㙖፲䧝ᠲ癔早䳒歉捑䶥楶㧐懜濊悂כ犨䄶曚㽽୮澶瀌粩ⷠⳭൗ㣕⸉䱖摖ᔇ渐浹噔㏝ฐΦ拙ᦆǛ䭜ح⅔僄ػ㝒ᚒ䷠ᖳ⧆ↄ杇寥媢䷠ࣇ߭罌ダ㯱ᒩ沁Y↑㊳橎͎㝴忒䢑⬠ưʼ巇౦瓻䂚㼵ᑠ༈⣝⃨ὡ空寕=渎殶ߕ*伂䫆忙䒓漄欖Σ㸂俾翱ࡄ緍狞斱濘ᑯ溾栖ᖧ縘အ珨墷ρ⒃㆜棗㨤睠ᓂǾ疾渉䨐㲗ࢤᾎ昡㯕咝涴紮䟙䎳澞眯៛庋滾擆࿚繒᳞渗昍⏅枞潮ಛ摆ᵵ䡮䢒Ꭼ㚹瞯燻犣クݧ㚛ㆡ澳ᄗ䟞峺ṉ潆⪔␏ᮥ卮ᒕ␎刉獱㿟締ᱦ䇯㛰瑷⩏ືLᛎ楤ທ௲㣐㊚琊䱉恰៙玢ỉ碯䭪⎴䖉犮㪘ఌḋяಖఀ㭅玑⑱䜚忥懴ణ#㉨䝦涑毭恃嵎ᢛ瞙ᴁ李碜吜徙絯䖜縟暯窝⯃ỵ抽嶒䣖Ỗ犄⮙殶㓏㾯徃痋忏㊘ᯗᾞ棠糀ょᆤʱ屳⦨傆㼰儥⒐昮ྥ昊嘪懋ἤ柒ᯅ 粎矓珧沵暎ொ忱瑏䲘罍矑礛狅ⅈʀ䎲竒ở睰夾綒珙ẽ昘ᣉ㮸ͽ眎冯㮳瀸⾜㒏⁈⸡ᾝ劏岠ϯ碘⦩岱梈纝叐㹵溯ᰨ㏂⅍搦ᤖ尛⻦儿ᤞ缮⍡煎晆⑈ᴵ⻦䞙䰎㾽称垓㰌ẳ爏侐愤捳搏は⠅ᅓ沎ⴘߩ忓搿ᴛ后㰹樾喋᠘ᲃ⇾ⲻ犨慐㩖瞨帽笾➕䯜㱽浿䔚Ⱗ徳筿⾗基㰻揠䜛篜庻浮洙ᑫ㶵殿㒛㞺彣爘弑砈┇滯市Ẋ杷㹽燖卂璩㉦夑䮼䀛栏奚ᰟ屇烏㺒侠巭硏ᄙ俊塷磞ʹ来秄缌䉕熉᯿匓ӭ燘⨑搛修噋盟崜㟆縱泾䨑㤉嵻拏樐尞㶇災吖ῈΛ繒␓Ῑ簷痿倡ῴ㼟ⱐ㠟弛欯㒒垢㴳捿擪ྪ㴋渎㔗➬㼕笅泯ᬝᗢ潍絳盗垞⼚ᜀ㾣ࢯ秹枿ሢ䐓炦䅻綖爮䒬థ 垫繣㩋ྯႜ怒ᔧ羐糉瞛䩞搀澿湾㯏愠犜倯㟼༾㴙癠~䠂瀼䂊昦e潊ແ檡䇺ᙁ̼瀨冞㾛᠇࿈ĥ㤣懇ᮝ㎓ぃᾘˊ挰ⶪ甧䱟抳篒⤳Ꮌ䕠ၗྀ̻炀㰡團場偭庛窐Ⴀ暀稬惻₧⥷ͪא涹〶庭ᩝ䇘ᵿý〖旮䄘糠এ堾䬥吏ᮼț礗渀壀ͱ䑈⭸ސ䘺攣䂮㇎䅩ү⩣产ᣡ㽃̋璇䙡ȿၴ漄㮏懿ѝ㴓寢ᨸŒ२ⵁ凨⦀梖ⅭࠋⳲ❈傧⍎䋠⅌娞ᬙ珑⇋秨ẏ㌢ᔮ䁇㼨䊊༏孂哣稶抿⅝ے⨞燐৻䦕䎜๛忡懚ȻႋṬڏ敐欣嘬䑖悡⒖左盘ᵡ懊䀠J琉ῃ慏ܐᡐ徣Ъᑐ炲䏦ࣿ卐䔧䈹澼懊Ѧ伐紜ᣴ䉊缻࠸ܴᘁ㰛彏҉繿،ᐐ䬜昩с⃐䊀ම⎡捙⟀䒏ĸ棂ሏᚣᗴ恓ポ屐Ⴂ将侧瀴ᢞ慆߰ု㦣Å惸ˡન⻁㩦倁◟ሄ䛛攘ᕃ䗓៤䙐慥⃡䤧᤻硨ȟܼᆀ杂₮呀䣎χڴ⒱痙ᑥᑠ䇞⡷成䦜帶恊䩃⊅ࢰ椥縶ᢒ儼䚵源睂᪫塍㈱熭ဏ䃠སఏ悂ᄾӰ楒֝⢬㉛焃ȵⶱ汧䨸瑷መ䛴ᰮႂ傭橌扤掁ຉౡཤ䐷匦ㆶ䟙䝈䙃〉扌僨͵㐱ᝥ吵橆㈑䤆ᚸ弨⸬⨬⡬捇炌ⷡ櫥儴垨懖䔶ᅐ槢ㆫ⩝䄘拇枨㫑ಊ嬴沐兖ᄃ䳸剂璆乗ᢾ⨓ବ㌱䣧ହᢟㆅ䟊ᑘ淹玩橄⽯গୠ␠Ა燦ᒗ㙔䐾᪘䌃▦婋壥⌍ಀ╱显Ⲗ熯悾၈犃ࠠ繒㤆䡯়㿱嶺撈㲎憽䐤ᾘ侃¨珺ナ䌧ྸ㠼翥ጿ岄撨◶ᭂୀఠŚ䣓⎃⎗巑ყ儼岁㇋䜖ᐨ湂⾪湞Ҫ㤐䩢㐮瘈ソ璋幬ʛ泤俜䲨ᙛ墲ዀ两㎑㡇䄼ܸヌ⟦⡄噘䥰⨱桓捫狸❊ᠠⒽ㱤⣗䞡ᄸ玜殫癔ཾቴคⳊ煄㔩粒ਕ䤉ႈ歭◷㽷ⓟ⏐䴐㏤⒥冁佐㇒䙉႐䐲屩䓲扈䰂⭩ⱨ䲻㊍ও她Ḅ妲桬ਲ嵞糓েັ僇爾扱়Ⓣᩤ琲享䙊䔍㡂䰿凡Ⴥ励㋟⇥䈊ॄ槃ᙬ䑻ᓨ懰ϒ⫱棆ਲ屼⧼➱ᬤ暲在䚸墊䥊㟩㫒檑⥦❔䲷㱃皕䗷哖፣࣊㢩⫄岰䪌㇏䝅ᤜཱི擒繆㓑▂睫䜰狢दઉ媫◒禙礅፪ྪ➩睅檸⑽⸻⟒˔摼⏣╳㓫卹ᖫ䔤ࠣ䬢㑢≘⚘䲷⏳佩浘ヅ፹ഺ⨑畇ຳら槶桝ႜᏲ♂嵀怺嗡䬚㼉毆圭⢺糓䝥䈔糀┶絞⣪刮今ⷩ嫇ƹ呶�敃ᔬ䱒⓪桚D䷥າⱼɢ怩䙧८⠝ᄈ恓磬屄卉䲐⮹Ҙ䞠傾⧏ᓂңش哜戼䦄⡁e䚴㩻ᥜ䟵ᰮ࣓糭㕎䚅㋥东⾤〡㔡㮡窋⚊⏌珀竪䕈㒻⊹䧦㙹᫇ᐰ⚋出朋႗㲄盪᭞ླྀೠұy㔉刎毛娒❙湴姓筩䭀೪䏍來ス笥嶹尾䦔⒀⤼晙8椛るˆ㴑㟆♤亗堹廲罨存Ჸ፣䡶⎹䠂㎲乻ଅ暁˳㍨ڦ㷥┽䑒凱仙ͣ䒼篟砬擥Ẍ傒⳩݂炲珣丅ộ㜅᮳㓛㋍曩Ỽ䡬㙀䘨彁㵝癨Ȿ禘玺㙾㧲柺Ꭸ幓䗨噂᩹玈ើ⽞䘇枿ҿᐴ䂛ᦝふ⟯㣩㏣⟙万Ἷ᙮禫ᫌ牄濫⅘䉙懬仆⌑䦳㾽㹭燙朝Ờ搃㷪岷牉搡㸙㵒恶䊄Dᕄ耒䦒䃻᳒卷䴡⤁瀶Ὰ暖福䙧↢淔獞嵿狳䨶ⳤᓠ⡰摪禤✭᬴䆒၌╒㔞旁㉐㷤掹焷ԩ斨䞓竭䚰⋉獛䪁㯙ง⌰ⅴդᖀق椒㖪用⌉玧痓䝡ᒅ瓮殣儚ր壢䂓矮䣄壇猨⪺ぼശらㅬ抜勏ࢪ㼵壖ґɅ䤡䄇౾岌䗮䟨吨厫癏䙶е熼⢕Ԑ⢠怨Ⳁ〮ᙬ䘲䑪幐䣐拐௹ἷ䱵ኮᄁᙤ屏⼪ㅌ擎ዠ戁佇䠆䨘ᴈ未昽䜍Ꭲ勂硉䣕ዄ剘ⷛ繹ᬅ┫⟚ᥘᬡ⪤瘯哮䩹܉㸐ҵ垻䆒▕ᙠ嚲捫卪䗩烎䪚⪦㚅Ʒ晴⥻灻❚Ơ㼑ધ‸恡䄚⡐ᖅᗅ匮䁆攣䄌巠ル啈㹌㊳⢉㏩⚵⌀㦙㱧ᒼ巒滫㜬㳌䡣䩖⽦⸅玵ੲ䒪ؙ␦ᒷᑽÈ峝拃ஊ⧙㻅瘷湽ᥨ礀咜墪樒㗫炥䢄㱯瓁㔥甅ᑡ䖅繎ᓿᜂ哓⍊䙆䬎ⱶ⊼籵ㅳ慿䦳ჲ嗴弩ⷨ粲泴憅◉稷瑶ʄᕩᖲ嘂汋ᑪ䳙տ䯃俅⥤乵柝妀Ƃ┝۪⽮⫷䑭䡑⒅᪷ᕥᖐ啲宖ዋ䫃⪭⦸哨ሀᕵ兺䲼κ傀⫋ᕉ絏䫲䶒㓥㤷剴ҍ嗊埢昊擙俓㋂⤖䓗䈡Ⅹ扵澿敫嘃ኔ愒Ŵ瘼⫖労⎭㩵㐊紼䂄绉咦堌瘪仌櫀⫕እ⤒⽵غᠦ䵨า喸䦺䊓稓嫁㴗㱍⢥⒵㳶⍷ᙹ䕂呑Ƥ䎽廊繆嫧䕹Ꮉ㸐䪠ሯ㎠疽䄮壺碋仌ᵊ洗⯻ⳬᦠ▶ݼᶍ懃垮兣⹔lj半ㅪ↩㠥ᳵ᭵㦞㗎囼寊榓挱滁ᬙᕏ⡮ំ㶻纽申垃ᄜ磪汎૨畁䤙⤑⩡⤩嵺ֆሞ喺憢應㻓抢檕⤝㣕䥣÷ź䲐㗁ᢦ䆠╊嫎ẟ櫂砅䇵Ⲅ䚲慪╰㔶庚嘡䢉㓋碲ᨲပ䶺煥㑕ઈ㕲䕦琠咥凙竼⽅㸕䉖捭ඍ䎞憭༻䲋燁機橳ǁ-屵õ䷔嘎娺䈋Ꮞ㛚㫍率ⴝ㢭楕夫፻ૂ㚉嵊怋瀠ਹ⠩ᯈⱠὭ㹲撶㺏姀㑉带瑋嫌燆⋬汓㋭㩶፵፡䴶㘉啨ண窥⣇⍟殜沼ᱥ䇇啹㦄শ擉奒媻ᦤא桟ᩢ澬乍癃˴溘䚚景掮㇓墌㍃招ᭀ梓⛹⫑㋰癦ᩅ㚩ᕘ熺䣤ۅ捄⯫˔⚽ͱඹ䅾ᜆ崃勊ባẘ毑⸥⠩濧摡呏ⷼ囘历嬺ႉỐ嫧᮪樻⒍狷峸᭯ⷲ啝ᄅᕺ糱媩⼻㦥癗泼歷䚍喚瑸➈❜Ὄ⇀ٮ⩾穖捩㮕淾拑埖擺凈楈嚨栾槁桩㻳㭫幖ᇐౢᝀ忲㨪္懶濵嫨悖䇱Xᷭ楹坶扪反捍欈媀櫠࠽湢懿މ涚ㆃ刮堠愈䏁Ტ㮁槱䲽⊖嚶喏ᖧ呥塼慺懭㩒仇冇グୈ懵❴此垅愍珆今䮓⩝◕᧷出歱⠢痣呎䙕洉珘慮㯑漇㬤⿊µݢ嶊睝啂繺厈ᇆ㚦劅檨᭽桩㗳囒嵀璗✠㲓構巋攸㯍淗泵䋺ឝ᷌ᘽ墎灘攊㯏໕ᦝ棎䛽極䧳䑑ᴨ痻凎婝∏ߖ囻玌沋㽽䚔杬ᶁ痣剮䝺㸳⟖Ỳ㪓浺㊞ᤗ⧳䭷㤭㜾圖偒䴊喨廖㰓梕ࣝ䖔惏㞄⌙癗収妛挊䗒䫉㨻殷Ⱁ引ᗻ犣㷆瘷嫾槛䌌㫎伇ሹ欗␍ᾕ䟳嚹崫璔ᬁౚ昆ᠽ䦕㩌介㨽沗培徛㵰噇兾琓㹎䯏㻿橿⌝ตⲄὬᷞ㑳儞类ࠈ䛙⛔㯛氾ⲽ䠗⿲ރ絞炧䒯椗槃མ章梻⽽ᐕ孳୨Àഠ㼦稺缀ₑʶ⃭戥べḗ毎䃤瘏碰ភ㠜攕翢Ὂ̠ࢇ䅝猖孺卦ḓ嗀㮚ⷢ琸ᚾ⅐慶甑䖣仚䋻❨僤س滏Ħ搪ႂ䃽㵨ắ岣䠯℄嶣摈⫡眅氽痾ॴ檔ॣ丬䗴₀㻜༧槏ᢝᔖࢀñވ≣খ㿺瑪䏅嗑ↁ䌠䞭ⷣƧ毿Ꮠ眣Ḯ䀏愅䩺稈䀟㻜㐪俙䴜᮳溡㐂䤲柯א⏁ᙸ㟮斊ᄸ俞⣜۔ᵀ㷣崭耉ྐྵͦಗ弞樊ⶌཕ∘撴᧑㌨笪⠋ȡ⎶ࣤ㐐屧⸹Ᏸ䆯ᤰ柣䕕䗱䤔涓瑳䱱䰛傳㒐㺻३ţ┾⤖翃椝ࢊ巡暧ᔹ߰⇯ٲ᱐矣㱕彻ή㴱刬㎲䖋ᲁ㘾䒙иʹᏦⶮぶ᭻崺໋漱宧搪䲎凣㶆Ώ⧍棴婛䷎掌⥟䷑䦕䭒刭╲䭃Դᘃ周ࢵ惥⎜൴ぁ䵦ᢞ冪ݛ椟ⴕ䈄⡹磺䪮撜㘑壄Ἴ䀱൨䜰ڤ礳先䯸⡿揺ུ㒱灇常岁冯㰜ᡸ敝ũᅜ瑚᪓♲㢭⭄⒣璛㺡嫽乾➵甮䙔㤘捚༰㥠䡆䒻ʉ冣㮎Ẻ↳宊䕑ܩ⛭晪㱑汦⸿粂㇀➙᱄校扯⟹睭掫౺ⵉ粄ڧ䁶Ζ敠敤縠⩢ൖ⣸ㅘ䱄㪑浦粹⪀⧴㭒ᩛⒶͮ䍭ӑ叀㏨⍢㚕⢾巋槓⟑᮴眳䁯煔唕Ȝ侨㥡榧Ⴞᷓ樜痗ᆬ洵䪒䌡ౙ敦䵆㤸Ủ㮈ᲃ䦯縅ἄ档⼮䍛㔘㐀䱚㸎縤榹⚌缪昳ᥜ㙣䳔燫ჿ只砦㦉擧嚾⪌↷嫀Ჰ泣拔᭑愜㋕䶍氅ਃⲣӹ廅१ᳺ㧣ㆮ獗䓯ᐚಖ㚱刚ᆺ矊᧞曧ᦩ䰑⧭把剰Dॏ⍆翬䧑�ㅗ汜湾᧮㥗ᳰ㌫䰶㪱旧⾉皝㧻᳜ؗ燾作沧猠睔䩨ǐ/墂紋欠夛䍓緵㍑㓩掍䰲㡹枇䘽⺂ৌ䝽ࠢ璣Ⴍ㼶䋰௺䬸༣ፆ儉ᠥ̿䟹Ả怳䒯潝ᤈᏥ个〱娛ѿᵷֱᭉ畤抡䩒泬ப乎㼥猆瀏媙凭⛃暂楍䪛め䉽㗷䴆㠹礷禼册晬᭼攫⫑师㻘䬨礷ǐ䨆⚋ឹ嵩᠐ᭂ櫳㡎哿䐓ಊ㹩癥ⱚ斶㘘ಀ砫癴瀼瑖Дൖ㜟ܷٽ䆄ᦳᜍᲫ㤫䝬⍡䁣䭶㈵嶶丽⊆䅨埼孛叫կ͝挏䯴】㑉悷ခ⇌ለ◂嬨柼㠢䛅ࠪセ揾別瑹ᡠᖈ嗛㦂堯䜓楍独揆ⷬ奇ļ㼼嗬䭊塻⺬໎ハ瘙⺄壤ᑡ縢㟟列斚帺璋絏๕狷ଯ乕㠅䴚ᙻ㖖ۡ堁棄ҋ劬Ӿ嫴毮ੱ廕筼䑠א瘚痛ƺ殳秮擞㣱㌪ⵁ㩹烆歸ᖈ瘓垞浚礋㳌掳笕㸕歇笽粞ᗜ曮᧔愫璮勛⋧喐䀕皻ヺळ痬䮕᥊槫ٗ囒䛥毗䳩㨭匆侾皒ᨅ棦筳᷌䛲᭱ƶྫ㉓捹疝㘊㟋㎂糳悍⻛䛯ఘ湉〵妇㞅疑䶨ჾ塊羻獊糋櫥㫅榞ࣞ濷歿⠧簦โ撃剌ዑ⋭氀泎㉹䂷ᙾάⷩ愅屿⥍ᦍ痙ᛪ結氵㹘棁卹㆝㖫㛍廊焃⥎孟䯗⹁㧍婷嫺䞦渘䌍孆獅宏盜楏⭒ಐ㵍䅶⇽痹丟➇ᯊ篫Ⓨᛒ䬟䬯⿅㻵競ᇹⲑ㜀砄ᰜ澤廍㒩ᰪੲ汮㐦竷移㈾ⷌ㞃庖浻幌凴件寋⼱婽柇ͬ䜆瘫壎犻㌎寛ۑ㯆㒗㹽琡ᢼ⦸皽屪憋⩍滞直ᮓ喻㦲侗狾功⒲瘪婾碛ᅗ囙ㆶ㊁溄叝䋖ొΜ㷮ᝇ妖絻㹏毑眃㯑㞏㿃ᮗ⯸ྀ喣盗塊滓缎竘泶Ꮽ䲿㝕娖㗼玞疦盯洞悓㾎᧬᳡氆濤ን琯⸭䑊ᶿ瞊墾畻ゎ比厄ᯍⲠ縍簯㍬㾗喫㝿峩≦⩁ҭ㛡⭄ᷣ㢣䞷㿹⮚痔༠㶾欧梎站⇹ަ汰珒椮ᬽ㖳掀㹁漼樽招⇨ᰍ䲓㓵嗦䨎ㄞ㷶㤁灧∽∢㱤ޱ渏㳃䍘忽ྜྷ䗱弱祋ᨌ棓ሌΒỈ熽絖ᑜ椒π眮应斖ဎ沒㓸烢ᳵ㤍樗⡛排␇朩尪杻䜾䵯ܓ殖ᰭ㜝䀢ɜ㎬Ꮇ塒溧皌ಖ盱䝋⾀稳䟽Ŝ擔䇅ํ嫺籇ⲽ淝续ߨῘ罣枮䭿⪝皴皾怖繁沾ו⨎߹ṳ㸜䩥慚㔄繈俓ᦩ汧捌Ꮨ㈆ݩ᳐绕歯䙷㞀嗁亴㥸⮝浌矶ᜂ慝ߔ糍坮ൾ侁Ꮮ俪㴖瞻ᦎ暐缎╪წ畤ዣᓹ囜Ꮓ倆㶆漓押⒚⨉ᐝỨ篕枋⎀嗃佉嶂岧仌ᣏ㛧⟓⻤翃佮⭚徎㶳བ䀃⒇瞿睋懳栅熏ಓ呏㵍ᴗ␓伂㰙戻�ಓ⃢簀盢皳晏喥瓒䷥த⽱悷㴶ǒ⋹杘漜糓䩏䭻ⴆ綬⾩㻥憷籿志⛹Ⰻⶊ׃刖擘⌂䰎仉㣶煇婿ኙ䥧កẢ田⣎ਸ䌓ዱ怫梑籛⯒䇥树ὲ癳斛歝➁⯞⧑㶵楧ᠡ堥ࡊ䐊璋瑧祙ऐ叟癜㳙煛᩼㖗☏⯆崄㸣珏ᘼ厞億䌛嶅硜䏎娴嗱❨怒禝総⠈ങ瘟⾊㼩㿷䪏ඟᘆ╙౺笃杮穛猞☟佣㦠紷㿏≞Ǿ⏲嵤=啗㪥䄬㘜ᙠ᧡燑䮏倬⸇滅െ紳矯ୟ䞘ᯚ睓㻀橽ȼ緓⸑⣅徂瑻澎ᠢ⤜ᥐ恃׆糗怊竒᷸眡彺狋牎˝ⴁ氁⻂ڽ瘳瀽垔㐧坴ᤚ炦懷曰㜋珫圱㳅絗㕿⺔ᘘ㠙ᝐ澣缏ᥙ༸ǩ溍墝焽射ᚚ䷲枇幎窫䷮䃟ᮅ篌箝䀝法┿勏❔ᐁᶡ窘䟧㏙納㟯㽒猗宽א㑔࿄㛾窧砾笍ᡍᛈ⺹焋㱞愜淴筿岦绋墎⢟擘䟈濹⛧ˌ㋿෴㞈狭住畹㜜䟖潈竭珗痏ǡ窧Ṳ֍窯ౣ攝䠈盍㮣琗џ㾞淴䍮㜍㙇盷拜䨐᷼癑岂渇嗾甙稛睇忡熝漾⼊簝ẇ哣礻䙎⧝紎筌㱙碝孆䫿ጋ䟒Ḵ磃糯⩝羜䜞珸彙瓃殶䘡緝⎰怞楃搗湝㴖㏲༶㽱瘝⌧ᆚ䜂ះ孉夫籇䳟憛ᐉဇ激磱匏㺞朝㘌帴㩫淼籾濄☍窦㿙眽枿⚘愇簄Ἔ碵盏瀼疰Ⱛ杻Ỷ矻庾瘈㮼廼㮽桗ṟᬔ吏㏤汵㯷意檙娏嘝俈∻歯౼⯗另澕㺑烷繿ଁ៖廖缡毛˾ぢ旤眳⸬秫殾揽昚៦帪祄繏拜Ԛᨃ㐀᾽綃皾濼䢥᠕ྲྀ煫箏篟ടᏳ⾥㳕碗䥿㾜渨တ༡罫惗☇䊜䟨潉庣猷硟侙㖗簈㽚塞㳏撜㌕⓶⽄緃瓻䏾箚礀䷅វ㬖惋౯㆘柦【䷜㋧瑆ࢿᐘ篾⻡窛浳Ὗ礝掉⿌缬磗䝟⺦漂Ᏼ伔絕捇⺟㇑珵ί᳝硏䪿佼ᬎ〒待笩犻岼箒⸐瀊ḋ竗呾ᤜ㸟㟂彵立ௗ窾䛒㟴㟦翭禳䫑笑攅濈絭稇猿㺝䳓䠋⾘縶缏洽恞泜ᡷ㿛娈䒤㌓ཐ⏠涙湧级ყ䄝ฎ⠏㹍粧瘏↟埐倔㿸弿Կ伮㙄ਹ桞垪姱壟犙㫙砂张έ痭犗䡪耚弆◟㌜⦾⟁ݦ佗硻䰯猚垟綦་稡笛㐔Ⱇ瀎ލ繯畻擙㸞උ堒耇糄᷏溉㦖珮濵漯糏忞儚䯂㾥繚笜℟ᘞ᠙濦歕Ἀ᳟曶功『瞴缒総枟ϖ爟怕罕ᶿ漟瓷栝䉾摱⁖婿承堟㗀\"Лᖗซ௲㞿༮滑喛笠ਠ㐟အീ耘/ ⎴䎢繅籐Ԕドⵇ䤧О䪜候涖䀼古䭏㽼Şսᩰঐ➠⺟ঞ縼㸚ᠯ䤈㷨枷従㹃粸㫟疠ዠ㪟㼮琝ౢ᠖〾➨₍⽖ȕ㳗碴畀၏䘠毂ᐜᒣЪ›ၒ䠹罸ഓ縎㩧哛桮͠綊ផ嚉⃔䠴Ὼ✬繶紙ࢷ煙泀㰽⚡⏤ᐛד㐋巩⹏㼧ǿഏ礈焧懠⥿ಡᖜ爤⠩᠊灚㿀ℓ纼䂊ሠཇ䨰ⷠ淾༢䐥世砺お㟋玀㠳終ݯ畨ẟ傏Ꮮᄢ䮛㨲䀯㟹ῚńȲְົ沰㟟♡Μ皓ᢡῲ偽㜦Ȅ稀ࠟ眳濽䊟㍡လሦ㠖ᠻ㗤傌䄒ĶʺӀठᰍ够ᰡ憢ࠧ䀗⠲恌揘₭໓ˠئ畝椠∿≡⊍攤昨縆ᡓ潪㠵˖㧬ࢹ浿垏ㅡ┥ሯ息塙㟖杵䚕Ȯ甴嬠祜䞣縘ਨ吇ࡔ炂ཽ纹縄ܗ疘ᕟ䚠䦞c㐘耐䰿翸ₓ愐䬀䍷笼રᯰⴀ罡㊣ᜧဩ截䁉₀兴∈䋷Ƣᶈᗀ厡媄墧焯圀⁀双䇻粜Ԝཐᇐ⢀幁㇁⌦ῗ㐾ъぱ㽘Ʀ屳�⋔ڸᇫ₊婤䀦㤯㡥9堻ま←䊚ۊ瑳源㶀䩁⚢䊧㤫㸨࢜僞嚪䏶⡆タ椏䫀峡浢ദᘫฌ塋ģ̉ӯ玐◕彀晁⼝啙渒㰃翲᮴ჯхӺ犴ḇ哰牁亄䴦⎖堲瑎䧔惻⇘ᰩވ໗䁛ᯁ秽ⷙ∱㡇桥僑䊊Ӣ€᷻净呠㠨䁓㈪昰㷬䢅圪⅕糉ؔଔἸ◼⾞峣吚⬩考巬ᢖ䔮ⅱ䉀ܺท挟忿ᰞ䅣吘ඐ昶懧疻繝䈡媆㙞樀⣐䦡䑣▦攨☰ᱟ䁷ݘ㜇綹ᇬࡼႈ㕟✡栝圹嬭瀾➩㢕䂥戇紕笊ᩨ㷠䜾ᇢ✧ଯำ悀惤慍ϊۼ୬ᮏ䶏Ԟ⤙䷳怣䰲籌;焅憯緯ޜඌ厐暁ૡ⾧䲗ز硻烼↟紆ݔಌᒈ⟿㍶翣㼧簯刽Ʌ⢔Ⴆℴ㖧灞્澈❰癡ǽ硧帮琊᱁ࡿ焕愠⌞ҷ瑂Ὲ㫠䴱㻽ȥ媒䈸戮ѩ伤ᅲ᷀པዤ㴨䬱屢づⅆᄰ埬硸焒ᇲᲘձ࿄᧸ヨသ㏌㈘煱桎⒋ࣾ㼉糶׳灬ጕ吨綁‣䩦ᢨ刪ొ㎠津Ǘ緂ҾౌቄⲨ瓁㣣Ꭷ䬬堶叺㿆佨㓚ॱᯝ悢潆僠睡睢㴬帶㑕冫䣠䨦জ僣☪ʎ䴣ᦎ⍂儊䊫戮ੁ䉗焂ǟ䏌䑮ࣲუݹⱱ䰰ᅥ壁䔷.ᑺ漼嶤ࢆ坪᮴㞰纡⒕撦ਭᄱ瑎ឿ䤏↉⋢䖵ቴト刂˃Ⰲ昃凈⑊ㄫ⢮儼䈔理成㊰梱擂略䬯౫橒䡇⤆冁⌚䛮⌈䋴⣘ᕀⵡ⣻礨婛䩊梵ᆉ糘н癢ᓑ厈䫱滍冀મⴽ婑㒋塴♙⊖䛎ໄᒤ㚰䕘ᯃ傰溬崻к棍樻⋢䒝ේἰ⌐䏱⹂佤媭紲穄ಉɗ凙⏻䯘Ꮜ၅и緐簣䞤攐夿ц和ゴ兜氺䟝ࡦ᭔㬸䐠ⱂ籀પ⼠爦挫⤂㆐岤䘯眒ጸ㖀䳁哃፥䊯ጻ䙗ᑳᣨㆥⲔ牊ɜ俽䃈枘㣨崦伭⌳牖咀ᇗ゙䒓䆭ᱸ䖘ߨⅦ㚫₯㘡ᤙㄸĵ䘝ଘᙔ⑸統ڃㅦ圇模1坆ଵ㈚扈凫ପᲀჺ㫪劃曦ⶭ牠䩓灲⣿ᅺ扆䕩↊ᆌ╊㚱㢂㛤㶭ӂ橒๙㰳烶掂䠛࢛仌ㇸ烑ੂݧǠᔲ๐ᱸᣐ凑抓墪ަᜠظ呱㒘է殴⌶㉙⣫ᆈ掉䓹࿆ᬌ⠈䇀㰼⦦㎫癌ᑴ兀燙⎋䟻ऺᖄ⧸撑䟂拤媨㜻䣣岉夎䙍⋗㇐ϖᱴ㇈熠ȃΦ⃖า䙒⡰夔㈃⎌䔋ൊቜ垑戃⏧⮭䔼䃳Ɋ籧ỽ⏞䟏ࣧ䗜◯⥎ผ˥➩匽䟹汼碲熛抱瀿ຆᴨ✘忾笔䀐組៌繝楃㤊凳挫䒃ಚ榮丘炞缕翧䆔Ϗ⫵যἯ爙拟䞿ඎᐬ㜌㠩磨㴘ⳁ翤簾汞༥ᅛ痨壀䢖㊘畑ঢ়忦枮᜶犹ʊӖ㩄ች䧢ល䗷ત䐩䆂柤䴬Ⴙ䙌琭Ԙ搬È≎ূ䞘䛼串懦䚩㜾ቃ㢋兖ॴ槁Ⴈ䭱⟢ᑰഩ䨘剄ᑃ炼湂ᲀ䓪ᅵㆄⓧ䞬䫂⇴ᒩ儲㉆硭傺㹟ʔӅॱ扉憈䫼椝哤擘◩㥦圄❮䀦ഴₕⅽ⎁䕋䋑ᚃ囤綩䜳牄ᢹ扔Ⱬ屷ॖሧ�䤴ዦ嗳i䤱湅㔠㢲क़⛖ᱷঢ়巢⨁琄ᘔ㊄㦔⸡㥤ቯ刎牕溤磜熔ሬ䣞ᑢ㊼㱩ዽॆ㇠憌摔剥を䦿䍌⟄䰊愈ཀ箒曡榢炴䵵扵‴礻R㋂ྊ傈掎ቃ၇桩㘳ŏ技屎䧼ᖺ⟻։ၒ㌦㓩⚳㵇晭囇ु劂倾㷋Ƽ坏欂㎄湱١㝄匾^Ѻ䣚ㅬፄᐌ伄➄䧩㝅㙪奝㊌ࡦ䨝ԫ㧊ȯ⡜ⷀ勩侳䶣ⷲ⼳䅏ኞ䒵䅞ቿ᩿࿐〒▏⁉ᾳỤ屨㒽楖ગ撣⃜䣾✅༉ឰ⪠嘡㾲䣄晩珇⁚䂉擅䆌≎┷ᴪ㼴狩ᱳ旦港粽䕈䪌ℬ⦝㳉官杬ො㧤壘檳ᰡ奯㈡敐籰焎⹇挐➢䱉ᅒ㭸痩ڲॆྦྷ犱嘦炂浔䨏ኅ⟒侵ὲ㸄圠涄焈幪湫偵抆哢擻Ꭾ੦ᡠ㐴棉曣ࡤ╩㬵╃⪇M⥦厖▤䢉ႊ㭴緩怳䐐祩ⲿ楓璀സ⑾剺┚䬑ᔢ㱴冩㜃繇╫ᒸ൙掹縠榓ኣⓒ䡙䫸准➲ⳤ卩ኸ㑌䩾棫㻐ቃ⟜䩭ᐌ㧴䆉害䧇六䃥畘䈫湕℀甖♦䧉ᕺₐඉ㔲ڬ缶᥊橸㓜楳ᐋ✒䲍ᠪ㛔熉ಲ敇筮㚾啗ᑣC⺄䈄䠕劧Ⓤ⊔唉້ⷄ䙯撶ᕜ㉷㓩䥲叾♮䵄ǵሄ䍩ᷳ叇䝫ᤂ娱檎哜⨏፶犾䧵ኊ❘姉㛳⍄੯⺻煒⪍唋লᇏ⟚䱹ჲ⬔姀㏲ễ硧亵࠵橦歔匍䲂ئ⽤䗉癃幚樔劲⥅檝哣⥰㎦竦乣ᤦ㊰ᠹᙲ壄⨅✾͓ᓌ燡剛⒑ಥᱲ⠬帹ቒ䏄㹭䲰⍗ڗԵ廱同㢔䷈ጪ㚄彩ᣳ䯇ҭ⺹㕜䙯䝤ᥴ㊸暑䵹Ḛ㸄牉兒ৄ⭩纱ैቴⓂ榚厄摕枳ᙺⲘ䞱岲࿅磫䆳⟻䷏磗榎፴收䣣ᦚ嶩Ւ囦ᣮⲵ䥝剷ᒬЬ厊ⓠй㋈嚹び粇惫榱⧫㩱ഋᥩᏛ⥴仅Ᏺ⛬爉㱓⏄怤ິ卂♡ᔐ妣卓Ⓨယᙄ☔䷉冇᙭䖶兟㩺Ⲿ䤹㎯╆䭣ᤴ㙟ᴉ㓳₇僩熵♚ᡳ瓮槩㋁⛅䷪ᾶ㬬稹ⳓ疆䭨ᖺୄ⚗唔愃巳䜟☳ᄈ粉⻓⒅⫨র䍟♽ⲯ䤣㋘敱Է抸⿌柩ᙒء㞑䦺㍅⚙䴟榤㌬柍䧝᱖ⶔ畹䊇䉫ㅇ㚍ೠ䧻㋟ⓒ䡩ᬶ⮸嬹罳㷄䷱Ⴄ浂ᙰ折奟䐘♈䧋ᥦ㋔叹dz⾇㊳㭘穢⓳奱㎧⓴䵛ㅈ䟹ᨂ䕆㶹݀ᳫ奋㎜攅丛፺㜌嶹⪨ǩ䆹⭏㚈泏粜旱䲛ᵺ☌碹㒒礥Ǫ嶶⥎ᒹ榸ඬ䖚䢇ᾨᵬ乩慳㡄২离十徽ᝀᤩዹ敏੧Ὦ㔴筙㳓◇ת㎰烰丩ⴉ㧛㎙柷瘡洭䠬憉熒⌇ဗ䮱坉ᲀ峒䦍㍳䡗ᔮ⇸䱙Ȳ焇䛫殳⥘溈崋㦭㊿ԝ䣇厌痹ಒᆅ༫庺獅㪛䲽᧪狧立䲗ᴖ㧼洹垒伄ֲᷪ寶⪉呮⥝㍱ゑ䰅ᴾぴ礑⺓曄秭箺យ妱獵☄ဧ᥆⅜䃉盓榅差二ⲯ㥧搏竇䪌Ế㮠傩ቹ㤆䯫常啙幸㴃榳剝䜎䦷᩵孥⮩⼓歈篬⮿⽟㒘㒾槻勴术䷃ᡞⵐㄙ䓳◆楬涴䵉㺞᳚稄功䞙䡓ዞ⦴嵉㜒ᭆ澼㵜皝䓵稅牯敤䵿⧘瞩僲徇懭வ♵粠㤷猩⟆Ȑ⢺㭅㑩兣柅滫⮽罓扺紓䥙勬ޖ䵇ၲ坈倥ፓ疆I䒰婕洛प猭晟䲩ᘒ⠴䝙̣᪇㷭䆱彑䊅峃奯珶擀⦠咡Ⅼ仙悒故Oឰ䥚ƙⳓ䧹勷Ҏ䶝ᅖ⺢簥ၽƇᕮ偱惘窟羉稅琘ᔾ丠員㼈痉嫒䂅ы溵坁剴䋽㤮㊈ᑾ仇ᐞ㑄瘙盲⎆㳯玾ῡ˺ᦘ㍜䫹ᣁ䀜䥹稪䍅ྕ熳睟ť峍礳㊳❠⠧ᾁ㞢喹r嵠ด䴄⭋泜㳠⧿ⷃ炨ᨡ㵨䐙㒒⣆碤G僃噯䌗ק独杀⨿᱁㴜汥琇ы⡸結了䊵㨓沠旟伏᪱㘜剥⨒䟄奩ƶ㽉←᧒璯栘ⷺ᳡㼜愥䱓ۄ忩䡱͉共粷֙˒⚍䯣ᗱ⛂己ዢж汏䶹棉ት᳒㥽੪ᙴ⣠弪㎌䠹刪శ䥨ѷ⣀癣⋶䖐畨ᐣ䮸奡⺼䵩䕓攵ר暰壋ᩲ拑Ռੲ敻丅ᲆ㛼日䭓࠶❨ᨩ䕫碙㴛䖐ľᖀ⣊ၸ㛜䠥斫ʆ噈⺰磓縢ᔎ⤧卷㫜Ⱔ啡⛄拹滓Ḷ竫䚽ᭉ㙨紋摝䪤噑⅄婅䌫槄剌敮⽐媜⋅樆௸߈⣨埮⭂氦㖒匄ॊɿ㍀繶擜䘕⤰猈⥨ᣠᠨ撲细⑉携擝䦂ዠ䖷ጞᕤڄ媸䜚ㆫ䊶䢐ᤫ擅慪潾䘅爫朔⭨巆⤲姥फ爆ᕏ枱歂ㆂ˜ᥱ⡅៉勅⬫粴⥬响憘⋒ֶ䫢ᝧ憴垰㣢癙咳爅䱉㦹磍晾˓▻物搹䡏ᄁ◂䡥䝫丵᥊ᑻ䓜冟缦☏૿㤸ଔ向Ⲍ僥圳ᆷ⥏੶ೞ→䴜剰ᙄ⳼ચ㺂充壪樄問呸䳃㋪և㉟▆叉⏌湹吪䆷䧪浀奷䣂旾䬦⢻ၾ㻒䷅㫫☄Ϥ䱰畊ᦌ拉䕃䬚ᙅ䳶Ჩ㡂䕥懪⦶棫䱲䳑䚄勖┻痿暀୮ጩ⹜繉ᗫ沷坏倱᳃Ⱡ䒲敽䮤朎⭼峱⮢儹珪ᆅ៩汻敌ᠡ偹簾௰ⓓ䩗ᔙ⃦㯅⇃㠷孏䙼❀哧昑㦺ਦⶅᐥ㨒幹瀒攴䱈沵˚兩勘旇੯ᐡⶢ嘃ᾒ煉䜪灴㿮㊻ⳙ㊖㌒䗖䪆ᘾ⼮ᬮ㪒䗅䍪ᖵ筋慳Ⳉ応㳜㤦䰚擳䵏ᬖ⤂䉹⏫ᾄ噍ᙽ䭅㞾ᖿᎉ晀⸝ᅈᴪ湉ᡋဆ佪徺拝癢䓲ᗊ䩱ឩⰝᦙ⺌儥ो洶烌粵吸䤣ભᔬ䣄坣䦲庎Ⲫ圵䛫ᩴ楉掱ཏႉ䪸䗧㋂䧬屡㻤燙㵋✄ೈ䊻磘料˲姍猅撆⽠囶⏂䓎ⵊѴ४奼⋌湻䪤旇䨼暥Ⰲ妅㜤᠙㑊ⲵ╋ੰ泋ዂ⪱◩⯒➀⥯ᨉ㠒刵乊其僎ॴ䫕㦅┅ᕥ⯏ណՊ屾㾪䮙溫綴㯫պ狎繡⪴ᗼ⪸噕Ⰲ句⻊噅湫ᚲ⫗䥳⫻积卺垈⯄奵㑲奵穳፵竎啰ຐ⬅䦰玼哿䤭ᙕ㷪慵泒礦ᇭŷ䍇㙰狣⦛圅౼尪㗒䣉㳊̴汎浶㫌㥦㓭䔯⯫⛱ⶰ帲婢⩵耜到硃牷糋Ⅰ㳗嗿⩮䠗䰦坁ᄢ搥⽋䰇㿪㥹㫛亚粮旗⫺因⭢厎㐪䑕罋惶湨൳搷疞⫍啨毢⦃ⷃ႒⛊幡⤒䘆勋憾⛍⩨檭嘛㐑呭⧺塾⚺汵暊砊廊㍵䥚ঋ猂奡㉦ᑴ䪨ᵾ♀埥優㝵ೋ嵾ᣉኌ泹喼櫅噫䫹់啊劉䖊ࡷ⻈̾ᛀ䶒嫥⻤歫☊熅‟仪䒅䢋㓵䣬摿睛ᅲ㌃㖄ਭ埻䰀嵑ㆼ曹䣫ᑵ囉ቴ坃Ṻឝ纶橖ᚡ⪖妡㤔䠹⇊⥷䯨ݱ䫚啩媭ք䯭呲⿵ᕑず䳵縒欷曎䩸䃁ቼ㪷㦅ዳ垧ⵄ堎㍜柕ߓ᧵䡍❺໙ᵧᬗ槙䬟⚇⿒媚⃚䯕璪滴ᯮ⢷⡥╥㬂畉⫨ᔩ⪺念⇲掹孓㈄糏㕳滗൸嫙ᕓ䨵᠙䬸噝⋄徊畋デ李楻ệঔ㋐櫤䬋嚯䷭᧚⿲摥秪嵵爩滆䚜笚᧹报垹श劑㢚爵䚋ප棩潿䍀䱤泩槗ॖ晟⹘佉ᛚ狅Ҋ⿊䐢绗ㅚ剰ᗟ橮გ䬏ᅹ㨂緕姷毋྾À晨۟㕓珠㓝ⴕ⥚傕旊㵄母䍶㻖兾唤欐搷峒ⵚ䭉▁⥵䢍⭿ۏ疙ዌ秎ቈ㐣䩶㐲寥䞋䱗䅌䃶廌Ŧ窩娟簡ᗀլ埣㈨䴕⥒浇櫌ㅹ歁㉧܂昃⨡启ⱻံ㳊岭䇒ୄˏ勗㶖笗痆䯈㕧ⷁ劣㲒歕㸋橴㒍粺㫌云䳍ඨ⩏哨棖心㈊绵䍫㜶䯉罺䇃䦉獀ᦳ卐㖞⸹ᦁ⫦竕ላʶ㲍㝿ໟ嵢璲ᩖ晳⤋⬦湵⨻㡗罎罰⽏㕵狩姛⩱杘棤峃㛕⩵ⲻ炷ᳬ箱瓇禜✋ബ殄㞣丅ὃ㴲咉治叶㊉哰⍗፣✃畢厯䗣⼘傳䀊涭渫Ⴕ⮩槆喌務㕱ᯤ㖓⨾怃㌚祭㒻ງ◈❸泌㎗㫣㖆ᨫ擣⼑冁⋌䥭㙗⏈奵㛈䎇撬㗮ᬐ敌溔姲┦櫭䊻徶粋䭛㍾䛆㗈歲㜼淖倵ⴲ䣭Ẳ潖⢈瓺⧏Ͳ✂᧹ᮆ㚤歇ᦩ≆䧵去沆皈壻厗曍䶅ᯚ㙖⫘儃㱦俑篪ᠶ籉䞵峈୰峋◦䭌㓼檼倳⏪乍㭪⁶劉ዱ䗔淐抩ෞ叼㑙䱻ṓ㜆籍ᶺ䳴ᦈ䑼奁䭫ᓗ禵毪ធ温士ザ擭ѻṶࢍŷ旆禄ଘ䩪毒⠪湜垓⽚䆉䓴斋⋺䅹Ⓒ嘘孖㕒渙啓⅄䱵殫ŷ午⥵४嶊䡉檩㑫⤎噑⛶瞕桋惗滨ཹዚக服ⶢ尅㛦垯ᓅ♺掅㯫࠷◬䓾⽐᭬⛕䵋機唈淮嘋⇄䢍⿳㒆掎᪱ӗ䩣回痶烝ⓚ欭塹㷶峍晻睔⪉ॷ彛┟ⷮᰟ祟ⴚ壮ᘚ泍๋㧔ᖍ收ⷊ宍ದ涟毌嚆⸲劓㕖䡕፻痦淈嫹ස涔㜎涛㕶⾍匓㌺囩˓䂇㗋扺歞溔皽⺝孚㓰母塭㊖納ᖋี枈刦䄡㭧ᵰ斀孛㓳䌖墑㗶䛭塺㫖ኊ䳼䳓⺊⚻淦娷⒖櫥嚻䗭ᐋ㧥抈廱痖宀盧淝嫨᙮䱙岣ㅶ娵籊晔⇏晹䷍妖㚺淚宥㑡泂妥㐮䴵恛භ䃌拳曋憎朔ᵩ牔攅⦥婍⸶尽ᙺ梔㽈⪴ׅ㍹禊㎿哱橽吓⬖烍娒晴嵉ɺ䗀᭮岢涻㌣㒆泙吃㴖愽䯺嵔䤌䩇歼曱ᵼ㪮嗪獑嬊㫖沵ⅺ⊕攈⣉ᮀ竆䵕ቢ柱橃壧⑮晩爋絖㔏ેݸ䚾䧆㯔甩楽尛Ⲽ䖽嚋⚕冋⣿壞了䛓涬௯唉渳垻㖴䆭䍺䙗ᲈ䍴嫜ޗ糰涜㯶㟙槡僧⯮欍䃚燕䡍䗸䷛嵯ᜅ䴽㋜㖥漭巃㦖溭嗺؆䖊㳺䯟䮔亵ע㕲咡䮔康⭖堍䒗㴋ᗻ僌䅽礠㉆摿䳻㋮砍⯗嬏㝴䣚䝰ᴣ㩚睵淳帇㊔僽[潴绋⋶ᧃ➏ᓹ嵿ᬤ皕活嫛㽮䃕檺䚗圉㊿്䚽嵹⩞ᕼ栳切⫮白᭛箕䙈巸ス徼(䃅员㍗ᐆ⚸༎䶦ߛ䎖愉ⷸṲ㠭溷崦þ甊㊛宗㼎盄⸱䤑ሡ㷦篒㼡偄䊀穁矩汒喋⺷㑝籵愔ܧ緻ོt㸈>瑪ㆧ喯☎⪠⥭礗㈊篁➇囷⋨箁琮͇叉匾楝ႚ┗ᣒ䏰柘▶囊崿㯂疝殇弴㺾獝ر㳨㻂ᬌ乭据䮁⅕嵢碧݇傯ㅮ穎⊤䘎嘢ᘢ廩㷂筫恫漩⭸⤖涘嶤昈䕹篕梺弍㷫ؕ矐懑એ⧰༤璅ࢲ兖对ᆮ澀嫶䵕獟㕍椻巯⓾囝ᮛ㲤䤧寿ಱ澍廥₨䢥癋濼д昽怉✔␋ᖶ珑ㆄ⻯᷶㯝眫殯帅㕾囝甛ᬕ后妀矋㻥嵇㮶疛櫋ିマ䋔̚穹䐉圍歸㛓ཛ姆笋皖攧⬊䰽ચ㿖同⯼濈➷煆經㑤笙╗彮৴攜ሚቒ潯㻿㵀䞑㻯㵉竫疋洿儒㿞匝䨚㨖ᘈ㟸痔澋㺪巰㭙皗欋塜䞞楺嘛䌕ࠊ寵埂䊱㭦絷筃;ㄇ刏⮾䌝֥䌗』ᇹ俍羝绳㙛箦㎚盿嗏㦉㫔碚䜖䰍㿹忏羙弓綰ڋ盎琉‡烝磲❆俼翌瞗㺺滨ݘᓆൗ嶠懴㖀噠㞖㲁滸߄ë⫎絵ㄨධ䑠槦獨樧丙挤ᖋ㽴㔩ǚύ䁸ส㢏⊡初揕ᠾ⨥悁改䒴憬߆䊍㋁扤楔ว䰭̖窈႒Nj穥窳皽檭偀繡炣䔦掳ᐼ灔℡䈆ͻ箕瓈⅐㱀瞞甝⾒滔ဍ䯹⟊䄅䇭嚝笿塨ᴀ㆟↡玣䫻僰竳௳彽愓ǹ䓄䆦栽榬忟⨞戝掚丬琼涌惣掏БݢΩ倀悍Ҁᅣ 䠼浿悅►⇕ᙹࠉ䠠㙸怶埡潦Ყ瓵爼緎⢉ᾠ䵺䍩戼͋槲䥟ু殢塭⠬㐹៲翘⇃ᒌ⤚ಫ㇑۰曗✩ᛡ椭⇱Ǭ㔸∅疵㭂ౘ᳀ㄺઁ壣˱傰嘻伤惷攴戙楚ᢖ൸䳈㑮Ⱑ潣☡喠殕汞墔焛䨧ڝ揨䑦‶弁狁甧紷ᐈ恝㟩烪开碿س拀伧⧙㩞簄ⰲ怣縼᱖㛋⃩也䎁䄫㝥䘤㨨涸沲⌀刖杨朲橑ࣿỮ䏏ݔమ浢暨牐Ὕ⦂碭ᄻ⼻䩋⠶ᴓ͝⋢䖲ᬤ㤽∱懱⩧羅ඨ㉒⒓ᡣ3烜刺燷㻨橀❃帧㤯∿剛ੑ䀯ᇞ⏫接ි᷇䯨旎᭑䐀䫥滨ᔷᒆ䣮㪼⍵ㄵೕ枮᬴⥱孑椝眕ޭ䔻咅澒㳖䷸ྔᾘ㑈猴偪䁻❤媬ᩒ撓硝婎⎮䞵⢲ᛈ旈䯃䵧㥤崹橕怼䤓盲沖䠝ᢎ岂㷘塱◩ಮῑ猲䲊N〈䠙൴ᰴ㴼◈劃照㥤ጻ㌽攧ಕ梶凙䠑䚦ạ巣憃ᡦ䆭䊯ᙒ撑औ{䥕嶛嘦ᬖỜ㰞綃ᇍ䖯埍ば⩖夘㈾䜏䔖ᮌ㝳䀓ୱᅧ㔑㤻๕澐嬗㶈ۂ༼Ḧᘴ㊑帑旦泥恆⨧᪨咒壅掼兗ྵ༨㻿㻡栣ầயԽ湒સඓㇼ刋䝹~㳿䙮揍滦ྫྷ㬺烵沍࣫爏⎩Ꮇ䃒᭐㓸旦⽱氲ਗ๊瑟ῂ棺㇙凇窃มᢃ桬◈缀撘ヰ䡣ਣࢸ瑷ᆤᐘ䂕Đ┴ત箈犃⎦➬⌺橒Ӷ፻⍏డᬪᆤ椩瘳屆浦䜿ṕ横ၚ㱳൯䜸䲎ᣜ㋤杰㜛浔ᘾṞʔ礕燆Ꭲ䇘䳖ƃ哂È七㷧扭ႋ䅓⹀⡏㳔㚴䞂䑟挜ጐ犒堳㩦ၭ咺⥗㹝⓲㣥⍦ࡲ僔Ỽ㗈擩撣埦䄷䛮ᥑオ擷燦匌䷓ਓ⤈ʁ橃ῂ䗱畆奐ᓖ憆㤏ۏ൝搪㋨爠Ῥ⢬ٗ♖㢓祾绣挢✘ໆḲ㘝ᙉ䠝䫧ㅧ䊼絣ⲕ壿㇎⎣䜒倁ἤ㫈狱硪峆䶅᤹㙞⼷声眤嗢⭥䤤噐ԭ䍳㹰䵭ઽ剒⪙႞攏种⚾䦬⢦埴槉婍Ⳇᢕ⊾湳槗䪈槼ᶼ牭ᴢ㺠杩縤⽳卬㜊䵖䪒⮐䫅⏲嫰垍ᳲ㻥㺑愳糳䣵㚸機纖冨䶳䟅Ვ嶾⽀痳ㅧ㒼ⵕ檙㔎曧厇⠖㓍甚㏼㔮瓭橧潔圔͟媄䖂戊䏽➖㒣Ἒ㦅㥒ક㊲嗰ᣇ⫳⥑爃⎎箇瑍ᱚ㑄筼݈㠮綍㊺䚍➜䛃⹒俇⸉徳ⲹ䬦આᵬ唿㩔滕⚺㎭⛶䳲瀐૬抹嵳䱲↬皾ᕷ暔ഘ⫄匫䞑䱵ⱊ桌椮䃓丠烯檊᧳粎㞗熢⃞⟭ᜲ歉ᅿ媽⇍ඇ͕爪ൖ㏅㞾娚㎎䜻敓ᠾ墌眚廓ⓚ㍇摖≜杗䵠竌⥖晵䴚偷⧄叓登ᶹ⑮བⵢ娕൪枫次ᮂ嘬灩勳ㆆ绯ᖼ筒ᣇ礗㪹᎗䚡䱝ᴲ㿘溁䑣㧧惯ኸ䝘泞᳷⠩甽㊓俊ͥ唸犹潉挆䛭䌿ྺ❕ᶄ姰ᗵ暅䲳ứ嗬翉拓䗒䷯媺ଡ଼櫀⤈娃双卻侻᱕埼粹罳ẇ泥䅊䌋㚖皰ᷥ⮀䍃朾㴌珒曕瀓则枻᱐᪙㴌秺㲋昢囍ᾙ垰㞙䞓凊⦯㮸侼僀紞朝猻⟛圏ᱞ媴扉䌓䒊罗䒏䗓犊榠啔⛨䴁ᣂ㚇Ⲻ䤳䱇䡯㾻⅞⺄夋̊朠⿱ᯮ㳒∥崳 ŵ㴸ݕ璐糽᪢ፘ暛丁乡㆜斩䰠❦⏯㖿獟⭓磪׳㖽✹乣Ế㑢慹秳㑋嫯矍亄ᔛ䦧獿櫆㐷䮒㐄珹猹僆ŵ揋㝛纕掟ְ䟮ᑙ䰁㿼瘙幡然䏯ڿ䍓⥙㤂妥ୄᙃ呓ᥖㅢ罖劫䍻⮯ಋ㊻㪂䤙䫆㖛➾䰽ᣮ㊜璼啕⿇瑽㛺㵀䋹圁ᔤ឴⾇⹖㣽㵥䨉㿳์ᝰ熅磨稓岈䏧ะ夷宸༰ᩓ㱚獮ㆻᩝ劍瓶㧔嘕⟁皤彾㋴慅礃Ë۬ο᭜㆔᳨姃叇曩摨快峒㋹享澇㴈νᓟォ拴ڱஊ䩰㑴壯嗻㥢絫㕛䵎ᖽ㓕⦓䍭䧕㍕ᏺ⸺溉㷽⻥稭↻呍㉾୕溗ጙ䗍◤ᚁ丧᭳墢秮䵩搷⍎㮾ὑᦀ晢Ⓦ曪✚ᢩ噼眙妓ື剕ᘻ㣛䯆崁●㎑䙂㛠彂㰢眙痫‶确嫷ះᝧⴛ䭰ᛘ⸟ᵂ㤢縥岫平ïᆿ糒拘ᴔ䫃玈៣䴗崸煦纍橦⏬㔠᠁ᄴ笾ጅ玨垛㣐屧帝∺䉋䔜䣌স䧽䖍૩㝕ᷟ♫侒᪴㔔搵纵ぷ䕯䡿㵙䫧ᇫఄ嫪⚲堪側烿㨭享敭⯮乚㻞㓴◷厔垂ⴔ⨅㴢硌壋Êੌκ⣜妆䫹וఔ垴ᚈ嫑㷂椆纓䥦乇瑽ㇰỖ⫵ᖷᘒ坴⻘婵㵓╵秫ῇᫍ唏ⓐ妗䪆☝Ⰻ⭨ⴺ弬㤪泄䅫ᡷⳇ⫝̸纟ഞ娝獞垤ⷞᴱ㯓㢹柫〈㻍ጎ嘭䄷櫤妪ⁱ嘣ⶔ墶媒癕曓堆⮙ᴦ⛚⛃䳰䖠珄服⸑ᵔ㌔笹䑋㲷咄妻㫘⚔嬕᧯Ⱏ☵ᖪ岁瞵穓᧧ᅎᣖ妛奶勚毗樻ⴋ㶊敎碭島㉌ㅹ㳓㏝䋹㘁毁嚧⻳Ḿ㠒晕岋䁷珍ο曐ᖕ嫸㦸䭎嚚奭㋪殕䚋ḇ绌ι۔禟宐喬ତ厯⾀幆㕊獵䷳ķⓏ捻祘䶀䩣痶㖌嚔ⰷ᷅壄⇬栋ᇷฮ䶾⫝̸亜⫲㧮Ꮩ曱㜞山㐦爕櫓ঊॄ斈ۺ䭟朵䳁帡㊚歎熋⬆敇僼㳘㗏۽䄘禣暇⿕ᷞ㉦涹琻ឆ俬᛬㝞ⶂ➘瘘☜៛垍ᯙ㚔湵樫婷ૌ䕻㳜斝櫡㳫卾噐㘓Ὁ㡌掭揋仌䭸ኰ㦛̑㨄ᬺ䜷ⴸ忕㬍㏅吋ʊ⫆ත滛敐✟榬┬Ⲑ嶸テ䍎徭汦柍牿槜憐枅⚾ᘡⶒ墵氪斕䮋ጷ毌⳼䳜奚䗘⭚ᚬ氨怓㕦熙䴻暲姏秛憛㫠䘔殑坐浥澍㵫♍伋繖㊍⋽㳷⎒㫮㖬寄㜟⼼奕㥺疄傫烗妍妹䷷ⶑ㫯㗀宯朕㟋ᬍ㗌牵崋椶㦍婾Ӵ⮜⛪䗩᮵柶ⲇⶋ㽦棖佫廗䏏㯏䳐ᶓ牲斵ᯋ檮ⱣΎㇶ㎅秋㲢㭎⣴㝕䕀ᛒ涹䧙㟆漓㍻㓲㭭㛻㽀8㞫ᓇ䈢其嘟挬㔠᪀䉛㓸ԍ䛻䴇浸巓ⷻ佝⇣宍ᖮ澁扉⹚唳μ熍帾懟ᵪᝏ淶䩃惷⭿枂छ帒М厸╞亝朗ฌ粇ࠝ橪ᅧ㵺唡⎃䁦璃旒盋㮌拭⑬㮧梩澀栗୬爽乛㊗っ䁑᧟ᢁ☔௳䃉潛呞䳮篭㊦ᴏ媕Ổ䞖گ䵕㇟㘙氻ຒᙄ抽拤奨忲懽淏箃㬒㸩㯈盉⎵撷㚤宐⼊恒䶠沁廂ḽ⼃㘐䭘㘂湓媲䗎所䛛ៃ䜌痸ⵂ㞂㳿㴎⑆၍澓嫣㭎梹ᷛ㱁ᆑⷸ㪬瞥䔘㉖ᏺ嚴⊛奡ᅄ瘝庖堣緾篙ኆ⼱獏㮡癅燫悶㕽᪤㊳痂〱⏺㨠侀栰㷂歮睓ʛ孯㢧ɝ戠崗䯳現㡊磗⥑㷤筚ʀ䝏㺾榚瓛獖∌ᧃៗ侒廳ᨶ笵癓澗䍏げ䝾姻⼤㘎篼柖涐漓㷡筬ᤂய峗峲 Ԯ䙙箻壤灩柽䕶Ɲ粄㨗嬲ᬤ糢搫㻺屟ᚣᇒ咽曠ƾ⭦Ḗ൏Ῑڼ续混ᅗ皍犄摮悞榑㈛ಡ⠎㹇忐ő綣偦恗㜉怸ʜඎ敩啤籡<ᇧ濑䠺❈ㅷ篆ǿ泛䔠熞楼ȧ䦑碡ㄧ䀩斟纊Дߚ睠`㲈࢞絈ਛ❭僫ぜ惥䄆溺漨愈!ྭ᧧㶜׆烀㰯㙠忺ႛ幾䇺䮊ࠕ畖䯜呏ⷡ狓〄☮倾ࢱ䂗.Ȉ≞ݡ♨慍ᗹ⽊ࢤࠔ㈱乚娽䛟ᄀᎾ緇箰ศἺր篰祣椨唯熱摛梖ᰶ⇡䏆ྞ㏏啼๛๐㚦晉⼴堌㾏ㄙ垘ࡾ䋮䆧湃幕㈣瑄ᜯ夂Ꮑ८懽ʖṂṨ∨狝二䑧ႛ㧍傝ଭખ瘾㣑烁拭丬Ͱᬠ繁摠㟲ợ1㊩碑ኮ悎≪埤ұ攊ᥧ杲⩞ⶾ摎㠲羚䞊熒ὙH烼壃䞨⓴殉ᮂ㠈椓翝⏍ʓ䃪ᄰᢈ県䶠ョ⚯瀠婜丨⤖ⓛ⎥ࢽ༦ᶬ㡏䟨冃磧㺯⌿ٞ惡䔮繀ᔰI䜞ⓨ翤Ḙ²涯߱乘١ࣲ㽆瀻ب炮ᵀp᠂ᮮ䞪䀥⊎礌┵Ɐ䜸楠䠈✼㝡GⰫᒢⱛ䀭ㄙ⡍䎭ݧ㣢ɦ;༄ƀौ息ᡓᅟ䪧愵Ꮾ唏祼䍖ш約ᥠд⢀Ṡ⍤抑䚯䈺ᐔ➳秐ʂ㸜䶩綨ژ祡碾य़焬┘๕Ꮦᔌ倅†Ł棣攍⸽ᏼ➬亀2㹽俤ᦪ磨㲿敠 ᇱ䭉羳繜ᱮ಼怢㊚ᔈ⌨�⠑䦅῟䐏㶮穌⭤䍑眐澑☺梧⨍ṇ䘝泪Ꮊ㤇ᒉ竳嬴⭮⸡㟒绘⏥滕张䩛ⶌᢲҜ嶈ᐆះ简捣仡䋧甇槧⎀朡久ᮕ僯㪩䴯㲨⣮弾汅℠廬㏄朮兢䉯攪৵ᵕ暠㠡篢Ñἠৢᵟ䢋⡿䐢䁁䇱䬶á㚇峯燨ἄ᚜抽ᘷ煄ᣏモ懽䵃࠹扔㮇桩涼十ፍ瓻┸℞❬㘑˚本乬絳䳑䇮掰ݝ咜椵㡙㰼፮₇ᵷ嫾㣙秨ᾇ仈䒰䞣䀬倹৲ⱥャ丬ʮ䀗孬絳紇粂剃㟐崒稙ᒢdz‗゜珊᠒Ῐ眹殼䩇嚑儚姾㎠燡℮䍑⚜盥ࠫ糈愠劂⠃Ɛ䜦0乐Û俈⁴枂৻᜴⤤緮㿐⤡暛紎姾䢆ᒰ⿁ቡ㴢瑆ᰫ羖ぎ⪂彘嬵刣秭≏栘࿀彏⎢熷ᄫ戇㯰喓僙嚟䴟秦〼ឤ傱㢕 ಯ䗮䘡ᜨ燫憒ȁથ槣哀彠#咕䯦ڂ䱅稲シ祱ɾ兕⦙檴☘䮣箲⺄巩㽴绅挺₷祰 綬崈敒牅戠ᢷ晏琠䦓6☗Ⴈ乃⁹㺤䆅擫禷䭏噼ⓛ妛匉昋Ꭺ㢆屚䙒瑥漌塷䄂⋟㦑匷敖ⱁᤛㄎ摅㸻کૌ㙈Ⳇऎ洔㴼坱⹉戤ୗ⁵繴ഠ嘡ᐓ䫜ᖛ㬪嘔ቊ堂ᔛ怏凋嘥ⷮ榢䁆䦒氫⠮ᐑ烓㗗᷈斊祎ᄢས瀰䨌剪⛂ᬅ堸殤㤍⾮狎䌊猭់朰甩⛚滫㷎㚚殹埸ᤆ庛揺盎杷滏䭿圡⦀㬘Ⓘ毌励✒弟❫䵵爘㷷㎕箎䊄採㮪⦤傏ࠑ仕㳂㚁ซ宧ԉ◣䛛窾伩Ὰ⮨梀渫浣㺐⋨᳝牋缌䗳懛ӟℷ欽㙢傻愆屢㾲粭ऻ嬢烽̇䪥䐶㋆戟獚ᡩ徦⌺乭橶㿬沎⤢掐⬕؋㥨惨祼䂤װ糈დ尦ݠဓ着䚩✌丆Ẉ③濉徫昒䖨ᚰዛᐑ◟䪲⯘歒㚚㠀慑廕㥶炞疻朠皎ᒢ㧚嚽朏᮶ℜ濚ᶀ糹ᅻ䙔玎㋼၉墨¶⪑砰㟇不崿Ȉ䖡眇ඎᨾ殆掑֡㪤傚亝䦳䰕̔佊⇻寗筮懾巜ܽ漥咭ϻ堏䢻R揑䈍浐ៗ簮䏐槑囮䶷淰㙔咻慭屓⎮灕ᣛ䳤崇䯞続棲师⍢珣箚㦏䔣勹㏈䚻焣嵧ㆧ稍㎢枚↮⇳ᄚᲙ粓玷㑠癣癛䀩妴⡊堻䅥 °䀬䞽※ၢዬ⢰፝♟懽渊㻆̡ڐ㲽疿䐯㷽搊怸⺛岑㡤穝悛䤇㫧䏿爭氲㸔篴៓渷嵏㥾笇ඛ戗㜎树㿜嵯羛塜㯩珺ᘑ 繞童猫澗䏁緾ཚྚ㴄㷯Q眯瀑䕟㡟㌝熛䔗砎㤒㿘ᠪȕ榨ަᥛ渠㽺◰⾣瑰㗄ⳮ⟽壛纘ⴚВ杗漀㷿㼾礝棄ڧ㐾濼ഠ羞䆴䐙ުⱜṻ弼杏澨ၧ嫘漏汼條粢ᐦϣ偬Ằ㵯㶁羡綧䘯举塟㢞渢樯Ϧ䞼⅛澮㌰箈᱃擶㤯䎯ᑜᾟȖ搵簚ྃ伸㹨翞煝礧抯孁䩟៝⤒㮻Ͼ䟒ߺḸ:⠟㮰䜋倯ຑ丙ణĚ㼜⏿㯩ྲྀᾀ㻨篑糣燧䴗粃咝⾞刟揷䟔倏⡉ƂҀཕᔳ㋀沾嬻琪ゕ⬿Ꮾ⟟埑兪㸴粷ੈDz╯岿㨨檝䵥䨌吘Е݄梀ɔ築繳櫂❯暾啞奁忸痃ᣠ䏖倔案䊰啖濠傇濛䫵䍞´ᠼ抪㐚⦡ᓹ䞀㍞杏滓浣䋯琹᭝倇ⴞ嵴⡓梬橛喾䚕♉瓑䔇䥱泃嶠≟ㅿ⤝Ⲡ䩃ῖ㲳✌㼉狉揯⏤⦼ണ澙0ਟ㮏侐ƞ㺧ૹ耓妪⁏恾燧樌䚔؆㸿柄煟矰ɢ窖犆儷牏嚾⽝䚛⌗ఀ▓簈怄ᆸ惬䗈ᴷ矆≿媢䦛ᴚᨊ䄙ឲ⽘廁䀆旅火汩⥏䨘ʢ⦞㴖ؙ൛⼥皙㹏䞥礭检᫉⊠ᾥ窝甌㑈堑⿀幱㭑≎ो摷甧ŋ֞䬑湽縺⠢‵䃑Ȝ紌ݏᾛ簄䩡䘘疛欐㘃௷ឲ㓦忕㺐熹ί疒䤎⛞涛ᬘ瘓Ⱃ垽帿永簮௷堛፮嫜㻽祯瘒厗⯰磈䵣㵝札狹⟷畏儏仟⎙䍡พᤴ㠆弧ᒦ稭礩㶃Ჩ䣿姝䎙⇇上䰆㰥庳㳐䪗乻絗笩⳿ៃ䢬᭾琅吒漭徬Ŗ穉缻濷殏ᛡෟ㬦甓§寡䁞漰挋㳺窨ൢᔍ廇㵐凞➘嬗ᘙൌ矈Ę圈慎纋嚻织䮏䓿槟枞缌抣㯠矟㯵怆叚缽翉ᝋ息ቐ凟依漙㻿㰙㞻濞䠿㺀䖼矢哰⧿焼枟ᜑ縖篽㮛澩徟㵞簣猸ᶗ福䞪晭滪䜑Ѓ儜柫⾃῀纟䇲䪻簯刿ঝ㹳嶯Ⳋ䪘㛙埴⚸㻳碕紐玷䌏碝㌿嬛䐞ᥙ 弩㰲À俽坁ㅏ㿿䶛ᣆ㈛ክ愍ឧ⢻恩∁秽啵ӗ簿㩨ʟ㾋搈㕁冟㎨湦ⷡ絃癓潊ô备ڨ䡥橯䞥௮綆恰ô籽拠尋檜⪿ℕ癖ῒ樓吞䄝ㄲࢥⷴ絷峓璇瞩䁤絟㞁㔚娛吀㕍個‒偣ˆ⋴Ұ䠣犛┰府稚搂࿓忺䆢罢✫琇笘༿▐璄漠䰖⯾砄㑩㾖㲃❫紫䋪Ȁⱡ唔㔘සد᠆Ằ弱㖸儵翫目坏敿᳟っଛ爘⽺堁偡ὄ㽲粳糷汯䪁ໞⓂ欛䀫咮㡀㭲ྒ绰傀矨ᇯ揷凟Ν⬛嘖ᰞ廎〄徭㼊罅稳罇竝⋿縊㜞昔ί᠗⚖䛫䀚簽糉㫷漗牔⋞➞ၚ助㰀猫絯ᾭ倵㵤样樏嚗ᓟ果䧅㸜簞ᥗ濌瞈伿᷽仠হ缊䊮㙾❘⢕∶栯䠧ᒮ慓Ὸ禁绉砿䦇䠌⤜ᵦИࠑ殆ᾷ枖↣絞થ爿槈ᢟ盡戟礠䠎Ꮲ䠄㽠⿁ᄃ磧纯挳损済Ԟ筥愣ᴄ倛䘧ュ佑Ƀ義瑹獐㕇䳮撿刘力⠊䨝‚䓌繁粓罬੯箿橸䪟牜傞⍤᠘⿷煕㿯憦剏䋧獓翤ഘ႞礜㭦䰔⠖〔῎䀄署愊䐇絯恿禸ᠡ欞ΐ瞦ⴗ敓忽㿭儋籗炀弿絇炟✝ᆴ琛ࠏ摂怋㽴繵粳⎗窯敐咟朤撣Ḝ⪢汾ῡ忼㽞羭縛籇炞碿峟ஞ∝ᾥ琞ဉ揯㺄罚翃绌み䶨ଞ༟帞伞⾤怅䀏㼡ঝ縪㮇翨䆠禟㈢Ⱀ爖瀓翔考ᄯ竏烠泦ऎ㇎༞ᐚ㈑槴耆耉৳緗禷砿束炟碞戟ᘚ᠔Ხ㿼䑾↮翤ฏ硿痏楊О瘝㾛⦯爞㿥翴罍羷罊㵿稙綟奟㴟䐜渘䠖ᨆ耞翆羅缶椟硏禯磦息穿硇㧱䐘穏窵䂻禇窗算篟福簗禟磲礸ȿ竌㉠ڿ磸䉠֠پ磈⊠ՠܕ䃠҈㮇箻碏硳穀Ճ移简ࠟ硠ࠀڀڔ႓ऀܭ祲䊗䀰Ս䄰ࠀ㢰֗笇窏砷箏篊㫐Ӱۋ橐߰ؐ䋐Րܠ㩬䎨߿祏穖�۹Ɛߠߣ稗穰ݑ⍨ӹぷ䂡㬙⊏ᮐh࠙磼↯᭯硗䏨ߓ秏窰ן笐ֻȷ篊㤈ԸҔ㈸ܠӃ⇯磯秽䫸ܯ窣碇篗穈ԐްؐՀԏ秌⁘׀ٍ变٘ѽ≷竘ٚ桤ӓ禘ݟ祱㫟硋簇祸ࠐ磤Ҥױ䂄ڨࠝ̏;稈ѭ㦸䂄אԹ䂸җ禸ސְڧ簘ۈ݃⌴Ԩף䆍␄Ԅձ⁇笔ቦǔի篤Ч磟箸݄ӈࠓ秈ҔӇ箻檐ǔܓᆬݔߔ٬֛磨ݠޔ۠ѴՈؘۄФШܬ۬ڬۧ禩㍰㠴ؚ䥰㪪´ك䆴Ԙմӄـ秌砼ڄݥ䍼Ԅݼ،ھぜذьܰנܘݴی۴ҳ⍜Ґ㨼٘ظ㠻㥱ɜҹ儢գ砸ļۗ祟礔لؔԗ砬Я筃⎢ں䃼ډ↓㡢آ҂ۂڢԏ僂߆�Ի秨לڐҜּҟ筸簂Ңׂ䍲٢٘ݨ㬈դ؋祒ۤژӏ竢Ѣջ磴جѽ硨㫲ը㨪Ԅגޫ簗ㆪբٟ簛穌ܔٴѸӌѼԜ֬穪єЧ刪٘֒㬂Э冊Ӝߐޔܼ䊼ъܒޜࠒҳ⌊ב⁺ޒ㮪䦊ժܲڒغֲܺܗ硰ֺ֬秺ұ䊚њ䍪㮊գ刚؊ڴк٨示ࠔךՂҳ∦ב⍦Ӫ㣺ٚ樚ߺ߀»祚Ռڜۚؒ٦֬穆֚ղ䄆ۤ䁓戂ńဦ㡆Ȑ䎿䁼揠䉋ɀ䋜䂊䃱ȼ䆁Ѐ䍸䁓愈ֽ㥒ϗᎋጪƵᯡ㤮猋抗͇ɵˇëÃʇ!ƚn磂灗Н¯͚憉¤ᨳ磨ͰǭĴƚʂ冿⋙ͨ㬃Ͳ㠰̲š憀VضƱ0䍨Ͱ̎ࠑ<䃨秠̨ό䏳«䄋息ʬ�Ũ箾ۘૡᄋ抮悥Ċ䍊͌抈�㤃㪐ԃ扠䄫⌮˟HϟʟƬ䎱ʡҠ䅒ǒΒ䂿䌋悴㦡⊗磧折ňƾր̄㨾ќ㬾ހȘ�چ>ٗĘܴ́1Եą㧞خȝs䈠䎞ڪ̞߬㰞шءѡݡ䎝ْ͡Ǒݴ䇓ʑڠ䎦℩关慁ـʝባᅖذ䏀ʁ�ސ㦎ހȤΎ՞Ӎ̖ƨ䌁ھӄ䌖ưáؐ䇉䊥X䌖ȴì䊘ͰI؉۲́ؤʹןȹݨňͲ㧉ՉԹހ̴Ͳ㯁߉Հ̰9ژЁߙƙݔ䇉䏛ɹ֙ݖ݉φƭŜቐㆅƴ穥ԀうΥ䂎ī␙ނȂ͋ˏ䇧ȡ愠 "}
The complete round-trip took 43.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-file-analysis'
- id string [optional] You may pass an id to link requests with responses (they get the same id).
- filetoken string [optional] A unique token to identify the file for subsequent requests. Only use this if you plan to send more queries!
- filename string [optional] A human-readable name of the file, only for debugging purposes.
- content string [optional] The content of the file or an R expression (either give this or the filepath).
-
filepath alternatives [optional]
The path to the file(s) on the local machine (either give this or the content).
- . string
-
. array
Valid item types:
- . string
- cfg boolean [optional] If you want to extract the control flow information of the file.
- format string [optional] The format of the results, if missing we assume json. Allows only the values: 'json', 'n-quads', 'compact'
Message schema (
response-file-analysis
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-analysis.ts
.-
. alternatives [required]
The response to a file analysis request (based on the
format
field).-
. object
The response in JSON format.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in json format. Allows only the values: 'json'
- results object [required] The results of the analysis (one field per step).
- cfg object [optional] The control flow information of the file, only present if requested.
-
. object
The response as n-quads.
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in n-quads format. Allows only the values: 'n-quads'
- results object [required] The results of the analysis (one field per step). Quads are presented as string.
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
- type string [required] The type of the message. Allows only the values: 'response-file-analysis'
- id string [optional] The id of the message, if you passed one in the request.
- format string [required] The format of the results in bson format. Allows only the values: 'bson'
- results string [required] The results of the analysis (one field per step).
- cfg string [optional] The control flow information of the file, only present if requested.
-
. object
The response in JSON format.
-
-
Slice Message (
request-slice
)View Details. (deprecated) The server slices a file based on the given criteria.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-slice alt Server-->>Client: response-slice else Server-->>Client: error end deactivate Server
We deprecated the slice request in favor of the
static-slice
Query.To slice, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly slice the same file. Besides that, you only need to add an array of slicing criteria, using one of the formats described on the terminology wiki page (however, instead of using;
, you can simply pass separate array elements). See the implementation of the request-slice message for more information.Additionally, you may pass
"noMagicComments": true
to disable the automatic selection of elements based on magic comments (see below).Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let's assume you want to slice the following script:
x <- 1 x + 1
For this we first request the analysis, using a
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":8}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11382-D5YhiKU93880-.R","role":"root","index":0}},".meta":{"timing":0}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11382-D5YhiKU93880-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
request-slice
(request)Show Details
Of course, the second slice criterion
2:1
is redundant for the input, as they refer to the same variable. It is only for demonstration purposes.{ "type": "request-slice", "id": "2", "filetoken": "x", "criterion": [ "2@x", "2:1" ] }
-
response-slice
(response)Show Details
The
results
field of the response contains two keys of importance:-
slice
: which contains the result of the slicing (e.g., the ids included in the slice inresult
). -
reconstruct
: contains the reconstructed code, as well as additional meta information. The automatically selected lines correspond to additional filters (e.g., magic comments) which force the unconditiojnal inclusion of certain elements.
{ "type": "response-slice", "id": "2", "results": { "slice": { "timesHitThreshold": 0, "result": [ 3, 0, 1, 2, "built-in:<-" ], "decodedCriteria": [ { "criterion": "2@x", "id": 3 }, { "criterion": "2:1", "id": 3 } ], ".meta": { "timing": 2 } }, "reconstruct": { "code": "x <- 1\nx", "linesWithAutoSelected": 0, ".meta": { "timing": 0 } } } }
-
The complete round-trip took 14.6 ms (including time required to validate the messages, start, and stop the internal mock server).
The semantics of the error message are similar. If, for example, the slicing criterion is invalid or the
filetoken
is unknown, flowR will respond with an error.Within a document that is to be sliced, you can use magic comments to influence the slicing process:
-
# flowr@include_next_line
will cause the next line to be included, independent of if it is important for the slice. -
# flowr@include_this_line
will cause the current line to be included, independent of if it is important for the slice. -
# flowr@include_start
and# flowr@include_end
will cause the lines between them to be included, independent of if they are important for the slice. These magic comments can be nested but should appear on a separate line.
Message schema (
request-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-slice'
- id string [optional] The id of the message, if you passed one in the request.
- filetoken string [required] The filetoken of the file to slice must be the same as with the analysis request.
-
criterion array [required]
The slicing criteria to use.
Valid item types:
- . string
Message schema (
response-slice
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-slice.ts
.-
. object
The response to a slice request.
- type string [required] The type of the message. Allows only the values: 'response-slice'
- id string [optional] The id of the message, if you passed one in the request.
- results object [required] The results of the slice (one field per step slicing step).
-
-
REPL Message (
request-repl-execution
)View Details. Access the read evaluate print loop of flowR.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-repl-execution alt Server-->>Client: error else loop Server-->>Client: response-repl-execution end Server-->>Client: end-repl-execution end deactivate Server
[!WARNING] To execute arbitrary R commands with a request, the server has to be started explicitly with
--r-session-access
. Please be aware that this introduces a security risk.The REPL execution message allows to send a REPL command to receive its output. For more on the REPL, see the introduction, or the description below. You only have to pass the command you want to execute in the
expression
field. Furthermore, you can set theansi
field totrue
if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of theid
field to link answers with requests as you can theoretically request the execution of multiple scripts at the same time, which then happens in parallel.[!WARNING] There is currently no automatic sandboxing or safeguarding against such requests. They simply execute the respective R code on your machine. Please be very careful (and do not use
--r-session-access
if you are unsure).The answer on such a request is different from the other messages as the
response-repl-execution
message may be sent multiple times. This allows to better handle requests that require more time but already output intermediate results. You can detect the end of the execution by receiving theend-repl-execution
message.The semantics of the error message are similar to that of the other messages.
Example of the
request-slice
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-repl-execution
(request)Show Details
{ "type": "request-repl-execution", "id": "1", "expression": ":help" }
-
response-repl-execution
(response)Show Details
The
stream
field (eitherstdout
orstderr
) informs you of the output's origin: either the standard output or the standard error channel. After this message follows the end marker.Pretty-Printed Result
If enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away: R> 1 + 1 [1] 2 Besides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. There are the following basic commands: :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r) :help Show help information (aliases: :h, :?) :lineage Get the lineage of an R object (alias: :lin) :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) :quit End the repl (aliases: :q, :exit) :version Prints the version of flowR as well as the current version of R Furthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command. :benchmark Benchmark the static backwards slicer :export-quads Export quads of the normalized AST of a given R code file :slicer Static backwards executable slicer for R :stats Generate usage Statistics for R scripts :summarizer Summarize the results of the benchmark You can combine commands by separating them with a semicolon ;.
{ "type": "response-repl-execution", "id": "1", "result": "\nIf enabled ('--r-session-access' and if using the 'r-shell' engine), you can just enter R expressions which get evaluated right away:\nR> 1 + 1\n[1] 2\n\nBesides that, you can use the following commands. The scripts can accept further arguments. In general, those ending with [*] may be called with and without the star. \nThere are the following basic commands:\n :controlflow[*] Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf)\n :controlflowbb[*] Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb)\n :dataflow[*] Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df)\n :dataflowsimple[*] Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs)\n :execute Execute the given code as R code (essentially similar to using now command). This requires the `--r-session-access` flag to be set and requires the r-shell engine. (aliases: :e, :r)\n :help Show help information (aliases: :h, :?)\n :lineage Get the lineage of an R object (alias: :lin)\n :normalize[*] Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n)\n :parse Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p)\n :query[*] Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.)\n :quit End the repl (aliases: :q, :exit)\n :version Prints the version of flowR as well as the current version of R\n\nFurthermore, you can directly call the following scripts which accept arguments. If you are unsure, try to add --help after the command.\n :benchmark Benchmark the static backwards slicer\n :export-quads Export quads of the normalized AST of a given R code file\n :slicer Static backwards executable slicer for R\n :stats Generate usage Statistics for R scripts\n :summarizer Summarize the results of the benchmark\n\nYou can combine commands by separating them with a semicolon ;.\n", "stream": "stdout" }
-
end-repl-execution
(response)Show Details
{ "type": "end-repl-execution", "id": "1" }
The complete round-trip took 1.3 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
ansi boolean [optional]
Should ansi formatting be enabled for the response? Is
false
by default. - expression string [required] The expression to execute.
Message schema (
response-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'response-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
- stream string [required] The stream the message is from. Allows only the values: 'stdout', 'stderr'
- result string [required] The output of the execution.
Message schema (
end-repl-execution
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-repl.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'end-repl-execution'
- id string [optional] The id of the message, will be the same for the request.
-
-
Query Message (
request-query
)View Details. Query an analysis result for specific information.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-query alt Server-->>Client: response-query else Server-->>Client: error end deactivate Server
To send queries, you have to send an analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly query the same file. This message provides direct access to flowR's Query API. Please consult the Query API documentation for more information.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
Let's assume you want to query the following script:
library(ggplot) library(dplyr) library(readr) # read data with read_csv data <- read_csv('data.csv') data2 <- read_csv('data2.csv') m <- mean(data$x) print(m) data %>% ggplot(aes(x = x, y = y)) + geom_point() plot(data2$x, data2$y) points(data2$x, data2$y) print(mean(data2$k))
.
For this we first request the analysis, using a dummy
filetoken
ofx
to slice the file in the next request.{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "library(ggplot)\nlibrary(dplyr)\nlibrary(readr)\n\n# read data with read_csv\ndata <- read_csv('data.csv')\ndata2 <- read_csv('data2.csv')\n\nm <- mean(data$x) \nprint(m)\n\ndata %>%\n\tggplot(aes(x = x, y = y)) +\n\tgeom_point()\n\t\nplot(data2$x, data2$y)\npoints(data2$x, data2$y)\n\t\nprint(mean(data2$k))" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,15,10,0,\"expr\",false,\"library(ggplot)\"],[1,1,1,7,1,3,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[1,1,1,7,3,10,\"expr\",false,\"library\"],[1,8,1,8,2,10,\"'('\",true,\"(\"],[1,9,1,14,4,6,\"SYMBOL\",true,\"ggplot\"],[1,9,1,14,6,10,\"expr\",false,\"ggplot\"],[1,15,1,15,5,10,\"')'\",true,\")\"],[2,1,2,14,23,0,\"expr\",false,\"library(dplyr)\"],[2,1,2,7,14,16,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[2,1,2,7,16,23,\"expr\",false,\"library\"],[2,8,2,8,15,23,\"'('\",true,\"(\"],[2,9,2,13,17,19,\"SYMBOL\",true,\"dplyr\"],[2,9,2,13,19,23,\"expr\",false,\"dplyr\"],[2,14,2,14,18,23,\"')'\",true,\")\"],[3,1,3,14,36,0,\"expr\",false,\"library(readr)\"],[3,1,3,7,27,29,\"SYMBOL_FUNCTION_CALL\",true,\"library\"],[3,1,3,7,29,36,\"expr\",false,\"library\"],[3,8,3,8,28,36,\"'('\",true,\"(\"],[3,9,3,13,30,32,\"SYMBOL\",true,\"readr\"],[3,9,3,13,32,36,\"expr\",false,\"readr\"],[3,14,3,14,31,36,\"')'\",true,\")\"],[5,1,5,25,42,-59,\"COMMENT\",true,\"# read data with read_csv\"],[6,1,6,28,59,0,\"expr\",false,\"data <- read_csv('data.csv')\"],[6,1,6,4,45,47,\"SYMBOL\",true,\"data\"],[6,1,6,4,47,59,\"expr\",false,\"data\"],[6,6,6,7,46,59,\"LEFT_ASSIGN\",true,\"<-\"],[6,9,6,28,57,59,\"expr\",false,\"read_csv('data.csv')\"],[6,9,6,16,48,50,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[6,9,6,16,50,57,\"expr\",false,\"read_csv\"],[6,17,6,17,49,57,\"'('\",true,\"(\"],[6,18,6,27,51,53,\"STR_CONST\",true,\"'data.csv'\"],[6,18,6,27,53,57,\"expr\",false,\"'data.csv'\"],[6,28,6,28,52,57,\"')'\",true,\")\"],[7,1,7,30,76,0,\"expr\",false,\"data2 <- read_csv('data2.csv')\"],[7,1,7,5,62,64,\"SYMBOL\",true,\"data2\"],[7,1,7,5,64,76,\"expr\",false,\"data2\"],[7,7,7,8,63,76,\"LEFT_ASSIGN\",true,\"<-\"],[7,10,7,30,74,76,\"expr\",false,\"read_csv('data2.csv')\"],[7,10,7,17,65,67,\"SYMBOL_FUNCTION_CALL\",true,\"read_csv\"],[7,10,7,17,67,74,\"expr\",false,\"read_csv\"],[7,18,7,18,66,74,\"'('\",true,\"(\"],[7,19,7,29,68,70,\"STR_CONST\",true,\"'data2.csv'\"],[7,19,7,29,70,74,\"expr\",false,\"'data2.csv'\"],[7,30,7,30,69,74,\"')'\",true,\")\"],[9,1,9,17,98,0,\"expr\",false,\"m <- mean(data$x)\"],[9,1,9,1,81,83,\"SYMBOL\",true,\"m\"],[9,1,9,1,83,98,\"expr\",false,\"m\"],[9,3,9,4,82,98,\"LEFT_ASSIGN\",true,\"<-\"],[9,6,9,17,96,98,\"expr\",false,\"mean(data$x)\"],[9,6,9,9,84,86,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[9,6,9,9,86,96,\"expr\",false,\"mean\"],[9,10,9,10,85,96,\"'('\",true,\"(\"],[9,11,9,16,91,96,\"expr\",false,\"data$x\"],[9,11,9,14,87,89,\"SYMBOL\",true,\"data\"],[9,11,9,14,89,91,\"expr\",false,\"data\"],[9,15,9,15,88,91,\"'$'\",true,\"$\"],[9,16,9,16,90,91,\"SYMBOL\",true,\"x\"],[9,17,9,17,92,96,\"')'\",true,\")\"],[10,1,10,8,110,0,\"expr\",false,\"print(m)\"],[10,1,10,5,101,103,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[10,1,10,5,103,110,\"expr\",false,\"print\"],[10,6,10,6,102,110,\"'('\",true,\"(\"],[10,7,10,7,104,106,\"SYMBOL\",true,\"m\"],[10,7,10,7,106,110,\"expr\",false,\"m\"],[10,8,10,8,105,110,\"')'\",true,\")\"],[12,1,14,20,158,0,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y)) +\\n\\tgeom_point()\"],[12,1,13,33,149,158,\"expr\",false,\"data %>%\\n\\tggplot(aes(x = x, y = y))\"],[12,1,12,4,116,118,\"SYMBOL\",true,\"data\"],[12,1,12,4,118,149,\"expr\",false,\"data\"],[12,6,12,8,117,149,\"SPECIAL\",true,\"%>%\"],[13,9,13,33,147,149,\"expr\",false,\"ggplot(aes(x = x, y = y))\"],[13,9,13,14,120,122,\"SYMBOL_FUNCTION_CALL\",true,\"ggplot\"],[13,9,13,14,122,147,\"expr\",false,\"ggplot\"],[13,15,13,15,121,147,\"'('\",true,\"(\"],[13,16,13,32,142,147,\"expr\",false,\"aes(x = x, y = y)\"],[13,16,13,18,123,125,\"SYMBOL_FUNCTION_CALL\",true,\"aes\"],[13,16,13,18,125,142,\"expr\",false,\"aes\"],[13,19,13,19,124,142,\"'('\",true,\"(\"],[13,20,13,20,126,142,\"SYMBOL_SUB\",true,\"x\"],[13,22,13,22,127,142,\"EQ_SUB\",true,\"=\"],[13,24,13,24,128,130,\"SYMBOL\",true,\"x\"],[13,24,13,24,130,142,\"expr\",false,\"x\"],[13,25,13,25,129,142,\"','\",true,\",\"],[13,27,13,27,134,142,\"SYMBOL_SUB\",true,\"y\"],[13,29,13,29,135,142,\"EQ_SUB\",true,\"=\"],[13,31,13,31,136,138,\"SYMBOL\",true,\"y\"],[13,31,13,31,138,142,\"expr\",false,\"y\"],[13,32,13,32,137,142,\"')'\",true,\")\"],[13,33,13,33,143,147,\"')'\",true,\")\"],[13,35,13,35,148,158,\"'+'\",true,\"+\"],[14,9,14,20,156,158,\"expr\",false,\"geom_point()\"],[14,9,14,18,151,153,\"SYMBOL_FUNCTION_CALL\",true,\"geom_point\"],[14,9,14,18,153,156,\"expr\",false,\"geom_point\"],[14,19,14,19,152,156,\"'('\",true,\"(\"],[14,20,14,20,154,156,\"')'\",true,\")\"],[16,1,16,22,184,0,\"expr\",false,\"plot(data2$x, data2$y)\"],[16,1,16,4,163,165,\"SYMBOL_FUNCTION_CALL\",true,\"plot\"],[16,1,16,4,165,184,\"expr\",false,\"plot\"],[16,5,16,5,164,184,\"'('\",true,\"(\"],[16,6,16,12,170,184,\"expr\",false,\"data2$x\"],[16,6,16,10,166,168,\"SYMBOL\",true,\"data2\"],[16,6,16,10,168,170,\"expr\",false,\"data2\"],[16,11,16,11,167,170,\"'$'\",true,\"$\"],[16,12,16,12,169,170,\"SYMBOL\",true,\"x\"],[16,13,16,13,171,184,\"','\",true,\",\"],[16,15,16,21,179,184,\"expr\",false,\"data2$y\"],[16,15,16,19,175,177,\"SYMBOL\",true,\"data2\"],[16,15,16,19,177,179,\"expr\",false,\"data2\"],[16,20,16,20,176,179,\"'$'\",true,\"$\"],[16,21,16,21,178,179,\"SYMBOL\",true,\"y\"],[16,22,16,22,180,184,\"')'\",true,\")\"],[17,1,17,24,209,0,\"expr\",false,\"points(data2$x, data2$y)\"],[17,1,17,6,188,190,\"SYMBOL_FUNCTION_CALL\",true,\"points\"],[17,1,17,6,190,209,\"expr\",false,\"points\"],[17,7,17,7,189,209,\"'('\",true,\"(\"],[17,8,17,14,195,209,\"expr\",false,\"data2$x\"],[17,8,17,12,191,193,\"SYMBOL\",true,\"data2\"],[17,8,17,12,193,195,\"expr\",false,\"data2\"],[17,13,17,13,192,195,\"'$'\",true,\"$\"],[17,14,17,14,194,195,\"SYMBOL\",true,\"x\"],[17,15,17,15,196,209,\"','\",true,\",\"],[17,17,17,23,204,209,\"expr\",false,\"data2$y\"],[17,17,17,21,200,202,\"SYMBOL\",true,\"data2\"],[17,17,17,21,202,204,\"expr\",false,\"data2\"],[17,22,17,22,201,204,\"'$'\",true,\"$\"],[17,23,17,23,203,204,\"SYMBOL\",true,\"y\"],[17,24,17,24,205,209,\"')'\",true,\")\"],[19,1,19,20,235,0,\"expr\",false,\"print(mean(data2$k))\"],[19,1,19,5,215,217,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[19,1,19,5,217,235,\"expr\",false,\"print\"],[19,6,19,6,216,235,\"'('\",true,\"(\"],[19,7,19,19,230,235,\"expr\",false,\"mean(data2$k)\"],[19,7,19,10,218,220,\"SYMBOL_FUNCTION_CALL\",true,\"mean\"],[19,7,19,10,220,230,\"expr\",false,\"mean\"],[19,11,19,11,219,230,\"'('\",true,\"(\"],[19,12,19,18,225,230,\"expr\",false,\"data2$k\"],[19,12,19,16,221,223,\"SYMBOL\",true,\"data2\"],[19,12,19,16,223,225,\"expr\",false,\"data2\"],[19,17,19,17,222,225,\"'$'\",true,\"$\"],[19,18,19,18,224,225,\"SYMBOL\",true,\"k\"],[19,19,19,19,226,230,\"')'\",true,\")\"],[19,20,19,20,231,235,\"')'\",true,\")\"]",".meta":{"timing":4}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RFunctionCall","named":true,"location":[1,1,1,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[1,1,1,7],"content":"library","lexeme":"library","info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":0,"parent":3,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[1,9,1,14],"lexeme":"ggplot","value":{"type":"RSymbol","location":[1,9,1,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":1,"parent":2,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[2,1,2,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[2,1,2,7],"content":"library","lexeme":"library","info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":4,"parent":7,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[2,9,2,13],"lexeme":"dplyr","value":{"type":"RSymbol","location":[2,9,2,13],"content":"dplyr","lexeme":"dplyr","info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":5,"parent":6,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[3,1,3,7],"lexeme":"library","functionName":{"type":"RSymbol","location":[3,1,3,7],"content":"library","lexeme":"library","info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":8,"parent":11,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[3,9,3,13],"lexeme":"readr","value":{"type":"RSymbol","location":[3,9,3,13],"content":"readr","lexeme":"readr","info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":9,"parent":10,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":2,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[6,6,6,7],"lhs":{"type":"RSymbol","location":[6,1,6,4],"content":"data","lexeme":"data","info":{"fullRange":[6,1,6,4],"additionalTokens":[],"id":12,"parent":17,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[6,9,6,16],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[6,9,6,16],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":13,"parent":16,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[6,18,6,27],"lexeme":"'data.csv'","value":{"type":"RString","location":[6,18,6,27],"content":{"str":"data.csv","quotes":"'"},"lexeme":"'data.csv'","info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":14,"parent":15,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[6,1,6,28],"additionalTokens":[{"type":"RComment","location":[5,1,5,25],"content":" read data with read_csv","lexeme":"# read data with read_csv","info":{"fullRange":[6,1,6,28],"additionalTokens":[]}}],"id":17,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":3,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[7,7,7,8],"lhs":{"type":"RSymbol","location":[7,1,7,5],"content":"data2","lexeme":"data2","info":{"fullRange":[7,1,7,5],"additionalTokens":[],"id":18,"parent":23,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[7,10,7,17],"lexeme":"read_csv","functionName":{"type":"RSymbol","location":[7,10,7,17],"content":"read_csv","lexeme":"read_csv","info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":19,"parent":22,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[7,19,7,29],"lexeme":"'data2.csv'","value":{"type":"RString","location":[7,19,7,29],"content":{"str":"data2.csv","quotes":"'"},"lexeme":"'data2.csv'","info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":20,"parent":21,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":4,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[9,3,9,4],"lhs":{"type":"RSymbol","location":[9,1,9,1],"content":"m","lexeme":"m","info":{"fullRange":[9,1,9,1],"additionalTokens":[],"id":24,"parent":32,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"rhs":{"type":"RFunctionCall","named":true,"location":[9,6,9,9],"lexeme":"mean","functionName":{"type":"RSymbol","location":[9,6,9,9],"content":"mean","lexeme":"mean","info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":25,"parent":31,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[9,11,9,16],"lexeme":"data$x","value":{"type":"RAccess","location":[9,15,9,15],"lexeme":"$","accessed":{"type":"RSymbol","location":[9,11,9,14],"content":"data","lexeme":"data","info":{"fullRange":[9,11,9,14],"additionalTokens":[],"id":26,"parent":29,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[9,16,9,16],"lexeme":"x","value":{"type":"RSymbol","location":[9,16,9,16],"content":"x","lexeme":"x","info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":27,"parent":28,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":5,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[10,1,10,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[10,1,10,5],"content":"print","lexeme":"print","info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":33,"parent":36,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[10,7,10,7],"lexeme":"m","value":{"type":"RSymbol","location":[10,7,10,7],"content":"m","lexeme":"m","info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":34,"parent":35,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":6,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[13,35,13,35],"lhs":{"type":"RFunctionCall","named":true,"infixSpecial":true,"lexeme":"data %>%\n\tggplot(aes(x = x, y = y))","location":[12,6,12,8],"functionName":{"type":"RSymbol","location":[12,6,12,8],"lexeme":"%>%","content":"%>%","info":{"id":37,"parent":52,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[12,1,12,4],"value":{"type":"RSymbol","location":[12,1,12,4],"content":"data","lexeme":"data","info":{"fullRange":[12,1,12,4],"additionalTokens":[],"id":38,"parent":39,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,9,13,14],"value":{"type":"RFunctionCall","named":true,"location":[13,9,13,14],"lexeme":"ggplot","functionName":{"type":"RSymbol","location":[13,9,13,14],"content":"ggplot","lexeme":"ggplot","info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":40,"parent":50,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[13,16,13,32],"lexeme":"aes(x = x, y = y)","value":{"type":"RFunctionCall","named":true,"location":[13,16,13,18],"lexeme":"aes","functionName":{"type":"RSymbol","location":[13,16,13,18],"content":"aes","lexeme":"aes","info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":41,"parent":48,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[13,20,13,20],"lexeme":"x","name":{"type":"RSymbol","location":[13,20,13,20],"content":"x","lexeme":"x","info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":42,"parent":44,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"value":{"type":"RSymbol","location":[13,24,13,24],"content":"x","lexeme":"x","info":{"fullRange":[13,24,13,24],"additionalTokens":[],"id":43,"parent":44,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[13,27,13,27],"lexeme":"y","name":{"type":"RSymbol","location":[13,27,13,27],"content":"y","lexeme":"y","info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":45,"parent":47,"role":"arg-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"value":{"type":"RSymbol","location":[13,31,13,31],"content":"y","lexeme":"y","info":{"fullRange":[13,31,13,31],"additionalTokens":[],"id":46,"parent":47,"role":"arg-value","index":1,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","role":"binop-lhs"}},"rhs":{"type":"RFunctionCall","named":true,"location":[14,9,14,18],"lexeme":"geom_point","functionName":{"type":"RSymbol","location":[14,9,14,18],"content":"geom_point","lexeme":"geom_point","info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":53,"parent":54,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":7,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[16,1,16,4],"lexeme":"plot","functionName":{"type":"RSymbol","location":[16,1,16,4],"content":"plot","lexeme":"plot","info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":56,"parent":67,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[16,6,16,12],"lexeme":"data2$x","value":{"type":"RAccess","location":[16,11,16,11],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,6,16,10],"content":"data2","lexeme":"data2","info":{"fullRange":[16,6,16,10],"additionalTokens":[],"id":57,"parent":60,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,12,16,12],"lexeme":"x","value":{"type":"RSymbol","location":[16,12,16,12],"content":"x","lexeme":"x","info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":58,"parent":59,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[16,15,16,21],"lexeme":"data2$y","value":{"type":"RAccess","location":[16,20,16,20],"lexeme":"$","accessed":{"type":"RSymbol","location":[16,15,16,19],"content":"data2","lexeme":"data2","info":{"fullRange":[16,15,16,19],"additionalTokens":[],"id":62,"parent":65,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[16,21,16,21],"lexeme":"y","value":{"type":"RSymbol","location":[16,21,16,21],"content":"y","lexeme":"y","info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":63,"parent":64,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":8,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[17,1,17,6],"lexeme":"points","functionName":{"type":"RSymbol","location":[17,1,17,6],"content":"points","lexeme":"points","info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":68,"parent":79,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[17,8,17,14],"lexeme":"data2$x","value":{"type":"RAccess","location":[17,13,17,13],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,8,17,12],"content":"data2","lexeme":"data2","info":{"fullRange":[17,8,17,12],"additionalTokens":[],"id":69,"parent":72,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,14,17,14],"lexeme":"x","value":{"type":"RSymbol","location":[17,14,17,14],"content":"x","lexeme":"x","info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":70,"parent":71,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}},{"type":"RArgument","location":[17,17,17,23],"lexeme":"data2$y","value":{"type":"RAccess","location":[17,22,17,22],"lexeme":"$","accessed":{"type":"RSymbol","location":[17,17,17,21],"content":"data2","lexeme":"data2","info":{"fullRange":[17,17,17,21],"additionalTokens":[],"id":74,"parent":77,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[17,23,17,23],"lexeme":"y","value":{"type":"RSymbol","location":[17,23,17,23],"content":"y","lexeme":"y","info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":75,"parent":76,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":9,"role":"expr-list-child"}},{"type":"RFunctionCall","named":true,"location":[19,1,19,5],"lexeme":"print","functionName":{"type":"RSymbol","location":[19,1,19,5],"content":"print","lexeme":"print","info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":80,"parent":89,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[19,7,19,19],"lexeme":"mean(data2$k)","value":{"type":"RFunctionCall","named":true,"location":[19,7,19,10],"lexeme":"mean","functionName":{"type":"RSymbol","location":[19,7,19,10],"content":"mean","lexeme":"mean","info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":81,"parent":87,"role":"call-name","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"arguments":[{"type":"RArgument","location":[19,12,19,18],"lexeme":"data2$k","value":{"type":"RAccess","location":[19,17,19,17],"lexeme":"$","accessed":{"type":"RSymbol","location":[19,12,19,16],"content":"data2","lexeme":"data2","info":{"fullRange":[19,12,19,16],"additionalTokens":[],"id":82,"parent":85,"role":"accessed","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"operator":"$","access":[{"type":"RArgument","location":[19,18,19,18],"lexeme":"k","value":{"type":"RSymbol","location":[19,18,19,18],"content":"k","lexeme":"k","info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":83,"parent":84,"role":"arg-value","index":0,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-11382-BAcW3NSg2R1a-.R","role":"root","index":0}},".meta":{"timing":2}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":3,"name":"library","type":2},{"nodeId":7,"name":"library","type":2},{"nodeId":11,"name":"library","type":2},{"nodeId":17,"name":"<-","type":2},{"nodeId":23,"name":"<-","type":2},{"nodeId":32,"name":"<-","type":2},{"nodeId":16,"name":"read_csv","type":2},{"nodeId":22,"name":"read_csv","type":2},{"nodeId":29,"name":"$","type":2},{"nodeId":60,"name":"$","type":2},{"nodeId":65,"name":"$","type":2},{"nodeId":72,"name":"$","type":2},{"nodeId":77,"name":"$","type":2},{"nodeId":85,"name":"$","type":2},{"nodeId":31,"name":"mean","type":2},{"nodeId":87,"name":"mean","type":2},{"nodeId":36,"name":"print","type":2},{"nodeId":89,"name":"print","type":2},{"nodeId":43,"name":"x","type":1},{"nodeId":46,"name":"y","type":1},{"nodeId":48,"name":"aes","type":2},{"nodeId":50,"name":"ggplot","type":2},{"nodeId":52,"name":"%>%","type":2},{"nodeId":54,"name":"geom_point","type":2},{"nodeId":55,"name":"+","type":2},{"nodeId":67,"name":"plot","type":2},{"nodeId":79,"name":"points","type":2}],"out":[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]},{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]},{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}],"environment":{"current":{"id":240,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11382-BAcW3NSg2R1a-.R"],"_unknownSideEffects":[3,7,11,{"id":36,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":50,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":67,"linkTo":{"type":"link-to-last-call","callName":{}}},{"id":89,"linkTo":{"type":"link-to-last-call","callName":{}}}],"rootVertices":[1,3,5,7,9,11,14,16,12,17,20,22,18,23,26,27,29,31,24,32,34,36,38,43,44,46,47,48,50,52,54,55,57,58,60,62,63,65,67,69,70,72,74,75,77,79,82,83,85,87,89],"vertexInformation":[[1,{"tag":"value","id":1}],[3,{"tag":"function-call","id":3,"name":"library","onlyBuiltin":true,"args":[{"nodeId":1,"type":32}],"origin":["builtin:library"]}],[5,{"tag":"value","id":5}],[7,{"tag":"function-call","id":7,"name":"library","onlyBuiltin":true,"args":[{"nodeId":5,"type":32}],"origin":["builtin:library"]}],[9,{"tag":"value","id":9}],[11,{"tag":"function-call","id":11,"name":"library","onlyBuiltin":true,"args":[{"nodeId":9,"type":32}],"origin":["builtin:library"]}],[14,{"tag":"value","id":14}],[16,{"tag":"function-call","id":16,"environment":{"current":{"id":147,"parent":"<BuiltInEnvironment>","memory":[]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":14,"type":32}],"origin":["function"]}],[12,{"tag":"variable-definition","id":12}],[17,{"tag":"function-call","id":17,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":12,"type":32},{"nodeId":16,"type":32}],"origin":["builtin:assignment"]}],[20,{"tag":"value","id":20}],[22,{"tag":"function-call","id":22,"environment":{"current":{"id":157,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]]]},"level":0},"name":"read_csv","onlyBuiltin":false,"args":[{"nodeId":20,"type":32}],"origin":["function"]}],[18,{"tag":"variable-definition","id":18}],[23,{"tag":"function-call","id":23,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":18,"type":32},{"nodeId":22,"type":32}],"origin":["builtin:assignment"]}],[26,{"tag":"use","id":26}],[27,{"tag":"value","id":27}],[29,{"tag":"function-call","id":29,"name":"$","onlyBuiltin":true,"args":[{"nodeId":26,"type":32},{"nodeId":27,"type":32}],"origin":["builtin:access"]}],[31,{"tag":"function-call","id":31,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":29,"type":32}],"origin":["builtin:default"]}],[24,{"tag":"variable-definition","id":24}],[32,{"tag":"function-call","id":32,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":24,"type":32},{"nodeId":31,"type":32}],"origin":["builtin:assignment"]}],[34,{"tag":"use","id":34}],[36,{"tag":"function-call","id":36,"name":"print","onlyBuiltin":true,"args":[{"nodeId":34,"type":32}],"origin":["builtin:default"]}],[38,{"tag":"use","id":38}],[43,{"tag":"use","id":43}],[44,{"tag":"use","id":44}],[46,{"tag":"use","id":46}],[47,{"tag":"use","id":47}],[48,{"tag":"function-call","id":48,"environment":{"current":{"id":189,"parent":"<BuiltInEnvironment>","memory":[["data",[{"nodeId":12,"name":"data","type":1,"definedAt":17,"value":[]}]],["data2",[{"nodeId":18,"name":"data2","type":1,"definedAt":23,"value":[]}]],["m",[{"nodeId":24,"name":"m","type":1,"definedAt":32,"value":[31]}]]]},"level":0},"name":"aes","onlyBuiltin":false,"args":[{"nodeId":44,"name":"x","type":32},{"nodeId":47,"name":"y","type":32}],"origin":["function"]}],[50,{"tag":"function-call","id":50,"name":"ggplot","onlyBuiltin":true,"args":[{"nodeId":38,"type":2},{"nodeId":48,"type":32}],"origin":["builtin:default"]}],[52,{"tag":"function-call","id":52,"name":"%>%","onlyBuiltin":true,"args":[{"nodeId":38,"type":32},{"nodeId":50,"type":32}],"origin":["builtin:pipe"]}],[54,{"tag":"function-call","id":54,"name":"geom_point","onlyBuiltin":true,"args":[],"origin":["builtin:default"]}],[55,{"tag":"function-call","id":55,"name":"+","onlyBuiltin":true,"args":[{"nodeId":52,"type":32},{"nodeId":54,"type":32}],"origin":["builtin:default"]}],[57,{"tag":"use","id":57}],[58,{"tag":"value","id":58}],[60,{"tag":"function-call","id":60,"name":"$","onlyBuiltin":true,"args":[{"nodeId":57,"type":32},{"nodeId":58,"type":32}],"origin":["builtin:access"]}],[62,{"tag":"use","id":62}],[63,{"tag":"value","id":63}],[65,{"tag":"function-call","id":65,"name":"$","onlyBuiltin":true,"args":[{"nodeId":62,"type":32},{"nodeId":63,"type":32}],"origin":["builtin:access"]}],[67,{"tag":"function-call","id":67,"name":"plot","onlyBuiltin":true,"args":[{"nodeId":60,"type":32},{"nodeId":65,"type":32}],"origin":["builtin:default"]}],[69,{"tag":"use","id":69}],[70,{"tag":"value","id":70}],[72,{"tag":"function-call","id":72,"name":"$","onlyBuiltin":true,"args":[{"nodeId":69,"type":32},{"nodeId":70,"type":32}],"origin":["builtin:access"]}],[74,{"tag":"use","id":74}],[75,{"tag":"value","id":75}],[77,{"tag":"function-call","id":77,"name":"$","onlyBuiltin":true,"args":[{"nodeId":74,"type":32},{"nodeId":75,"type":32}],"origin":["builtin:access"]}],[79,{"tag":"function-call","id":79,"name":"points","onlyBuiltin":true,"args":[{"nodeId":72,"type":32},{"nodeId":77,"type":32}],"origin":["builtin:default"]}],[82,{"tag":"use","id":82}],[83,{"tag":"value","id":83}],[85,{"tag":"function-call","id":85,"name":"$","onlyBuiltin":true,"args":[{"nodeId":82,"type":32},{"nodeId":83,"type":32}],"origin":["builtin:access"]}],[87,{"tag":"function-call","id":87,"name":"mean","onlyBuiltin":true,"args":[{"nodeId":85,"type":32}],"origin":["builtin:default"]}],[89,{"tag":"function-call","id":89,"name":"print","onlyBuiltin":true,"args":[{"nodeId":87,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[3,[[1,{"types":64}],["built-in:library",{"types":5}]]],[7,[[5,{"types":64}],["built-in:library",{"types":5}]]],[11,[[9,{"types":64}],["built-in:library",{"types":5}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":5}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":5}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":5}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":5}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":5}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":5}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":5}]]],[44,[[43,{"types":1}]]],[48,[[43,{"types":1}],[44,{"types":64}],[46,{"types":1}],[47,{"types":64}]]],[47,[[46,{"types":1}]]],[50,[[48,{"types":65}],["built-in:ggplot",{"types":5}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":5}]]],[54,[["built-in:geom_point",{"types":5}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":5}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":5}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":5}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":5}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":5}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":5}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":5}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":5}]]],[89,[[87,{"types":73}],["built-in:print",{"types":5}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
-
request-query
(request)Show Details
{ "type": "request-query", "id": "2", "filetoken": "x", "query": [ { "type": "compound", "query": "call-context", "commonArguments": { "kind": "visualize", "subkind": "text", "callTargets": "global" }, "arguments": [ { "callName": "^mean$" }, { "callName": "^print$", "callTargets": "local" } ] } ] }
-
response-query
(response)Show Details
{ "type": "response-query", "id": "2", "results": { "call-context": { ".meta": { "timing": 1 }, "kinds": { "visualize": { "subkinds": { "text": [ { "id": 31, "name": "mean", "calls": [ "built-in" ] }, { "id": 87, "name": "mean", "calls": [ "built-in" ] } ] } } } }, ".meta": { "timing": 1 } } }
The complete round-trip took 27.2 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
Request a query to be run on the file analysis information.
- type string [required] The type of the message. Allows only the values: 'request-query'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
-
query array [required]
The query to run on the file analysis information.
Valid item types:
-
. alternatives
Any query
-
. alternatives
Supported queries
-
. object
Call context query used to find calls in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'call-context'
- callName string [required] Regex regarding the function name!
-
callNameExact boolean [optional]
Should we automatically add the
^
and$
anchors to the regex to make it an exact match? -
kind string [optional]
The kind of the call, this can be used to group calls together (e.g., linking
plot
tovisualize
). Defaults to.
-
subkind string [optional]
The subkind of the call, this can be used to uniquely identify the respective call type when grouping the output (e.g., the normalized name, linking
ggplot
toplot
). Defaults to.
-
callTargets string [optional]
Call targets the function may have. This defaults to
any
. Request this specifically to gain all call targets we can resolve. Allows only the values: 'global', 'must-include-global', 'local', 'must-include-local', 'any' - ignoreParameterValues boolean [optional] Should we ignore default values for parameters in the results?
-
includeAliases boolean [optional]
Consider a case like
f <- function_of_interest
, do you want uses off
to be included in the results? -
fileFilter object [optional]
Filter that, when set, a node's file attribute must match to be considered
- fileFilter string [required] Regex that a node's file attribute must match to be considered
-
includeUndefinedFiles boolean [optional]
If
fileFilter
is set, but a nodesfile
attribute isundefined
, should we include it in the results? Defaults totrue
.
-
linkTo alternatives [optional]
Links the current call to the last call of the given kind. This way, you can link a call like
points
to the latest graphics plot etc.-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. array
Valid item types:
-
. object
- type string [required] The type of the linkTo sub-query. Allows only the values: 'link-to-last-call'
-
callName string [required]
Regex regarding the function name of the last call. Similar to
callName
, strings are interpreted as a regular expression. - ignoreIf function [optional] Should we ignore this (source) call? Currently, there is no well working serialization for this.
- cascadeIf function [optional] Should we continue searching after the link was created? Currently, there is no well working serialization for this.
- attachLinkInfo object [optional] Additional information to attach to the link.
-
. object
-
. object
-
. object
The config query retrieves the current configuration of the flowR instance.
- type string [required] The type of the query. Allows only the values: 'config'
-
. object
The control flow query provides the control flow graph of the analysis, optionally simplified.
- type string [required] The type of the query. Allows only the values: 'control-flow'
-
config object [optional]
Optional configuration for the control flow query.
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
- . string Allows only the values: 'unique-cf-sets', 'analyze-dead-code', 'remove-dead-code', 'to-basic-blocks'
-
simplificationPasses array
The simplification passes to apply to the control flow graph. If unset, the default simplification order will be used.
Valid item types:
-
. object
The dataflow query simply returns the dataflow graph, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'dataflow'
-
. object
The dataflow-lens query returns a simplified view on the dataflow graph
- type string [required] The type of the query. Allows only the values: 'dataflow-lens'
-
. object
The df-shape query retrieves information on the shape of dataframes
- type string [required] The type of the query. Allows only the values: 'df-shape'
- criterion string [optional] The slicing criterion of the node to get the dataframe shape for.
-
. object
The id map query retrieves the id map from the normalized AST.
- type string [required] The type of the query. Allows only the values: 'id-map'
-
. object
The normalized AST query simply returns the normalized AST, there is no need to pass it multiple times!
- type string [required] The type of the query. Allows only the values: 'normalized-ast'
-
. object
The cluster query calculates and returns all clusters in the dataflow graph.
- type string [required] The type of the query. Allows only the values: 'dataflow-cluster'
-
. object
Slice query used to slice the dataflow graph
- type string [required] The type of the query. Allows only the values: 'static-slice'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
- noReconstruction boolean [optional] Do not reconstruct the slice into readable code.
- noMagicComments boolean [optional] Should the magic comments (force-including lines within the slice) be ignored?
-
. object
Lineage query used to find the lineage of a node in the dataflow graph
- type string [required] The type of the query. Allows only the values: 'lineage'
- criterion string [required] The slicing criterion of the node to get the lineage of.
-
. object
The dependencies query retrieves and returns the set of all dependencies in the dataflow graph, which includes libraries, sourced files, read data, and written data.
- type string [required] The type of the query. Allows only the values: 'dependencies'
- ignoreDefaultFunctions boolean [optional] Should the set of functions that are detected by default be ignored/skipped?
-
libraryFunctions array [optional]
The set of library functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
sourceFunctions array [optional]
The set of source functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
readFunctions array [optional]
The set of data reading functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
writeFunctions array [optional]
The set of data writing functions to search for.
Valid item types:
-
. object
- name string [required] The name of the library function.
- package string [optional] The package name of the library function
- argIdx number [optional] The index of the argument that contains the library name.
- argName string [optional] The name of the argument that contains the library name.
-
. object
-
. object
The location map query retrieves the location of every id in the ast.
- type string [required] The type of the query. Allows only the values: 'location-map'
-
. object
The search query searches the normalized AST and dataflow graph for nodes that match the given search query.
- type string [required] The type of the query. Allows only the values: 'search'
- search object [required] The search query to execute.
-
. object
Happens-Before tracks whether a always happens before b.
- type string [required] The type of the query. Allows only the values: 'happens-before'
- a string [required] The first slicing criterion.
- b string [required] The second slicing criterion.
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'resolve-value'
-
criteria array [required]
The slicing criteria to use.
Valid item types:
- . string
-
. object
The project query provides information on the analyzed project.
- type string [required] The type of the query. Allows only the values: 'project'
-
. object
The resolve value query used to get definitions of an identifier
- type string [required] The type of the query. Allows only the values: 'origin'
- criterion string [required] The slicing criteria to use
-
. object
The linter query lints for the given set of rules and returns the result.
- type string [required] The type of the query. Allows only the values: 'linter'
-
rules array
The rules to lint for. If unset, all rules will be included.
Valid item types:
- . string Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation'
-
. object
- name string [required] Allows only the values: 'deprecated-functions', 'file-path-validity', 'seeded-randomness', 'absolute-file-paths', 'unused-definitions', 'naming-convention', 'dataframe-access-validation'
- config object
-
. object
Call context query used to find calls in the dataflow graph
-
. alternatives
Virtual queries (used for structure)
-
. object
Compound query used to combine queries of the same type
- type string [required] The type of the query. Allows only the values: 'compound'
- query string [required] The query to run on the file analysis information.
- commonArguments object [required] Common arguments for all queries.
-
arguments array [required]
Arguments for each query.
Valid item types:
- . object
-
. object
Compound query used to combine queries of the same type
-
. alternatives
Supported queries
-
. alternatives
Any query
Message schema (
response-query
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-query.ts
.-
. object
The response to a query request.
- type string [required] Allows only the values: 'response-query'
- id string [optional] The id of the message, will be the same for the request.
- results object [required] The results of the query.
-
-
Lineage Message (
request-lineage
)View Details. (deprecated) Obtain the lineage of a given slicing criterion.
sequenceDiagram autonumber participant Client participant Server Client->>+Server: request-lineage alt Server-->>Client: response-lineage else Server-->>Client: error end deactivate Server
We deprecated the lineage request in favor of the
lineage
Query.In order to retrieve the lineage of an object, you have to send a file analysis request first. The
filetoken
you assign is of use here as you can re-use it to repeatedly retrieve the lineage of the same file. Besides that, you will need to add a criterion that specifies the object whose lineage you're interested in.Example of the
request-query
MessageNote: even though we pretty-print these messages, they are sent as a single line, ending with a newline.
The following lists all messages that were sent and received in case you want to reproduce the scenario:
-
hello
(response)Show Details
The first message is always a hello message.
{ "type": "hello", "clientName": "client-0", "versions": { "flowr": "2.2.16", "r": "4.5.0", "engine": "r-shell" } }
-
request-file-analysis
(request)Show Details
{ "type": "request-file-analysis", "id": "1", "filetoken": "x", "content": "x <- 1\nx + 1" }
-
response-file-analysis
(response)Show Details
See above for the general structure of the response.
As the code is pretty long, we inhibit pretty printing and syntax highlighting (JSON, hiding built-in):
{"type":"response-file-analysis","format":"json","id":"1","results":{"parse":{"parsed":"[1,1,1,6,7,0,\"expr\",false,\"x <- 1\"],[1,1,1,1,1,3,\"SYMBOL\",true,\"x\"],[1,1,1,1,3,7,\"expr\",false,\"x\"],[1,3,1,4,2,7,\"LEFT_ASSIGN\",true,\"<-\"],[1,6,1,6,4,5,\"NUM_CONST\",true,\"1\"],[1,6,1,6,5,7,\"expr\",false,\"1\"],[2,1,2,5,16,0,\"expr\",false,\"x + 1\"],[2,1,2,1,10,12,\"SYMBOL\",true,\"x\"],[2,1,2,1,12,16,\"expr\",false,\"x\"],[2,3,2,3,11,16,\"'+'\",true,\"+\"],[2,5,2,5,13,14,\"NUM_CONST\",true,\"1\"],[2,5,2,5,14,16,\"expr\",false,\"1\"]",".meta":{"timing":3}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R"}},"rhs":{"location":[1,6,1,6],"lexeme":"1","info":{"fullRange":[1,6,1,6],"additionalTokens":[],"id":1,"parent":2,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"<-","lexeme":"<-","info":{"fullRange":[1,1,1,6],"additionalTokens":[],"id":2,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R","index":0,"role":"expr-list-child"}},{"type":"RBinaryOp","location":[2,3,2,3],"lhs":{"type":"RSymbol","location":[2,1,2,1],"content":"x","lexeme":"x","info":{"fullRange":[2,1,2,1],"additionalTokens":[],"id":3,"parent":5,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R"}},"rhs":{"location":[2,5,2,5],"lexeme":"1","info":{"fullRange":[2,5,2,5],"additionalTokens":[],"id":4,"parent":5,"role":"binop-rhs","index":1,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R"},"type":"RNumber","content":{"num":1,"complexNumber":false,"markedAsInt":false}},"operator":"+","lexeme":"+","info":{"fullRange":[2,1,2,5],"additionalTokens":[],"id":5,"parent":6,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-11382-7TilETY2jC9F-.R","role":"root","index":0}},".meta":{"timing":1}},"dataflow":{"unknownReferences":[],"in":[{"nodeId":2,"name":"<-","type":2},{"nodeId":5,"name":"+","type":2}],"out":[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}],"environment":{"current":{"id":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-11382-7TilETY2jC9F-.R"],"_unknownSideEffects":[],"rootVertices":[1,0,2,3,4,5],"vertexInformation":[[1,{"tag":"value","id":1}],[0,{"tag":"variable-definition","id":0}],[2,{"tag":"function-call","id":2,"name":"<-","onlyBuiltin":true,"args":[{"nodeId":0,"type":32},{"nodeId":1,"type":32}],"origin":["builtin:assignment"]}],[3,{"tag":"use","id":3}],[4,{"tag":"value","id":4}],[5,{"tag":"function-call","id":5,"name":"+","onlyBuiltin":true,"args":[{"nodeId":3,"type":32},{"nodeId":4,"type":32}],"origin":["builtin:default"]}]],"edgeInformation":[[2,[[1,{"types":64}],[0,{"types":72}],["built-in:<-",{"types":5}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":5}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
-
request-lineage
(request)Show Details
{ "type": "request-lineage", "id": "2", "filetoken": "x", "criterion": "2@x" }
-
response-lineage
(response)Show Details
The response contains the lineage of the desired object in form of an array of IDs (as the representation of a set).
{ "type": "response-lineage", "id": "2", "lineage": [ 3, 0, 1, 2, "built-in:<-" ] }
The complete round-trip took 8.0 ms (including time required to validate the messages, start, and stop the internal mock server).
Message schema (
request-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] The type of the message. Allows only the values: 'request-lineage'
- id string [optional] If you give the id, the response will be sent to the client with the same id.
- filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
- criterion string [required] The criterion to start the lineage from.
Message schema (
response-lineage
)For the definition of the hello message, please see it's implementation at
./src/cli/repl/server/messages/message-lineage.ts
.-
. object
- type string [required] Allows only the values: 'response-lineage'
- id string [optional] The id of the message, will be the same for the request.
-
lineage array [required]
The lineage of the given criterion.
Valid item types:
- . string
-
If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.
-
Using Netcat
Without Websocket
Suppose, you want to launch the server using a docker container. Then, start the server by (forwarding the internal default port):
docker run -p1042:1042 -it --rm eagleoutice/flowr --server
Now, using a tool like netcat to connect:
nc 127.0.0.1 1042
Within the started session, type the following message (as a single line) and press enter to see the response:
{"type":"request-file-analysis","content":"x <- 1","id":"1"}
- Using Python
Without Websocket
In Python, a similar process would look like this. After starting the server as with using netcat, you can use the following script to connect:
import socket with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 1042)) print(s.recv(4096)) # for the hello message s.send(b'{"type":"request-file-analysis","content":"x <- 1","id":"1"}\n') print(s.recv(65536)) # for the response (please use a more sophisticated mechanism)
Note
To execute arbitrary R commands with a repl request, flowR has to be started explicitly with --r-session-access
.
Please be aware that this introduces a security risk and note that this relies on the r-shell
engine.
Although primarily meant for users to explore, there is nothing which forbids simply calling flowR as a subprocess to use standard-in, -output, and -error for communication (although you can access the REPL using the server as well, with the REPL Request message).
The read-eval-print loop (REPL) works relatively simple.
You can submit an expression (using enter),
which is interpreted as an R expression by default but interpreted as a command if it starts with a colon (:
).
The best command to get started with the REPL is :help
.
Besides, you can leave the REPL either with the command :quit
or by pressing CTRL+C twice.
Available Commands
We currently offer the following commands (this with a [*]
suffix are available with and without the star):
Command | Description |
---|---|
:quit | End the repl (aliases: :q, :exit) |
:execute | Execute the given code as R code (essentially similar to using now command). This requires the --r-session-access flag to be set and requires the r-shell engine. (aliases: :e, :r) |
:controlflow[*] | Get mermaid code for the control-flow graph of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfg, :cf) |
:controlflowbb[*] | Get mermaid code for the control-flow graph with basic blocks, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :cfgb, :cfb) |
:dataflow[*] | Get mermaid code for the dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :d, :df) |
:normalize[*] | Get mermaid code for the normalized AST of R code, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (alias: :n) |
:dataflowsimple[*] | Get mermaid code for the simplified dataflow graph, start with 'file://' to indicate a file (star: Returns the URL to mermaid.live) (aliases: :ds, :dfs) |
:lineage | Get the lineage of an R object (alias: :lin) |
:parse | Prints ASCII Art of the parsed, unmodified AST, start with 'file://' to indicate a file (alias: :p) |
:version | Prints the version of flowR as well as the current version of R |
:query[*] | Query the given R code, start with 'file://' to indicate a file. The query is to be a valid query in json format (use 'help' to get more information). (star: Similar to query, but returns the output in json format.) |
:help | Show help information (aliases: :h, :?) |
To retrieve a URL to the mermaid diagram of the dataflow of a given expression,
use :dataflow*
(or :dataflow
to get the mermaid code in the cli):
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46X1xuICAgIGxpbmtTdHlsZSAyIHN0cm9rZTpncmF5O1xuICAgIDAgLS0+fFwiZGVmaW5lZC1ieVwifCAzXG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDRcbiAgICA0IC0tPnxcImFyZ3VtZW50XCJ8IDNcbiAgICA0IC0tPnxcInJldHVybnMsIGFyZ3VtZW50XCJ8IDBcbiAgICA0IC0uLT58XCJyZWFkcywgY2FsbHNcInwgYnVpbHQtaW46Xy1cbiAgICBsaW5rU3R5bGUgNyBzdHJva2U6Z3JheTsiLCJtZXJtYWlkIjp7ImF1dG9TeW5jIjp0cnVlfX0=
Retrieve the dataflow graph of the expression y <- 1 + x
. It looks like this:
flowchart LR
1{{"`#91;RNumber#93; 1
(1)
*1.6*`"}}
2(["`#91;RSymbol#93; x
(2)
*1.10*`"])
3[["`#91;RBinaryOp#93; #43;
(3)
*1.6-10*
(1, 2)`"]]
built-in:_["`Built-In:
#43;`"]
style built-in:_ stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
0["`#91;RSymbol#93; y
(0)
*1.1*`"]
4[["`#91;RBinaryOp#93; #60;#45;
(4)
*1.1-10*
(0, 3)`"]]
built-in:_-["`Built-In:
#60;#45;`"]
style built-in:_- stroke:gray,fill:lightgray,stroke-width:2px,opacity:.8;
3 -->|"reads, argument"| 1
3 -->|"reads, argument"| 2
3 -.->|"reads, calls"| built-in:_
linkStyle 2 stroke:gray;
0 -->|"defined-by"| 3
0 -->|"defined-by"| 4
4 -->|"argument"| 3
4 -->|"returns, argument"| 0
4 -.->|"reads, calls"| built-in:_-
linkStyle 7 stroke:gray;
R Code of the Dataflow Graph
The analysis required 1.9 ms (including parse and normalize, using the r-shell engine) within the generation environment. We encountered no unknown side effects during the analysis.
y <- 1 + x
For the slicing with :slicer
, you have access to the same magic comments as with the slice request.
Many commands that allow for an R-expression (like :dataflow*
) allow for a file as well
if the argument starts with file://
.
If you are working from the root directory of the flowR repository, the following gives you the parsed AST of the example file using the :parse
command:
$ docker run -it --rm eagleoutice/flowr # or npm run flowr
flowR repl using flowR v2.2.16, R v4.5.0 (r-shell engine)
R> :parse file://test/testfiles/example.R
Output
exprlist
├ expr
│ ├ expr
│ │ ╰ SYMBOL "sum" (1:1─3)
│ ├ LEFT_ASSIGN "<-" (1:5─6)
│ ╰ expr
│ ╰ NUM_CONST "0" (1:8)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "product" (2:1─7)
│ ├ LEFT_ASSIGN "<-" (2:9─10)
│ ╰ expr
│ ╰ NUM_CONST "1" (2:12)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "w" (3:1)
│ ├ LEFT_ASSIGN "<-" (3:3─4)
│ ╰ expr
│ ╰ NUM_CONST "7" (3:6)
├ expr
│ ├ expr
│ │ ╰ SYMBOL "N" (4:1)
│ ├ LEFT_ASSIGN "<-" (4:3─4)
│ ╰ expr
│ ╰ NUM_CONST "10" (4:6─7)
├ expr
│ ├ FOR "for" (6:1─3)
│ ├ forcond
│ │ ├ ( "(" (6:5)
│ │ ├ SYMBOL "i" (6:6)
│ │ ├ IN "in" (6:8─9)
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ NUM_CONST "1" (6:11)
│ │ │ ├ : ":" (6:12)
│ │ │ ╰ expr
│ │ │ ├ ( "(" (6:13)
│ │ │ ├ expr
│ │ │ │ ├ expr
│ │ │ │ │ ╰ SYMBOL "N" (6:14)
│ │ │ │ ├ - "-" (6:15)
│ │ │ │ ╰ expr
│ │ │ │ ╰ NUM_CONST "1" (6:16)
│ │ │ ╰ ) ")" (6:17)
│ │ ╰ ) ")" (6:18)
│ ╰ expr
│ ├ { "{" (6:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "sum" (7:3─5)
│ │ ├ LEFT_ASSIGN "<-" (7:7─8)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ├ expr
│ │ │ │ ╰ SYMBOL "sum" (7:10─12)
│ │ │ ├ + "+" (7:14)
│ │ │ ╰ expr
│ │ │ ╰ SYMBOL "i" (7:16)
│ │ ├ + "+" (7:18)
│ │ ╰ expr
│ │ ╰ SYMBOL "w" (7:20)
│ ├ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:3─9)
│ │ ├ LEFT_ASSIGN "<-" (8:11─12)
│ │ ╰ expr
│ │ ├ expr
│ │ │ ╰ SYMBOL "product" (8:14─20)
│ │ ├ * "*" (8:22)
│ │ ╰ expr
│ │ ╰ SYMBOL "i" (8:24)
│ ╰ } "}" (9:1)
├ expr
│ ├ expr
│ │ ╰ SYMBOL_FUNCTION_CALL "cat" (11:1─3)
│ ├ ( "(" (11:4)
│ ├ expr
│ │ ╰ STR_CONST "\"Sum:\"" (11:5─10)
│ ├ , "," (11:11)
│ ├ expr
│ │ ╰ SYMBOL "sum" (11:13─15)
│ ├ , "," (11:16)
│ ├ expr
│ │ ╰ STR_CONST "\"\\n\"" (11:18─21)
│ ╰ ) ")" (11:22)
╰ expr
├ expr
│ ╰ SYMBOL_FUNCTION_CALL "cat" (12:1─3)
├ ( "(" (12:4)
├ expr
│ ╰ STR_CONST "\"Product:\"" (12:5─14)
├ , "," (12:15)
├ expr
│ ╰ SYMBOL "product" (12:17─23)
├ , "," (12:24)
├ expr
│ ╰ STR_CONST "\"\\n\"" (12:26─29)
╰ ) ")" (12:30)
Retrieve the parsed AST of the example file.
File Content
sum <- 0
product <- 1
w <- 7
N <- 10
for (i in 1:(N-1)) {
sum <- sum + i + w
product <- product * i
}
cat("Sum:", sum, "\n")
cat("Product:", product, "\n")
As flowR directly transforms this AST the output focuses on being human-readable instead of being machine-readable.
When running flowR, you may want to specify some behaviors with a dedicated configuration file.
By default, flowR looks for a file named flowr.json
in the current working directory (or any higher directory).
You can also specify a different file with --config-file
or pass the configuration inline using --config-json
.
To inspect the current configuration, you can run flowr with the --verbose
flag, or use the config
Query.
Within the REPL this works by running the following:
:query @config
The following summarizes the configuration options:
-
ignoreSourceCalls
: If set totrue
, flowR will ignore source calls when analyzing the code, i.e., ignoring the inclusion of other files. -
semantics
: allows to configure the way flowR handles R, although we currently only supportsemantics/environment/overwriteBuiltIns
. You may use this to overwrite flowR's handling of built-in function and even completely clear the preset definitions shipped with flowR. See Configure BuiltIn Semantics for more information. -
solver
: allows to configure how flowR resolves variables and their values (currently we support:disabled
,alias
,builtin
), as well as if pointer analysis should be active. -
engines
: allows to configure the engines used by flowR to interact with R code. See the Engines wiki page for more information. -
defaultEngine
: allows to specify the default engine to use for interacting with R code. If not set, an arbitrary engine from the specified list will be used. -
abstractInterpretation
: allows to configure how flowR performs abstract interpretation, although we currently only support data frame shape inference through abstract interpretation.
So you can configure flowR by adding a file like the following:
Example Configuration File
{
"ignoreSourceCalls": true,
"semantics": {
"environment": {
"overwriteBuiltIns": {
"definitions": [
{
"type": "function",
"names": [
"foo"
],
"processor": "builtin:assignment",
"config": {}
}
]
}
}
},
"engines": [
{
"type": "r-shell"
}
],
"solver": {
"variables": "alias",
"evalStrings": true,
"pointerTracking": true,
"resolveSource": {
"dropPaths": "no",
"ignoreCapitalization": true,
"inferWorkingDirectory": "active-script",
"searchPath": []
},
"slicer": {
"threshold": 50
}
},
"abstractInterpretation": {
"dataFrame": {
"maxColNames": 20,
"wideningThreshold": 4,
"readLoadedData": {
"readExternalFiles": true,
"maxReadLines": 1000000
}
}
}
}
Configure Built-In Semantics
semantics/environment/overwriteBuiltins
accepts two keys:
-
loadDefaults
(boolean, initiallytrue
): If set totrue
, the default built-in definitions are loaded before applying the custom definitions. Setting this flag tofalse
explicitly disables the loading of the default definitions. -
definitions
(array, initially empty): Allows to overwrite or define new built-in elements. Each object within must have atype
which is one of the below. Furthermore, they may define a string array ofnames
which specifies the identifiers to bind the definitions to. You may useassumePrimitive
to specify whether flowR should assume that this is a primitive non-library definition (so you probably just do not want to specify the key).Type Description Example constant
Additionally allows for a value
this should resolve to.{ type: 'constant', names: ['NULL', 'NA'], value: null }
function
Is a rather flexible way to define and bind built-in functions. For the time, we do not have extensive documentation to cover all the cases, so please either consult the sources with the default-builtin-config.ts
or open a new issue.{ type: 'function', names: ['next'], processor: 'builtin:default', config: { cfg: ExitPointType.Next } }
replacement
A comfortable way to specify replacement functions like $<-
ornames<-
.suffixes
describes the... suffixes to attach automatically.{ type: 'replacement', suffixes: ['<-', '<<-'], names: ['[', '[['] }
Full Configuration-File Schema
-
. object
The configuration file format for flowR.
- ignoreSourceCalls boolean [optional] Whether source calls should be ignored, causing {@link processSourceCall}'s behavior to be skipped.
-
semantics object
Configure language semantics and how flowR handles them.
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
- loadDefaults boolean [optional] Should the default configuration still be loaded?
-
definitions array [optional]
The definitions to load/overwrite.
Valid item types:
- . object
-
overwriteBuiltIns object [optional]
Do you want to overwrite (parts) of the builtin definition?
-
environment object [optional]
Semantics regarding how to handle the R environment.
-
engines array
The engine or set of engines to use for interacting with R code. An empty array means all available engines will be used.
Valid item types:
-
. alternatives
-
. object
The configuration for the tree sitter engine.
- type string [required] Use the tree sitter engine. Allows only the values: 'tree-sitter'
- wasmPath string [optional] The path to the tree-sitter-r WASM binary to use. If this is undefined, this uses the default path.
- treeSitterWasmPath string [optional] The path to the tree-sitter WASM binary to use. If this is undefined, this uses the default path.
- lax boolean [optional] Whether to use the lax parser for parsing R code (allowing for syntax errors). If this is undefined, the strict parser will be used.
-
. object
The configuration for the R shell engine.
- type string [required] Use the R shell engine. Allows only the values: 'r-shell'
- rPath string [optional] The path to the R executable to use. If this is undefined, this uses the default path.
-
. object
The configuration for the tree sitter engine.
-
. alternatives
- defaultEngine string [optional] The default engine to use for interacting with R code. If this is undefined, an arbitrary engine from the specified list will be used. Allows only the values: 'tree-sitter', 'r-shell'
-
solver object
How to resolve constants, constraints, cells, ...
- variables string How to resolve variables and their values. Allows only the values: 'disabled', 'alias', 'builtin'
- evalStrings boolean Should we include eval(parse(text="...")) calls in the dataflow graph?
-
pointerTracking alternatives
Whether to track pointers in the dataflow graph, if not, the graph will be over-approximated wrt. containers and accesses.
- . boolean
-
. object
- maxIndexCount number [required] The maximum number of indices tracked per object with the pointer analysis.
-
resolveSource object [optional]
If lax source calls are active, flowR searches for sourced files much more freely, based on the configurations you give it. This option is only in effect if
ignoreSourceCalls
is set to false.- dropPaths string Allow to drop the first or all parts of the sourced path, if it is relative. Allows only the values: 'no', 'once', 'all'
- ignoreCapitalization boolean Search for filenames matching in the lowercase.
- inferWorkingDirectory string Try to infer the working directory from the main or any script to analyze. Allows only the values: 'no', 'main-script', 'active-script', 'any-script'
-
searchPath array
Additionally search in these paths.
Valid item types:
- . string
- repeatedSourceLimit number [optional] How often the same file can be sourced within a single run? Please be aware: in case of cyclic sources this may not reach a fixpoint so give this a sensible limit.
-
applyReplacements array
Provide name replacements for loaded files
Valid item types:
- . object
-
slicer object [optional]
The configuration for the slicer.
- threshold number [optional] The maximum number of iterations to perform on a single function call during slicing.
-
abstractInterpretation object
The configuration options for abstract interpretation.
-
dataFrame object
The configuration of the shape inference for data frames.
- maxColNames number The maximum number of columns names to infer for data frames before over-approximating the column names to top.
- wideningThreshold number The threshold for the number of visitations of a node at which widening should be performed to ensure the termination of the fixpoint iteration.
-
readLoadedData object
Configuration options for reading data frame shapes from loaded external data files, such as CSV files.
- readExternalFiles boolean Whether data frame shapes should be extracted from loaded external files, such as CSV files.
- maxReadLines number The maximum number of lines to read when extracting data frame shapes from loaded files, such as CSV files.
-
dataFrame object
The configuration of the shape inference for data frames.
flowR can be used as a module and offers several main classes and interfaces that are interesting for extension writers (see the Visual Studio Code extension or the core wiki page for more information).
Using the RShell
to Interact with R
The RShell
class allows interfacing with the R
ecosystem installed on the host system.
Please have a look at flowR's engines for more information on alterantives (for example, the TreeSitterExecutor
).
Important
Each RShell
controls a new instance of the R interpreter,
make sure to call RShell::close()
when you are done.
You can start a new "session" simply by constructing a new object with new RShell()
.
However, there are several options that may be of interest (e.g., to automatically revive the shell in case of errors or to control the name location of the R process on the system).
With a shell object (let's call it shell
), you can execute R code by using RShell::sendCommand
,
for example shell.sendCommand("1 + 1")
.
However, this does not return anything, so if you want to collect the output of your command, use
RShell::sendCommandWithOutput
instead.
Besides that, the command tryToInjectHomeLibPath
may be of interest, as it enables all libraries available on the host system.
Once, in the beginning, flowR was meant to produce a dataflow graph merely to provide program slices.
However, with continuous updates, the dataflow graph repeatedly proves to be the more interesting part.
With this, we restructured flowR's originally hardcoded pipeline to be far more flexible.
Now, it can be theoretically extended or replaced with arbitrary steps, optional steps, and what we call 'decorations' of these steps.
In short, if you still "just want to slice" you can do it like this with the PipelineExecutor
:
const slicer = new PipelineExecutor(DEFAULT_SLICING_PIPELINE, {
parser: new RShell(),
request: requestFromInput('x <- 1\nx + 1'),
criterion: ['2@x']
})
const slice = await slicer.allRemainingSteps()
// console.log(slice.reconstruct.code)
More Information
If you compare this, with what you would have done with the old (and removed) SteppingSlicer
,
this essentially just requires you to replace the SteppingSlicer
with the PipelineExecutor
and to pass the DEFAULT_SLICING_PIPELINE
as the first argument.
The PipelineExecutor
...
- Provides structures to investigate the results of all intermediate steps
- Can be executed step-by-step
- Can repeat steps (e.g., to calculate multiple slices on the same input)
See the in-code documentation for more information.
Adding a New Feature to Extract
In this example, we construct a new feature to extract, with the name "example". Whenever this name appears, you may substitute this with whatever name fits your feature best (as long as the name is unique).
-
Create a new file in
src/statistics/features/supported
Create the fileexample.ts
, and add its export to theindex.ts
file in the same directory (if not done automatically). -
Create the basic structure
To get a better feel of what a feature must have, let's look at the basic structure (of course, due to TypeScript syntax, there are other ways to achieve the same goal):const initialExampleInfo = { /* whatever start value is good for you */ someCounter: 0 } export type ExampleInfo = Writable<typeof initialExampleInfo> export const example: Feature<ExampleInfo> = { name: 'Example Feature', description: 'A longer example description', process(existing: ExampleInfo, input: FeatureProcessorInput): ExampleInfo { /* perform analysis on the input */ return existing }, initialValue: initialExampleInfo }
The
initialExampleInfo
type holds the initial values for each counter that you want to maintain during the feature extraction (they will usually be initialized with 0). The resultingExampleInfo
type holds the structure of the data that is to be counted. Due to the vast amount of data processed, information like the name and location of a function call is not stored here, but instead written to disk (see below).Every new feature must be of the
Feature<Info>
type, withInfo
referring to aFeatureInfo
(likeExampleInfo
in this example). Next to aname
and adescription
, each Feature must provide:- a processor that extracts the information from the input, adding it to the existing information.
- a function returning the initial value of the information (in this case,
initialExampleInfo
).
-
Add it to the feature-mapping
Now, in thefeature.ts
file insrc/statistics/features
, add your feature to theALL_FEATURES
object.
Now, we want to extract something. For the example feature created in the previous steps, we choose to count the amount of COMMENT
tokens.
So we define a corresponding XPath query:
const commentQuery: Query = xpath.parse('//COMMENT')
Within our feature's process
function, running the query is as simple as:
const comments = commentQuery.select({ node: input.parsedRAst })
Now we could do a lot of further processing, but for simplicity, we only record every comment found this way:
appendStatisticsFile(example.name, 'comments', comments, input.filepath)
We use example.name
to avoid duplication with the name that we’ve assigned to the feature. It corresponds to the name of the folder in the statistics output.
'comments'
refers to a freely chosen (but unique) name, that will be used as the name for the output file within the folder. The comments
variable holds the result of the query, which is an array of nodes. Finally, we pass the filepath
of the file that was analyzed (if known), so that it can be added to the statistics file (as additional information).
Currently maintained by Florian Sihler at Ulm University
Email | GitHub | Penguins | Portfolio