summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/wyrd_v1/computation/_index.md125
-rw-r--r--content/wyrd_v1/input/_index.md68
-rw-r--r--content/wyrd_v1/instruction_result/_index.md35
-rw-r--r--content/wyrd_v1/value/_index.md15
-rwxr-xr-xdia/wyrd_values.drawio1
-rwxr-xr-xstatic/images/wyrd_values.drawio.svg4
6 files changed, 240 insertions, 8 deletions
diff --git a/content/wyrd_v1/computation/_index.md b/content/wyrd_v1/computation/_index.md
index d0462a0..af00546 100644
--- a/content/wyrd_v1/computation/_index.md
+++ b/content/wyrd_v1/computation/_index.md
@@ -5,6 +5,7 @@ weight: 3
---
This page presents all the `<Computation>`s that can be performed in Wyrd.
`<Computation>`s do not modify the memory, but they always return a `<Value>`.
+Be careful not to modify the memory through reference when computing values.
**Shortcut to each `<Computation>`:**
* [`(add_text_effect {name: String} {parameters: <Computation> List} {values: <Computation> list})`](#add_text_effect)
@@ -103,77 +104,195 @@ The following conversions are expected to be available:
### constant
`(constant {type: String} {value: String})`
+Constant value.
+
**Parameters:**
+* `type` is a `{String}` indicating the type the other parameter should be
+ converted to.
+* `value` is a `{String}` representation of the value that should be returned.
**Process:**
+* Parse the value of `value` according to `type`.
+* Return the corresponding `<Value>`.
+
+**Notes:**
+The `type` parameter can take the following values: `"string"`, `"float"`,
+ `"int"`, and `"bool"`.
### get_allocable_address
`(get_allocable_address)`
+Get an allocable address.
+
**Process:**
+* Return an `<PointerValue>` corresponding to an unused address.
+
+**Notes:**
+Process when using the suggested `<State>` definition:
+* If the `<State>`'s `freed_addresses` collection has elements, return a
+`<PointerValue>` corresponding to one of its elements.
+* Otherwise, create a string `addr` corresponding to `".alloc."` to which the
+ `<State>`'s `allocated_data` integer has been added then return a new
+ `<PointerValue>` with a singleton list containing `addr`.
+As a reminder, `<State>` is not modified by the procedure.
### if_else
`(if_else <condition: Computation> <if_true: Computation> <if_false: Computation>)`
**Parameters:**
+* `condition` is a `<Computation>` that will indicate which other computation to
+ consider.
+* `if_true` is a `<Computation>` that will be considered only if the `condition`
+ is verified.
+* `if_false` is a `<Computation>` that will be considered only if the `condition`
+ is not verified.
**Process:**
+* Compute the `<BoolValue>` resulting from `condition`.
+* Interpret this `<BoolValue>` as a `{Boolean}`.
+* If it yielded `TRUE`, compute and return the `<Value>` resulting from
+ `if_true`, otherwise, compute and return the `<Value>` resulting from
+ `if_false`.
### last_choice_index
`(last_choice_index)`
+Get the index of the user's last chosen option.
+
**Process:**
+* Return an `<IntValue>` corresponding to the `<State>`'s `last_choice_index`.
### newline
`(newline)`
+Return a newline value.
+
**Process:**
+* Return a `<TextValue>` corresponding to a newline.
### Unary operation
`(operation {operator: String} <x: Computation>)`
-**Parameters:**
-
-**Process:**
+Interpret as `(operation operator x (BoolValue FALSE))`. It is recommended to
+have the parser do that conversion automatically.
### operation
`(operation {operator: String} <x: Computation> <y: Computation>)`
+Performs a basic operation.
+
**Parameters:**
+* `operator` is the name of the operation.
+* `x` is the first operand.
+* `y` is the second operand.
**Process:**
+* Compute `<val_x: Value>` and `<val_y: Value>`, the `<Values>` corresponding to
+ `x` and `y`, respectively.
+* See the *Notes* below for which operators are expected.
+* Return the result of the operation.
+
+**Notes:**
+`val_x` and `val_y` always have the same type. If the returned value is a
+number, it has the same type as `val_x` and `val_y`. Number types are
+`<FloatValue>` and `<IntValue>`. Comparable types are `<FloatType>`,
+`<IntValue>`, `<StringType>`, `<BoolType>`, and `<PointerType>`.
+
+*Operands are numbers, returns number*:
+* `divide`, returning the value corresponding to `val_x` divided by `val_y`.
+ This is an integer division if and only if `val_x` is an integer.
+* `minus`, returning the value corresponding to `val_x` minus `val_y`.
+* `plus`, returning the value corresponding to `val_x` plus `val_y`.
+* `power`, returning the value corresponding to `val_x` to the power `val_y`.
+* `times`, returning the value corresponding to `val_x` times `val_y`.
+
+*Operands are `<IntValue>`s, returns `<IntValue>`:*
+* `modulo`, returning the value corresponding to `val_x` modulo `val_y`.
+
+*Operands are `<BoolValue>`s, returns `<BoolValue>`:*
+* `and`, returning `(BoolValue TRUE)` if both `val_x` and `val_y` are
+ `(BoolValue TRUE)`, `(BoolValue FALSE)` otherwise. Do not evaluate `val_y` if
+ `val_x` yielded `(BoolBalue FALSE)` (lazy evaluation).
+* `not`, returning `(BoolValue TRUE)` if `val_x` is `(BoolValue FALSE)`.
+ Otherwise, return `(BoolValue FALSE)`.
+
+*Operands are comparable, returns `<BoolValue>`:*
+* `less_than` returning `(BoolValue TRUE)` if `val_x` is less than `val_y` and
+ `(BoolType FALSE)` otherwise. `(BoolType FALSE)` is less than
+ `(BoolType TRUE)`. `<PointerValue>`s can be compared by comparing the strings
+ corresponding to having joined all elements in their respective string lists.
+
+*Operands can be any type, returns `<BoolValue>`:*
+* `equals` returns `(BoolValue TRUE)` if `val_x` has the same value as `val_y`,
+ `(BoolType FALSE)` otherwise. Be sure to compare values and not identity
+ (value vs reference).
### relative_address
`(relative_address <target: Computation> <extra: Computation>)`
+Appends to an address.
+
**Parameters:**
+* `target` is a `<Computation>` that will yield the base address to extend.
+* `extra` is a `<Computation>` corresponding to the `<StringValue>` element to
+ add to the address.
**Process:**
+* Compute the `<PointerValue>` corresponding to `target`.
+* Compute the `<StringValue>` corresponding to `extra`.
+* Return a new `<PointerValue>` corresponding to the previous `<PointerValue>`,
+ but with its list of strings now having been extended by the addition of the
+ string equivalent to that `<StringValue>`.
### size
`(size <target: Computation>)`
+Computes the size of a list.
+
**Parameters:**
+* `target` is a `<Computation>` that will yield a `<PointerValue>` pointing to
+ a `<ListValue>`.
**Process:**
+* Compute the `<PointerValue>` yielded by `target`.
+* Return a new `<IntValue>` corresponding to the number of elements in the
+ `<ListValue>` pointed to by that `<PointerValue>`.
### text
`(text {values: <Computation> List})`
+Merges a list of text values into a single one.
+
**Parameters:**
+* `values` is a list of `<Computation>`s that will yield `<TextValue>`s.
**Process:**
+* Compute the `<Value>` corresponding ot each element of `values`.
+* Return a new `<TextValue>` corresponding to these `<Values>` appended one
+ after the next.
### value_of
`(value_of <target: Computation>)`
+Retries the value from memory.
+
**Parameters:**
+* `target` is a `<Computation>` that will yield the address of the memory
+ element to get the value of.
**Process:**
+* Compute the value of `target`.
+* Return the `<Value>` pointed to by `target` in the `<State>`'s `memory`.
### extra_computation
`({extra_computation} {parameters: <Computation> List})`
+Performs non-standard computation.
+
**Parameters:**
+* `extra_computation` is the name of the extra computation.
+* `parameters` is a list of parameters for this computation call.
**Process:**
+* Undetermined. This is where you choose the process according to the value of
+ `extra_computation` so that you can add non-standard computations.
diff --git a/content/wyrd_v1/input/_index.md b/content/wyrd_v1/input/_index.md
index d6bbc87..bc5b22f 100644
--- a/content/wyrd_v1/input/_index.md
+++ b/content/wyrd_v1/input/_index.md
@@ -3,3 +3,71 @@ menuTitle: <Input>
title: Input
weight: 6
---
+
+Following an `<Instruction>` having set the `<State>`'s
+`last_instruction_effect` to
+`(MUST_PROMPT_COMMAND <IntValue> <IntValue> <TextValue>)`,
+`(MUST_PROMPT_INTEGER <IntValue> <IntValue> <TextValue>)`,
+`(MUST_PROMPT_FLOAT <FloatValue> <FloatValue> <TextValue>)`,
+`(MUST_PROMPT_STRING <IntValue> <IntValue> <TextValue>)`,
+or `(MUST_INPUT_CHOICE)`, it is necessary
+for the user to provide an input prior to further `<Instruction>`s being
+executed. The information provided in the `<InstructionResult>` is expected
+to be sufficient for the interpreter to ensure the user input is valid.
+Providing invalid inputs to the `<State>` will result in undefined (and most
+likely problematic) behaviors.
+
+Thus, the `<State>` should expect to accept the following types of inputs:
+### An `{Integer}` prompt answer
+This follows a
+`(MUST_PROMPT_INTEGER <IntValue> <IntValue> <TextValue>)`
+`<InstructionResult>`.
+* Interpret the `<State>`'s `memorized_target` as a
+ `<PointerValue>` address.
+* Update the `<Value>` pointed to by this address in the `<State>`'s memory
+ so that it becomes an `<IntValue>` corresponding to the user's input.
+* Set the `<State>`'s `last_instruction_effect` to `(MUST_CONTINUE)`.
+* Proceed with the execution.
+
+### A `{Float}` prompt answer
+This follows a
+`(MUST_PROMPT_FLOAT <FloatValue> <FloatValue> <TextValue>)`
+`<InstructionResult>`.
+* Interpret the `<State>`'s `memorized_target` as a
+ `<PointerValue>` address.
+* Update the `<Value>` pointed to by this address in the `<State>`'s memory
+ so that it becomes an `<FloatValue>` corresponding to the user's input.
+* Set the `<State>`'s `last_instruction_effect` to `(MUST_CONTINUE)`.
+* Proceed with the execution.
+
+### A `{String}` prompt answer
+This follows a
+`(MUST_PROMPT_STRING <IntValue> <IntValue> <TextValue>)`
+`<InstructionResult>`.
+* Interpret the `<State>`'s `memorized_target` as a
+ `<PointerValue>` address.
+* Update the `<Value>` pointed to by this address in the `<State>`'s memory
+ so that it becomes an `<StringValue>` corresponding to the user's input.
+* Set the `<State>`'s `last_instruction_effect` to `(MUST_CONTINUE)`.
+* Proceed with the execution.
+
+### A `{{String} List}` prompt answer
+This follows a
+`(MUST_PROMPT_COMMAND <IntValue> <IntValue> <TextValue>)` `<InstructionResult>`.
+* Interpret the `<State>`'s `memorized_target` as a
+ `<PointerValue>` address.
+* Convert the user input to a `<ListValue>`: For each element of value
+`{s: String}` and index `{i: Integer}`, the `<ListValue>` contains
+`{{c_i: String} -> <c_s: StringValue>}` where `c_i` is a `{String}`
+corresponding to `i` and `c_s` a `<StringValue>` corresponding to `s`.
+* Update the `<Value>` pointed to by this address in the `<State>`'s memory
+ so that it becomes the aforementioned `<ListValue>`.
+* Set the `<State>`'s `last_instruction_effect` to `(MUST_CONTINUE)`.
+* Proceed with the execution.
+
+### An `{Integer}` choice answer
+This follows a `(MUST_INPUT_CHOICE)` `<InstructionResult>`.
+* Set the `<State>`'s `last_choice_index` to the input `{Integer}`.
+* Empty the `<State>`'s `available_options` list.
+* Set the `<State>`'s `last_instruction_effect` to `(MUST_CONTINUE)`.
+* Proceed with the execution.
diff --git a/content/wyrd_v1/instruction_result/_index.md b/content/wyrd_v1/instruction_result/_index.md
index b77b496..ac585fc 100644
--- a/content/wyrd_v1/instruction_result/_index.md
+++ b/content/wyrd_v1/instruction_result/_index.md
@@ -3,3 +3,38 @@ menuTitle: <InstructionResult>
title: Instruction Result
weight: 5
---
+Following the execution of an `<Instruction>`, the `<State>` will see its
+`last_instruction_effect` be set to one of the following values:
+
+* `(MUST_CONTINUE)`, indicating that the next `<Instruction>` should be
+ executed.
+* `(MUST_END)`, indicating that the story has ended. No further `<Instruction>`s
+ should be executed.
+* `(MUST_PROMPT_COMMAND <min: IntValue> <max: IntValue> <msg: TextValue>)`,
+ indicating that an input should be given before executing further
+ `<Instruction>`s. In this case, the execution should be done only after the
+ user has seen `msg` and input a command (space separated list of strings)
+ totaling between `min` and `max` characters (spaces included).
+* `(MUST_PROMPT_FLOAT <min: FloatValue> <max: FloatValue> <msg: TextValue>))`,
+ indicating that an input should be given before executing further
+ `<Instruction>`s. In this case, the execution should be done only after the
+ user has seen `msg` and input a float value included between `min` and `max`.
+* `(MUST_PROMPT_INTEGER <min: IntValue> <max: IntValue> <msg: TextValue>))`,
+ indicating that an input should be given before executing further
+ `<Instruction>`s. In this case, the execution should be done only after the
+ user has seen `msg` and input an integer value included between `min` and
+ `max`.
+* `(MUST_PROMPT_STRING <min: IntValue> <max: IntValue> <msg: TextValue>)`
+ indicating that an input should be given before executing further
+ `<Instruction>`s. In this case, the execution should be done only after the
+ user has seen `msg` and input a string totaling between `min` and `max`
+ characters.
+* `(MUST_PROMPT_CHOICE)`
+ indicating that an input should be given before executing further
+ `<Instruction>`s. In this case, the execution should be done only after the
+ user has chosen an option between the ones listed in the `<State>`'s
+ `available_options`.
+* `(MUST_DISPLAY <msg: TextValue>)`, indicating that `msg` should be displayed
+ before further `<Instruction>`s are executed.
+* `(MUST_DISPLAY_ERROR <msg: TextValue>)`, indicating that `msg` should be
+ displayed as an error message before further `<Instruction>`s are executed.
diff --git a/content/wyrd_v1/value/_index.md b/content/wyrd_v1/value/_index.md
index 18e2a6a..8ff8290 100644
--- a/content/wyrd_v1/value/_index.md
+++ b/content/wyrd_v1/value/_index.md
@@ -4,8 +4,13 @@ title: Value
weight: 4
---
-`{Integer}` and `{Float}` are meant to represent the largest available integer
-and float point value types available in the interpreter's language. This is not
-mandatory, but be especially wary of using too small a type for `{Integer}`, as
-the `<State>` `program_counter` value will need to be able to be as big as there
-are instructions in the program.
+This page describes the types of values used in Wyrd.
+
+Note that `{Integer}` and `{Float}` are meant to represent the largest available
+integer and float point value types available in the interpreter's language.
+This is not mandatory, but be especially wary of using too small a type for
+`{Integer}`, as the `<State>` `program_counter` value will need to be able to
+be as big as there are instructions in the program.
+
+{{< svg "static/images/wyrd_values.drawio.svg" "500px" >}}
+
diff --git a/dia/wyrd_values.drawio b/dia/wyrd_values.drawio
new file mode 100755
index 0000000..40c2625
--- /dev/null
+++ b/dia/wyrd_values.drawio
@@ -0,0 +1 @@
+<mxfile host="app.diagrams.net" modified="2022-01-15T20:04:12.837Z" agent="5.0 (Windows)" etag="zi69fXxea7NdB_Tgz48n" version="16.2.7" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile> \ No newline at end of file
diff --git a/static/images/wyrd_values.drawio.svg b/static/images/wyrd_values.drawio.svg
new file mode 100755
index 0000000..2d00a62
--- /dev/null
+++ b/static/images/wyrd_values.drawio.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Do not edit this file with editors other than diagrams.net -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="341px" height="1132px" viewBox="-0.5 -0.5 341 1132" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2022-01-15T20:04:44.428Z&quot; agent=&quot;5.0 (Windows)&quot; etag=&quot;PlZJd1fJY488qEB62zIS&quot; version=&quot;16.2.7&quot; type=&quot;device&quot;&gt;&lt;diagram id=&quot;C5RBs43oDa-KdzZeNtuy&quot; name=&quot;Page-1&quot;&gt;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&lt;/diagram&gt;&lt;/mxfile&gt;"><defs><clipPath id="mx-clip-184-111-152-26-0"><rect x="184" y="111" width="152" height="26"/></clipPath><clipPath id="mx-clip-184-211-152-24-0"><rect x="184" y="211" width="152" height="24"/></clipPath><clipPath id="mx-clip-184-311-152-24-0"><rect x="184" y="311" width="152" height="24"/></clipPath><clipPath id="mx-clip-184-411-152-24-0"><rect x="184" y="411" width="152" height="24"/></clipPath><clipPath id="mx-clip-184-511-152-24-0"><rect x="184" y="511" width="152" height="24"/></clipPath><clipPath id="mx-clip-184-611-152-24-0"><rect x="184" y="611" width="152" height="24"/></clipPath><clipPath id="mx-clip-184-711-152-24-0"><rect x="184" y="711" width="152" height="24"/></clipPath><clipPath id="mx-clip-4-1071-192-54-0"><rect x="4" y="1071" width="192" height="54"/></clipPath><clipPath id="mx-clip-174-971-152-24-0"><rect x="174" y="971" width="152" height="24"/></clipPath></defs><g><path d="M 20 26 L 20 0 L 180 0 L 180 26" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="all"/><path d="M 20 26 L 20 40 L 180 40 L 180 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 20 26 L 180 26" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-style="italic" pointer-events="none" text-anchor="middle" font-size="12px"><text x="99.5" y="17.5">&lt;Value&gt;</text></g><path d="M 180 106 L 180 80 L 340 80 L 340 106" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 106 L 180 140 L 340 140 L 340 106" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 106 L 340 106" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="97.5">&lt;BoolValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-111-152-26-0)" font-size="12px"><text x="185.5" y="123.5">value: {Boolean}</text></g><path d="M 180 136 L 340 136" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 206 L 180 180 L 340 180 L 340 206" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 206 L 180 240 L 340 240 L 340 206" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 206 L 340 206" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="197.5">&lt;FloatValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-211-152-24-0)" font-size="12px"><text x="185.5" y="223.5">value: {Float}</text></g><path d="M 180 234 L 340 234" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 180 L 260 160 L 100 160 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 80 L 260 60 L 100 60 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 306 L 180 280 L 340 280 L 340 306" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 306 L 180 340 L 340 340 L 340 306" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 306 L 340 306" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="297.5">&lt;IntValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-311-152-24-0)" font-size="12px"><text x="185.5" y="323.5">value: {Integer}</text></g><path d="M 180 334 L 340 334" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 280 L 260 260 L 100 260 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 406 L 180 380 L 340 380 L 340 406" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 406 L 180 440 L 340 440 L 340 406" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 406 L 340 406" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="397.5">&lt;StringValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-411-152-24-0)" font-size="12px"><text x="185.5" y="423.5">value: {String}</text></g><path d="M 180 434 L 340 434" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 380 L 260 360 L 100 360 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 506 L 180 480 L 340 480 L 340 506" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 506 L 180 540 L 340 540 L 340 506" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 506 L 340 506" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="497.5">&lt;ListValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-511-152-24-0)" font-size="12px"><text x="185.5" y="523.5">value: {{String} -&gt; &lt;Value&gt;}</text></g><path d="M 180 534 L 340 534" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 480 L 260 460 L 100 460 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 606 L 180 580 L 340 580 L 340 606" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 606 L 180 640 L 340 640 L 340 606" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 606 L 340 606" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="597.5">&lt;PointerValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-611-152-24-0)" font-size="12px"><text x="185.5" y="623.5">value: {{String} List}</text></g><path d="M 180 634 L 340 634" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 580 L 260 560 L 100 560 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 706 L 180 680 L 340 680 L 340 706" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 706 L 180 740 L 340 740 L 340 706" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 180 706 L 340 706" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="259.5" y="697.5">&lt;StructureValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-184-711-152-24-0)" font-size="12px"><text x="185.5" y="723.5">value: {{String} -&gt; &lt;Value&gt;}</text></g><path d="M 180 734 L 340 734" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 260 680 L 260 660 L 100 660 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 780 L 100 760 L 100 52.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 41.12 L 105.5 52.12 L 94.5 52.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 20 806 L 20 780 L 180 780 L 180 806" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 20 806 L 20 820 L 180 820 L 180 806" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 20 806 L 180 806" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" font-style="italic" pointer-events="none" text-anchor="middle" font-size="12px"><text x="99.5" y="797.5">&lt;TextValue&gt;</text></g><path d="M 0 1066 L 0 1040 L 200 1040 L 200 1066" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 1066 L 0 1130 L 200 1130 L 200 1066" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 0 1066 L 200 1066" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="99.5" y="1057.5">&lt;AugmentedTextValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-4-1071-192-54-0)" font-size="12px"><text x="5.5" y="1083.5">content: {&lt;TextValue&gt; List}</text><text x="5.5" y="1097.5">effect_name: {String}</text><text x="5.5" y="1111.5">effect_parameters: {&lt;Value&gt; List}</text></g><path d="M 0 1125 L 200 1125" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 1040 L 100 930 L 100 832.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 821.12 L 105.5 832.12 L 94.5 832.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 886 L 170 860 L 330 860 L 330 886" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 886 L 170 900 L 330 900 L 330 886" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 886 L 330 886" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="249.5" y="877.5">&lt;NewlineTextValue&gt;</text></g><path d="M 170 891 L 330 891" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 250 860 L 250 840 L 100 840 L 100 832.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 821.12 L 105.5 832.12 L 94.5 832.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 966 L 170 940 L 330 940 L 330 966" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 966 L 170 1000 L 330 1000 L 330 966" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 170 966 L 330 966" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" text-anchor="middle" font-size="12px"><text x="249.5" y="957.5">&lt;StringTextValue&gt;</text></g><g fill="rgb(0, 0, 0)" font-family="Helvetica" pointer-events="none" clip-path="url(#mx-clip-174-971-152-24-0)" font-size="12px"><text x="175.5" y="983.5">value: {String}</text></g><path d="M 170 994 L 330 994" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 250 940 L 250 920 L 100 920 L 100 832.12" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 100 821.12 L 105.5 832.12 L 94.5 832.12 Z" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/></g></svg> \ No newline at end of file