Skip to content

Interface

github-actions[bot] edited this page May 6, 2025 · 1 revision

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-05-06, 18:48:03 UTC presenting an overview of flowR's interfaces (v2.2.12, using R v4.4.3). 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.

💬 Communicating with the Server

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
    	
    
    Loading

    After launching flowR, for example, with docker run -it --rm eagleoutice/flowr --server (🐳️), simply connecting should present you with a hello 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.12",
        "r": "4.4.3",
        "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.

  • 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
    	
    
    Loading

    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 the filetoken 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 a filepath field which contains the path to the file (this path must be accessible for the server to be useful). If you add the id field, the answer will use the same id 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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. 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"
      }
    3. 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 the RShell (i.e., the AST produced by the parser of the R interpreter).
      • normalize: which contains the normalized AST, including ids (see the info field and the Normalized AST wiki page).
      • dataflow: especially important is the graph 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":4}},"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-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7812-tZ7xPJWJvXz8-.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-7812-tZ7xPJWJvXz8-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":3}}}}
      

    The complete round-trip took 17.8 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filename": "sample.R",
        "content": "x <-"
      }
    3. 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-7812-3UN5UvzdeKuu-.R\"}}"
      }

    The complete round-trip took 1.4 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. 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
      }
    3. response-file-analysis (response)
      Show Details

      The response looks basically the same as a response sent without the cfg flag. However, additionally it contains a cfg 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","exit":["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",[["19-exit",{"label":1,"when":"FALSE","caused":31}]]],["32-exit",[["31-exit",{"label":0}]]]]}},"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":3}},"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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-7812-eaJKSBYMyM0z-.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-7812-eaJKSBYMyM0z-.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":1}]]],[7,[[6,{"types":64}],[5,{"types":72}],["built-in:<-",{"types":1}]]],[5,[[6,{"types":2}],[7,{"types":2}]]],[8,[[7,{"types":72}],["built-in:{",{"types":1}]]],[15,[[8,{"types":72}],[14,{"types":72}],[2,{"types":65}],["built-in:if",{"types":1}]]],[13,[[12,{"types":64}],[11,{"types":72}],["built-in:<-",{"types":1}]]],[11,[[12,{"types":2}],[13,{"types":2}]]],[14,[[13,{"types":72}],["built-in:{",{"types":1}]]],[19,[[17,{"types":65}],[18,{"types":65}],["built-in::",{"types":1}]]],[18,[[5,{"types":1}],[11,{"types":1}]]],[25,[[23,{"types":73}],["built-in:print",{"types":1}]]],[23,[[5,{"types":1}],[11,{"types":1}]]],[29,[[27,{"types":73}],["built-in:print",{"types":1}]]],[27,[[16,{"types":1}]]],[30,[[25,{"types":64}],[29,{"types":72}],["built-in:{",{"types":1}]]],[16,[[19,{"types":2}]]],[31,[[16,{"types":65}],[19,{"types":65}],[30,{"types":320}],["built-in:for",{"types":1}]]]]},"entryPoint":15,"exitPoints":[{"type":0,"nodeId":31}],".meta":{"timing":2}}}}
      

    The complete round-trip took 9.3 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "n-quads",
        "cfg": true
      }
    3. 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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/13> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/type> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/entryPoints> \"6\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/id> \"7\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/id> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/id> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/parent> \"3\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/col2> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/id> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/id> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/parent> \"7\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col1> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/line2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/col2> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/id> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/parent> \"5\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/id> \"16\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/parent> \"0\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/id> \"12\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/8> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col1> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/col2> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/id> \"10\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/parent> \"12\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col1> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/col2> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/id> \"11\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/id> \"14\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/parent> \"16\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col1> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/line2> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/col2> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/id> \"13\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/parent> \"14\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/1> <https://uni-ulm.de/r-ast/location> \"4\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/3> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/4> <https://uni-ulm.de/r-ast/location> \"6\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/2> <https://uni-ulm.de/r-ast/location> \"3\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/location> \"1\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/7> <https://uni-ulm.de/r-ast/location> \"5\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"0\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"2\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"3\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"4\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/0> <https://uni-ulm.de/r-ast/rootIds> \"5\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/5> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/6> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/9> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/10> <https://uni-ulm.de/r-ast/type> \"32\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/11> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/12> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://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\"^^<http://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/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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/14> <https://uni-ulm.de/r-ast/to> \"1\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/15> <https://uni-ulm.de/r-ast/to> \"2\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/16> <https://uni-ulm.de/r-ast/to> \"0\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/17> <https://uni-ulm.de/r-ast/to> \"3\"^^<http://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\"^^<http://www.w3.org/2001/XMLSchema#integer> <unknown> .\n<https://uni-ulm.de/r-ast/unknown/18> <https://uni-ulm.de/r-ast/to> \"4\"^^<http://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\"^^<http://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"}}
      

    The complete round-trip took 6.0 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1",
        "format": "compact",
        "cfg": true
      }
    3. 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):

      {"type":"response-file-analysis","format":"compact","id":"1","cfg":"ᯡ࠳䅬̀坐ᶡ乀஠洢琣℥犸ŜHߐএ妔Ǔ㗠ߙ⣬啕㑡偍Ɇ傧値㒠ࢀඁ潾࿛⩬ᰡ暁∠ᰠ⵲䆥ᕅ-ℬਖ਼�Ю᩸8堢ᣐŐ牝砂֠ᦫ+ଠ⬮῭泡猁Ы栠湦⡞D帠ڊ⌠˺䑭┐祔ᗈᲠʊ䋑Ţॴ჈䙵ᠸ⼸庮అҀƝ墈嬢掍䳂啲䇋咕ヰ๝吧㾅㫏䭲Ի⍚♱乓䈁綜ᇓ䬂沪ⲣ矼壋推墙㚈ヶ৳櫂Ჷ廋漭峣Ɖ㠊尐综弱又્Ġ⮃䇼䶀䄈ᄽン崈䚤㢋厇㤀༡ԯ焼㱘ⴂĵ唢㔁ڃ恽ܳₕ䉁,ᝳ䠠ශ⤡旰稤ࡴ⡀䒪⺴旨泎ⴃℒ≫ᩂࡀᚊඃ博ܤ己Dž妜劤⩐嵸殀䩶畬坈⪵ㆥ桨䩆掆嚍橡ㆾ榒䩭⵮埋ℜঋ殍ᯕ獺฀䭡㾛堹qij尓ࠍ侓⪐䭃ឈǏ穝嵻⛲  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䙠Y宁Ꮠ㓓媅ย䠡删ࢡ䀣⬨壉␠摇⿌ᐽᏊ泽ݢ⃝✣䴓⚋䄫Ռ⵫㦉ⷋᕋ⸒ᐴ攻㎊添ឃ涭㾈ᰨऀ㑉ڈࡠ┃ːഊ昇ᐬηՊ尫∦⍗⃉⒉ᄇ尯ᘮ㳯ਏ᷏⸏㴀␌糿⠃紟4搣㧂䦬㢇À⛊䳧ὁ⓴刦≳⨃ȸ⪾協戣㣬ࠡ擀㞎䂂ఠ䥈別㌠䠧᱔珆擐ࢭ䰸⺉ᔜ欼䌙ᦁⳋඁЄㄠ治இన瞁▛㘢⏧㤳卨㍅嶘漂ȗᴹ䶤点㲏㾧㰿ᐂ籟㠋縟⬾搒洹ᖱ̆听キ喕☨ͭ₉䱍ᗅ�᷄敠沊琳⏡場㐼̙㊴ౣ㢉සᠷත㫦ᦳ㚲獓Ǝᮀ擈㩠ᆂⳢ樹੐囲㤨ᱷ䌲朡液橾䬰ኩ䰖煣⋇㴻ḇ⌈䊺缳䪘伊ܪ刊፪碱⭄璳⬄絰̹ര孠Ӿφ杧׀燵䀰䡱㭠㡶䋂乗祚ϰ䮵ቴ⌛㌈ᴜ៱䲞䭿笸炬抷᧶拷✴旘眇控ᑔኁ梶⩄啳ᎊ粿糱勸᫬墁勔攳占ẳ䐬卄㋠঺埵新墹⶿㌼玱䳼婙狀㞱㉠ዯ猢嘢瞩䨱௰涍寉丿ఐ珸≲焴暰࿺䃒僛䩁壘Ꭺ擑㴁敵Ꮚ沷⨴捰ᛨ䝙䳺朡櫚仇啱羄䉩罈຾䯰曲碘䇒烗䭁䊒j哒丱窟ᙱ䔇筓│撥㚑捈㮻䘑ⅈ嫩ஞự稬瑀ᬠ琠㯐噐ᓇ㖅⯥ኴ瀻óڦ垴懿ṕ嫫ᕼी盂涼૩䉆ᙷ瓞ӟ堀爛砄儖⊹嗄璫桹ᣠ㌩卒ᘓ䀻矪瀏䳯瀝ࠥ䵷ᾒ㜣䥱ፀWᜥᡗ₰䀴撦亢⒲㡉༳盈�ㆢ䀪წ倠ᰦ⮠垩䣃䲥什献ṁ扖┴捭䁀ٱ㨷√ధᗑɀ䈔刬ƨೢ�䲁㪳啉ᄣ碀䒀嘭牝჌ↁ/泃ᢵ䡟庩撇H䕂⣲䀱AႾߢㄨ␚垲䑳ᅀ䒭⃣ྱ愨光ஃ⩓䇐ㄠ㒇ƈ亮礐ࡑ䳫ሎᨃ㙐ό≁╉₤ᶫ缡咑ာ煈ᕂ湘扜㓥扢⚂☭磾⊤歃ƹ䞳ैⱀ⨧䉱䒸戠哫ඩ⒲ᆂᲣቚ≂㭆ᑤ‴媪′䨩䥫極ᘲ㉎劒⇅᪔䂠ᡡ䑽ٰ䪼ሐ᪳楃勒㻅晢晴䠤ᓟ૒↵䁻ᣒ穚匧ᲆ⊉䜼扩䒹䬨ᚲ妍ጃᥖ华ㄣ湯䠌姖㊍಴ྺরẒ嵓㏆㞤?䈄ۖ扐婯ࢬ䴉স儰忍䪿㤘吠ൃヤց䑈˄㕎䳝䉲棬剠ᤴŭ⑼睭ᢨⷙ帱盫ᔫ縦૶㗦底ᙀ】♄ᅄ瑳⊐֪㣏਩㊩०₲濯㭳䬹恹᥎杪
緄Ụ೓ᕘ屏ⴖ⿉╲ü嚫䊳਼䡷熉иᣍᠩ⢞ᵿ冠凓ፉ簵‡⥁㞳↚埔孊匚井ᑳ斜墋壓䆑⓶ॠ枪懬昿⣅⁸䗆ᴊૐ硽㕴奦嚚泌⣤渕絷搡岊⋌櫣⋴⎛㭪淊櫩䱭հ�⓹把嬪ễ狝㊄歶㜒䇈ૃ⨭慺㘆圡ᛒ⥻㩕涂䓶䋈bⶋ㪦溙Ѷ禳囻结嬣㡗獿㐮嘠⼁潍䔹ᴪ倡米彻ⳉ寳㓦ྂ璖惎皰洵䋿淥军寙嬴ㄕᵯ噒毎Ỵ浝壸䂮唺竝媓㦕玏㟾䜌䛈槕䩶㸟强噆㈠ឩگ╖᭼璒䨸殌棥偓㶋儧䗛ݦⳔ徉䞁䔍∅⹩⿾䏓剛♜㯈睶冐ก瘍⼐ᱠ扼ⷬ㩻わ簘慴?യ嵣എ榫৫椣乓淁叧懇爿䙯ὼඩ䋌࢑ᦽ硸推෇㊃䛛⮮ᔏ೉偰স殙浚Ᏼ㨛䧂✔橮ဨ䳑债⼙ᷝ˴卥円堭曌置˶俹䫋圚ẓ牐㐎㛧Ẅ昴漖糣砙暄࠶ᦣ歑昉㨪†Ũ禇♯㌯橡ⴁ笿狏᱃擙Й㡷⒐⛾Ⳍᕾ⸾㵸㦨媓䵽்㽷ⲏ櫏⅏㴚眶潺ַᬻᛘ瘍㸷变堔潏✙⿥䬌▿ὓ剸宝㦶உ㙺犰服๙溾痘ᯫϜ宣㫗䎈䝲罌⻣ⶅ楸嶥ⳬᩜ嚓㐚▒㋾翎焅ⴭ畸淩ⳬ忓孎㦸ી棦䏎㻦ဉ瑜巙ᰧ湜ܯ梯ཱྀༀ໰ᖜ ⎱⶝线揄㹓比ߪ㩪┓๼撾燼ȃ呡䅃➛砷޲㴷礉伭ᒼșể教ΰ̇暞ᮼ烯崈樉熽㡒僲⭚㋨嵛㿵柒珘䚏仠泮ף立䏇Ⱅ᥷খ坔䵎墲䡧嘿㾜ỳ䍟᮷ჷ峰⌢砆唎湍汽愞Ώ僀⫊↠挦ತ玏冟漣瞽ḉ䵅婜䩐稯᪚༡琾૕㲕᭳ϧᷡ檙ኔ粗籕ဋ㏏ኻᾓ烽幩㶊⹸橮4◥㝪皺翚律扟珺沭巾㞥┗✓⿽烋䶧য়仞朕庇怌ခ綏⫒睉㩫ᐗ玙尿⋢縂῀⬒ↇ笕殭眓ᰚ㹱签巰怏䊛䈝磿ࠨ㫻犗㰃䩙ᔈ㳵涋璚៌�἗彷箶ᜃ☀Ͳⷴ㸭瘝ᯪ翭 ࡟㽙࿮㹢猠耘䞬帼厠尠⁗ມ瞠‥໳囗焠䝉Ꮳưট↛࿷⼈࿤⠙灌䇞瑣⼨㤠惙營㳸峮䇅犟㉙⁕繄಴ଦ⯬纟刀湸怯๰Ӡ䟹䟪ᙾ瘰䈥塌乤एᕙ⑂䈕ሰ䢦狢�䄿ᘧ姢↟坰潐摓⻮皠浹瑉↳ᕐ呛m䐹燰寪✳㲸ϯഛౘ嬖໐弥汊懝⇀䅰ᴧ搪珃༚灞剋憄㾥绢嚱瞏ⷺ䥴ሁ๿᰹打␪兞⻁犠ᇧ㊀瑺剐尦灐呤滦囥凨穦ၞ剅ৼ⹚祢䡄䎀ටᗭ犪䋄൥橉憧甀䰦痺凕୐抩ᩅ凙㊤Հ㔾冗矉ფ䙍儼เ杦┢㇝൑㳤ᕡ椒璀兘峥ㆤ੐䝦櫳ㄾअ⛧ᙅ䡴䗠┢䙘ᆳᅸ槥㙀弒਷ᗥ也㈕႘湸噟愇༛⊩幆燱ੈ巻㹉熷๘篥偗ⰹ໠噥㷿⑳ர䱥נẀ䭈擨ᅗᚘ䛌ߧ瓭ौ炨䫺慏燄勤䋦ူ䤪哾ु燻̀仰䍤㥬䤴䡠ే㙆㇕㏄故ᅑ⋌䡠ˊ‰⠬䭸䢙惧䦉䈘慤揫b䢄筆䱢⧙ゴ揧祜㺏Ꮄ䣄⧫䈂䠴᪂Ṋ⦨ٴ呚㭫࠺䆠㨨ㅅ暦偔凄啖㻕㍔懇൐পᇔ䗆燠悓䅔杘嵌㑘亟ፅ湗⸾䩄惂嵁⪊䋤i嵎ف䬬捆湎य撬樱फ़ᤵ䗫໐㒧ἁ䰝⪅‽᧱丘壆㌫ᥙ仴憄䙁⨢䁔囃• ྲྀᕇ䑆䨕ᝌ盁⭆妺◬棅忳ᡭ䳌䏒孈䧽䦌媃ቇ戅丟ر孁⧖अ⤆㖼㦶䦐巸杍ᢓ俔榩ᝎ�䭌䰡ㄥㅙ猀څ幼姛䪔ᒃ孕⧓ૠሇ๏㧇仴嘅⤦禊໼䦄ཚ㧯䡅㚆♋樌௤纇礽禘䔜羄Íᧅ䤼眅桛᧷爠偦㹍㤰⺔ᐷ杇㇥坌搴䤴琩෰䈵ణי㊠̲᱒㤭䲹Ĵ圹׬䶐愵ौ䗶ࡵՂ✽㲕丠尷籱䔴⸔擀ᣅ䡬⹌笷棅ᣇ乂壦♸ㆋ⍜嗇୬◗䫢寫ⓐㅃⓈ㏀ᡆ՘ං冢䔩☔฀砆摇槑䮸抷ᓇ◒⤅ڵ㓝Ḫ噤㳂ᔵ棬ⶢ纻ⳁ⢻₲䌆䥩旖⻤榷橣斻⁵ܠ_懢⣘抨˅榍䷲憤损ॢ猪籥乿⚑⸼疫䤹昊瘪欶勑⢙஫㟇⋏祹ⵈ瞶♰喵༢噂ហ䡸䎀ϑ猾斊⿳㦆⫂õⷊ擇牍帽䭴垇㝙嗍ⲵ⬆ဩ啫栊庀ߤ㕕⠺䙷瓯喳⯊摴ੜ秕㖺孵ॅ㖲埂䭴夼䣂இ㶄䓑⊍䋤㛴嬣䔦⫠ᇴ仁ǥⱚ围盟՜⪿㵶⅏窬⪚䋶㫉㗎ಚ挘棇疋煬濷ờㇱ㞚䝷᱅֗㞚䷶䱪㸪厄⬀❕╏⮙ɖ歃田泂巹凂ᕐ池๖幐桴䁐⼧⛃ㅤ楆姴拁糬癆䦴ዜ䷴䓆妄⤻䋠栴溦姊䶟仌᭕潋䴣獄Ⰷ橰㻼洌婩א㗂泟⸷⃋∛⤪榫僑给⨜纷⧛䆨⯢惷ᗊ廴⾆拄㥣⤚棦筥㇔䫦潂惶ⷎ䕞ุ侇ה◭䢪硕䷓䔷⺖兇淚Ò你⭥䧚 Ж壗㫜á氺傕橁⨠ː䩊掱刭㡕䝦牣写䳦➜巕ᆽ奯╢㩙哉᳈ය尒幍〠ᮾ᫫媎Ἥ⼪炘姁ㄩ㆞䲋囤㬍➍ⶻ庠圌൧㭻巩ᙤਬUඹ〥涂尼匆〧睹咧剨ላ㞑㕇偝ᨋ佤㫇塝戎傕䐸࿊Ί亝◗建坌䎉ᐯ妽㲍ᾎⲇʘࠡ䎾㬭彲Ⰸ片卽嵑瞏ҫタ呩䠉後劓暸㦈㞘笣堝㗢ᾙ媥映ြ慣ᮠ㍹ˡ⑤¨⋨⢤䞃嬴┈␹℘㭭嬝珌昦֣݇嚮橡ް㪣岗⃜㰅壽媔儜笎撉㐉䃷崈ナュḺݬ⻣栍⭾䩫娽渺罧ص⩨㘧筽笗奒儾ძ箟ṍ椺ቢ䘵†ർijZ炊凂㄀湧⇵凂⠈慴ᒽ#ƒᎧࠬㆱָ氦濲kຸ梳癖ㆸ瓖࢓晝໷࿃㙧櫷粯స෧ͷ燗ನ糧刻懈嘆㹧੖傩⏒᳦㟱剤➘羦槿摸乂⼺ॗৈ㦢⍧⽴䧾ེ⍇䱟䧼姮ᗑ痷媺ཥ峆熯儐乶☡┥帽灲ᥠΧ0䆨攢㌷屖₿ᡕ㶯撄曵囇䪤弲仃⒚畚䒻瘻ය祕罐Ϭ瞼⮨悍ǐుᯠí劣ᰘ᭕威䛖Ü䝊⠴䉉༌俲妽㗬玡局喕˼憆ቒ⋥ੜ禆睚娞ぐć孝䘭挜堆䝗ళ了ీ村㧲⯜笇媽ׯ佌⨇晓⼯专⃢歓秭东瞆屨׬⼢祱⃛ᤨ⼌ㄷͼ䖵伃咷ୗ䃲⹥㴶䃓姉儂漰೜㧕媼紇㖃z⸃㮶⣛䭬ఒ瞛⽚ㅡⳢ洷彚昌⴬䩶Ӟ旐⼲磔拙秡坊缆㸻偊Ⳝ愋♉嗁ⷲ牶磘昘捒渡㋑③⾢玷䗇喸⸃㛷烓焅Ɗ窦䁗·《扷汮㗝べ峷ᛘ嗛墚滷ፑ斀湚竤徢痠ౕ◬凙瘐俲棷壪㘟⿪梷囗㮘沦晴翍䶨泬婖啖痽ц棛㑈㗣伺捉筜䶰⿆櫷ე᜾⺦燓糒ᇂ涯㙗冀⑒瀝䥖嗝䙛猂炗痝献ⵖ戙㷓䷒᧡媖כ愨䊖灃巗ͅ渖拌ϕ䗉匮斶痗ᘑ汊獗Ⓨ嶹湕䎵⟐帐Ά⇽哟⦆�作ةℴ僄һ⃖᚞䷠ႇូ䳆≔秇寨笖从ேߠþ接寱ᒩ沁Ú←᪵橎˾┓ᰢ䠰㬠Ʊ㖀綧㮊✯᯳ᥕ箒有䋓嘂⓹∠⒑笇浠ᘗ濟ᗯ浠�磄ᨄẂ.ⵜή䶡柇႕䄈ᶏฮⲠ䏡⅁瀗㫌䐔ᷡጯ湠⒪ᵱ漺䒙⏎❷㨠㔻价⻎瀕⯦史䒕⚮璕启渔榯忒揿滾⎮䂛帰Ẕ篆႟璘ࠩ瘯炗潮勁獱ኑ䏌ἶ䝯㒔⫶湬俯檕⼋਻ᢙ晞ௐ侶惈忓緎枩櫯ⵛ㎾᱙熈些䢷Ἡ淮抒䏏Ὡ柮瞅ூ✵箲ຠば无প矙᥈幵瞪ؼⱳῥ碇ᚐᑠὅ箯皓獈ẅ桮⊞珖​὏㲣ᐌ᾵绎░ᯭ描Ŵణcと峧玘寭挓䧏䲟眫ῑ総Დ㏎御柏粗毷ṁ揯䎑ⱉậ烎⟰导䙪㴚瞔寫竿㍮⣿㼿璋䎎暕室廾⣠ˀでᆤʰ䩼䳐卶㼰儥⒌昮ឤ㘆嘪揋ᜥ翛尋ᷔ意㲘玡卙翎㦞㮩ṽ篯㊒㽯徊㐚⤹↔਒㭷૸䀪ॠᪿ殗ఓḝ稙ᣄ޸£氾冡޳瀸ᨿㄜ㒏⏈⸠䤙刴㲠ॎ岚Ў帑祹㤚㯱ᰳ甮垔␻崫䆾䴝㛊㳉竤撬吓఻檯ඒ柿廕綿Ĝ߰㷑澾儓ߚࡆѿओȩ㷃᩿箛៣快捎゗䟓崭炾梜⟺嬻戏Ƙ児繿▰䰮Ⱃ౦ᙞᆕ篓㻑籮Ĝ璋㴓瓑ᄐឧ㷣秾挚瞯ϛ洿ᶕ矌㿅朾➝䮠義畾∜ⴤ缵炊丗ྡ笯᧻⏲帗岫⏞㶽ట宝族ȑ瞬㾷浏㶗矅㸭滞⎞垲㱟Ꮫ婲㇕嘗斞栴䉕炉᧞㖗棭犤㖙尗င罕疾᜚䟆不沞皝砌㹪᫞Λ䯯ᴳ惎ఙᐠ窏枪䠔倍⒟感怐⏏ҁ䍠ϟⵝⱶJ�終刿䴞䄛吉柗Ỗ窳ο⃝༗䏴⾑㶫烟䏎ᦘ瀁⿄红㭯攟׽䈕㿶嘨ˀ௦䊡㜘籇⃈Ə㩇⿡㏀倭᯴羓㴀इ卞␤ઢ䁾㻢硃桿㉜☔忽༴崅珟䬠ࠛ爈࿝㺄ܶ䝠爝攖う䄋࢕ݴᒮ㪙吰ᾥⱐߐᢷ⦝㠭◨眥㳄ා低᠛⼆羶zԲ⎀珅㦧᣷䤢䲂痰㕞㛘䐶⾾ij笽敟ඝ䬑䡎㾄U琔䇡䇉᰻䭊灉⃖ഓ̣称犲ქ⃥ڇ䶡㜤省炁䈂ٷ澟⾣ထ⯰ბ嶫⁨㩁㗈第⢎᲼ጯ׈㊠恠ӷ㽳ࢀÈⒺ檧ᴠ৔ʼn箍涠嘜戭快ჩʒະ㚞ଧ栅旃ⅵӴậ⽍⌮㑟掕ひᕬᠤ⒊房㻄擼僚⥢㉣ᮕ⑓僱͑眐ⓡ纥䰼翉ƶ۵䫐䋢䒳ᱝㄎ┟斛䙖Ἒ欃㡦慟㦌ᕏƣἒ硘惿㴨ఐ⚞猧฼ᡢ窯ѧ⤐䪭⨠!ⲟᵣࠦ⣼ࣥ͸೸⏁垧刾硱䅞祷悐羣̯籈჋͓Ƥ∱’燏䑪䅓ၐ่⑂怯榬䢶Ϣ㖐ㄱ创㨿䁯䇿܄ူ僢㢭喺䣥ϯ坄≎杫ߏ⁽憬ٔ⮥߬䀗䉙焚⋾ໟ唱द㌪ゆᆟ׋懨熉ʠਜ਼䢨縊ഴ㓎Ἡ䌪幀凥妉朒Ể㒩㡝僖㷖ഐ㙱座攱䒏慧݊ၰ巸⚨橗ᮃ␕ॄ㞤☘व濆⋢䟤ᱜ࿂伮࿿℄⊅೨₡Ⳛ夵䒃凡٪จ毃㏐侰ᣯ⋲☾ñ⻻游儲细䘯溈稜䢩恅ࢨ掹બ₁╤ᰇ㬮ㆩ䞾毿Ơ㪭⡃呀扔ං䭡曥娲䡴冁䙒័埢斬᱄䃸掑ષ䧑᫥ứ᤻㇉䔴ᙈ㎂傮乔⢖扅ब㷡⋧䌳梄㈞穊ᄈ斃琅ᑆ㣑抆叼↑哥燫ᲅᅎ㊾ᜨ浃禩࿺⢾捞ཤ▱狧㜷ၽ沷䘲ᧈ䖬䆪ᣯฬ換研㻄㲒缵㱹冽䑺ᡸ坣㬨㹛Ⴧ戧ਯ䢑嫑¹₇煨ⒾἘ濂ႰŒ㉀ጷໜⰩˤᤵɺᅐ⠖ᗘ愂㮪஧ң扏ར㩞ء伴墄䚪၇殤栲ࢯŐ䔑緀䰈㘩㉇悱≣硌❱ᴶႲ粭橉䂘籄䥟嶩Ʌ漴≼冪礜ᱠ缳⾭ኬᡉᏕᝲ✼灈怨琿熞䗤᣹ˀ穩ŏᤜᎏ༌㹩᭦ᒽ౥㇊❖沄䛁䡫㩍祽ኼ䵬㎤湸珯劆দ⒵⿽∭湯੏ҹቌ䵼㼑扄確⊝刄⟹ᄜ➳Ů㥉ᣝ砢伒㕑㕦柉濃䇂䖅ᵄ擂ᱫ䥋䓨厍ข♉ᕄ为呮⨝砦╴笜㸶ᘲ䊂愕Ȓ㪲㉘᪵3⨈̆Ꮐ七↯Պ播抨௨㶱❦所墇⥩⛶ᥒ㭲፭♎坒⍂炻䆉㳇᜶䢟⥥⑉჈女㈨啈坅匙僎徉奨✄殮ᄅ䈲˸纸疕ᵜ甀掀ఊ㈩෇ⲵ媒䥛␢។焑啳㈬璺磆甚✉必䬉穲аζƤ歲甓嗤೐㌎䯰░䟄㸼⩭䧯䛥ᯔ楈僨ἴഃञ䣋娹沅ƻ䚜僵੍ᰬ兓䴵䍅烮ጱ䳺⻱埇爷ಘ刳㫎࿱๒ᕳፊ⸿ԥڠ዆䳥シ梡აsᗸ竳哮㵖䴁发ഺ㸲Ƅ⚂犒䉒敷䱜㪤⵨⭵䔴怩̬ᯉ㹱椰⪅䥯☭ᓄ䓒࡮ᑩⳭ㎤䮣ᵹ斅暵呀ế橽ᅝී亣孃声刾䧸㽹勦㜽媝᧣䖠ऌ瘕Ằ坿沪㵙䲡厐ᖇ⪅眸㧸犹Ᏼ禲滪婄夝䍪䯆⒉چ㌠室䒳➮៱㒒ඩ䲧梧るȆ䀑㽆ᑨ⹯夕᧑ᾴ沲竭ୀ泻ቿ୦⡼ଇழⓋ㤸⏏䐁ǀㄑ奸煺嗬㈎⃰捄戍儰姚撫ᶈ䎒⣯ᕝ瓲⢧䰎㒙抹斺⊦狣有ᓜ璜ḕ毾ὐ䘈ᇾ▉篇憾皝㦾攭ᛨ擓槩䢯㳍㷣煾㦩ᰄ瞱张吴䁧ቻἘ⿪歔塾厯䱮㶑㐆න㺑妷᪟Ẍ缥⁋ग़扢इÄㆩᅺိŷ禁℟ᛔ䉒叨Ñ峴㌇䨷ᄥ〵幫䆄ՓበѢ঒ٮⱑ⊂ଥ䱞⸹吴侾䆒㧱⛇ᦜ濓ࡒ像ݶ૛仑Ր䨊恴ᑹ㧆᎐夸び嗭ⵒ梬䐟䢁⯹☷q㚼灢᝽⨘悫⦪桟峑琍享ե万⡹⚁⧇晨府䲂ɬ䨳⊡猦兑ⲙ岓䌋䧙熼煸幜涓Ꮺ❏壉ભ䩑⬠㯛㛀ಽ䗫ࠪ䋜㤥橋䆦҅炀䛰㭹ᐵ䑼Ɽ䗮ᐸ垄玒㓵磄ዂ⒢Ⱁ〡ᅠ焥ࠬµ䨦2怈➠擋጖呢䧎ⱉ㐵ᱸ粃׎ᗥᝑ㩫᥈⓱⌺䨪⹚㢘⚐户憙ײ䮵拲綪╋僌劲ቼ⨡ⷥ䳡⌅楤㪽ᕾ攷ᡃᎣ〵⡮恩䡐અᙠ晲␼旺ᜫᩲ呫效೐拊䬹䰬㪅妴熸妒斓ᐳỳ࿳亠怿㱥⇰ِႀ禷乾㩺ㄈͼ偘ᷫ尦瓁ᴑહ࿱〥ᶵ批ᐴ⺯ᓷ䴒毫㝏峌㌁熡ⳙ★⊇䅱祡᥸䪰射筪㪷ᗩ૯䮟伙㟑ⶴ扴準ԯ慥憪摊➡㽓䊹䡹ۇ刡帶വ䲉䒴吠ᦪ洪翩糚ዟ䮂⡅㉰ٷ⥱粝稔啲徼漩䏨อ糃≙☵⯉夅䉿๶ᖱᛒ宪筋磉⩎瘩⯓䫧܅䅵☋㙭穸䏜⎲審䇩櫏⪷㎪⬙⹵ᱷ穷䕶ת嚲䢊堡㫍塛⬛⩡ሐ厠捃ާ啴ᆎ啥沊匂䟮㋛଎ቪ䣉ゅ嶷放畡䃦嘃⸊祼⻎墻ᕮ慥⯅ㄠӵၺ♘┰✔姒旋૎嫊Ⳏ䓗䍵㚼ᡚ㕿绝ㅔ圓ῢ伹ధᛘ⋓፽䶵ⶑ祴獹䆌祖唫䙺冊㷑囓⫶籝ⷾㅞ䣵ᥱॳ㔶啥᷒䝋淌ॆἿ⫟冽㙕奨๲妅
ɥ據枀⯎໓᪶⫧⸭⊕╷獸֚疻呧Ⲛ權≔刷䤐㍵俳ᮐ⯵㝵⚝֌囖圔唊猴廋嫙江⮺㬹絴㥨㙈◿擪债秊䇎⍎ӷ欯ⲆⅥ㹵兺䥵ၴ䅆埬榨ࢋ⛖កᩧ⢪⚹ᔆ⩰նÈ㘀凪Ļэ炸䚣u㊤ⲭᕸ䵺ᆖ疡啃ጔ渻᳏懑ܒ巈毦䪭畻Ⱡ䎃暘兺хඪ炁燚'擻ţ䣅婖ί榘當嗖唦暁䊋燌⛂┴洳㾒㾑⤢䰵Ѩ㕶傦嚺㳌Ǚʬᬈ洣↭熆䍷䍢䶺㗒�䪻嚎槕ᢤᰀ4ᥰᵖ兴獠哚⛟ᕊ债෉ǔ㫐ᬸ棓㦭⭗ᳵ率疟備匆瞺⒉!ۨ䐕ձ㫥㠵䤏஁傩㖈卦翋ᢈൃʹ獀櫞ⵍ㙂✩䭧൴䁅剶䄒䙓孊ࣜ㦽䰕⚥᳔㶻祫畞晁ᴌ幔疉罨捗᪸䵑ᠩ㫵掷獳⶚᝞徶孻䗀ෆ܄剙⊻㝌੨珨䵥㗅曂僖䛀䮌ේ⬁婬栫Ⳮ᱗˶絶�㒍嵖哳੆ᷓ⫰㉝ᙻⲥ㻕ۂĬֻ㜙媊掊墋ୟ㜟䩢瀄ȍࣖགྷ箃䷐禂ഠᆒ⒔凐ༀ㪝䂝㝥⟴ᕺ歺㧣䘇搮唩ᄌ൱ຨ㫂䠒傤⹠傄琴⁓䌕弢嬠変揂\\㮇刓⣭淕⓽䵬䷙嗩喜兛岡Ꮜ仿婙⒇㬽〢燿䞊㈌璳広⽛ᴈ嵋ᛦ媖殛㪙ࡔ⛷㬠嵮䄲ⵎ慁ᤊ㏐⻈䃍劤⹽斗屌ᝮ䖕擣勺磻焍喭⻋㗕ᑗ㛺欱嗹䅂憍ᗽ庎俔歈佃㌆殉殧㦥Η৴坥巒痛宮䟚଎揝㵘�䩯啽抗緸ཱྀ三圹嵮揚篍䧀圁掙洯㖽Ⴈ䏴Ạ㶺圓厨᝛攊ߐ⛟桓櫯ⴭᶄᱰ瞎瘀㘑᜾毚䴌柔伎㮙⦻㥝⬔௳枑᷵砓勾䳚眎់ᬈ竫漖㽽拳珴᝾᪣眅䡞竚䑵柍牑窭梋⭽䜴槳ཽᴵ琯廾楚䜎࿕㼑筧泿⏽㿴᯽䞕㵱̏姎竫帍ៈᛯ嬮泬ಝ搔㟸澉ᵞ矵ᱮ疙䘥牲滺⮰泒᨝弱念ޖ已㙏崎䲫ㅶ翕绶䌏滧☝怖緵ࠢⶍ畓圡枚㵉滐ᜓ᭏澳⃈抖ၜ㝶Љ㜅䔆啜ԍ◌Ṧ㴫棭⩝琕偙ᵦ̤ະ㡦絩㐿₳⫩瑍晥∹噈塗㴲Ή窐ᗯෝ愖 佴Г瀰㌡䦘⡚䃧淴ൿ᧡䆉⯵ろ⅐戎瞩䥣◛㡟篏ΨШ㏠傦簪㯴⇂緤ầ‣弗⑴ᦟ჊෍桕㪥䨸澬嬓಑ߐ絣䮘㐇惶㺖笇摏㺦ᠬᢘℙ窛棟㩣懦᱓⵱ቁ౐લ緼氹廃ㄩ࣋俍☍ᜬဿ意Ả࿻昁稢⼒ࡄ㚽㪽毷◽拱≔䥼⎣ત㟞咬改῜Ԙ˘໰恊璭倰⾸䎞ಷ奁䢋栺彉戍☌ᨑ⌨眩㵱岾Ϯ൉ু䩧娕梃ᇆ䞜᧨擣䂬ཱུ㹬࢝๘ⷉ⋦砸廜䚺㱲毇咰ත㝳⣻䏼ߴ㨁捦ؾ撔⻼婺濨砣⧸嬧≀橛෱ٹ̠檧䓹爘䚦汨撃⮘๗⤏Ƴຼ㜏೦఍ᢉ䛋簙Θ習࡭篇㦵႖⥢Ꮲ棁ゾ扶㻤␖᫰畃ᴬᩒჯ䎇౨㟖筦䄾懲ᡤ✌口墳⑮敌┄´殴ㅢ啇亡楥ਊ䝦ᾐ浃掯ㅕ䤀ᐇཕ噖䓛縊ᗾ䦺⛩ᯙ媳䬓㥂⑆捶矠夣Ⅺ≎旄⠶✮ᰘ攃ᱭ㥗䔖ത俬㰌䓆░檏⤨։ᵑðͭ⩐ⱺᎃಘ㱁缣⪺恛䧱宁櫘糣据仳乱卝ᨨ⇙㠹ڹ⛓槰榦ᡴ簃瑯䙕䔕厼仺㻉篻᪻曊紘É̔砞彭潦ⲵѽ楢ᰮ垕⚸灐ᦫ⛹᫔篣ロ౟羐᎓ས㱘窇⯥䭞弓ѳᣌ灢僠⌡禗卐϶㤸㯦完粀᧷ڣ᳔潣䲮ж唑䏥䵰㗉坌ⶼ㚗网柩⸁ࠩ支㵓ᳺ䎹䴐㶹歇ᢿ㊔᨞柣᰼恃懮䭘䉾᳓侊⽙嫼㾭㈮ፙ朑敜秡Ү棾㓪獧ฆ㟹獦䂾溊↱杆棜簉䜸㽝䧗㤺䢉°݁ℌ俜⫟曀\"烾置潔哤捊䰶㋱娚洿滗㧷ՠ弢慮俤ᶦ罺ச磬䩨⇐ᠮ䒒᳼䯩桂澃䕮繓˧ጻ丶䀁攧⾾↎癜ᝤ᳌洍䖨䣘䞴獔⌸գᓆ撑ᠳᵆ⛭ὂ挳篮筕ᤎ፻䷱㔹絛䎯熆䖎᠐ᨷ寳㸦⃜ጐ㎋倆㵥簶⠿抉ֹដ慲筲㸥境ྠ疄⽎㴥䢇᩺㺎槼䜠Ე汕氇₋͢㹵爷ஐ䠚嗎垶㶓ᛛ᧬疓߯䓐ᳱ㍏佩㳞枙湸屒ᖹ㖄᱂縙࿛欲搢䏊ⱹㅥ喷྾䲖旹䚗ῲ繡春ዕ惲䆩ⱈ㍍ᅧ庻偬嗥晔ᵪ摫敭⣓㋤㐂瞷奎䅅交喑❖噪ᰗ੨璴匩幕畤ⷜ䆤㛴儣疗ݡᛓᰒ漓㫏坐欄䮨⻧勵僙䍽疊愷⠔慺璋㗏灓櫹ᴴ䅤ကԚ嬽ㅳ㖦ီ幸抋◭⛙㋦䬹Ⱪ㈵咶穿֔䩳坉ݚ敭巍付㫮歃ⱍ桤㦭᭻綛塿ឲẺ犫姎㋘櫾⶜䰴㞖⁗᏶Ε໽嚡姢璭巎䤧㤅จ温ʵ痶楽嶈ᗭ显塺榝◌ᾩ嫦ᮗ敶㣂՗ɦ疄㘇☡巺熻岎䇓㬀⬠䴳㭥䥖䀿ᢓ㖶㚬庆緳窏剶ⱞᙻ猡メ滶拾囵䷺䞊弦竫䢏曛匂氜䳝㵍県年繓㖹㟠䄶璋䧠ᔡsᭃ⴯⿽ఠ⛻䮇熥㟲屆暫嚮嗚✚寫⼍㺍燗㜌஌淃㝍娖䃻秧㻜匎次汽ㅆ糆偿掃䶻☽塢槻庎᳙嫨㬿ⲭ㒽䇖㘻⢋න埳嫐櫋⒯旞勴㮐⽞㤕嫗ヸ残ᷫۉ嶂焠䷏㏚䛼ⷛⲉक़ĵ㜌枝዆盹˖睛⾭燛㛡ᮼ泧㏅䛆佻᎖Ṧ癳ᦎ眺ᶏ䟜滩嬦沗㥝楕ዼ䲳㖥癀಄汛ᆔ⏗漁㭺⼷㏭䎷ᚈ㞄㗕矀߆嘭嘌⟞廯氉ᔤ歹ᮖ儣待浭百໾惛ㅌߝ匝෣溷㶑外⍺㾙᷻睜㙪䚄䷎材绡玷⽵㯽簗缾䞋緳᪟庖泛垌䛐㳧ෛ⻸㐁⊖䞭ᮝጙ扡忮染砽௕䫰琔⼅㜭炖硚⎅ᷜอ幑动᲌῔戅᭤᳻㜣氶篿ᄔᖱ白彆瞋㘼燕眚◢Ṝ㎣傮Ԃބ㗀ቘ㼌睓ဌ႟廼㮧涝姕岮瑛ऀ书༹悡禛᪍⒔朢珰ḇ㧣䤯屛䶘䷵ກ尞缭⌼ゝἌ䞚Ὕ楃濷সඞᗉ㟼㮬沐殌ᒐ૲䞄ᵣ㦑涮糾⎃揀๒ⲩ惻儯炔朦Ȓ’㩅椮㱙ԗ䨆嘤䀞絅㢽㒐䨂ṗ滠㒘篶㉘ᄘ叠矛崌涻䤍ʖ䧪寨ῧ㒝渮儫ਤ叱ສ㦉瑰矌ෝƎ⌑ἔ票ቮ惻宓綵ฺ㭱氳䷌ڝ囥篛⽬硳旣瀌囝曗㠆ླྀ㿧撼曔圝毼泸禳樯ɛᮍ㏉瞆㩙犨玤෗涇䞂垘纲嗮䍟㎖友ྖ㼹汇Ԏ㻟ᵽ㷵溽㨓簻⭘৘疭堞㢙曇咿ẘ看栛᷸烆灎祜॰叅ߋչ∛䑽㞢׮筯Ὃ㶃摎縈ᴛᏜ㪋捥潇呾乶爚☆ᝅ寥嵝᭸匝௎ည嫥昇䣯碗䘝䝃⻲瞳济ۺ樿⏠⹼懅樧᠎兖勥䜬崌焫獏㿿ԝ䯧཮㽅笧湖盚ᰥ椯潊睫棎ჿଖᶼ⻬ᾙ歛䱱⊖嗡子ǐ԰Ꭶ࿹ᬌ毪䝬㨎竇౽䆘旤坭⼂紫爖㕍ᬋ凬ྞ夕瑃捾䘿ৣ↛撏㝉圖⋜⤁母⺧岵攧坾ǟ痾➡年ᡳ秎ٙ⇝ซ⺥㺄曋穾㖜૳៮弊瓳窎ᄺ䔇凒⹚㱨㑰䏍∨⨬ࡧ⵲犕䴯ᵞ圖宬ǵ㼭狧䝿㖝ฃ⠊ᵖ祻䮏㪣圊Ꮀ皋㨽淗Ώ㍆త〲渒稾㍖⒦伔䦻⻊㹁揗ㅽ玔瘔᭰彪纲唎㏚䔟㯷↭㼱亗⅗ᇓᇆ㝢⾆燋盯ᯞ眀寰⚈ᣝ橇፾ઝⱮ㶇幥尽窂ᔈ䟛㛗瞏㯚缗⣾ᾐ㮓睉漞瘓毆㗹编嫟书姊䆼ѯ抔䐏燤俖砳䒎₞羇宩乀紶惰瑟壴爁࿨㲁粋媀Ṿⴎ盠㛈糣敇仾⎛䏸༽ృ岭紾য়刀涺孳㶣撋竕⾙᫽坙巾痭圏⅙漏Ⱄ䩚浃橀ᄆᖒ᫣ࢡ泂票ծ⯜ȝ㯼濤碝算᝾瞗嫥❾巼盇瞥છ漁◲仂β掇憿篜刏݅泦炇䶿浛䦒㯰᠂㳢痁൝䎕䏳མ㵀瞧寮䗘㎓柜俜綸㳗夬䇹ᔇ䭋Ჭ㌷䩛ᕜ樟枭溔紣潯䋽箘䯡⭦ͅ粇䨬禝䘐叹ࠂ㭋盯䞿ㄑ䯫ཹ㵞硶滶ᖟ㔌堎⽠ゞ曹ᖈ䎚绿侬㿅硝浿ኟ樚⟈䁚窩璏Ύᚖᷲἕ忥筧櫯杜傪㠁潊紥恏᫝̚搁Ꮵ劍㥗殏䬼ᘗ㠑滬笡琋圍礚㬇寞㳾症墿綘渎堐Ḻ穳珻䋝柞⸚Ӝ屖琫䣶ᾙᤈ⟋噤稣绻䐾盳嘝「㴝筋畖槜䐕搓ᾬ㳼ӏ⭟漄䟪⽝㶌簧竿℞؊⟰庒㢱ᔿ䋜则ݤ漧摟㮜䌾ᤞЌ㎼㺦篧璋Ї媑⟡寂侵烩敟ૼ搎砌㽖箜窧䓟娗䨋Ὄ羲㜩秿ඝఙਟ庀㰧朏⺜䈖ᝣ澌㰹ㅏ䱇Ⓖᘁপ♯㿩汾þ䶛䧺ῷ㷅緇睟ଜป៩乏㧷晪㥞⶗ਟ尅῀ӗ宎嚟乜瘇㽣嬋硷⎞笒㟢強಄睯乾敜甝濝幧㲗揿矽咭ḁ㼑Ỽ常௜ᴙഁ栔丽ᤫ硟堬搔俾✩继牓㦏䟢Ⴚ幘庈羡㖛憫గ㤁忐ᴣ穓掾߸栒澳睋窃嫟䋝ఖ瀝㭼搫晕痯䧉砋㘞垳翓硇窾樑㟦Σ縗獴珀䐙㤹楙缨㪌悰ƛ᠓「忦绽耏佇樝搋盡翷縅喟૽䨹晩羇⺭狟崟᠝ã㿕滗羷暿府ᣕ✥羏⵿簟㰟筿ผ羻绾女柧傟៶依垻䏗␉柺侣㽝乡糡ᬠࠠῗ向㰡緍彺᠐௠䒶搷✦ჹ┇碀໔ߕ䒟⼖災㪛丗Ѕ斤羾±値ˢࡰ୲ঠ₠娡斕ᄨ癕㓋᯾ˀ缮䳬Ჲ࣍矕曗哿�㸝〥⠑ 恅䂌缡㳂˯篦兟槃䨱℞䴽砛䲓䰅M῎嵆绢̇硈๟槀❧„Ƙౡ〓䠽翳羵潺绪Ћ竈௨滀♓ㆡ㰝娧琬别翺罿乘Дۘ਀ᩇ䨟㐡ゝྛܶ1灋羫䃡檢࡯程㆒䒀⺟㡡旽匙䲐ԋ矻㿓罅㹻㰸ㆤ૶湀⛗㩡䘣Უ䦶怀ឧၴ彏㹹峬ٟ煰ṟ䘟ᔮ㠜琘ਨ搳⡑䂁澉庎˖塍犠Կ叠嶞唝攧ራ琅⡗忑杖䅡̚Ӕય棠㊠坮䀢忘䔵怷 �佸䇖尿硄༐ᦀ㻫㖡缣㐤焧倴㏩f惍䇧㶘⏨঑斁剀䃜⁄च敓:෧澵ἫŽؘͨཀᏀ㴀䙡㎢૘晦倌㧩傂杢Ƹ嶸篽矘᳏勉ᴞ澢㐧Ĭ簸恔⡒缳䅱Ł۰瑰ἰ✀条汼ᐙ䠪Ȱាࢇ✬䄸䍋㪤ຸ᧐㼠憡‣㬤फ怊こ㾲惒䇨䉊ݝ㚶➨㺠栞笢᥈昪倴灝炑Ⴑ倳˞竳䞄ᕻ吠䟦ᯬဤ吓စ⑛傋罺∈ιܒࣨᙐ㔠庡ವ⛘匠⍥㐭ᠼ⬻仨䡈ъନ䔠᧐ᮀᕢ㼧⬗瀻忭₞罘ĺ䋖奊෴᪜ᐰ稡䵢ᚦ⹴熈㿲Ῐ㽜䇇絺㨮璈Ự㳠剁糽⊦⨯਺瑜び徇↣ȣ֧牛殨㴠粎档৙Փሸ塑࢐傿℠䉲ܔࣩ⼻䑐䲁ㅬ犥Ꮡ㨳䱞ࢆ杨Ǘɥ݆ਈ ⽐捁唌犤假ݭњ墅睂䇷屪Ѳੌᒸた┞ᬢ琙欨搵汔ら睎∎䦐߶೘᷷嬀憁潢ኙ嬭∺䡐㢔僈璒䏤㪷煻➖幠巪昽嘙挪⠺⡅塤烡ȍ䏶ڈർợ嫰呠עᆥ∤牤桂碇働戃䉨ٮ࢘ᚨ㴐䵤穨ᤤ⼬〶石䡻ÒᲮ䍣秬ࢌ᱇幐夁䓢㮧പ࠱汍㿃弬䄿䐖ܫ䅟桿ᚚ㰠⚣灥䀤ℽ㱙墍烬幅䋥ؚ┌ᅸĨ喖ᡝЛႬ℺ᡒ⡳⃑䈚䌘ԏ矔樤⾐握ॣ碤䚦䨶≝硱熗⇫㷁ڮ瘬ᇘℰ倱㪽䖧漬Ƚ᱂ғ㝀戁䎯֑༬ᣠ㬠䯁᥃禥洒ဵ淳Ҁ䢴戞䌄䙒໠ᩤ㊷᠁㪙И元ℰ䱟䒋ヽ慳䍳ࠉ࣬ῄᒀ䉖䗣㞋堨倽㉒䑿⾊ᆖⱡᡞาᆲ䇨爁ᒌ枧ᔑ丆⿻碗罟懣䏝祖౒ᱠ㥨䦱㝃⦦粨搳ੁଦ䉄Ⳇࠬ䘑༪ၗ䕨榁᪈䥤噐塣炤䵀⡃穩ⴜ䕎ྡ➴⼰ű㨱䥥ԪᤲɊ恩催ۅ⌀εౠᬦ䇈危䆨㛩䪩⨿濳绋⣎冮⌝祄ૢ᠈⪖ݱ䛂絧湕വ㗽⠨䙩冻瀭瀢砌᝛ᚈ敀秃給ሩ砲䑊ᑧ㖅兕࡙û熊Ꮤ㖈䳱糃ס⤢樭橊嫋⣳切⋶䝌௘Ẵ㬨峤䧃坧囑㦥㩗䨭椃冕⣁ࡕේᥨ㣨洱千孥嶠䴶瘫璃⢬့⍱⫕ದ᠔㮐币䣂䉦䥡䌿煻凄棸㈀挥灠ր 㮃㩑ށ⣓昭⼉屝Ґࢤㆠ拖䒭࿪ᩜ䄉⠂ᢂӧ媯攸帮摈♩凬捶⯩ો敤よ䏱懂佥᦮䀡晏ോ⤖ㆬ拪䖗䑴॑ࠈ擱ং䖰碨ᘵ⩕ᒟ惾ㅔ䋉䞫ఏौㅦ೑ඃ榲ㆯ巯吢U⹞Ἇ≰⁛�䑬㕏⥑櫃擦檫ļᱤ汦Sㅺ扮䓘䊖᦬㣠႔䮵⳧犨笹⪢炟ᄐǃ䌵䕉୪᢬㕨嫑䛃㻥㶭̶⩊Ა剬ㇰ炋悿ܖᙴㅘ摜㢂ᡦ䎨匴䙘ಊ㢸猉抃䙕୮᲼㌸澒ᲃ䕥䤇匷0䲟炠㺠⎣䘜ਇ氈㕸网㋂旧ᶫ㜰㐫䛎୩冚䑳䙕ఎᥴ㒟㗑ࣃ姧䎭㜰ṗ䕐壾燓㦒䙭ຝ䛠ᡲ㟆廃䘢ឯ笾泠⡰㤁煪抻䔭঎ᖠ֘嬑༂捦垯䜷ṟᑠ㱦㲻爏嬻಺ᦜ㴤㘑栍㗤昗圽幄Გ壐焹≇䕒૞ၯ夘們ࠂ翧糁⁅ವ⺨Ҥ摣挴䙗ୗ拌㒛ᘠ篬决෷°⿬溬殏⛞絀✜ఫ毜㘤噮砲桅ၯΌň⇊砧ヴ㱋䗳柜橢Ⲿ㳑Ղ塅㈑䂹繑璞Ҳ঄ᎅ检ᛁ᷄䮚ɜ旘㱆とᨼ牛ᗅޝ焧℘➊₀Ϣ⺎←浃㣦壀䢹ᚳ䲊潇ᅜ抸☓࿬ൂ⢲㲩嶀ૂ䔣炵ѷ⊚䈬熄捧䛻ூᱺä粘浨ᙆ狥梹ᚿ≦䔞ৼ扖䝲஡ᦸᛤ猒條ࠣ屬ࡢ㲱咝渺甈i兤ϔე❨欴䈈尡籨䢠ैቨⓃृ拓䚸䨦ᯎ៤秡ᢲ媣ɮ樿捠᥊┟ण䆂▄乳⮮ᕄ涎಴咚唨ဂ⥈㮹┌㢍䶾檏പኴ㸘丩唲≇ע咱Ⱖ剪ࢼ䦱኶禔䢔᪲なᭀⲃ䶣匤竄P㉰䕶䇃敦♱ؕ↌ば少栲ȥ䞪缾煲㉣傉䤮憆┮匨⇒㢄䳩६獄籭璸吧䡜侊意ᔼૄ䭙ᣴ⎰Ằ緩็ᑮ㢼湕抛⓳䧼䄎♼䲙ᰟ܄柩லཅ⌦ᒻ楈㊂澆愞璷䗨࿹ᘪ⵰⪚☃੆砮㲲塕摮㢴䥀劤⣢䢥ၤ㢼㑉嚣情慮砏奕傄䄎Ű叱⚌䪀ẸᣁᏩǂ⽅瞫㲱ॆж欪⥄厉䛡咅ᣴ⢄煉昢刧帨璹怦寂⚔恗捆؀⠅ᡊ㶰ド⠃䅧ਯሶਖ਼劃ӵ䧬ቓ䮪䱞ॊ㍸৮伲᳅穫⪺㔪ៜ㕴䥼ĝ䪳埙ᖒ⧓⇉両䛄ū᪰䕋悟梺凋̊䓦フᖊ㓴俩幸⻆⭆媾即䳘哣䦞ᳩ╒䵉 㲋˩⸂假ぬ⪴䥒䲛繟⧻ኮ⛝ഇܺ㇐ʉᎲ䳆湭䂍๐᪃⢬榞搂┏ભᤊ⻸坌㾳杅獫沱祌婷夀⥡及☰䖧䛈༽㗩庳╇歨ศ浒抍ӎㅨ后䛔䢅Ṋⷔ硉⛲ᗆ歬璸ᵃ婺㓦儬í㦲ǒኪ妐橩槳⒣曂皴兖䪒ᒲ暊ት✔䩽᭚⟄卉已捲絭璿㮹⑗哰䧒ኑⒾ䢱ښⷴ確栂焤ᖪⲹ൅㊔㓴⧑叏⚎םḒ㾈囉岲㟅䴧ẹᵊေ哏⤬⁰⍖䪅ᨦ⛝╀ࡒ㓇嚨溳䫭劖唈ᦛⴀ朜三᪦㰬䔎揲䳅㥬௭⹒ڇᓉ䤤㊋䓪䲌ᝊ⧄狩⍢濇䞯Ⲿ╀牷㤝槤㉉⟗্ዦↁࣩ哳曄ᣬ⸂൜Ớഠẫቃ⑐䶝ᑺⳤ䌬屲岅粐憷䍃੶撴榃䇸旄俩ᆲ㳔皉ᕓŅ哮䜻㕃傑䓤䨂㎲⒞䪅ឲ⭬暉硲Ệ㽪嗪卜暁ᒦ᧍ΙჁ༹ᩊ㥢ᅉ纳獄Ὠⰲ♞⪕಺ᇔ㋶➎䮳ᅪ㇬䰠⣴䠥峩ַ൯䪝䳃穤ᇻⓠؽᇆ㼬礉ӓ᷅䍬㒰湅穭ೣᥑ合攥丹኶㢔油๓⴦૮➫䍇᪟攌ᥥ⎌䞞്ၜ㘬䯞嵒座瓨缴啋㪛攔極㌺杕ఝ᥺⇌䕀ࡓ䪆䅨⦳奖㯂梵㡲㐘昴གྷဤ㯬唹Ⳓ纄狯㺷䭃䙿ഘ樉䂆㨕俫Ỗㅬ攰ຄۅ⳯⒴͇䙩䴈䥖㌏⠆䡵ᙆ┴崹䃒兄最嶳絙䚆䳀䦷㎴曖䮫ᑚ⩸䓩ᛲ病㻬㚵粵㪂ᔕ槝叺杁䠽ီ⅌堄䭓⏄լᖶʰ發Ჳ夺㍪♽侣ប⁨徉㰳瞅穯⎼⭏ຓ洁奄㈱攱亅ၶ⨼棶⯓㺄岬溱݆ᚉᲱ楅㎂摖产ᰦ㓄繉͡჆绮⎹束࡚礚䦡扒杞䴳ᶶ㜌䁹仓൤㧭䊵杛ઍᲑ⦜狯䕃䳋ᙺ♼罙㊓㧅嗯䊼ݎ檜ᢳ৫㌎晫䣩〒ㅼ峙⓳綆恒殷㍙ຕⳒ㧅ᎍ撃俕ᎌ⃼䓙浳眄竩㶾睐㙮അ㦝ጪ擵侽Ỡ㈼歙堭唆᛭厴䍟婿泑榴玚杷㎗‖⑜䰱浲⎄╫檴姢䊘Ⓣ᧚勅▧䴷ᓖ㱼狉⎓⨄珨檲筄幰哒秤牉⠛䭇Ჶ㙜庙䍢؅槪䞿䭔噣㳆㨄珻敇丣ᵚ⿸猉㧳氹⽨ẻ㍀㺃㳡ऴ᳢嫗䪽ᩞ⾔枙㼓ᝉ䟮⦱䵕䩦崟䧋猽昋䡓᡾⏌盉ᘒ㳇㠨Ꮏ彊䩲ↅᧆ㊢⒏䣳ẞ⍄䜙曒㞦嫩㒾ݚ㺋治礧狹➍䢛ᶆⳬ欙昒Պ㉩樸祃⚍┩℟珒⚏䳮ᛶ㿬写㸒者扬瞼Ñ呼ⓓ稇㋬暻䭇ᶞ㋼噉爒⩅Ῡ掴㝃źˮ礤્染仉ᜡ㔼夥䊲㽄痫榰䥒ū崈؂匀ᐳ䵉ᒡ⋌䱁᧳彤秬㔵槬㺘ʧ禥劗柳䪅ᯡ⺜䅙優䟆緯憾⃛䅷㳰ת㘘ᗰⲟᔡ㞜容昫ㄇ᧫ほ睃ᩬ䊷᧨䨊柨⻀庶㊬晹紒ሇѮ㾳僊䆏甘礦૔ᝥ䧻ឪ⏈㤎ഓ㖆璪䦾Ճන㹥ԥ劎擗䯠劾㹬春⼪ጫ䋭熴烇䑆Ƅ֯㍰ᙏ䮿ᖞ┢偩缒戴桉㖴僐↟䋶⻘爨ᗤ⾺䇁☜洙䤪ึ᪭↹㽖↉⋗秸ଉ✀䫨咎⋂䨙砓㘶レ媵畇纛̜᥁㌋撱䴈吁㬌壙䲫⻚Ɏ־⥜店⊱䗪㍰昰⣳ᥑ⒢潥᪒䉅⟨ѹ畔仁ʢ㥓ૐᒝ仉Ệ㙢䝙ᵓ⤷濯⑷烒Ṳ挈礢叫ⓐ⫸嵺㶢甉͠哊储榳㣎=抡㦴瑛᩻ਓḾↂ䭎䆫ேⴒ㱷缬湷屿䗗ਡᚰⴉᵖ⻼畩ࡪ猶㹌侽磜憢㴐┻㐖暛䪤岩⃠ǹ披䜅⭫☧惈ũ峼䕏ట㧜⸳ὢ⧜禥䖫㔵矨ቻ䓌↞⋼榤䮠斔畸⥨ᣠ〨ળ​㕮㉺䰵䦛ዊ䖨㉌ᒼ⤰峰㮐ᭅ堔⾇㥎ㄇ刯䦕㳮ᥝલ攤⨈垞⫸澥纫䜵⥊䦴哟ᆊ㳮䗒䩂ᒤⶐ堾⻌䱹伪⸷祋β僘↓ᳳ▸՛栁䧔呿ᙲ拾崪ᎆᩂ䦼惟ㅪ勞䗭珵ᔜ⼨墁⛢愱睫嘵᥌ᑸ὆ᇙ崁◩੷✸⶞ቆ㲲埥⥽๹㥋ٱᓕᦔ⌜₠㋆ᛨⵝᖹ㚂狅ྪ昶ፎ㨌䳟穷瓜數નᐡ䤠嚡⧲瞙磓আ摍➶⭜楶᳼Ժ䰝ᓖ⯔吱◒䓥ᚪ⬶᥍ᶲ⣟妊㊸╥䬁ᕆ⩞抦⒒璅䁫ᎇᩊ媻᳘٫ጉ●畉▐ཎᜁ⭜穉⥪抴ይ徹瓐奢㊩故䫇ᙬ䷼廩㶒墡滪឵坋㑻睞湡偣粦䪧柫䵘垮䨒垬士玆䱎ṷ懲㥡羑⦁䅟ᚊ䪈厎␪瀹Ъ垷⥪w罀禗狾ᇟ䩇栞ⵜ堥㔄尵䪫瀴ト㑼峄䚖㋝֝ࣼ曌ⱜ僖㲒䨵廼瀥࣏晽哏թ˚敌爻ᔝ䡂彰䩬捙˫⑵罊㨁⋊㿋૪㥐狢ᙘ⢂帖㠬溅ဪ攷ᣉ⛆ⳓ᥸䫬ᘌ⪰唀Ⳕ崞㑪捱尓礷ᓎ䅺㽝兰⋍₴䠵ᑚѻ揅⢲悹ቫ懅䥎ⅵ拟ߓ唟▦⭦᠉ⶈᎅ⍒燹ޒऴ扊Ұ睎╨峮ᖭ粽⠘લ唅⏼喅坊᥆淫橲᯷╳㊲ᥖ⫧ᖙ⦠ᅆ⪼᮹⣊ԇ烨㥾惊ժ狝攺猟柅Ⰴ崵㳪瞵拳⪨湪敳擕㥫ୀ昈⨲オ⸄幉㺪涙⇫攆ᜓ啱狞᥾⫸啦㍶摕⿌呚⹜祵䅋㘇៯粽䫜⦝⪬楣⬊⛜⢉ኁ㏪歵弢⮆燭൲⫃ᖜˡ喫⪅ᖉ⣅Ắ⽪烩粒⑷擎命䝃奻㲳奩⩨柝侀契⭔祥᧪笴჊㺲櫁╣˵ԫ䫝➼⿨冕⥼噅⺼⨱↨⺻楋疂䉼唯⪤᝟倚嫁Ꮬ桕咴〶⫎㥻჊֛䫽嗳⪡听⡤呵㨺䁵␒耄䋍╹祍㹯ၶ攠挴唪⥷᝙ⷲ罹届ᓆ䯭呁ૂ䶅㲿ỗ⬈␨䩦尉┺䱹䪋ℷ奫㦶曔Ρ您娅Ꮶ斤丿ᳮ⑌䳹Ă圧ׯ嵿嫝奿勃嗢殌圬䶶偕㴄嫎ᇋ罇ᗎ㕶㋉䶀勣嗤橠携発响⃷㊹ⰢŴ㓮᭽睏䡦磁㥳⩅吪Ⳅ嵍➢娹⛓礵䷊඾惋叞૷▂匞嚀⡅ᾭ⇴灕⊊ᰶ噎㭳盖⺐೴ᦃ⫩摧⵺展㵺捕䦋ӷ㗉Ʋ᳒ᶇ㴈痗䨦⟞⵮兡㏄檕㤊乆淏䉺ⳋᵬ㫒喢欚♧⣬嚚㭚亅櫫䒄㏋筼着ᵲ㬕ᖙ櫴嗷⫊婵㲺峅犳了㷍㦿瓒ᚃ㬝㧭氍嚕⾓ᝍ㆏ᄕ穊䮷櫍➻ởᵯ㓖斩櫧埯ⰼ劕⻪窅痋ᲇ宫佴ࣗ㶂竰㧫款啺⼾傝⚪朕㙓圵᧦ᱭ㢾喔璷䒠樳咿⺟ᄝ㜚囄粪濴乃ᱬ协庌抧䗁毵敟ⱎ倥㊪伉䀺ᚄӉ侻ⳛ㶋₺甲⪦ᜬ䯮傭⛺䗅᠋Ƿ烫㝵ǎↅ㬖ի∊堀汞傦⴦椕ᚊ䳆࢏摴娨浿指䖄狚㢢⭠ౝ㮜牕挋䊴ᢍℾ჆䎈ጚᘜ㌛含⮜塅㞦匭稫⑖墋ⶺᭁ᩸Ⲯ㘞䪤㚥ⶾ嗕⼴笕ᐺ᫷῍ࣶ㳄榚窫痣኷ᗨ泚傣⢪䷵体䓦჌⍺凅䎚䛃嗏⯐㟺⫘導㪔簭缋稷䂎⃿⛛婱窢㘈᪳埸济化㯦䎕穋᭷⧌熳嫕捺甂෧櫴㗁ⰲ微⭦拾㏊ྵ克涻奇ᵠ品෠ᩨ㞸檩啎ㅆ仩⤺ 穭䣾惘ᩳച嗥ᬨ柄梩妳Ⱖ牙琋塕䪎眳曐㵿ᫎ䖻殅呴椑夳㫆碭纲宅䃎瓰四㶂漸㘚ᰝ៣⴩刮㱆䝭⪺㱶䚏⍻৕偶᫉Մ㎦㙘求匶Ⲇ冭瞪ᱴ曌洷᫘庒曙䷶ᨮ㞻⼎元㎌䭭䙒䥔䗌孶ᛚ浪䚰෈⫚㗨⺤凝㌆壹漊情璍Ⳳ拟榙挅ฑ樾㞑⫒塅⫦璭ၻ㙕ㅎ䮹ࣛ慪✀䖆䯺㠛⺹尫㭆杩ݫ泷犊䋰㓔玔䳻污᫮㚦䳹婩‶䙭暊扗ẏ≷ᛟ஄᫟ᕖ㈼㠐沬娞㤌䮭䉻♷ঌ哺◂掃᛺ⵞᬢ喟䨩ᮣ㭢捪ᇊ䋕ࢌ掵ᧃ䭶✜䪕ᓐ嗴哸姲⩊汍䓋罔௉ድ囌㶉ⓤ嘙੕㞀䋎怜Ị犵愻䨶㲋཰㗗䭵ۡ䷼劐嘏⳾弥▶磕箻⫕淋ჽ槕╱暻ⶵழ暻䥧ᭁ⯶䡭㭺睕妏૶嗙此ۏ䦠剾朚橇ᑳ㫄碵澻ቷ彍嫻᭎屯狳ච孌圙⡭孅⭶䲍ེ滴濎罷⇟᭽竱⵮牧啂棭屉㈚札ឩ㫔䁉⳿◈ॵ䳓椻᪳㓟७媣㶶炍㉻橷峏㝾Ⳏ孧峥㔣㉰⌋⠵஭㢖䘠出䌋ᖊ⽴෉歹ᚬ槵㋇㓝䱽叶㦖甭涪⍕⍌᣺淑穣᪵ⶽ將㚒樮叆⑚庉怋໴ϭ㹰旊ၔ璶淂橧ߺ氭墫≶叭㯻ݕ䆉侸始ॴય㔭將ំ䰟ᱥ㲆滙ࠪ䛖㪉䳸ϒ喐㬌ෟ嬈呺検啷Ѵ岍䐺䍔⃈⋴滜孩㓱丈㭾㗁橣巭⣼䌙溒寗₉滰緄ᑠ㚣涓媫圾湃剭⯺䤙珻氵㶍䛿緔䵳ᓶ᷒⪇㟘榝嗻㤖圽⭺ԆԈ湾ໟ奴㬑ᴸ㫫㛞沣屙㣴䯹桒悴ժེ⧚剪亲浻牤㖁汊弙㵮皍亳叶悌⇼糂獢曼ᵜ㭆㘑橝奋㼬瀵ɛᓗഏ檹ג熍ዎׄ㬚⑏⣓噋⫮洽䥻㬶崈ㇰỗ亃ዿ禵⬢㟙檢堋㞖垹ጺᷔ植ûᏊ⭨ʸ䷐㬟柤櫤媾⺶昉Ļ嵗ᦎ䗼㇎畣団淞㪾㚅樅垧⸦侭㻪囄嵏ㇸ揎❷咯╀㮈ᛊ⨔忧㉶樹甫塖㬉ٸ狕⚚ˤ䗡帒疌毺嚻ⶀ瘽㏒䅴廮徻潃አ᪠෿⬭㒄⦳岫㜖峽りԇ❬ⷷᗙ➓⛵ᴦ㬖璉欣峗㷎叭劲浔⹈᷻⥓ঃ⛆⨑厦咉俛幕㢲擵㣪䖗挌㳸䯉睫洏嶶ॷ秠¨ͺ奦ℒ▄榢Ȉ䒌ߊ➓ڵ巒ⵡ琣樧堕‎硝̡䄕畄炭➩၌Ṩ㵰䐭σ殠যₐ⑝⏚ȵํᷱ䃷ལᔢ㸈©瘃⃇冯⬾縴峡ᔖ戅⠨ṩ依ạ惌竁疉榧嶉ᶾ繝ᚚ㑳稊叺柍ྒྷẪ兘箥畉㙇墑⵲奝Ⰴ甔؈唽咱⽵ụ㈨棭㤷ᄄ嘅䭰叞糝⇣㨏ǽ叓幎廭㷵䃫哙䑴᷈⳾梐㦤ᬕ徖窅㟉澣庹㷍㩉ᒵ棠攏㹰䗢厚濙渎寴琤ℱᦔ⒮筭瘧楴ቨў毝潫演ጊ彅矜ᾐ㻾䵐㰳璸扯廏㫾缀À埔⍈孊㟋έⳏ᷅寁矫渼☏⃞併絑昔チ箳᤼径⭰紺穷䄙㑗劗㫮塆笚⸔䢇柽૧愷弃嫜㱄堗殱໖偯㿍㟛俖ㄍ珲㙣⽠绒㲘榧癍偳板㓾䍘㍲傩㸋⿴ボ㾛㜗嵞㬃疷浿岃ၒ喝␚均縊㰈῎᭷廑緣㪩㝱濿娗㹞槝奝よ瀎症濔潯Փ幣竟癦ӛ泷ⵂ寝拪䃖ဈ毽翔ժ㻟絕焨瓿滹䓝堞䛝㏅盱ᜍ᏾濓潫缘͞窰඀ᣟ嶇䕔急㹜弗据濷㿕䭣绉緅筮઻楀㊟㋾䴣Ȧ䃄䝄භߞጫȟ巈܅矀᫞⵸ᖰܣ欭氬↍炫悔ོ〦㺡䢄⚇䲊䡀痐㢣ᝨ垸⤍䪱ῂ䄔今ψ⢄ඨᣁŀ習ڣ敠爮㱱㍧悒㑞歨幏䮓皓≐㭀瓡朣㛛尭䭕桒゜៟ᩫ΂ߌุᴰ㟀欞嵽䛨ฬ⹩烣忖᝾绪Ζ٬ጘᶟ娂②欞ㄧ䰗н硒墴䡚涍㷈啂༸῭傰珐㏽捋⾖砌俺傄ᄚ䆷Κࠂํ僗崶Ձ沣抧य␆樷缷㲭⇖੥答画溿崈䜺⥣㡐ᆣ樼熀䍡燘㋡噤㖩勼㉒呾二恣岦☗爻䎈ᢗ㇊ᶉ䌲᷌⁘ݗ儰⾯⋣⢤ㄤȼᗾᢇ佺䇛壋ݜ儲⏸㠅ߢ⫣➝剄嬢⑗㭤焑䜽咹٦ཆ欸㋀抁䟝Ⰴ圭主䢍咵焌砢桶⢸Ͷڗ専㳦ᗣ๲㘮搊㿼ᱨ࣠ᇡ吰䝂⠀㎱೬䀻᱃⭣列晉Ṻ�旂ሖ䎱㑑༅䔁ឮ厒凅㪙㢭䌣ᆸ傂䚒䇹涯竱༙捁ឨ梲ᅃں⊡澬䘡៖籥礆⌶欥曼潄㯧㡁珣箂䲮த埶穀⣽Ѭㅺ䂸嗦涊Ṉ搱䠣瓻㖁┿煰㩟ᒔ凬ㆬo䀪䦻俼⩀᫃㆘儢㔽㟶䂏䤜凩党䙕൵栞᪈潱秃䲃ߡඨ䥺橖棬凴⎒䞫⁚ὔ㡼ぴ洑欱ⵤ䰑߽ᙟᒏ刋䶼䜿㕱棄㯨愞燃æ䅋ᐍ廍噅粸壦儵䷃冊ᩬ㔈粪䯃䙍፦匸穚䲓౩爩⏾ۄル଀Ю〡䇥性亯䜍㩜ⲓ䁂凯फ़䙫ెᥡ䐟㉱擱吠榬Ⳋ噙䲟ᒛㆯ␍䝑䜒䂆᳜㊈愃沂ᶯ狋䕻久╭᤟燃䘹໕ෲ⌠琄叞㸻妔简੝9㣡殑掍⮒暆|䀟㭒ཀᗧ翦᜼湜㲛㤊冦Ċ䛕຺᧼㭕ー歱㯦ậ漽⩝攤畚䆟⎅≰ፊĜう⼁宍ަ憭爺ᩝⲟᑯ燶⃉⤳╍༢㼘権厃Ἔ⫚夻ᔸ䊞礎曧掗捷礯叆ᦤ榘ᎃ⼦殬悻ᔻ㿔䤈懭䎯ߖ๬Ṧ᭔㺞丳糂ㄮ᤿政尺伩ᩂࢂ䄀�ਚ剴㊈猳籠㪠䑅ਡ抌璟熬橃㭳㙚洢㷸泈漳噆ɭҹ崱璆┟ਖᎼ⚻ౡᰜ㔰᭜ऽ囧の缺䅙劇⡖峒捾䩱࿆ᬌ㵤睩搳ເ٬嬤״Ⲓ擦䧍ᐕ浺䜠៘岤悘䃀憧≯瀎Ŕ碂᣸৒凎✌么䆒㨄槑䍲㙁䘭㔸䕙⪥敒ᇸ▆⚜噦Ẳ㘁੉抳哇竻侫㜹溰椶划媮䆎ྙὀ㰄犩撳େ奬િ缿䪗ᔆᣨĜ惬နἸ䛸瀁堅ට篔䪾㑓墜唃⣚厨樟䜕᪓寢đ匃揦媭伺Ṙ⿘擱犽䵎ጐᜭ὜㔍⺩䨳䏧䮮⃋羱器ዑ䁬喵⩖䰪䋺よ殡女硩⣴䁍浚٥㮚榻ڛ⚴睖Ὴ㤩㏄䃳楳⑯渿ᅑ檍影槔⧨猾仂⢚㋴炮呕ါຯ֌啴ڞᓹ૮捩⚔畡氦㼈挺䡓武࢖ⴿ橕嫑㞲᧸㎭ޮ瘺‒㥆㿲婓⨂滖㣫捑秞敡㇢ጠ㯚㝪ᡚ㮀搉熹આ疭窏ི咚᭣榷␷勄അ氉ቝᱪᡓᣊྮ巯વ暎䃭盲䦢暎伐歕斔紉绽咻梷簠䭔僺瓵᧰⍴䚑䳴涶㽌玉俳ᦆ䥕斻ᵕ媔ᝨ̜揻✭乖᩶㭈糩燳૊⛮欸嵙⫈泮滒䦘⟅乛ᡄڤ皉劕珚塭㖹㭟ᝡݾ妫䶫㸝䶻᳌㤬畹睭℆ᖔ㖾嵟⋋䪅䌼維⚼㘩ⶮ㮱α䓵⮋岮ⴏٖ҂㞎⻉䦑杇噵泹ᾼ瑊樳死狵㶾ݘ䪀啸㧙ׅ松㑙䬖㽥㵩簳㌇⣭悸甦皕牦ۀ䗭晛侖⳾导窈獓Ų䛯ᶽན暆㓷㦯㏵Ꮷ倉椾㣸懹缹⤆勮憊⽑຃೩ợ司栂埞⭾㥌羉旽涆㭇ឿ歚䫋ᕬࢊ㲤布䶘瑮㎺㴙翥Ⰷᷯ楬ݶ䫂糸幟䏖札䷟Პ㨵㰉妓嚢翬➼歵⊒泱櫠୺ᨠ⸝Ṇ㮔濉殓䠶睮⮸䍝⺇㴀䬐ତ朶箝ᴪ哄涩悳啇翭䞑ㅜ劗̐䧇獕୷咱仡㝄漥經ȶ籬灿䥝◆ᚖㆥය⚀͆ᱡㅘ緊湙籓妬桽晖㺒喉㧸ᖢᙋ䴠孑勰攥帓ᄶ仭憹z䊇䍮⦫䍡犄㙈嵁ゕ㲥昕唷緬矍⣚ૌ㕩秳ᶽ欗ᐸ夁㯘澆戭䫚᧴䱹僟冟泣娇提宿ඨ嬻娼牥彩✶珯㔾幛埫̛冶ீ晗仫滆㷜琥獙傆၎㴹ॱ滈⌍㬞浙卤⸤壌㕼犑柳倒柅殻盽ዞዾণ㎃⎑瘂Ά㗙㳚吵�ᬦ瘕ᣗ暑䅵姜䯙䀪⺟ᧉ㙲榡勭ੲ䇬塿⽕᪛㎐ֺ㌽Ⱀ摧ᢩ㞂森犓ᖔ磕㯯村⦝ԟᦸ奣ᙕ桤庹㲾㱴峫篆⏭玹❖冊⵨㛲䦫᝛暌她㹥Ẫ䱫睚㪴ቸ瓚ᯂⓨ◴䰃橒⿀墎㎲碙欫瘷ブ硼ⓓ࿜洋䗰䮝᎘⺘态㳲玬椓ᒆ灖䶾㣖㦛᳴᧼嶠堆㚭まェ㊥䪳ሶ灎桽䥛ց⓰ᘂ帇ញ侯⦥㱢礵䑋䱶ౌ溼単嗔壻⧗ඹ晠䷂夊凋㺹潵ᑺ˅ᦼ૷㚊忘䑟波ᜭ乒巍曒斚䢍㓊泍ޗ哚᫧䫪ԇᶽኩ佛ᤵ㊪搎䫓㜷╅䕼磔⚄峪槱吘៦仍Ἱ㼌捥糕շ୮㾍坙喞㋬ⲧୃᚼ⽜嵒㒢故穋籒Ṍঽ㐺粑ഗ䗢䬤䟗ᘩ⩕㊒籩橋ၶ㗮召嫝喓櫽喻反ᚖ᝴侉㱪汆瞽ⴇዏ幽ᒷ榎厀㘝珰ᝥ俢徭㹊犱䚃㜷⨆፸䋚ᚆᴕぬࠡ昡Ⱳǭ㫊檙立䗜亣獾慝疈ᆉ㖼毁⯥倚屙㉦㛕沋䋷俭Ꮟ憸涁⳴妺఍坕倌巵㮺捅ᾋ曶摌䎉橸ᶒᴒ嗱卜᯵䷶奣啖㪕压⓶懌卿㳚佛嬂姨王埮䱛ᫍ㒤緮曫泷叔嵻䗼䶂泥昝殅埝䴎廥强斥抋捶८䵺烟姂䪚㗋⭈᥹侂椵㋢汵縋炇ᱍ眾㻜᥆⫻痙⭦㬧䶑Ṕ咕㰭䝋捺⏌䣮䇝冚欛㧁猩ᮥ⽁墣㼁㸒䈻䗶擏嵺䫝⥛܌嘔᭗➑⸀嶥婦渵主㽆碌⍾咱⎛ଔ㗮䨔㜸⸨潤劂者乍Ƙ䇍䠺㻱⊓哨֫䯋囸浦壍㦝㡭沋穊䃬㣸Ӕ㶈ᄎฐ殢㚢ឤ廙㤲潥槓ᘷ揮罽獑ᦊ勱櫹玏堍䷼媳〺榭穓奖嬯磾瓛䝔劒不⭖㘱仁嵩嗂疙嚫⩗╯䥾姕ӕ朇䘊厹檮吲夹㥬淭斻བྷ�䦸㧷▃ᝣ㘇ᭃវ泡墣嫗ⷕ瞻㟶熍哸廟䆊竰瘕ஐ㙉⚅姑゚笶弓໷筬塺ᗙ嚋᜚旒ⶍ埤漵墓噶穙巫৶⼚憊㗚亅瞚㦼䎜㟾亥層峇ⲕ枫囖㝮決㛛ט㜍ⶪ宼囩㔌嫑㉆挶䴓匊ُ棎ピ৑㞳易᭽㛑䳱屳㧝㐅䪻澶恙壺犰۰直攘實穾墽峹዆匍侰ൕ矤䙵愬仞欕盁ᩄಸ᪔咛㍀嶍寳䷖઎揣㷐箉堳淛ᬗ㙞洣它䁬䔕㱆狘⟋˾痕宐બ᷵橄啗⧐搘㑡亾〢㙀搻ೳड़㶉㬉瘉愈砈ᩬ䋧㥊噍㔢绵庺⧽沷ޗ眒痡ቀз⣗抇㿺䶦ₘֆᤏ䀰珓ȧ໰䴂卜䠄汓庼Ϯ汝᠔冗᫋拲㬼勼囔巪乎ឰ⽍㖷㢌⻭Ǒ⽦㍁崁⃣㭡欞䱭㮜癛ᡋ孕㥀䍲ᛛ桝㬌䷽ᛍ絹勎ࡰ䱶砒ՖП⅊硽䈑㮖₄᷿岊瞆滹⺛㯷曵Ѱ噑܎淍噣祭܍ὸLjྊ㜯嶿碠ⴳ྆⛲㡸牞ಛ䵆爍㲼䟌֏盶P糩瞌乆≯㩢❝炄┖亠䟄傧梆紂㸅Ჰ噫氺җ㊚清岄⌖㟰椆՚ㄫἑ㸆笱Ҿᐺ⊏㩾糦⬀琱帏⯽⟕❽ἓ巬愝眧沗媶䗾緝澛Ȑ帍ᙳ瘰侔戤緥篕瘩濷徬⃞汦ॢȖ氌ᕠ!❑䒞樖ఌᠠ濑ഀ㇫⬤编剃筧ऻł憄Ğ捼҆䆱䈎缆怢⤲⽉ᐧ⃯癶ᥟ妢ᰞ槿ჼ⽴?ǹ㿞῭绮奯笹ǟ濼⌠砿ᩕȧ䅶ܧ焥⼫瞀㾺π篏癒¹枂⌡瓠ᰧ嶐堼́႟✢坜�孠БƂӀ綡爣渧砗⥡㿺狣ℎ䈉Ϊܡ璀䑦ݠྨ昍怈Ḯ⒭祡悘栩䈑倶ޭ磏䉔⦣桁璝㟲ࡵ⬋摟຀イ∕䢈ܲ໅楈㳤㕞䭣湸Ȱ䡐䡠ڲ墟᫡䏳⣜煴Ḁ㿪⁡渠ᄧ囀☿ࡣᢕҞ戒偓ݶ⤪∢ᾐ燎ኰచ嗡⏓ᔧ㢇粩熛哯扡຺ⷷ溔຃న㬛↗ԍ〢䒝㚢ሎ᰺瓺⤼ୄ㶀䦻嫣涧眴椿俒檳䤑佡乖㶥཯滱束㽧ᄖ㄀ൠ氡碥性柘凪弜⁏奏劂䙥柧仮䐠ຂر⩛焪縹梫⏏甝ဈ冴㊤⧘ӗۘ溮䠠ᐥ喪ᤚԆ㉿⹞ॠΚ㑸篅ᛌ㋧㲉•燠ⱌ义妶揃ᗾྜ⌘㫶怱熣矼ァᆡ垥㤠堫䭎掠摗ี⌐䜔愑牊㰢杁䶠価䀨爹⁎ਨゎ↫⅜㯦䯢ἃ䏧⡥堡Ṙᡢ礍䐮㲙₿࿞ḑؘ瞖ᐳ兄䑮ી!Ꮈ捤燎ȳ寧桮〡㹙廧戯礦ᐍ⒈丵†7ᣮ┓১ṷ䝰乞ἂ㶤瞣Р╇浩撿͂⿖⚔İ焖ᣁ禨㈃∈䛩汾᮳ो㔲՚ታ攔⨂㉣灎�墁岍渾䕿⳧⇍搳ᙄ⼀瘩䒗卢烠⯍ʳ䗸䫉筳奌㵮䱥畀ⷃ⾛榱ཙࣆ乶Ộ⍿呢ם戠獯㚾狦ԥѸᑄ⩲殺ĀЏߢ抜ೣ䛔彁囂㼳礠唬ᘤ䫸塑㧽ẚ㿮ᐉ杨 ೑ᾪ僥㶢എᮂP柘ㆊ惆㩄䆹殒୒潭㘃঴抒፿࠴㚌摷✹Ḇ㷨យ᧪㥒稖㘂Ҹ㤥ⴟ䵧ᐘ䌏朋ṙǬ礵ʲㄐ㠡䨠湞▤到娗灭揅伝ᾯ妌祂Ǔ䥢嫯掼妲榬甏䟀䁷✦ࠣ拤掌統៳尛࣮庽Ꭼԯ娯礢玠某㘗ἅ䘰͆਱ਇ庐〠甃#洒䈠晖ၫ夑⎰␌煇ʰ߇ⷯᄓ坟୮㴐㕙玥⡇佯ḑ砜熙揸䚰嗯䴲㽝࢙㴆紭理崗丧῾䘻䬙牓矇ᷮᦡ罂Ɠ約♆䰿Рè㡿䲃憛朦帷ႎ࣯佢ᵪؔ ᵦ泜た撤⼦刱㡵ྥ篳㌷䣉䑾䣛㿞⌊䗭௦⟌⼑吁㡵 ߰☙䚁ᝤ⹀±㡢罠ჄԷᠡ呼秥ᬢ瀶嘸䯡咂⺤庩㼲祅沫䲷湎੿慝ኢጕ☎ⱡᜠ⹄咹㧴籺ᳫ檷汏噁狡ন㬮᭽䯞塒ঊ慙㩄䜅翪㩡琲幽ⵚ䯃猘㺶₿єŸŢᘪ熅漌ᡷ䇈慽ಃ㉿ྉ娀ॸ坦⭛᷆ט䥥旐ᛀ垮ˣ䞤䷈䬑捎⯔к࢖ᢠ䍏㠎绁㨤⋎䙬挆▓箭㨺⮲㒹⻧䆒杊狸ᣋ䂄曏俐㻊M⬞ὗ⮭㣵⽲必㢊绘Ს⽷䵅嵿糂է揩坘⯑劰ܲ勽弎ⶮှ᭝ॠᄽೣ珺嬑⨘啅垩࿋傷Ŋ粺孜㬁䊹㺓盛剖㬝彗㸆⮜㵛兽㿝Ώዖ㩡傁ᯣ⫛碛⌜ⵍ殢㲘楞屣娐䖨અ៣ቡ嬑ℷ綝䲧㔰ᯝ䞯⿥尅ƚ碵渋咷戅ᆣ⨆㤢࠹戁䐝傑㐽̠ሥᱺᐻ恗涙媱營Δ枡⨶ႋ〺‴ᒣ㽆筧ᒡ朌⢏嗓Ộ刪笉痻緤㞼Ʊ屲զ罺◣亰䲎ⲣ㇜仩ᐬ䷦咥֤濉崴䨐䘡൴爐Ϗ ◚Ἤᢨ斌ᯎ栐澿Ỷ掚硫ᦠ➰儜掱வ甬ⴾⷥࢍ䟺䤭峫㢨⥊侣禣㞰䶣䖇Ӭ圍ᡊ寗筻姁幀׽䚋ᾖ׌瓹啲㞤க䀦淩ླྀᬞ渹ืԜ㟧䑛糇䊬緬噐睒䢲ᇬ毭㰷ѝᢂ⨦䝀㼰ᡔ点ᮽ⍝↙㤍ࠨ倡查佃瑋᧮珠ۨݧ㠡དྷ䔣⬥ጃ䡈倠2ࠡ唓吣㈯䩯礦ʈ㑨˳弝❀疗॥码籠㷾秤枒䌗槡摜瞯伧Ჶ㩎磅擛䝀滠ᗽ⯞㺓⼞布㰆砑㥻怗㨦䂹䃠ė爯嶢ⷘ❗梿࠾篡矵䃿ᶇ㤾縒y⑑̏䎾䟝侞⼛ౢ篗筫渻德㵾端ᶛ䆠搎愩࿜ᆻ弚屽剴睿渠㲿㩢缙穓绰刎埽୚ຕἎ緹㰙知ᄸ᳟㥾炈ඛ磔న篽浂澕䈉Ḛᙧ̘䈐㾬㵞粥箓䘗崏停⟜ប⨾ϼ篧睨ὤ᳀箞皣搛䘯䈿彐㡟愞ℝୀࠊ߻䇸䎀笈牣簧皗樏噢⢙得ț牝篤࿵濑䝏㺁狽涧缯䘡塞禇ㄐሉᷫΩ吅砊९ࠑ䔔澴ᄗ㈾㩡₟枛Ȇ䐔䞤နἄ㷷㶞瓽斧濼倏婜㡙㤟ڢ䠶ၦÇ⧝ᭊԑ紑䁬檧冸ṝ㲚涟⤷揨⟚曻䧢䀘粐⩈ੇ灯ᢾဿᄭ㞗ਘ產⠏༳丂㸘絚䷩ב猛ᵨ,挄Ԑ庥矇熞揙⎛ഝฌ㤵ᣇ挶檿䋧䪟䛃α惓⟄佬嵻廔縟䳳挕⭔心䯦⽳甓⨁䈈㩛檣ᾥ䐬紺Ⴄ翥᠃ᳳ⣤呞ച䦡㤊ᤉ焷掵ṍ㥔猘ᆜ␠涯ጔ㚙瞝娈斍⠙牖中Ќ硎ჱ澇囯甃砏倣ᴓ娌ᷠϛ侧Ḷ㼌⒙疓磻刧䛠佝呇磭ⲫ⡗柼柟῕\"稹粳籺ୢ㾾⃞㊂̟稝琝㬡†廳ᮿ宥纁昇樴摾氀ພŭ稅⧶厱倵⥥Ͽɥ䢉瑰ŏ≾浜▓繩唍⨉៾ࠄ心市緅硫拥ⓗᓀҠ⬢戭娓塒乾瞔祉Ɠᄅ痫枷橏み⇳禟㌙怳䰕㊎⾽攳ᇒ繣䕋綍ハ惩狟⻞ચ嘞痥ⱃ俐ࡕ㷪砵瘱瞤㣏摙儓募ޭ瓨氘ዳ⾉㊪㷂篛Ƌ畆嗏㵾ዜ䶙፮༥Ⱎ垷⾚ጘ篺紕碂⊷瞎㿨㻜὇ᇇ瘄淦埿々㐕玦竞䭂ᶍ㓯潿凜嬥䜝氠ᐍ埲⡞広㼸έ稳犄ڏ⓾姜厙羮ฒ䉓淋㝨ফ㵠ӵ籁浗仏ཾ◝ᶞᬟ⸝氓堀潦秣㻖耕画偗箏ಾ粼箝Ⓝ瘈楃㐖㏱ㄧ㿀䈬㟨᭷岄烾䏜ᮘ᧾Ḉ寧垩僅帯廗弭糛摷筯熈㻜㞜ൣ帆ᠡ埞〾弎ᝌή粛瀜ᱳ禿⋞劁笒㸝⿇煻漷徯㤘⎮Ᏼ穷烏潭⿟ᬺ⬛ᘓ導ཟ摿庥㼞维䠧縗泏㋨ミ抄䈗縈ឯ᪈ᾗ䥀纲␻ᕕྯ✐ᠰゟ㈐Ȝ䐏ᆇ煔Ἳ⢜ፕ␏㍂欗圏儉ҝ◅峝ㄹ場#␼禅嵶囃筧瀾㏯毿䭱ࡢ㈚㷓磃࿴穢م几毃矾梤⇖晟ᯞ⦘綔ᐇ䠄۠眲㸤籊䄬ෙ᭰✨య​攘噤吔⟠㠑㓊㼴絿Ʉ䷇歰㪿⑟ᦓ䲄漬㐃߻浌ᾆ㹠籲ٓ者Đᙀ䖛紋洜㨞㐊撿版〮䀙盫嚓瘇滯䰰佟梞嗱稞䐔ఉ࿴䰾㹈䀭♗ⰷ缯姚筟屋矝椙㈾៼灁ߢ䃇㹪ē炷篯羿泞纝怡湪樈᠟俋ὄ㻤级ℓ疇碝㶿孟畫洛䳤᣸埡⾦强瓪纉磋罷禆ღ棟纜嬙䄺吚ᴷ䯈∣㺜巕笍症畇惿梏Ͱ䜞䎟㤎㧤䬌«俢㈺䇄缑橫禇璎آ洢礮િ樆္བṧᴀ֔瀩桓侤◞஝掌帓唵洺濳烯佖纺䇻焌ྏ婸坯ޞ⯘ㄚ䦦矲Ꮓ杠从耄紤糗晎⫿䡯殞Ἐ㚜簖ፃ墝怆懌㶝粄簯愓枩撟㦃ȜП଒㈦Ώ彋㽛⏽簍Τਿ窀៟ㄟ弙檩簉縘娼㽨侞纍⍿য撗尸成℟绣Н䔐借犞䓰羖紙ͫů愿啟儈ⴜ刞垂᠐ണῦ㽥ᙼ惓綇礱Ἷ硟ߞ瀍Ἑᐓࠍ矶 徢翞罬㱿ҙ炊ⳟݰҝ䤧ఝ瓵㹜偙䀑〩粍繇祤ᒿ竟䶞瑞ሞḖ㠆I濎ῦ羕縻竃爏牿勈㧤㼟丘尘ᬪ瀄‎㿊羙絛Ϸ穽燿僟咸⼝␞綐ပ瀙瀋ࣺἷ㬵㶗砏澯᪟夰⪥О⎢မ⿭怍徊缙繟[痏泓䆯甞稞䘙䈃倃Ὺ㿢泵羓縧端煅⇟废紟䚂జを堖瀉㿨缮縿嵛箣箥ᗟ犟㬟൰尜㠔瀘⃡䟉㽚發授缏瀮៟梧缞☜␛䐝င䀌㾳Ы织罏籟琓棠ở㓬ఞ堟㐛┚濸㾡翻翩籷禯総甪☟␞攭怛㦋⼱䀟ϗ䠲拏籋碓竿秎㮧竝禷笯竨笽簟篟硻ႋ৯笊䇠ԟ禶箴≀܃窣稠ӿ窧碠߿禠ԯ砫筟穒㰟秛租櫀س≿᪇祂恟ᡰה⏏筹ʏ移箠ࠀ؏磟簜ⅰܰژ䮟ᡰԘ厰޿禧㧐Рٖ˰Գ秿福笀ܙ`Խ祲簐Ӡ؞䊐ࠝ算ᐝ⎻篗秦槝⊛砿䄨֓简ڨֳ箷篣砰ܽ竈ѓ磨ژ⌏Ljٸ⊸ܛ碣桸ח篈ً窓篰د箨Ր٠؞∸Ӹح⇘ٯ穋ነ»碏橦»窻₈јџ笈܏磘ޫ∩․я氘ָڟ椘܋祀ێ篳惤ٸӰ׸ܠޡ㪠Ԉէ穳磐ۨ古ۄޗ栴Ӹҹ㌐㩄Յ稨㠨߀Ĥܷ硐٧筘٨ޫ≴ܸҒ䍔ݧ憴޴ڵ㩀ɴմӴҨ״՘՟筐ْ㤔ӔџⅨ㯨ьᧃ㪺䊔݆合㡘㯆̔߄րڄԀބєگ箫⏬ԓ㩱ϐݷ㎌֍篠мӬ۬ڟ匼ٌՌԠӌ֍砬ٟ稈ܬܽ箼܌،ӡ煜иɬӬ䊽ሬʼն农ސɼڀԷ簔٘ࠓ礬ޤѵ禈㣜߭㯒Μ֛窜٢Ԝۂ刜֘ׄռԢֈۼҋ碌ࠏ砯偂֬ݭሂ܅䃂㩂׽匲׀ד碀ѣ窯㬤֨ڢ߼ޢۄ憲Բ⅒ۂ㬐ѩ⬲Тղޜ䃲ބѨڌڧₒࠂو䈪܅䊲㢲ߠ冪޲߫稨݌ݲ۴Ңڤ܄ْ㩪Բ⃊ֲ㧒צ榪ڒѝ秪ܢҤԄٷ笽禊Ԫڸ䌺Ք䉫悐䆐䄐䆆ñ䎣䀢恟ʽ͋Ŝ䍙䍱Ȍ䊁̀䅸䉫掟ᬭ㥒ʯማጪ.嫾㧖煛悗͇εˇɃ�KÔ Ş஖珷̝̯ƞ�Dᡝ磨ͰíĴƚŲ吟⍙Ɯރʢ㠰̲ɱ憀ǚضʱȀ䎀Ͱ̶ؑ̌䁸秠̨τ䋳΂≛掯ʬǟȇ㫶ݤࡲ͉ቛ懛㤏筊Ǽ抈Ǵ䈬牝竓憠䇺ՉϠ䁈˟ϟƶ䆱͋î؀䂙Ά⊩匫挢䉈䊏笷折ňöր˟剪≛慬㪘ȘȎچƶїĘɶܴƾеƋ㌖ڟ̶䌟Ȯڪ̮ߨ䊮݋箮׮Ӵ䊝Ɏۮގ䃓Ȟݎג̒䊮ԠႮӏ媃უႚ֚��Ȇߨ㠶ހȤȶҖ̖݉ʨ䉶ݶ۱䌖ưϲ͸䇡䌥ϸ䌖˴㪚ݨͰˁܱР䏖ձۛ㣤䄎ݨŶֺׁ±߱ݨ̴ʢ㬎ԁՀ̰ȴɶھޑٗȑб؞䂛˱ڱښ׃φ­Ƣህ炅¤竩шうΥ䂎S〈Ւɯ˛ᣯʏ䊫Ɓ愠  "}
      

    The complete round-trip took 45.9 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.

  • 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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. 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 of x to slice the file in the next request.

      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. 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":7}},"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-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7812-ZN9mJGsASHoC-.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-7812-ZN9mJGsASHoC-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. 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"
        ]
      }
    5. 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 in result).
      • 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 13.5 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.

     

    Magic Comments

    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
    	
    
    Loading

    [!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 the ansi field to true if you are interested in output formatted using ANSI escape codes. We strongly recommend you to make use of the id 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 the end-repl-execution message.

    The semantics of the error message are similar to that of the other messages.

    Example of the request-slice 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. request-repl-execution (request)
      Show Details
      {
        "type": "request-repl-execution",
        "id": "1",
        "expression": ":help"
      }
    3. response-repl-execution (response)
      Show Details

      The stream field (either stdout or stderr) 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'), 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'), 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"
      }
    4. end-repl-execution (response)
      Show Details
      {
        "type": "end-repl-execution",
        "id": "1"
      }

    The complete round-trip took 1.2 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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. 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 of x 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))"
      }
    3. 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":3}},"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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.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-7812-oSNyPdtW0z8g-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-7812-oSNyPdtW0z8g-.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":[]}],"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":[]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7812-oSNyPdtW0z8g-.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":[]}]]]},"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":1}]]],[7,[[5,{"types":64}],["built-in:library",{"types":1}]]],[11,[[9,{"types":64}],["built-in:library",{"types":1}]]],[16,[[14,{"types":64}]]],[17,[[16,{"types":64}],[12,{"types":72}],["built-in:<-",{"types":1}]]],[12,[[16,{"types":2}],[17,{"types":2}]]],[22,[[20,{"types":64}]]],[23,[[22,{"types":64}],[18,{"types":72}],["built-in:<-",{"types":1}]]],[18,[[22,{"types":2}],[23,{"types":2}]]],[26,[[12,{"types":1}]]],[29,[[26,{"types":73}],[27,{"types":65}],["built-in:$",{"types":1}]]],[31,[[29,{"types":65}],["built-in:mean",{"types":1}]]],[32,[[31,{"types":64}],[24,{"types":72}],["built-in:<-",{"types":1}]]],[24,[[31,{"types":2}],[32,{"types":2}]]],[36,[[34,{"types":73}],["built-in:print",{"types":1}]]],[34,[[24,{"types":1}]]],[38,[[12,{"types":1}]]],[52,[[38,{"types":64}],[50,{"types":64}],["built-in:%>%",{"types":1}]]],[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":1}],[38,{"types":65}]]],[55,[[52,{"types":65}],[54,{"types":65}],["built-in:+",{"types":1}]]],[54,[["built-in:geom_point",{"types":1}],[50,{"types":1}]]],[57,[[18,{"types":1}]]],[60,[[57,{"types":73}],[58,{"types":65}],["built-in:$",{"types":1}]]],[67,[[60,{"types":65}],[65,{"types":65}],["built-in:plot",{"types":1}]]],[62,[[18,{"types":1}]]],[65,[[62,{"types":73}],[63,{"types":65}],["built-in:$",{"types":1}]]],[69,[[18,{"types":1}]]],[72,[[69,{"types":73}],[70,{"types":65}],["built-in:$",{"types":1}]]],[79,[[72,{"types":65}],[77,{"types":65}],["built-in:points",{"types":1}],[67,{"types":1}]]],[74,[[18,{"types":1}]]],[77,[[74,{"types":73}],[75,{"types":65}],["built-in:$",{"types":1}]]],[82,[[18,{"types":1}]]],[85,[[82,{"types":73}],[83,{"types":65}],["built-in:$",{"types":1}]]],[87,[[85,{"types":65}],["built-in:mean",{"types":1}]]],[89,[[87,{"types":73}],["built-in:print",{"types":1}]]]]},"entryPoint":3,"exitPoints":[{"type":0,"nodeId":89}],".meta":{"timing":7}}}}
      
    4. 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"
              }
            ]
          }
        ]
      }
    5. 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 26.6 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 to visualize). 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 to plot). 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 of f 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 nodes file attribute is undefined, should we include it in the results? Defaults to true.
              • 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 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 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 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.
              • 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.
              • 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.
              • 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 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
          • . 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
    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
    	
    
    Loading

    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 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:

    1. hello (response)
      Show Details

      The first message is always a hello message.

      {
        "type": "hello",
        "clientName": "client-0",
        "versions": {
          "flowr": "2.2.12",
          "r": "4.4.3",
          "engine": "r-shell"
        }
      }
    2. request-file-analysis (request)
      Show Details
      {
        "type": "request-file-analysis",
        "id": "1",
        "filetoken": "x",
        "content": "x <- 1\nx + 1"
      }
    3. 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":2}},"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-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7812-Z1TlVJ96Dw3R-.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-7812-Z1TlVJ96Dw3R-.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":1}]]],[0,[[1,{"types":2}],[2,{"types":2}]]],[3,[[0,{"types":1}]]],[5,[[3,{"types":65}],[4,{"types":65}],["built-in:+",{"types":1}]]]]},"entryPoint":2,"exitPoints":[{"type":0,"nodeId":5}],".meta":{"timing":0}}}}
      
    4. request-lineage (request)
      Show Details
      {
        "type": "request-lineage",
        "id": "2",
        "filetoken": "x",
        "criterion": "2@x"
      }
    5. 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 6.5 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

