Skip to content

Interface

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

This document was generated from 'src/documentation/print-interface-wiki.ts' on 2025-05-20, 08:37:09 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":5}},"normalize":{"ast":{"type":"RExpressionList","children":[{"type":"RBinaryOp","location":[1,3,1,4],"lhs":{"type":"RSymbol","location":[1,1,1,1],"content":"x","lexeme":"x","info":{"fullRange":[1,1,1,1],"additionalTokens":[],"id":0,"parent":2,"role":"binop-lhs","index":0,"nesting":0,"file":"/tmp/tmp-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7915-d0bAtJ8EiJCx-.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-7915-d0bAtJ8EiJCx-.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":4}}}}
      

    The complete round-trip took 17.1 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-7915-3qL6goc65uZ0-.R\"}}"
      }

    The complete round-trip took 1.5 ms (including time required to validate the messages, start, and stop the internal mock server).

     

    Including the Control Flow Graph

    While flowR does (for the time being) not use an explicit control flow graph but instead relies on control-dependency edges within the dataflow graph, the respective structure can still be exposed using the server (note that, as this feature is not needed within flowR, it is tested significantly less - so please create a new issue for any bug you may encounter). For this, the analysis request may add cfg: true to its list of options.

    Requesting a Control Flow Graph

    Note: even though we pretty-print these messages, they are sent as a single line, ending with a newline.

    The following lists all messages that were sent and received in case you want to reproduce the scenario:

    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}]]]],"_mayHaveBasicBlocks":false}},"results":{"parse":{"parsed":"[1,1,1,42,38,0,\"expr\",false,\"if(unknown > 0) { x <- 2 } else { x <- 5 }\"],[1,1,1,2,1,38,\"IF\",true,\"if\"],[1,3,1,3,2,38,\"'('\",true,\"(\"],[1,4,1,14,9,38,\"expr\",false,\"unknown > 0\"],[1,4,1,10,3,5,\"SYMBOL\",true,\"unknown\"],[1,4,1,10,5,9,\"expr\",false,\"unknown\"],[1,12,1,12,4,9,\"GT\",true,\">\"],[1,14,1,14,6,7,\"NUM_CONST\",true,\"0\"],[1,14,1,14,7,9,\"expr\",false,\"0\"],[1,15,1,15,8,38,\"')'\",true,\")\"],[1,17,1,26,22,38,\"expr\",false,\"{ x <- 2 }\"],[1,17,1,17,12,22,\"'{'\",true,\"{\"],[1,19,1,24,19,22,\"expr\",false,\"x <- 2\"],[1,19,1,19,13,15,\"SYMBOL\",true,\"x\"],[1,19,1,19,15,19,\"expr\",false,\"x\"],[1,21,1,22,14,19,\"LEFT_ASSIGN\",true,\"<-\"],[1,24,1,24,16,17,\"NUM_CONST\",true,\"2\"],[1,24,1,24,17,19,\"expr\",false,\"2\"],[1,26,1,26,18,22,\"'}'\",true,\"}\"],[1,28,1,31,23,38,\"ELSE\",true,\"else\"],[1,33,1,42,35,38,\"expr\",false,\"{ x <- 5 }\"],[1,33,1,33,25,35,\"'{'\",true,\"{\"],[1,35,1,40,32,35,\"expr\",false,\"x <- 5\"],[1,35,1,35,26,28,\"SYMBOL\",true,\"x\"],[1,35,1,35,28,32,\"expr\",false,\"x\"],[1,37,1,38,27,32,\"LEFT_ASSIGN\",true,\"<-\"],[1,40,1,40,29,30,\"NUM_CONST\",true,\"5\"],[1,40,1,40,30,32,\"expr\",false,\"5\"],[1,42,1,42,31,35,\"'}'\",true,\"}\"],[2,1,2,36,84,0,\"expr\",false,\"for(i in 1:x) { print(x); print(i) }\"],[2,1,2,3,41,84,\"FOR\",true,\"for\"],[2,4,2,13,53,84,\"forcond\",false,\"(i in 1:x)\"],[2,4,2,4,42,53,\"'('\",true,\"(\"],[2,5,2,5,43,53,\"SYMBOL\",true,\"i\"],[2,7,2,8,44,53,\"IN\",true,\"in\"],[2,10,2,12,51,53,\"expr\",false,\"1:x\"],[2,10,2,10,45,46,\"NUM_CONST\",true,\"1\"],[2,10,2,10,46,51,\"expr\",false,\"1\"],[2,11,2,11,47,51,\"':'\",true,\":\"],[2,12,2,12,48,50,\"SYMBOL\",true,\"x\"],[2,12,2,12,50,51,\"expr\",false,\"x\"],[2,13,2,13,49,53,\"')'\",true,\")\"],[2,15,2,36,81,84,\"expr\",false,\"{ print(x); print(i) }\"],[2,15,2,15,54,81,\"'{'\",true,\"{\"],[2,17,2,24,64,81,\"expr\",false,\"print(x)\"],[2,17,2,21,55,57,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,17,2,21,57,64,\"expr\",false,\"print\"],[2,22,2,22,56,64,\"'('\",true,\"(\"],[2,23,2,23,58,60,\"SYMBOL\",true,\"x\"],[2,23,2,23,60,64,\"expr\",false,\"x\"],[2,24,2,24,59,64,\"')'\",true,\")\"],[2,25,2,25,65,81,\"';'\",true,\";\"],[2,27,2,34,77,81,\"expr\",false,\"print(i)\"],[2,27,2,31,68,70,\"SYMBOL_FUNCTION_CALL\",true,\"print\"],[2,27,2,31,70,77,\"expr\",false,\"print\"],[2,32,2,32,69,77,\"'('\",true,\"(\"],[2,33,2,33,71,73,\"SYMBOL\",true,\"i\"],[2,33,2,33,73,77,\"expr\",false,\"i\"],[2,34,2,34,72,77,\"')'\",true,\")\"],[2,36,2,36,78,81,\"'}'\",true,\"}\"]",".meta":{"timing":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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}}],"info":{"additionalTokens":[],"id":8,"parent":15,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}}],"info":{"additionalTokens":[],"id":14,"parent":15,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}},"operator":":","lexeme":":","info":{"fullRange":[2,10,2,12],"additionalTokens":[],"id":19,"parent":31,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}},"info":{"fullRange":[2,23,2,23],"additionalTokens":[],"id":24,"parent":25,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,17,2,24],"additionalTokens":[],"id":25,"parent":30,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}},"info":{"fullRange":[2,33,2,33],"additionalTokens":[],"id":28,"parent":29,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,27,2,34],"additionalTokens":[],"id":29,"parent":30,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.R"}}],"info":{"additionalTokens":[],"id":30,"parent":31,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.R","index":2,"role":"for-body"}},"lexeme":"for","info":{"fullRange":[2,1,2,36],"additionalTokens":[],"id":31,"parent":32,"nesting":1,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.R","index":1,"role":"expr-list-child"},"location":[2,1,2,3]}],"info":{"additionalTokens":[],"id":32,"nesting":0,"file":"/tmp/tmp-7915-j0m8vmEBMXBa-.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-7915-j0m8vmEBMXBa-.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.5 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尓ࠍ侓⪐䭃ឈǏ穝㵨'梅Рɴ↨b兂چᙹ剉䥅₲儫ᢠ䃺㚰  ","results":"ᯡࠣ䄬Ԁ朥ᢠ⹲⭘ʄ䠭偃TȨۯ䂖㸠ᨐςภẁ⏟�ࠡ寫␦0Đ˳笃倫埧䡶⣞�⼠攠䴠夠℠礠᥶N⠡⺑㰺❯侴兮凓⬮溆瑌䅩䩰‥侠়䯫倥ࠡ䐠⨠素⃒奠ीܰǪ౭⹀ᅫ೉ҿࠀօ烄ŵ橱�㚪㥢Ẻ㘇࢙⸐禍粂川থ䈮持燳᭝Ĥ䄂湉᪾毴琼搨Lj扙ㆠ峕ᜰᝦ勳桖ᛷ㌋淢⥌燿崄ᰆᵊϜ䐷ဠ㤲瘐篤幞ᑮড়㼽ٰ嗊嫝⿲᤺懏懔䴜⧏ă琦ᜳ⥇瑠=+㎠రሴP¶ᱩဣ堡晨㾠ؓ吐ဥဧ奠㣎ҰƘშࠢƠ౤䠠怢㳠幨\"⢥㵘أ²Ⲫ㝢☫ᢠᣠÑፘ琴ܠ劰汑Ṍ䫅䵅ᴥ௔う᧡㉕ࡉ᳎ᨨ漡╁Ř⵬ో੅ⰴ峅ઑ1䖹揻༇⥴㙀㊋௱坊٣⡸䈑盦ว䖀౬㊶惓䋖ᣩ抐动᪻晆牏∮䏀Ⓑ⊵恤Ⲡ᫰气፾䥓ѣ⤀㐽᷅ᥰ⒒⬮⥌堸∕絬敝ҁუ䕞ⵇ⨋卍䗶┠㴡䎫Ư吐䙠ř㡢塨⣤氠ൠʳC代 燡䉌⩲9ԋ疥τ畻ᯁ桨៉悓ẉ䶐ↁ▫⦎ⵋ㖅▋㹭ʹ⎌浻㮅沛㇏洧ĢᰭՁ䴢ࠩᶀ嘣ᵹ㴅`猁╷ƈ䇨月ᕉൄᴗȅ䇯ᨂ㸇㘋㸏␊緿ឍ綟䀈ʹ�㑲ㆮഀᐩ啳ᤇ摉㪴䇨䪊㶀䌦剔嚸䂎ᦢYᐭ淰ౣ2ᔴ䇌倲ć⚼瓹ᘢᇓ̫䵅㾶扰彆ⱋᖃⵀ粬※ᎂ洃ℽ汉⾍䅨礁⎔椬擗Ἳ屠㼏⍓ࢲፏง㰿㐆籟㲷簠嬱截崹ᖱ̆听キ喕☤ͭ₉䱍ᗅ�᷄擠沊琳⏡場ల̙઴ౣ㢉ස㠷ත㫦ᦳ຺獓Ǝᬀ擈㩠ᆂⷢ娵୐囲㤨㱿䊲朡汲婱䬰እ䰖煫⋇̻ḇ⌄䊺䂻䮘伊ڪ分ዪ䒹⯄䵷ኟ㵸̹ⴰ孠ӱφ杧Ҁ燵䄰桱㭠Ѿ䏂乗祚ϸ䮵㉼⌛㌈ᴜ៱䲞䭿窸炢抷᧾拷᜴撘眏控ᑜኁ墾⭄啳ᎊ牘勱勸ᯬ墉叔唻占㺳䔬卌㋠⦺埵喰墹ᶰ犼䮱䷼婕狀ྐྵ㉠ዠઢ嘢瞩樹੐涍寉渰䨨珴⍲䤴暰࿺䇒僗䩁壔ቪ擑㴁咽⮄栀嘺归ߨ䝙䳺朡櫚仇啱羌䉩罈຾䯰柲碘䂒烟䭁䊒Ū哒侅扑临嚗侞䭄ᔺ䃙⁜湏䔩⋶⑻外䟰㏁øπǽ䋑䃅᷋ᅾᒴ厠汆䱔᫜匮紑囶Ⳋ灩έ஍灶☱ᣒ必砥竟ί毟ኧ头曍Ꮔ庥䦬͐䵓ቿᰦ弢匞糤纟梠⳵㨗᎒᳕॒#㦐⦣㨩!♨㒈ቩᎢ䤑ᾊ䀦匸ᐤ儬攠Ǩ㋘ؘ䲪ᵨⴊݐ爂ใ㉱♔氢�ு㨿兠㥻ࠢࠏ╀怸䃬ဦ೦௉ᵲ䤰ྤҚڀ潇椪戶࠯㹪ᦩⲽ簸噦㡜䑲⊭ᒞఢऩ烜ጱɟ喙ѥ᥂ި䨨ᣙะԲ䡖ዃᰫ̰ᵦ㡆䞈垫ĝ೬ᤶ焾ᎂJ扂ੲ䨨⋸瀐ധठ✼䆲ᬂ䙝扬㙇抆ႀ侭版⇒根䳙Ⴒ䋼̀ⱆ಑䙀㥨墸䱩愺ᅨᅂ剜ዒⅤ≞⛈刦ᓠ䲴ẹ⧁ᵃ㕛ᐊ㇇␨Ƥ౥梅Éℷʼnᚳ浓ጊ㚇晥⒠ŭ礋ᐹⰩ夫ᯂ啐㣦≄䱱摄瑮䳐䚉斺槮ᆲ㕂猰༇㱾斻㍂棩➙ႱƇ᧲ᭊ㊘‡縎₋㘣ۄ墯⒮伹Ծؚ泉箿䕠òᬬ⁶ౢ䁊❲瓫泥ᚭ╄±䀇⪙斔䦯ʻ䨁྄妰态僕㉼★⦂ğઆℲ⍥婇¸嶫㣟ૈ傴㉑ᔜ篑ᳱ䨥ল盔刡࿺ℌラᦃ䛢嫫㋚䱵ဥ旈屈ᣑ攥⼴䡡䊪榧ଛ盵㴰؋ᅓ࿾⨠ઢஙਵ啻⛒敋哇⹥湻攦喫ᰧ஭₷穸吼暆笒ⰥѲㅮ彋޹橵㦷啧哪䊨⚿⯵㹯畦屋⛔ᯭ㱗宴哺曈䲤澵'呭⹊啐弋体橆㫖㍯᠊罌᫠樵፶㖐Ƌእ嫃㛴ᒕ㟪䀤ჶ每囇侥垱᷍堊᷀᪣⽖箟㖀㴊໒桱৿ᔠ࿩ᶕ勫෍ᩬ℔ល㐪垎ڱ⡍㻴⸇嗚䷁∯ㇷ㵣ᓚ刉⚳榭䐠疱寊淛᪷㝔筽矎䒌䜋⣅号綑妃區ƙ࢐箳⇖枛ᝁ䛒朔⤣毺帀㑺墄㍫㨔䱶ྮ䨺⫄䴝㑓ᷣ劂揊䚕┵Ďൾ䬋ǤɅ⋴捅匧㿏䠅‡祰混椖璸梸开ᤃ滲෼㘻彞緄樖愈俪患ਉ殥٘䁺㍇沓存慬礒伥㼾䛷䫳ᅕ⌿咻抗❄焣ԓม挋䦻濭䕘⸆㖡⺒朔恎㓽佊涋凇ᭃ絖珌㈇䚞➏⟯潿了₦㈈᫓癶䭀删4䮷媘穐滇猖ෑ彌禢ᩫࡗ䬥㉦ʕ獪繶猁燵綿קᣵ⣒殕㋧㻒簂毭坱㔕恾㧱庋ݶ殁㕚䖏➒檍䫼⽎䉾秓᥅כ欹㽗ங坉᪌棣䴉坽䇼忻◐ᭋ㑗҅ᜒ紏欆ⲵ秿䫬曃斋᯿屶ፕ眚本⬀浵竸䫬戛淜玹佊ڬ㗺搏僾䵣䗽䦠㬃₟㸨焗焎čṷ怠ɚଇ渉幜⏃᫛䂔卄屮ᤙ枩朽恎ᵤⰲᩗ审墑፱㞯ഐ桩耍䧪ᱳ灙n㪇㇑栔痮䚮丹殣ᔭდ捈䖳帝亓᝛䢇㴔ݬ恿澪屚᫛⨅㼷喓⑲疩ᒸ㲁氕懭ῳ姝㦕㧭籟柞㥯㜜潥瘭燽崪㳊券ِム⟶甶缀ẙ燼䴂⻃擅ߠ织ᄟ瞡罊⯧⧕࡟娌ೇ䥃➧㯣䤖寺祈娇ḭ瘇௶儅䛄瀡≼䮘埉尚嘆忣潞圐滽厘⨯㲏欕瀒峸㢫綋暍ⷦ㼞䄚ྶ糋果䭄兞㽗䳡橏柾ሚ㳏ኆ㯏仐濏ᇞ吙໕旾׾翧氻瀕碠䏅忧㏟泃䥮差⼆嵧憚悛缏帙㽙㺏᩾U˼䟾幟喙မ倿缛琇√柰⻀టㄒ䯽䫐஠㠤燠ἐ 懸㫦绠྅⊛偂ǯ灏መ痭Ș䄟⸦䡇渨㈁݀ధỷ玻㎺桄庯牧␤忸䆲䚀䖚俷竼৫ఢ燪8ྛ⤚⋳湢ྠ欦䧰䈍瓇⒧䡎劢ะ乸‬ᣣ瓠孛䑗窊ฆ㒤㗩湰ো⺦ᑂ㉆ಧါ墽Ỻ඙─㞳Ù皿ᆥ୮慶฀润ⱗ哴ొς精⻔㛿ล橹㱌䐐濻䫢ẍ燛ै䉌ᅫ疣ⱥ㒾⫧旴㹳籈皬ફ੦ி⼚ನ痻⫨嫹୨䈥橸兛䇧཈⤤䢌ې勚幱⡴䛈浦᱀縼ຠ仙⩆准ࡱ⍧ᩇᙰ䃄ہ橖纕ᐸ烦婝䅤ई擃䙇兆Ꮈ糈ᴮ⸬ే㎻ᙀ䆦ྈ䵸㙝戌僸勤太䣘Ӏࣥɂ㋫क़曧珮↢瓘槥癎北৫㋧簬煿ぱ⯧⹊ᆥෛ៦Ṃ照஘樦疽ᅸ೨柘ಲ㇒ຨ惛練৅ࢹ㱄狯ࣵ䞘庺兙企๻ె繄䪸侸戠फ़⨻慄⹙ぬॺ࿈筊䥜䤨ڤ囧♆囔䣄扄ᑥ䤨޵␢Ծ䧋ฯⰻ㥍᣿ࡈ璙〰⨔䮄䦫䕇ᜂ䢘彅䟵狒临祚㡌⤢䍬Ϧ║j䲧މㄣ⡐͡㩇᳠欚䱔狄柦囆䡔凄Ł⋶佔乘మ㣦䤇㏅䚻९璄淤痽榤䰴ே敭⡸䠑⯆惸ᧁ䢄䷦慞簱䭢ⅅ捂塙ㇶ⚳㏬᧟公吡半ᥟഴ暂㍛᥺䡌烧敠⤚䫴㐠‿缊擄墧⥎劅仴▇⭋⑙䤴氚㌱夵䢖ஆो姭䭬ቧ㱌奟瓢⮇敆戌儼曑䝂槮ෛ㔅匶㦖䥑⌅怶㧅䦠ᙃᙛṼݬ毩䭇㥮䊬ᮄ商ㅸќ処睄祺䳜啃⽕ⅻ乌缅❉稘勬䓦㵍䇘䯬罁彏࠿䰌耆卄姣䫼津㍊纠న䟦坜׮䒢崇㙈媅䢢䥂亾ᅚྡྷ冣僇ᙰ҂Τ❞夳២䬁჉䥎ࡂ慆䣊戒僄━垶奠ජ徨ᣜ䕞䲴㴴失䕥䮂崴匤祤ⴸ䓩ٍ㓇䳔冊䓆禸⶙ᒴل㒵ڔ㴧⃛Ō⩐⣂ᓎ䅜ଜ䲧㵆᧓ࡲ劷㓆☌坲暵叾⫨䞴⋂崩䕐⯳ᖴᔳ㔂⾼䥊᳆數䥒嵫峓㔒儀䀙籈☇ࡱ㾷ᵕ奚⡐璅煐⻁⮨槩瓶ᕣ䫑㥁᳍⹡⦂䩶ᔷᇑ㌔呶罓ᕅ଒䓨ૂ冀⫤̐फࢌ�ẁ法▚㍌䕴‪啕⢴幦寽姊䴌圅᫅唲兼戢᫑㲝⯬㾛ۚ嘝⽪庺竂㗕⢪繥但噓ⶊ慇ᛂ⪔⺊䭃䤤⇌珌炴ᑭ塸䋺䮃壟╸њ燷恈唧⳺盵烛䖳珊䑆罡䖯⾺䝶ᛅ愯⡿㔷㻕㻩䨚叵噊ᚏ⾊厧ზ皏⻚䦪⟾⪌䕼㤄哙痏ឦ䶇廜ഴⷛ⩗䋚ඨۦ䯦പ䠦Ȁ哷噐䷤浚瑷澩乤湒籵䧚䠴浌䕁㡨ผ䧰䭖⧗秵䖆渆㧟庄䆜嵨߫䴽䵩⃔ۄⴷ燢吶㑏㗡⥑ᨴῧᗿ䯲啕㡁ט⠺勖⯪䖌桴筈㔯⸈殈晔䥨涄⠺䗖棛慣༌僔䓉威⬦槔㣜畮汄巗…⨈ƈ楕⋬Þ洶坷䀨ᴣⰮ浧敠vॡⱲᮡ嬦ᤏ⺐㯯ᦸ┋䮶右卉㓏䞛ᬵᶵ绕⭾⫥嘠綕掉㩭渁ᘁ⹗੔ᩁ晋槕㯸䭽ᔉ喳㯰˽Ǐ㝫㫙የ䅡䀦僓ᘠ᷈⯝䮼映㼍ᫀ穩ౝ圊ᚤ簛嵝娏ބ稧呝⨪墣ĕ⿍䧫咶竻⌅ࢉዞ穓宭ᐉ斬灯Ġ梕条嬊⦝๠穫嫆ᜍケ㙃笩ᄝ氉䪖㳳୍笋འ㮟囘䐋ᮀ峠ణ౏印ߋၸ撨䁁ѹ԰ई㭢䒽ࢣ搻ݩ婿嚕䳧℄煐㋱ⵯ惲ٰ㎮㐳䝼娻卮਻侍洭᪝格篍ࠅ☸句⃩䓸㔝ᖍ榑㩣嗣倏ㄜ啩۠㾍徎穆≃∾㽯狥啃䉯䤜吠Nj䁂㐛㘬⩔⚌໨摛ᩘⓝ࿪岳倠ぎₐ焠䙜ჳຠ瘚‡ㆳา⻧♝ຶ戮⳦凲燔㓨浻㾾熣˘悋㹚爁ම橢㱙ૼ旨慧⨱ᒖ↸笛᩠䓏ฐ畛粣ত✃㹇ㅙݰ⟈昋॓懋⟄榦祓䭙拖໛㭽⇈妴湐稶প擠ᓁᯭ帪⍈�瀢ࡱཀ㪂箦撃焦埑粤䲺壴祱ఌ⦴㜯㛆⢽㻣㋓㝇 Y䴓䖑భ偖ƤΙ耉婰㆟ᶇ᭔᣶搇儅┢䡅ዽ创䭝囹亐஥狎倻俬籧䑰儧䵌眆⭟昦Ќ殇壡尿䤜焆熬㧬憤ᔇ杒╗䵼歲僑秅䙜泧嘎秾㠈㖇彑姿䴌箨Ñ䗀⽊ж㍎ֽ䑂悊䣜妼㢲憇㠲▨嗂瀷孕᪌⸂Ặ䝚嬳䶼曌〣◼㖒礶㦁䅞ⴏ☆♀ᘈ⻂氆ⳕ䗡䩪缶泚ׂⴶ呶ὐ᫅ⷼ篣㨩☇倍ⓤ᫘ᗺⱪ眶೟ెⷠٶᒠ◐Ⲓ棕㫝׼㓺渷帼偭⵰瀧や痝⾪推曗嚓ᦺ拶૛㮗⻺抇泄ට⵸䨑仐Ț坙剖Ỗ৚⸺笸⛗痙⸲櫷㞇฀潪堔姞ฉ䥦狇⻓儘渷⚤ې㧃⺅྆䧜ה湺户̍新汖⾷䉘ⷱ瓦橌Ҫ⷟婆狗士㸼Ⱞ滖庎旦濿ߗ姚⍸᥮罖㱁࠮氤⯗よ巾澵志ᣕᩁ潒盗㋖ḙⲆ撴毝ᶦ寒䔗珞L査䪶界悗㬇䃠ᑊ䨴䌳␶拧様,挒䦴搦䵔殘ྲྀ槵抔愙耋汐定኱ᶬႇ⑎ᵲ嵥总朾㎠⤬ހRۍ矟㝍➁掛半彎⳽ࡷ嫔┋ᑠ᢯潴緈Þ渖狑緈Д眵͔䏬␞秆䂞槰ᾔ戯ᠵϭ狡斱炘ᑤ἞杴䢖䐘ႁ揩碾⏪ἃギᒙ擊睠᫂㧲疵漞䖙⪒⤖坱皮媮緾乑気䲓綻柑瀮㯬ή䶔簯级ƞ᳡港㸉樴Ẋɯ梙䏂殉暯ղ涩䬙浯ᗵㅣㄯ೦憚৒渵ᐗ忙泑ṹ旆㚝搛ṍᇮ㤼珁ộ瑯䢙珉ᾙ眍ᆘⓂ嶒⇰آ೘ɑ㜖ፉப崑㽣䖢㏘崬拮ʠτ嶑滯庉ά帩确溚搝㈅瞱劕䏒巵磏掙展珪䆠〨㚑স溎ங尾㩕榮缎㏖ᷕ掯嚙毐ᾕ澯㶒玤Ῑ梎ᖩᎱ尵礛玓䢩▿㜏஑㼻璉示砍缕㯍瓯ᮟ஻攸ᾴؤ牐䁲ᅪ䦾੊栂ੀ咥䳡愐嫜櫡ⲕ㄀倖㮕㏶倍枮ຐᩇḕ筎枞Ꭻ嶙景䠁篍⒟㥂ᑆ䅾▊慻࠮ⅈų涏㆖㏿嵟̵ē�㺣橑愜㸣ţ昿䚭瑕נᄾ婬䞰Ʌ玮ₕ毾Ὃܾ➒ᐜ㳁猎䒭㯡㯳熾囹⠅ᵸ䲰䪖㈝㹱懏䴓箶巓怾䄒߶ἓ爿儛ℤ挫愿の។ㅫ澎㌐㯙㿅稯㤚㯡尳甮䔓⭃㿽恎੊ྫ瓒ঠ斖ㆨ惧籏ᾚ㞶ᶩ耏亥㠎㺶ȿ紟㟸㵛瑾⼑灗㻃描Ἑ䟔徃礎妟矑᳋硞䗏࿂尭㇟㈟潁煛⒛䯖簁㟗篒冗筏录恟漞䟒绅柏㼘垡廷碎欜⠛炗⭫䙚嫾罏産䡪幭ᅗ竏㴱帰䓏ட㈔俆峓糾⤘槽庯目引䟩ⅷ翎㦑珢䀅纟ኯ眭羑ㄟਕ唗耏氟碓愸ヰΏ捯଴䀪䀩弨唧畟䁞㔘㨅枭廄掇恏Ϝ焑௬⽂緯瞋婾氛䰁ᾠ乳穟溗ႜ】喼èΑ址㗞漪桂�温樐ⴈ␢✑Ῥ潸Ϲ烯儡䋃ျ侰弐砷撯㆜᠓⏹᝹㶏狠἞㲘Ї⿉ť勰ᒟᥜ䰮偊戽⇵Ń嚾唧簎⭔ƌх承ย⦔᷾⽩ʋ痫娞⯚怅䁆䆤䭸ᔉ⺀晑牿ᎈ岔९嗎愦䰋䂘繧㩯浿ዝ刭俹�㶝័₊䜤狪届⡍䅜潠底泀䑑⡑₹疀㗡淛尰へ䄵秿搀䐝䬐є㝂樂ન㖊ỡਲ਼䜧ѣ憊ೀ㠱繑濤戸Ǫๆ䫁杣粅�㹻㦀ᦟ⢢㠔摂ℌ䋄ি峡㨚㦀梅⇵׃⏫࣢䴫磽Ⲅ䕳ȡᄺᢥ濁ᤷᓮ䡰䒰䛼⤨瑄€㳜๐⿁匥 ⁥䅕ヌὐ慅✫ⱋ䥿硾皭寞᫛⸾増溻٫激䟝Ḫᡇ漢Μ຿䳡⎥ؿả戁桜᳃⪠ ⤿歰戠䩓Ɂ₶ɖྈ☁㒥常゗庵簌᠀䃢缬ђ惬懁༤㰞岉焼傔搬ΪĨ栢窅቙䃐䱼ࡤ⒞⺥瀽灷慙࠘ᡐ療㖂剁⃓瓩༫䧲∉栻㡣ĭँ⼓㠜炪㱎䣷䋏煤㱡䳠䰱䒏懊篒ᑺ⃁粪牜὚䉥ो寢ム垠ᑱ㚺㫜䯈畃丫㑕位䉜঴⟁㥧儳碁慪䠄ᮖ㇃檩曨棝⎩ਁᆞ籦㰁䢰冑ԯจ揢䐓桉उ≒࿠㍎ᙦ㄰瑰↲䆚ገ䴍搀ك棴䢧䟴㏖㮤ᑨ復儣禺᚟≃堮≜ᣆ⍃ဈㅱ笚滭䱢ㆇ夗悀㛂⨨田ᤕɸ哰⧑嚧ሹᒈㄬ䜌ᨐ概ܮ၆ᢼ⍅璌㫑䟐♪汪ㆥ֪Ӹ摂厭ਭ夑⎣ஐパョ㨱౿帪䟺ᅸ崘┮乔㤉喗ྼ║岐朱⒓䱇䛢፨広䐒䩛墯䋱ຄⳑⷦ搻㬥焤䒊ẃ₃ٕ掽ᣎ紝௉᜼ῦ⼺㑧㈆䐶᧰代瞪摑礞挣琼⛌䁄⠱粂১䗞ᐈ硅羨䲰ҥ拏ഢ㽑穦₺䒔ঝ䚎ၘ眃̆慟㤓拰䪯䆠另ᘱᆢ䔑礁ሤ籂恨ᅌ㽈᎚ঢ㒩㡇䢿㹓ॴ╥䡄潂㪪〮ᾑᎯ玂㼩實ࢻᑢ廿԰៤䰂ⓃزⓍ⓴仧పᠢᴫ粏凑і⃈⺳䁭晏һ招ல㫱Յ⌾ⱪ䥭夹ᇈሳ⺭㹧ⓧታँஶ洑璱䉡䧥⨗₣᮲抭慚┓ቷ௜⢩湄䢷㑹খ⟿Ȅ䁲乬♗㺟ዜ䥬㕱ᨈ㰀灨冹╩ᅈ笳㉬煂ᒻ⊘亪㥩掤唽䩿㼞䩵ᛟ㞥䖠傸塝⇜䫄咮竅
檚Y䞈ᶘ䢂慬奝㣢Β஄ㇱ᢫昱檂⥕䑬䛴磲⦭嗴䢨左瞺㝉◦刷檁⨒⟪ᩴ䲣敬ᗱ㓾㗫叺♲燚ᬃ䑙イ䍖ំ⵼❫ᵈᢸΚ䢢㶉⭆㚴劖樟܍ᑜᕴ沥ᵚ幩属仚⠉勘㺸䄤ą䏁ዴ浝㖖͔೻厔๼∉瞥ઽ㉳煑┍ቪ⑓篡͈承只犦⬹䂄熿ᐵ∫┣ᡬ卤ヮ㱃䒤㉖䷔☉㲦挶ᓘ滋䈔ⶬ祵⓬䮻慡⇀É䍑䱆穀⑌Ą暖ᛔ啒佩午㓌≦䮤徹熻Ჴ僔妵焯ہ㍳狱ㅥᠢ⃣̊㞴婧犱㊃椣♉Ṍ簲䔴⭃ⳁᎀ捶⥹姅㔠ާ稷➯ⶌ珁㛯㙄ᔛ取௶ⓑ෥㚷♰熀[ᖝ߅旳筜伮㉀㓼᥹⪺㷪๶᱆➕ᚄ毓ᚮᙏゲ厉为㺹䳣朎ᄤ榃䜔┼綃卆穁氺懙䰜㟩԰ள瘽⛌★ፄ滒⋯歆攇捱䰷᳙⌆ू溆ࢋ玘₈㑝噲ᱦ啓ෛ䡔ࣩ梙㑨᙮姢敺ὼ牒敫㵄䩡玛䤾⣆妄䣎岰祚♏ᔿ㮜㬓䟴ᅚח乺⼉㢅嶷⹧妣⛒ᅌ媓剅潓⽐綷䪂㬙渇埯攥ᄁ朶毞㐓᫭ᘧ哃爳䭼㔙·侴㙥昿斻១ࠫ≪墠䉙懩ࢂ㡶䐡⁹纘⣿曍Ἤ攓翨㝅೹猥恡㐥垰灱Ɣ撰Ȱ䱼纲䬨⢨䊡㈯䶦┥搅側乴⥉摿ᐌ䈭ᑍ懥䋮狌ⅬʚᠶԺ⹩䑼ᙦд喒⭨婝ჟ琈ⴖㆥ‷䷇᱀䕷⢞၂䪃ᨫ睔㳛㋂晱⎙⨴⦰⩩礲ᖿᴸ缳አ棟岡喬ⴾ✼ヘ犆㱧Ჶᖯ፼䔓৭癒⋣㌬⫠ᜎⷋ絋ㅲ挜协١᪫ゅ䄩㱸ე૶㤥儵ାᅳ䘚᛹ᓼ畔㹎Ӑ䥠䮜⠠⑰ᱡ∣%㊡䐘尚ਁ楌操喀友䴪㔥䜴ἰ慫䗑⛬⚲䙫煐⣺匜䪮䨾ᆼ梦硶ⅴ劅㭔垂煫㑍ᓘ䔇ଠⶑ㍐䣚㩾ວ▷婥樨攀氥⨳墂㈬ҹ▰榴䤫᥶䕢撴夲奫絈ᣒ劦㈣હ⚅沄ᙴ妌昘旔渔珀ᠣ漱⢔Ƭи຅㎵亶䱚wᐮஒ眠嵏䝌⋦⌔⠡㮅墶┩ண旵煜匒䷪睍ೈ㱀⩎⺙スぷ广䚆ቄᔙᛲ盄斔⋃犿狞⨌㎅梶᮵䆝碱㯂優䨁俨烚㈶⃉炠➥ͦ㌲ㄥᘟ碂卢瀓彊䓗犸䰑Ⲵẵ⩷強㹽ᖴ嘇ᏢᄒΥ㽐椖⢥ⴊ♙債掹䕤╌唂囪幋䪭嶼⫌獑曙⁵䦘涽㺶ႏ஄嬒႓嫍櫙泂䭞ⶵ㬵㺶煹䅲啄债嘠໊㘪櫎欀◜ᔀӨ∂畹ҋ喱㤺壘戒䳊拋䔂只⠹➅㥥嵰〱嗘榚噷㏊噂敳報⮉Ⱡṕ䐶䦦ঘढ़ᒌ冊䋊囌䭓六煵⧇ᨮ൵翇ⲕᕜ昐左⌠旊ࣔ撷㊅⵼⹵泴びẕ喢状塺瞍嗈櫅得⪗䡯䉕䙷䉸涙喱▌廪宊ɮ䟻櫯症⦭♲綷ᙹ⠢‱㩎姸㌊䏈曙䫱檣⼽ㅵ㳴Ŷ嵦瘁椾勚炭ᒡ牌ವ㌔曼ጕ䷶⦷↋ᕍ囝ᥚ泤៌盖㮗殆䫦⽵癲ජॷ秲堚嚊悊䣭䅅窣樹侱㞵呴創␵Ⴉ圓ኂ㰻⧉䗨܁毢仆㥙ષ繵䀪ෘ្侦䄪㱂ᇀ悅ⵁൃ㥶捴䑵嵠㖨杝Ꭶ䝊碈⇌坊ᮑ哃⵶⬳惰秎ᑶ䈩ⶂ氹岎䀾祖憰瑉⚭߶究ᶅ嗍噡妸Ⴛ㲍৐䤥ᩤ毼埼⩠匩⅂ඵ埡姆睊�⃝ۺ᩠濃ⱹჶ烿፦䶌䐉峆喺媉♞ܘ%ٴ᭭ᑶ᳿攮䥏晪堦綋䂉໔ڦᯬ檃㋭❖㳱綏甎㝙嘆焺‧䇂ᄝ⁴⫑㘥剙拸㐢ⶺ᝱堊䘻絯⃚㲨᭏䵫㶨䧠㋾捵ᄑ㜵忼憭㛬䉗็㎝⻁㭍瞄繼綗夨╛ᮭ⵻忴ᣵ曦ቬ∢㛕夆糸殎䕯嘅嫶冉綎䇉ᔖ⥆槫Ჲ洐፾⵩㥈埭凈⋺Ί䫈㜃ᰜ浓㬭⃖彵䁊渋㕭奔䊨䞈櫄ഗⒶ流㟍䇋mŦ浞㒺僺昻⋫淏猀尙ߛ㱍ϫ㻰獬Ṹ䍠ࡼ焼ᒈψ຿㈏⧱㈕祴嫺买燙稣奢њͰ⏜༈儜偁ர搹ᴥࠬ灝㗠因♛夈䀷ູ痜汓⮍䥕㍽፮㗒㙿ᡮ睁䔍Ꮗ眖⠹櫧ⰠᲕ燲䱻ᷤ疸揮䝛杬旁圍孾檾㰭燖滯杳傤䥫塨ٛഈொၫ㕁භ⥽㜩׽再㧰睖噖屚㖅⯒浍␭槖䫤喔だ墋◗㖻帍⫫揯ⳉ媺㮁檁㽽⊖ᗾ㝬巎甃弎糚夋⽮�猳煷⢽㾔ϰ㍺㕦㕳儎漊㊏旈㢾㩣榇㡂愖ߏ睦啜甂৮奛Ȉৗ窔筓浣㭹笷淳嵸ො⛧匎捚ᨉᏋ亾⯆橯㋝紗㧴❵㶜睗嵎淚䘌曊Ỳ竝䯷⣔㴖׻䚠絙〯囎愴㨍㲴㻣㰊泷⇥檗⏻➙㸝痗剮懚䐉⿌㺱穗澗㠕笕ㇵ⽴⁛璋囒垚☌׃皣孓Կ⤝瘔᯲➗嶕┳啾ㆠ㲰密䫄ᫌ䊟⟤堖⇵坴䴫畛嵂䱴怉㿅僻竑溟⠝ᾕ∯஋㶬盠ㇾ睫寈׌暫笄汊ࢽЭ෹䃺ⵙ㉙奯㹚⦍ޡ伢篳ⲯⴝ听❾䄞̈́ఱ坲ദ桀櫂㶓㢱⼦▪昮潨䄊㸼ړ涏ᡜ䠫珥Ü縘࣠≾爬偞筵η撐㾺ଔⰽ⡬ᡛ崂㑰熎⸭缃惢Ȝྐᡁ漣༑࢐彑ہ瀟⟝⤶ٿ搪䏋㠭⛁ኧ氅ᛌ挼ℌ᭰拾甚硙俍幙稫柁稢غࡎ㼎篯檰梑ܯ⭸ⓐ⌬Ä垗⬧埏ⱼ≪猋⺛㧣砥硓枠䎖窘㚠珝Ȯෛ⻧㮕溗⣔䢮ቻ࣠扁༏奃⥧䠋Ŏî˔‒䵃吧琊ᄏ䏥瑨㰺娧៬㢋⥛ߜⳢ෢佷坋䃳䏪₈㲱嚜㨿⒑冿ߒṐ恃緶⾻ɏ⌮ঊ⃑渧柋ᇚ侄安畄ᶃ䷷⩚烷ƕಘヱ约夹ேᜆ嬒ᨠ犖ᛣ梠᫖搔⊶⃠ᫀ煒㲎ᇡ娲Ḹ狾綮橓恤捇໛浑級☼㇒缞ⅾᰌ尳弊溅⑍䪰䞐婈ె墱俁ࣝ䝔ᥨ筣窯ѝ焉搂།囱恦墔䘡৻ᖐ牄焳ᥩख़%᪅ྰ奩珁婶⊊冱䛼ᵨ椃Ɱ㉐ӹ捭㚭幎徛֓劚䧲➎㋄拜⹨䤡夅嶐ᑠ恲炪妉ਹ䦣䞞Ṙ笳乮煕䎞᎓ഛṉ煽媽橼ĺ♬⁔έ䪯猺䔈搎ന㟠䫇ᠪ犄㚸㭎᭐棳Ꮧ㎸㔗☢௎☦LJ䧈窄ᩁ䠅ᬘ洳ㆮㅕ㓧ፖ䷊㜖䛇㧌彞J⅝᨟䟳寲䭉ⅇ㪰䔣姽ে氨ڜ槶❍ᬐ瑓䌭翴Ԍ捱䴮ᚹ䬐㋫埌憄柫ᠰ呐ࣣ幵瓬�书ܑ曺Ἷ窅懠晍ᷰ捃Ħ啔ヱ㎴ຊ㧫㎆ඹ翴㧒⪘␢⥣⽯❚僦㏼ආ㋩䙆油ڏ姐昧‐梓ዬႻ䜬獺䧮㫗㠃ⲥ䓶㧼㡯᪐㹃ᩕ䵜崁揙伖㓱恆宼䢘㦩寯ᬚ⇦短㊅溚劺⁄Ǩ࡚ᐋ૗秈ȟᡗ俳ᯮᕞᤒ吙佔㪞武築溅愰ᛠ徳䐑ނ忺䌎廳ኲࢌ㨢儸䝇ዒ㰐巸慳ᾯ⃞攚猥丘ㅡ䰆䡽嶷ֱًᵛↂ扌ሉᴍࣦɰ楉椼☠東䧳⛨彤漓Ữ♓䔆珔⹦㝮儂籾八䗜ܥ猔瞡ࡍӔഊ玙䵱㜥爦碼↚►妴嫴垡嘻␏涉୫䵡㰹䚷྽媇ᆠؽᴭ⬙⠸惿࿅㲥惼἞斊嘁佬旮染᥼缓ㅏ筘ⴓ獲ⵏ凾᮷木䖚ⴹب实㸎㫤夯ც䰆⾱㦅䐆匹妆㈍朔宰⦡䓎㡘偢Ⱂཫ⡱埇㐵ᖁ㨕ٲ帲楳䩏Ⳟ೸嶅瑫復㏀ᕸ⧵嘂䞝掠ஊ⢠匡帵疤⻜䦤ྲྀ絹懠◬果巜盋㗯櫑ዢ୑睕㡎ヶ楍඙槝ᦶ帊狢㡗㫖䦃ࡱИ๞曦Ɒ涏㖣嚜婨檋ੌ曑䫣⯙㜒㾱淸❼刿㗅䟸槺璽੠廗䄛氓㤱ڃ۷㽾瘼疺䚊嫚櫫ᯍ曓勢殜䲲䀭䔔䃹⏇瘘㟐奃㸋剢湑⍺᭢⍅㥕䖷橿▜☀坄已汋墍㇛㤁䰄泃㬶篶亿綖䷗⚑壚漻Ï繑峱ᰓ⹏壕縐᭻厑඾圉嬊柋㋡熉弰ఔ࿝㉍喌䳹΍◶㟍Ể旃⢍㧓۲殲涎樅ࠂ᭺䮂с㙶岼Ű瀧槒᫡子Ļ㍍矧⃻▐ᘖ㚈崆瀣㌬㛘ế㪆泻奭䧖⻺ᮏⶸܯ୚楫矍朷眅⮩໫㷹忦ૺ榎䜕♩弆晜Ď線競少湤ᙈ᧷廾墕⇬㚚壮狣愎㹛䜊Ⱈ泻㣍簷䫸㮁断嚓州㋓Բ⯑ㄕᬻ⺉क़㸴㜊枍዆盹ݖ潛໯᧘⼜寐ⵞ㱭瑖ཻᎇ單登姦䥛㈏ፑ἗毳潗㸠䥕拸䲱嶹眷带狻㦎䓖曩㯺⽧㱝嗦燿侓师ĉ冣㖛؎俗Ỻ□᣶⛽呡㟾㭼⛙❀導箛ऎߟ㜝䬶㓳㏵搗䪏㶟縏㚇῞羓燎ᝐ⻵孥洏㤽䦻篹⮄㷕㚚忼渋搽Ἅ炦殓䜻㚲嘮᛺皇ᨗ瘧峪炓㩌狘笒㬩ࠍᕝ丯ޮ徊၃ೈ䛦缛ؿ凓ᓵ獏滉㘽䰷᩼羌帏睞棺斧沏巖䥰䜯ಀ缕怳塟償๜༜夲籛∾滑㤝殧渁奃沮≙䤎䏠ጹ擮禛嬌㒗刎㰀ᵵ㤣圗ਖ਼焘䎰嚃嵶枻⌼傝⇬䟦᱗㐕䊆ͻ䖂ⶾ嚃ᥕΛ簿糘⇵䟪ᴒ㓵嶮䟾哝掠࿜㲩砧琧⒒ჿ䠒Ὥ㸭慖盻焕⏧㟾塩羻㒴ኝ盼煿〛㏵䅮䇽ᤄᷭ盘㯊戻ຏ劚ਂࠖἴ碘慮婙ᔋ慎᯾媡❂椾㪙⑂➷⽻㌣漯灟ជ維嚚㳶紛ຽᔥ樗嬷ן兺宻潻䴏厶㜢㶺曇憿碚ӳ宓׌Ꮃ曶呣ᱛ淾橜㴵⯧巍杸筥ḍ仟㔣羖䅜䎓㎬之徚攇⢼⺐ᵽܢ⭨縓岯絞䄃縋ວ塡浧祕ᚖ኶䟿Ἴ絾✑剜⢚堵䯛巙拧渿嚖䧳枕Ả簝滶ボ⌕μ⸱㯁泥ⓔ磛➦毤峌眝斮棚⮃௾簊㼩橀੿皑☗孺䂠炃爻潿㌞㧒倓帎漇㖿⪞䗤㏖᱒练佶㳝枟ெ⺌ᢱ筛౳⒚᱀嶜崗㨽䄯哞ଖ䯱ⸯ峩慷繳底ࡒ垔᳠۠ᑡ฿徔氓⹊ᵵ礷䪿⻚䨖垭⿲疫䁖曜璆⯋⿚᾵竅ᆧ⒟⢎礬佟㱎巎᫝⌋⯲眉㵐昇漽綟姠㜵װ熋杏ࠠ涓击⽘㬭櫇䝾⎓嗨រ巄刋厯廟㔑厴睥Z橀⋂您㬉៧Ɒ田斏嗘怲䯡⽕㧭澛㳼䚐ᇣ㟉激ջ滀㗜ᬐḞ澻㮉窄庌䤦తも洽㻕浖叙伕宴⿓㨪摷板⎚᧢石岲㍋嚄㯟㍔尊䫤㎽秬㝿ស㗪➋嵚瞕晎ןⓈ䍯⽃刕昣㓧⻼䖍涸ᷞ疓碚宍܀ᐖ濏㷭掗ၯ⡐༗瞋ⶾ縧䶋孾஀栿抩ằ竊窓慑㷶㜮崡移䠿箋Ȏ޴ἰ翹礯ў⾀ۺㄎⱌ稛俶撛∀ࠐ湛㪮毗ⶾ焝⦕ထ影縍畺⧘涎圀澾ဝ慧㩞ㄐ搖ဍ࿣引筺乞݈箯圝忞熨劾礒䔆㟔㻎箍与⩛弆᯽坉Ȯ晷祟䞚䛠尒ⴴ皲沶罝ⴐߕᾠ緝旷篽䴕刌䯾沁㍰圿㓹Ɔ䞡ὴ緾硯᭞㞓淠導䀌紇䳢⿙䢘ຩ♜屹柋ミᇴ䘒侾㲁疇嘿㺝Ȁ圗嚂纪ᾇ೜溭盬䏲ḅ纇問ʚ☇枭ᾌ竳礦糎ℒཚ⽵㴲爣㸗囮⭶⦰瀂繩悻⅝悘搓杻幪爣ᚮ䶚紗㏈'㱧囗䣞⤒ᬐ濃㴮硷宏䖞程垱ḩᩍއ䎼⡣ᯫ㠛ᷬ秗䆿壝揕巷ẚ嬎捗櫌垘䰂潛㕦窷墿䞛㮏⠏㗝孡η叼欓欓濜幉瓩姿៘瘄埅干秣浏矞Კ᧨ Ὡ瞗㡿煟ࢺ࿙忮竝耏⯟㬙吏⿙ợ笷䳎儘䏖㐝琏姞⏯盟௛ȒΎ㻞㹣䣷篬䌑糰怉Ύ溿碞缜⟰杈羵皯爬ച椄⧚ခὄ擯䫟⅒┉瀆ᵓ硓偎忹瘟柔䮙緽槧ᦞྑᷯ殆径禋狞煜㐝ߤ㽎紷〿兟瓔堃ᴊ綈疋幮⿝㔗㠉࿭笽炿ろ缝堙捁ᷓ畏俗旙㶂瀝仍簽旗粿咭ᷡ㺶缛紏ෞ̘͜ᐛ❅绹恛䄟縑研㿣ᣞ璜ℨ嘀䘂䟘଻娸䥟એؐᗢᾖ粳珏奾纜䠌㶬缸烆晷䔝䰝✇᨜竍㖴珁᭿疘ᾠ⺴㲙疿⌟偓〃㽘㤒恨⶞學࡯德㽈㿏羾尽挓簆徙糓癯紷ᔂလ㿾縻竡槲ܝ盘ᰃ㍣翏翷皟櫙⨂砜總缯甿俕㰝忳䭕溊ᛟ珷Ν〟佳埦絯璮㐟Ố叫⾜㷕箏獟挝唉濰♿級毇䐑!⿌砛剷⤧㈴⠧歱缀ʑɠຠᇏ徟ᛞ䐝岻ဓ耉濨㿜ኘƬ⇊䡗狠ᶈᨠ堡皹ౚሴ瀀濸䂖挴Ɀ㴤婯牠ᵟ䠟㗾ₜ䎩㰐倴⡴Ⴐ罶ƩӠը獀`ޠ䔞ᆜ君䀓ࠃ坢ᾦ¦缜ʷ稐࿧ؠㆨܞ䡤$㠐࠳俴⿈㽖结糨㯯盟慨ॠ咡࿍㠘㦲瀉㧴玲㕓绦λ篼燅涇僟෾乸䘦㺗〶忼恸½㛮⠴ԯ疐ᑏ媠䓶ᔢ䈥䘑࠻䣬ₔ㌯ĺ涐ࠓ攐჏䞤ឞ习擪砪ᬈ⸶႒䃝縩㶰ӯ痷拗度ᄞᢢፚ〖⛅䡁ႄ⃁㡣粖筻玨ተ⯿ዦ帜ᕙ簫⠱姽忍䂪刭緪֭猨႓喁ࣾ殜性瀩ന⧽恾¨Ĥ˿篐疋歠╀紡¢癹Ȯ〹䁀は⃀Ő㓛箔ઠᚽ僠䒡ڐ⾙殒Ꭴῷ⎸ޏİᶜװะỀ㵀神ⴣ判岕㐳塂࿔摎绫ᳪܭ烐ᑋ庯^ᬢ䰥氪㐰硑悟㾕幩⢎ԯ甴ண俀罜c㑚ါఴ㡎偦䃲㙲搻碢ཌྷ櫰⸰䤞⺣㌥ 䠲䷱な჆⹛紖ָ灘Ḩ㿠燡垢笚ᨯ珤塋ࡥ缶ᚙКנࡀႀ⹕ೡᩢ⍢攗∰摒p愗䛷䵟碧疏椨─崞ᡣ⒤儯䰻䡃ࢃႪ溛㴶ֺ煬༭૰᪀壌杙ᅄ怵ᑔᄴ�悍䄅ٜ೓澏唠梡ᐝ耙ᔬ涃ᑝ⡩硏䄯崭ۊපኜఠ柞ᚢ焤洭丄䡚傁悢⇜䊩҄୘ᱟ䩁ᯞ劢䀐᠒㔄淢傀罜Ƒ岡߄厭椈㿧㹁媣毙礬栰ᑌᢀ㝶䄩岹勌ି悽䘠䤎䵢஘倫媋呝�℅缉䍭چଠᲡౚ⢁㋣剐焯ᔉై侫傸憎䍮ߦೌ᫰◐坡ᏽᬤ槢⨵䱋枮・ᛠ䳾Ҳ࢝撸㨗㵁ण㝊ᢐ掂摜㢕ぶ๝䈯秄ಌῨ㟲ഁ䧣嗺⤪砆ᇺ徰缮⑐Η֢ௌᴸ㵯⏞༜֧稇渻瑁忎焋∞䌿筍嗛◿嗇㴁咢ధ樬ู䡐墋征℻䌝֞ࢴᑟ䃞ഔ砠〦«,ɀ硷羚懧䋰ھຸჿ吨砱䯣紐Ⴎ渽⑒lÅ䇯䏦زड़ჰ␐惁ㅢ䦤優ض䱜宠・⇁䉧㯛炬ᒳ刨刁欣㡧弨稵≇桾䂶ᆡ䎄ܔ玨Ꭰ∨睁޽⺦᢮ሿ䉁r࣢lj䎀ҁત䍤䀇□ࣽ䦙ᜫ䘲局䑱ࣽぽα墁ིᯤ◟㼱ۣɧ崯䘸۽㡫半⇄䏴䚑ࣄ೨㘏⟘⸜㪚⨮嘿旹ႁ炾⇚⊀䘁औῇ嗀䞱硹樲ᆁᡥ剖⒓惲㻑䏁ݳ␒᳑峢㞤抈䅢࿴▇㱆皼Ո冘䂂䛰䠒ᔐ㏏ၱՂⅦ晆孄䩍Ɍ⢥ౙ⌀ͅ௻梴⣈峁ጢ 䪮嬆偺⑥侌憫䌔䕖ಽ䡴㫈畾姸ⵧ䪨ౢ橃㹞庞᩶⊒⮕ೄ௴⬨䑁ᝂ禦悩喥⩇呧ႉᐿ䓆䔭঺ᗴ㩈䉡ⵠᕦ⭲唲婌Ẻൟ湼䏔䕸ྲᣴ㦐癱旂㳂嚨ᔲ㩊䠹椁ಥ≢ヽ൪ᗈ⿐噶刼奥〥ᔾ㩔㕄⢶冸⃶䓂勊Ḕ⒈吱ك⹥᢯㛅穏抷⍐ㅉᔞ䑛Ɖ⅗䅈埱ᢂç梨ᴼو⑩ᒈ㄰È㣡僦᧦䜫ୱ؁癢溮䔰♑வ⃺憔⎼䝡༺ᜄ㐸煑栠磙暯挿♉㑲⣮碪䁆ቢዊ᛬ヒᥑ婂籧皭ᘈ㩑⒑棶㇝燹䟝੊ᷬ㐪ᖨස乀ᶢ嗢䷶Ⲓҙㅨ捉䔣ໆሬ㧈䧱斂ဠ磅捤噃*夋凱⎬ȧ⃙⑬⥈槑ૈ汘㤨焊ᡉ摮䣊ㆡ̕߀㋊ᖌ㳸左ᛃ滥Ն᬴䩊๕㲃瀶抪䠛ࢧ䫌ㇸ竑枃禥ܲ唲๐ᲇ夈凑揉季஠ବ⨟ᛦ҂⧥䎨ଲ硈Ⱬ棬惩拑䜄ࡎዬ⣈滂℃㤋欇夶嗩桴フㅈ払䗃ෆᒴⳘ粑朂㎒㺮䔴維䀰剏♵⋛䔗්ᑷ埐䍱咃穥㖪┿湈摭甮処Ǜ䕇ঊ‎ƾܘ㰍૤ឬ召幉緛罅἖扉䞧࿎᤼⊈冈⫃௥偠漱ᙜr磸㹃疰੦ⅷ⎜㹒㷱竃⾥ℭ䞅䀮秄㉃㬗搃窻嚺昉䅏␑戃俧ʭ㼵㽷粇磋嚞⦰࣏�๧弐䅚⠲ぅ㎫䤸ᙔ㱳⣩ₗ䷀⚳房₢⯍㞤ء焑ᜀႰŁ㡰Ӭ兀ጘİ䫴侢ⵢ๸簲ዲℳ傹㳶汨惡Ǯ䎱䓀䢎ᙜ┈←★㤦ᡩ斪ᐨ䊄ᅡ॔Ꭸⓞࢸၘ㇘縐ᄲ爁㕁䢰ᅇ䉹䙡ल椧䟭琡ᅂ㣓パⰡ䩆硬刳兀⅑牂冗㧋叀ن䔰ࣰ弄䛭ل岑ᢶㅂ扸䵍燿㵸⛷௾ᇢ℘䵑ᶑ噇౨วㅂ桲䵰䉾Ꮴ⋸䫴ຂ⿤媺຅噇⮗Ⓠ⏾⢉䃨䦣巂▃䖌攖厰休纃䡄玭₴㩍拜⒪悩ዠ䠚◩᧠ὄ䜶Ȉ尢▬ࣂᯤ㳓ゔ怾嗱ݸ䠲䛨~⎀煬呠絲圿握沖㢬凙揨▴䶢৕䇰ᕩހ㕅婬ᒾ⥐㉳┊䧍ጧ⤃䛑ᣈްᑠ๡穢ⱨ⠿ᥛ䠱⤅䦏ᒰ☥ࡏ毲ⱇ๩ল୆㙮嘭奀ቱ播䥫፮➤䮭⃲づ۾曠缈箫ⲱᥑ剣擕⁉琧䜓লᚴ⤿ứⲲ婇厳岰琽牳擉煔熡⟬ᆠ戒⃰࿑ࢳ⽆⩪⯁ࡲ䁣䅨⥃㵘հ಑፠㧤坩ಲ㵄ū朴ᜭੲᔔ悌ʟ猲䣥ႂ⊄呩Ё沣匡⼿橁儱Ⓤ温ᨉ⚏ุሟ䵄廱㱳罆㡫₸㥀㉭ᓶ⦺慇塌຅᭪⓴ࡾ宲ፅ㠥筂❫㊊攚䥒単Ǫ䫙ዒ⇤䝉渂㣆瞮璻敝抆壗糶ᎅ⑶⍵ᚒ㲴狉啲ૅ⌣䲽╁ኔ擑恶ᎍ☄俕ᙕ䏄滱Ã楥畬䰲癚᧓ᒷ⦍⎵戚䤹ፒ⪴䃩掲〸㶩㲶൒犕墽䦾劯稒仩ᐪ⌄择壳杇⍭⚾㙆檀咤䤤ႁ燊ק⪪⧴煩㳲Π୭䢽祎咚䒼ᄤ匚❒䵍ᤒピ窉⋂兄᭯ᚺൈ呣�⺄䁳秠亟涂⯔楀㧉ᗅީႱ兛ᗁᔞ䦽叛◭∅䁚⚔疞䂳ᮠ咥᪸啑䪎Ʌ樘䃭ˎ䣵᳢㎴盉璳㭄፯檵ᅐ橤擛屋勍➬䠹ᆚ㮔嘉泲䕧൮埉␹ȱ㒡䥯剞嫞䬱ᶤ⁨涉γ䧇彩⪲㕑䐷甓⦠㍵⒡众漪₄捩憳᧦ᵩ䆸䕇峆ᓭ⥮጑܂䩝Ꮘ└圩Ųᕅ٨௯͌پ೉䤦䆑䕤ಥᇗ忴尉打ᒇͨ㪺兗Ὲ棇ㇾ勃䚒惃᱒◄紹㧲ࣄ䅨熺᥅ኴ璻फ़ቢ◆䪭ᒂ⡄点ࣲ彅嵪犱畏犑璶ᦧ搈㊎丩ᕆ㰴䝘ᕓኆ捨㺹᥄㞯ቐᆕ᏷╈♅ῆ☠㭩Ⱳ㸦Ჩ檳敁⚄䒼ᤠ㎨昉䦩᤺堠䦹杒᷆瓬Ὲℬ婬F概㍜旖专ᅺ♬䈉湳ᢆ献憿敁晠ⴏ᦭厄➑䱣ᾦが憉ᵓ懆⃫䔱緮ˀ䳔奏勖硑䵰᝼ⷤ抹༲柄㍭᜻䭑ᶸ咴樅㉉˞䧳ᜒ⾬䳩姽ᶤ㓩熵՟橲ጰ娈㏌枥倌ᧂ㊔笹暳粄爨游ᭃ噧䴏৆ቢ╾䡣Ṇ㪎Ⓓ᧓禄樬ᖹ䥑᪀ᓂ⨇剄敭䧽ᶚ⺌敼ד均⵮䆲浗᪌Ⲣ椼抵┆䯩Ჶ㐒उ㔲揄歫ⶰ᭘婷䴜槞㍟၅䥛ᶖⴌ篹དྷ兄曯禿筐發㔙᥸㎪携䷣ፗ䞌玉⢓矇໩䖶筗嗕ತ㥞㊱枞䪃ᄼ㰼樉䢓ゆ廭⎱筕晻ⲱ幗㌞摄䲙ᨒ㟔籱绲⾇䧭䊳㙍姊⓰妒㏕ѥ䫧ᾆ⎌嗹抳㔇焧⦹眹䪗᳘⧲勪杢䬥Ხ㱔䃙窒⥅涪㎻祅乿ⲩ榕及撫䣇ᯖ㵅ಉᡲ㴆䧫撾䭙๴Ⓗ㨈猡䠏இᔶ⎼培抳笅࣪䎳均⚋㒿奐ඕ暽䱧ង⋬绡⭓߇捫η㍄満䳻㥮獵望䵧ᅈれ䓉㙳䤄᫩㊷╄⩨᳙㥯⍢婋䱫ᔪ⑜咙ᢓ戅ᏪӯݗຒⲬ妌಩挲䫯ᴾ㈈䤮㤓翆䷩⎸浒器僜禖犣摬䬍ᶌ⢔教䳓唄٫垱㥡幡㲱煯㐃杮俏ᏺ㕼殙㓡渆勬岹╖㙺峥䧃状旐䥻ᾪ⯜䦙泒␇ᅫኹ筜㹱⣪⥚㍆斸䴿 ㎜䡩䨒瞆ᣬ᮴⭋湲㓲秛物⒰౎ᩖ㎌糹淓氇懩品ᐴቺ僕楍㌙攼俩ⴞ⾭ޙ刳筇䖖䖸罈咝䓵㦠૟敉僿ᗖⳤ䓙撓标⁈ᮾ慕㚄ⳳ禢㎀ᒋ䠾ዞ㔢棙ᮒेKྵॗŴ粷৚厌栕伏ᔮ₢䬙簪慅໪ழ⩊�㳑稔ଛ柠⦿ᘊ├竹䅒䰶杬Ꮀ᥋䆂瓂㦀୿旣ຏᤆぢ漉ړ匇㫯㮺ݕ些̇天牦硰⨀婁㠢焙䖳㠷糯ڰ⃀繡⳷ন஭杀⽹ề㪢䠥䮳⨴㏯岲ᯱ犚᭢粃珣杸⬗滪⾔囉⤪憄㷭䡺⃞㺀沧Ըѳ晸⤷ᎁ⩴䷡䵓宆篭啣归Ũ䳖秬ନᒁ侐彎㨈夥堫儷㡊喳㵒ᅺ䳁稐牟➏䳛ᤚ⠬欚☓␦扉疿ࣖṸ坌⺢㊒ᔴ⫟ᲄ⫂䅥ఒ⣇櫬⊺㍌ṫ⊸䥟珧♄⬐偁㗂徥籓ⴴ瓨纷ß暐拔ֲ珎㩓䶐峮ボ䶮嵼๻橍⪷Ò湸拌ؐ狂⚩䯨售ⵔ䥥椪㈅௨呶ョ湹Ჯㆶ牖ᖆ侧ᗺ⃰╊灃纅⹋䀣㣂㆏眻伎厅曬⸥添怟㴉殫䀂秬ڻ⽊ု拔z玪➭䯠垊⺬唰仒⼆焫㮶烆Ⅲ⌂稟獫敤䬤嚑∲朹⡪ẇ䗩⑸潇Ṥᓅ㦁ાឍঘ孆⸂枙␪ᰵొᔴⓔ憆㓡禝犔敠ॸ⥨ᣠဨ墲 㡋㐺擝䦇⋧妴䰄ᗰ⼄忄ឲ䱙晫⦠祉㿁獜ṿ⌟ᥒ䩚ᓐ⯰孞⁲夥祪䥆嗫⩰⥙冞ಿזଅᙂ䷴娃ௌ居ᦪᒴొ剰ა榈哪禶䩚䉘⺴态⍢囥焓娷൉圷ࣁঙ⌙䕟洤據⥐忱⨴禥娪儡‭剸惓ᅬ⊽׫㊵ᗐⴐ岩⮲墅䮓↶煈䶾ᄥ㩨拍䗗势杌⪬嵞♒䤥֒㴷剎⺽嵙ㅦ˔旅䯦ᑚ⸃ឮ⹌孥᫫䦇˩䉳ⱏ䲜ጝ䖓ఓ㡌ⰻ᣹⍲羥Ừ䌴ᩋٺᣐ㥪㋥◤ଢ଼旦Ⳉ咊⒒䍅咪㚷䃩᪻ⓙ冃ܱ╏町ᗐ࿴務ⶲ嬅縒溷䦫汾磂⾯唆Ɨ዗្⽼山▜䭅嗫㺇濮ٷ址校纙亝厉猼⻷ᤙ⣲玅݃溶䩌穰㣛榉羆⦁䁟᝺⻟᧮㜽࠵汫 牊ᦴ䒾㊔઺䖜䮟◯侬弥㹆؅媫㨄㿯ⅷ㳘ᆍ勱㦖ਭᕶ⬼历⊒憅呋硴嗨ٵナ妖勈⥄猨呖⯗ᮖ⾒殅卫䀅罨兰佃㞣૫㨁物摠⥌唞☪尙羫䖵㝮ॸ䋄䖏ⳏ▽䪝ᚎ䥽ᥞ㳒債㘓ࡵ棈清吢䥞劺斺⮩ᘷ哓ᐙℒ姅㤫⪷籍楻泇╶ѡᘛ㏖栋䢨实ⳤ䗙峪䐶䣈硾⋊㥭粻ᖮ⩊曋佟ᶎ⋢縹獋౵ᩪջ壍妁狿繪㍉挲䴪喙ㄴ禵哓 ⽎湱擒嫖Ⳅ唲䪏ᕁ⬺ዉ⣒共倫䥶䕌宰⫓ᕪ⬊昔⯋柶⣊堎㩪奥翪牶Ë㖳拒啠㌆喞狴ᑴ䭜啉Ⲝ碉䋋嵵䋏ㅵ棉१䬁㦝⮸姴⻄屉Ⳋ崵ᇜćᵌ⊸孙敧化政સ笚䠰壖⹊縹㢓䆷ٌ䚵壏㖔䳏旵搗ឥ⹒奙⤂甅▫✴埬ᵿ惗䆚┥ԁ䮴ᆍ࿲嬎リ姵๊⡴䛊ੲ竕⹴ß喩⯰嗹⫸娡⧪欵ᾲཧ仏㥹㫛ճ粫㥋狡唙⤊噎⎄癵晒♵狍⾷ⓞ疈䋔礬卤啒䠰徭⧢䒥ᘳ匷䥊絻䫋䕾ᬁ⦀පᚙ䥆幵⧬剩曓䈶彋㦺曝ආᳬ㕔歜暹䤻ᅕ㟂䱩䊢ఆ᙮ᬃ櫒牤媡喴檦嘼⬌哎㩺払⦋૙᥌纵寿晴Đ㗧⭚✞⥺咙㖬䫂欲嫴糋੾囆幣檬旐⮚ጻ⹷ᝮ㮺凙床㽴䍋孹坌涔ʡ旊勦坃䤝ḍ㛊怅໫ἶ㰒嵲㕏浪抦䗾毐ᘄ䰖堮⅄墕◊竴⋌〽䝚ᙴⓐ疴ଃ嚵⸄嶅▔䲕䳪ᖵ`䝱ۊ婣洄ᗴ殽喆ⴊ巘ೊ䱙䬊卷㏈յՔ暁䳢㔻劺哓⡓ᄍ㤜䗵֋屴㯋ᦱ㋉嶛䴕ᕶ୧ញ⪥ᢹ⅚况⪋暶Ռ䲰祔㥿ଟի䬻囱侣ṝ⶚䨹未梄䵍䭿擖㶉䪺旨㌧嚏⤓ᗺ㨂ᤙ琊䜱⹇筿囒ᕩ⳨㥷殮ኊⅿᔝ⬂ູ㬓䑵湍㭴㫕ږᒪ㕰檇啛ⶦ勾⠚忥⊋⁔㷌㝲ᯯᶕ嫚䋤劫唋⶘堣⹺䀵⾪ȷ又㍻䝒ᶜ᳅傃猐㓫⥡忝㠦澕㋂翠懪⴦囈঍拍䕰ψ㘉⽭⯍㪚樭ۋ桔ỏ僿竐ॣ拿䘅⮈暂ⰽⰵ⾦缹獒翴್ᵸ᫘䍯㬙ᘍ檦擬䦓ᚱ⚬捹媳䳴⍏ѿ᫇⦂竉疿⩸㔧⽺僁㕦砭㜋穔城ٻ䝓ㅼ܄櫤劖ᖈ梱噽ℚ噕㌺㝵よᩱ㣘᥷㓸෍殬搢ⱡ婃㸊碭㸊癔䢎䣺Ǔ͢䛈䄎᫓啪⤾崮⎚泵悓㟵Ꮛ㸲仔庘㳭嗮᪋ᔍ⯢帥㿴䮕皊ⱱ彍ɹӀ⎁ۇ煚᫶咾⦛Ꮃ㿼䙅愺₴࣭✲糟፰㓢ᥖᨢ㔅⿑埭㔲椹檻仇㪎䓰ᛊ啦漡䴩ᯁ垔Ⰶ姉☠⃕ⱊ練䩭୸᭄൥䛿☞௕團涤刕㛦筭₻൴暈⍾䧊ટ䫳ඨ制㚘殢偁▆眕耋㯵ࢌӵᇛ㎈䋽䶁ᮑ搼櫩婁ⰲ礕┺墴䚊û㧍䎋曂䵳ᨩ᠈漻ᴳ㳦䧭ᮊ㉗Ⲏ᝺ᵜ⊄䚸㗄ᰇ嚯⽠埓↚惙ុ嬵浍硻໏ት勎瘚૖㜜潥寤២穅決ᣖఁ䵻ᇁ檛曪ⷎ劰㖲⻙姓⠆炕Ī咇⣉勰ፄᅹ䒯඙ᯆ㘍䵳ᐃ⌆墭㙊浔㇊㋷减䮄䳰专䩅㞍䧡尹〢壙ڴ录䪊䰶捎ඁ䛏ඁ刺⥧⹉ᐵ⬶滍噩ⵔᦍ૷ט፹峆⻌䡓嘄䡪弮㋚䰥ౕ̊ೲヽ凖୸暪甮宜咚溩剅➶恍䔺ᡶ熎⩱槙涘㳅ᗨ寱◉⾧ᅎ♆囥棻୵↏嶳׆玉四䶀ᯁ晻䮭尮❶䂍灪祆睋勳᝘歯᫑ⴵᯠ喦欩唲㜪礹ল値⿌歸机綆剃ⷅ᭽㜭⤡呉⌚劅ۻ俶卉⥾㛞歿㜓䶄気␠榍岻ⷶ箍᜼⯄Ẏ䫵ᷛ㪓朊淢珲攺瑵楍ㆄ猍榋䷗⭯໶淞୮⳺夸w㐺熧Ί㤤ል㦕焇ፎ㲻⇍⚀㛸敉娩㕾棵媓㋺殭㑺巇ຍ竺歔Ͱ盉㨄櫎㖮沅儛㦶倍压ᜄ㾎⍰罓繵嫐⸐᯵㖠毝偹⊖弍桛䑷્⇶壐獭㌀ᖵ㠩喞澟Ꮣ㈪狍囻狵䶈⋱˗ވુ㖤㭈疿ⷝ妝㺮䥭淺䂗ᄋᇰὙ箘ᛨඏ嬷㓲⼸去㿬璍系⭔孌䍸τ残໴涢㫄咆氃啻㓜吉ᾊԶ위Ꮐ䭢亸㤪㯓㝗⢗ឲ㭮焽᷻⒖厊䒷叄䮑┍ᴴ媐畞⫊剗勮栅慛德粊ᛸ盄孺圝ූ㫈眒洓ἇ⻆儅ⶫ朶杌㫳婞䭸伂淠㯥㞌Ȿ喋⮼䪅₊倅曌⳶䋎វ⛆᷅橸眎歃娡ⵆ塭䳚姖埉䃹৕ᕪᕅ䵕䨥㜮榐倧㦮碽瓛⧗䏪䫶˟歼囔ⴿ劽ᑅ棕ኊ㗲䆍击ᖖ䌍⧲ϟᆊ哅ցᮺ璸⻒尲ₖ垵⃽ᶔ⬍◵⯐条᛽禾娼嚪㓘夕╢̽㿋窕匋䷷毜ᎊ溠椰ᯇ☣⽸傲㢆绍妻䪕峍痾௘杨媾䶆㮎甉中᷵㿬叽撳ጶ⑎䷴䷋㝺ڽ巏㭵昝棐䟿丠Ѡ櫴䩐޴⭆䰤྘⍐㶻㮆甝泞⥘࠾呝̠ㄕ㕄⏱㥹ླྀỽ␼჉煄Ƨ䌯㈱ǀᲚ瀡爈ส䟋㭬溾巵㭡ᤳ濅⩯㴠⩝岉㔖爏揷䊷ᠽẸ㳊'䯓榇偘ா汝⪛宔ሉ珲⟓侕਱㸔站瞃椇労ゾ䓝䕌⦕㼋䏺懝Ǔự㵉⋱矫淁୐帺㧎䌅֖滶䨺呏⾕し巯૆᚝樝ḗ╾昒⎛緙థ᯾㡥⢝弝㴪斕皺獑䞏㢐䃝杚憕ܲ篱矊浓弁慚箭畚ذ䡬䴲ំ⾛戕攩ሥ࿑⽵弅㷚ᰝ眧涯夿‶噤㔛䙐㐋㯼㟟㡀⢌秱೓看桏垶⊾勝䆛焖名៾䊯ᚎᩏ㶅笖穗梪洿㡞猐潌㼗㯋篲㡽律㼂ಝ篜媧瀍撖厯֭⾛␖䨀埴俊彭庺緦筇琧ၱⰿ㆞庝绽甁乬䉅矃㾅䓤紸玝畽澿廟⣦⳱ᡕ尔個⿵㥖ɵᳺ㱾窘祭潹剋㚞䪝弛㬔┓ῼ࿊⟔摏㷼ᔮ箯港尟㒺怍ᇻ᜗砎矸㿕羑廠ͮ箕睠ḿ哒⮆጖耚瀖း巸䓈⽱纤Ζ梀༻浚ⶠ縡炉K槦営߸ₜ←Ȓ嶯窼瞠ệ庡䯾夣ᰧ緘ᠾ㍪搨ོ♺夰笢皲ⱍ刷℞洣䰅喢堺㣳Ͱℇǵмܛ秦؊模䏥ំ儧ሯᔦ䡐಩䉹⺽畴ޘ೰ᣠ㲁ɡ擰俍摃ᐻ癣傕堲䈇Ⓤ⎧ᄸ᪰㰷娒丝ᙉ爮琼ɸ௯㽱糜ⵎ㩰偸ᱰ㖀烡傣挧Ḭ堸䏵ႌ㾌໡唎ݞ寿濓劕㡶産ᜦ㸕尾硐ࢋɧ煛Ϧ۟甐䉨㕀禂⥀㗔ܕ恳⑘傃ტ浓㵄䩍矈Ἃ埠歡汣缦礭ไ摙氼㕣⨰䏽媊಑ガૈ㠜༒嚧ⱋ⠋]ࢂã㺌㒕޼惔ᡦ䇥席㷦㱫䘖Ӳ፣㣫䄑⇧ᴺښတᾧ═枃ਗ਼斧扙Ⱡ㠪㟍恪㝭䎱Ӝџ殸㩰獡疝᫑㬬㳄ቦ㢗敗䉽䐝岘ⓖۨ㩧܁庮淉ԭ廋⳸㢒佹↳䍥傾෼ᶰ旉᠁䴐糱ᙱᠦ嘯淪㩹䙇䌰䛛瑌Ὀ㮖਱憩஧₯墧Ⓢ䒗湌䑆㌟ⱑ಺ઐァ⡖繍樭墬عޤ⒇ᙆӐØ琺㓸᲎䌢㊱娣奊〔紅剖ళ֓䲒⎔䞝䠅Ⲭ୏㖘瑱ᵅףᷯќ痃㎒㼒䶳∷䞒ᣏᥨ㤘擃ጂ䳘⻨壵⩋⠫ણ䎱ࠆဂᶐュ䗈狃琂㪮㤺䐨怸籑┉崅挭ຫ抨ʈ昱䛃ᢦ媯⊫ᩜ㒒坙礛⌶䜽ညᡞÌㅱ䭱睧璯櫌㉛㒉ᒗ凶煍卽ಗശᴜ峘犞Ԛ崯᰾婛梟椄壠䪹篺䝥ಬ㡰⫈禆⤉旤㌹穘໌⣱碶凹䚣൤۬㿈礒˃₦峥㠡⩔ᒙΚ创涑䟱䓕ୌ㺜㧑练吡旧嬺婟ⲑㄘ刈冽䙁䘖Მ樸涜䤒⩦万厮䔳攱౷㇄ᵝ䠓๮ᴼ㺜⪑晑㥧粯†沿混᎑ȉ熜䝃ώᨄ৘村櫵啻玭ካ⹕䲠礞殓爇䙗ൾῴ㾈瓱䌠⍦䞬්䕴湈呣燂振䠏ඒ䙚䛀厸䭱搩䪡缽㵸懖壱懸⏿ࠃ఺Ḝ㊵ᾎ榴䁇ぬ㪥⹗濼璠৞⏈♿࿿⢧ᾼ↘昳⋦㘘⾉䬽橃睚ৄ冁ܥ㘘歴ㄤ癑崃桇瀕னᅕ剸䔔⤝恴禩到䌴ܠᔈ俱寔啥墿戣吸ⅈ傎Ꮇ⍠䵚漢㨐礁崝廦Ƭ䤧ㅔኋ䓯ਓ焢♘伩ᴲ㖔㢑䰳恆灯ହ樭㷓棽凄Ꭲ䄔䳖Ƹ㈗Ⓛ咳䡆㉮伸繜㊟伶㱄ⷸ挰䴉ᤊ઄甶伨⫂䀨梌ᥜ湀⡙䨟涶❋疜᧒㴤篩䜽֨ⵧ䊻䩟⩽䑎䈒燑♊卙◤㫡㚑屃䛧Ɱ㱇䕔ⲑᔜ⨝⎅㔽\\ᢼ㒴⃉䇄ⱇ䧷姫紱溬哱ㇲ匼Ⳋ䙠ࠆ඀粑媴ᛃ൬ᇇᕔ䧒哻⧐␃Թ䘮᪊㫘澑䘃උ㲭伾൑岓哫碲祒䟋悭᪴㲄㚉缃⡓狖㿯⭈ॸ恂圔ᘋ⠙⊍ᦼ㋇⺩瑵硚㭬䆱v媚懎槚不✐瞎ᰕ售㬉倣矛Ŭ㸾՝኏棱樐ᔯ✎璓琺㬷㡑䟃₧楷僌ْ䪟ᥡ樔厐䤲砝᭚㰬摑嘽⡳亮ⴽ䓰㒉礙凫⏀柧ᙽ汚㤬晦打䝧⵴䜓捞湞೦䬒搘㫤堚槴㿔欹䑓伲㉕⦺⽳勚ⱺᛈ䧣棤冽殆㹠樉䠣⃆㐔䊿㵓䚓甓剳緓孹伫ᯉ厳㳷׳叇㧖એ烿瀪ⴂ䍫叴柰ൡᤚ㺋㉹䧳㷇⚗妈⭕嚊֚ଆ捝⪲啶᪺㰢⬺䅵历⟔䶼瀬暇䝴᳢ፚ㰎癏͖㙢⬺䷽ឆ㄄㶸ራ懄㟞姡ඞ柅例Ậ㞨篑浓勓绗綼㍕՟ⴔ⛸ᤶಫ瘭㉑僷㋄䊓垆耄䎏硿ງᄢ槯ᷕ㭳䴇ᥱ夌硊厹來ᣮ峍⭚ઝⴟᬜᏱ杫䴛ẩ吤疰ᰳ䆻ӯ沿❙拓᳭㋆獀♯嗗ᶒ㻈᭖凓㏚䛯䮹䥻璏ᤒ䲷姃曂眕㕖㶻㿴拓ෆ仯妊⽜嚌㳽⫼捇䛇侄橉囜晹仓䘇㇭ℌ᭛Ȫ伬ᝤ玾᱿㠅⩪嚜瑾ᡃ༇彶➈ᕷ㺂糬᧢痏昿䱲欚㉼栉䝳ᖆಮ➾坛䝇糽㧟獡఍侧䨞㲬琥䢓哇惭喼ୟ痔˶櫈⥿♉㛉ᱲ㉄祩瀓䰷ᱯほक़纜嶄盼㦘៴䴀嬡㙢楩愫੻֯⦌ᙑ庀ᶑ爃旎㭤ᑐ嵡㉗䓑䨓⠓䗮㑌羼⺑䋽窪叾狁佤䭎㢭㾥昳梺畮宺䏭⪕烸਀嵔⛣乀密㍓♥䅓㤷լ咋ൿ序㔕᛽ୱ最ⶣᧆ㫂扙枹䌶䇮ߏ旵櫗暑稛攩፟ල洜㡂煆瓳亻๎冹ୟ⯊ທ爈ൌ刡侳ᡛ壭㼹殫冻壭命卷噏㍧⃘㎈嬋圐忮埻⁥熫䲇ᗬּ䓗᷇䌍㨅ᔲⰒ啨弁㙴⢾幀㻃î䑿緧T⼱؀淯曶伴嫉㶌箉絫ᨪ棖燯筝◈拢㛣私曲䶸姧ᢪ⩙䜫㴶㩌ா⯎凉劖㨉穽បᗄ尡㷜砥扉䦷欉ٺⳑ㛜殊斵猻ᘠⱯᾹ㒢樼囫ᶆ᭏窏慜䚅ጔ昈旓ᚖⳐ婖千⁥樫↺Ռᱻ撷↏杢⒦௉ᙋ䷬廙㏜糶笫ڊ充㡹ፓNJ洒᧱猿៧䶏Ἑヒ擎嗓椆ᮚ嬻旰ᷡ┞֭Ꮬ⛒朧侲㡄攵䔫灷ᯯ᡼᭳禜䝵֢இ⍔⼲嵥㝳⪹姽ڇ㣍᡽㹐绕ᵢ⒦㏓朕ิ帊榿䱤「㸷۬㥾圍⦀䤘⺢嗜圧㯟Ჶ᱊簘䭓伶䚬崼ӛ㪛箙囂㐜坕ཷ᪩ᣊ毹哋㒆煎⁹㑱᪀礕伔䫚埫瞼寬妒爵䅋桶䵄漻櫖旊櫪槶䮨劼⾬屆㘂極䷃୷仏Ἳ㋷熈૪᧯⯨晼⻲娱㗴摥湓᝷ᩏ㵼䫗䥝匋旈歶៖ⶺ宜㦲橄惫羶े汿嫓ⳓ䴌䗌民堑⹆彑㔢籹暫⳶燯⬠悫ᆉ栥႒毙堉ⴁᥩ喼法愚烺班⭺ᅑ䶄䚜威䯟杕䷦嬩㸓ⷵ廫岒㷍ᖸὔᦘ㬒稞䶦坏䱊ഃ怋㛵惃䩇漯⢺奛⊜ᴟ►易圛䰺宺㥔穥六㶆燏ᆿໞ庐᫻䘓㐃ᰜ᜾崽㳺欕曳∇෎㙸㻓⶛Ԓ⚢䵍埋⸼墝㸜棕畍ᳶ緌喊䋘ᶑ੿痁䭅堜ⷊ廅囊耕䤽㺷円燪䇔ᦑ⫥ᚾ獍枟䳁幢㴚硥憥ī梌檬⇞溛ᮎු⭂ஜ⿗᳣㰺笭砵≗彯⣾曾▇˹漚ᮤ៨濘庖卪㌵媳樷Ⓦ疺㇙劇櫱秣氃ᚤ㓬䬍㴦惮氻競䟵瞹⛘秒笔䷋௱ᬣགྷᤦ㪚籅嬋㡗縴䆿峛ঘ䴛㘀⯖栕ⶢ幕㌅∵庋ٷኌ♽䋒妞㴑滜䥪㚃⼴䥳㲆禊娋㞆ṍ泽ӛẛ棢稙ୋ晔ⶩ廗冲糥橅彗櫏ᵭ科◊䫳嘙⏎嘻ഡ尪偮㙭䉻ᔺᩏ⦏秚原嫼ⷬ䭣坢涠妱ㅫ㋕疋̶俌˽ਜ਼妛ᜂ斲寶㝻ⳅ徳㉚罥瑻ŗ疎拸䓐ⶉٽ⸅玌媺汮巓㚇⪕䬓䷶ⲏ佻㇒㯟囸ⷞ孛圕⴯ᡋ嗺撙䳻亷⪮䔎⣛榊峾旔瘓㞛⻯᳑㳶穆䯫囚㍗幾㧘仍⛤丂嵰匞ⵅ彛㌠ፑ濘㸇ょ结巙⥅圚䷸媯㚦❉厛㰄ᵭ਑憴硣戭ᓔঐ䛑ͦؽᔞ潨ቛ㳣☭櫻ẍ䄎绺㘯箖暯淰㰐睸球ᙝ✩䳎㈊勗倕�é䞅㫑ᔭ櫌ᣡะ㗇䐠嶨⤦ॆ䩌坹⣝ޚ㠩ᷚسᇩ汪冫╠俕ំ㚗䕔㋸Ǟ㖐⹇ḙෙЙ汿 ӌ璽堢ᆗぢ⧺׳悙㛢ך㬦ᇇ㩫岇㓤䉽梚㰬斈喪⦁垗ⲏ絠寘皁瀊Ƿ㫐烽溻㐤♭䗻榪玹͙ᶓ㶒䲙瀆墰⻉᫽涚䩢圌䭲组楯Ш☯㰜磝渚㟗㺆眕ᱛ崇亁Ͼ⏗寿窱坆怫▝潧怗㔮桍吺⤖∌ς᢬供縠ୂ凰ዬ主擯㱸歒〕䗶纊槼⟙䰴὞㶼笣⧫澇夒㚔ཝ叀戈ᑃ䘺❗⤼廣㸊ᰡ➇榵尣㬹ờ瘔༖঱篼㟐㐼Ⴃ挝┝皻涸敼ڢᲝ焛伖⠋禿毗౬㼛㷩箲桷汯夿㿾ಝ拪໣ďׁ濚ᆷ⼗㷾㬫礯湞焜ⵞ椊ማ祰 ⣬㏿岝䴛ؠⰌ䍙璐櫤㿕咾缁扦您塹̟彷ู䂄ᅣᚙ堣੠䯢┡栠Ѕ䜟眖祠䀍桗ᏵⰧҗ=尖�噬Ǧ
ޗরᰧ抭⮡扵呡籠⯣❽ᠼ℁㬏ᑀܹƬ燑ᓠ窀ᬣ付爯纱ᡛ厮⮾H槥丘䃑ϐ㣀籈ણ捠ီ㾑桛䀠愍缷ξ߬໸‛叻愸ᴠᤃ籫䉪⾢潹ℍȕϡމ⇠ᶰተ筚乣䤚⿅惈嗷梖᳿⅟λးཔ‗剐籨慂ᖧ᳑硂ႆႥ◇ヵ㖧ߞᵰᷴའ皈塣梧Ⱑ瘽ࡣ㢐҅戟䏑悶⠪≢ᬨ绎ኰ㐚嗠⏓ᔣ㢋粡熎综㒩๺ⴐ䜢ਏ㧰㈛Თ斎┧⒕㚳ᇮᲊ瑺⠼ऴ㦀䘗寣杌劮柸䔪咖柟❗Ἒ䝯皈烟寃䂛ᢐۀ㘡籢瀢婯䐹筘弚䟌ᡑ⃌咤⎧∠⥑ジᴿ碡㼤瑨㈇穹䞔⥪ᩢᓼั䞼ⓧ␠ਠ櫦ⲟʎ制掼壀Ýᰌ㧲䍶ᄃ湔倠㤃昳䜰偂爑ወ䝞ႂ᲋㞨盁氎ᡠ䣡⯡岠Ⱙ斺爟剏䠒傘↚㐘焵มர曡䟠怢㤬倧Ԥᢗၥ倡ἃ∁఑瀃摂氠¿瑂ʞ戻Ṝ傐➰倘䍢㷛಩炲㹇祰 䣬ゲ㽷ک搳晇ᠠႿ⾇焫粬䧶刲⠒倠)䲅㊞┝佐Ꭼ➀俉ᾂ㷡䈠ᶳ囄噮䆱矻䫞ಪ塹㘰簷皀殔ℴ穏ߩ偣᪩犽Ṋ䪜唁ᤡ砷ÿⶨ液眦ᵁ὿㛧ᘌ搱ᙂ伀瘤㑂ᘳ⟶䁩愌⃔皉璶෇㉒糃曱࿕瓾ߌ䒇❧๼ႏ汁Ĵ焠⯇潮㦀䊤䉂ਢᕅ㗭�ė䈁㙞ః嵺ᾰ⭰ᾫ粧䪪ଢ捬Ⲉ峁俣ὧႧ䴹砒㩸࿤⢀廢⚔࢑*㎼ᡕカḲ⍌秙ᦹᲣ❉द兞৏䐲ᬶ㈫吜事愳ዐ捹烀欀欐≮Რ皕ᾞ糯㏇ၵ乂厲∾ܠᥠ៧ⓑ䩣歘ᠨ洞ὲ娞❽佑䑨䐌绞篓䬇暅᪂͙✈း᨞䊟㡑ᢧᵴ⋬盁浓䒇Ă䅣皥繫崎᧬഻杙ㆤͩ䒤⤙枼ఠ浘怠❘傯榽䑂發⢄ࣇᾩ惄ع紓暇嵁㾰彘ൢ紞⩃珇杉岀廞㵖ᧄओ卤ᏮȽ彞彩紉圯玹林傦無㽬礹猓䚀灏䊂哥捯̞⨠R┷㌹呼秦垥搫䈠ழ䝲䆝 ݶ孏ష礽஡咔⻈廱㿂焠ᆫ渷稠Ղ壙䀡挛丬㏬恔⾘崅䀠Џጌ捂䯡២⾸嶩㾂秥縃䮠᫐⩼ہ⦟ᔩ◷千ᜱ⠸嵑㸠狥獫咷屮Ⓚ䳝捤匐昌஫ฒ⽴戊㩍̅炲޷曑䊀໢ћ䬧旵厱堡⸦吙㡋ࠅᑀ怑࣎Ế◲䖔ὴႜ吺ÌŁ੅㰪箖Ջ䃴ᓏّ奈ᥔ࢔㨁㷾⢙⿞狎䎂狸୰ぇ刀࡫㋙窘⬀℺ʍ䛠ᆻ浿᷿仁ị繷慡ռ湁ᖜ⚼嘇ࡑ灊䔊峖�耉�同嬖憠櫘珑ᬄ㧵⯮埅⺚忎̀╕犡൷㽉Ű厔㗪䬔㒧伇ᠻ⾕ၪӨ猉欼\\䷏́⇦ᶐ᪬痡⏊瑅愺峮契־ୟŬ὘㝾ी㶝⛣嵘緎⭉属彋恭䅻ᑀ桐กվ扚熖ᚧ痾ϫ筌䅞廄㻤॒䠱晋㌸墡懞浠䜒ሟ毱㘥₡嵵㤦牅梙⒀⪘⹠䈢Ҝ吺ᨌⴧ⁠׍┶䉦疹Ի囜⵩哿懜㏯ᔫࡕ塭ᄞፁ࣓㤵 㽶៌㷹熣ܢ掖ᴇ෠௜㞼)屲Ɇ瞺Ⓕ溰㊎Ⲡ⧘仩ᐳ一犎㟘梵巓㧙ᵒᐢⵉ␁㝽፲殘㸨ㅑዡ㞉䆥张㧍䈭悶㌠⽁⼚䝄ᝋ樨婞寪႑拕ቛ㧶縰䉵㲧ধ搀㷙玬㜎I寕޻塑幀ǽ䪋ྻ䅌⫈ᯠᗚ怤水筑䣸瞷夫䐞ᥭ撽汝㗇㱖ᾪ叜垩矄瘝硤寙̍䴫䟤कŠ熗䂈↿⬦Ƒ䴊ᨎ䢝䡂䂇ᷮ㺌窌രⶰㆮ瀠ẅਦ嘤◧ၱ†Dအ⨇⠦搯ᓏ犔Ѱ榠ַ䀚䫡猎ᅳ粻碠柝ⲙ⼀䗥琈枕瀙䮝ಎ烙秛传圏嶠㯚瞐̇帟㯡矣漂犯㾾繽架ؗ⨎ᳫ焦瘩眅廲ቛ睍ᩆᵏ㤢獽羈ᬗ܏殭ᯛ垑搯㸆ᢣ矠ຯ尯㾎窝斾㨗̡矾⑞䄚愞縍割睰ṳ䛺⃎羥縛儷济㯿埘㚓缋㷿篖砛溪⇈㤡犝惰ᨗㆉ栳悙䄜䈝槖灆傭丑ǂ摾皣竛䘯渎㙣ゝ些䈘呞ޠ྽溨㰨㥁瘣沧䐯ਿౝ㺄䢔戕䇺ᘤဈ䏤㲑š翁ഓ欯嘎彂㢜澓戋牟簖瞠Ḥ㳹ȱ瑝摧俼䠾㉞⒚糤㒵䈓ↆ匪ཝ扯Б䤔沤ᰗᔿ㗽咞羔洏϶䞢࿚Ί広๞籃撛墯㼜䘢⑚多⦢䠶ၦG⣝ᭊ©甑䮈榧ᆹ慞⊘᪐儦ᐒ⟺晻䣲㷤碐⩈ፇ副沿渼䖕ྛ䨈畞⟈倃䴒㻤祚䗩သ偣绦☾呙ݯ沜崰熹ㆽ䝙䟴翉䣳敆ᶂ篜獧嬼呫ױ委฾㠩ṵࢬ紨≓紕୔㟃㷤⽵䴑બ㏣ங侗⋚ᣌ箖࿈缢⾑؃㪽㪘碗ᆧ㏪⟨厜䚭ᶗጔ炈ڛ搠䮮⧙絘崐弪琑ዅ侓旮㷠ә稼⌋䯯㞿Ǥ翿‥稗ⷧ綘ޟὦ㾔秸䬡样楌み睞䎭ᙧ熪夶傐⿉䶁㾊ܥ磓搷䨴⑿烝↞㮑䦣௰៭搨平㠪ť烳羇䢔≾壜絟ጚ弡珫抛⠅⥥ǿݔ簥㫰㵏䙿՟㖕繨⸹䯨桶⿊ᖶ᧲箰磫桒⩰ɠᖡㄢ崙氩❌篝ᢴ䅙䦪碵畋砷楏ᒹ㋞䖜瀮ᘊ奄垮爩䡥㵁惵盖具烏㥾č䕝纪嘜༔⹇佐ক㶩旦事炣彐捾儒䫛ޥ瓾氈኷⽭䬞慺綬䎋揷煔坾⻽綞㬐ฉṗ䊗⽁庤Ⓠ炭羙ಭ⢩呿䫜䐆ܛฒ䉽堄潗ಈ┺筵穮䃠ನ㗔繊ℰ䜙㺯ᰗ゘侈徎愶禌ɻ簸媏❿䗟ధ朒䥢ᯥг⾭᪅㼦禍瓋棇壔曾倣㱾᤻渆෬㟈侥忳㶶籭焍沗仏❿㇟㿦ܘ㒭䶉垰ԓ廰⍢⼕繻撴ҏ׿叟㎞漕三ܣ㜃撦禣㱭̆㨠߷擀ࣿ⟜瞘Ἕ㸟㰕泿磻ٌ㑦秘岴撷瞏ᄈ⿞ᾝ䰃ᔘᰋ矷⁄䣭䗆ć悋筷埆澂䕤ᖛȐ七篪☨ὀ㻕㴂ᷦ伧樯嗁懨ᣝ技戞昗ᯗᩌῗ䡐粲○ᥕ՗ܐ栱增㮕繪␟唶削Ἷ⋌⅕⊿㙼縗䝏わ扎⿹㭐ᚪ^劖㴟Ὃ⭖̃犾唂猿ᱞ惾ࡦ爐ާ樟ထῼ㯥僠樃畞炤⽶祟撜ᤕ繯搉⟤俵咪㼤绷夬י᭰ܨ刮 生ᙨ㐋寫ྰ瑆㸬繿ф䖇歰ᦿ䉞ᦑ䲀漤琅⟷⽪ἴ䅼糱紓畓滉ȀⱠ欕秷稘఍栒὿摰怢粫榷ⰷ橏徴ᣞ撜嗷䘝␘⟥࿑㐱㽈䍱稿Ⓑ溯瓨ࣞ屈Ὶ㖒ㄯ៼炅ޜ๗㳥⠓羷穏氰絨▜䟷稚琑៭⿏Ὁ㽴緅碋煓棽ݿ塼熜欝䳨ᣩ埼`㩫ᤦᣡ磓犳ɏ罿斶ᾪ✙ฒ㝺㈩俈琱⽁੍窪竷緯壔嗞᣼ۂ渕⶷爖玫෸ėᶤ恕ש琳䢷囮⡿匥娭爬ᕌ㏬⃺Ἠ䀒㩛箙着䯿᳐䞜༚љ簛⨫婓彇怠幽粐畤܏䏐㯟⦃͜㸝爚◮�朣⢞粝羛耑椿䧔翟㷂炠皒㔴ဃ墛怆惜䀐纛犯渳篿Ѯ焝ᅘ␚梭࿥濬㿷㺂㄃碧緊ਿ䅟ᢟ䢽戚橪栁ᨍ娥硿䀗沩✇簗攏䞈⪟Ĝ標З⠜࿣砧怘纠㶫∿హ眺᳟筰崞埣ᐒ䷮】瀈峇㿱᾽礷矱ି磟彀ഝ☛焓᠄ᵚ忷徴䏭群ፄ࣏慯愘纟簃؞�ࠟ」濣㾲缑粻篱瓕ۿ䏟䦉㼜嘚Ⱏ␀“偵㼶᩷抧磷砖୿敇璞羱瘝吖砉氻ῆ㿆繲で禠ۯ眺ڟ篮ボ烁䢧ᑇ俲矉攖ệ㡕㳯灏獿僟涞ğḝఐ〻࿤忨㿲翝翂翯繿繿扣匞؞䐚ࠐⶻ忧㿂羍徼慸筏硿機䑤欟㈟⨘⠖᠉῿䢆罾繻ᰯ缿熏磨椟἟᨞㨚墥㈈䀕ᆱ耖ṇ緥䊗盁旿抟ゟ漞᠙検栗߱䁮罂ܯ縗絨㢟澟䭳ۈ〞Ⱎ䠕‛䧬考标耉綄ſ祝磣笏篿笄ઠ՟礊䆫૟磸礗䃷䄿砭䂿砨㦿积硿筇穓磗簒㧓ঠٲ஀٠ހӠ֛㫜䀰ڟ穯穖ŀӹÀї砻筇礠ݣ笞₰٥㏠ޏ筬䋟ᡷ穂掐殐@Ճ䁰҃端筰߯竅䂀Տ磣秐Ԁܹন٠֨ذٟ㪜⊐֏窰ܿ磷秧祰ٗ穿称ӿ禫⍨׏穻寨܇禗ም⌗箣椏ț竃筈ܟ祽竀Р҈ׇ祺∸ߐѽ㯸Ӑت兘Өص笚㫘وـ޸܋稟祸՗磸ۗ筊劘ܝ₸Ӌ筘ӑ䊐˻秗楤ڸ؝礘׷簐׈߀ܻ筿竸ܻዤا祛檄Ը۬ᄄшڛ橦Ż穳硄ڿ篷筄я笨ׄԤӨ各և筏槴Ѥۨ㪪ǘ׽㩀͔ސԹ䌐ߧ稘Ш׀܃笏㭴ࠒ㢔Ԉج᥈㥔ެ۔Ն傔ڔࠝ䎔ۈӰٴۄܠܞ⃬ڬو㧨㰈Ҍᬳ㬣砸Ŭҟ刘㭫㥱ˬӧ礟笘ٸؔݸմӌ֫∼܌ިљℌҺ䁤׼ݜࠌٶ勜߆Ǔ篤ݯ箼܌ѴԻ窛礬ӣ窜ܼќݙ䊢،ѤҽሬϜӂ僢֐֘Ԑڴ݀޴ٌԨ݌ׅ߰祸㮢ե䁂ߐۍ㯒ˢעջ儂Ҽޟ礋穄ܔТؠݼւҧ␂ߴӡ剒ѤԲ㢲נ凒Ղ֔Ԙ׷㡌بқ稬Ӽҧ⊒ز₪ܲ㦧礤᧒޲ްԒ֜䈒ࠔآت߲ӄ慪ߌۡ䋊ԅ䍒㯒ڱ憊֒׬۪ӗ㯪ռڂڈҧ⌊ز⎺Ӓ㡪ܓ硈䆊ݪ߀̫笒ׂࠒӇ窀ӣ秺׊ܞ䂚ٔ䁫提䊐䎐䆆ͱ䆣䐜揿ʽ͋ɜ䅙䃱̌䆁Ā䉸䁫拟ᡍ㥒¯ጛጪ:妞㣖牛悗͇uˇǫŃȗÔ Ť�̆珷ȯˮ㪉ʄᠣ磨ͰíĴƚɲ刟⃙âރ͂㠰̲q憀ͦضƱ̀䎀Ͱ�ࠑČ䎐笞DŽ䋳Ƃ⁛憯ʬ˟Ϸ㤮Ѥॉၛ抧㠬݊˼抈˴䌔爣窠㧟ʶ䌮͋HßΎݴ䎱Ȏ߲Ƞ䆆₩儫愢䁈䅰Է折ňȮրß偪⁛悌㪘Ș^چΖїĘȖܴ�ص�ぎҟĶ䄟Îڪǎר䂎ݛ禎֎䊝¾ْȾݓ͉Ǡ䐎܀䊙ξҎؠᏎҸ䌃ᄪ˦֚�ʁ͖ࠈ㫖ހȤǖӮӉ̖¨䈖Юӱ䌖ưʾݬ䋡䂥Ǹ䌖Δ㧦ݨͰqבܑࠟͮҧ㭤䇾ݨЖٱֺϑԩݨ̴͂㯾߱Հ̰ȴȖߞשٗɉո䋡䂛)ґצ׃φ­ʢᇵ炧㨀䇤砹ߨうƥ䂎ϳ⇉Ւoě᭯�䊫ʁ愠  "}
      

    The complete round-trip took 48.8 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":6}},"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-7915-06J066XTvHzk-.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-7915-06J066XTvHzk-.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-7915-06J066XTvHzk-.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-7915-06J066XTvHzk-.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-7915-06J066XTvHzk-.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-7915-06J066XTvHzk-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7915-06J066XTvHzk-.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":131,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7915-06J066XTvHzk-.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": 1
            }
          }
        }
      }

    The complete round-trip took 13.0 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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[1,9,1,14],"additionalTokens":[],"id":2,"parent":3,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[1,1,1,15],"additionalTokens":[],"id":3,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[2,9,2,13],"additionalTokens":[],"id":6,"parent":7,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[2,1,2,14],"additionalTokens":[],"id":7,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[3,9,3,13],"additionalTokens":[],"id":10,"parent":11,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[3,1,3,14],"additionalTokens":[],"id":11,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[6,18,6,27],"additionalTokens":[],"id":15,"parent":16,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[6,9,6,28],"additionalTokens":[],"id":16,"parent":17,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[7,19,7,29],"additionalTokens":[],"id":21,"parent":22,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[7,10,7,30],"additionalTokens":[],"id":22,"parent":23,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[7,1,7,30],"additionalTokens":[],"id":23,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[9,16,9,16],"additionalTokens":[],"id":28,"parent":29,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":29,"parent":30,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[9,11,9,16],"additionalTokens":[],"id":30,"parent":31,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[9,6,9,17],"additionalTokens":[],"id":31,"parent":32,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"binop-rhs"}},"operator":"<-","lexeme":"<-","info":{"fullRange":[9,1,9,17],"additionalTokens":[],"id":32,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[10,7,10,7],"additionalTokens":[],"id":35,"parent":36,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[10,1,10,8],"additionalTokens":[],"id":36,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"lexeme":"data","info":{"id":39,"parent":52,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[13,20,13,20],"additionalTokens":[],"id":44,"parent":48,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[13,27,13,27],"additionalTokens":[],"id":47,"parent":48,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":48,"parent":49,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[13,16,13,32],"additionalTokens":[],"id":49,"parent":50,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[13,9,13,33],"additionalTokens":[],"id":50,"parent":51,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"lexeme":"ggplot","info":{"id":51,"parent":52,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":2,"role":"call-argument"}}],"info":{"additionalTokens":[],"id":52,"parent":55,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"arguments":[],"info":{"fullRange":[14,9,14,20],"additionalTokens":[],"id":54,"parent":55,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"binop-rhs"}},"operator":"+","lexeme":"+","info":{"fullRange":[12,1,14,20],"additionalTokens":[],"id":55,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[16,12,16,12],"additionalTokens":[],"id":59,"parent":60,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":60,"parent":61,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,6,16,12],"additionalTokens":[],"id":61,"parent":67,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[16,21,16,21],"additionalTokens":[],"id":64,"parent":65,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":65,"parent":66,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[16,15,16,21],"additionalTokens":[],"id":66,"parent":67,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[16,1,16,22],"additionalTokens":[],"id":67,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[17,14,17,14],"additionalTokens":[],"id":71,"parent":72,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":72,"parent":73,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,8,17,14],"additionalTokens":[],"id":73,"parent":79,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[17,23,17,23],"additionalTokens":[],"id":76,"parent":77,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":77,"parent":78,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[17,17,17,23],"additionalTokens":[],"id":78,"parent":79,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":2,"role":"call-argument"}}],"info":{"fullRange":[17,1,17,24],"additionalTokens":[],"id":79,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.R"}},"info":{"fullRange":[19,18,19,18],"additionalTokens":[],"id":84,"parent":85,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"index-access"}}],"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":85,"parent":86,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,12,19,18],"additionalTokens":[],"id":86,"parent":87,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":87,"parent":88,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":0,"role":"arg-value"}},"info":{"fullRange":[19,7,19,19],"additionalTokens":[],"id":88,"parent":89,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":1,"role":"call-argument"}}],"info":{"fullRange":[19,1,19,20],"additionalTokens":[],"id":89,"parent":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.R","index":10,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":90,"nesting":0,"file":"/tmp/tmp-7915-GBFnBEM4SWaK-.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-7915-GBFnBEM4SWaK-.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":6}}}}
      
    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.1 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-7915-1yPGN2sLTjI2-.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-7915-1yPGN2sLTjI2-.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-7915-1yPGN2sLTjI2-.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-7915-1yPGN2sLTjI2-.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-7915-1yPGN2sLTjI2-.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-7915-1yPGN2sLTjI2-.R","index":1,"role":"expr-list-child"}}],"info":{"additionalTokens":[],"id":6,"nesting":0,"file":"/tmp/tmp-7915-1yPGN2sLTjI2-.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":256,"parent":"<BuiltInEnvironment>","memory":[["x",[{"nodeId":0,"name":"x","type":4,"definedAt":2,"value":[1]}]]]},"level":0},"graph":{"_sourced":["/tmp/tmp-7915-1yPGN2sLTjI2-.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.0 ms (including time required to validate the messages, start, and stop the internal mock server).


    Message schema (request-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] The type of the message. Allows only the values: 'request-lineage'
      • id string [optional] If you give the id, the response will be sent to the client with the same id.
      • filetoken string [required] The filetoken of the file/data retrieved from the analysis request.
      • criterion string [required] The criterion to start the lineage from.
    Message schema (response-lineage)

    For the definition of the hello message, please see it's implementation at ./src/cli/repl/server/messages/message-lineage.ts.

    • . object
      • type string [required] Allows only the values: 'response-lineage'
      • id string [optional] The id of the message, will be the same for the request.
      • lineage array [required] The lineage of the given criterion. Valid item types:
        • . string

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

Clone this wiki locally