📡 Ways of Connecting

If you are interested in clients that communicate with flowR, please check out the R adapter as well as the Visual Studio Code extension.

  1. 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"}
  2. 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)

💻 Using the REPL

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, :?)

Example: Retrieving the Dataflow Graph

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.12, R v4.4.3 (r-shell engine)
R> :dataflow* y <- 1 + x
Output
https://mermaid.live/view#base64:eyJjb2RlIjoiZmxvd2NoYXJ0IEJUXG4gICAgMXt7XCJgIzkxO1JOdW1iZXIjOTM7IDFcbiAgICAgICgxKVxuICAgICAgKjEuNipgXCJ9fVxuICAgIDIoW1wiYCM5MTtSU3ltYm9sIzkzOyB4XG4gICAgICAoMilcbiAgICAgICoxLjEwKmBcIl0pXG4gICAgM1tbXCJgIzkxO1JCaW5hcnlPcCM5MzsgIzQzO1xuICAgICAgKDMpXG4gICAgICAqMS42LTEwKlxuICAgICgxLCAyKWBcIl1dXG4gICAgYnVpbHQtaW46X1tcImBCdWlsdC1JbjpcbiM0MztgXCJdXG4gICAgc3R5bGUgYnVpbHQtaW46XyBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMFtcImAjOTE7UlN5bWJvbCM5MzsgeVxuICAgICAgKDApXG4gICAgICAqMS4xKmBcIl1cbiAgICA0W1tcImAjOTE7UkJpbmFyeU9wIzkzOyAjNjA7IzQ1O1xuICAgICAgKDQpXG4gICAgICAqMS4xLTEwKlxuICAgICgwLCAzKWBcIl1dXG4gICAgYnVpbHQtaW46Xy1bXCJgQnVpbHQtSW46XG4jNjA7IzQ1O2BcIl1cbiAgICBzdHlsZSBidWlsdC1pbjpfLSBzdHJva2U6Z3JheSxmaWxsOmxpZ2h0Z3JheSxzdHJva2Utd2lkdGg6MnB4LG9wYWNpdHk6Ljg7XG4gICAgMyAtLT58XCJyZWFkcywgYXJndW1lbnRcInwgMVxuICAgIDMgLS0+fFwicmVhZHMsIGFyZ3VtZW50XCJ8IDJcbiAgICAzIC0uLT58XCJyZWFkc1wifCBidWlsdC1pbjpfXG4gICAgbGlua1N0eWxlIDIgc3Ryb2tlOmdyYXk7XG4gICAgMCAtLT58XCJkZWZpbmVkLWJ5XCJ8IDNcbiAgICAwIC0tPnxcImRlZmluZWQtYnlcInwgNFxuICAgIDQgLS0+fFwiYXJndW1lbnRcInwgM1xuICAgIDQgLS0+fFwicmV0dXJucywgYXJndW1lbnRcInwgMFxuICAgIDQgLS4tPnxcInJlYWRzXCJ8IGJ1aWx0LWluOl8tXG4gICAgbGlua1N0eWxlIDcgc3Ryb2tlOmdyYXk7IiwibWVybWFpZCI6eyJhdXRvU3luYyI6dHJ1ZX19

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"| built-in:_
    linkStyle 2 stroke:gray;
    0 -->|"defined-by"| 3
    0 -->|"defined-by"| 4
    4 -->|"argument"| 3
    4 -->|"returns, argument"| 0
    4 -.->|"reads"| built-in:_-
    linkStyle 7 stroke:gray;
Loading
R Code of the Dataflow Graph

The analysis required 1.7 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.

Example: Interfacing with the File System

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.12, R v4.4.3 (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.

⚙️ Configuring FlowR

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 to true, 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 support semantics/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.

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
    }
  }
}
Configure Built-In Semantics

semantics/environment/overwriteBuiltins accepts two keys:

  • loadDefaults (boolean, initially true): If set to true, the default built-in definitions are loaded before applying the custom definitions. Setting this flag to false 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 a type which is one of the below. Furthermore, they may define a string array of names which specifies the identifiers to bind the definitions to. You may use assumePrimitive 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 $<- or names<-. 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
    • 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.
    • 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.

⚒️ Writing Code

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.

The Pipeline Executor

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...

  1. Provides structures to investigate the results of all intermediate steps
  2. Can be executed step-by-step
  3. Can repeat steps (e.g., to calculate multiple slices on the same input)

See the in-code documentation for more information.

Generate Statistics

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).

  1. Create a new file in src/statistics/features/supported
    Create the file example.ts, and add its export to the index.ts file in the same directory (if not done automatically).

  2. 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 resulting ExampleInfo 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, with Info referring to a FeatureInfo (like ExampleInfo in this example). Next to a name and a description, 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).
  3. Add it to the feature-mapping
    Now, in the feature.ts file in src/statistics/features, add your feature to the ALL_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).