diff --git a/.claude/settings.local.json b/.claude/settings.local.json index a7dc979..379c3de 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -15,7 +15,9 @@ "Bash(unzip:*)", "Bash(do sed -i '' '/^\\*Next:/d' \"$file\")", "Bash(git add:*)", - "Bash(git commit:*)" + "Bash(git commit:*)", + "Bash(gh pr create:*)", + "Bash(gh repo view:*)" ], "deny": [], "ask": [] diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a604055 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "colvmn"] + path = colvmn + url = https://github.com/stevedekorte/colvmn.git diff --git a/00-preface.md b/00-preface.md deleted file mode 100644 index 7a21771..0000000 --- a/00-preface.md +++ /dev/null @@ -1,108 +0,0 @@ -# Preface: Why Io? - -In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer. - -## The Value of Alternative Paradigms - -Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you're writing Java, C#, Python, or Ruby, you're likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought. - -Io offers something different: a pure prototype-based object system where these familiar distinctions dissolve. There are no classes, only objects. There is no separation between data and behavior. Everything—including control structures and operators—is accomplished through message passing between objects. - -Consider this simple comparison. In Python, you might write: - -```python -class Dog: - def __init__(self, name): - self.name = name - - def bark(self): - return f"{self.name} says woof!" - -fido = Dog("Fido") -print(fido.bark()) -``` - -In Io, the same concept looks like this: - -```io -Dog := Object clone -Dog bark := method(name .. " says woof!") - -fido := Dog clone -fido name := "Fido" -fido bark println -``` - -At first glance, this might seem like a minor syntactic difference. But look closer: there's no class definition, no constructor, no special initialization syntax. `Dog` is just an object that we've cloned from the base `Object`. `fido` is just a clone of `Dog`. The simplicity is profound. - -## What You'll Gain - -### 1. **A Deeper Understanding of JavaScript** - -If you've ever been puzzled by JavaScript's prototype chain, or wondered why `typeof null === "object"`, studying Io will illuminate these mysteries. JavaScript's object model is essentially prototype-based (though complicated by the later addition of class syntax), and Io presents these same concepts in a much purer form. - -### 2. **Freedom from Artificial Boundaries** - -In most languages, there's a rigid distinction between what the language provides and what you can build. You can't change how `if` statements work. You can't modify how method calls are resolved. You can't alter fundamental objects. - -In Io, these boundaries don't exist. The `if` statement is just a message sent to an object. Method resolution is customizable. Even basic types like `Number` and `String` can be modified at runtime. This isn't just academically interesting—it enables patterns of expression impossible in more rigid languages. - -### 3. **Appreciation for Message Passing** - -While many languages claim to support "message passing," few take it as seriously as Io. When everything is truly a message—including operators, control flow, and assignment—you begin to see the elegant simplicity possible in language design. This perspective will change how you think about method calls and object interaction in any language. - -### 4. **Metaprogramming Without Magic** - -Languages like Ruby pride themselves on metaprogramming capabilities, but often these features feel like special cases—magic methods, decorators, metaclasses. In Io, metaprogramming isn't a special feature; it's the natural consequence of a simple, consistent object model. When you can inspect and modify any object at runtime, including the objects that define the language itself, metaprogramming becomes straightforward rather than mystical. - -## Who Should Read This Book - -This book assumes you're already a programmer. You should be comfortable with: - -- Basic programming concepts (variables, functions, loops, conditions) -- Object-oriented programming in at least one language -- Using a command line and text editor -- The idea that different languages encourage different ways of thinking - -You don't need to be an expert. In fact, if you've only worked in one or two mainstream languages, you might find Io's different perspective especially valuable. Sometimes, those deeply entrenched in certain paradigms have the most difficulty seeing alternatives. - -## What Makes Io Special - -Steve Dekorte created Io in 2002 with several goals: - -1. **Simplicity** - A minimal syntax with maximum expressiveness -2. **Flexibility** - Everything modifiable at runtime -3. **Uniformity** - One consistent model for everything -4. **Power** - Advanced features like coroutines and actors built-in - -The result is a language that fits in roughly 10,000 lines of C code, yet provides capabilities that mainstream languages achieve only through complex implementations or external libraries. - -## A Language for Learning - -I won't pretend that Io is likely to become your primary development language. Its community is small, its libraries limited, and its performance, while respectable, isn't competitive with systems languages or JIT-compiled platforms. - -But Io excels as a language for *learning*. Its simple, consistent design makes it easy to understand completely. You can hold the entire language in your head. There are no special cases to remember, no historical baggage to work around. When you understand Io's seven basic concepts, you understand the entire language. - -## How to Approach This Book - -As you read, I encourage you to: - -1. **Run every example**. Io's REPL starts instantly and makes experimentation effortless. - -2. **Modify the examples**. What happens if you change this? What if you clone from a different object? What if you override this method? - -3. **Compare with languages you know**. When you see an Io pattern, think about how you'd accomplish the same thing in Python, JavaScript, or Java. What's easier? What's harder? What's impossible? - -4. **Embrace the discomfort**. Some Io concepts will feel alien at first. That's good—it means you're learning something genuinely new. - -## A Personal Note - -I've been programming for [X] years and have worked in dozens of languages. Most taught me new syntax or libraries. Io taught me new ways to think. It challenged assumptions I didn't know I had. It showed me that many "fundamental" concepts in programming are actually just design choices, and different choices lead to different possibilities. - -Whether you spend a weekend or a month with Io, I believe you'll emerge a better programmer. Not because you'll use Io in production (though you might), but because you'll have a broader perspective on what programming languages can be. - -Let's begin. - ---- - -*Next: [Chapter 1 - Introduction: The Philosophy of Io](01-introduction.md)* \ No newline at end of file diff --git a/02-getting-started.md b/02-getting-started.md deleted file mode 100644 index a8fdd60..0000000 --- a/02-getting-started.md +++ /dev/null @@ -1,544 +0,0 @@ -# Chapter 2: Getting Started with Io - -The best way to understand Io is to use it. In this chapter, we'll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you'll have a feel for Io's syntax and flow. - -## Installing Io - -### macOS - -If you're on macOS with Homebrew, installation is simple: - -```bash -brew install io -``` - -### Linux - -On most Linux distributions, you'll need to build from source: - -```bash -git clone https://github.com/IoLanguage/io.git -cd io -mkdir build -cd build -cmake .. -make -sudo make install -``` - -### Windows - -Windows users should use WSL (Windows Subsystem for Linux) and follow the Linux instructions, or use Docker: - -```bash -docker run -it --rm stevedekorte/io -``` - -### Verifying Installation - -Once installed, verify Io is working: - -```bash -$ io --version -Io Programming Language, v. 20170906 - -$ io -Io> "Hello, World!" println -Hello, World! -==> Hello, World! -Io> ^C -``` - -## The REPL: Your Io Playground - -Io's REPL is where you'll spend most of your learning time. Unlike compiled languages where you write, compile, and run, Io lets you experiment immediately. - -Start the REPL by typing `io`: - -```io -$ io -Io> -``` - -The prompt `Io>` indicates Io is ready for input. Let's explore: - -```io -Io> 2 + 2 -==> 4 - -Io> "Hello" .. " " .. "World" -==> Hello World - -Io> 10 > 5 -==> true -``` - -Notice the `==>` prefix? That shows the return value of your expression. Everything in Io returns a value. - -### REPL Tips - -1. **Multi-line input**: The REPL detects incomplete expressions: - -```io -Io> if(true, -... "yes" println, -... "no" println -... ) -yes -==> yes -``` - -2. **Previous result**: Use `_` to reference the last result: - -```io -Io> 100 * 2 -==> 200 -Io> _ + 50 -==> 250 -``` - -3. **Getting help**: The REPL has built-in documentation: - -```io -Io> Lobby slotNames -==> list(Protos, _, exit, forward, set_) - -Io> Number slotNames sort -==> list(%, *, +, -, /, <, <=, ==, >, >=, abs, acos, asin, atan, between, ceil, cos, ...) -``` - -## Your First Io Program - -Let's write the traditional "Hello, World!" program. Create a file called `hello.io`: - -```io -"Hello, World!" println -``` - -Run it: - -```bash -$ io hello.io -Hello, World! -``` - -That's it. No class definitions, no main function, no boilerplate. Compare with Java: - -```java -public class Hello { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` - -Or even Python: - -```python -if __name__ == "__main__": - print("Hello, World!") -``` - -Io just runs your code. - -## Understanding Basic Syntax - -Io's syntax is minimal. Let's explore the basics: - -### Messages and Receivers - -In Io, everything is about sending messages to objects: - -```io -"hello" size // Send 'size' message to "hello" -==> 5 - -"hello" at(0) // Send 'at' message with argument 0 -==> h - -"hello" upper // Send 'upper' message -==> HELLO -``` - -Compare with method calls in Python: - -```python -"hello".upper() # Python -``` - -```io -"hello" upper // Io - parentheses optional for no arguments -``` - -### Arguments - -Messages can have arguments, passed in parentheses: - -```io -"hello" at(1) // One argument -==> e - -"hello" slice(1, 3) // Two arguments -==> el - -List append(1, 2, 3) // Multiple arguments -==> list(1, 2, 3) -``` - -### Operators are Messages - -This is crucial: operators in Io are just messages with special precedence: - -```io -2 + 3 // Send message "+" to 2 with argument 3 -2 +(3) // Exactly the same thing -2 send("+", 3) // Still the same thing! -``` - -This uniformity means you can redefine operators: - -```io -Number + := method(n, self - n) // Redefine + to subtract! -5 + 3 -==> 2 -``` - -(Don't actually do this in real code!) - -## Variables and Assignment - -In Io, variables are just slots on objects. By default, you're working with the `Lobby` object: - -```io -x := 10 // Create slot 'x' on Lobby with value 10 -x println // Print it -==> 10 - -x = 20 // Update existing slot -x println -==> 20 - -y = 30 // Error! Slot doesn't exist -// Exception: Slot y not found -``` - -Note the distinction: -- `:=` creates a new slot -- `=` updates an existing slot - -This prevents accidental variable creation from typos: - -```io -counter := 0 -countr = 1 // Error - probably a typo! -``` - -Compare with JavaScript's similar issue: - -```javascript -let counter = 0; -countr = 1; // Creates global variable - probably a bug! -``` - -## Control Flow - -Io's control structures are methods, not special syntax: - -### If Statements - -```io -if(10 > 5, - "Yes" println, - "No" println -) -// Prints: Yes -``` - -Compare with Python: - -```python -if 10 > 5: - print("Yes") -else: - print("No") -``` - -Since `if` is a method, you can even look at its implementation: - -```io -Io> if -==> method(...) -``` - -### Loops - -```io -// While loop -i := 0 -while(i < 5, - i println - i = i + 1 -) - -// For loop -for(i, 0, 4, - i println -) - -// Times loop -5 times(i, - i println -) -``` - -## Creating Objects - -Let's create our first custom object: - -```io -Person := Object clone -Person name := "Unknown" -Person greet := method( - ("Hello, I'm " .. name) println -) - -alice := Person clone -alice name = "Alice" -alice greet -// Prints: Hello, I'm Alice -``` - -Compare with Python: - -```python -class Person: - def __init__(self): - self.name = "Unknown" - - def greet(self): - print(f"Hello, I'm {self.name}") - -alice = Person() -alice.name = "Alice" -alice.greet() -``` - -The key difference: Io has no class definition. `Person` is just an object we're using as a prototype. - -## Methods - -Methods in Io are created with the `method` function: - -```io -Calculator := Object clone -Calculator add := method(a, b, a + b) -Calculator multiply := method(a, b, a * b) - -calc := Calculator clone -calc add(5, 3) println // 8 -calc multiply(4, 7) println // 28 -``` - -Methods have access to `self` (the receiver): - -```io -Counter := Object clone -Counter count := 0 -Counter increment := method( - count = count + 1 - self // Return self for chaining -) - -c := Counter clone -c increment increment increment -c count println // 3 -``` - -## Lists and Iteration - -Lists are fundamental in Io: - -```io -numbers := list(1, 2, 3, 4, 5) - -// Iteration -numbers foreach(n, - n println -) - -// Map -squared := numbers map(n, n * n) -squared println // list(1, 4, 9, 16, 25) - -// Select (filter) -evens := numbers select(n, n % 2 == 0) -evens println // list(2, 4) - -// Reduce -sum := numbers reduce(+) -sum println // 15 -``` - -Compare with Python: - -```python -numbers = [1, 2, 3, 4, 5] - -# Iteration -for n in numbers: - print(n) - -# Map -squared = [n * n for n in numbers] - -# Filter -evens = [n for n in numbers if n % 2 == 0] - -# Reduce -from functools import reduce -sum = reduce(lambda a, b: a + b, numbers) -``` - -## Working with Files - -Reading and writing files is straightforward: - -```io -// Write to file -file := File with("test.txt") -file openForWriting -file write("Hello, file!") -file close - -// Read from file -file := File with("test.txt") -file openForReading -contents := file contents -contents println -file close - -// Or more concisely -File with("test.txt") contents println -``` - -## A More Complete Example - -Let's build something more substantial—a simple to-do list: - -```io -// todo.io - A simple to-do list manager - -TodoList := Object clone -TodoList items := list() - -TodoList add := method(task, - items append(task) - self -) - -TodoList show := method( - if(items size == 0, - "No tasks!" println, - items foreach(i, task, - (" " .. (i + 1) .. ". " .. task) println - ) - ) - self -) - -TodoList complete := method(index, - if(index > 0 and index <= items size, - task := items at(index - 1) - items removeAt(index - 1) - ("Completed: " .. task) println, - "Invalid task number" println - ) - self -) - -TodoList save := method(filename, - File with(filename) openForWriting write(items asJson) close - "Saved!" println - self -) - -TodoList load := method(filename, - if(File with(filename) exists, - items = Yajl parseJson(File with(filename) contents) - "Loaded!" println, - "File not found" println - ) - self -) - -// Usage -todo := TodoList clone -todo add("Learn Io") add("Build something cool") add("Share with friends") -todo show -// 1. Learn Io -// 2. Build something cool -// 3. Share with friends - -todo complete(1) -// Completed: Learn Io - -todo show -// 1. Build something cool -// 2. Share with friends -``` - -## Key Takeaways - -Having written your first Io programs, you've probably noticed: - -1. **Minimal syntax**: No keywords for defining classes, functions, or variables. Everything uses the same message-passing syntax. - -2. **Immediate feedback**: The REPL makes experimentation effortless. - -3. **Uniform model**: Whether you're doing arithmetic, defining methods, or creating objects, it's all message passing. - -4. **Flexibility**: You can modify anything, even built-in types and operators. - -5. **Simplicity**: Programs are often shorter than their equivalents in other languages. - -## Exercises - -Try these exercises to solidify your understanding: - -1. **Number methods**: Add a `squared` method to `Number` that returns the square of a number. Test it with `5 squared`. - -2. **String reversal**: Create a method on `Sequence` (Io's string type) called `reverse` that returns the reversed string. - -3. **Bank account**: Create a `BankAccount` object with `balance`, `deposit`, and `withdraw` methods. Include protection against negative balances. - -4. **FizzBuzz**: Implement FizzBuzz in Io (print numbers 1-100, but "Fizz" for multiples of 3, "Buzz" for multiples of 5, "FizzBuzz" for both). - -5. **Method chaining**: Create a `StringBuilder` object that allows chaining: `StringBuilder clone add("Hello") add(" ") add("World") toString` - -## What's Different? - -If you're coming from mainstream languages, here's what might feel strange: - -- **No compile step**: Your code runs immediately -- **No type declarations**: Everything is dynamically typed -- **No class keyword**: Objects are created by cloning -- **Operators aren't special**: They're just messages -- **Everything returns a value**: Even assignments and control structures - -These differences aren't arbitrary—they all flow from Io's core principle of uniform message passing. - -## Moving Forward - -You now have enough Io knowledge to explore the deeper concepts. You can: - -- Create and manipulate objects -- Define methods -- Use control structures -- Work with collections -- Read and write files - -In the next chapter, we'll dive deep into Io's object model and understand what "everything is an object" really means. - ---- - -*Next: [Chapter 3 - Everything is an Object](03-everything-is-an-object.md)* \ No newline at end of file diff --git a/03-everything-is-an-object.md b/03-everything-is-an-object.md deleted file mode 100644 index 30ce775..0000000 --- a/03-everything-is-an-object.md +++ /dev/null @@ -1,518 +0,0 @@ -# Chapter 3: Everything is an Object - -"Everything is an object" is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like `int` and `boolean` break the rule). But what does it really mean? And how thoroughly does Io embrace this principle? - -In this chapter, we'll explore how Io takes "everything is an object" to its logical extreme, and what this means for how you write and think about programs. - -## What Is an Object? - -Before we dive into Io's object model, let's establish what we mean by "object." In most object-oriented languages, an object is: - -1. A bundle of state (data/attributes/fields) -2. A set of behaviors (methods/functions) -3. An identity (distinct from other objects) - -In Java, you might have: - -```java -class Dog { - String name; // state - int age; // state - - void bark() { // behavior - System.out.println("Woof!"); - } -} - -Dog fido = new Dog(); // identity (fido is distinct from other Dogs) -``` - -But Java immediately breaks its own rules: - -```java -int x = 5; // Not an object! -x.toString(); // Error: int cannot be dereferenced -Integer y = 5; // Now it's an object (boxed) -y.toString(); // "5" -``` - -Let's see how Io handles this. - -## Numbers are Objects - -In Io, numbers aren't primitives—they're full objects: - -```io -5 type println // Number -5 slotNames println // list(%, *, +, -, /, <, ...) - -// Numbers have methods -5 abs println // 5 --5 abs println // 5 -5 sqrt println // 2.236... -5 sin println // -0.958... - -// You can add methods to numbers! -Number double := method(self * 2) -5 double println // 10 - -// You can even inspect a number's prototype chain -5 proto println // Number_0x... -5 proto proto println // Object_0x... -``` - -Compare this to Python, which claims everything is an object: - -```python -x = 5 -print(type(x)) # -print(dir(x)) # ['__abs__', '__add__', ...] - -# But you can't add methods to numbers -x.double = lambda: x * 2 # AttributeError! -``` - -Python's numbers are objects, but they're *immutable* objects with a *fixed* set of methods. Io's numbers are fully modifiable objects. - -## Strings are Objects (and Mutable!) - -```io -text := "hello" -text type println // Sequence - -// Strings have methods -text size println // 5 -text upper println // HELLO -text reverse println // olleh - -// But here's where it gets interesting - strings are MUTABLE -text atPut(0, 72) // ASCII for 'H' -text println // Hello - -// You can add methods to strings -Sequence shout := method(self upper .. "!!!") -"hello" shout println // HELLO!!! -``` - -This mutability might shock programmers from languages where strings are immutable: - -```python -# Python - strings are immutable -text = "hello" -text[0] = 'H' # TypeError: 'str' object does not support item assignment - -# Java - strings are immutable -String text = "hello"; -text.charAt(0) = 'H'; // Error: cannot assign a value -``` - -## Booleans are Objects - -Even `true` and `false` are objects: - -```io -true type println // true -false type println // false - -// They have methods -true and(false) println // false -true or(false) println // true -true not println // false - -// The actual objects -true println // true -true proto println // Object_0x... - -// You can even add methods to booleans! -true celebrate := method("Yay!" println) -(5 > 3) celebrate // Yay! -``` - -This is different from most languages where booleans are either primitives or special immutable objects. - -## nil is an Object - -Even nothingness is an object in Io: - -```io -nil type println // Object -nil slotNames println // list(type, ...) - -// nil has methods! -nil isNil println // true -nil not println // true - -// You can add methods to nil -nil greet := method("Hello from nothing!" println) -x := nil -x greet // Hello from nothing! -``` - -Compare with JavaScript's confusing null: - -```javascript -typeof null // "object" (but it's not really) -null.toString() // TypeError: Cannot read property 'toString' of null -``` - -## Methods are Objects - -This is where things get really interesting. Methods themselves are objects: - -```io -add := method(a, b, a + b) -add type println // Block - -// Methods have methods! -add argumentNames println // list(a, b) -add code println // a +(b) - -// You can modify methods -add code println // a +(b) -add setCode(block(a, b, a * b)) // Change implementation! -add(3, 4) println // 12 (now multiplies!) - -// You can create methods from strings -code := "a + b + 100" -newMethod := block(a, b) setCode(code) -newMethod call(5, 10) println // 115 -``` - -This is far more powerful than most languages' function objects: - -```python -# Python -def add(a, b): - return a + b - -print(type(add)) # -print(add.__code__) # -# But you can't easily modify the function's code at runtime -``` - -## Control Structures are Objects (Messages) - -This might be the most mind-bending: `if`, `while`, and `for` aren't syntax—they're methods: - -```io -// 'if' is a method on Object -if type println // nil (it's a method) - -// You can see its implementation -Object getSlot("if") println // method(...) - -// You can even redefine it! -Object if := method(condition, trueBlock, falseBlock, - "Making a decision..." println - if(condition, trueBlock call, falseBlock call) -) - -if(true, "yes" println, "no" println) -// Prints: Making a decision... -// Prints: yes -``` - -Let's create our own control structure: - -```io -Object unless := method(condition, block, - if(condition not, block call) -) - -unless(5 > 10, - "Math still works!" println -) -// Prints: Math still works! -``` - -Try doing that in Java or C++! - -## Operators are Objects (Messages) - -Operators aren't special syntax—they're messages: - -```io -// These are equivalent -2 + 3 -2 +(3) -2 send("+", 3) - -// You can redefine operators -Number + := method(n, - "Adding #{self} and #{n}" interpolate println - self + n // Would cause infinite recursion! -) - -// Let's be more careful -Number plusWithLogging := Number getSlot("+") -Number + := method(n, - "Adding #{self} and #{n}" interpolate println - self plusWithLogging(n) -) - -2 + 3 -// Prints: Adding 2 and 3 -// Returns: 5 -``` - -You can even create new operators: - -```io -OperatorTable addOperator("**", 3) // Right-associative, precedence 3 -Number ** := method(n, self pow(n)) - -2 ** 3 println // 8 -2 ** 3 ** 2 println // 512 (right-associative: 2 ** (3 ** 2)) -``` - -## Lists are Objects - -```io -nums := list(1, 2, 3) -nums type println // List - -// Lists have many methods -nums size println // 3 -nums first println // 1 -nums last println // 3 -nums reverse println // list(3, 2, 1) - -// Lists are mutable -nums append(4) -nums println // list(1, 2, 3, 4) - -// You can add custom methods to lists -List sum := method( - self reduce(+) -) - -list(1, 2, 3, 4, 5) sum println // 15 -``` - -## Even the Lobby is an Object - -The global namespace in Io is an object called `Lobby`: - -```io -Lobby type println // Object -Lobby slotNames println // list(all your global variables) - -// When you create a "global" variable, you're adding a slot to Lobby -x := 10 -Lobby hasSlot("x") println // true -Lobby x println // 10 - -// You can manipulate the global namespace as an object -Lobby removeSlot("x") -x println // Exception: Slot x not found -``` - -This is radically different from languages with special global scope rules. - -## Messages Themselves are Objects - -When you send a message, that message is an object: - -```io -msg := message(2 + 3) -msg type println // Message -msg name println // + -msg arguments println // list(Message_0x...) -msg arguments first code println // 3 - -// You can evaluate messages -msg doInContext(Lobby) println // 5 - -// You can build messages programmatically -msg := Message clone setName("+") setArguments(list(Message clone setName("3"))) -2 doMessage(msg) println // 5 -``` - -This is the foundation of Io's metaprogramming capabilities. - -## The Object Hierarchy - -Let's explore how all these objects relate: - -```io -// Everything ultimately inherits from Object -5 proto proto == Object println // true -"hi" proto proto == Object println // true -true proto == Object println // true -list() proto proto == Object println // true - -// You can walk the prototype chain -obj := 5 -while(obj, - obj type println - obj = obj proto -) -// Prints: -// Number -// Object -``` - -## Practical Implications - -What does it mean that everything is truly an object? - -### 1. Uniform Interface - -You can treat everything uniformly: - -```io -things := list(5, "hello", true, nil, method(x, x * 2), list(1, 2)) - -things foreach(thing, - ("Type: " .. thing type) println -) -// Type: Number -// Type: Sequence -// Type: true -// Type: Object -// Type: Block -// Type: List -``` - -### 2. No Special Cases - -You don't need to remember different rules for different types: - -```io -// Everything can receive messages -5 println -"hello" println -true println -nil println -list(1,2,3) println - -// Everything can be inspected -5 slotNames -"hello" slotNames -true slotNames -nil slotNames -``` - -### 3. Extensibility - -You can extend anything: - -```io -// Add methods to numbers for DSL -Number days := method( - Duration clone setDays(self) -) - -Number hours := method( - Duration clone setHours(self) -) - -// Now you can write -deadline := Date now + 3 days + 4 hours -``` - -### 4. Debugging Power - -Since everything is an object, you can inspect everything: - -```io -Object debugMethod := method(name, - m := self getSlot(name) - ("Method " .. name .. ":") println - (" Arguments: " .. m argumentNames) println - (" Code: " .. m code) println -) - -List debugMethod("append") -// Method append: -// Arguments: list(...) -// Code: ... -``` - -## Comparison with Other Languages - -### Ruby: "Everything is an object" (mostly) - -```ruby -5.class # Integer -"hello".class # String -true.class # TrueClass -nil.class # NilClass - -# But... -if.class # SyntaxError! 'if' isn't an object -``` - -### Python: "Everything is an object" (sort of) - -```python -type(5) # -type("hello") # -type(True) # -type(None) # - -# But... -type(if) # SyntaxError! 'if' isn't an object -type(+) # SyntaxError! '+' isn't an object -``` - -### JavaScript: "Everything is an object" (except when it's not) - -```javascript -typeof 5 // "number" (primitive) -typeof "hello" // "string" (primitive) -typeof true // "boolean" (primitive) -typeof {} // "object" - -// Autoboxing happens sometimes -(5).toString() // "5" (temporarily boxed) -5.x = 10 // Silently fails! -``` - -### Io: Everything IS an object (no exceptions) - -```io -5 type // Number (object) -"hello" type // Sequence (object) -true type // true (object) -if type // nil (it's a method, which is an object) -+ type // nil (it's a method, which is an object) -``` - -## Exercises - -1. **Object Inspector**: Write a method `inspect` that can be called on any object and prints: - - Its type - - Its slot names - - Its prototype chain - -2. **Custom Boolean**: Create your own boolean system with objects `Yes` and `No` that have methods `and`, `or`, and `not`. - -3. **Operator Overloading**: Define a `Vector` object with `x` and `y` slots, then overload the `+` operator to add vectors. - -4. **Control Structure**: Create a `repeat(n, block)` control structure that executes a block n times. - -5. **Message Logger**: Modify the `Object` prototype to log every message sent to any object (hint: override `forward`). - -## Philosophical Implications - -Io's radical "everything is an object" approach has profound implications: - -1. **Simplicity through uniformity**: One concept (objects) explains everything -2. **Power through openness**: Nothing is sealed or special -3. **Learning through exploration**: You can inspect and understand everything -4. **Danger through freedom**: You can break everything - -This last point is important. With great power comes great responsibility. Io trusts you completely. You can redefine addition, break the `if` statement, or delete critical system objects. This isn't a bug—it's a philosophy. - -## Conclusion - -In Io, "everything is an object" isn't marketing—it's a fundamental truth that shapes every aspect of the language. Numbers, strings, booleans, nil, methods, operators, control structures, and even messages themselves are all objects with slots that can be inspected, modified, and extended. - -This uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that *everything* is just objects sending messages to other objects, Io's entire design clicks into place. - -Next, we'll explore how objects relate to each other through Io's prototype-based inheritance system—a world without classes. - ---- - -*Next: [Chapter 4 - Prototypes, Not Classes](04-prototypes-not-classes.md)* \ No newline at end of file diff --git a/04-prototypes-not-classes.md b/04-prototypes-not-classes.md deleted file mode 100644 index 24dd6ed..0000000 --- a/04-prototypes-not-classes.md +++ /dev/null @@ -1,540 +0,0 @@ -# Chapter 4: Prototypes, Not Classes - -Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There's a fundamental distinction between the template (class) and the things created from it (instances). - -Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs. - -## The Class-Based World - -Let's start with what you probably know. In a class-based language like Java: - -```java -// Define a class (template) -class Animal { - String name; - - void speak() { - System.out.println("Some sound"); - } -} - -// Define a subclass -class Dog extends Animal { - void speak() { - System.out.println("Woof!"); - } -} - -// Create instances -Dog fido = new Dog(); -Dog rover = new Dog(); -``` - -The key points: -- `Animal` and `Dog` are classes (templates) -- `fido` and `rover` are instances (objects) -- Classes and instances are fundamentally different things -- Inheritance happens between classes - -## The Prototype-Based World - -In Io, there are no classes: - -```io -// Create an object to serve as a prototype -Animal := Object clone -Animal speak := method("Some sound" println) - -// Create another object using Animal as a prototype -Dog := Animal clone -Dog speak := method("Woof!" println) - -// Create more objects using Dog as a prototype -fido := Dog clone -rover := Dog clone -``` - -The key differences: -- `Animal`, `Dog`, `fido`, and `rover` are all objects -- No fundamental distinction between "classes" and "instances" -- Objects are created by cloning other objects -- Any object can serve as a prototype for other objects - -## Understanding Cloning - -When you clone an object in Io, you don't copy all its slots. Instead, you create a new, empty object that maintains a reference to its prototype: - -```io -Animal := Object clone -Animal name := "Generic Animal" -Animal speak := method(name println) - -dog := Animal clone - -// dog doesn't have its own 'name' slot -dog hasLocalSlot("name") println // false - -// But it can access 'name' through its prototype -dog name println // "Generic Animal" - -// Now give dog its own name -dog name = "Fido" -dog hasLocalSlot("name") println // true -dog name println // "Fido" - -// Animal's name is unchanged -Animal name println // "Generic Animal" -``` - -This is called **differential inheritance**—objects only store their differences from their prototypes. - -## The Prototype Chain - -When you send a message to an object, Io looks for a matching slot: -1. First in the object itself -2. Then in its prototype -3. Then in the prototype's prototype -4. And so on until it reaches Object - -```io -// Create a chain of prototypes -Organism := Object clone -Organism live := method("Living..." println) - -Animal := Organism clone -Animal move := method("Moving..." println) - -Dog := Animal clone -Dog bark := method("Woof!" println) - -fido := Dog clone -fido name := "Fido" - -// fido can access methods from anywhere in the chain -fido live // "Living..." (from Organism) -fido move // "Moving..." (from Animal) -fido bark // "Woof!" (from Dog) - -// You can inspect the chain -fido proto == Dog println // true -fido proto proto == Animal println // true -fido proto proto proto == Organism println // true -``` - -## Dynamic Prototype Modification - -Since prototypes are just objects, you can modify them at runtime, and all objects using that prototype see the changes: - -```io -Dog := Object clone -fido := Dog clone -rover := Dog clone - -// Add a method to Dog -Dog bark := method("Woof!" println) - -// Both fido and rover can now bark -fido bark // "Woof!" -rover bark // "Woof!" - -// Modify the method -Dog bark = method("WOOF! WOOF!" println) - -// The change affects all dogs -fido bark // "WOOF! WOOF!" -rover bark // "WOOF! WOOF!" -``` - -Try doing that with classes in Java! You'd need complex reflection APIs, and even then, you couldn't modify existing instances. - -## Multiple Prototypes - -Io supports multiple inheritance through its `Protos` list: - -```io -// Create two prototypes -Flyable := Object clone -Flyable fly := method("Flying..." println) - -Swimmable := Object clone -Swimmable swim := method("Swimming..." println) - -// Create an object with multiple prototypes -Duck := Object clone -Duck appendProto(Flyable) -Duck appendProto(Swimmable) - -mallard := Duck clone -mallard fly // "Flying..." -mallard swim // "Swimming..." - -// Inspect the prototype list -Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) -``` - -The search order for slots is depth-first through the `Protos` list. - -## Comparing Approaches: Class vs Prototype - -Let's implement the same concept in both paradigms to see the differences. - -### Class-Based (Python) - -```python -class Shape: - def __init__(self): - self.x = 0 - self.y = 0 - - def move(self, dx, dy): - self.x += dx - self.y += dy - -class Circle(Shape): - def __init__(self, radius): - super().__init__() - self.radius = radius - - def area(self): - return 3.14159 * self.radius ** 2 - -# Usage -circle = Circle(5) -circle.move(10, 20) -print(circle.area()) - -# Can't easily create a one-off variation -# Would need to define a new class -``` - -### Prototype-Based (Io) - -```io -Shape := Object clone -Shape x := 0 -Shape y := 0 -Shape move := method(dx, dy, - x = x + dx - y = y + dy -) - -Circle := Shape clone -Circle radius := 0 -Circle area := method( - 3.14159 * radius * radius -) - -// Usage -circle := Circle clone -circle radius = 5 -circle move(10, 20) -circle area println - -// Easy to create one-off variations -specialCircle := Circle clone -specialCircle area = method( - "Special area: " print - resend // Call the original method -) -specialCircle area // "Special area: 78.53975" -``` - -## The Power of Prototypes - -### 1. Objects as Classes - -In Io, objects can act as classes when needed: - -```io -// Person acts like a class -Person := Object clone -Person init := method( - self name := "Unknown" - self age := 0 - self -) - -Person create := method(n, a, - clone init name = n age = a -) - -// Usage feels class-like -alice := Person create("Alice", 30) -bob := Person create("Bob", 25) -``` - -### 2. One-Off Objects - -You can create unique objects without defining a "class": - -```io -// Create a unique object with no "class" -singleton := Object clone -singleton data := Map clone -singleton store := method(key, value, - data atPut(key, value) -) -singleton retrieve := method(key, - data at(key) -) - -// Use it directly -singleton store("user", "Alice") -singleton retrieve("user") println // "Alice" -``` - -### 3. Runtime Class Modification - -You can fundamentally change what a "class" does: - -```io -Number := Object clone -Number value := 0 -Number + := method(n, - result := Number clone - result value = self value + n value - result -) - -// Create numbers -five := Number clone value = 5 -three := Number clone value = 3 - -// Now change how Number works -Number + = method(n, - result := Number clone - result value = self value * n value // Multiply instead! - result -) - -// Existing numbers use the new behavior -eight := five + three -eight value println // 15 (multiplication!) -``` - -## Delegation vs Inheritance - -Prototype-based languages use delegation rather than inheritance. When an object doesn't have a slot, it delegates to its prototype: - -```io -Account := Object clone -Account balance := 0 -Account deposit := method(amount, - balance = balance + amount - self -) - -savings := Account clone -savings deposit(100) - -// Let's trace what happens: -// 1. savings receives 'deposit' message -// 2. savings doesn't have 'deposit' slot -// 3. savings delegates to Account -// 4. Account's deposit method runs -// 5. But 'self' is still savings -// 6. So savings's balance is updated - -savings balance println // 100 -Account balance println // 0 (unchanged) -``` - -This is subtly different from class-based inheritance where methods are copied or looked up in a class hierarchy. - -## Practical Patterns - -### The Constructor Pattern - -While Io doesn't have constructors, you can create them: - -```io -Person := Object clone -Person init := method(name, age, - self name := name - self age := age - self -) - -Person new := method(name, age, - self clone init(name, age) -) - -// Usage -alice := Person new("Alice", 30) -``` - -### The Mixin Pattern - -Use prototypes as mixins for shared behavior: - -```io -// Define mixins -Timestamped := Object clone -Timestamped createdAt := Date now -Timestamped age := method( - Date now - createdAt -) - -Serializable := Object clone -Serializable toJson := method( - // Implementation -) - -// Use mixins -Document := Object clone -Document appendProto(Timestamped) -Document appendProto(Serializable) - -doc := Document clone -doc age println -doc toJson -``` - -### The Factory Pattern - -Objects can create other objects with specific configurations: - -```io -ShapeFactory := Object clone -ShapeFactory circle := method(radius, - c := Object clone - c radius := radius - c area := method(3.14159 * radius * radius) - c -) - -ShapeFactory rectangle := method(width, height, - r := Object clone - r width := width - r height := height - r area := method(width * height) - r -) - -// Usage -myCircle := ShapeFactory circle(5) -myRect := ShapeFactory rectangle(10, 20) -``` - -## JavaScript: A Familiar Prototype System - -If you know JavaScript, you've already used prototype-based programming: - -```javascript -// JavaScript (before ES6 classes) -function Animal(name) { - this.name = name; -} - -Animal.prototype.speak = function() { - console.log("Some sound"); -}; - -function Dog(name) { - Animal.call(this, name); -} - -Dog.prototype = Object.create(Animal.prototype); -Dog.prototype.bark = function() { - console.log("Woof!"); -}; -``` - -But JavaScript complicated things with constructor functions and later added class syntax as sugar. Io keeps prototypes pure and simple. - -## Common Misconceptions - -### "No Classes Means No Structure" - -False. You can create well-structured programs with prototypes: - -```io -// Define clear prototype hierarchies -Vehicle := Object clone -Vehicle speed := 0 - -Car := Vehicle clone -Car wheels := 4 - -ElectricCar := Car clone -ElectricCar batteryLevel := 100 - -// The structure is clear and maintainable -``` - -### "Prototypes Are Just Classes With Different Syntax" - -False. Prototypes are more flexible: - -```io -// Start with a prototype -Dog := Object clone -Dog bark := method("Woof!" println) - -fido := Dog clone - -// Later, change fido's prototype! -Cat := Object clone -Cat meow := method("Meow!" println) - -fido protos = list(Cat) -fido meow // "Meow!" - fido is now a cat! -``` - -You can't change an object's class at runtime in most class-based languages. - -### "Multiple Inheritance Is Always Confusing" - -Io's prototype lists make multiple inheritance explicit and controllable: - -```io -A := Object clone -A foo := method("A's foo" println) - -B := Object clone -B foo := method("B's foo" println) - -C := Object clone -C appendProto(A) -C appendProto(B) - -C foo // "A's foo" (A comes first in the list) - -// Reorder to change priority -C protos = list(B, A) -C foo // "B's foo" (B now comes first) -``` - -## Exercises - -1. **Prototype Chain Explorer**: Write a method that prints an object's complete prototype chain with indentation showing the hierarchy. - -2. **Class Emulator**: Create a `Class` object that provides `new`, `extends`, and other class-like conveniences while using prototypes underneath. - -3. **Multiple Inheritance Diamond**: Create a diamond inheritance pattern (D inherits from B and C, which both inherit from A) and explore how Io resolves method conflicts. - -4. **Dynamic Reclassing**: Write a `become` method that changes an object's prototype chain to make it "become" an instance of a different prototype. - -5. **Prototype Versioning**: Implement a system where objects can "lock" to a specific version of their prototype, unaffected by later prototype modifications. - -## Real-World Implications - -Prototype-based programming shines in certain scenarios: - -1. **Rapid Prototyping**: Create and modify objects on the fly without defining classes -2. **Dynamic Systems**: Systems where object behavior needs to change at runtime -3. **DSLs**: Domain-specific languages where objects morph based on context -4. **Learning**: Understanding prototypes deepens your understanding of JavaScript -5. **Simplicity**: No distinction between classes and objects means fewer concepts - -## Conclusion - -Prototype-based programming isn't just "classes with different syntax"—it's a fundamentally different way of thinking about objects and inheritance. Instead of rigid templates (classes) and instances, you have a fluid world where any object can serve as a template for others, where inheritance is delegation, and where the structure of your program can change at runtime. - -This flexibility can be overwhelming at first, especially if you're used to the safety of static classes. But it can also be liberating. You're not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows. - -In the next chapter, we'll dive deeper into how objects communicate through Io's message passing system—the heartbeat of the language. - ---- - -*Next: [Chapter 5 - Messages and Slots](05-messages-and-slots.md)* \ No newline at end of file diff --git a/06-cloning-and-inheritance.md b/06-cloning-and-inheritance.md deleted file mode 100644 index 8ac229c..0000000 --- a/06-cloning-and-inheritance.md +++ /dev/null @@ -1,664 +0,0 @@ -# Chapter 6: Cloning and Inheritance - -In class-based languages, inheritance is a relationship between classes. In Io's prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively. - -## The Mechanics of Cloning - -When you clone an object in Io, you don't copy all its data. Instead, you create a new, empty object with a reference to the original: - -```io -// Create a prototype -Animal := Object clone -Animal species := "Unknown" -Animal age := 0 -Animal describe := method( - ("A " .. age .. " year old " .. species) println -) - -// Clone it -cat := Animal clone - -// cat is empty but linked to Animal -cat slotNames println // list() - no local slots! -cat species println // "Unknown" - from Animal -cat age println // 0 - from Animal - -// The link is through 'proto' -cat proto == Animal println // true -``` - -This is fundamentally different from copying: - -```io -// If cloning was copying (it's not!), it would work like: -catCopy := Object clone -catCopy species := Animal species // Copy each slot -catCopy age := Animal age -catCopy describe := Animal describe - -// But cloning actually creates a link: -catClone := Animal clone // Empty object linked to Animal -``` - -## Differential Inheritance in Action - -Objects only store their differences from their prototypes: - -```io -Vehicle := Object clone -Vehicle speed := 60 -Vehicle color := "white" -Vehicle drive := method( - ("Driving at " .. speed .. " mph") println -) - -car := Vehicle clone -car color = "red" // Override color -car model := "Sedan" // Add new slot - -// Inspect what's stored where -car slotNames println // list(color, model) - only differences! -Vehicle slotNames println // list(speed, color, drive) - -// But car can access everything -car speed println // 60 - from Vehicle -car color println // "red" - from car (overrides Vehicle) -car model println // "Sedan" - from car -car drive // "Driving at 60 mph" -``` - -Memory efficiency comparison: - -```io -// Creating 1000 cars -cars := list() -1000 times(i, - car := Vehicle clone - car id := i - cars append(car) -) - -// Each car only stores its 'id' slot -// All share Vehicle's methods and default values -// In a copying system, each would duplicate everything -``` - -## The Prototype Chain - -Objects can have chains of prototypes: - -```io -Organism := Object clone -Organism alive := true -Organism metabolize := method("Converting energy..." println) - -Animal := Organism clone -Animal mobile := true -Animal move := method("Moving..." println) - -Mammal := Animal clone -Mammal warmBlooded := true -Mammal nurse := method("Nursing young..." println) - -Dog := Mammal clone -Dog loyal := true -Dog bark := method("Woof!" println) - -fido := Dog clone -fido name := "Fido" - -// fido can access methods from the entire chain -fido metabolize // From Organism -fido move // From Animal -fido nurse // From Mammal -fido bark // From Dog - -// Trace the chain -obj := fido -while(obj != Object, - obj type println - obj = obj proto -) -// Dog -// Mammal -// Animal -// Organism -// Object -``` - -## Method Resolution Order - -When you send a message, Io searches up the prototype chain: - -```io -A := Object clone -A foo := method("A's foo" println) -A bar := method("A's bar" println) - -B := A clone -B foo := method("B's foo" println) // Override - -C := B clone -C bar := method("C's bar" println) // Override different method - -obj := C clone - -obj foo // "B's foo" - found in B (C doesn't have it) -obj bar // "C's bar" - found in C -obj baz // Exception - not found anywhere -``` - -You can visualize the search: - -```io -Object findSlot := method(slotName, - obj := self - while(obj, - if(obj hasLocalSlot(slotName), - ("Found '" .. slotName .. "' in " .. obj type) println - return obj getSlot(slotName) - ) - obj = obj proto - ) - "Not found" println -) - -obj findSlot("foo") // Found 'foo' in B -obj findSlot("bar") // Found 'bar' in C -``` - -## Multiple Inheritance - -Io supports multiple inheritance through the `protos` list: - -```io -// Define capabilities -Flyable := Object clone -Flyable altitude := 0 -Flyable fly := method(height, - altitude = height - ("Flying at " .. altitude .. " feet") println -) - -Swimmable := Object clone -Swimmable depth := 0 -Swimmable swim := method(d, - depth = d - ("Swimming at " .. depth .. " feet deep") println -) - -// Single inheritance -Bird := Flyable clone -Bird chirp := method("Chirp!" println) - -// Multiple inheritance -Duck := Object clone -Duck appendProto(Flyable) -Duck appendProto(Swimmable) -Duck quack := method("Quack!" println) - -mallard := Duck clone -mallard fly(100) // Flying at 100 feet -mallard swim(5) // Swimming at 5 feet deep -mallard quack // Quack! - -// Check the prototype list -Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) -``` - -## Diamond Problem Resolution - -The diamond problem occurs when multiple inheritance paths lead to the same ancestor: - -```io -// Diamond structure -Grandparent := Object clone -Grandparent value := "from grandparent" -Grandparent method1 := method("Grandparent method1" println) - -Parent1 := Grandparent clone -Parent1 method1 := method("Parent1 method1" println) -Parent1 method2 := method("Parent1 method2" println) - -Parent2 := Grandparent clone -Parent2 method1 := method("Parent2 method1" println) -Parent2 method3 := method("Parent2 method3" println) - -Child := Object clone -Child appendProto(Parent1) -Child appendProto(Parent2) - -// Resolution order matters -Child method1 // "Parent1 method1" - Parent1 comes first - -// Reorder to change priority -Child protos := list(Parent2, Parent1) -Child method1 // "Parent2 method1" - Parent2 now comes first -``` - -## Shallow vs Deep Cloning - -By default, cloning is shallow—slot values are shared: - -```io -Original := Object clone -Original data := list(1, 2, 3) -Original info := Map clone atPut("key", "value") - -Shallow := Original clone - -// Modifying mutable objects affects both -Shallow data append(4) -Original data println // list(1, 2, 3, 4) - changed! - -// Need deep cloning for independence -Object deepClone := method( - new := self clone - self slotNames foreach(name, - value := self getSlot(name) - if(value hasSlot("clone"), - new setSlot(name, value clone) - ) - ) - new -) - -Deep := Original deepClone -Deep data append(5) -Original data println // list(1, 2, 3, 4) - unchanged -Deep data println // list(1, 2, 3, 4, 5) -``` - -## init Methods and Constructors - -While Io doesn't have constructors, you can create initialization patterns: - -```io -Person := Object clone -Person init := method( - self name := "Unknown" - self age := 0 - self contacts := list() // Important: new list for each instance - self // Return self for chaining -) - -// Override clone to call init -Person clone := method( - resend init -) - -// Now each person gets their own contacts list -alice := Person clone -alice name = "Alice" -alice contacts append("Bob") - -bob := Person clone -bob name = "Bob" -bob contacts append("Charlie") - -alice contacts println // list("Bob") - independent! -bob contacts println // list("Charlie") -``` - -## Factory Methods - -Create specialized cloning methods: - -```io -Animal := Object clone -Animal species := "Unknown" -Animal sound := "..." - -Animal withSpecies := method(s, - new := self clone - new species = s - new -) - -Animal dog := method( - self clone species = "Dog" sound = "Woof" -) - -Animal cat := method( - self clone species = "Cat" sound = "Meow" -) - -// Usage -myDog := Animal dog -myCat := Animal cat -genericAnimal := Animal withSpecies("Elephant") -``` - -## Prototype Switching - -Unlike class-based languages, you can change an object's prototype at runtime: - -```io -// Start with one prototype -Bird := Object clone -Bird fly := method("Flying..." println) - -Fish := Object clone -Fish swim := method("Swimming..." println) - -creature := Bird clone -creature fly // "Flying..." - -// Change its prototype! -creature protos = list(Fish) -creature swim // "Swimming..." -creature fly // Exception - no longer a Bird! - -// Or add capabilities -creature appendProto(Bird) -creature fly // "Flying..." - now it can do both -creature swim // "Swimming..." -``` - -## Mixins and Traits - -Use prototypes as mixins for composable behavior: - -```io -// Define mixins -Comparable := Object clone -Comparable < := method(other, self compare(other) < 0) -Comparable > := method(other, self compare(other) > 0) -Comparable == := method(other, self compare(other) == 0) -Comparable <= := method(other, self compare(other) <= 0) -Comparable >= := method(other, self compare(other) >= 0) - -Enumerable := Object clone -Enumerable select := method(block, - result := list() - self foreach(item, - if(block call(item), result append(item)) - ) - result -) -Enumerable map := method(block, - result := list() - self foreach(item, - result append(block call(item)) - ) - result -) - -// Use mixins -SortedList := List clone -SortedList appendProto(Comparable) -SortedList appendProto(Enumerable) -SortedList compare := method(other, - self size compare(other size) -) - -list1 := SortedList clone append(1, 2, 3) -list2 := SortedList clone append(4, 5) -(list1 > list2) println // true (3 > 2) -``` - -## Clone Hooks - -Customize cloning behavior: - -```io -Counted := Object clone -Counted instances := 0 - -Counted clone := method( - Counted instances = Counted instances + 1 - new := resend - new id := Counted instances - new -) - -// Each clone gets a unique ID -obj1 := Counted clone -obj2 := Counted clone -obj3 := Counted clone - -obj1 id println // 1 -obj2 id println // 2 -obj3 id println // 3 -Counted instances println // 3 -``` - -## Inheritance Patterns - -### Classical Inheritance Pattern - -Emulate class-based inheritance: - -```io -// Base "class" -Class := Object clone -Class new := method( - instance := self clone - instance init - instance -) - -// Define a "class" -Rectangle := Class clone -Rectangle init := method( - self width := 0 - self height := 0 -) -Rectangle area := method(width * height) - -// Inheritance -Square := Rectangle clone -Square init := method( - resend // Call parent init - self side := 0 -) -Square setSide := method(s, - side = s - width = s - height = s -) - -// Usage -rect := Rectangle new -rect width = 10 -rect height = 20 -rect area println // 200 - -square := Square new -square setSide(5) -square area println // 25 -``` - -### Delegation Pattern - -```io -Delegator := Object clone -Delegator delegate := nil -Delegator forward := method( - if(delegate, - delegate doMessage(call message, call sender) - , - Exception raise("No delegate set") - ) -) - -Logger := Object clone -Logger log := method(msg, ("[LOG] " .. msg) println) - -obj := Delegator clone -obj delegate = Logger -obj log("Hello") // [LOG] Hello -``` - -## Testing Inheritance - -Check inheritance relationships: - -```io -Object isKindOf := method(proto, - obj := self - while(obj, - if(obj == proto, return true) - if(obj protos, - obj protos foreach(p, - if(p isKindOf(proto), return true) - ) - ) - obj = obj proto - ) - false -) - -Animal := Object clone -Dog := Animal clone -fido := Dog clone - -fido isKindOf(Dog) println // true -fido isKindOf(Animal) println // true -fido isKindOf(Object) println // true -fido isKindOf(Number) println // false -``` - -## Performance Considerations - -Prototype chains affect performance: - -```io -// Deep chain - slower lookup -A := Object clone -B := A clone -C := B clone -D := C clone -E := D clone -obj := E clone -obj method := method("Found!") - -// Shallow chain - faster lookup -Flat := Object clone -Flat method := method("Found!") -obj2 := Flat clone - -// Benchmark -time(100000 times(obj method)) // Slower -time(100000 times(obj2 method)) // Faster -``` - -## Common Pitfalls - -### Shared Mutable State - -```io -// WRONG - shares list between instances -BadTemplate := Object clone -BadTemplate items := list() - -obj1 := BadTemplate clone -obj2 := BadTemplate clone -obj1 items append(1) -obj2 items println // list(1) - Oops! Shared! - -// RIGHT - create new list for each instance -GoodTemplate := Object clone -GoodTemplate init := method( - self items := list() - self -) -GoodTemplate clone := method(resend init) -``` - -### Circular Prototypes - -```io -// Don't do this! -A := Object clone -B := Object clone -A appendProto(B) -B appendProto(A) // Circular! - -// A foo // Infinite loop! -``` - -## Exercises - -1. **Instance Counter**: Create a prototype that tracks how many objects have been cloned from it, directly or indirectly. - -2. **Prototype Inspector**: Write a method that visualizes an object's complete prototype hierarchy as a tree. - -3. **Deep Clone**: Implement a robust deep cloning method that handles circular references. - -4. **Multiple Inheritance Resolver**: Create a system that detects and reports conflicts in multiple inheritance. - -5. **Class Emulator**: Build a complete class-based OOP system on top of Io's prototypes, including abstract classes and interfaces. - -## Real-World Example: Game Entity System - -```io -// Base entity -Entity := Object clone -Entity init := method( - self x := 0 - self y := 0 - self health := 100 - self -) -Entity clone := method(resend init) -Entity takeDamage := method(amount, - health = health - amount - if(health <= 0, self die) -) -Entity die := method("Entity died" println) - -// Moveable capability -Moveable := Object clone -Moveable speed := 1 -Moveable moveTo := method(newX, newY, - x = newX - y = newY -) - -// Attacker capability -Attacker := Object clone -Attacker damage := 10 -Attacker attack := method(target, - target takeDamage(damage) -) - -// Compose entities -Player := Entity clone -Player appendProto(Moveable) -Player appendProto(Attacker) -Player speed = 5 -Player damage = 20 - -Enemy := Entity clone -Enemy appendProto(Moveable) -Enemy appendProto(Attacker) -Enemy speed = 3 -Enemy damage = 15 - -// Static entity -Turret := Entity clone -Turret appendProto(Attacker) -Turret damage = 25 - -// Usage -player := Player clone -enemy := Enemy clone -turret := Turret clone - -player moveTo(10, 10) -player attack(enemy) -turret attack(player) -``` - -## Conclusion - -Cloning and inheritance in Io demonstrate how complex behavior can emerge from simple mechanisms. Instead of classes, instances, and inheritance hierarchies defined at compile time, you have objects cloning objects, maintaining prototype links, and delegating message handling up the chain. - -This flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating "classes" as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile. - -Understanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren't just how you create objects—they're how you structure entire programs. - ---- - -*Next: [Chapter 7 - Control Flow](07-control-flow.md)* \ No newline at end of file diff --git a/07-control-flow.md b/07-control-flow.md deleted file mode 100644 index e480288..0000000 --- a/07-control-flow.md +++ /dev/null @@ -1,672 +0,0 @@ -# Chapter 7: Control Flow - -In most programming languages, control flow structures like `if`, `while`, and `for` are built-in syntax with special rules. In Io, they're just methods that receive messages. This chapter explores how Io's message-passing philosophy extends to control flow, and how you can create your own control structures. - -## Everything Is a Message - -Let's start with a simple comparison. In C or Java: - -```c -if (x > 5) { - printf("Big\n"); -} else { - printf("Small\n"); -} -``` - -This is special syntax that the compiler understands. But in Io: - -```io -if(x > 5, - "Big" println, - "Small" println -) -``` - -The `if` is just a method call! You can even see its implementation: - -```io -if println -// method(...) - -// You could redefine it (don't actually do this!) -Object if := method(condition, trueBlock, falseBlock, - "Making a decision!" println - resend // Call original if -) -``` - -## The if Method - -The `if` method takes two or three arguments: - -```io -// Two arguments: if-then -if(temperature > 30, - "It's hot!" println -) - -// Three arguments: if-then-else -if(temperature > 30, - "It's hot!" println, - "It's nice!" println -) - -// if returns the value of the executed block -result := if(5 > 3, "yes", "no") -result println // "yes" - -// Nested if -category := if(score > 90, "A", - if(score > 80, "B", - if(score > 70, "C", "F") - ) -) -``` - -## Understanding Blocks - -The key to Io's control flow is that code blocks are objects that aren't evaluated immediately: - -```io -// This prints immediately -"Hello" println - -// This creates a block object but doesn't execute it -block := method("Hello" println) - -// Execute it later -block call // Now it prints "Hello" - -// Blocks in if -if(true, - "This is a block" println // Not executed until if decides to -) -``` - -This lazy evaluation is crucial. If both branches of an `if` were evaluated immediately, both would execute! - -```io -// In a hypothetical eager language: -eagerIf := method(condition, trueValue, falseValue, - if(condition, trueValue, falseValue) -) - -x := 5 -eagerIf(x > 3, - "Greater" println, // This executes immediately - "Lesser" println // This also executes immediately! -) -// Would print both! - -// But Io's if receives unevaluated blocks -if(x > 3, - "Greater" println, // Only this executes - "Lesser" println // This never executes -) -``` - -## The while Loop - -The `while` method repeatedly evaluates its condition and body: - -```io -i := 0 -while(i < 5, - i println - i = i + 1 -) -// Prints 0, 1, 2, 3, 4 - -// while returns nil by default -result := while(false, "Never runs") -result println // nil - -// Infinite loops -while(true, - input := File standardInput readLine - if(input == "quit", break) - ("You said: " .. input) println -) -``` - -## The for Loop - -The `for` method provides a counting loop: - -```io -// Basic for loop -for(i, 1, 5, - i println -) -// Prints 1, 2, 3, 4, 5 - -// With step -for(i, 0, 10, 2, - i println -) -// Prints 0, 2, 4, 6, 8, 10 - -// Backward -for(i, 5, 1, - i println -) -// Prints 5, 4, 3, 2, 1 - -// for can return values -sum := 0 -for(i, 1, 100, - sum = sum + i -) -sum println // 5050 -``` - -## The loop Method - -Io provides a `loop` method for infinite loops: - -```io -count := 0 -loop( - count = count + 1 - if(count > 10, break) - count println -) - -// Equivalent to while(true, ...) -``` - -## break and continue - -These work like in other languages, but they're methods too: - -```io -// break exits the loop -for(i, 1, 10, - if(i == 5, break) - i println -) -// Prints 1, 2, 3, 4 - -// continue skips to next iteration -for(i, 1, 10, - if(i % 2 == 0, continue) - i println -) -// Prints 1, 3, 5, 7, 9 - -// break can return a value -result := for(i, 1, 100, - if(i * i > 50, break(i)) -) -result println // 8 (first i where i*i > 50) -``` - -## The repeat Method - -A simpler counting mechanism: - -```io -5 repeat("Hello" println) -// Prints "Hello" 5 times - -// repeat with index -5 repeat(i, - ("Count: " .. i) println -) -// Count: 0 -// Count: 1 -// Count: 2 -// Count: 3 -// Count: 4 -``` - -## Creating Custom Control Structures - -Since control structures are just methods, you can create your own: - -```io -// unless: opposite of if -Object unless := method(condition, falseBlock, - if(condition not, falseBlock call) -) - -unless(5 > 10, - "5 is not greater than 10" println -) - -// until: opposite of while -Object until := method(condition, body, - while(condition not, body) -) - -x := 0 -until(x > 5, - x println - x = x + 1 -) - -// times: repeat n times with cleaner syntax -Number times := method(body, - for(i, 1, self, body) -) - -3 times("Hello" println) -``` - -## The elseif Pattern - -Io uses `elseif` for chained conditionals: - -```io -score := 85 - -if(score >= 90) then( - "A" println -) elseif(score >= 80) then( - "B" println -) elseif(score >= 70) then( - "C" println -) else( - "F" println -) -// Prints "B" - -// This is actually a chain of methods -// if returns a special object when false -// that object has elseif and else methods -``` - -## Switch-like Behavior - -Io doesn't have a switch statement, but you can build one: - -```io -Object switch := method(value, - self switchValue := value - self -) - -Object case := method(testValue, action, - if(switchValue == testValue, - action call - self switchMatched := true - ) - self -) - -Object default := method(action, - if(hasSlot("switchMatched") not, - action call - ) - self -) - -// Usage -day := "Tuesday" - -switch(day) case("Monday", - "Start of the week" println -) case("Tuesday", - "Second day" println -) case("Friday", - "TGIF!" println -) default( - "Regular day" println -) -// Prints "Second day" -``` - -## Pattern Matching - -Build more sophisticated matching: - -```io -Object match := method( - self matchValue := call evalArgAt(0) - self matchContext := call sender - self -) - -Object when := method(pattern, action, - if(hasSlot("matchFound") not, - matched := false - - // Check different pattern types - if(pattern type == "Block", - matched = pattern call(matchValue), - matched = (pattern == matchValue) - ) - - if(matched, - self matchResult := action call(matchValue) - self matchFound := true - ) - ) - self -) - -Object otherwise := method(action, - if(hasSlot("matchFound") not, - self matchResult := action call(matchValue) - ) - matchResult -) - -// Usage -result := match(x) when( - block(v, v < 0), - method(v, "negative") -) when( - 0, - method(v, "zero") -) when( - block(v, v > 0), - method(v, "positive") -) otherwise( - method(v, "unknown") -) -``` - -## Iterating Over Collections - -Collections have their own iteration methods: - -```io -// List iteration -list(1, 2, 3) foreach(item, - item println -) - -// With index -list("a", "b", "c") foreach(i, item, - (i .. ": " .. item) println -) -// 0: a -// 1: b -// 2: c - -// Map iteration -map := Map clone -map atPut("name", "Alice") -map atPut("age", 30) - -map foreach(key, value, - (key .. " = " .. value) println -) -// name = Alice -// age = 30 -``` - -## Functional Control Flow - -Io supports functional programming patterns: - -```io -// map: transform each element -squares := list(1, 2, 3, 4) map(x, x * x) -squares println // list(1, 4, 9, 16) - -// select: filter elements -evens := list(1, 2, 3, 4, 5, 6) select(x, x % 2 == 0) -evens println // list(2, 4, 6) - -// detect: find first matching element -first_big := list(1, 3, 5, 7, 9) detect(x, x > 5) -first_big println // 7 - -// reduce: aggregate elements -sum := list(1, 2, 3, 4, 5) reduce(+) -sum println // 15 - -product := list(1, 2, 3, 4) reduce(a, b, a * b) -product println // 24 -``` - -## Lazy Evaluation Control - -Create control structures with lazy evaluation: - -```io -Object lazyIf := method( - condition := call argAt(0) - trueBlock := call argAt(1) - falseBlock := call argAt(2) - - if(condition doInContext(call sender), - trueBlock doInContext(call sender), - if(falseBlock, - falseBlock doInContext(call sender) - ) - ) -) - -// Both condition and blocks are lazy -x := 5 -lazyIf(x > 3 and computeExpensive(), - "True branch" println, - "False branch" println -) -``` - -## Exception Handling as Control Flow - -Io's `try` is also a control flow method: - -```io -try( - // Code that might fail - riskyOperation() -) catch(Exception, - "An error occurred" println -) - -// try-catch-finally pattern -result := try( - file := File with("data.txt") openForReading - file contents -) catch(Exception, e, - ("Error: " .. e message) println - nil -) finally( - if(file, file close) -) -``` - -## Performance Considerations - -Since control structures are methods, they have overhead: - -```io -// Method-based loop (slower) -i := 0 -while(i < 1000000, - i = i + 1 -) - -// But you can't really avoid it in Io -// The language is optimized for expressiveness over speed -``` - -## Advanced: Coroutine-based Control - -Io's coroutines enable advanced control flow: - -```io -// Generator pattern -Generator := Object clone -Generator init := method( - self coro := Coroutine currentCoroutine - self -) - -Generator yield := method(value, - coro pause(value) -) - -Generator fibonacci := method( - a := 0 - b := 1 - loop( - yield(a) - temp := a + b - a = b - b = temp - ) -) - -// Usage -gen := Generator clone -fib := gen @fibonacci // @ runs in new coroutine - -10 repeat( - fib resume println -) -// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 -``` - -## Common Patterns - -### Early Return Pattern - -```io -Object findFirst := method(list, condition, - list foreach(item, - if(condition call(item), - return item - ) - ) - nil -) - -result := findFirst(list(1, 2, 3, 4, 5), - block(x, x > 3) -) -result println // 4 -``` - -### Guard Clause Pattern - -```io -processData := method(data, - if(data isNil, return "No data") - if(data size == 0, return "Empty data") - if(data size > 1000, return "Too much data") - - // Process data - "Processed" return -) -``` - -### Loop with State - -```io -Object loopWithState := method(initial, condition, update, body, - state := initial - while(condition call(state), - body call(state) - state = update call(state) - ) - state -) - -// Sum squares until sum > 100 -result := loopWithState( - list(0, 1), // [sum, n] - block(state, state at(0) <= 100), - block(state, list(state at(0) + state at(1) squared, state at(1) + 1)), - block(state, ("n=" .. state at(1) .. " sum=" .. state at(0)) println) -) -``` - -## Debugging Control Flow - -```io -Object trace := method(label, - (label .. " - evaluating") println - self -) - -Object debugIf := method(condition, trueBlock, falseBlock, - "Evaluating condition..." println - result := condition - ("Condition is: " .. result) println - - if(result, - "Taking true branch" println - trueBlock, - "Taking false branch" println - falseBlock - ) -) - -x := 5 -debugIf(x trace("x") > trace("3") 3, - "Greater" println, - "Lesser" println -) -``` - -## Exercises - -1. **do-while Loop**: Implement a `doWhile` method that executes the body at least once. - -2. **for-each with Break**: Create a `forEachBreakable` that allows breaking with a return value. - -3. **Retry Logic**: Build a `retry` control structure that retries an operation n times on failure. - -4. **Parallel If**: Create a `parallelIf` that evaluates both branches concurrently and returns the first to complete. - -5. **State Machine**: Implement a state machine DSL using custom control structures. - -## Real-World Example: Retry with Backoff - -```io -Object retryWithBackoff := method(maxAttempts, baseDelay, operation, - attempt := 1 - lastError := nil - - while(attempt <= maxAttempts, - try( - return operation call(attempt) - ) catch(Exception, e, - lastError = e - if(attempt < maxAttempts, - delay := baseDelay * (2 pow(attempt - 1)) - ("Attempt " .. attempt .. " failed, waiting " .. delay .. "ms") println - System sleep(delay / 1000) - ) - ) - attempt = attempt + 1 - ) - - Exception raise("Failed after " .. maxAttempts .. " attempts: " .. lastError message) -) - -// Usage -result := retryWithBackoff(3, 100, - block(attempt, - ("Trying attempt " .. attempt) println - if(Random value < 0.7, - Exception raise("Random failure"), - "Success!" - ) - ) -) -``` - -## Conclusion - -Io's approach to control flow—implementing everything as methods rather than special syntax—is both radical and elegant. It demonstrates the power of Io's uniform message-passing model: when everything is a message, even fundamental programming constructs become malleable and extensible. - -This flexibility allows you to: -- Create domain-specific control structures -- Implement new programming paradigms -- Debug and trace control flow -- Understand exactly how your program executes - -The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs. - ---- - -*Next: [Chapter 8 - Collections](08-collections.md)* \ No newline at end of file diff --git a/08-collections.md b/08-collections.md deleted file mode 100644 index 7885ebb..0000000 --- a/08-collections.md +++ /dev/null @@ -1,704 +0,0 @@ -# Chapter 8: Collections - -Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types. - -## Lists: Ordered Collections - -Lists in Io are dynamic arrays that can hold any type of object: - -```io -// Creating lists -empty := list() -numbers := list(1, 2, 3, 4, 5) -mixed := list("hello", 42, true, Object clone) - -// Lists are objects -numbers type println // List - -// Basic operations -numbers size println // 5 -numbers isEmpty println // false -numbers first println // 1 -numbers last println // 5 -numbers at(2) println // 3 (zero-indexed) -``` - -### List Manipulation - -```io -fruits := list("apple", "banana") - -// Adding elements -fruits append("orange") -fruits prepend("grape") -fruits println // list(grape, apple, banana, orange) - -// Insert at position -fruits atInsert(2, "mango") -fruits println // list(grape, apple, mango, banana, orange) - -// Removing elements -fruits remove("mango") -fruits removeAt(0) -fruits pop // Removes and returns last element -fruits println // list(apple, banana) - -// Multiple operations -fruits appendSeq(list("kiwi", "peach")) -fruits println // list(apple, banana, kiwi, peach) -``` - -### List Iteration - -```io -numbers := list(1, 2, 3, 4, 5) - -// Basic iteration -numbers foreach(n, - n println -) - -// With index -numbers foreach(i, n, - (i .. ": " .. n) println -) - -// Reverse iteration -numbers reverseForEach(n, - n println -) -``` - -### Functional Operations - -```io -numbers := list(1, 2, 3, 4, 5) - -// Map: transform each element -squared := numbers map(x, x * x) -squared println // list(1, 4, 9, 16, 25) - -// Select: filter elements -evens := numbers select(x, x % 2 == 0) -evens println // list(2, 4) - -// Reject: inverse of select -odds := numbers reject(x, x % 2 == 0) -odds println // list(1, 3, 5) - -// Detect: find first match -firstEven := numbers detect(x, x % 2 == 0) -firstEven println // 2 - -// Reduce: aggregate -sum := numbers reduce(+) -sum println // 15 - -// Custom reduce -product := numbers reduce(a, b, a * b) -product println // 120 - -// Any/all predicates -numbers contains(3) println // true -numbers containsAll(list(2, 4)) println // true -numbers containsAny(list(10, 3)) println // true -``` - -### List Slicing and Manipulation - -```io -letters := list("a", "b", "c", "d", "e") - -// Slicing -letters slice(1, 3) println // list(b, c, d) -letters slice(2) println // list(c, d, e) - -// Copying -copy := letters copy -copy atPut(0, "z") -letters println // list(a, b, c, d, e) - unchanged -copy println // list(z, b, c, d, e) - -// Sorting -numbers := list(3, 1, 4, 1, 5, 9) -numbers sort println // list(1, 1, 3, 4, 5, 9) - -// Custom sort -people := list( - Object clone do(name := "Alice"; age := 30), - Object clone do(name := "Bob"; age := 25), - Object clone do(name := "Charlie"; age := 35) -) - -people sortBy(block(p, p age)) foreach(p, - (p name .. ": " .. p age) println -) -// Bob: 25 -// Alice: 30 -// Charlie: 35 -``` - -## Maps: Key-Value Stores - -Maps (also called dictionaries or hash tables) store key-value pairs: - -```io -// Creating maps -empty := Map clone -person := Map clone atPut("name", "Alice") atPut("age", 30) - -// Alternative creation -person := Map with( - "name", "Alice", - "age", 30, - "city", "New York" -) - -// Accessing values -person at("name") println // Alice -person at("missing") println // nil -person at("missing", "default") println // default - -// Setting values -person atPut("age", 31) -person atPut("email", "alice@example.com") - -// Checking keys -person hasKey("name") println // true -person hasKey("phone") println // false -``` - -### Map Operations - -```io -map := Map with("a", 1, "b", 2, "c", 3) - -// Get all keys and values -map keys println // list(a, b, c) -map values println // list(1, 2, 3) - -// Size and emptiness -map size println // 3 -map isEmpty println // false - -// Removing entries -map removeAt("b") -map println // Map_0x...: a=1, c=3 - -// Iteration -map foreach(key, value, - (key .. " => " .. value) println -) - -// Merging maps -other := Map with("c", 30, "d", 4) -map merge(other) -map println // a=1, c=30, d=4 (note c was overwritten) -``` - -### Maps as Objects - -Maps can act like objects with dynamic properties: - -```io -// Create object-like map -obj := Map clone -obj atPut("greet", method(name, - ("Hello, " .. name .. "!") println -)) -obj atPut("x", 10) -obj atPut("y", 20) - -// Use like object (sort of) -obj at("greet") call("World") // Hello, World! -obj at("x") println // 10 -``` - -## Sequences: String Handling - -Sequences are Io's strings, but they're mutable and act like byte arrays: - -```io -text := "Hello, World!" - -// Basic operations -text size println // 13 -text at(0) println // 72 (ASCII 'H') -text at(0) asCharacter println // H - -// Slicing -text slice(0, 5) println // Hello -text slice(7) println // World! - -// Searching -text findSeq("World") println // 7 (index) -text containsSeq("Hello") println // true -text beginsWithSeq("Hello") println // true -text endsWithSeq("!") println // true -``` - -### String Manipulation - -```io -text := " Hello, World! " - -// Trimming -text strip println // "Hello, World!" -text lstrip println // "Hello, World! " -text rstrip println // " Hello, World!" - -// Case conversion -"hello" upper println // HELLO -"WORLD" lower println // world -"hello world" asCapitalized println // Hello world - -// Replacement -"hello world" replaceSeq("world", "Io") println // hello Io -"abcabc" replaceFirstSeq("a", "X") println // Xbcabc - -// Splitting and joining -words := "apple,banana,orange" split(",") -words println // list(apple, banana, orange) - -words join("-") println // apple-banana-orange -``` - -### String Building - -```io -// Inefficient string concatenation -result := "" -for(i, 1, 1000, - result = result .. i .. ", " -) - -// Better: use a list -parts := list() -for(i, 1, 1000, - parts append(i) -) -result := parts join(", ") - -// Or use Sequence's mutable nature -seq := Sequence clone -for(i, 1, 100, - seq appendSeq(i asString) appendSeq(", ") -) -``` - -### Regular Expressions - -Io has built-in regex support: - -```io -text := "The year 2024 has 365 days" - -// Find matches -text findRegex("\\d+") println // MatchResult... -text allMatchesOfRegex("\\d+") foreach(match, - match println // 2024, 365 -) - -// Replace with regex -text replaceAllRegex("\\d+", "N") println // The year N has N days - -// Capture groups -email := "user@example.com" -match := email matchesOfRegex("(\\w+)@(\\w+\\.\\w+)") -if(match, - match at(1) println // user - match at(2) println // example.com -) -``` - -## Creating Custom Collections - -### Stack Implementation - -```io -Stack := List clone -Stack push := method(item, - self append(item) -) - -Stack pop := method( - if(size > 0, - removeAt(size - 1), - nil - ) -) - -Stack peek := method( - if(size > 0, - at(size - 1), - nil - ) -) - -// Usage -stack := Stack clone -stack push(1) push(2) push(3) -stack pop println // 3 -stack peek println // 2 -stack pop println // 2 -stack pop println // 1 -``` - -### Queue Implementation - -```io -Queue := Object clone -Queue init := method( - self items := list() - self -) - -Queue enqueue := method(item, - items append(item) - self -) - -Queue dequeue := method( - if(items size > 0, - items removeAt(0), - nil - ) -) - -Queue isEmpty := method(items isEmpty) -Queue size := method(items size) - -// Usage -queue := Queue clone init -queue enqueue("a") enqueue("b") enqueue("c") -queue dequeue println // a -queue dequeue println // b -queue size println // 1 -``` - -### Set Implementation - -```io -Set := Object clone -Set init := method( - self items := Map clone - self -) - -Set add := method(item, - items atPut(item asString, item) - self -) - -Set remove := method(item, - items removeAt(item asString) - self -) - -Set contains := method(item, - items hasKey(item asString) -) - -Set union := method(other, - result := Set clone init - items foreach(k, v, result add(v)) - other items foreach(k, v, result add(v)) - result -) - -Set intersection := method(other, - result := Set clone init - items foreach(k, v, - if(other contains(v), result add(v)) - ) - result -) - -// Usage -set1 := Set clone init add(1) add(2) add(3) -set2 := Set clone init add(2) add(3) add(4) - -set1 contains(2) println // true -union := set1 union(set2) -intersection := set1 intersection(set2) -``` - -## Advanced Collection Patterns - -### Lazy Evaluation - -```io -LazyList := Object clone -LazyList init := method(generator, - self generator := generator - self cache := list() - self -) - -LazyList at := method(index, - while(cache size <= index, - cache append(generator call(cache size)) - ) - cache at(index) -) - -LazyList take := method(n, - result := list() - for(i, 0, n - 1, - result append(self at(i)) - ) - result -) - -// Infinite fibonacci sequence -fibGen := LazyList clone init(block(n, - if(n < 2, n, self at(n - 1) + self at(n - 2)) -)) - -fibGen take(10) println // list(0, 1, 1, 2, 3, 5, 8, 13, 21, 34) -``` - -### Collection Pipeline - -```io -// Method chaining for data processing -data := list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - -result := data select(x, x % 2 == 0) \ - map(x, x * x) \ - select(x, x > 10) \ - reduce(+) - -result println // 120 (16 + 36 + 64) - -// Custom pipeline -List pipeline := method( - Pipeline clone setList(self) -) - -Pipeline := Object clone -Pipeline setList := method(list, - self list := list - self -) - -Pipeline where := method(predicate, - self list = list select(predicate) - self -) - -Pipeline transform := method(mapper, - self list = list map(mapper) - self -) - -Pipeline aggregate := method(reducer, - list reduce(reducer) -) - -// Usage -numbers := list(1, 2, 3, 4, 5) -total := numbers pipeline \ - where(x, x % 2 == 0) \ - transform(x, x * x) \ - aggregate(+) - -total println // 20 (4 + 16) -``` - -### Nested Collections - -```io -// Matrix as list of lists -matrix := list( - list(1, 2, 3), - list(4, 5, 6), - list(7, 8, 9) -) - -// Access element -matrix at(1) at(2) println // 6 - -// Transpose -transpose := method(matrix, - rows := matrix size - cols := matrix at(0) size - result := list() - - for(c, 0, cols - 1, - col := list() - for(r, 0, rows - 1, - col append(matrix at(r) at(c)) - ) - result append(col) - ) - result -) - -transpose(matrix) println -// list(list(1, 4, 7), list(2, 5, 8), list(3, 6, 9)) -``` - -## Performance Considerations - -```io -// List operations performance -list := List clone - -// O(1) operations -list append(item) // Constant time -list at(index) // Constant time -list size // Constant time - -// O(n) operations -list indexOf(item) // Linear search -list contains(item) // Linear search -list remove(item) // Linear search + shift - -// Map operations are generally O(1) -map := Map clone -map atPut(key, value) // Constant average -map at(key) // Constant average -map removeAt(key) // Constant average - -// Choose the right collection for your needs -``` - -## Collection Serialization - -```io -// JSON serialization -list := list(1, 2, 3, Map with("name", "Alice")) -json := list asJson -json println // [1,2,3,{"name":"Alice"}] - -// Deserialize -restored := json parseJson -restored println - -// Custom serialization -Collection := Object clone -Collection serialize := method( - result := list() - self foreach(item, - if(item hasSlot("serialize"), - result append(item serialize), - result append(item asString) - ) - ) - result join("|") -) -``` - -## Common Pitfalls - -### Shared References - -```io -// PROBLEM: Shared reference -original := list(1, 2, 3) -copy := original // Not a copy! -copy append(4) -original println // list(1, 2, 3, 4) - modified! - -// SOLUTION: Use copy -original := list(1, 2, 3) -copy := original copy -copy append(4) -original println // list(1, 2, 3) - unchanged -``` - -### Iterator Invalidation - -```io -// PROBLEM: Modifying while iterating -list := list(1, 2, 3, 4, 5) -list foreach(item, - if(item % 2 == 0, - list remove(item) // Dangerous! - ) -) - -// SOLUTION: Use select/reject or iterate on copy -list := list(1, 2, 3, 4, 5) -list = list reject(item, item % 2 == 0) -``` - -## Exercises - -1. **Circular Buffer**: Implement a fixed-size circular buffer that overwrites old elements. - -2. **MultiMap**: Create a map that can store multiple values per key. - -3. **Sorted List**: Implement a list that maintains sorted order on insertion. - -4. **Tree Structure**: Build a tree collection with parent-child relationships. - -5. **Graph**: Implement a graph data structure with nodes and edges. - -## Real-World Example: Todo List with Tags - -```io -TodoItem := Object clone -TodoItem init := method(description, - self description := description - self tags := Set clone init - self completed := false - self -) - -TodoList := Object clone -TodoList init := method( - self items := list() - self -) - -TodoList add := method(description, - item := TodoItem clone init(description) - items append(item) - item -) - -TodoList taggedWith := method(tag, - items select(item, item tags contains(tag)) -) - -TodoList pending := method( - items select(item, item completed not) -) - -TodoList complete := method(description, - item := items detect(i, i description == description) - if(item, item completed = true) - self -) - -// Usage -todos := TodoList clone init - -todos add("Write documentation") tags add("work") add("writing") -todos add("Fix bugs") tags add("work") add("urgent") -todos add("Buy groceries") tags add("personal") - -todos taggedWith("urgent") foreach(item, - item description println -) -// Fix bugs - -todos complete("Buy groceries") -todos pending foreach(item, - item description println -) -// Write documentation -// Fix bugs -``` - -## Conclusion - -Io's collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They're all objects, following Io's uniform object model, and support functional programming patterns like map, select, and reduce. - -The real power comes from Io's flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks. - ---- - -*Next: [Chapter 9 - Blocks and Closures](09-blocks-and-closures.md)* \ No newline at end of file diff --git a/09-blocks-and-closures.md b/09-blocks-and-closures.md deleted file mode 100644 index 201d865..0000000 --- a/09-blocks-and-closures.md +++ /dev/null @@ -1,660 +0,0 @@ -# Chapter 9: Blocks and Closures - -Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io. - -## Understanding Blocks and Methods - -In Io, `block` and `method` are similar but have a crucial difference: - -```io -// Block - creates its own scope -blk := block(x, x * 2) -blk call(5) println // 10 - -// Method - shares scope with receiver -obj := Object clone -obj value := 10 -obj meth := method(x, x * value) // Can access 'value' -obj blk := block(x, x * value) // Error when called - no 'value' in block scope - -obj meth(5) println // 50 -// obj blk call(5) // Exception: value not found -``` - -The key difference: -- **Methods** have access to `self` and the receiver's slots -- **Blocks** create their own scope and don't have automatic access to `self` - -## Creating and Calling Blocks - -```io -// Simple block -double := block(x, x * 2) -double call(5) println // 10 - -// Multi-argument block -add := block(a, b, a + b) -add call(3, 4) println // 7 - -// No-argument block -greet := block("Hello!" println) -greet call // Hello! - -// Blocks are objects -double type println // Block -double proto println // Block_0x... -``` - -## Blocks as Closures - -Blocks capture variables from their creation context: - -```io -makeCounter := method( - count := 0 - block( - count = count + 1 - count - ) -) - -counter1 := makeCounter() -counter2 := makeCounter() - -counter1 call println // 1 -counter1 call println // 2 -counter2 call println // 1 (independent) -counter1 call println // 3 -``` - -This is different from many languages where you need special syntax for closures: - -```javascript -// JavaScript -function makeCounter() { - let count = 0; - return function() { - count++; - return count; - }; -} -``` - -In Io, all blocks are closures automatically. - -## The Scope Chain - -Understanding scope is crucial for blocks: - -```io -x := "global" - -outer := method( - x := "outer" - - inner := block( - x println // What prints? - ) - - inner -) - -myBlock := outer() -myBlock call // "outer" - captured from creation context - -x = "changed global" -myBlock call // Still "outer" - closure captures variables, not global -``` - -## Methods and self - -Methods have access to `self` (the receiver): - -```io -Calculator := Object clone -Calculator value := 0 - -Calculator add := method(n, - self value = self value + n // Explicit self - value // Implicit self -) - -Calculator addBlock := block(n, - // No automatic self here! - // Would need to pass it explicitly -) - -calc := Calculator clone -calc add(5) println // 5 -calc add(3) println // 8 -``` - -## Block Arguments and Defaults - -```io -// Variable arguments -sumAll := block( - args := call message arguments - total := 0 - args foreach(arg, - total = total + call sender doMessage(arg) - ) - total -) - -sumAll call(1, 2, 3, 4, 5) println // 15 - -// Default arguments (manual) -greetWithDefault := block(name, - if(name isNil, name = "World") - ("Hello, " .. name .. "!") println -) - -greetWithDefault call("Alice") // Hello, Alice! -greetWithDefault call() // Hello, World! -``` - -## Higher-Order Functions - -Blocks enable functional programming patterns: - -```io -// Functions returning functions -makeMultiplier := method(factor, - block(x, x * factor) -) - -double := makeMultiplier(2) -triple := makeMultiplier(3) - -double call(5) println // 10 -triple call(5) println // 15 - -// Functions taking functions -twice := method(f, x, - f call(f call(x)) -) - -twice(block(n, n + 1), 5) println // 7 - -// Composition -compose := method(f, g, - block(x, f call(g call(x))) -) - -addOne := block(x, x + 1) -double := block(x, x * 2) -doubleThenAddOne := compose(addOne, double) - -doubleThenAddOne call(5) println // 11 -``` - -## Partial Application and Currying - -```io -// Partial application -add := block(a, b, a + b) - -addFive := block(x, add call(5, x)) -addFive call(3) println // 8 - -// Currying -curry := method(f, - block(a, - block(b, - f call(a, b) - ) - ) -) - -curriedAdd := curry(add) -add5 := curriedAdd call(5) -add5 call(3) println // 8 - -// More practical example -formatString := block(template, value, - template interpolate(value) -) - -curriedFormat := curry(formatString) -errorFormatter := curriedFormat call("Error: #{value}") -successFormatter := curriedFormat call("Success: #{value}") - -errorFormatter call("File not found") println // Error: File not found -successFormatter call("Operation complete") println // Success: Operation complete -``` - -## Lazy Evaluation with Blocks - -Blocks don't evaluate until called, enabling lazy patterns: - -```io -// Lazy if (already built-in, but here's how it works) -lazyIf := method(condition, trueBlock, falseBlock, - if(condition, - trueBlock call, - falseBlock call - ) -) - -x := 5 -lazyIf(x > 3, - block("Greater" println), - block("Lesser" println) -) - -// Lazy infinite sequences -naturals := method(start, - block( - n := start - block( - current := n - n = n + 1 - current - ) - ) call -) - -seq := naturals(1) -5 repeat(seq call println) // 1, 2, 3, 4, 5 -``` - -## Memoization - -Use closures to cache expensive computations: - -```io -memoize := method(f, - cache := Map clone - - block( - args := call message arguments - key := args asString - - if(cache hasKey(key), - cache at(key), - result := f call(args) - cache atPut(key, result) - result - ) - ) -) - -// Expensive fibonacci -fib := block(n, - if(n < 2, n, fib call(n - 1) + fib call(n - 2)) -) - -// Memoized version -fastFib := memoize(fib) - -// Much faster on repeated calls -time(fib call(30)) println -time(fastFib call(30)) println -``` - -## Block Introspection - -Blocks are objects you can inspect: - -```io -myBlock := block(x, y, x + y * 2) - -// Inspect structure -myBlock argumentNames println // list(x, y) -myBlock code println // x +(y *(2)) - -// Modify blocks -myBlock setArgumentNames(list("a", "b")) -myBlock argumentNames println // list(a, b) - -// Create blocks programmatically -code := "a + b" -args := list("a", "b") -dynamicBlock := Block clone setArgumentNames(args) setCode(code) -dynamicBlock call(3, 4) println // 7 -``` - -## Blocks in Data Structures - -```io -// Table of operations -operations := Map with( - "+", block(a, b, a + b), - "-", block(a, b, a - b), - "*", block(a, b, a * b), - "/", block(a, b, a / b) -) - -calculate := method(op, a, b, - operations at(op) call(a, b) -) - -calculate("+", 5, 3) println // 8 -calculate("*", 4, 7) println // 28 - -// Event handlers -EventEmitter := Object clone -EventEmitter init := method( - self events := Map clone - self -) - -EventEmitter on := method(event, handler, - if(events hasKey(event) not, - events atPut(event, list()) - ) - events at(event) append(handler) - self -) - -EventEmitter emit := method(event, data, - if(events hasKey(event), - events at(event) foreach(handler, - handler call(data) - ) - ) - self -) - -// Usage -emitter := EventEmitter clone init -emitter on("click", block(data, - ("Clicked at: " .. data) println -)) -emitter on("click", block(data, - ("Another handler: " .. data) println -)) - -emitter emit("click", "x=10, y=20") -// Clicked at: x=10, y=20 -// Another handler: x=10, y=20 -``` - -## Control Flow with Blocks - -Create custom control structures: - -```io -// Retry logic -retry := method(times, block, - attempts := 0 - loop( - attempts = attempts + 1 - e := try(result := block call) - - if(e isNil, return result) - if(attempts >= times, Exception raise(e)) - - ("Attempt " .. attempts .. " failed, retrying...") println - ) -) - -// Usage -result := retry(3, block( - if(Random value < 0.7, - Exception raise("Random failure"), - "Success!" - ) -)) - -// While with condition block -whileTrue := method(conditionBlock, bodyBlock, - while(conditionBlock call, bodyBlock call) -) - -i := 0 -whileTrue( - block(i < 5), - block( - i println - i = i + 1 - ) -) -``` - -## Performance Considerations - -```io -// Method vs Block performance -obj := Object clone -obj value := 10 - -obj method1 := method(x, x + value) -obj block1 := block(x, x + 10) - -// Methods are slightly faster for object operations -time(100000 repeat(obj method1(5))) -time(100000 repeat(obj block1 call(5))) - -// But blocks are better for functional patterns -numbers := list(1, 2, 3, 4, 5) -time(numbers map(x, x * 2)) // Using block syntax -``` - -## Advanced Patterns - -### Continuation-Style Programming - -```io -// Continuation passing style -factorial := method(n, continuation, - if(n <= 1, - continuation call(1), - factorial(n - 1, block(result, - continuation call(n * result) - )) - ) -) - -factorial(5, block(result, result println)) // 120 -``` - -### Monadic Patterns - -```io -// Maybe monad -Maybe := Object clone -Maybe Nothing := Maybe clone -Maybe Just := method(value, - m := Maybe clone - m value := value - m isNothing := false - m -) -Maybe Nothing isNothing := true - -Maybe bind := method(f, - if(isNothing, Maybe Nothing, f call(value)) -) - -Maybe map := method(f, - if(isNothing, - Maybe Nothing, - Maybe Just(f call(value)) - ) -) - -// Usage -result := Maybe Just(5) \ - map(block(x, x * 2)) \ - bind(block(x, - if(x > 5, - Maybe Just(x), - Maybe Nothing) - )) \ - map(block(x, x + 1)) - -if(result isNothing not, - result value println // 11 -) -``` - -### Transducers - -```io -// Composable transformations -mapping := method(f, - method(reducer, - block(acc, item, - reducer call(acc, f call(item)) - ) - ) -) - -filtering := method(pred, - method(reducer, - block(acc, item, - if(pred call(item), - reducer call(acc, item), - acc - ) - ) - ) -) - -// Compose transducers -transduce := method(xform, reducer, init, coll, - xreducer := xform call(reducer) - coll foreach(item, - init = xreducer call(init, item) - ) - init -) - -// Usage -xform := filtering(block(x, x % 2 == 0)) call( - mapping(block(x, x * 2)) -) - -result := transduce(xform, - block(acc, x, acc + x), - 0, - list(1, 2, 3, 4, 5, 6) -) -result println // 24 (2*2 + 4*2 + 6*2) -``` - -## Common Pitfalls - -### Variable Capture - -```io -// PROBLEM: Loop variable capture -handlers := list() -for(i, 1, 3, - handlers append(block(i println)) -) - -handlers foreach(h, h call) // All print 3! - -// SOLUTION: Create new scope -handlers := list() -for(i, 1, 3, - handlers append( - method(n, block(n println)) call(i) - ) -) - -handlers foreach(h, h call) // 1, 2, 3 -``` - -### Memory Leaks with Closures - -```io -// PROBLEM: Closure keeps large object alive -makeClosure := method( - hugeData := List clone - 10000 repeat(hugeData append(Random value)) - - block(x, x * 2) // Doesn't use hugeData but keeps it alive! -) - -// SOLUTION: Be explicit about captured variables -makeClosure := method( - hugeData := List clone - 10000 repeat(hugeData append(Random value)) - processedValue := hugeData size // Extract what you need - hugeData = nil // Release reference - - block(x, x * processedValue) -) -``` - -## Exercises - -1. **Promise Implementation**: Create a Promise/Future system using blocks for async operations. - -2. **Stream Processing**: Build a lazy stream processor with map, filter, and reduce. - -3. **Function Decorator**: Implement decorators for logging, timing, and caching. - -4. **Parser Combinators**: Create a simple parser combinator library using blocks. - -5. **Reactive System**: Build a simple FRP (Functional Reactive Programming) system. - -## Real-World Example: Pipeline Builder - -```io -Pipeline := Object clone -Pipeline init := method( - self steps := list() - self -) - -Pipeline add := method(step, - steps append(step) - self -) - -Pipeline map := method(f, - self add(block(data, - data map(f) - )) -) - -Pipeline filter := method(pred, - self add(block(data, - data select(pred) - )) -) - -Pipeline tap := method(f, - self add(block(data, - f call(data) - data - )) -) - -Pipeline run := method(input, - result := input - steps foreach(step, - result = step call(result) - ) - result -) - -// Usage -pipeline := Pipeline clone init \ - filter(block(x, x % 2 == 0)) \ - map(block(x, x * x)) \ - tap(block(data, ("After squaring: " .. data) println)) \ - filter(block(x, x > 10)) \ - map(block(x, x asString)) - -result := pipeline run(list(1, 2, 3, 4, 5, 6)) -// After squaring: list(4, 16, 36) -result println // list("16", "36") -``` - -## Conclusion - -Blocks and closures are fundamental to Io's expressiveness. They're not just anonymous functions—they're first-class objects that capture context, enable functional programming, and allow you to extend the language with new control structures. - -The distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io's scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement. - -Understanding blocks deeply unlocks Io's full potential, enabling you to write code that's both powerful and elegant. - ---- - -*Next: [Chapter 10 - Exceptions](10-exceptions.md)* \ No newline at end of file diff --git a/10-exceptions.md b/10-exceptions.md deleted file mode 100644 index 40a40d1..0000000 --- a/10-exceptions.md +++ /dev/null @@ -1,691 +0,0 @@ -# Chapter 10: Exceptions - -Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types. - -## Basic Exception Handling - -Io uses `try`, `catch`, and `raise` for exception handling: - -```io -// Basic try-catch -try( - 10 / 0 // Division by zero -) catch(Exception, e, - ("Error: " .. e message) println -) -// Error: divide by zero - -// Multiple catch blocks -try( - someRiskyOperation() -) catch(TypeError, e, - "Type error occurred" println -) catch(IOException, e, - "IO error occurred" println -) catch(Exception, e, - "Some other error occurred" println -) -``` - -Compare with other languages: - -```python -# Python -try: - result = 10 / 0 -except ZeroDivisionError as e: - print(f"Error: {e}") -``` - -```java -// Java -try { - int result = 10 / 0; -} catch (ArithmeticException e) { - System.out.println("Error: " + e.getMessage()); -} -``` - -## Raising Exceptions - -```io -// Raise a simple exception -Exception raise("Something went wrong") - -// Raise with more information -e := Exception clone -e setMessage("File not found") -e raise - -// Conditional raising -validateAge := method(age, - if(age < 0, Exception raise("Age cannot be negative")) - if(age > 150, Exception raise("Age seems unrealistic")) - age -) - -try( - validateAge(-5) -) catch(Exception, e, - e message println // Age cannot be negative -) -``` - -## Exception Objects - -Exceptions are just objects: - -```io -// Examine exception structure -e := Exception clone -e type println // Exception -e proto println // Object_0x... - -// Exception slots -e setMessage("Test error") -e message println // Test error - -// Stack trace -try( - Exception raise("Test") -) catch(Exception, e, - e showStack // Prints full stack trace - e coroutine println // The coroutine where error occurred -) -``` - -## Creating Custom Exceptions - -```io -// Define custom exception types -ValidationError := Exception clone -ValidationError type := "ValidationError" - -NetworkError := Exception clone -NetworkError type := "NetworkError" -NetworkError code := nil -NetworkError setCode := method(c, self code = c; self) - -// Use custom exceptions -validateEmail := method(email, - if(email containsSeq("@") not, - ValidationError clone setMessage("Invalid email format") raise - ) - email -) - -fetchData := method(url, - // Simulate network error - if(Random value < 0.3, - NetworkError clone setMessage("Connection timeout") setCode(408) raise - ) - "data" -) - -// Handle specific exception types -try( - validateEmail("badEmail") -) catch(ValidationError, e, - ("Validation failed: " .. e message) println -) catch(Exception, e, - ("Unexpected error: " .. e message) println -) -``` - -## The finally Block - -```io -// Ensure cleanup with finally -file := nil -try( - file = File with("data.txt") openForReading - contents := file contents - processData(contents) -) catch(Exception, e, - ("Error reading file: " .. e message) println -) finally( - if(file, file close) - "Cleanup complete" println -) - -// finally always executes -result := try( - "Success" println - 42 -) catch(Exception, e, - "Error" println - 0 -) finally( - "Always runs" println -) -// Prints: Success, Always runs -result println // 42 -``` - -## Return Values and Exceptions - -```io -// try returns a value -result := try( - 10 / 2 -) catch(Exception, e, - 0 // Default value on error -) -result println // 5 - -// With error -result := try( - 10 / 0 -) catch(Exception, e, - 0 // Default value on error -) -result println // 0 - -// Pattern: Result or default -safeDiv := method(a, b, - try(a / b) catch(Exception, 0) -) - -safeDiv(10, 2) println // 5 -safeDiv(10, 0) println // 0 -``` - -## Exception Propagation - -Exceptions bubble up through the call stack: - -```io -level3 := method( - Exception raise("Error at level 3") -) - -level2 := method( - "Level 2 start" println - level3() - "Level 2 end" println // Never reached -) - -level1 := method( - "Level 1 start" println - level2() - "Level 1 end" println // Never reached -) - -try( - level1() -) catch(Exception, e, - ("Caught at top level: " .. e message) println -) -// Level 1 start -// Level 2 start -// Caught at top level: Error at level 3 -``` - -## Rethrowing Exceptions - -```io -processFile := method(filename, - try( - file := File with(filename) openForReading - // Process file - ) catch(Exception, e, - ("Failed to process " .. filename) println - e raise // Rethrow the original exception - ) -) - -try( - processFile("nonexistent.txt") -) catch(Exception, e, - "Caught rethrown exception" println -) -``` - -## Error Recovery Patterns - -### Retry Pattern - -```io -retryOperation := method(operation, maxAttempts, - attempts := 0 - lastError := nil - - while(attempts < maxAttempts, - attempts = attempts + 1 - - e := try( - return operation call(attempts) - ) - - if(e, - lastError = e - ("Attempt " .. attempts .. " failed: " .. e message) println - if(attempts < maxAttempts, wait(0.5)) - ) - ) - - Exception raise("All " .. maxAttempts .. " attempts failed. Last error: " .. lastError message) -) - -// Usage -result := retryOperation( - block(attempt, - if(Random value < 0.7, - Exception raise("Random failure"), - "Success on attempt " .. attempt - ) - ), - 3 -) -``` - -### Circuit Breaker - -```io -CircuitBreaker := Object clone -CircuitBreaker init := method(threshold, timeout, - self failureCount := 0 - self threshold := threshold - self timeout := timeout - self state := "closed" // closed, open, half-open - self lastFailureTime := nil - self -) - -CircuitBreaker call := method(operation, - if(state == "open", - if(Date now - lastFailureTime > timeout, - state = "half-open" - "Circuit breaker entering half-open state" println, - Exception raise("Circuit breaker is open") - ) - ) - - e := try( - result := operation call - if(state == "half-open", - state = "closed" - failureCount = 0 - "Circuit breaker closed" println - ) - return result - ) - - if(e, - failureCount = failureCount + 1 - lastFailureTime = Date now - - if(failureCount >= threshold, - state = "open" - "Circuit breaker opened" println - ) - - e raise - ) -) - -// Usage -breaker := CircuitBreaker clone init(3, 5) - -unreliableService := block( - if(Random value < 0.8, - Exception raise("Service unavailable"), - "Service response" - ) -) - -5 repeat( - try( - breaker call(unreliableService) println - ) catch(Exception, e, - ("Failed: " .. e message) println - ) - wait(1) -) -``` - -## Assertion and Validation - -```io -// Simple assertion -assert := method(condition, message, - if(condition not, - Exception raise(message ifNilEval("Assertion failed")) - ) -) - -assert(5 > 3, "Math is broken") -// assert(3 > 5, "This will fail") - -// Validation framework -Validator := Object clone -Validator rules := list() - -Validator addRule := method(rule, message, - rules append(list(rule, message)) - self -) - -Validator validate := method(value, - errors := list() - - rules foreach(rule, - if(rule at(0) call(value) not, - errors append(rule at(1)) - ) - ) - - if(errors size > 0, - ValidationError clone setMessage(errors join(", ")) raise - ) - - value -) - -// Usage -ageValidator := Validator clone \ - addRule(block(v, v isKindOf(Number)), "Must be a number") \ - addRule(block(v, v >= 0), "Must be non-negative") \ - addRule(block(v, v <= 150), "Must be realistic") - -try( - ageValidator validate(25) println // 25 - ageValidator validate(-5) // Throws -) catch(ValidationError, e, - e message println // Must be non-negative -) -``` - -## Exception Context and Debugging - -```io -// Enhanced exception with context -ContextualException := Exception clone -ContextualException context := Map clone - -ContextualException addContext := method(key, value, - context atPut(key, value) - self -) - -ContextualException describe := method( - result := message .. "\nContext:\n" - context foreach(key, value, - result = result .. " " .. key .. ": " .. value .. "\n" - ) - result -) - -// Usage -processUser := method(userData, - if(userData at("age") < 18, - ContextualException clone \ - setMessage("User too young") \ - addContext("userId", userData at("id")) \ - addContext("age", userData at("age")) \ - addContext("timestamp", Date now) \ - raise - ) -) - -try( - processUser(Map with("id", 123, "age", 16)) -) catch(ContextualException, e, - e describe println -) -``` - -## Resource Management - -```io -// RAII-style resource management -withResource := method(resourceCreator, resourceUser, - resource := nil - try( - resource = resourceCreator call - resourceUser call(resource) - ) finally( - if(resource and resource hasSlot("close"), - resource close - ) - ) -) - -// Usage -withResource( - block(File with("test.txt") openForReading), - block(file, - file contents println - ) -) - -// Database connection example -withConnection := method(dbUrl, operation, - conn := nil - try( - conn = Database connect(dbUrl) - conn beginTransaction - result := operation call(conn) - conn commit - result - ) catch(Exception, e, - if(conn, conn rollback) - e raise - ) finally( - if(conn, conn close) - ) -) -``` - -## Global Exception Handling - -```io -// Install global exception handler -System handleException := method(e, - logFile := File with("errors.log") openForAppending - logFile write(Date now asString .. " - " .. e message .. "\n") - logFile close - - // Original behavior - e showStack - System exit(1) -) - -// Uncaught exceptions now get logged -// Exception raise("Uncaught error") -``` - -## Testing with Exceptions - -```io -// Test framework with exception support -Test := Object clone -Test assertRaises := method(exceptionType, block, - raised := false - try( - block call - ) catch(Exception, e, - if(e type == exceptionType type, - raised = true, - Exception raise("Wrong exception type: expected " .. exceptionType type .. ", got " .. e type) - ) - ) - - if(raised not, - Exception raise("Expected exception " .. exceptionType type .. " was not raised") - ) -) - -// Usage -Test assertRaises(ValidationError, block( - validateEmail("invalid") -)) -"Test passed" println -``` - -## Performance Considerations - -```io -// Exceptions have overhead -benchmark := method(name, iterations, block, - start := Date now - iterations repeat(block) - elapsed := Date now - start - (name .. ": " .. elapsed) println -) - -// Without exceptions -benchmark("No exceptions", 100000, block( - if(Random value < 0.1, nil, "success") -)) - -// With exceptions -benchmark("With exceptions", 100000, block( - try( - if(Random value < 0.1, Exception raise("error")) - "success" - ) catch(Exception, nil) -)) - -// Exceptions are slower - use for exceptional cases, not control flow -``` - -## Common Pitfalls - -### Catching Too Broadly - -```io -// BAD: Catches everything, hiding bugs -try( - complexOperation() -) catch(Exception, e, - // Silently ignore all errors -) - -// GOOD: Catch specific exceptions -try( - complexOperation() -) catch(NetworkError, e, - handleNetworkError(e) -) catch(ValidationError, e, - handleValidationError(e) -) -``` - -### Resource Leaks - -```io -// BAD: File not closed on error -file := File with("data.txt") openForReading -processFile(file) // If this throws, file never closes -file close - -// GOOD: Use finally -file := nil -try( - file = File with("data.txt") openForReading - processFile(file) -) finally( - if(file, file close) -) -``` - -## Exercises - -1. **Result Type**: Implement a Result type that can be either Ok(value) or Error(error), similar to Rust. - -2. **Retry with Exponential Backoff**: Create a retry mechanism with exponential backoff and jitter. - -3. **Exception Logger**: Build a logging system that captures and categorizes exceptions. - -4. **Validation Chain**: Create a validation system that accumulates all errors instead of failing on first. - -5. **Async Exception Handling**: Implement exception handling for coroutine-based async operations. - -## Real-World Example: HTTP Client with Error Handling - -```io -HttpClient := Object clone -HttpClient timeoutMs := 5000 -HttpClient maxRetries := 3 - -HttpError := Exception clone -HttpError statusCode := nil - -HttpClient get := method(url, - retryCount := 0 - - loop( - try( - response := self doRequest(url) - - if(response statusCode >= 200 and response statusCode < 300, - return response body - ) - - if(response statusCode >= 400 and response statusCode < 500, - // Client error - don't retry - HttpError clone \ - setMessage("HTTP " .. response statusCode) \ - setSlot("statusCode", response statusCode) \ - raise - ) - - // Server error - might retry - if(response statusCode >= 500, - error := HttpError clone \ - setMessage("Server error: " .. response statusCode) \ - setSlot("statusCode", response statusCode) - - if(retryCount < maxRetries, - retryCount = retryCount + 1 - delay := (2 pow(retryCount)) * 100 - ("Retry " .. retryCount .. " after " .. delay .. "ms") println - wait(delay / 1000) - continue, - error raise - ) - ) - - ) catch(NetworkError, e, - if(retryCount < maxRetries, - retryCount = retryCount + 1 - ("Network error, retry " .. retryCount) println - wait(1) - continue, - e raise - ) - ) - ) -) - -// Usage with comprehensive error handling -fetchUserData := method(userId, - try( - data := HttpClient get("https://api.example.com/users/" .. userId) - JSON parse(data) - ) catch(HttpError, e, - if(e statusCode == 404, - nil, // User not found - if(e statusCode == 401, - Exception raise("Authentication required"), - Exception raise("HTTP error: " .. e statusCode) - ) - ) - ) catch(NetworkError, e, - Exception raise("Network unavailable") - ) catch(Exception, e, - Exception raise("Unexpected error: " .. e message) - ) -) -``` - -## Conclusion - -Io's exception system demonstrates the language's consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling. - -The key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with `finally` blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications. - ---- - -*Next: [Chapter 11 - Metaprogramming](11-metaprogramming.md)* \ No newline at end of file diff --git a/11-metaprogramming.md b/11-metaprogramming.md deleted file mode 100644 index 006ba83..0000000 --- a/11-metaprogramming.md +++ /dev/null @@ -1,683 +0,0 @@ -# Chapter 11: Metaprogramming - -Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io's powerful metaprogramming capabilities. - -## Messages as Data - -In Io, code is data. Messages are objects you can create, inspect, and manipulate: - -```io -// Create a message from code -msg := message(2 + 3 * 4) - -// Inspect its structure -msg println // 2 +(3 *(4)) -msg name println // + -msg arguments println // list(Message_0x...) -msg arguments at(0) println // 3 *(4) - -// Evaluate it -result := msg doInContext(Lobby) -result println // 14 - -// Modify it -msg setName("*") -msg doInContext(Lobby) println // 6 (now it's 2 * 3 * 4) -``` - -Compare this to Lisp's code-as-data philosophy: - -```lisp -; Lisp -(defparameter code '(+ 2 (* 3 4))) -(eval code) ; 14 -``` - -But Io uses messages instead of lists, which feels more natural for object-oriented code. - -## Building Messages Programmatically - -```io -// Build a message from scratch -msg := Message clone -msg setName("println") -msg setArguments(list(Message clone setName("\"Hello, World!\""))) - -// Execute it -Lobby doMessage(msg) // Hello, World! - -// Build more complex messages -createAdder := method(n, - msg := Message clone setName("+") - msg setArguments(list(Message clone setName(n asString))) - msg -) - -adder5 := createAdder(5) -7 doMessage(adder5) println // 12 -``` - -## Method Introspection - -Methods are objects you can examine and modify: - -```io -obj := Object clone -obj greet := method(name, "Hello, " .. name .. "!") - -// Get the method object -m := obj getSlot("greet") -m type println // Block -m argumentNames println // list(name) -m code println // "Hello, " ..(name) ..("!") - -// Modify method implementation -obj greet = method(name, "Goodbye, " .. name .. "!") -obj greet("World") println // Goodbye, World! - -// Copy methods between objects -other := Object clone -other sayHi := obj getSlot("greet") -other sayHi("Io") println // Goodbye, Io! -``` - -## The call Object - -The `call` object provides runtime context information: - -```io -Object introspect := method( - "=== Call Introspection ===" println - ("Sender: " .. call sender type) println - ("Target: " .. call target type) println - ("Message: " .. call message) println - ("Arguments: " .. call message arguments) println - ("Activated: " .. call activated) println - "========================" println -) - -TestObj := Object clone -TestObj test := method(a, b, - introspect - a + b -) - -TestObj test(5, 3) -// === Call Introspection === -// Sender: Lobby -// Target: TestObj -// Message: introspect -// Arguments: list() -// Activated: method(...) -// ======================== -``` - -## Dynamic Method Creation - -Create methods at runtime: - -```io -// Create getters and setters dynamically -Object addProperty := method(name, defaultValue, - // Create storage slot - self setSlot("_" .. name, defaultValue) - - // Create getter - self setSlot(name, - method(self getSlot("_" .. call message name)) - ) - - // Create setter - self setSlot("set" .. name asCapitalized, - method(value, - self setSlot("_" .. call message name beforeSeq("set") asLowercase, value) - self // For chaining - ) - ) -) - -Person := Object clone -Person addProperty("name", "Unknown") -Person addProperty("age", 0) - -p := Person clone -p setName("Alice") setAge(30) -p name println // Alice -p age println // 30 -``` - -## Method Missing Pattern - -Intercept undefined method calls: - -```io -DynamicObject := Object clone -DynamicObject forward := method( - messageName := call message name - args := call message arguments - - ("Intercepted: " .. messageName) println - ("Arguments: " .. args) println - - // Handle dynamically - if(messageName beginsWithSeq("get"), - property := messageName afterSeq("get") asLowercase - return self getSlot(property) - ) - - if(messageName beginsWithSeq("set"), - property := messageName afterSeq("set") asLowercase - value := call evalArgAt(0) - return self setSlot(property, value) - ) - - Exception raise("Unknown method: " .. messageName) -) - -obj := DynamicObject clone -obj setName("Bob") // Intercepted: setName -obj getName println // Bob -``` - -## Code Generation - -Generate code as strings and evaluate: - -```io -// Generate a class-like structure -generateClass := method(className, properties, - code := className .. " := Object clone\n" - - // Generate init method - code = code .. className .. " init := method(\n" - properties foreach(prop, - code = code .. " self " .. prop .. " := nil\n" - ) - code = code .. " self\n)\n" - - // Generate property accessors - properties foreach(prop, - // Getter - code = code .. className .. " " .. prop .. " := method(_" .. prop .. ")\n" - // Setter - code = code .. className .. " set" .. prop asCapitalized .. " := method(v, _" .. prop .. " = v; self)\n" - ) - - code doString // Evaluate the generated code - Lobby getSlot(className) // Return the created object -) - -// Use the generator -Car := generateClass("Car", list("make", "model", "year")) -myCar := Car clone init -myCar setMake("Toyota") setModel("Camry") setYear(2020) -myCar make println // Toyota -``` - -## Aspect-Oriented Programming - -Implement cross-cutting concerns: - -```io -// Method wrapping for logging -Object addLogging := method(methodName, - original := self getSlot(methodName) - - self setSlot(methodName, method( - ("Calling " .. methodName .. " with args: " .. call message arguments) println - result := nil - e := try(result = original doMessage(call message, call sender)) - if(e, - ("Error in " .. methodName .. ": " .. e message) println - e raise, - ("Returned: " .. result) println - result - ) - )) -) - -Calculator := Object clone -Calculator add := method(a, b, a + b) -Calculator divide := method(a, b, a / b) - -Calculator addLogging("add") -Calculator addLogging("divide") - -Calculator add(5, 3) -// Calling add with args: list(5, 3) -// Returned: 8 - -Calculator divide(10, 0) -// Calling divide with args: list(10, 0) -// Error in divide: divide by zero -``` - -## Macro System - -Io's macros transform code before evaluation: - -```io -// Define a macro -Object unless := macro(condition, action, - // Macros receive unevaluated arguments as messages - // Transform to if(condition not, action) - message(if) setArguments( - list( - message(not) setTarget(condition), - action - ) - ) -) - -// Use the macro -x := 5 -unless(x > 10, "x is not greater than 10" println) -// x is not greater than 10 - -// Timing macro -Object time := macro(code, - // Generate timing code - message(do) setArguments(list( - message(start := Date now), - code, - message(elapsed := Date now - start), - message(("Elapsed: " .. elapsed) println), - message(result) - )) -) - -// Use it -time( - sum := 0 - for(i, 1, 1000000, sum = sum + i) - sum -) -// Elapsed: 0.234 -``` - -## Self-Modifying Code - -Objects can modify their own methods: - -```io -Counter := Object clone -Counter count := 0 -Counter increment := method( - count = count + 1 - - // Self-modify after 5 calls - if(count >= 5, - self increment = method( - Exception raise("Counter limit reached") - ) - ) - - count -) - -c := Counter clone -5 repeat(i, c increment println) // 1, 2, 3, 4, 5 -c increment // Exception: Counter limit reached -``` - -## Reflection API - -Io provides comprehensive reflection capabilities: - -```io -// Object introspection utilities -Object describe := method( - ("Type: " .. self type) println - - "Local Slots:" println - self slotNames sort foreach(name, - value := self getSlot(name) - (" " .. name .. " = " .. value type) println - ) - - "Proto chain:" println - proto := self proto - while(proto and proto != Object, - (" -> " .. proto type) println - proto = proto proto - ) -) - -// Usage -person := Object clone -person name := "Alice" -person age := 30 -person greet := method("Hello!") - -person describe -// Type: Object -// Local Slots: -// age = Number -// greet = Block -// name = Sequence -// Proto chain: -// -> Object -``` - -## DSL Creation with Metaprogramming - -Build domain-specific languages: - -```io -// SQL-like DSL -Table := Object clone -Table columns := list() -Table rows := list() - -Table select := method( - query := SelectQuery clone - query table := self - query -) - -SelectQuery := Object clone -SelectQuery conditions := list() - -SelectQuery where := method( - // Parse conditions from arguments - args := call message arguments - args foreach(arg, - conditions append(arg) - ) - self -) - -SelectQuery execute := method( - table rows select(row, - result := true - conditions foreach(cond, - result = result and cond doInContext(row) - ) - result - ) -) - -// Usage -users := Table clone -users columns = list("name", "age", "city") -users rows = list( - Object clone do(name := "Alice"; age := 30; city := "NYC"), - Object clone do(name := "Bob"; age := 25; city := "LA"), - Object clone do(name := "Charlie"; age := 35; city := "NYC") -) - -results := users select where(age > 25, city == "NYC") execute -results foreach(r, (r name .. ": " .. r age) println) -// Alice: 30 -// Charlie: 35 -``` - -## Performance Profiling - -Use metaprogramming for profiling: - -```io -Profiler := Object clone -Profiler stats := Map clone - -Object profile := method(methodName, - original := self getSlot(methodName) - - self setSlot(methodName, method( - start := Date now - result := original doMessage(call message, call sender) - elapsed := Date now - start - - key := self type .. "::" .. methodName - if(Profiler stats hasKey(key) not, - Profiler stats atPut(key, list(0, 0)) - ) - - stats := Profiler stats at(key) - stats atPut(0, stats at(0) + 1) // Count - stats atPut(1, stats at(1) + elapsed) // Total time - - result - )) -) - -Profiler report := method( - "=== Profiling Report ===" println - stats foreach(key, data, - avg := data at(1) / data at(0) - (key .. ": " .. data at(0) .. " calls, " .. - data at(1) .. "s total, " .. avg .. "s avg") println - ) -) - -// Usage -Math := Object clone -Math factorial := method(n, - if(n <= 1, 1, n * factorial(n - 1)) -) -Math profile("factorial") - -10 repeat(Math factorial(20)) -Profiler report -``` - -## Compile-Time Computation - -Use macros for compile-time optimization: - -```io -// Macro that pre-computes constant expressions -Object precompute := macro(expr, - // If expression contains only literals, evaluate now - result := nil - e := try(result = expr doInContext(Object clone)) - - if(e isNil, - // Successfully evaluated - return literal - Message clone setName(result asString), - // Contains variables - return original - expr - ) -) - -// Usage -x := 10 -y := precompute(5 * 6 + 7) // Computed at parse time -z := precompute(x * 2) // Can't precompute, has variable - -y println // 37 (was precomputed) -``` - -## Method Combination - -Implement method combination patterns: - -```io -// Before/After/Around methods -Object addBefore := method(methodName, beforeBlock, - original := self getSlot(methodName) - self setSlot(methodName, method( - beforeBlock doMessage(call message, call sender) - original doMessage(call message, call sender) - )) -) - -Object addAfter := method(methodName, afterBlock, - original := self getSlot(methodName) - self setSlot(methodName, method( - result := original doMessage(call message, call sender) - afterBlock call(result) - result - )) -) - -Object addAround := method(methodName, aroundBlock, - original := self getSlot(methodName) - self setSlot(methodName, method( - aroundBlock call(original, call message, call sender) - )) -) - -// Usage -BankAccount := Object clone -BankAccount balance := 100 -BankAccount withdraw := method(amount, balance = balance - amount) - -BankAccount addBefore("withdraw", method(amount, - ("Withdrawing " .. amount) println -)) - -BankAccount addAfter("withdraw", method(result, - ("New balance: " .. balance) println -)) - -BankAccount addAround("withdraw", method(original, msg, sender, - amount := msg argAt(0) doInContext(sender) - if(amount > balance, - Exception raise("Insufficient funds"), - original doMessage(msg, sender) - ) -)) - -account := BankAccount clone -account withdraw(50) -// Withdrawing 50 -// New balance: 50 -``` - -## Common Pitfalls - -### Evaluation Context - -```io -// PROBLEM: Wrong context -makeMethod := method(code, - method doString(code) // code evaluates in method's context -) - -obj := Object clone -obj value := 10 -obj badMethod := makeMethod("value * 2") -// obj badMethod // Error: value not found - -// SOLUTION: Use message objects -makeMethod := method(code, - method(code doInContext(self)) -) -``` - -### Performance Impact - -```io -// Metaprogramming has runtime cost -directCall := method(x, x * 2) -dynamicCall := method(x, - msg := Message clone setName("*") setArguments(list(Message clone setName("2"))) - x doMessage(msg) -) - -// directCall is much faster than dynamicCall -``` - -## Exercises - -1. **Memoization Decorator**: Create a decorator that automatically memoizes any method. - -2. **Contract System**: Implement Design by Contract with pre/post conditions. - -3. **Mock Object Generator**: Build a system that generates mock objects for testing. - -4. **Dependency Injection**: Create a DI container using metaprogramming. - -5. **ORM**: Build a simple object-relational mapper that generates methods from table schemas. - -## Real-World Example: ActiveRecord Pattern - -```io -// Simple ActiveRecord implementation -ActiveRecord := Object clone -ActiveRecord tableName := nil -ActiveRecord connection := nil // Database connection - -ActiveRecord findById := method(id, - sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id - row := connection execute(sql) first - if(row, - obj := self clone - row foreach(column, value, - obj setSlot(column, value) - ) - obj - ) -) - -ActiveRecord save := method( - if(hasSlot("id"), - // Update - sql := "UPDATE " .. tableName .. " SET " - updates := list() - slotNames foreach(name, - if(name != "id", - updates append(name .. " = '" .. getSlot(name) .. "'") - ) - ) - sql = sql .. updates join(", ") .. " WHERE id = " .. id - , - // Insert - sql := "INSERT INTO " .. tableName - columns := list() - values := list() - slotNames foreach(name, - columns append(name) - values append("'" .. getSlot(name) .. "'") - ) - sql = sql .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")" - ) - - connection execute(sql) - self -) - -// Generate model from table -generateModel := method(name, table, columns, - model := ActiveRecord clone - model type := name - model tableName = table - - // Add properties - columns foreach(column, - model setSlot(column, nil) - ) - - // Add validations - model validate := method( - // Generated validation code - true - ) - - // Store in Lobby - Lobby setSlot(name, model) - model -) - -// Usage -User := generateModel("User", "users", list("id", "name", "email", "age")) - -user := User clone -user name = "Alice" -user email = "alice@example.com" -user age = 30 -// user save - -foundUser := User findById(1) -``` - -## Conclusion - -Metaprogramming in Io isn't a special feature—it's a natural consequence of the language's design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages. - -The key to effective metaprogramming in Io is understanding that you're not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications. - ---- - -*Next: [Chapter 12 - Concurrency](12-concurrency.md)* \ No newline at end of file diff --git a/12-concurrency.md b/12-concurrency.md deleted file mode 100644 index 43eebb7..0000000 --- a/12-concurrency.md +++ /dev/null @@ -1,736 +0,0 @@ -# Chapter 12: Concurrency - -Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io. - -## Coroutines: Cooperative Multitasking - -Coroutines are the foundation of Io's concurrency model. They're lightweight threads that yield control cooperatively: - -```io -// Create a coroutine -coro := coroutine( - 5 repeat(i, - ("Coroutine: " .. i) println - yield // Give control back - ) -) - -// Run it -5 repeat( - "Main" println - coro resume // Resume the coroutine -) -// Output interleaves Main and Coroutine messages -``` - -Compare with threads in other languages: - -```python -# Python with threads (preemptive) -import threading -def worker(): - for i in range(5): - print(f"Thread: {i}") - # No explicit yield needed - -# Python with async (cooperative) -async def worker(): - for i in range(5): - print(f"Coroutine: {i}") - await asyncio.sleep(0) # Explicit yield -``` - -## Creating and Managing Coroutines - -```io -// Basic coroutine creation -coro := Coroutine clone -coro setRunMessage(message( - "Running in coroutine" println - self // Return value -)) -coro resume println // "Running in coroutine", then returns self - -// Using @ for async execution -future := obj @method(arg) // Runs method in new coroutine -result := future resolve // Wait for result - -// Coroutine with arguments -producer := coroutine( - 10 repeat(i, - yield(i * i) // Yield a value - ) -) - -5 repeat( - producer resume println // 0, 1, 4, 9, 16 -) -``` - -## Actors: Message-Passing Concurrency - -Actors are objects that process messages asynchronously in their own coroutine: - -```io -// Create an actor -Counter := Object clone -Counter count := 0 -Counter increment := method( - count = count + 1 - count -) - -// Make it an actor -counter := Counter clone -counterActor := counter @ // @ makes it an actor - -// Send messages asynchronously -future1 := counterActor increment -future2 := counterActor increment -future3 := counterActor increment - -// Get results -future1 resolve println // 1 -future2 resolve println // 2 -future3 resolve println // 3 -``` - -This is similar to Erlang's actor model: - -```erlang -% Erlang -counter(Count) -> - receive - {increment, From} -> - From ! Count + 1, - counter(Count + 1) - end. -``` - -## Futures and Promises - -Futures represent values that will be available later: - -```io -// Create a future manually -future := Future clone - -// In another coroutine, fulfill it -@( - wait(1) // Simulate work - future setResult(42) -) - -// Wait for result -"Waiting..." println -result := future resolve -("Got result: " .. result) println // Got result: 42 - -// Futures from async calls -slowOperation := method(n, - wait(n) - n * 2 -) - -f := self @slowOperation(2) -"Doing other work..." println -result := f resolve -result println // 4 -``` - -## Channels for Communication - -Implement Go-style channels: - -```io -Channel := Object clone -Channel init := method( - self queue := list() - self waiters := list() - self -) - -Channel send := method(value, - if(waiters size > 0, - waiter := waiters removeFirst - waiter resume(value), - queue append(value) - ) -) - -Channel receive := method( - if(queue size > 0, - queue removeFirst, - waiters append(Coroutine currentCoroutine) - Coroutine currentCoroutine pause - ) -) - -// Usage -ch := Channel clone init - -// Producer -@( - 5 repeat(i, - ch send(i * i) - wait(0.1) - ) -) - -// Consumer -@( - 5 repeat( - value := ch receive - ("Received: " .. value) println - ) -) - -wait(1) // Let them run -``` - -## Synchronization Primitives - -### Mutex (Mutual Exclusion) - -```io -Mutex := Object clone -Mutex locked := false -Mutex waitQueue := list() - -Mutex lock := method( - while(locked, - waitQueue append(Coroutine currentCoroutine) - Coroutine currentCoroutine pause - ) - locked = true -) - -Mutex unlock := method( - locked = false - if(waitQueue size > 0, - waiter := waitQueue removeFirst - waiter resume - ) -) - -Mutex synchronize := method(block, - lock - e := try(result := block call) - unlock - if(e, e raise, result) -) - -// Usage -sharedCounter := 0 -mutex := Mutex clone - -10 repeat( - @( - mutex synchronize( - temp := sharedCounter - yield // Simulate race condition - sharedCounter = temp + 1 - ) - ) -) - -wait(0.5) -sharedCounter println // 10 (without mutex would be unpredictable) -``` - -### Semaphore - -```io -Semaphore := Object clone -Semaphore init := method(permits, - self permits := permits - self waitQueue := list() - self -) - -Semaphore acquire := method( - while(permits <= 0, - waitQueue append(Coroutine currentCoroutine) - Coroutine currentCoroutine pause - ) - permits = permits - 1 -) - -Semaphore release := method( - permits = permits + 1 - if(waitQueue size > 0, - waiter := waitQueue removeFirst - waiter resume - ) -) - -// Usage: Limit concurrent connections -connectionPool := Semaphore clone init(3) - -10 repeat(i, - @( - connectionPool acquire - ("Connection " .. i .. " started") println - wait(Random value) - ("Connection " .. i .. " finished") println - connectionPool release - ) -) - -wait(3) -``` - -## Concurrent Collections - -```io -// Thread-safe list -ConcurrentList := List clone -ConcurrentList mutex := Mutex clone - -ConcurrentList append := method(item, - mutex synchronize(resend(item)) -) - -ConcurrentList at := method(index, - mutex synchronize(resend(index)) -) - -ConcurrentList size := method( - mutex synchronize(resend) -) - -// Usage -list := ConcurrentList clone - -10 repeat(i, - @(list append(i)) -) - -wait(0.1) -list size println // 10 -``` - -## Worker Pool Pattern - -```io -WorkerPool := Object clone -WorkerPool init := method(workerCount, - self workers := list() - self taskQueue := Channel clone init - self results := Channel clone init - - workerCount repeat( - worker := @( - loop( - task := taskQueue receive - if(task isNil, break) // Poison pill - - result := task call - results send(result) - ) - ) - workers append(worker) - ) - - self -) - -WorkerPool submit := method(task, - taskQueue send(task) -) - -WorkerPool shutdown := method( - workers size repeat(taskQueue send(nil)) -) - -WorkerPool getResult := method( - results receive -) - -// Usage -pool := WorkerPool clone init(4) - -// Submit tasks -10 repeat(i, - pool submit(block( - wait(Random value * 0.1) - i * i - )) -) - -// Collect results -results := list() -10 repeat( - results append(pool getResult) -) - -pool shutdown -results println -``` - -## Async/Await Pattern - -```io -// Implement async/await style -Object async := method( - future := Future clone - - @( - e := try(result := call activated doMessage(call message, call sender)) - if(e, - future setException(e), - future setResult(result) - ) - ) - - future -) - -Object await := method(future, - future resolve -) - -// Usage -fetchData := async method(url, - wait(1) // Simulate network delay - "Data from " .. url -) - -processData := async method( - data1 := await(fetchData("api/users")) - data2 := await(fetchData("api/posts")) - data1 .. " + " .. data2 -) - -result := await(processData) -result println // Data from api/users + Data from api/posts -``` - -## Parallel Map - -```io -List parallelMap := method(block, - futures := self map(item, - self @(block call(item)) - ) - - futures map(resolve) -) - -// Usage -numbers := list(1, 2, 3, 4, 5) - -// Sequential map -time( - sequential := numbers map(n, - wait(0.1) - n * n - ) -) - -// Parallel map -time( - parallel := numbers parallelMap(n, - wait(0.1) - n * n - ) -) - -sequential println // list(1, 4, 9, 16, 25) -parallel println // list(1, 4, 9, 16, 25) but faster -``` - -## Deadlock Detection - -```io -DeadlockDetector := Object clone -DeadlockDetector init := method( - self resources := Map clone - self waitGraph := Map clone - self -) - -DeadlockDetector requestResource := method(coroutine, resource, - // Add to wait graph - if(resources hasKey(resource), - owner := resources at(resource) - if(owner != coroutine, - waitGraph atPut(coroutine, resource) - - // Check for cycle - if(hasCycle(coroutine), - Exception raise("Deadlock detected!") - ) - ) - ) -) - -DeadlockDetector hasCycle := method(start, - // Simplified cycle detection - visited := list() - current := start - - while(waitGraph hasKey(current), - if(visited contains(current), return true) - visited append(current) - - resource := waitGraph at(current) - if(resources hasKey(resource), - current = resources at(resource) - , - break - ) - ) - - false -) -``` - -## Event Loop - -```io -EventLoop := Object clone -EventLoop init := method( - self events := list() - self running := true - self -) - -EventLoop schedule := method(delay, block, - events append(list(Date now + delay, block)) - events sortInPlaceBy(block(e, e at(0))) -) - -EventLoop run := method( - while(running and events size > 0, - now := Date now - - while(events size > 0 and events first at(0) <= now, - event := events removeFirst - event at(1) @call - ) - - if(events size > 0, - wait((events first at(0) - now) max(0)) - ) - ) -) - -EventLoop stop := method(running = false) - -// Usage -loop := EventLoop clone init - -loop schedule(0.1, block("First" println)) -loop schedule(0.2, block("Second" println)) -loop schedule(0.15, block("Between" println)) - -loop run -``` - -## Common Patterns - -### Producer-Consumer - -```io -Buffer := Object clone -Buffer init := method(capacity, - self items := list() - self capacity := capacity - self notFull := Semaphore clone init(capacity) - self notEmpty := Semaphore clone init(0) - self mutex := Mutex clone - self -) - -Buffer put := method(item, - notFull acquire - mutex synchronize(items append(item)) - notEmpty release -) - -Buffer get := method( - notEmpty acquire - item := mutex synchronize(items removeFirst) - notFull release - item -) - -// Usage -buffer := Buffer clone init(5) - -// Producer -@( - 10 repeat(i, - ("Producing " .. i) println - buffer put(i) - wait(Random value * 0.1) - ) -) - -// Consumer -@( - 10 repeat( - item := buffer get - ("Consumed " .. item) println - wait(Random value * 0.2) - ) -) - -wait(3) -``` - -### Fork-Join - -```io -Object forkJoin := method(tasks, - futures := tasks map(task, - @(task call) - ) - - futures map(resolve) -) - -// Parallel quicksort -quicksort := method(list, - if(list size <= 1, return list) - - pivot := list at(list size / 2) - - results := forkJoin(list( - block(list select(x, x < pivot) quicksort), - block(list select(x, x == pivot)), - block(list select(x, x > pivot) quicksort) - )) - - results at(0) appendSeq(results at(1)) appendSeq(results at(2)) -) - -sorted := quicksort(list(3, 1, 4, 1, 5, 9, 2, 6)) -sorted println // list(1, 1, 2, 3, 4, 5, 6, 9) -``` - -## Performance Considerations - -```io -// Coroutines are lightweight -time( - coroutines := list() - 1000 repeat(i, - coroutines append(@(i * i)) - ) - coroutines map(resolve) -) - -// But context switching has overhead -benchmarkConcurrency := method(taskCount, taskWork, - // Sequential - seqTime := time( - taskCount repeat(i, taskWork call(i)) - ) - - // Concurrent - concTime := time( - futures := list() - taskCount repeat(i, - futures append(@(taskWork call(i))) - ) - futures map(resolve) - ) - - ("Sequential: " .. seqTime) println - ("Concurrent: " .. concTime) println - ("Speedup: " .. (seqTime / concTime)) println -) - -// Light work - concurrency overhead dominates -benchmarkConcurrency(100, block(i, i * i)) - -// Heavy work - concurrency helps -benchmarkConcurrency(10, block(i, - sum := 0 - 10000 repeat(j, sum = sum + j) - sum -)) -``` - -## Exercises - -1. **Rate Limiter**: Implement a rate limiter that allows N operations per second. - -2. **Parallel Reduce**: Create a parallel version of reduce that divides work among workers. - -3. **Actor Supervisor**: Build a supervisor that restarts failed actors. - -4. **CSP Channels**: Implement Communicating Sequential Processes with select statement. - -5. **STM**: Implement Software Transactional Memory for conflict-free concurrent updates. - -## Real-World Example: Web Scraper - -```io -WebScraper := Object clone -WebScraper init := method(maxConcurrent, - self semaphore := Semaphore clone init(maxConcurrent) - self visited := ConcurrentSet clone init - self results := ConcurrentList clone - self -) - -WebScraper scrape := method(urls, - futures := list() - - urls foreach(url, - if(visited contains(url) not, - visited add(url) - - future := @( - semaphore acquire - e := try( - ("Scraping " .. url) println - // Simulate HTTP request - wait(Random value) - - content := "Content from " .. url - results append(Map with("url", url, "content", content)) - - // Find more URLs (simplified) - if(Random value < 0.3, - newUrl := url .. "/" .. Random value round - self scrape(list(newUrl)) - ) - ) - - semaphore release - if(e, ("Error scraping " .. url .. ": " .. e message) println) - ) - - futures append(future) - ) - ) - - futures map(resolve) - self -) - -// Usage -scraper := WebScraper clone init(3) -scraper scrape(list( - "https://example.com", - "https://example.org", - "https://example.net" -)) - -wait(2) -("Scraped " .. scraper results size .. " pages") println -``` - -## Conclusion - -Io's concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages. - -The beauty of Io's approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with `@`, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible. - ---- - -*Next: [Chapter 13 - Domain-Specific Languages](13-domain-specific-languages.md)* \ No newline at end of file diff --git a/13-domain-specific-languages.md b/13-domain-specific-languages.md deleted file mode 100644 index 28e2a81..0000000 --- a/13-domain-specific-languages.md +++ /dev/null @@ -1,813 +0,0 @@ -# Chapter 13: Domain-Specific Languages - -Io's minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains. - -## Why Io Excels at DSLs - -Several features make Io particularly suitable for DSLs: - -1. **Minimal syntax** - Less language machinery to work around -2. **Optional parentheses** - Clean, readable DSL code -3. **Message chains** - Natural expression of domain concepts -4. **Runtime flexibility** - Modify behavior on the fly -5. **Homoiconicity** - Code as manipulable data - -Compare a hypothetical DSL in Io vs Ruby: - -```io -// Io DSL - clean, minimal -recipe "Chocolate Cake" makes(8) servings { - ingredient "flour" amount(2) cups - ingredient "sugar" amount(1.5) cups - - step "Mix dry ingredients" - step "Add wet ingredients" - bake at(350) degrees for(30) minutes -} -``` - -```ruby -# Ruby DSL - more syntax artifacts -recipe "Chocolate Cake" do - makes 8.servings - - ingredient "flour", amount: 2.cups - ingredient "sugar", amount: 1.5.cups - - step "Mix dry ingredients" - step "Add wet ingredients" - bake at: 350.degrees, for: 30.minutes -end -``` - -## Building Your First DSL - -Let's create a simple configuration DSL: - -```io -// Define the DSL -Config := Object clone -Config settings := Map clone - -Config set := method(key, value, - settings atPut(key asString, value) - self // For chaining -) - -Config get := method(key, - settings at(key asString) -) - -Config section := method(name, - sec := Config clone - settings atPut(name asString, sec) - sec -) - -// Use the DSL -config := Config clone -config set("host", "localhost") \ - set("port", 8080) \ - section("database") \ - set("driver", "postgresql") \ - set("name", "myapp") - -config get("host") println // localhost -config get("database") get("driver") println // postgresql -``` - -## HTML Builder DSL - -A more complex example - generating HTML: - -```io -HTML := Object clone - -// Handle any tag name via forward -HTML forward := method( - tagName := call message name - attributes := Map clone - children := list() - - // Process arguments - call message arguments foreach(arg, - argValue := call sender doMessage(arg) - - if(argValue type == "Map", - // It's attributes - attributes = argValue - , - // It's content or children - if(argValue type == "Sequence", - children append(argValue), - if(argValue type == "List", - children appendSeq(argValue), - children append(argValue asString) - ) - ) - ) - ) - - // Build HTML - result := "<" .. tagName - attributes foreach(key, value, - result = result .. " " .. key .. "=\"" .. value .. "\"" - ) - - if(children size == 0, - result = result .. " />", - result = result .. ">" - children foreach(child, result = result .. child) - result = result .. "" - ) - - result -) - -// Helper for attributes -Object attrs := method( - args := call message arguments - map := Map clone - - args foreach(arg, - pair := arg name split(":") - if(pair size == 2, - map atPut(pair at(0), call sender doMessage(arg arguments at(0))) - ) - ) - map -) - -// Usage -html := HTML clone - -page := html div(attrs(class: "container", id: "main"), - html h1("Welcome to My Site"), - html p(attrs(class: "intro"), - "This is a paragraph with ", - html strong("bold text"), - " in it." - ), - html ul( - html li("First item"), - html li("Second item"), - html li("Third item") - ) -) - -page println -//

Welcome to My Site

... -``` - -## SQL Query Builder - -```io -Query := Object clone -Query init := method( - self selections := list("*") - self tables := list() - self conditions := list() - self joins := list() - self -) - -Query select := method( - self selections = call message arguments map(arg, - call sender doMessage(arg) asString - ) - self -) - -Query from := method(table, - tables append(table) - self -) - -Query where := method( - condition := call argAt(0) - conditions append(condition code asString) - self -) - -Query join := method(table, on, - joins append("JOIN " .. table .. " ON " .. on code asString) - self -) - -Query toSQL := method( - sql := "SELECT " .. selections join(", ") - sql = sql .. " FROM " .. tables join(", ") - - if(joins size > 0, - sql = sql .. " " .. joins join(" ") - ) - - if(conditions size > 0, - sql = sql .. " WHERE " .. conditions join(" AND ") - ) - - sql -) - -// Usage -query := Query clone init - -sql := query select("name", "age", "email") \ - from("users") \ - join("profiles", users.id == profiles.user_id) \ - where(age > 18) \ - where(status == "active") \ - toSQL - -sql println -// SELECT name, age, email FROM users JOIN profiles ON users.id == profiles.user_id WHERE age > 18 AND status == "active" -``` - -## Unit Testing DSL - -```io -TestSuite := Object clone -TestSuite tests := list() -TestSuite currentTest := nil - -TestSuite describe := method(description, - suite := TestSuite clone - suite description := description - suite tests = list() - - # Execute the test definition block - call evalArgAt(1) - - suite -) - -TestSuite it := method(testName, - test := Object clone - test name := testName - test block := call argAt(1) - tests append(test) -) - -TestSuite before := method( - self beforeBlock := call argAt(0) -) - -TestSuite after := method( - self afterBlock := call argAt(0) -) - -TestSuite run := method( - ("\n" .. description) println - ("=" repeated(description size)) println - - passed := 0 - failed := 0 - - tests foreach(test, - if(hasSlot("beforeBlock"), beforeBlock doInContext(self)) - - e := try( - test block doInContext(self) - ("✓ " .. test name) println - passed = passed + 1 - ) catch(Exception, e, - ("✗ " .. test name) println - (" " .. e message) println - failed = failed + 1 - ) - - if(hasSlot("afterBlock"), afterBlock doInContext(self)) - ) - - ("\nPassed: " .. passed .. ", Failed: " .. failed) println -) - -// Assertion helpers -Object expect := method(actual, - Expectation clone setActual(actual) -) - -Expectation := Object clone -Expectation setActual := method(value, - self actual := value - self -) - -Expectation toBe := method(expected, - if(actual != expected, - Exception raise("Expected " .. expected .. " but got " .. actual) - ) -) - -Expectation toEqual := method(expected, - if(actual != expected, - Exception raise("Expected " .. expected .. " but got " .. actual) - ) -) - -Expectation toContain := method(item, - if(actual contains(item) not, - Exception raise("Expected " .. actual .. " to contain " .. item) - ) -) - -// Usage -MathTests := describe("Math operations", - before( - self calculator := Object clone - calculator add := method(a, b, a + b) - calculator multiply := method(a, b, a * b) - ) - - it("should add numbers correctly", - expect(calculator add(2, 3)) toBe(5) - expect(calculator add(-1, 1)) toBe(0) - ) - - it("should multiply numbers correctly", - expect(calculator multiply(3, 4)) toBe(12) - expect(calculator multiply(0, 5)) toBe(0) - ) - - it("should handle edge cases", - expect(calculator add(0, 0)) toBe(0) - ) -) - -MathTests run -``` - -## State Machine DSL - -```io -StateMachine := Object clone -StateMachine states := Map clone -StateMachine currentState := nil -StateMachine initialState := nil - -StateMachine state := method(name, - s := State clone - s name := name - s machine := self - states atPut(name, s) - - if(initialState isNil, initialState = s) - - s -) - -State := Object clone -State transitions := Map clone - -State on := method(event, targetState, - transitions atPut(event, targetState) - self -) - -State enter := method( - self enterBlock := call argAt(0) - self -) - -State exit := method( - self exitBlock := call argAt(0) - self -) - -StateMachine start := method( - currentState = initialState - if(currentState hasSlot("enterBlock"), - currentState enterBlock call - ) -) - -StateMachine trigger := method(event, - if(currentState transitions hasKey(event), - nextStateName := currentState transitions at(event) - nextState := states at(nextStateName) - - if(currentState hasSlot("exitBlock"), - currentState exitBlock call - ) - - ("Transitioning from " .. currentState name .. " to " .. nextStateName) println - currentState = nextState - - if(currentState hasSlot("enterBlock"), - currentState enterBlock call - ) - , - ("No transition for event '" .. event .. "' from state '" .. currentState name .. "'") println - ) -) - -// Usage -door := StateMachine clone - -door state("closed") \ - on("open", "opened") \ - on("lock", "locked") \ - enter(block("Door is now closed" println)) - -door state("opened") \ - on("close", "closed") \ - enter(block("Door is now open" println)) - -door state("locked") \ - on("unlock", "closed") \ - enter(block("Door is now locked" println)) - -door start -door trigger("open") // Transitioning from closed to opened -door trigger("close") // Transitioning from opened to closed -door trigger("lock") // Transitioning from closed to locked -door trigger("open") // No transition for event 'open' from state 'locked' -``` - -## Routing DSL (Web Framework Style) - -```io -Router := Object clone -Router routes := list() - -Router get := method(path, - addRoute("GET", path, call argAt(1)) -) - -Router post := method(path, - addRoute("POST", path, call argAt(1)) -) - -Router put := method(path, - addRoute("PUT", path, call argAt(1)) -) - -Router delete := method(path, - addRoute("DELETE", path, call argAt(1)) -) - -Router addRoute := method(method, path, handler, - routes append(Map with( - "method", method, - "path", path, - "pattern", pathToRegex(path), - "handler", handler - )) - self -) - -Router pathToRegex := method(path, - // Convert :param to regex groups - pattern := path - pattern = pattern replaceAllRegex(":([^/]+)", "([^/]+)") - "^" .. pattern .. "$" -) - -Router handle := method(method, path, - routes foreach(route, - if(route at("method") == method, - match := path matchesRegex(route at("pattern")) - if(match, - params := extractParams(route at("path"), path, match) - return route at("handler") call(params) - ) - ) - ) - - Map with("status", 404, "body", "Not Found") -) - -Router extractParams := method(pattern, path, match, - params := Map clone - - // Extract named parameters - names := pattern allMatchesOfRegex(":([^/]+)") map(m, m at(1)) - names foreach(i, name, - params atPut(name, match at(i + 1)) - ) - - params -) - -// Usage -app := Router clone - -app get("/", block(params, - Map with("status", 200, "body", "Welcome to the home page") -)) - -app get("/users/:id", block(params, - Map with("status", 200, "body", "User " .. params at("id")) -)) - -app post("/users", block(params, - Map with("status", 201, "body", "User created") -)) - -// Simulate requests -app handle("GET", "/") at("body") println // Welcome to the home page -app handle("GET", "/users/123") at("body") println // User 123 -app handle("POST", "/users") at("body") println // User created -app handle("GET", "/unknown") at("body") println // Not Found -``` - -## Data Validation DSL - -```io -Validator := Object clone - -Validator field := method(name, - f := Field clone - f name := name - f rules := list() - self currentField := f - f -) - -Field := Object clone - -Field required := method( - rules append(block(value, - if(value isNil or value == "", - Exception raise(name .. " is required"), - true - ) - )) - self -) - -Field minLength := method(min, - rules append(block(value, - if(value size < min, - Exception raise(name .. " must be at least " .. min .. " characters"), - true - ) - )) - self -) - -Field maxLength := method(max, - rules append(block(value, - if(value size > max, - Exception raise(name .. " must be at most " .. max .. " characters"), - true - ) - )) - self -) - -Field matches := method(regex, - rules append(block(value, - if(value matchesRegex(regex) not, - Exception raise(name .. " has invalid format"), - true - ) - )) - self -) - -Field validate := method(value, - rules foreach(rule, - rule call(value) - ) - true -) - -// Usage -userValidator := Validator clone - -username := userValidator field("username") \ - required \ - minLength(3) \ - maxLength(20) \ - matches("^[a-zA-Z0-9_]+$") - -email := userValidator field("email") \ - required \ - matches("^[^@]+@[^@]+\\.[^@]+$") - -// Test validation -try( - username validate("ab") -) catch(Exception, e, - e message println // username must be at least 3 characters -) - -try( - email validate("not-an-email") -) catch(Exception, e, - e message println // email has invalid format -) - -username validate("valid_user123") println // true -email validate("user@example.com") println // true -``` - -## DSL Best Practices - -### 1. Natural Language Flow - -```io -// Good - reads naturally -recipe needs(2) cups of("flour") -order shipping priority within(3) days - -// Bad - programmer-centric -recipe setAmount(2) setUnit("cups") setIngredient("flour") -order setShipping("priority") setDeliveryDays(3) -``` - -### 2. Method Chaining - -```io -// Enable fluent interfaces -Object withChaining := method( - call message arguments foreach(arg, - slotName := arg name - self setSlot(slotName, call evalArgAt(0)) - ) - self // Always return self -) - -Person := Object clone -Person configure := method( - withChaining( - name(n, self name := n), - age(a, self age := a), - email(e, self email := e) - ) -) - -person := Person clone configure \ - name("Alice") \ - age(30) \ - email("alice@example.com") -``` - -### 3. Context Management - -```io -DSLContext := Object clone -DSLContext stack := list() - -DSLContext push := method(obj, - stack append(obj) -) - -DSLContext pop := method( - stack pop -) - -DSLContext current := method( - stack last -) - -DSLContext with := method(obj, block, - push(obj) - e := try(result := block call) - pop - if(e, e raise, result) -) - -// Usage in DSL -Form := Object clone -Form fields := list() - -Form field := method(name, - f := Field clone - f name := name - DSLContext with(f, - call evalArgAt(1) - ) - fields append(f) -) - -Field label := method(text, - DSLContext current label := text -) -``` - -## Exercises - -1. **CSS DSL**: Create a DSL for generating CSS with nested rules and variables. - -2. **Graph Description Language**: Build a DSL for describing graphs and their relationships. - -3. **Build System DSL**: Implement a make/rake-like build system DSL. - -4. **BDD Testing DSL**: Create a Behavior-Driven Development testing framework. - -5. **Configuration Management**: Build a DSL for system configuration management. - -## Real-World Example: Migration DSL - -```io -Migration := Object clone -Migration changes := list() - -Migration createTable := method(name, - table := TableDefinition clone - table name := name - table columns := list() - - call evalArgAt(1) - - changes append(Map with( - "type", "createTable", - "table", table - )) - self -) - -Migration dropTable := method(name, - changes append(Map with( - "type", "dropTable", - "name", name - )) - self -) - -TableDefinition := Object clone - -TableDefinition column := method(name, type, - columns append(Map with( - "name", name, - "type", type, - "constraints", list() - )) - self -) - -TableDefinition primaryKey := method(col, - columns last at("constraints") append("PRIMARY KEY") - self -) - -TableDefinition notNull := method( - columns last at("constraints") append("NOT NULL") - self -) - -TableDefinition unique := method( - columns last at("constraints") append("UNIQUE") - self -) - -Migration toSQL := method( - sql := list() - - changes foreach(change, - if(change at("type") == "createTable", - table := change at("table") - stmt := "CREATE TABLE " .. table name .. " (\n" - - cols := table columns map(col, - " " .. col at("name") .. " " .. col at("type") .. - if(col at("constraints") size > 0, - " " .. col at("constraints") join(" "), - "" - ) - ) - - stmt = stmt .. cols join(",\n") .. "\n);" - sql append(stmt) - ) - - if(change at("type") == "dropTable", - sql append("DROP TABLE " .. change at("name") .. ";") - ) - ) - - sql join("\n\n") -) - -// Usage -migration := Migration clone - -migration createTable("users", - column("id", "INTEGER") primaryKey, - column("username", "VARCHAR(50)") notNull unique, - column("email", "VARCHAR(100)") notNull unique, - column("created_at", "TIMESTAMP") notNull -) - -migration createTable("posts", - column("id", "INTEGER") primaryKey, - column("user_id", "INTEGER") notNull, - column("title", "VARCHAR(200)") notNull, - column("content", "TEXT"), - column("published_at", "TIMESTAMP") -) - -migration toSQL println -``` - -## Conclusion - -Domain-Specific Languages in Io demonstrate the language's expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language. - -The key to successful DSLs in Io is understanding that you're not fighting against language syntax—you're working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable. - ---- - -*Next: [Chapter 14 - C Integration](14-c-integration.md)* \ No newline at end of file diff --git a/14-c-integration.md b/14-c-integration.md deleted file mode 100644 index f28d9ba..0000000 --- a/14-c-integration.md +++ /dev/null @@ -1,635 +0,0 @@ -# Chapter 14: C Integration - -Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C. - -## Understanding Io's C Architecture - -Io's core is a small C library (around 10,000 lines) that implements: - -- The object model (IoObject) -- The message passing system -- Basic types (Number, String, List, etc.) -- The VM and garbage collector - -Everything else is built on top of this foundation, either in C addons or pure Io. - -## Creating a Simple C Addon - -Let's create a basic C addon that adds a method to calculate factorials: - -```c -// factorial.c -#include "IoState.h" -#include "IoObject.h" -#include "IoNumber.h" - -IoObject *IoObject_factorial(IoObject *self, IoObject *locals, IoMessage *m) -{ - // Get the number from the receiver - double n = IoNumber_asDouble(self); - - if (n < 0) { - IoState_error_(IOSTATE, m, "factorial of negative number"); - return IONIL(self); - } - - double result = 1; - for (int i = 2; i <= n; i++) { - result *= i; - } - - return IoNumber_newWithDouble_(IOSTATE, result); -} - -// Initialize the addon -void IoFactorial_init(IoState *state) -{ - IoObject *self = IoState_lobby(state); - - // Add method to Number prototype - IoObject *number = IoState_protoWithName_(state, "Number"); - IoObject_addMethod_(number, - IOSYMBOL("factorial"), - IoObject_factorial); -} -``` - -To compile and use: - -```bash -# Compile as shared library -gcc -shared -fPIC -o factorial.so factorial.c -lIo - -# In Io -DynLib load("./factorial.so") -5 factorial println // 120 -``` - -## Working with Io Objects in C - -```c -// Creating Io objects from C -IoObject *IoAddon_createObject(IoObject *self, IoObject *locals, IoMessage *m) -{ - IoState *state = IOSTATE; - - // Create different types - IoObject *num = IoNumber_newWithDouble_(state, 42.0); - IoObject *str = IoSeq_newWithCString_(state, "Hello from C"); - IoObject *list = IoList_new(state); - - // Add items to list - IoList_append_(list, num); - IoList_append_(list, str); - - // Create a new object with slots - IoObject *obj = IoObject_new(state); - IoObject_setSlot_to_(obj, IOSYMBOL("x"), num); - IoObject_setSlot_to_(obj, IOSYMBOL("message"), str); - IoObject_setSlot_to_(obj, IOSYMBOL("items"), list); - - return obj; -} - -// Accessing Io objects from C -IoObject *IoAddon_processObject(IoObject *self, IoObject *locals, IoMessage *m) -{ - // Get the first argument - IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, 0); - - // Check type - if (ISSEQ(arg)) { - char *cstr = IoSeq_asCString(arg); - printf("String argument: %s\n", cstr); - } - else if (ISNUMBER(arg)) { - double num = IoNumber_asDouble(arg); - printf("Number argument: %f\n", num); - } - else if (ISLIST(arg)) { - size_t size = IoList_size(arg); - printf("List with %zu items\n", size); - } - - return self; -} -``` - -## Creating Custom Types - -```c -// customtype.c - Define a Point type -#include "IoState.h" -#include "IoObject.h" -#include "IoNumber.h" - -// Define the type structure -typedef struct { - IoObject obj; // Must be first - double x; - double y; -} IoPoint; - -// Type tag -IoTag *IoPoint_tag(void) -{ - static IoTag *tag = NULL; - if (!tag) { - tag = IoTag_newWithName_("Point"); - } - return tag; -} - -// Constructor -IoPoint *IoPoint_new(IoState *state, double x, double y) -{ - IoPoint *self = IoObject_new(state); - IoObject_tag_(self, IoPoint_tag()); - - self->x = x; - self->y = y; - - return self; -} - -// Methods -IoObject *IoPoint_x(IoPoint *self, IoObject *locals, IoMessage *m) -{ - return IoNumber_newWithDouble_(IOSTATE, self->x); -} - -IoObject *IoPoint_y(IoPoint *self, IoObject *locals, IoMessage *m) -{ - return IoNumber_newWithDouble_(IOSTATE, self->y); -} - -IoObject *IoPoint_distance(IoPoint *self, IoObject *locals, IoMessage *m) -{ - IoPoint *other = IoMessage_locals_valueArgAt_(m, locals, 0); - - if (IoObject_tag(other) != IoPoint_tag()) { - IoState_error_(IOSTATE, m, "argument must be a Point"); - return IONIL(self); - } - - double dx = self->x - other->x; - double dy = self->y - other->y; - double distance = sqrt(dx*dx + dy*dy); - - return IoNumber_newWithDouble_(IOSTATE, distance); -} - -// Initialize the type -void IoPoint_init(IoState *state) -{ - IoObject *self = IoState_lobby(state); - - // Create prototype - IoPoint *proto = IoPoint_new(state, 0, 0); - IoState_registerProtoWithName_(state, proto, "Point"); - - // Add methods - IoObject_addMethod_(proto, IOSYMBOL("x"), IoPoint_x); - IoObject_addMethod_(proto, IOSYMBOL("y"), IoPoint_y); - IoObject_addMethod_(proto, IOSYMBOL("distance"), IoPoint_distance); -} -``` - -## Calling Io from C - -```c -// Evaluate Io code from C -IoObject *result = IoState_doString_(state, "1 + 2 * 3"); -double value = IoNumber_asDouble(result); -printf("Result: %f\n", value); // 7.0 - -// Call Io methods from C -IoObject *obj = IoState_doString_(state, "Object clone"); -IoObject *method = IoObject_getSlot_(obj, IOSYMBOL("type")); -IoObject *result = IoObject_activate(method, obj, locals, m, NULL); -char *type = IoSeq_asCString(result); -printf("Type: %s\n", type); // Object - -// Send messages -IoMessage *msg = IoMessage_newWithName_(state, IOSYMBOL("println")); -IoMessage_setCachedResult_(msg, NULL); -IoObject *result = IoObject_perform(obj, locals, msg); -``` - -## Memory Management - -Io uses a garbage collector, but when interfacing with C, you need to be careful: - -```c -// Protecting objects from GC -IoObject *IoAddon_keepAlive(IoObject *self, IoObject *locals, IoMessage *m) -{ - IoState *state = IOSTATE; - - // Create object that needs to survive GC - IoObject *important = IoObject_new(state); - - // Add reference from a persistent object - IoObject_setSlot_to_(IoState_lobby(state), - IOSYMBOL("_keepAlive"), important); - - // Or use IoState_retain/release - IoState_retain_(state, important); - - // Do work... - - // Release when done - IoState_release_(state, important); - - return important; -} - -// Managing C memory -typedef struct { - IoObject obj; - void *cdata; -} IoCWrapper; - -void IoCWrapper_free(IoCWrapper *self) -{ - if (self->cdata) { - free(self->cdata); - self->cdata = NULL; - } -} - -// Set up finalizer -IoTag *tag = IoTag_newWithName_("CWrapper"); -IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCWrapper_free); -``` - -## Wrapping C Libraries - -Example: Wrapping a simple math library: - -```c -// mathlib_wrapper.c -#include -#include "IoState.h" -#include "IoObject.h" -#include "IoNumber.h" -#include "IoList.h" - -// Wrap sin function -IoObject *IoMath_sin(IoObject *self, IoObject *locals, IoMessage *m) -{ - double x = IoMessage_locals_doubleArgAt_(m, locals, 0); - return IoNumber_newWithDouble_(IOSTATE, sin(x)); -} - -// Wrap complex function -IoObject *IoMath_stats(IoObject *self, IoObject *locals, IoMessage *m) -{ - IoList *list = IoMessage_locals_listArgAt_(m, locals, 0); - size_t count = IoList_size(list); - - if (count == 0) { - return IoList_new(IOSTATE); - } - - double sum = 0, min = INFINITY, max = -INFINITY; - - for (size_t i = 0; i < count; i++) { - IoObject *item = IoList_at_(list, i); - double value = IoNumber_asDouble(item); - - sum += value; - if (value < min) min = value; - if (value > max) max = value; - } - - double mean = sum / count; - - // Return statistics as list - IoList *result = IoList_new(IOSTATE); - IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, mean)); - IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, min)); - IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, max)); - - return result; -} - -void IoMathLib_init(IoState *state) -{ - IoObject *math = IoObject_new(state); - IoState_registerProtoWithName_(state, math, "Math"); - - IoObject_addMethod_(math, IOSYMBOL("sin"), IoMath_sin); - IoObject_addMethod_(math, IOSYMBOL("stats"), IoMath_stats); -} -``` - -Usage in Io: - -```io -DynLib load("./mathlib.so") - -Math sin(3.14159 / 2) println // 1.0 - -stats := Math stats(list(1, 2, 3, 4, 5)) -"Mean: " .. stats at(0) println // Mean: 3 -"Min: " .. stats at(1) println // Min: 1 -"Max: " .. stats at(2) println // Max: 5 -``` - -## Embedding Io in C Applications - -```c -// embed_io.c - Embedding Io in a C application -#include -#include "IoState.h" -#include "IoObject.h" -#include "IoSeq.h" - -// Custom function exposed to Io -IoObject *App_log(IoObject *self, IoObject *locals, IoMessage *m) -{ - char *msg = IoMessage_locals_cStringArgAt_(m, locals, 0); - printf("[APP LOG] %s\n", msg); - return self; -} - -int main(int argc, char *argv[]) -{ - // Initialize Io - IoState *state = IoState_new(); - IoState_init(state); - - // Add custom functions - IoObject *lobby = IoState_lobby(state); - IoObject *app = IoObject_new(state); - IoState_registerProtoWithName_(state, app, "App"); - IoObject_addMethod_(app, IOSYMBOL("log"), App_log); - - // Load and run Io script - IoState_doFile_(state, "script.io"); - - // Interact with Io objects - IoObject *result = IoState_doString_(state, - "x := 10; y := 20; x + y"); - printf("Result from Io: %f\n", IoNumber_asDouble(result)); - - // Clean up - IoState_free(state); - - return 0; -} -``` - -The Io script (script.io): - -```io -App log("Hello from Io!") - -// Define functions for C to call -calculate := method(a, b, - App log("Calculating in Io") - a * b + 100 -) -``` - -## Performance Optimization - -```c -// Optimized array operations -IoObject *IoArray_sum(IoObject *self, IoObject *locals, IoMessage *m) -{ - // Get underlying C array for performance - UArray *array = IoSeq_rawUArray(self); - size_t size = UArray_size(array); - uint8_t *data = UArray_bytes(array); - int itemSize = UArray_itemSize(array); - - double sum = 0; - - // Fast path for different types - if (itemSize == sizeof(double)) { - double *doubles = (double *)data; - for (size_t i = 0; i < size; i++) { - sum += doubles[i]; - } - } - else if (itemSize == sizeof(float)) { - float *floats = (float *)data; - for (size_t i = 0; i < size; i++) { - sum += floats[i]; - } - } - - return IoNumber_newWithDouble_(IOSTATE, sum); -} - -// Batch operations -IoObject *IoMatrix_multiply(IoObject *self, IoObject *locals, IoMessage *m) -{ - IoObject *other = IoMessage_locals_valueArgAt_(m, locals, 0); - - // Get dimensions - int rows1 = IoMessage_locals_intArgAt_(m, locals, 1); - int cols1 = IoMessage_locals_intArgAt_(m, locals, 2); - int cols2 = IoMessage_locals_intArgAt_(m, locals, 3); - - // Get raw data pointers - double *data1 = (double *)IoSeq_rawBytes(self); - double *data2 = (double *)IoSeq_rawBytes(other); - - // Allocate result - IoSeq *result = IoSeq_newWithData_length_(IOSTATE, - NULL, rows1 * cols2 * sizeof(double)); - double *resultData = (double *)IoSeq_rawBytes(result); - - // Optimized matrix multiplication - for (int i = 0; i < rows1; i++) { - for (int j = 0; j < cols2; j++) { - double sum = 0; - for (int k = 0; k < cols1; k++) { - sum += data1[i * cols1 + k] * data2[k * cols2 + j]; - } - resultData[i * cols2 + j] = sum; - } - } - - return result; -} -``` - -## Debugging C Addons - -```c -// Debug helpers -#define IO_DEBUG 1 - -#ifdef IO_DEBUG - #define DEBUG_PRINT(fmt, ...) \ - fprintf(stderr, "DEBUG: " fmt "\n", ##__VA_ARGS__) -#else - #define DEBUG_PRINT(fmt, ...) -#endif - -IoObject *IoDebug_function(IoObject *self, IoObject *locals, IoMessage *m) -{ - DEBUG_PRINT("Function called with %d arguments", - IoMessage_argCount(m)); - - // Print argument types - for (int i = 0; i < IoMessage_argCount(m); i++) { - IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, i); - DEBUG_PRINT(" Arg %d: %s", i, IoObject_name(arg)); - } - - // Check for memory issues - IoState *state = IOSTATE; - IoState_check(state); - - return self; -} -``` - -## Common Integration Patterns - -### Callback Pattern - -```c -// Store Io blocks as callbacks -typedef struct { - IoObject obj; - IoObject *callback; -} IoCallbackWrapper; - -IoObject *IoWrapper_setCallback(IoCallbackWrapper *self, - IoObject *locals, IoMessage *m) -{ - IoObject *block = IoMessage_locals_valueArgAt_(m, locals, 0); - - // Retain the block - IoState_retain_(IOSTATE, block); - if (self->callback) { - IoState_release_(IOSTATE, self->callback); - } - self->callback = block; - - return self; -} - -// Call the Io callback from C -void triggerCallback(IoCallbackWrapper *wrapper, double value) -{ - if (wrapper->callback) { - IoObject *arg = IoNumber_newWithDouble_(IOSTATE, value); - IoObject_perform(wrapper->callback, wrapper, - IoMessage_newWithName_label_(IOSTATE, - IOSYMBOL("call"), arg)); - } -} -``` - -### Event System - -```c -// Event emitter in C -typedef struct { - IoObject obj; - IoMap *handlers; // Event name -> List of handlers -} IoEventEmitter; - -IoObject *IoEventEmitter_on(IoEventEmitter *self, - IoObject *locals, IoMessage *m) -{ - IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); - IoObject *handler = IoMessage_locals_valueArgAt_(m, locals, 1); - - IoList *handlers = IoMap_at_(self->handlers, event); - if (!handlers) { - handlers = IoList_new(IOSTATE); - IoMap_atPut_(self->handlers, event, handlers); - } - - IoList_append_(handlers, handler); - return self; -} - -IoObject *IoEventEmitter_emit(IoEventEmitter *self, - IoObject *locals, IoMessage *m) -{ - IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); - IoList *handlers = IoMap_at_(self->handlers, event); - - if (handlers) { - size_t count = IoList_size(handlers); - for (size_t i = 0; i < count; i++) { - IoObject *handler = IoList_at_(handlers, i); - - // Pass remaining arguments to handler - IoMessage *msg = IoMessage_newWithName_(IOSTATE, - IOSYMBOL("call")); - for (int j = 1; j < IoMessage_argCount(m); j++) { - IoMessage_addArg_(msg, IoMessage_argAt_(m, j)); - } - - IoObject_perform(handler, locals, msg); - } - } - - return self; -} -``` - -## Build System Integration - -Makefile for Io addon: - -```makefile -# Makefile for Io addon -CC = gcc -CFLAGS = -shared -fPIC -Wall -O2 -INCLUDES = -I$(IO_HOME)/include -LIBS = -L$(IO_HOME)/lib -lIo - -ADDON = myaddon.so -SOURCES = myaddon.c utils.c -OBJECTS = $(SOURCES:.c=.o) - -all: $(ADDON) - -$(ADDON): $(OBJECTS) - $(CC) $(CFLAGS) -o $@ $^ $(LIBS) - -%.o: %.c - $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ - -clean: - rm -f $(OBJECTS) $(ADDON) - -install: $(ADDON) - cp $(ADDON) $(IO_HOME)/addons/ - -test: $(ADDON) - io test_addon.io -``` - -## Exercises - -1. **SQLite Wrapper**: Create a complete SQLite wrapper for Io. - -2. **Graphics Library**: Wrap SDL or Cairo for graphics programming. - -3. **Network Addon**: Implement high-performance networking primitives. - -4. **Crypto Library**: Wrap OpenSSL for cryptographic operations. - -5. **Scientific Computing**: Create bindings for BLAS/LAPACK. - -## Conclusion - -C integration is one of Io's strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns. - -Whether you're optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io's C integration provides the tools you need while maintaining the simplicity and elegance of the language. - ---- - -*Next: [Chapter 15 - Real-World Patterns](15-real-world-patterns.md)* \ No newline at end of file diff --git a/15-real-world-patterns.md b/15-real-world-patterns.md deleted file mode 100644 index ea6c5ec..0000000 --- a/15-real-world-patterns.md +++ /dev/null @@ -1,949 +0,0 @@ -# Chapter 15: Real-World Patterns - -After exploring Io's features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We'll see how Io's unique features enable elegant solutions to common programming challenges. - -## Model-View-Controller (MVC) - -Implementing MVC in Io leverages prototypes and message passing: - -```io -// Model -Model := Object clone -Model init := method( - self observers := list() - self data := Map clone - self -) - -Model set := method(key, value, - oldValue := data at(key) - if(oldValue != value, - data atPut(key, value) - notifyObservers(key, oldValue, value) - ) - self -) - -Model get := method(key, - data at(key) -) - -Model observe := method(observer, - observers append(observer) - self -) - -Model notifyObservers := method(key, oldValue, newValue, - observers foreach(observer, - if(observer hasSlot("modelChanged"), - observer modelChanged(self, key, oldValue, newValue) - ) - ) -) - -// View -View := Object clone -View init := method(model, - self model := model - model observe(self) - self elements := Map clone - self -) - -View modelChanged := method(model, key, oldValue, newValue, - render -) - -View render := method( - // Override in subclasses -) - -// Controller -Controller := Object clone -Controller init := method(model, view, - self model := model - self view := view - self -) - -Controller handleInput := method(input, - // Process input and update model -) - -// Example: Todo MVC -TodoModel := Model clone -TodoModel init := method( - resend - self set("todos", list()) - self -) - -TodoModel addTodo := method(text, - todos := get("todos") copy - todos append(Map with("text", text, "done", false)) - set("todos", todos) -) - -TodoModel toggleTodo := method(index, - todos := get("todos") copy - todo := todos at(index) - todo atPut("done", todo at("done") not) - set("todos", todos) -) - -TodoView := View clone -TodoView render := method( - "=== Todo List ===" println - model get("todos") foreach(i, todo, - status := if(todo at("done"), "[✓]", "[ ]") - (i .. ". " .. status .. " " .. todo at("text")) println - ) - "================" println -) - -TodoController := Controller clone -TodoController processCommand := method(cmd, - parts := cmd split(" ") - action := parts at(0) - - if(action == "add", - text := parts slice(1) join(" ") - model addTodo(text) - ) - - if(action == "toggle", - index := parts at(1) asNumber - model toggleTodo(index) - ) - - if(action == "quit", - System exit - ) -) - -// Usage -app := Object clone -app model := TodoModel clone init -app view := TodoView clone init(app model) -app controller := TodoController clone init(app model, app view) - -app view render -// Simulate commands -app controller processCommand("add Buy groceries") -app controller processCommand("add Write documentation") -app controller processCommand("toggle 0") -``` - -## Repository Pattern - -Abstracting data access: - -```io -// Base Repository -Repository := Object clone -Repository init := method( - self storage := list() - self nextId := 1 - self -) - -Repository save := method(entity, - if(entity hasSlot("id") not or entity id isNil, - entity id := nextId - nextId = nextId + 1 - storage append(entity) - , - // Update existing - index := storage detectIndex(e, e id == entity id) - if(index, storage atPut(index, entity)) - ) - entity -) - -Repository findById := method(id, - storage detect(e, e id == id) -) - -Repository findAll := method( - storage copy -) - -Repository delete := method(entity, - storage remove(entity) -) - -Repository where := method(predicate, - storage select(predicate) -) - -// Specialized repository with persistence -FileRepository := Repository clone -FileRepository filename := "data.json" - -FileRepository init := method( - resend - load - self -) - -FileRepository load := method( - if(File with(filename) exists, - data := File with(filename) contents parseJson - storage = data map(item, entityFromMap(item)) - nextId = storage map(e, e id) max + 1 - ) -) - -FileRepository save := method(entity, - resend(entity) - persist - entity -) - -FileRepository persist := method( - data := storage map(e, e asMap) - File with(filename) openForWriting write(data asJson) close -) - -// Entity -User := Object clone -User init := method(name, email, - self id := nil - self name := name - self email := email - self createdAt := Date now - self -) - -User asMap := method( - Map with( - "id", id, - "name", name, - "email", email, - "createdAt", createdAt asString - ) -) - -// Usage -userRepo := FileRepository clone init - -user1 := User clone init("Alice", "alice@example.com") -user2 := User clone init("Bob", "bob@example.com") - -userRepo save(user1) -userRepo save(user2) - -found := userRepo findById(1) -active := userRepo where(u, u createdAt > Date now - Duration days(30)) -``` - -## Observer Pattern - -Native implementation using Io's message passing: - -```io -Observable := Object clone -Observable init := method( - self observers := Map clone - self -) - -Observable on := method(event, observer, methodName, - if(observers hasKey(event) not, - observers atPut(event, list()) - ) - observers at(event) append(list(observer, methodName)) - self -) - -Observable off := method(event, observer, - if(observers hasKey(event), - observers at(event) := observers at(event) reject(pair, - pair at(0) == observer - ) - ) - self -) - -Observable emit := method(event, - args := call message arguments slice(1) - - if(observers hasKey(event), - observers at(event) foreach(pair, - observer := pair at(0) - methodName := pair at(1) - - msg := Message clone setName(methodName) - args foreach(arg, msg appendArg(arg)) - - observer doMessage(msg) - ) - ) - self -) - -// Example: Stock price monitor -Stock := Observable clone -Stock init := method(symbol, price, - resend - self symbol := symbol - self price := price - self -) - -Stock setPrice := method(newPrice, - oldPrice := price - price = newPrice - - change := ((newPrice - oldPrice) / oldPrice * 100) round - emit("priceChanged", symbol, oldPrice, newPrice, change) - - if(change abs > 5, - emit("largeMoveDetected", symbol, change) - ) -) - -StockAlert := Object clone -StockAlert onPriceChange := method(symbol, oldPrice, newPrice, change, - ("Price alert: " .. symbol .. " moved from $" .. oldPrice .. - " to $" .. newPrice .. " (" .. change .. "%)") println -) - -StockAlert onLargeMove := method(symbol, change, - ("⚠️ Large move detected: " .. symbol .. " changed " .. change .. "%") println -) - -// Usage -apple := Stock clone init("AAPL", 150.00) -alert := StockAlert clone - -apple on("priceChanged", alert, "onPriceChange") -apple on("largeMoveDetected", alert, "onLargeMove") - -apple setPrice(155.00) // Normal change -apple setPrice(165.00) // Large move triggers both alerts -``` - -## Dependency Injection - -Using Io's dynamic nature for DI: - -```io -// DI Container -Container := Object clone -Container init := method( - self services := Map clone - self singletons := Map clone - self -) - -Container register := method(name, factory, - services atPut(name, factory) - self -) - -Container singleton := method(name, factory, - services atPut(name, factory) - singletons atPut(name, nil) - self -) - -Container get := method(name, - if(services hasKey(name) not, - Exception raise("Service '" .. name .. "' not registered") - ) - - // Check if singleton - if(singletons hasKey(name), - if(singletons at(name) isNil, - singletons atPut(name, services at(name) call(self)) - ) - return singletons at(name) - ) - - // Regular service - services at(name) call(self) -) - -// Services -Logger := Object clone -Logger init := method(output, - self output := output - self -) -Logger log := method(message, - output write("[" .. Date now .. "] " .. message .. "\n") -) - -Database := Object clone -Database init := method(connectionString, logger, - self connectionString := connectionString - self logger := logger - logger log("Database initialized: " .. connectionString) - self -) - -UserService := Object clone -UserService init := method(database, logger, - self database := database - self logger := logger - self -) -UserService createUser := method(name, - logger log("Creating user: " .. name) - // database operations... - Map with("id", 1, "name", name) -) - -// Configure container -container := Container clone init - -container singleton("logger", block(c, - Logger clone init(File standardOutput) -)) - -container singleton("database", block(c, - Database clone init("postgres://localhost/myapp", c get("logger")) -)) - -container register("userService", block(c, - UserService clone init(c get("database"), c get("logger")) -)) - -// Usage -service := container get("userService") -service createUser("Alice") - -// Different instance each time -service1 := container get("userService") -service2 := container get("userService") -(service1 == service2) println // false - -// Same logger instance -logger1 := container get("logger") -logger2 := container get("logger") -(logger1 == logger2) println // true -``` - -## Strategy Pattern - -Leveraging blocks and dynamic dispatch: - -```io -// Sorting strategies -SortStrategy := Object clone - -BubbleSort := SortStrategy clone -BubbleSort execute := method(list, - result := list copy - n := result size - - for(i, 0, n - 2, - for(j, 0, n - i - 2, - if(result at(j) > result at(j + 1), - temp := result at(j) - result atPut(j, result at(j + 1)) - result atPut(j + 1, temp) - ) - ) - ) - result -) - -QuickSort := SortStrategy clone -QuickSort execute := method(list, - if(list size <= 1, return list) - - pivot := list at(list size / 2) - less := list select(x, x < pivot) - equal := list select(x, x == pivot) - greater := list select(x, x > pivot) - - execute(less) appendSeq(equal) appendSeq(execute(greater)) -) - -// Context -DataProcessor := Object clone -DataProcessor init := method( - self strategy := QuickSort - self -) - -DataProcessor setStrategy := method(s, - strategy = s - self -) - -DataProcessor process := method(data, - "Processing data..." println - strategy execute(data) -) - -// Usage with different strategies -processor := DataProcessor clone init - -data := list(3, 1, 4, 1, 5, 9, 2, 6) - -processor setStrategy(BubbleSort) process(data) println -processor setStrategy(QuickSort) process(data) println - -// Dynamic strategy selection -selectStrategy := method(dataSize, - if(dataSize < 10, BubbleSort, QuickSort) -) - -processor setStrategy(selectStrategy(data size)) -``` - -## Chain of Responsibility - -Building processing pipelines: - -```io -Handler := Object clone -Handler init := method( - self next := nil - self -) - -Handler setNext := method(handler, - next = handler - handler -) - -Handler handle := method(request, - if(canHandle(request), - process(request), - if(next, next handle(request), nil) - ) -) - -// Concrete handlers -AuthenticationHandler := Handler clone -AuthenticationHandler canHandle := method(request, - request at("requiresAuth") -) -AuthenticationHandler process := method(request, - if(request at("token") == "valid-token", - "Authentication successful" println - request atPut("authenticated", true) - if(next, next handle(request), request) - , - Exception raise("Authentication failed") - ) -) - -LoggingHandler := Handler clone -LoggingHandler canHandle := method(request, true) -LoggingHandler process := method(request, - ("Logging request: " .. request at("path")) println - if(next, next handle(request), request) -) - -RateLimitHandler := Handler clone -RateLimitHandler init := method( - resend - self requests := Map clone - self limit := 10 - self window := 60 // seconds - self -) -RateLimitHandler canHandle := method(request, - request hasKey("clientId") -) -RateLimitHandler process := method(request, - clientId := request at("clientId") - now := Date now - - if(requests hasKey(clientId) not, - requests atPut(clientId, list()) - ) - - // Clean old requests - clientRequests := requests at(clientId) select(time, - now - time < window - ) - - if(clientRequests size >= limit, - Exception raise("Rate limit exceeded"), - clientRequests append(now) - requests atPut(clientId, clientRequests) - if(next, next handle(request), request) - ) -) - -// Build chain -chain := LoggingHandler clone \ - setNext(RateLimitHandler clone \ - setNext(AuthenticationHandler clone)) - -// Process requests -request := Map with( - "path", "/api/users", - "clientId", "client-123", - "requiresAuth", true, - "token", "valid-token" -) - -result := chain handle(request) -``` - -## Plugin Architecture - -Dynamic loading and extension: - -```io -PluginManager := Object clone -PluginManager init := method( - self plugins := Map clone - self hooks := Map clone - self -) - -PluginManager registerHook := method(name, - if(hooks hasKey(name) not, - hooks atPut(name, list()) - ) - self -) - -PluginManager loadPlugin := method(path, - plugin := doFile(path) - - if(plugin hasSlot("name") not, - Exception raise("Plugin must have a name") - ) - - plugins atPut(plugin name, plugin) - - if(plugin hasSlot("init"), - plugin init(self) - ) - - ("Plugin loaded: " .. plugin name) println - self -) - -PluginManager hook := method(name, - args := call message arguments slice(1) - results := list() - - if(hooks hasKey(name), - hooks at(name) foreach(handler, - result := handler doMessage(Message clone setName("call") setArguments(args)) - results append(result) - ) - ) - - results -) - -PluginManager addHook := method(hookName, handler, - if(hooks hasKey(hookName) not, - registerHook(hookName) - ) - hooks at(hookName) append(handler) - self -) - -// Example plugin -MarkdownPlugin := Object clone -MarkdownPlugin name := "markdown" -MarkdownPlugin init := method(manager, - manager addHook("processText", block(text, - // Simple markdown processing - text replaceAllRegex("\\*\\*(.*?)\\*\\*", "$1") \ - replaceAllRegex("\\*(.*?)\\*", "$1") - )) - - manager addHook("getFormats", block( - list("markdown", "md") - )) -) - -// Usage -manager := PluginManager clone init -manager registerHook("processText") -manager registerHook("getFormats") - -// Load plugins -manager loadPlugin("markdown_plugin.io") - -// Use hooks -text := "This is **bold** and this is *italic*" -processed := manager hook("processText", text) -processed foreach(result, result println) - -formats := manager hook("getFormats") -"Supported formats: " print -formats flatten unique println -``` - -## Event Sourcing - -Implementing event-driven architecture: - -```io -// Event -Event := Object clone -Event init := method(type, data, - self type := type - self data := data - self timestamp := Date now - self id := Random uuid - self -) - -// Event Store -EventStore := Object clone -EventStore init := method( - self events := list() - self snapshots := Map clone - self -) - -EventStore append := method(event, - events append(event) - self -) - -EventStore getEvents := method(afterId, - if(afterId isNil, - return events - ) - - startIndex := events detectIndex(e, e id == afterId) - if(startIndex, - events slice(startIndex + 1), - list() - ) -) - -// Aggregate -Aggregate := Object clone -Aggregate init := method(id, - self id := id - self version := 0 - self uncommittedEvents := list() - self -) - -Aggregate applyEvent := method(event, - // Override in subclasses -) - -Aggregate raiseEvent := method(event, - applyEvent(event) - uncommittedEvents append(event) - version = version + 1 -) - -Aggregate markEventsAsCommitted := method( - uncommittedEvents = list() -) - -Aggregate loadFromHistory := method(events, - events foreach(event, - applyEvent(event) - version = version + 1 - ) -) - -// Example: Bank Account aggregate -BankAccount := Aggregate clone -BankAccount init := method(id, - resend(id) - self balance := 0 - self -) - -BankAccount deposit := method(amount, - if(amount <= 0, - Exception raise("Amount must be positive") - ) - - raiseEvent(Event clone init("MoneyDeposited", - Map with("accountId", id, "amount", amount))) -) - -BankAccount withdraw := method(amount, - if(amount <= 0, - Exception raise("Amount must be positive") - ) - if(amount > balance, - Exception raise("Insufficient funds") - ) - - raiseEvent(Event clone init("MoneyWithdrawn", - Map with("accountId", id, "amount", amount))) -) - -BankAccount applyEvent := method(event, - if(event type == "MoneyDeposited", - balance = balance + event data at("amount") - ) - - if(event type == "MoneyWithdrawn", - balance = balance - event data at("amount") - ) -) - -// Repository using event sourcing -AccountRepository := Object clone -AccountRepository init := method(eventStore, - self eventStore := eventStore - self -) - -AccountRepository save := method(account, - account uncommittedEvents foreach(event, - eventStore append(event) - ) - account markEventsAsCommitted -) - -AccountRepository getById := method(id, - events := eventStore getEvents select(e, - e data at("accountId") == id - ) - - account := BankAccount clone init(id) - account loadFromHistory(events) - account -) - -// Usage -store := EventStore clone init -repo := AccountRepository clone init(store) - -account := BankAccount clone init("acc-123") -account deposit(100) -account withdraw(30) -account deposit(50) - -repo save(account) -account balance println // 120 - -// Rebuild from events -rebuilt := repo getById("acc-123") -rebuilt balance println // 120 -``` - -## Caching Strategy - -Multi-level caching with different policies: - -```io -Cache := Object clone -Cache init := method(maxSize, ttl, - self maxSize := maxSize - self ttl := ttl // Time to live in seconds - self entries := Map clone - self accessOrder := list() - self -) - -Cache get := method(key, - if(entries hasKey(key), - entry := entries at(key) - - // Check TTL - if(Date now - entry at("time") > ttl, - entries removeAt(key) - accessOrder remove(key) - return nil - ) - - // Update access order (LRU) - accessOrder remove(key) - accessOrder append(key) - - entry at("value") - , - nil - ) -) - -Cache put := method(key, value, - // Evict if necessary - while(entries size >= maxSize, - evictKey := accessOrder removeFirst - entries removeAt(evictKey) - ("Cache evicted: " .. evictKey) println - ) - - entries atPut(key, Map with( - "value", value, - "time", Date now - )) - accessOrder append(key) - - value -) - -Cache getOrCompute := method(key, computeBlock, - value := get(key) - if(value isNil, - value = computeBlock call - put(key, value) - ) - value -) - -// Multi-level cache -MultiLevelCache := Object clone -MultiLevelCache init := method( - self l1 := Cache clone init(10, 60) // Small, fast, 1 minute TTL - self l2 := Cache clone init(100, 600) // Larger, 10 minute TTL - self -) - -MultiLevelCache get := method(key, - // Check L1 - value := l1 get(key) - if(value, return value) - - // Check L2 - value = l2 get(key) - if(value, - l1 put(key, value) // Promote to L1 - return value - ) - - nil -) - -MultiLevelCache put := method(key, value, - l1 put(key, value) - l2 put(key, value) - value -) - -// Usage with expensive computation -fibonacci := Object clone -fibonacci cache := MultiLevelCache clone init - -fibonacci compute := method(n, - if(n <= 1, return n) - - cache get(n) ifNil( - ("Computing fib(" .. n .. ")") println - result := compute(n - 1) + compute(n - 2) - cache put(n, result) - result - ) -) - -fibonacci compute(10) println // Computes -fibonacci compute(10) println // From cache -``` - -## Conclusion - -These patterns demonstrate how Io's features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language's flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code. - -The key insight is that Io's uniform object model means patterns aren't special constructs but natural expressions of the language's core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches. - ---- - -*Next: [Chapter 16 - Case Studies](16-case-studies.md)* \ No newline at end of file diff --git a/16-case-studies.md b/16-case-studies.md deleted file mode 100644 index 41ac438..0000000 --- a/16-case-studies.md +++ /dev/null @@ -1,1242 +0,0 @@ -# Chapter 16: Case Studies - -This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io's features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language. - -## Case Study 1: Web Server - -Building a simple but functional HTTP server demonstrates Io's networking, concurrency, and string handling: - -```io -// HTTP Server Implementation -HttpServer := Object clone -HttpServer init := method(port, - self port := port - self routes := Map clone - self middlewares := list() - self -) - -HttpRequest := Object clone -HttpRequest parse := method(rawData, - lines := rawData split("\r\n") - if(lines size == 0, return nil) - - // Parse request line - requestLine := lines at(0) split(" ") - self method := requestLine at(0) - self path := requestLine at(1) - self version := requestLine at(2) - - // Parse headers - self headers := Map clone - self body := "" - - bodyStart := false - lines slice(1) foreach(line, - if(bodyStart, - body = body .. line, - if(line size == 0, - bodyStart = true, - parts := line split(": ") - if(parts size == 2, - headers atPut(parts at(0), parts at(1)) - ) - ) - ) - ) - - // Parse query parameters - self params := Map clone - if(path containsSeq("?"), - parts := path split("?") - self path = parts at(0) - queryString := parts at(1) - - queryString split("&") foreach(param, - kv := param split("=") - if(kv size == 2, - params atPut(kv at(0), kv at(1) urlDecode) - ) - ) - ) - - self -) - -HttpResponse := Object clone -HttpResponse init := method( - self status := 200 - self headers := Map clone - self body := "" - - headers atPut("Content-Type", "text/html") - headers atPut("Server", "Io-Server/1.0") - self -) - -HttpResponse setStatus := method(code, - status = code - self -) - -HttpResponse setHeader := method(key, value, - headers atPut(key, value) - self -) - -HttpResponse write := method(content, - body = body .. content - self -) - -HttpResponse json := method(data, - setHeader("Content-Type", "application/json") - write(data asJson) - self -) - -HttpResponse build := method( - statusText := Map with( - 200, "OK", - 404, "Not Found", - 500, "Internal Server Error" - ) at(status, "Unknown") - - result := "HTTP/1.1 " .. status .. " " .. statusText .. "\r\n" - - headers atPut("Content-Length", body size asString) - headers foreach(key, value, - result = result .. key .. ": " .. value .. "\r\n" - ) - - result .. "\r\n" .. body -) - -// Middleware support -HttpServer use := method(middleware, - middlewares append(middleware) - self -) - -// Routing -HttpServer route := method(method, path, handler, - key := method .. ":" .. path - routes atPut(key, handler) - self -) - -HttpServer get := method(path, handler, - route("GET", path, handler) -) - -HttpServer post := method(path, handler, - route("POST", path, handler) -) - -// Request handling -HttpServer handleConnection := method(socket, - rawData := socket readUntilSeq("\r\n\r\n") - - request := HttpRequest parse(rawData) - if(request isNil, - socket close - return - ) - - response := HttpResponse clone init - - // Run middlewares - middlewares foreach(middleware, - middleware call(request, response) - ) - - // Find route - key := request method .. ":" .. request path - handler := routes at(key) - - if(handler, - e := try( - handler call(request, response) - ) catch(Exception, e, - response setStatus(500) write("Internal Server Error: " .. e message) - ) - , - // Try pattern matching for dynamic routes - handled := false - routes foreach(routeKey, routeHandler, - parts := routeKey split(":") - routeMethod := parts at(0) - routePath := parts at(1) - - if(routeMethod == request method and matchPath(routePath, request path), - routeHandler call(request, response) - handled = true - break - ) - ) - - if(handled not, - response setStatus(404) write("Not Found") - ) - ) - - socket write(response build) - socket close -) - -HttpServer matchPath := method(pattern, path, - // Simple pattern matching (e.g., /users/:id) - if(pattern containsSeq(":"), - patternParts := pattern split("/") - pathParts := path split("/") - - if(patternParts size != pathParts size, return false) - - patternParts foreach(i, part, - if(part beginsWithSeq(":") not, - if(part != pathParts at(i), return false) - ) - ) - - true - , - pattern == path - ) -) - -HttpServer start := method( - server := Socket clone - server setHost("127.0.0.1") - server setPort(port) - server bind - server listen - - ("Server listening on port " .. port) println - - loop( - client := server accept - @handleConnection(client) // Handle async - ) -) - -// Example application -app := HttpServer clone init(8080) - -// Middleware for logging -app use(block(request, response, - ("[" .. Date now .. "] " .. request method .. " " .. request path) println -)) - -// Static content -app get("/", block(request, response, - response write("

Welcome to Io Web Server

") - response write("

A simple server built with Io

") -)) - -// JSON API -app get("/api/info", block(request, response, - info := Map with( - "server", "Io-Server", - "version", "1.0", - "time", Date now asString - ) - response json(info) -)) - -// Dynamic routes -app get("/users/:id", block(request, response, - // Extract ID from path - id := request path split("/") at(2) - response write("

User Profile

") - response write("

User ID: " .. id .. "

") -)) - -// Form handling -app post("/submit", block(request, response, - // Parse form data from body - response write("

Form Submitted

") - response write("

Data: " .. request body .. "

") -)) - -// Start server -app start -``` - -## Case Study 2: Database ORM - -A simple object-relational mapper showcasing metaprogramming and DSL capabilities: - -```io -// ORM Implementation -ORM := Object clone - -// Database connection (simplified) -Database := Object clone -Database connections := Map clone - -Database connect := method(name, config, - conn := Connection clone init(config) - connections atPut(name, conn) - conn -) - -Connection := Object clone -Connection init := method(config, - self config := config - self tables := Map clone - self -) - -Connection execute := method(sql, - ("[SQL] " .. sql) println - // Simulate results - list() -) - -// Model base class -Model := Object clone -Model tableName := nil -Model fields := Map clone -Model connection := nil - -Model field := method(name, type, - fields atPut(name, Map with("type", type, "name", name)) - - // Generate getter - self setSlot(name, method( - self getSlot("_" .. name) - )) - - // Generate setter - self setSlot("set" .. name asCapitalized, method(value, - self setSlot("_" .. name, value) - self - )) - - self -) - -Model belongsTo := method(name, targetModel, - fields atPut(name .. "_id", Map with("type", "INTEGER", "name", name .. "_id")) - - self setSlot(name, method( - targetModel findById(self getSlot("_" .. name .. "_id")) - )) - - self -) - -Model hasMany := method(name, targetModel, foreignKey, - self setSlot(name, method( - targetModel where(foreignKey .. " = " .. self id) - )) - - self -) - -Model createTable := method( - sql := "CREATE TABLE IF NOT EXISTS " .. tableName .. " (\n" - sql = sql .. " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" - - fieldDefs := fields map(name, field, - " " .. name .. " " .. field at("type") - ) - - sql = sql .. fieldDefs join(",\n") .. "\n);" - - connection execute(sql) - self -) - -Model dropTable := method( - connection execute("DROP TABLE IF EXISTS " .. tableName) - self -) - -Model init := method( - fields foreach(name, field, - self setSlot("_" .. name, nil) - ) - self setSlot("_id", nil) - self -) - -Model save := method( - if(_id, - update, - insert - ) -) - -Model insert := method( - columns := list() - values := list() - - fields foreach(name, field, - value := self getSlot("_" .. name) - if(value isNil not, - columns append(name) - values append("'" .. value asString .. "'") - ) - ) - - sql := "INSERT INTO " .. tableName .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")" - - connection execute(sql) - self _id := connection lastInsertId // Simulated - self -) - -Model update := method( - updates := list() - - fields foreach(name, field, - value := self getSlot("_" .. name) - if(value isNil not, - updates append(name .. " = '" .. value asString .. "'") - ) - ) - - sql := "UPDATE " .. tableName .. " SET " .. updates join(", ") .. " WHERE id = " .. _id - - connection execute(sql) - self -) - -Model delete := method( - if(_id, - connection execute("DELETE FROM " .. tableName .. " WHERE id = " .. _id) - self _id := nil - ) - self -) - -// Class methods -Model all := method( - sql := "SELECT * FROM " .. tableName - rows := connection execute(sql) - - rows map(row, fromRow(row)) -) - -Model findById := method(id, - sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id - rows := connection execute(sql) - - if(rows size > 0, - fromRow(rows first), - nil - ) -) - -Model where := method(condition, - sql := "SELECT * FROM " .. tableName .. " WHERE " .. condition - rows := connection execute(sql) - - rows map(row, fromRow(row)) -) - -Model fromRow := method(row, - instance := self clone init - instance _id := row at("id") - - fields foreach(name, field, - instance setSlot("_" .. name, row at(name)) - ) - - instance -) - -// Query builder -QueryBuilder := Object clone -QueryBuilder init := method(model, - self model := model - self selections := list("*") - self conditions := list() - self orderBy := nil - self limitValue := nil - self -) - -QueryBuilder select := method( - self selections = call message arguments map(arg, - call sender doMessage(arg) asString - ) - self -) - -QueryBuilder where := method(condition, - conditions append(condition) - self -) - -QueryBuilder order := method(column, direction, - orderBy = column .. " " .. if(direction, direction, "ASC") - self -) - -QueryBuilder limit := method(n, - limitValue = n - self -) - -QueryBuilder build := method( - sql := "SELECT " .. selections join(", ") .. " FROM " .. model tableName - - if(conditions size > 0, - sql = sql .. " WHERE " .. conditions join(" AND ") - ) - - if(orderBy, - sql = sql .. " ORDER BY " .. orderBy - ) - - if(limitValue, - sql = sql .. " LIMIT " .. limitValue - ) - - sql -) - -QueryBuilder execute := method( - sql := build - rows := model connection execute(sql) - rows map(row, model fromRow(row)) -) - -// Define models -User := Model clone -User tableName = "users" -User connection = Database connect("main", Map with("file", "app.db")) - -User field("name", "VARCHAR(100)") \ - field("email", "VARCHAR(100)") \ - field("age", "INTEGER") \ - field("created_at", "DATETIME") - -User hasMany("posts", Post, "user_id") - -Post := Model clone -Post tableName = "posts" -Post connection = User connection - -Post field("title", "VARCHAR(200)") \ - field("content", "TEXT") \ - field("published", "BOOLEAN") \ - field("user_id", "INTEGER") - -Post belongsTo("user", User) - -// Validations -User validate := method( - errors := list() - - if(_name isNil or _name size == 0, - errors append("Name is required") - ) - - if(_email isNil or _email containsSeq("@") not, - errors append("Invalid email") - ) - - if(_age and (_age < 0 or _age > 150), - errors append("Invalid age") - ) - - if(errors size > 0, - Exception raise(errors join(", ")) - ) - - true -) - -User beforeSave := method( - validate - _created_at := Date now -) - -// Usage example -User createTable -Post createTable - -user := User clone init -user setName("Alice") setEmail("alice@example.com") setAge(30) -user save - -post := Post clone init -post setTitle("First Post") \ - setContent("Hello, World!") \ - setPublished(true) \ - setUserId(user id) -post save - -// Query examples -allUsers := User all -youngUsers := User where("age < 25") -userPosts := user posts - -// Query builder -query := QueryBuilder clone init(User) -results := query select("name", "email") \ - where("age > 21") \ - order("name") \ - limit(10) \ - execute -``` - -## Case Study 3: Game Engine - -A simple 2D game engine demonstrating real-time systems and graphics: - -```io -// Game Engine Core -GameEngine := Object clone -GameEngine init := method(width, height, - self width := width - self height := height - self entities := list() - self systems := list() - self running := true - self fps := 60 - self frameTime := 1.0 / fps - self -) - -// Entity Component System -Entity := Object clone -Entity init := method( - self id := Random uuid - self components := Map clone - self active := true - self -) - -Entity addComponent := method(name, component, - components atPut(name, component) - component entity := self - self -) - -Entity getComponent := method(name, - components at(name) -) - -Entity hasComponent := method(name, - components hasKey(name) -) - -// Components -Component := Object clone - -PositionComponent := Component clone -PositionComponent init := method(x, y, - self x := x - self y := y - self -) - -VelocityComponent := Component clone -VelocityComponent init := method(dx, dy, - self dx := dx - self dy := dy - self -) - -SpriteComponent := Component clone -SpriteComponent init := method(image, width, height, - self image := image - self width := width - self height := height - self -) - -ColliderComponent := Component clone -ColliderComponent init := method(width, height, - self width := width - self height := height - self -) - -HealthComponent := Component clone -HealthComponent init := method(maxHealth, - self maxHealth := maxHealth - self currentHealth := maxHealth - self -) - -// Systems -System := Object clone -System init := method( - self requiredComponents := list() - self -) - -System process := method(entity, deltaTime, - // Override in subclasses -) - -System canProcess := method(entity, - requiredComponents all(comp, - entity hasComponent(comp) - ) -) - -MovementSystem := System clone -MovementSystem requiredComponents = list("position", "velocity") - -MovementSystem process := method(entity, deltaTime, - pos := entity getComponent("position") - vel := entity getComponent("velocity") - - pos x = pos x + vel dx * deltaTime - pos y = pos y + vel dy * deltaTime -) - -CollisionSystem := System clone -CollisionSystem requiredComponents = list("position", "collider") - -CollisionSystem init := method( - resend - self collisions := list() - self -) - -CollisionSystem update := method(entities, deltaTime, - collisions = list() - - // Check all pairs - entities foreach(i, e1, - if(canProcess(e1), - entities slice(i + 1) foreach(e2, - if(canProcess(e2) and checkCollision(e1, e2), - collisions append(list(e1, e2)) - onCollision(e1, e2) - ) - ) - ) - ) -) - -CollisionSystem checkCollision := method(e1, e2, - p1 := e1 getComponent("position") - c1 := e1 getComponent("collider") - p2 := e2 getComponent("position") - c2 := e2 getComponent("collider") - - // AABB collision - p1 x < p2 x + c2 width and - p1 x + c1 width > p2 x and - p1 y < p2 y + c2 height and - p1 y + c1 height > p2 y -) - -CollisionSystem onCollision := method(e1, e2, - ("Collision between " .. e1 id .. " and " .. e2 id) println -) - -// Rendering (simulated) -RenderSystem := System clone -RenderSystem requiredComponents = list("position", "sprite") - -RenderSystem init := method( - resend - self screen := list() - self -) - -RenderSystem render := method(entities, - // Clear screen - screen = list() - - entities foreach(entity, - if(canProcess(entity), - pos := entity getComponent("position") - sprite := entity getComponent("sprite") - - screen append(Map with( - "x", pos x, - "y", pos y, - "image", sprite image - )) - ) - ) - - // Draw screen (simulated) - drawScreen -) - -RenderSystem drawScreen := method( - "Frame:" println - screen foreach(item, - (" [" .. item at("image") .. "] at (" .. - item at("x") round .. ", " .. item at("y") round .. ")") println - ) -) - -// Input handling -InputManager := Object clone -InputManager init := method( - self keys := Map clone - self mouseX := 0 - self mouseY := 0 - self -) - -InputManager isKeyPressed := method(key, - keys at(key, false) -) - -InputManager setKey := method(key, pressed, - keys atPut(key, pressed) -) - -// Game states -GameState := Object clone -GameState enter := method() -GameState exit := method() -GameState update := method(deltaTime) -GameState render := method() - -MenuState := GameState clone -MenuState enter := method( - "Entering menu" println - self selectedOption := 0 - self options := list("Start Game", "Options", "Quit") -) - -MenuState update := method(deltaTime, - // Handle menu input - if(InputManager isKeyPressed("up"), - selectedOption = (selectedOption - 1) max(0) - ) - if(InputManager isKeyPressed("down"), - selectedOption = (selectedOption + 1) min(options size - 1) - ) - if(InputManager isKeyPressed("enter"), - handleSelection - ) -) - -MenuState handleSelection := method( - option := options at(selectedOption) - if(option == "Start Game", - GameEngine setState(PlayState) - ) - if(option == "Quit", - GameEngine stop - ) -) - -PlayState := GameState clone -PlayState enter := method( - "Starting game" println - createLevel -) - -PlayState createLevel := method( - // Create player - player := Entity clone init - player addComponent("position", PositionComponent clone init(100, 100)) - player addComponent("velocity", VelocityComponent clone init(0, 0)) - player addComponent("sprite", SpriteComponent clone init("player", 32, 32)) - player addComponent("collider", ColliderComponent clone init(32, 32)) - player addComponent("health", HealthComponent clone init(100)) - - GameEngine addEntity(player) - - // Create enemies - 3 repeat(i, - enemy := Entity clone init - enemy addComponent("position", - PositionComponent clone init(200 + i * 50, 200)) - enemy addComponent("velocity", - VelocityComponent clone init(Random value * 20 - 10, Random value * 20 - 10)) - enemy addComponent("sprite", - SpriteComponent clone init("enemy", 24, 24)) - enemy addComponent("collider", - ColliderComponent clone init(24, 24)) - - GameEngine addEntity(enemy) - ) -) - -PlayState update := method(deltaTime, - // Handle player input - player := GameEngine entities first - if(player, - vel := player getComponent("velocity") - - vel dx = 0 - vel dy = 0 - - if(InputManager isKeyPressed("left"), vel dx = -100) - if(InputManager isKeyPressed("right"), vel dx = 100) - if(InputManager isKeyPressed("up"), vel dy = -100) - if(InputManager isKeyPressed("down"), vel dy = 100) - ) -) - -// Main game engine methods -GameEngine addEntity := method(entity, - entities append(entity) - entity -) - -GameEngine removeEntity := method(entity, - entities remove(entity) -) - -GameEngine addSystem := method(system, - systems append(system) - system -) - -GameEngine setState := method(state, - if(hasSlot("currentState") and currentState, - currentState exit - ) - currentState := state - currentState enter -) - -GameEngine update := method(deltaTime, - // Update current state - if(currentState, - currentState update(deltaTime) - ) - - // Update systems - systems foreach(system, - if(system hasSlot("update"), - system update(entities, deltaTime), - entities foreach(entity, - if(system canProcess(entity), - system process(entity, deltaTime) - ) - ) - ) - ) - - // Remove inactive entities - entities = entities select(e, e active) -) - -GameEngine render := method( - if(currentState, - currentState render - ) - - renderSystem render(entities) -) - -GameEngine run := method( - lastTime := Date now - - while(running, - currentTime := Date now - deltaTime := currentTime - lastTime - - if(deltaTime >= frameTime, - update(deltaTime) - render - lastTime = currentTime - ) - - // Small delay to prevent CPU spinning - wait(0.001) - ) -) - -GameEngine stop := method( - running = false -) - -// Initialize and run game -game := GameEngine clone init(800, 600) - -// Add systems -game addSystem(MovementSystem clone) -game addSystem(CollisionSystem clone init) -game renderSystem := RenderSystem clone init - -// Set initial state -game setState(MenuState) - -// Simulate some gameplay -"=== Game Engine Demo ===" println -MenuState handleSelection // Start game - -// Run a few frames -5 repeat(i, - ("Frame " .. i) println - game update(game frameTime) - game render - wait(0.1) -) -``` - -## Case Study 4: Build System - -A build system similar to Make or Rake: - -```io -// Build System -BuildSystem := Object clone -BuildSystem init := method( - self tasks := Map clone - self dependencies := Map clone - self executed := list() - self config := Map clone - self -) - -Task := Object clone -Task init := method(name, deps, action, - self name := name - self dependencies := if(deps, deps, list()) - self action := action - self outputs := list() - self inputs := list() - self -) - -Task execute := method(context, - ("Executing task: " .. name) println - if(action, - action call(context) - ) -) - -Task upToDate := method( - if(outputs size == 0 or inputs size == 0, - return false - ) - - outputTime := outputs map(f, File with(f) lastModified) min - inputTime := inputs map(f, File with(f) lastModified) max - - outputTime > inputTime -) - -// DSL for defining tasks -BuildSystem task := method(name, - t := Task clone init(name, list(), nil) - tasks atPut(name, t) - - self currentTask := t - call evalArgAt(0) - t -) - -BuildSystem desc := method(description, - if(currentTask, - currentTask description := description - ) -) - -BuildSystem depends := method( - deps := call message arguments map(arg, - call sender doMessage(arg) asString - ) - if(currentTask, - currentTask dependencies = deps - ) -) - -BuildSystem action := method( - if(currentTask, - currentTask action = call argAt(0) - ) -) - -BuildSystem file := method(output, inputs, - name := output - t := Task clone init(name, list(), nil) - t outputs = list(output) - t inputs = if(inputs type == "List", inputs, list(inputs)) - - tasks atPut(name, t) - self currentTask := t - - call evalArgAt(2) - t -) - -// Running tasks -BuildSystem run := method(taskName, - executed = list() - executeTask(taskName) -) - -BuildSystem executeTask := method(taskName, - if(executed contains(taskName), - return - ) - - task := tasks at(taskName) - if(task isNil, - Exception raise("Task not found: " .. taskName) - ) - - // Check if up to date - if(task upToDate, - ("Task " .. taskName .. " is up to date") println - return - ) - - // Execute dependencies first - task dependencies foreach(dep, - executeTask(dep) - ) - - // Execute the task - task execute(self) - executed append(taskName) -) - -// Utilities -BuildSystem sh := method(command, - ("$ " .. command) println - System system(command) -) - -BuildSystem glob := method(pattern, - Directory with(".") files select(f, - f name matchesRegex(pattern) - ) map(name) -) - -BuildSystem mkdir := method(path, - Directory with(path) create -) - -BuildSystem cp := method(src, dest, - File with(src) copyTo(dest) -) - -BuildSystem rm := method(path, - File with(path) remove -) - -// Configuration -BuildSystem configure := method( - call message arguments foreach(arg, - key := arg name - value := call sender doMessage(arg arguments at(0)) - config atPut(key, value) - ) - self -) - -// Example Buildfile -build := BuildSystem clone init - -build configure( - compiler: "gcc", - flags: "-Wall -O2", - srcDir: "src", - buildDir: "build" -) - -build task("clean", - desc("Remove all build artifacts") - action( - rm(config at("buildDir")) - "Cleaned" println - ) -) - -build task("init", - desc("Initialize build directory") - action( - mkdir(config at("buildDir")) - ) -) - -build task("compile", - desc("Compile C sources") - depends("init") - action( - sources := glob("src/*.c") - sources foreach(src, - obj := src replaceSeq(".c", ".o") replaceSeq("src/", "build/") - sh(config at("compiler") .. " " .. config at("flags") .. - " -c " .. src .. " -o " .. obj) - ) - ) -) - -build task("link", - desc("Link object files") - depends("compile") - action( - objects := glob("build/*.o") join(" ") - sh(config at("compiler") .. " " .. objects .. " -o build/app") - ) -) - -build task("test", - desc("Run tests") - depends("link") - action( - sh("./build/app --test") - ) -) - -build task("default", - depends("link") -) - -// File tasks for individual files -build file("build/main.o", list("src/main.c"), - action( - sh(config at("compiler") .. " " .. config at("flags") .. - " -c src/main.c -o build/main.o") - ) -) - -// Run build -build run("default") -``` - -## Lessons Learned - -These case studies demonstrate several key insights about building real applications in Io: - -### Strengths - -1. **Rapid Prototyping**: Io's minimal syntax and dynamic nature make it excellent for quickly building working prototypes. - -2. **DSL Creation**: The HTTP server's routing, ORM's query builder, and build system all show how naturally DSLs emerge in Io. - -3. **Flexibility**: The ability to modify anything at runtime made it easy to add features like middleware, validations, and hooks. - -4. **Concurrency**: The `@` operator and coroutines made async request handling in the web server trivial. - -### Challenges - -1. **Performance**: For the game engine, Io's interpreted nature and message passing overhead would limit frame rates in a real game. - -2. **Type Safety**: The ORM would benefit from type checking that Io doesn't provide, leading to potential runtime errors. - -3. **Tooling**: Lack of IDE support makes maintaining larger codebases challenging. - -4. **Libraries**: Many features had to be built from scratch due to limited ecosystem. - -### Best Practices - -1. **Use Prototypes Effectively**: Define clear prototype hierarchies (Model -> User, Component -> PositionComponent). - -2. **Leverage Message Passing**: The game engine's entity-component system naturally maps to message passing. - -3. **Build Abstractions**: Each case study built higher-level abstractions (Repository, Task, System) on Io's primitives. - -4. **Embrace DSLs**: Don't fight the language—use its strengths to create domain-appropriate interfaces. - -## Conclusion - -These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value. - ---- - -*Next: [Chapter 17 - Ecosystem and Libraries](17-ecosystem-and-libraries.md)* \ No newline at end of file diff --git a/17-ecosystem-and-libraries.md b/17-ecosystem-and-libraries.md deleted file mode 100644 index fce3406..0000000 --- a/17-ecosystem-and-libraries.md +++ /dev/null @@ -1,861 +0,0 @@ -# Chapter 17: Ecosystem and Libraries - -While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem. - -## Core Libraries - -Io comes with several built-in libraries that extend its capabilities: - -### File I/O and System - -```io -// File operations -file := File with("data.txt") - -// Reading -if(file exists, - contents := file contents - lines := file readLines - - // Read with encoding - file setEncoding("UTF-8") - text := file contents -) - -// Writing -file openForWriting -file write("Hello, World!\n") -file write("Line 2\n") -file close - -// Appending -file openForAppending -file write("Additional line\n") -file close - -// File information -file size println -file lastModified println -file isDirectory println - -// Directory operations -dir := Directory with("./src") -dir files foreach(file, - file name println -) - -dir directories foreach(subdir, - subdir path println -) - -// Recursive directory walking -dir recursiveFilesOfType("io") foreach(ioFile, - ioFile path println -) - -// System operations -System system("ls -la") // Execute shell command -System getEnvironmentVariable("HOME") println -System setEnvironmentVariable("MY_VAR", "value") -System exit(0) -``` - -### Networking - -```io -// HTTP Client -url := URL with("https://api.example.com/data") -url fetch println // Simple GET request - -// With headers -url setHeader("Authorization", "Bearer token") -url setHeader("Content-Type", "application/json") -response := url fetch - -// POST request -url setMethod("POST") -url setBody("{\"key\": \"value\"}") -response := url fetch - -// Socket programming -// Server -server := Socket clone -server setHost("127.0.0.1") -server setPort(8080) -server bind -server listen - -loop( - client := server accept - @( - data := client readUntilSeq("\n") - client write("Echo: " .. data) - client close - ) -) - -// Client -client := Socket clone -client setHost("127.0.0.1") -client setPort(8080) -client connect -client write("Hello, server!\n") -response := client readUntilSeq("\n") -response println -client close -``` - -### Date and Time - -```io -// Current date/time -now := Date now -now println - -// Date components -now year println -now month println -now day println -now hour println -now minute println -now second println - -// Date arithmetic -tomorrow := now + Duration days(1) -nextWeek := now + Duration weeks(1) -hourAgo := now - Duration hours(1) - -// Formatting -now asString("%Y-%m-%d %H:%M:%S") println -now asString("%B %d, %Y") println - -// Parsing -date := Date fromString("2024-01-15", "%Y-%m-%d") - -// Duration -duration := Duration clone -duration setDays(2) setHours(3) setMinutes(30) -duration asSeconds println - -// Timing code -start := Date now -// ... code to time ... -elapsed := Date now - start -("Elapsed: " .. elapsed) println -``` - -### Regular Expressions - -```io -// Basic matching -text := "The year 2024 has 365 days" -text matchesRegex("\\d+") println // true - -// Finding matches -match := text findRegex("\\d+") -match start println // Starting position -match end println // Ending position -match string println // Matched string - -// All matches -matches := text allMatchesOfRegex("\\d+") -matches foreach(m, - m string println // 2024, 365 -) - -// Replacement -result := text replaceFirstRegex("\\d+", "N") -result println // The year N has 365 days - -result := text replaceAllRegex("\\d+", "N") -result println // The year N has N days - -// Capture groups -email := "user@example.com" -pattern := "(\\w+)@([\\w.]+)" -if(match := email matchesOfRegex(pattern), - match at(1) println // user - match at(2) println // example.com -) - -// Compiling regex for reuse -regex := Regex with("\\b\\w{5}\\b") // 5-letter words -regex matches("hello") println // true -regex matches("hi") println // false -``` - -### JSON - -```io -// Parsing JSON -jsonString := """ -{ - "name": "Alice", - "age": 30, - "interests": ["coding", "music"], - "address": { - "city": "New York", - "zip": "10001" - } -} -""" - -data := jsonString parseJson -data at("name") println // Alice -data at("interests") at(0) println // coding -data at("address") at("city") println // New York - -// Creating JSON -person := Map with( - "name", "Bob", - "age", 25, - "active", true, - "tags", list("developer", "gamer") -) - -json := person asJson -json println // {"name":"Bob","age":25,"active":true,"tags":["developer","gamer"]} - -// Pretty printing -json := person asJson(true) // Pretty format -``` - -### XML - -```io -// Parsing XML -xmlString := """ - - - Alice - 30 - - - Bob - 25 - - -""" - -doc := SGML parseString(xmlString) -root := doc root - -// Navigate XML -people := root elementsWithName("person") -people foreach(person, - id := person attributeAt("id") - name := person elementWithName("name") text - age := person elementWithName("age") text - (id .. ": " .. name .. " (" .. age .. ")") println -) - -// Build XML -doc := SGML clone -root := doc addElement("catalog") - -book := root addElement("book") -book setAttribute("isbn", "123456") -book addElement("title") setText("Io Programming") -book addElement("author") setText("Jane Doe") -book addElement("price") setText("29.99") - -doc asString println -``` - -## Addon System - -Io's addon system allows loading C-based extensions: - -```io -// Loading addons -Addon load("Socket") // Network programming -Addon load("Random") // Random number generation -Addon load("Regex") // Regular expressions -Addon load("SQLite") // Database access - -// Check available addons -Addon availableAddons foreach(name, - name println -) - -// Addon information -addon := Addon named("Socket") -addon path println -addon dependencies println -``` - -## Database Libraries - -### SQLite - -```io -// SQLite integration -db := SQLite clone -db open("app.db") - -// Create table -db exec(""" - CREATE TABLE IF NOT EXISTS users ( - id INTEGER PRIMARY KEY, - name TEXT NOT NULL, - email TEXT UNIQUE, - created_at DATETIME DEFAULT CURRENT_TIMESTAMP - ) -""") - -// Insert data -stmt := db prepare("INSERT INTO users (name, email) VALUES (?, ?)") -stmt bind(1, "Alice") -stmt bind(2, "alice@example.com") -stmt step -stmt reset - -// Query data -results := db exec("SELECT * FROM users WHERE name LIKE 'A%'") -results foreach(row, - ("ID: " .. row at("id") .. ", Name: " .. row at("name")) println -) - -// Prepared statements with results -stmt := db prepare("SELECT * FROM users WHERE id = ?") -stmt bind(1, 1) - -while(stmt step == SQLite ROW, - name := stmt columnText(1) - email := stmt columnText(2) - (name .. " - " .. email) println -) - -stmt finalize -db close - -// Transactions -db begin -try( - db exec("INSERT INTO users ...") - db exec("UPDATE users ...") - db commit -) catch(Exception, e, - db rollback - e raise -) -``` - -## Graphics and GUI - -### OpenGL - -```io -// OpenGL addon (if available) -Addon load("OpenGL") - -// Basic window setup -window := GLApp clone -window width := 800 -window height := 600 -window title := "Io OpenGL" - -window draw := method( - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - - glBegin(GL_TRIANGLES) - glColor3f(1, 0, 0) - glVertex2f(-0.5, -0.5) - glColor3f(0, 1, 0) - glVertex2f(0.5, -0.5) - glColor3f(0, 0, 1) - glVertex2f(0, 0.5) - glEnd - - swapBuffers -) - -window run -``` - -### Image Processing - -```io -// Image addon -Addon load("Image") - -// Load and manipulate images -img := Image clone -img open("photo.jpg") - -// Get information -img width println -img height println -img componentCount println // Color channels - -// Basic operations -img resize(800, 600) -img crop(100, 100, 400, 300) -img flip("horizontal") -img rotate(90) - -// Filters -img blur(5) -img sharpen -img adjustBrightness(1.2) -img adjustContrast(1.5) -img grayscale - -// Save -img save("modified.png") - -// Create new image -canvas := Image clone -canvas allocate(500, 500, 3) // RGB -canvas fill(Color with(0.5, 0.5, 1.0)) // Light blue - -// Draw on image -canvas drawLine(0, 0, 500, 500, Color red) -canvas drawCircle(250, 250, 100, Color green) -canvas drawRectangle(100, 100, 300, 200, Color blue) - -canvas save("drawing.png") -``` - -## Cryptography - -```io -// Crypto addon -Addon load("MD5") -Addon load("SHA1") - -// Hashing -text := "Hello, World!" - -md5 := MD5 clone -md5 appendSeq(text) -md5 hexDigest println // MD5 hash - -sha := SHA1 clone -sha appendSeq(text) -sha hexDigest println // SHA1 hash - -// File hashing -file := File with("document.pdf") -hash := MD5 hashFile(file path) -hash println - -// HMAC (if available) -key := "secret-key" -message := "Important message" -hmac := HMAC sha256(key, message) -hmac println -``` - -## Third-Party Libraries - -### Package Management - -While Io doesn't have a centralized package manager like npm or pip, libraries can be managed through: - -```io -// Simple package loader -PackageLoader := Object clone -PackageLoader paths := list( - "~/.io/packages", - "/usr/local/io/packages", - "./packages" -) - -PackageLoader load := method(name, - paths foreach(path, - packageFile := Path with(path, name, "init.io") - if(File with(packageFile) exists, - doFile(packageFile) - return true - ) - ) - Exception raise("Package not found: " .. name) -) - -// Usage -PackageLoader load("web-framework") -PackageLoader load("test-framework") -``` - -### Creating Libraries - -Structure for an Io library: - -```io -// mylib/init.io - Entry point -MyLib := Object clone -MyLib version := "1.0.0" - -// Load components -doRelativeFile("core.io") -doRelativeFile("utils.io") -doRelativeFile("extensions.io") - -// Export public API -MyLib - -// mylib/core.io -MyLib Core := Object clone -MyLib Core process := method(data, - // Core functionality -) - -// mylib/utils.io -MyLib Utils := Object clone -MyLib Utils helper := method( - // Utility functions -) - -// mylib/extensions.io -// Extend built-in types -List customMethod := method( - // Extended functionality -) -``` - -### Testing Frameworks - -Simple testing framework example: - -```io -// SimpleTest framework -Test := Object clone -Test suites := list() - -Test describe := method(name, block, - suite := TestSuite clone - suite name := name - suite tests := list() - - suite it := method(desc, testBlock, - tests append(list(desc, testBlock)) - ) - - block call(suite) - suites append(suite) -) - -Test run := method( - totalTests := 0 - passedTests := 0 - - suites foreach(suite, - ("\n" .. suite name) println - ("=" repeated(suite name size)) println - - suite tests foreach(test, - desc := test at(0) - block := test at(1) - totalTests = totalTests + 1 - - e := try( - block call - (" ✓ " .. desc) println - passedTests = passedTests + 1 - ) catch(Exception, e, - (" ✗ " .. desc) println - (" " .. e message) println - ) - ) - ) - - ("\n" .. passedTests .. "/" .. totalTests .. " tests passed") println -) - -// Usage -Test describe("Array operations", suite, - suite it("should append elements", - arr := list(1, 2) - arr append(3) - assert(arr size == 3) - ) - - suite it("should remove elements", - arr := list(1, 2, 3) - arr remove(2) - assert(arr contains(2) not) - ) -) - -Test run -``` - -## Documentation Tools - -### Generating Documentation - -```io -// Simple documentation generator -DocGen := Object clone -DocGen init := method( - self docs := Map clone - self -) - -DocGen document := method(obj, name, - info := Map clone - info atPut("name", name) - info atPut("type", obj type) - info atPut("slots", obj slotNames sort) - - // Extract method signatures - methods := Map clone - obj slotNames foreach(slotName, - slot := obj getSlot(slotName) - if(slot type == "Block", - methods atPut(slotName, slot argumentNames) - ) - ) - info atPut("methods", methods) - - docs atPut(name, info) - self -) - -DocGen generateMarkdown := method( - md := "# API Documentation\n\n" - - docs foreach(name, info, - md = md .. "## " .. name .. "\n\n" - md = md .. "**Type**: " .. info at("type") .. "\n\n" - - methods := info at("methods") - if(methods size > 0, - md = md .. "### Methods\n\n" - methods foreach(method, args, - md = md .. "- `" .. method .. "(" .. args join(", ") .. ")`\n" - ) - md = md .. "\n" - ) - ) - - md -) - -// Usage -docGen := DocGen clone init -docGen document(MyClass, "MyClass") -docGen document(MyUtils, "MyUtils") - -File with("API.md") openForWriting write(docGen generateMarkdown) close -``` - -## Development Tools - -### REPL Enhancements - -```io -// Enhanced REPL -REPL := Object clone -REPL history := list() -REPL commands := Map clone - -REPL registerCommand := method(name, block, - commands atPut(name, block) -) - -REPL run := method( - loop( - "io> " print - input := File standardInput readLine - - if(input beginsWithSeq(":"), - // Handle commands - cmd := input afterSeq(":") - if(commands hasKey(cmd), - commands at(cmd) call, - ("Unknown command: " .. cmd) println - ), - // Evaluate Io code - history append(input) - e := try( - result := doString(input) - ("==> " .. result) println - ) catch(Exception, e, - ("Error: " .. e message) println - ) - ) - ) -) - -// Register commands -REPL registerCommand("help", block( - "Available commands:" println - commands keys foreach(cmd, - (" :" .. cmd) println - ) -)) - -REPL registerCommand("history", block( - history foreach(i, line, - (i .. ": " .. line) println - ) -)) - -REPL registerCommand("clear", block( - System system("clear") -)) - -REPL registerCommand("quit", block( - System exit -)) - -// Run enhanced REPL -REPL run -``` - -### Debugging Tools - -```io -// Simple debugger -Debugger := Object clone -Debugger breakpoints := list() -Debugger stepping := false - -Object debug := method( - Debugger enter(self, call) -) - -Debugger enter := method(context, callObj, - "=== Debugger ===" println - ("Context: " .. context type) println - ("Location: " .. callObj message) println - - loop( - "> " print - cmd := File standardInput readLine split(" ") - - if(cmd at(0) == "inspect", - target := cmd at(1) - if(target, - obj := context doString(target) - obj slotNames foreach(slot, - (" " .. slot .. ": " .. obj getSlot(slot) type) println - ) - ) - ) - - if(cmd at(0) == "eval", - code := cmd slice(1) join(" ") - result := context doString(code) - result println - ) - - if(cmd at(0) == "continue", - break - ) - - if(cmd at(0) == "help", - "Commands: inspect , eval , continue, help" println - ) - ) -) -``` - -## Community Resources - -### Finding Libraries - -Common sources for Io libraries: - -1. **GitHub**: Search for "io-language" or "iolanguage" topics -2. **Official Repository**: https://github.com/IoLanguage/io -3. **Community Addons**: Various developers maintain addon collections - -### Contributing - -Creating an addon for the community: - -```io -// addon.io - Addon metadata -Addon := Object clone -Addon name := "MyAddon" -Addon version := "1.0.0" -Addon author := "Your Name" -Addon description := "Description of what your addon does" -Addon license := "MIT" -Addon dependencies := list("OtherAddon") - -Addon install := method( - // Installation logic - "Installing " .. name .. " v" .. version println - - // Copy files - // Compile C extensions if needed - // Register with Io -) - -Addon uninstall := method( - // Cleanup logic -) - -// Make addon discoverable -Addon register -``` - -## Performance Libraries - -### Profiling - -```io -// Simple profiler -Profiler := Object clone -Profiler data := Map clone - -Object profile := method(name, - start := Date now - result := call evalArgAt(0) - elapsed := Date now - start - - if(Profiler data hasKey(name) not, - Profiler data atPut(name, list(0, 0)) - ) - - stats := Profiler data at(name) - stats atPut(0, stats at(0) + 1) // Count - stats atPut(1, stats at(1) + elapsed) // Total time - - result -) - -Profiler report := method( - "=== Profile Report ===" println - data foreach(name, stats, - count := stats at(0) - total := stats at(1) - avg := total / count - - (name .. ": " .. count .. " calls, " .. - total .. "s total, " .. avg .. "s average") println - ) -) - -// Usage -profile("database", - // Expensive operation - wait(0.1) -) - -Profiler report -``` - -## Future of Io Libraries - -The Io ecosystem continues to evolve with: - -1. **WebAssembly Support**: Potential for running Io in browsers -2. **Modern Addons**: Integration with contemporary libraries -3. **Cloud Services**: AWS, Azure, GCP client libraries -4. **Machine Learning**: Bindings to TensorFlow, PyTorch -5. **Improved Tooling**: Better IDE support, linters, formatters - -## Conclusion - -While Io's ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need. - -The key to working effectively with Io's ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need. - ---- - -*Next: [Chapter 18 - Conclusion](18-conclusion.md)* \ No newline at end of file diff --git a/18-conclusion.md b/18-conclusion.md deleted file mode 100644 index 9a01b66..0000000 --- a/18-conclusion.md +++ /dev/null @@ -1,349 +0,0 @@ -# Chapter 18: Conclusion - The Io Way - -We've reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we've explored a language that challenges conventional programming wisdom. This final chapter reflects on what we've learned, when to use Io, and what it teaches us about programming itself. - -## What Makes Io Special - -After eighteen chapters, we can distill Io's essence to a few key principles: - -### Radical Simplicity - -Io achieves remarkable expressiveness with minimal concepts: -- Everything is an object -- All computation is message passing -- Objects clone objects (no classes) -- Code is data (messages are objects) - -Compare Io's ~10,000 lines of C to Python's ~500,000 or Java's millions. This isn't just about code size—it's about conceptual simplicity. You can understand all of Io, not just use it. - -### Uniformity - -Where other languages have special cases, Io has objects: - -```io -// Numbers? Objects. -5 squared := method(self * self) - -// Booleans? Objects. -true celebrate := method("Yes!" println) - -// Control structures? Objects receiving messages. -if := method(condition, trueBlock, falseBlock, ...) - -// Operators? Messages. -Number + := method(n, ...) - -// Even nil? An object. -nil comfort := method("It's okay to be nothing" println) -``` - -This uniformity isn't just elegant—it's powerful. When everything follows the same rules, there's less to remember and more you can do. - -### Openness - -Most languages protect you from yourself. Io trusts you completely: - -```io -// Modify fundamental types -String shout := method(self upper .. "!!!") - -// Change how the language works -Object if := method(...) // Redefine conditionals - -// Inspect everything -anyObject slotNames // See all slots -anyMethod code // See implementation -``` - -This openness enables profound metaprogramming but requires responsibility. - -## When to Use Io - -Io excels in specific contexts: - -### Rapid Prototyping - -When you need to explore ideas quickly: - -```io -// From idea to working code in minutes -Api := Object clone -Api route := method(path, handler, ...) -Api get("/users", block(...)) -Api start(8080) -``` - -### Domain-Specific Languages - -When you need expressive, domain-appropriate interfaces: - -```io -recipe "Pasta" serves(4) { - boil water in("large pot") - add pasta after("water boils") - cook for(8) minutes - drain - serve with("marinara sauce") -} -``` - -### Learning and Teaching - -When you want to understand programming concepts deeply: -- How objects really work -- What message passing means -- How languages are implemented -- Why certain design choices matter - -### Embedded Scripting - -When you need a lightweight, embeddable language: -- Game scripting -- Application automation -- Configuration languages -- Plugin systems - -## When Not to Use Io - -Io has limitations to consider: - -### Performance-Critical Systems - -```io -// Io: Elegant but slower -numbers map(x, x * x) select(x, x > 100) - -// C: Verbose but fast -for(int i = 0; i < n; i++) { - squared[i] = numbers[i] * numbers[i]; - if(squared[i] > 100) ... -} -``` - -Message passing has overhead. For number crunching, system programming, or real-time systems, choose C, Rust, or C++. - -### Large Team Projects - -Io lacks: -- Static type checking -- Comprehensive IDE support -- Large ecosystem of libraries -- Extensive documentation -- Big community for support - -For enterprise applications with many developers, Java, C#, or TypeScript offer better tooling and guardrails. - -### Production Web Services - -While you can build web services in Io, you probably shouldn't for production: -- Limited web frameworks -- No battle-tested libraries -- Small community for security issues -- Few deployment options - -Use Python, Ruby, JavaScript, or Go instead. - -## Lessons for Other Languages - -Even if you never use Io professionally, it teaches valuable lessons: - -### Question Everything - -Why do we need classes? Io shows prototypes work fine. -Why special syntax for control flow? Io uses methods. -Why distinguish data and code? Io treats both as messages. - -These aren't necessarily better—but questioning assumptions makes you a better programmer. - -### Simplicity Has Power - -Io shows how much you can achieve with few concepts. This influences how you design: -- APIs with consistent interfaces -- Systems with uniform principles -- Code that does one thing well - -### Metaprogramming Isn't Magic - -In Io, metaprogramming is just programming: - -```io -// Not magic, just objects -method := block(x, x * 2) -method code println // x *(2) -method setCode("x + 2") // Changed! -``` - -This demystifies metaprogramming in any language. - -### Everything Has Trade-offs - -Io's choices have consequences: -- Simplicity vs Performance -- Flexibility vs Safety -- Power vs Complexity -- Expressiveness vs Familiarity - -Understanding these trade-offs helps you choose the right tool for each job. - -## Io's Influence - -Despite its small community, Io has influenced programming: - -### JavaScript's Prototype Pattern - -```javascript -// JavaScript embracing prototypes (pre-ES6) -var animal = { - speak: function() { console.log("..."); } -}; - -var dog = Object.create(animal); -dog.bark = function() { console.log("Woof!"); }; -``` - -### Ruby's Method Missing - -```ruby -class DynamicObject - def method_missing(name, *args) - if name.to_s.start_with?("get_") - # Handle dynamically - end - end -end -``` - -### Minimalist Language Design - -Languages like Lua and Factor share Io's minimalist philosophy, proving that small can be powerful. - -## The Future of Io - -Io may never become mainstream, and that's okay. Its value isn't in market share but in: - -### Educational Impact - -Io remains excellent for teaching: -- Prototype-based OOP -- Message passing -- Language implementation -- Metaprogramming concepts - -### Research Platform - -Io's simplicity makes it ideal for experimenting with: -- New concurrency models -- Novel object systems -- DSL techniques -- Language features - -### Inspiration - -Future language designers study Io to understand: -- How simple a language can be -- Alternative object models -- The power of uniformity -- Trade-offs in language design - -## Personal Reflection - -Learning Io changes how you think about programming. You realize that many "fundamental" concepts are just choices. Classes aren't necessary. Syntax isn't sacred. Types aren't mandatory. These aren't revelations that everything should be like Io—rather, they free you to think more broadly about problems and solutions. - -When you return to your daily programming language—be it Python, JavaScript, Java, or something else—you bring new perspectives: - -- You see the prototype pattern hiding in JavaScript's classes -- You recognize message passing in Ruby's method calls -- You understand metaprogramming isn't mysterious -- You appreciate both the safety of types and the freedom of their absence - -## A Final Example - -Let's end with a small program that captures Io's spirit: - -```io -// The Io Philosophy in Code -Philosophy := Object clone - -Philosophy simplicity := "Everything is an object" -Philosophy uniformity := "Everything is a message" -Philosophy openness := "Everything is modifiable" - -Philosophy embrace := method(concept, - ("Embracing " .. concept .. "...") println - self setSlot(concept, true) - self -) - -Philosophy question := method(assumption, - ("Why must " .. assumption .. "?") println - ("Perhaps there's another way...") println -) - -Philosophy learn := method( - lessons := list( - "Simplicity enables understanding", - "Uniformity reduces cognitive load", - "Openness enables exploration", - "Constraints inspire creativity", - "Every choice has consequences" - ) - - lessons foreach(lesson, - (" • " .. lesson) println - wait(0.5) // Pause to reflect - ) -) - -// The journey -journey := Philosophy clone - -journey embrace("simplicity") \ - embrace("uniformity") \ - embrace("openness") - -journey question("languages be complex") -journey question("we have classes") -journey question("syntax be fixed") - -"Lessons learned:" println -journey learn - -"Thank you for exploring Io." println -"May it inspire your programming journey." println -``` - -## Parting Thoughts - -Io isn't trying to replace your favorite language. It's not competing for market dominance. It's not the solution to all programming problems. - -What Io offers is perspective—a radically different view of what programming can be. It shows that our familiar concepts aren't immutable laws but design choices. It demonstrates that simplicity and power aren't opposites. It proves that small languages can have big ideas. - -Whether you use Io for a weekend experiment, a personal project, or just intellectual exploration, it will change how you think about programming. You'll question more, assume less, and see possibilities where you once saw constraints. - -That's the real gift of Io: not the language itself, but the mindset it instills. A mindset that questions, explores, and imagines. A mindset that sees programming not as applying fixed rules but as creatively solving problems with the tools at hand—or creating new tools when needed. - -## Thank You - -Thank you for joining me on this exploration of Io. I hope you've found it as enlightening to read as I found it to write. The language may be small, but the ideas are vast. - -Now go forth and experiment. Clone some objects. Send some messages. Build something unusual. Question something fundamental. And remember: in Io, as in programming, as in life—everything is possible when you embrace simplicity, seek uniformity, and remain open to new ideas. - -Happy coding, and may your messages always find their slots. - ---- - -*End of Book* - -## Appendices - -For continued learning: - -- **Appendix A**: Io Language Reference -- **Appendix B**: Standard Library Documentation -- **Appendix C**: Building Io from Source -- **Appendix D**: Creating C Addons -- **Appendix E**: Io Resources and Community - -Visit https://iolanguage.org for more information. - -*"Simplicity is the ultimate sophistication."* — Leonardo da Vinci \ No newline at end of file diff --git a/website/content/docs/09-blocks-and-closures.md b/Blocks-and-Closures/_index.md similarity index 98% rename from website/content/docs/09-blocks-and-closures.md rename to Blocks-and-Closures/_index.md index 8b98f5e..8fbdcdb 100644 --- a/website/content/docs/09-blocks-and-closures.md +++ b/Blocks-and-Closures/_index.md @@ -1,12 +1,10 @@ --- -title: "Blocks and Closures" -weight: 100 +title: Blocks and Closures +topTitle: Io +subtitle: "First-class code as objects that capture their lexical environment." +nextSectionLink: true --- - - -# Chapter 9: Blocks and Closures - Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io. ## Understanding Blocks and Methods @@ -661,6 +659,3 @@ Blocks and closures are fundamental to Io's expressiveness. They're not just ano The distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io's scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement. Understanding blocks deeply unlocks Io's full potential, enabling you to write code that's both powerful and elegant. - ---- - diff --git a/Blocks-and-Closures/index.html b/Blocks-and-Closures/index.html new file mode 100644 index 0000000..866919b --- /dev/null +++ b/Blocks-and-Closures/index.html @@ -0,0 +1,495 @@ + + + + + + +Blocks and Closures – Io + + + + +

First-class code as objects that capture their lexical environment.

Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io.

Understanding Blocks and Methods

In Io, block and method are similar but have a crucial difference:

// Block - creates its own scope
+blk := block(x, x * 2)
+blk call(5) println  // 10
+
+// Method - shares scope with receiver
+obj := Object clone
+obj value := 10
+obj meth := method(x, x * value)  // Can access 'value'
+obj blk := block(x, x * value)    // Error when called - no 'value' in block scope
+
+obj meth(5) println  // 50
+// obj blk call(5)  // Exception: value not found

The key difference:

  • Methods have access to self and the receiver's slots
  • Blocks create their own scope and don't have automatic access to self

Creating and Calling Blocks

// Simple block
+double := block(x, x * 2)
+double call(5) println  // 10
+
+// Multi-argument block
+add := block(a, b, a + b)
+add call(3, 4) println  // 7
+
+// No-argument block
+greet := block("Hello!" println)
+greet call  // Hello!
+
+// Blocks are objects
+double type println  // Block
+double proto println  // Block_0x...

Blocks as Closures

Blocks capture variables from their creation context:

makeCounter := method(
+    count := 0
+    block(
+        count = count + 1
+        count
+    )
+)
+
+counter1 := makeCounter()
+counter2 := makeCounter()
+
+counter1 call println  // 1
+counter1 call println  // 2
+counter2 call println  // 1 (independent)
+counter1 call println  // 3

This is different from many languages where you need special syntax for closures:

// JavaScript
+function makeCounter() {
+    let count = 0;
+    return function() {
+        count++;
+        return count;
+    };
+}

In Io, all blocks are closures automatically.

The Scope Chain

Understanding scope is crucial for blocks:

x := "global"
+
+outer := method(
+    x := "outer"
+    
+    inner := block(
+        x println  // What prints?
+    )
+    
+    inner
+)
+
+myBlock := outer()
+myBlock call  // "outer" - captured from creation context
+
+x = "changed global"
+myBlock call  // Still "outer" - closure captures variables, not global

Methods and self

Methods have access to self (the receiver):

Calculator := Object clone
+Calculator value := 0
+
+Calculator add := method(n,
+    self value = self value + n  // Explicit self
+    value  // Implicit self
+)
+
+Calculator addBlock := block(n,
+    // No automatic self here!
+    // Would need to pass it explicitly
+)
+
+calc := Calculator clone
+calc add(5) println  // 5
+calc add(3) println  // 8

Block Arguments and Defaults

// Variable arguments
+sumAll := block(
+    args := call message arguments
+    total := 0
+    args foreach(arg,
+        total = total + call sender doMessage(arg)
+    )
+    total
+)
+
+sumAll call(1, 2, 3, 4, 5) println  // 15
+
+// Default arguments (manual)
+greetWithDefault := block(name,
+    if(name isNil, name = "World")
+    ("Hello, " .. name .. "!") println
+)
+
+greetWithDefault call("Alice")  // Hello, Alice!
+greetWithDefault call()        // Hello, World!

Higher-Order Functions

Blocks enable functional programming patterns:

// Functions returning functions
+makeMultiplier := method(factor,
+    block(x, x * factor)
+)
+
+double := makeMultiplier(2)
+triple := makeMultiplier(3)
+
+double call(5) println  // 10
+triple call(5) println  // 15
+
+// Functions taking functions
+twice := method(f, x,
+    f call(f call(x))
+)
+
+twice(block(n, n + 1), 5) println  // 7
+
+// Composition
+compose := method(f, g,
+    block(x, f call(g call(x)))
+)
+
+addOne := block(x, x + 1)
+double := block(x, x * 2)
+doubleThenAddOne := compose(addOne, double)
+
+doubleThenAddOne call(5) println  // 11

Partial Application and Currying

// Partial application
+add := block(a, b, a + b)
+
+addFive := block(x, add call(5, x))
+addFive call(3) println  // 8
+
+// Currying
+curry := method(f,
+    block(a,
+        block(b,
+            f call(a, b)
+        )
+    )
+)
+
+curriedAdd := curry(add)
+add5 := curriedAdd call(5)
+add5 call(3) println  // 8
+
+// More practical example
+formatString := block(template, value,
+    template interpolate(value)
+)
+
+curriedFormat := curry(formatString)
+errorFormatter := curriedFormat call("Error: #{value}")
+successFormatter := curriedFormat call("Success: #{value}")
+
+errorFormatter call("File not found") println  // Error: File not found
+successFormatter call("Operation complete") println  // Success: Operation complete

Lazy Evaluation with Blocks

Blocks don't evaluate until called, enabling lazy patterns:

// Lazy if (already built-in, but here's how it works)
+lazyIf := method(condition, trueBlock, falseBlock,
+    if(condition,
+        trueBlock call,
+        falseBlock call
+    )
+)
+
+x := 5
+lazyIf(x > 3,
+    block("Greater" println),
+    block("Lesser" println)
+)
+
+// Lazy infinite sequences
+naturals := method(start,
+    block(
+        n := start
+        block(
+            current := n
+            n = n + 1
+            current
+        )
+    ) call
+)
+
+seq := naturals(1)
+5 repeat(seq call println)  // 1, 2, 3, 4, 5

Memoization

Use closures to cache expensive computations:

memoize := method(f,
+    cache := Map clone
+    
+    block(
+        args := call message arguments
+        key := args asString
+        
+        if(cache hasKey(key),
+            cache at(key),
+            result := f call(args)
+            cache atPut(key, result)
+            result
+        )
+    )
+)
+
+// Expensive fibonacci
+fib := block(n,
+    if(n < 2, n, fib call(n - 1) + fib call(n - 2))
+)
+
+// Memoized version
+fastFib := memoize(fib)
+
+// Much faster on repeated calls
+time(fib call(30)) println
+time(fastFib call(30)) println

Block Introspection

Blocks are objects you can inspect:

myBlock := block(x, y, x + y * 2)
+
+// Inspect structure
+myBlock argumentNames println  // list(x, y)
+myBlock code println           // x +(y *(2))
+
+// Modify blocks
+myBlock setArgumentNames(list("a", "b"))
+myBlock argumentNames println  // list(a, b)
+
+// Create blocks programmatically
+code := "a + b"
+args := list("a", "b")
+dynamicBlock := Block clone setArgumentNames(args) setCode(code)
+dynamicBlock call(3, 4) println  // 7

Blocks in Data Structures

// Table of operations
+operations := Map with(
+    "+", block(a, b, a + b),
+    "-", block(a, b, a - b),
+    "*", block(a, b, a * b),
+    "/", block(a, b, a / b)
+)
+
+calculate := method(op, a, b,
+    operations at(op) call(a, b)
+)
+
+calculate("+", 5, 3) println  // 8
+calculate("*", 4, 7) println  // 28
+
+// Event handlers
+EventEmitter := Object clone
+EventEmitter init := method(
+    self events := Map clone
+    self
+)
+
+EventEmitter on := method(event, handler,
+    if(events hasKey(event) not,
+        events atPut(event, list())
+    )
+    events at(event) append(handler)
+    self
+)
+
+EventEmitter emit := method(event, data,
+    if(events hasKey(event),
+        events at(event) foreach(handler,
+            handler call(data)
+        )
+    )
+    self
+)
+
+// Usage
+emitter := EventEmitter clone init
+emitter on("click", block(data,
+    ("Clicked at: " .. data) println
+))
+emitter on("click", block(data,
+    ("Another handler: " .. data) println
+))
+
+emitter emit("click", "x=10, y=20")
+// Clicked at: x=10, y=20
+// Another handler: x=10, y=20

Control Flow with Blocks

Create custom control structures:

// Retry logic
+retry := method(times, block,
+    attempts := 0
+    loop(
+        attempts = attempts + 1
+        e := try(result := block call)
+        
+        if(e isNil, return result)
+        if(attempts >= times, Exception raise(e))
+        
+        ("Attempt " .. attempts .. " failed, retrying...") println
+    )
+)
+
+// Usage
+result := retry(3, block(
+    if(Random value < 0.7,
+        Exception raise("Random failure"),
+        "Success!"
+    )
+))
+
+// While with condition block
+whileTrue := method(conditionBlock, bodyBlock,
+    while(conditionBlock call, bodyBlock call)
+)
+
+i := 0
+whileTrue(
+    block(i < 5),
+    block(
+        i println
+        i = i + 1
+    )
+)

Performance Considerations

// Method vs Block performance
+obj := Object clone
+obj value := 10
+
+obj method1 := method(x, x + value)
+obj block1 := block(x, x + 10)
+
+// Methods are slightly faster for object operations
+time(100000 repeat(obj method1(5)))
+time(100000 repeat(obj block1 call(5)))
+
+// But blocks are better for functional patterns
+numbers := list(1, 2, 3, 4, 5)
+time(numbers map(x, x * 2))  // Using block syntax

Advanced Patterns

Continuation-Style Programming

// Continuation passing style
+factorial := method(n, continuation,
+    if(n <= 1,
+        continuation call(1),
+        factorial(n - 1, block(result,
+            continuation call(n * result)
+        ))
+    )
+)
+
+factorial(5, block(result, result println))  // 120

Monadic Patterns

// Maybe monad
+Maybe := Object clone
+Maybe Nothing := Maybe clone
+Maybe Just := method(value,
+    m := Maybe clone
+    m value := value
+    m isNothing := false
+    m
+)
+Maybe Nothing isNothing := true
+
+Maybe bind := method(f,
+    if(isNothing, Maybe Nothing, f call(value))
+)
+
+Maybe map := method(f,
+    if(isNothing, 
+        Maybe Nothing,
+        Maybe Just(f call(value))
+    )
+)
+
+// Usage
+result := Maybe Just(5) \
+    map(block(x, x * 2)) \
+    bind(block(x, 
+        if(x > 5, 
+            Maybe Just(x), 
+            Maybe Nothing)
+    )) \
+    map(block(x, x + 1))
+
+if(result isNothing not,
+    result value println  // 11
+)

Transducers

// Composable transformations
+mapping := method(f,
+    method(reducer,
+        block(acc, item,
+            reducer call(acc, f call(item))
+        )
+    )
+)
+
+filtering := method(pred,
+    method(reducer,
+        block(acc, item,
+            if(pred call(item),
+                reducer call(acc, item),
+                acc
+            )
+        )
+    )
+)
+
+// Compose transducers
+transduce := method(xform, reducer, init, coll,
+    xreducer := xform call(reducer)
+    coll foreach(item,
+        init = xreducer call(init, item)
+    )
+    init
+)
+
+// Usage
+xform := filtering(block(x, x % 2 == 0)) call(
+    mapping(block(x, x * 2))
+)
+
+result := transduce(xform, 
+    block(acc, x, acc + x),
+    0,
+    list(1, 2, 3, 4, 5, 6)
+)
+result println  // 24 (2*2 + 4*2 + 6*2)

Common Pitfalls

Variable Capture

// PROBLEM: Loop variable capture
+handlers := list()
+for(i, 1, 3,
+    handlers append(block(i println))
+)
+
+handlers foreach(h, h call)  // All print 3!
+
+// SOLUTION: Create new scope
+handlers := list()
+for(i, 1, 3,
+    handlers append(
+        method(n, block(n println)) call(i)
+    )
+)
+
+handlers foreach(h, h call)  // 1, 2, 3

Memory Leaks with Closures

// PROBLEM: Closure keeps large object alive
+makeClosure := method(
+    hugeData := List clone
+    10000 repeat(hugeData append(Random value))
+    
+    block(x, x * 2)  // Doesn't use hugeData but keeps it alive!
+)
+
+// SOLUTION: Be explicit about captured variables
+makeClosure := method(
+    hugeData := List clone
+    10000 repeat(hugeData append(Random value))
+    processedValue := hugeData size  // Extract what you need
+    hugeData = nil  // Release reference
+    
+    block(x, x * processedValue)
+)

Exercises

  1. Promise Implementation: Create a Promise/Future system using blocks for async operations.
  2. Stream Processing: Build a lazy stream processor with map, filter, and reduce.
  3. Function Decorator: Implement decorators for logging, timing, and caching.
  4. Parser Combinators: Create a simple parser combinator library using blocks.
  5. Reactive System: Build a simple FRP (Functional Reactive Programming) system.

Real-World Example: Pipeline Builder

Pipeline := Object clone
+Pipeline init := method(
+    self steps := list()
+    self
+)
+
+Pipeline add := method(step,
+    steps append(step)
+    self
+)
+
+Pipeline map := method(f,
+    self add(block(data,
+        data map(f)
+    ))
+)
+
+Pipeline filter := method(pred,
+    self add(block(data,
+        data select(pred)
+    ))
+)
+
+Pipeline tap := method(f,
+    self add(block(data,
+        f call(data)
+        data
+    ))
+)
+
+Pipeline run := method(input,
+    result := input
+    steps foreach(step,
+        result = step call(result)
+    )
+    result
+)
+
+// Usage
+pipeline := Pipeline clone init \
+    filter(block(x, x % 2 == 0)) \
+    map(block(x, x * x)) \
+    tap(block(data, ("After squaring: " .. data) println)) \
+    filter(block(x, x > 10)) \
+    map(block(x, x asString))
+
+result := pipeline run(list(1, 2, 3, 4, 5, 6))
+// After squaring: list(4, 16, 36)
+result println  // list("16", "36")

Conclusion

Blocks and closures are fundamental to Io's expressiveness. They're not just anonymous functions—they're first-class objects that capture context, enable functional programming, and allow you to extend the language with new control structures.

The distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io's scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement.

Understanding blocks deeply unlocks Io's full potential, enabling you to write code that's both powerful and elegant.

+ + + + diff --git a/website/content/docs/14-c-integration.md b/C-Integration/_index.md similarity index 99% rename from website/content/docs/14-c-integration.md rename to C-Integration/_index.md index 86cdf28..a91a3e5 100644 --- a/website/content/docs/14-c-integration.md +++ b/C-Integration/_index.md @@ -1,12 +1,10 @@ --- -title: "C Integration" -weight: 150 +title: C Integration +topTitle: Io +subtitle: "Embedding Io in C and extending Io with high-performance C addons." +nextSectionLink: true --- - - -# Chapter 14: C Integration - Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C. ## Understanding Io's C Architecture @@ -636,6 +634,3 @@ test: $(ADDON) C integration is one of Io's strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns. Whether you're optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io's C integration provides the tools you need while maintaining the simplicity and elegance of the language. - ---- - diff --git a/C-Integration/index.html b/C-Integration/index.html new file mode 100644 index 0000000..847db69 --- /dev/null +++ b/C-Integration/index.html @@ -0,0 +1,515 @@ + + + + + + +C Integration – Io + + + + +

Embedding Io in C and extending Io with high-performance C addons.

Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C.

Understanding Io's C Architecture

Io's core is a small C library (around 10,000 lines) that implements:

  • The object model (IoObject)
  • The message passing system
  • Basic types (Number, String, List, etc.)
  • The VM and garbage collector

Everything else is built on top of this foundation, either in C addons or pure Io.

Creating a Simple C Addon

Let's create a basic C addon that adds a method to calculate factorials:

// factorial.c
+#include "IoState.h"
+#include "IoObject.h"
+#include "IoNumber.h"
+
+IoObject *IoObject_factorial(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    // Get the number from the receiver
+    double n = IoNumber_asDouble(self);
+    
+    if (n < 0) {
+        IoState_error_(IOSTATE, m, "factorial of negative number");
+        return IONIL(self);
+    }
+    
+    double result = 1;
+    for (int i = 2; i <= n; i++) {
+        result *= i;
+    }
+    
+    return IoNumber_newWithDouble_(IOSTATE, result);
+}
+
+// Initialize the addon
+void IoFactorial_init(IoState *state)
+{
+    IoObject *self = IoState_lobby(state);
+    
+    // Add method to Number prototype
+    IoObject *number = IoState_protoWithName_(state, "Number");
+    IoObject_addMethod_(number, 
+        IOSYMBOL("factorial"), 
+        IoObject_factorial);
+}

To compile and use:

# Compile as shared library
+gcc -shared -fPIC -o factorial.so factorial.c -lIo
+
+# In Io
+DynLib load("./factorial.so")
+5 factorial println  // 120

Working with Io Objects in C

// Creating Io objects from C
+IoObject *IoAddon_createObject(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    IoState *state = IOSTATE;
+    
+    // Create different types
+    IoObject *num = IoNumber_newWithDouble_(state, 42.0);
+    IoObject *str = IoSeq_newWithCString_(state, "Hello from C");
+    IoObject *list = IoList_new(state);
+    
+    // Add items to list
+    IoList_append_(list, num);
+    IoList_append_(list, str);
+    
+    // Create a new object with slots
+    IoObject *obj = IoObject_new(state);
+    IoObject_setSlot_to_(obj, IOSYMBOL("x"), num);
+    IoObject_setSlot_to_(obj, IOSYMBOL("message"), str);
+    IoObject_setSlot_to_(obj, IOSYMBOL("items"), list);
+    
+    return obj;
+}
+
+// Accessing Io objects from C
+IoObject *IoAddon_processObject(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    // Get the first argument
+    IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, 0);
+    
+    // Check type
+    if (ISSEQ(arg)) {
+        char *cstr = IoSeq_asCString(arg);
+        printf("String argument: %s\n", cstr);
+    }
+    else if (ISNUMBER(arg)) {
+        double num = IoNumber_asDouble(arg);
+        printf("Number argument: %f\n", num);
+    }
+    else if (ISLIST(arg)) {
+        size_t size = IoList_size(arg);
+        printf("List with %zu items\n", size);
+    }
+    
+    return self;
+}

Creating Custom Types

// customtype.c - Define a Point type
+#include "IoState.h"
+#include "IoObject.h"
+#include "IoNumber.h"
+
+// Define the type structure
+typedef struct {
+    IoObject obj;  // Must be first
+    double x;
+    double y;
+} IoPoint;
+
+// Type tag
+IoTag *IoPoint_tag(void)
+{
+    static IoTag *tag = NULL;
+    if (!tag) {
+        tag = IoTag_newWithName_("Point");
+    }
+    return tag;
+}
+
+// Constructor
+IoPoint *IoPoint_new(IoState *state, double x, double y)
+{
+    IoPoint *self = IoObject_new(state);
+    IoObject_tag_(self, IoPoint_tag());
+    
+    self->x = x;
+    self->y = y;
+    
+    return self;
+}
+
+// Methods
+IoObject *IoPoint_x(IoPoint *self, IoObject *locals, IoMessage *m)
+{
+    return IoNumber_newWithDouble_(IOSTATE, self->x);
+}
+
+IoObject *IoPoint_y(IoPoint *self, IoObject *locals, IoMessage *m)
+{
+    return IoNumber_newWithDouble_(IOSTATE, self->y);
+}
+
+IoObject *IoPoint_distance(IoPoint *self, IoObject *locals, IoMessage *m)
+{
+    IoPoint *other = IoMessage_locals_valueArgAt_(m, locals, 0);
+    
+    if (IoObject_tag(other) != IoPoint_tag()) {
+        IoState_error_(IOSTATE, m, "argument must be a Point");
+        return IONIL(self);
+    }
+    
+    double dx = self->x - other->x;
+    double dy = self->y - other->y;
+    double distance = sqrt(dx*dx + dy*dy);
+    
+    return IoNumber_newWithDouble_(IOSTATE, distance);
+}
+
+// Initialize the type
+void IoPoint_init(IoState *state)
+{
+    IoObject *self = IoState_lobby(state);
+    
+    // Create prototype
+    IoPoint *proto = IoPoint_new(state, 0, 0);
+    IoState_registerProtoWithName_(state, proto, "Point");
+    
+    // Add methods
+    IoObject_addMethod_(proto, IOSYMBOL("x"), IoPoint_x);
+    IoObject_addMethod_(proto, IOSYMBOL("y"), IoPoint_y);
+    IoObject_addMethod_(proto, IOSYMBOL("distance"), IoPoint_distance);
+}

Calling Io from C

// Evaluate Io code from C
+IoObject *result = IoState_doString_(state, "1 + 2 * 3");
+double value = IoNumber_asDouble(result);
+printf("Result: %f\n", value);  // 7.0
+
+// Call Io methods from C
+IoObject *obj = IoState_doString_(state, "Object clone");
+IoObject *method = IoObject_getSlot_(obj, IOSYMBOL("type"));
+IoObject *result = IoObject_activate(method, obj, locals, m, NULL);
+char *type = IoSeq_asCString(result);
+printf("Type: %s\n", type);  // Object
+
+// Send messages
+IoMessage *msg = IoMessage_newWithName_(state, IOSYMBOL("println"));
+IoMessage_setCachedResult_(msg, NULL);
+IoObject *result = IoObject_perform(obj, locals, msg);

Memory Management

Io uses a garbage collector, but when interfacing with C, you need to be careful:

// Protecting objects from GC
+IoObject *IoAddon_keepAlive(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    IoState *state = IOSTATE;
+    
+    // Create object that needs to survive GC
+    IoObject *important = IoObject_new(state);
+    
+    // Add reference from a persistent object
+    IoObject_setSlot_to_(IoState_lobby(state), 
+        IOSYMBOL("_keepAlive"), important);
+    
+    // Or use IoState_retain/release
+    IoState_retain_(state, important);
+    
+    // Do work...
+    
+    // Release when done
+    IoState_release_(state, important);
+    
+    return important;
+}
+
+// Managing C memory
+typedef struct {
+    IoObject obj;
+    void *cdata;
+} IoCWrapper;
+
+void IoCWrapper_free(IoCWrapper *self)
+{
+    if (self->cdata) {
+        free(self->cdata);
+        self->cdata = NULL;
+    }
+}
+
+// Set up finalizer
+IoTag *tag = IoTag_newWithName_("CWrapper");
+IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCWrapper_free);

Wrapping C Libraries

Example: Wrapping a simple math library:

// mathlib_wrapper.c
+#include <math.h>
+#include "IoState.h"
+#include "IoObject.h"
+#include "IoNumber.h"
+#include "IoList.h"
+
+// Wrap sin function
+IoObject *IoMath_sin(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    double x = IoMessage_locals_doubleArgAt_(m, locals, 0);
+    return IoNumber_newWithDouble_(IOSTATE, sin(x));
+}
+
+// Wrap complex function
+IoObject *IoMath_stats(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    IoList *list = IoMessage_locals_listArgAt_(m, locals, 0);
+    size_t count = IoList_size(list);
+    
+    if (count == 0) {
+        return IoList_new(IOSTATE);
+    }
+    
+    double sum = 0, min = INFINITY, max = -INFINITY;
+    
+    for (size_t i = 0; i < count; i++) {
+        IoObject *item = IoList_at_(list, i);
+        double value = IoNumber_asDouble(item);
+        
+        sum += value;
+        if (value < min) min = value;
+        if (value > max) max = value;
+    }
+    
+    double mean = sum / count;
+    
+    // Return statistics as list
+    IoList *result = IoList_new(IOSTATE);
+    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, mean));
+    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, min));
+    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, max));
+    
+    return result;
+}
+
+void IoMathLib_init(IoState *state)
+{
+    IoObject *math = IoObject_new(state);
+    IoState_registerProtoWithName_(state, math, "Math");
+    
+    IoObject_addMethod_(math, IOSYMBOL("sin"), IoMath_sin);
+    IoObject_addMethod_(math, IOSYMBOL("stats"), IoMath_stats);
+}

Usage in Io:

DynLib load("./mathlib.so")
+
+Math sin(3.14159 / 2) println  // 1.0
+
+stats := Math stats(list(1, 2, 3, 4, 5))
+"Mean: " .. stats at(0) println  // Mean: 3
+"Min: " .. stats at(1) println   // Min: 1
+"Max: " .. stats at(2) println   // Max: 5

Embedding Io in C Applications

// embed_io.c - Embedding Io in a C application
+#include <stdio.h>
+#include "IoState.h"
+#include "IoObject.h"
+#include "IoSeq.h"
+
+// Custom function exposed to Io
+IoObject *App_log(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    char *msg = IoMessage_locals_cStringArgAt_(m, locals, 0);
+    printf("[APP LOG] %s\n", msg);
+    return self;
+}
+
+int main(int argc, char *argv[])
+{
+    // Initialize Io
+    IoState *state = IoState_new();
+    IoState_init(state);
+    
+    // Add custom functions
+    IoObject *lobby = IoState_lobby(state);
+    IoObject *app = IoObject_new(state);
+    IoState_registerProtoWithName_(state, app, "App");
+    IoObject_addMethod_(app, IOSYMBOL("log"), App_log);
+    
+    // Load and run Io script
+    IoState_doFile_(state, "script.io");
+    
+    // Interact with Io objects
+    IoObject *result = IoState_doString_(state, 
+        "x := 10; y := 20; x + y");
+    printf("Result from Io: %f\n", IoNumber_asDouble(result));
+    
+    // Clean up
+    IoState_free(state);
+    
+    return 0;
+}

The Io script (script.io):

App log("Hello from Io!")
+
+// Define functions for C to call
+calculate := method(a, b,
+    App log("Calculating in Io")
+    a * b + 100
+)

Performance Optimization

// Optimized array operations
+IoObject *IoArray_sum(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    // Get underlying C array for performance
+    UArray *array = IoSeq_rawUArray(self);
+    size_t size = UArray_size(array);
+    uint8_t *data = UArray_bytes(array);
+    int itemSize = UArray_itemSize(array);
+    
+    double sum = 0;
+    
+    // Fast path for different types
+    if (itemSize == sizeof(double)) {
+        double *doubles = (double *)data;
+        for (size_t i = 0; i < size; i++) {
+            sum += doubles[i];
+        }
+    }
+    else if (itemSize == sizeof(float)) {
+        float *floats = (float *)data;
+        for (size_t i = 0; i < size; i++) {
+            sum += floats[i];
+        }
+    }
+    
+    return IoNumber_newWithDouble_(IOSTATE, sum);
+}
+
+// Batch operations
+IoObject *IoMatrix_multiply(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    IoObject *other = IoMessage_locals_valueArgAt_(m, locals, 0);
+    
+    // Get dimensions
+    int rows1 = IoMessage_locals_intArgAt_(m, locals, 1);
+    int cols1 = IoMessage_locals_intArgAt_(m, locals, 2);
+    int cols2 = IoMessage_locals_intArgAt_(m, locals, 3);
+    
+    // Get raw data pointers
+    double *data1 = (double *)IoSeq_rawBytes(self);
+    double *data2 = (double *)IoSeq_rawBytes(other);
+    
+    // Allocate result
+    IoSeq *result = IoSeq_newWithData_length_(IOSTATE, 
+        NULL, rows1 * cols2 * sizeof(double));
+    double *resultData = (double *)IoSeq_rawBytes(result);
+    
+    // Optimized matrix multiplication
+    for (int i = 0; i < rows1; i++) {
+        for (int j = 0; j < cols2; j++) {
+            double sum = 0;
+            for (int k = 0; k < cols1; k++) {
+                sum += data1[i * cols1 + k] * data2[k * cols2 + j];
+            }
+            resultData[i * cols2 + j] = sum;
+        }
+    }
+    
+    return result;
+}

Debugging C Addons

// Debug helpers
+#define IO_DEBUG 1
+
+#ifdef IO_DEBUG
+    #define DEBUG_PRINT(fmt, ...) \
+        fprintf(stderr, "DEBUG: " fmt "\n", ##__VA_ARGS__)
+#else
+    #define DEBUG_PRINT(fmt, ...)
+#endif
+
+IoObject *IoDebug_function(IoObject *self, IoObject *locals, IoMessage *m)
+{
+    DEBUG_PRINT("Function called with %d arguments", 
+        IoMessage_argCount(m));
+    
+    // Print argument types
+    for (int i = 0; i < IoMessage_argCount(m); i++) {
+        IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, i);
+        DEBUG_PRINT("  Arg %d: %s", i, IoObject_name(arg));
+    }
+    
+    // Check for memory issues
+    IoState *state = IOSTATE;
+    IoState_check(state);
+    
+    return self;
+}

Common Integration Patterns

Callback Pattern

// Store Io blocks as callbacks
+typedef struct {
+    IoObject obj;
+    IoObject *callback;
+} IoCallbackWrapper;
+
+IoObject *IoWrapper_setCallback(IoCallbackWrapper *self, 
+    IoObject *locals, IoMessage *m)
+{
+    IoObject *block = IoMessage_locals_valueArgAt_(m, locals, 0);
+    
+    // Retain the block
+    IoState_retain_(IOSTATE, block);
+    if (self->callback) {
+        IoState_release_(IOSTATE, self->callback);
+    }
+    self->callback = block;
+    
+    return self;
+}
+
+// Call the Io callback from C
+void triggerCallback(IoCallbackWrapper *wrapper, double value)
+{
+    if (wrapper->callback) {
+        IoObject *arg = IoNumber_newWithDouble_(IOSTATE, value);
+        IoObject_perform(wrapper->callback, wrapper, 
+            IoMessage_newWithName_label_(IOSTATE, 
+                IOSYMBOL("call"), arg));
+    }
+}

Event System

// Event emitter in C
+typedef struct {
+    IoObject obj;
+    IoMap *handlers;  // Event name -> List of handlers
+} IoEventEmitter;
+
+IoObject *IoEventEmitter_on(IoEventEmitter *self, 
+    IoObject *locals, IoMessage *m)
+{
+    IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0);
+    IoObject *handler = IoMessage_locals_valueArgAt_(m, locals, 1);
+    
+    IoList *handlers = IoMap_at_(self->handlers, event);
+    if (!handlers) {
+        handlers = IoList_new(IOSTATE);
+        IoMap_atPut_(self->handlers, event, handlers);
+    }
+    
+    IoList_append_(handlers, handler);
+    return self;
+}
+
+IoObject *IoEventEmitter_emit(IoEventEmitter *self, 
+    IoObject *locals, IoMessage *m)
+{
+    IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0);
+    IoList *handlers = IoMap_at_(self->handlers, event);
+    
+    if (handlers) {
+        size_t count = IoList_size(handlers);
+        for (size_t i = 0; i < count; i++) {
+            IoObject *handler = IoList_at_(handlers, i);
+            
+            // Pass remaining arguments to handler
+            IoMessage *msg = IoMessage_newWithName_(IOSTATE, 
+                IOSYMBOL("call"));
+            for (int j = 1; j < IoMessage_argCount(m); j++) {
+                IoMessage_addArg_(msg, IoMessage_argAt_(m, j));
+            }
+            
+            IoObject_perform(handler, locals, msg);
+        }
+    }
+    
+    return self;
+}

Build System Integration

Makefile for Io addon:

# Makefile for Io addon
+CC = gcc
+CFLAGS = -shared -fPIC -Wall -O2
+INCLUDES = -I$(IO_HOME)/include
+LIBS = -L$(IO_HOME)/lib -lIo
+
+ADDON = myaddon.so
+SOURCES = myaddon.c utils.c
+OBJECTS = $(SOURCES:.c=.o)
+
+all: $(ADDON)
+
+$(ADDON): $(OBJECTS)
+    $(CC) $(CFLAGS) -o $@ $^ $(LIBS)
+
+%.o: %.c
+    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+clean:
+    rm -f $(OBJECTS) $(ADDON)
+
+install: $(ADDON)
+    cp $(ADDON) $(IO_HOME)/addons/
+
+test: $(ADDON)
+    io test_addon.io

Exercises

  1. SQLite Wrapper: Create a complete SQLite wrapper for Io.
  2. Graphics Library: Wrap SDL or Cairo for graphics programming.
  3. Network Addon: Implement high-performance networking primitives.
  4. Crypto Library: Wrap OpenSSL for cryptographic operations.
  5. Scientific Computing: Create bindings for BLAS/LAPACK.

Conclusion

C integration is one of Io's strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns.

Whether you're optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io's C integration provides the tools you need while maintaining the simplicity and elegance of the language.

+ + + + diff --git a/website/content/docs/16-case-studies.md b/Case-Studies/_index.md similarity index 99% rename from website/content/docs/16-case-studies.md rename to Case-Studies/_index.md index f0e318b..4fc00d3 100644 --- a/website/content/docs/16-case-studies.md +++ b/Case-Studies/_index.md @@ -1,12 +1,10 @@ --- -title: "Case Studies" -weight: 170 +title: Case Studies +topTitle: Io +subtitle: "Complete Io programs that bring the language's features together." +nextSectionLink: true --- - - -# Chapter 16: Case Studies - This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io's features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language. ## Case Study 1: Web Server @@ -1243,6 +1241,3 @@ These case studies demonstrate several key insights about building real applicat ## Conclusion These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value. - ---- - diff --git a/Case-Studies/index.html b/Case-Studies/index.html new file mode 100644 index 0000000..efe0f82 --- /dev/null +++ b/Case-Studies/index.html @@ -0,0 +1,1181 @@ + + + + + + +Case Studies – Io + + + + +

Complete Io programs that bring the language's features together.

This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io's features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language.

Case Study 1: Web Server

Building a simple but functional HTTP server demonstrates Io's networking, concurrency, and string handling:

// HTTP Server Implementation
+HttpServer := Object clone
+HttpServer init := method(port,
+    self port := port
+    self routes := Map clone
+    self middlewares := list()
+    self
+)
+
+HttpRequest := Object clone
+HttpRequest parse := method(rawData,
+    lines := rawData split("\r\n")
+    if(lines size == 0, return nil)
+    
+    // Parse request line
+    requestLine := lines at(0) split(" ")
+    self method := requestLine at(0)
+    self path := requestLine at(1)
+    self version := requestLine at(2)
+    
+    // Parse headers
+    self headers := Map clone
+    self body := ""
+    
+    bodyStart := false
+    lines slice(1) foreach(line,
+        if(bodyStart,
+            body = body .. line,
+            if(line size == 0,
+                bodyStart = true,
+                parts := line split(": ")
+                if(parts size == 2,
+                    headers atPut(parts at(0), parts at(1))
+                )
+            )
+        )
+    )
+    
+    // Parse query parameters
+    self params := Map clone
+    if(path containsSeq("?"),
+        parts := path split("?")
+        self path = parts at(0)
+        queryString := parts at(1)
+        
+        queryString split("&") foreach(param,
+            kv := param split("=")
+            if(kv size == 2,
+                params atPut(kv at(0), kv at(1) urlDecode)
+            )
+        )
+    )
+    
+    self
+)
+
+HttpResponse := Object clone
+HttpResponse init := method(
+    self status := 200
+    self headers := Map clone
+    self body := ""
+    
+    headers atPut("Content-Type", "text/html")
+    headers atPut("Server", "Io-Server/1.0")
+    self
+)
+
+HttpResponse setStatus := method(code,
+    status = code
+    self
+)
+
+HttpResponse setHeader := method(key, value,
+    headers atPut(key, value)
+    self
+)
+
+HttpResponse write := method(content,
+    body = body .. content
+    self
+)
+
+HttpResponse json := method(data,
+    setHeader("Content-Type", "application/json")
+    write(data asJson)
+    self
+)
+
+HttpResponse build := method(
+    statusText := Map with(
+        200, "OK",
+        404, "Not Found",
+        500, "Internal Server Error"
+    ) at(status, "Unknown")
+    
+    result := "HTTP/1.1 " .. status .. " " .. statusText .. "\r\n"
+    
+    headers atPut("Content-Length", body size asString)
+    headers foreach(key, value,
+        result = result .. key .. ": " .. value .. "\r\n"
+    )
+    
+    result .. "\r\n" .. body
+)
+
+// Middleware support
+HttpServer use := method(middleware,
+    middlewares append(middleware)
+    self
+)
+
+// Routing
+HttpServer route := method(method, path, handler,
+    key := method .. ":" .. path
+    routes atPut(key, handler)
+    self
+)
+
+HttpServer get := method(path, handler,
+    route("GET", path, handler)
+)
+
+HttpServer post := method(path, handler,
+    route("POST", path, handler)
+)
+
+// Request handling
+HttpServer handleConnection := method(socket,
+    rawData := socket readUntilSeq("\r\n\r\n")
+    
+    request := HttpRequest parse(rawData)
+    if(request isNil,
+        socket close
+        return
+    )
+    
+    response := HttpResponse clone init
+    
+    // Run middlewares
+    middlewares foreach(middleware,
+        middleware call(request, response)
+    )
+    
+    // Find route
+    key := request method .. ":" .. request path
+    handler := routes at(key)
+    
+    if(handler,
+        e := try(
+            handler call(request, response)
+        ) catch(Exception, e,
+            response setStatus(500) write("Internal Server Error: " .. e message)
+        )
+    ,
+        // Try pattern matching for dynamic routes
+        handled := false
+        routes foreach(routeKey, routeHandler,
+            parts := routeKey split(":")
+            routeMethod := parts at(0)
+            routePath := parts at(1)
+            
+            if(routeMethod == request method and matchPath(routePath, request path),
+                routeHandler call(request, response)
+                handled = true
+                break
+            )
+        )
+        
+        if(handled not,
+            response setStatus(404) write("Not Found")
+        )
+    )
+    
+    socket write(response build)
+    socket close
+)
+
+HttpServer matchPath := method(pattern, path,
+    // Simple pattern matching (e.g., /users/:id)
+    if(pattern containsSeq(":"),
+        patternParts := pattern split("/")
+        pathParts := path split("/")
+        
+        if(patternParts size != pathParts size, return false)
+        
+        patternParts foreach(i, part,
+            if(part beginsWithSeq(":") not,
+                if(part != pathParts at(i), return false)
+            )
+        )
+        
+        true
+    ,
+        pattern == path
+    )
+)
+
+HttpServer start := method(
+    server := Socket clone
+    server setHost("127.0.0.1")
+    server setPort(port)
+    server bind
+    server listen
+    
+    ("Server listening on port " .. port) println
+    
+    loop(
+        client := server accept
+        @handleConnection(client)  // Handle async
+    )
+)
+
+// Example application
+app := HttpServer clone init(8080)
+
+// Middleware for logging
+app use(block(request, response,
+    ("[" .. Date now .. "] " .. request method .. " " .. request path) println
+))
+
+// Static content
+app get("/", block(request, response,
+    response write("<h1>Welcome to Io Web Server</h1>")
+    response write("<p>A simple server built with Io</p>")
+))
+
+// JSON API
+app get("/api/info", block(request, response,
+    info := Map with(
+        "server", "Io-Server",
+        "version", "1.0",
+        "time", Date now asString
+    )
+    response json(info)
+))
+
+// Dynamic routes
+app get("/users/:id", block(request, response,
+    // Extract ID from path
+    id := request path split("/") at(2)
+    response write("<h1>User Profile</h1>")
+    response write("<p>User ID: " .. id .. "</p>")
+))
+
+// Form handling
+app post("/submit", block(request, response,
+    // Parse form data from body
+    response write("<h1>Form Submitted</h1>")
+    response write("<p>Data: " .. request body .. "</p>")
+))
+
+// Start server
+app start

Case Study 2: Database ORM

A simple object-relational mapper showcasing metaprogramming and DSL capabilities:

// ORM Implementation
+ORM := Object clone
+
+// Database connection (simplified)
+Database := Object clone
+Database connections := Map clone
+
+Database connect := method(name, config,
+    conn := Connection clone init(config)
+    connections atPut(name, conn)
+    conn
+)
+
+Connection := Object clone
+Connection init := method(config,
+    self config := config
+    self tables := Map clone
+    self
+)
+
+Connection execute := method(sql,
+    ("[SQL] " .. sql) println
+    // Simulate results
+    list()
+)
+
+// Model base class
+Model := Object clone
+Model tableName := nil
+Model fields := Map clone
+Model connection := nil
+
+Model field := method(name, type,
+    fields atPut(name, Map with("type", type, "name", name))
+    
+    // Generate getter
+    self setSlot(name, method(
+        self getSlot("_" .. name)
+    ))
+    
+    // Generate setter
+    self setSlot("set" .. name asCapitalized, method(value,
+        self setSlot("_" .. name, value)
+        self
+    ))
+    
+    self
+)
+
+Model belongsTo := method(name, targetModel,
+    fields atPut(name .. "_id", Map with("type", "INTEGER", "name", name .. "_id"))
+    
+    self setSlot(name, method(
+        targetModel findById(self getSlot("_" .. name .. "_id"))
+    ))
+    
+    self
+)
+
+Model hasMany := method(name, targetModel, foreignKey,
+    self setSlot(name, method(
+        targetModel where(foreignKey .. " = " .. self id)
+    ))
+    
+    self
+)
+
+Model createTable := method(
+    sql := "CREATE TABLE IF NOT EXISTS " .. tableName .. " (\n"
+    sql = sql .. "  id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
+    
+    fieldDefs := fields map(name, field,
+        "  " .. name .. " " .. field at("type")
+    )
+    
+    sql = sql .. fieldDefs join(",\n") .. "\n);"
+    
+    connection execute(sql)
+    self
+)
+
+Model dropTable := method(
+    connection execute("DROP TABLE IF EXISTS " .. tableName)
+    self
+)
+
+Model init := method(
+    fields foreach(name, field,
+        self setSlot("_" .. name, nil)
+    )
+    self setSlot("_id", nil)
+    self
+)
+
+Model save := method(
+    if(_id,
+        update,
+        insert
+    )
+)
+
+Model insert := method(
+    columns := list()
+    values := list()
+    
+    fields foreach(name, field,
+        value := self getSlot("_" .. name)
+        if(value isNil not,
+            columns append(name)
+            values append("'" .. value asString .. "'")
+        )
+    )
+    
+    sql := "INSERT INTO " .. tableName .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")"
+    
+    connection execute(sql)
+    self _id := connection lastInsertId  // Simulated
+    self
+)
+
+Model update := method(
+    updates := list()
+    
+    fields foreach(name, field,
+        value := self getSlot("_" .. name)
+        if(value isNil not,
+            updates append(name .. " = '" .. value asString .. "'")
+        )
+    )
+    
+    sql := "UPDATE " .. tableName .. " SET " .. updates join(", ") .. " WHERE id = " .. _id
+    
+    connection execute(sql)
+    self
+)
+
+Model delete := method(
+    if(_id,
+        connection execute("DELETE FROM " .. tableName .. " WHERE id = " .. _id)
+        self _id := nil
+    )
+    self
+)
+
+// Class methods
+Model all := method(
+    sql := "SELECT * FROM " .. tableName
+    rows := connection execute(sql)
+    
+    rows map(row, fromRow(row))
+)
+
+Model findById := method(id,
+    sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id
+    rows := connection execute(sql)
+    
+    if(rows size > 0,
+        fromRow(rows first),
+        nil
+    )
+)
+
+Model where := method(condition,
+    sql := "SELECT * FROM " .. tableName .. " WHERE " .. condition
+    rows := connection execute(sql)
+    
+    rows map(row, fromRow(row))
+)
+
+Model fromRow := method(row,
+    instance := self clone init
+    instance _id := row at("id")
+    
+    fields foreach(name, field,
+        instance setSlot("_" .. name, row at(name))
+    )
+    
+    instance
+)
+
+// Query builder
+QueryBuilder := Object clone
+QueryBuilder init := method(model,
+    self model := model
+    self selections := list("*")
+    self conditions := list()
+    self orderBy := nil
+    self limitValue := nil
+    self
+)
+
+QueryBuilder select := method(
+    self selections = call message arguments map(arg,
+        call sender doMessage(arg) asString
+    )
+    self
+)
+
+QueryBuilder where := method(condition,
+    conditions append(condition)
+    self
+)
+
+QueryBuilder order := method(column, direction,
+    orderBy = column .. " " .. if(direction, direction, "ASC")
+    self
+)
+
+QueryBuilder limit := method(n,
+    limitValue = n
+    self
+)
+
+QueryBuilder build := method(
+    sql := "SELECT " .. selections join(", ") .. " FROM " .. model tableName
+    
+    if(conditions size > 0,
+        sql = sql .. " WHERE " .. conditions join(" AND ")
+    )
+    
+    if(orderBy,
+        sql = sql .. " ORDER BY " .. orderBy
+    )
+    
+    if(limitValue,
+        sql = sql .. " LIMIT " .. limitValue
+    )
+    
+    sql
+)
+
+QueryBuilder execute := method(
+    sql := build
+    rows := model connection execute(sql)
+    rows map(row, model fromRow(row))
+)
+
+// Define models
+User := Model clone
+User tableName = "users"
+User connection = Database connect("main", Map with("file", "app.db"))
+
+User field("name", "VARCHAR(100)") \
+    field("email", "VARCHAR(100)") \
+    field("age", "INTEGER") \
+    field("created_at", "DATETIME")
+
+User hasMany("posts", Post, "user_id")
+
+Post := Model clone
+Post tableName = "posts"
+Post connection = User connection
+
+Post field("title", "VARCHAR(200)") \
+    field("content", "TEXT") \
+    field("published", "BOOLEAN") \
+    field("user_id", "INTEGER")
+
+Post belongsTo("user", User)
+
+// Validations
+User validate := method(
+    errors := list()
+    
+    if(_name isNil or _name size == 0,
+        errors append("Name is required")
+    )
+    
+    if(_email isNil or _email containsSeq("@") not,
+        errors append("Invalid email")
+    )
+    
+    if(_age and (_age < 0 or _age > 150),
+        errors append("Invalid age")
+    )
+    
+    if(errors size > 0,
+        Exception raise(errors join(", "))
+    )
+    
+    true
+)
+
+User beforeSave := method(
+    validate
+    _created_at := Date now
+)
+
+// Usage example
+User createTable
+Post createTable
+
+user := User clone init
+user setName("Alice") setEmail("alice@example.com") setAge(30)
+user save
+
+post := Post clone init
+post setTitle("First Post") \
+    setContent("Hello, World!") \
+    setPublished(true) \
+    setUserId(user id)
+post save
+
+// Query examples
+allUsers := User all
+youngUsers := User where("age < 25")
+userPosts := user posts
+
+// Query builder
+query := QueryBuilder clone init(User)
+results := query select("name", "email") \
+                where("age > 21") \
+                order("name") \
+                limit(10) \
+                execute

Case Study 3: Game Engine

A simple 2D game engine demonstrating real-time systems and graphics:

// Game Engine Core
+GameEngine := Object clone
+GameEngine init := method(width, height,
+    self width := width
+    self height := height
+    self entities := list()
+    self systems := list()
+    self running := true
+    self fps := 60
+    self frameTime := 1.0 / fps
+    self
+)
+
+// Entity Component System
+Entity := Object clone
+Entity init := method(
+    self id := Random uuid
+    self components := Map clone
+    self active := true
+    self
+)
+
+Entity addComponent := method(name, component,
+    components atPut(name, component)
+    component entity := self
+    self
+)
+
+Entity getComponent := method(name,
+    components at(name)
+)
+
+Entity hasComponent := method(name,
+    components hasKey(name)
+)
+
+// Components
+Component := Object clone
+
+PositionComponent := Component clone
+PositionComponent init := method(x, y,
+    self x := x
+    self y := y
+    self
+)
+
+VelocityComponent := Component clone
+VelocityComponent init := method(dx, dy,
+    self dx := dx
+    self dy := dy
+    self
+)
+
+SpriteComponent := Component clone
+SpriteComponent init := method(image, width, height,
+    self image := image
+    self width := width
+    self height := height
+    self
+)
+
+ColliderComponent := Component clone
+ColliderComponent init := method(width, height,
+    self width := width
+    self height := height
+    self
+)
+
+HealthComponent := Component clone
+HealthComponent init := method(maxHealth,
+    self maxHealth := maxHealth
+    self currentHealth := maxHealth
+    self
+)
+
+// Systems
+System := Object clone
+System init := method(
+    self requiredComponents := list()
+    self
+)
+
+System process := method(entity, deltaTime,
+    // Override in subclasses
+)
+
+System canProcess := method(entity,
+    requiredComponents all(comp,
+        entity hasComponent(comp)
+    )
+)
+
+MovementSystem := System clone
+MovementSystem requiredComponents = list("position", "velocity")
+
+MovementSystem process := method(entity, deltaTime,
+    pos := entity getComponent("position")
+    vel := entity getComponent("velocity")
+    
+    pos x = pos x + vel dx * deltaTime
+    pos y = pos y + vel dy * deltaTime
+)
+
+CollisionSystem := System clone
+CollisionSystem requiredComponents = list("position", "collider")
+
+CollisionSystem init := method(
+    resend
+    self collisions := list()
+    self
+)
+
+CollisionSystem update := method(entities, deltaTime,
+    collisions = list()
+    
+    // Check all pairs
+    entities foreach(i, e1,
+        if(canProcess(e1),
+            entities slice(i + 1) foreach(e2,
+                if(canProcess(e2) and checkCollision(e1, e2),
+                    collisions append(list(e1, e2))
+                    onCollision(e1, e2)
+                )
+            )
+        )
+    )
+)
+
+CollisionSystem checkCollision := method(e1, e2,
+    p1 := e1 getComponent("position")
+    c1 := e1 getComponent("collider")
+    p2 := e2 getComponent("position")
+    c2 := e2 getComponent("collider")
+    
+    // AABB collision
+    p1 x < p2 x + c2 width and
+    p1 x + c1 width > p2 x and
+    p1 y < p2 y + c2 height and
+    p1 y + c1 height > p2 y
+)
+
+CollisionSystem onCollision := method(e1, e2,
+    ("Collision between " .. e1 id .. " and " .. e2 id) println
+)
+
+// Rendering (simulated)
+RenderSystem := System clone
+RenderSystem requiredComponents = list("position", "sprite")
+
+RenderSystem init := method(
+    resend
+    self screen := list()
+    self
+)
+
+RenderSystem render := method(entities,
+    // Clear screen
+    screen = list()
+    
+    entities foreach(entity,
+        if(canProcess(entity),
+            pos := entity getComponent("position")
+            sprite := entity getComponent("sprite")
+            
+            screen append(Map with(
+                "x", pos x,
+                "y", pos y,
+                "image", sprite image
+            ))
+        )
+    )
+    
+    // Draw screen (simulated)
+    drawScreen
+)
+
+RenderSystem drawScreen := method(
+    "Frame:" println
+    screen foreach(item,
+        ("  [" .. item at("image") .. "] at (" .. 
+         item at("x") round .. ", " .. item at("y") round .. ")") println
+    )
+)
+
+// Input handling
+InputManager := Object clone
+InputManager init := method(
+    self keys := Map clone
+    self mouseX := 0
+    self mouseY := 0
+    self
+)
+
+InputManager isKeyPressed := method(key,
+    keys at(key, false)
+)
+
+InputManager setKey := method(key, pressed,
+    keys atPut(key, pressed)
+)
+
+// Game states
+GameState := Object clone
+GameState enter := method()
+GameState exit := method()
+GameState update := method(deltaTime)
+GameState render := method()
+
+MenuState := GameState clone
+MenuState enter := method(
+    "Entering menu" println
+    self selectedOption := 0
+    self options := list("Start Game", "Options", "Quit")
+)
+
+MenuState update := method(deltaTime,
+    // Handle menu input
+    if(InputManager isKeyPressed("up"),
+        selectedOption = (selectedOption - 1) max(0)
+    )
+    if(InputManager isKeyPressed("down"),
+        selectedOption = (selectedOption + 1) min(options size - 1)
+    )
+    if(InputManager isKeyPressed("enter"),
+        handleSelection
+    )
+)
+
+MenuState handleSelection := method(
+    option := options at(selectedOption)
+    if(option == "Start Game",
+        GameEngine setState(PlayState)
+    )
+    if(option == "Quit",
+        GameEngine stop
+    )
+)
+
+PlayState := GameState clone
+PlayState enter := method(
+    "Starting game" println
+    createLevel
+)
+
+PlayState createLevel := method(
+    // Create player
+    player := Entity clone init
+    player addComponent("position", PositionComponent clone init(100, 100))
+    player addComponent("velocity", VelocityComponent clone init(0, 0))
+    player addComponent("sprite", SpriteComponent clone init("player", 32, 32))
+    player addComponent("collider", ColliderComponent clone init(32, 32))
+    player addComponent("health", HealthComponent clone init(100))
+    
+    GameEngine addEntity(player)
+    
+    // Create enemies
+    3 repeat(i,
+        enemy := Entity clone init
+        enemy addComponent("position", 
+            PositionComponent clone init(200 + i * 50, 200))
+        enemy addComponent("velocity", 
+            VelocityComponent clone init(Random value * 20 - 10, Random value * 20 - 10))
+        enemy addComponent("sprite", 
+            SpriteComponent clone init("enemy", 24, 24))
+        enemy addComponent("collider", 
+            ColliderComponent clone init(24, 24))
+        
+        GameEngine addEntity(enemy)
+    )
+)
+
+PlayState update := method(deltaTime,
+    // Handle player input
+    player := GameEngine entities first
+    if(player,
+        vel := player getComponent("velocity")
+        
+        vel dx = 0
+        vel dy = 0
+        
+        if(InputManager isKeyPressed("left"), vel dx = -100)
+        if(InputManager isKeyPressed("right"), vel dx = 100)
+        if(InputManager isKeyPressed("up"), vel dy = -100)
+        if(InputManager isKeyPressed("down"), vel dy = 100)
+    )
+)
+
+// Main game engine methods
+GameEngine addEntity := method(entity,
+    entities append(entity)
+    entity
+)
+
+GameEngine removeEntity := method(entity,
+    entities remove(entity)
+)
+
+GameEngine addSystem := method(system,
+    systems append(system)
+    system
+)
+
+GameEngine setState := method(state,
+    if(hasSlot("currentState") and currentState,
+        currentState exit
+    )
+    currentState := state
+    currentState enter
+)
+
+GameEngine update := method(deltaTime,
+    // Update current state
+    if(currentState,
+        currentState update(deltaTime)
+    )
+    
+    // Update systems
+    systems foreach(system,
+        if(system hasSlot("update"),
+            system update(entities, deltaTime),
+            entities foreach(entity,
+                if(system canProcess(entity),
+                    system process(entity, deltaTime)
+                )
+            )
+        )
+    )
+    
+    // Remove inactive entities
+    entities = entities select(e, e active)
+)
+
+GameEngine render := method(
+    if(currentState,
+        currentState render
+    )
+    
+    renderSystem render(entities)
+)
+
+GameEngine run := method(
+    lastTime := Date now
+    
+    while(running,
+        currentTime := Date now
+        deltaTime := currentTime - lastTime
+        
+        if(deltaTime >= frameTime,
+            update(deltaTime)
+            render
+            lastTime = currentTime
+        )
+        
+        // Small delay to prevent CPU spinning
+        wait(0.001)
+    )
+)
+
+GameEngine stop := method(
+    running = false
+)
+
+// Initialize and run game
+game := GameEngine clone init(800, 600)
+
+// Add systems
+game addSystem(MovementSystem clone)
+game addSystem(CollisionSystem clone init)
+game renderSystem := RenderSystem clone init
+
+// Set initial state
+game setState(MenuState)
+
+// Simulate some gameplay
+"=== Game Engine Demo ===" println
+MenuState handleSelection  // Start game
+
+// Run a few frames
+5 repeat(i,
+    ("Frame " .. i) println
+    game update(game frameTime)
+    game render
+    wait(0.1)
+)

Case Study 4: Build System

A build system similar to Make or Rake:

// Build System
+BuildSystem := Object clone
+BuildSystem init := method(
+    self tasks := Map clone
+    self dependencies := Map clone
+    self executed := list()
+    self config := Map clone
+    self
+)
+
+Task := Object clone
+Task init := method(name, deps, action,
+    self name := name
+    self dependencies := if(deps, deps, list())
+    self action := action
+    self outputs := list()
+    self inputs := list()
+    self
+)
+
+Task execute := method(context,
+    ("Executing task: " .. name) println
+    if(action,
+        action call(context)
+    )
+)
+
+Task upToDate := method(
+    if(outputs size == 0 or inputs size == 0,
+        return false
+    )
+    
+    outputTime := outputs map(f, File with(f) lastModified) min
+    inputTime := inputs map(f, File with(f) lastModified) max
+    
+    outputTime > inputTime
+)
+
+// DSL for defining tasks
+BuildSystem task := method(name,
+    t := Task clone init(name, list(), nil)
+    tasks atPut(name, t)
+    
+    self currentTask := t
+    call evalArgAt(0)
+    t
+)
+
+BuildSystem desc := method(description,
+    if(currentTask,
+        currentTask description := description
+    )
+)
+
+BuildSystem depends := method(
+    deps := call message arguments map(arg,
+        call sender doMessage(arg) asString
+    )
+    if(currentTask,
+        currentTask dependencies = deps
+    )
+)
+
+BuildSystem action := method(
+    if(currentTask,
+        currentTask action = call argAt(0)
+    )
+)
+
+BuildSystem file := method(output, inputs,
+    name := output
+    t := Task clone init(name, list(), nil)
+    t outputs = list(output)
+    t inputs = if(inputs type == "List", inputs, list(inputs))
+    
+    tasks atPut(name, t)
+    self currentTask := t
+    
+    call evalArgAt(2)
+    t
+)
+
+// Running tasks
+BuildSystem run := method(taskName,
+    executed = list()
+    executeTask(taskName)
+)
+
+BuildSystem executeTask := method(taskName,
+    if(executed contains(taskName),
+        return
+    )
+    
+    task := tasks at(taskName)
+    if(task isNil,
+        Exception raise("Task not found: " .. taskName)
+    )
+    
+    // Check if up to date
+    if(task upToDate,
+        ("Task " .. taskName .. " is up to date") println
+        return
+    )
+    
+    // Execute dependencies first
+    task dependencies foreach(dep,
+        executeTask(dep)
+    )
+    
+    // Execute the task
+    task execute(self)
+    executed append(taskName)
+)
+
+// Utilities
+BuildSystem sh := method(command,
+    ("$ " .. command) println
+    System system(command)
+)
+
+BuildSystem glob := method(pattern,
+    Directory with(".") files select(f,
+        f name matchesRegex(pattern)
+    ) map(name)
+)
+
+BuildSystem mkdir := method(path,
+    Directory with(path) create
+)
+
+BuildSystem cp := method(src, dest,
+    File with(src) copyTo(dest)
+)
+
+BuildSystem rm := method(path,
+    File with(path) remove
+)
+
+// Configuration
+BuildSystem configure := method(
+    call message arguments foreach(arg,
+        key := arg name
+        value := call sender doMessage(arg arguments at(0))
+        config atPut(key, value)
+    )
+    self
+)
+
+// Example Buildfile
+build := BuildSystem clone init
+
+build configure(
+    compiler: "gcc",
+    flags: "-Wall -O2",
+    srcDir: "src",
+    buildDir: "build"
+)
+
+build task("clean",
+    desc("Remove all build artifacts")
+    action(
+        rm(config at("buildDir"))
+        "Cleaned" println
+    )
+)
+
+build task("init",
+    desc("Initialize build directory")
+    action(
+        mkdir(config at("buildDir"))
+    )
+)
+
+build task("compile",
+    desc("Compile C sources")
+    depends("init")
+    action(
+        sources := glob("src/*.c")
+        sources foreach(src,
+            obj := src replaceSeq(".c", ".o") replaceSeq("src/", "build/")
+            sh(config at("compiler") .. " " .. config at("flags") .. 
+               " -c " .. src .. " -o " .. obj)
+        )
+    )
+)
+
+build task("link",
+    desc("Link object files")
+    depends("compile")
+    action(
+        objects := glob("build/*.o") join(" ")
+        sh(config at("compiler") .. " " .. objects .. " -o build/app")
+    )
+)
+
+build task("test",
+    desc("Run tests")
+    depends("link")
+    action(
+        sh("./build/app --test")
+    )
+)
+
+build task("default",
+    depends("link")
+)
+
+// File tasks for individual files
+build file("build/main.o", list("src/main.c"),
+    action(
+        sh(config at("compiler") .. " " .. config at("flags") .. 
+           " -c src/main.c -o build/main.o")
+    )
+)
+
+// Run build
+build run("default")

Lessons Learned

These case studies demonstrate several key insights about building real applications in Io:

Strengths

  1. Rapid Prototyping: Io's minimal syntax and dynamic nature make it excellent for quickly building working prototypes.
  2. DSL Creation: The HTTP server's routing, ORM's query builder, and build system all show how naturally DSLs emerge in Io.
  3. Flexibility: The ability to modify anything at runtime made it easy to add features like middleware, validations, and hooks.
  4. Concurrency: The @ operator and coroutines made async request handling in the web server trivial.

Challenges

  1. Performance: For the game engine, Io's interpreted nature and message passing overhead would limit frame rates in a real game.
  2. Type Safety: The ORM would benefit from type checking that Io doesn't provide, leading to potential runtime errors.
  3. Tooling: Lack of IDE support makes maintaining larger codebases challenging.
  4. Libraries: Many features had to be built from scratch due to limited ecosystem.

Best Practices

  1. Use Prototypes Effectively: Define clear prototype hierarchies (Model -> User, Component -> PositionComponent).
  2. Leverage Message Passing: The game engine's entity-component system naturally maps to message passing.
  3. Build Abstractions: Each case study built higher-level abstractions (Repository, Task, System) on Io's primitives.
  4. Embrace DSLs: Don't fight the language—use its strengths to create domain-appropriate interfaces.

Conclusion

These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value.

+ + + + diff --git a/website/content/docs/06-cloning-and-inheritance.md b/Cloning-and-Inheritance/_index.md similarity index 99% rename from website/content/docs/06-cloning-and-inheritance.md rename to Cloning-and-Inheritance/_index.md index bb9c3f1..2cb54f8 100644 --- a/website/content/docs/06-cloning-and-inheritance.md +++ b/Cloning-and-Inheritance/_index.md @@ -1,12 +1,10 @@ --- -title: "Cloning and Inheritance" -weight: 70 +title: Cloning and Inheritance +topTitle: Io +subtitle: "How inheritance chains emerge from the simpler operation of cloning." +nextSectionLink: true --- - - -# Chapter 6: Cloning and Inheritance - In class-based languages, inheritance is a relationship between classes. In Io's prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively. ## The Mechanics of Cloning @@ -665,6 +663,3 @@ Cloning and inheritance in Io demonstrate how complex behavior can emerge from s This flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating "classes" as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile. Understanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren't just how you create objects—they're how you structure entire programs. - ---- - diff --git a/Cloning-and-Inheritance/index.html b/Cloning-and-Inheritance/index.html new file mode 100644 index 0000000..40ffdb1 --- /dev/null +++ b/Cloning-and-Inheritance/index.html @@ -0,0 +1,487 @@ + + + + + + +Cloning and Inheritance – Io + + + + +

Cloning and Inheritance

← The Io Programming Language
Io

How inheritance chains emerge from the simpler operation of cloning.

In class-based languages, inheritance is a relationship between classes. In Io's prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively.

The Mechanics of Cloning

When you clone an object in Io, you don't copy all its data. Instead, you create a new, empty object with a reference to the original:

// Create a prototype
+Animal := Object clone
+Animal species := "Unknown"
+Animal age := 0
+Animal describe := method(
+    ("A " .. age .. " year old " .. species) println
+)
+
+// Clone it
+cat := Animal clone
+
+// cat is empty but linked to Animal
+cat slotNames println        // list() - no local slots!
+cat species println          // "Unknown" - from Animal
+cat age println             // 0 - from Animal
+
+// The link is through 'proto'
+cat proto == Animal println  // true

This is fundamentally different from copying:

// If cloning was copying (it's not!), it would work like:
+catCopy := Object clone
+catCopy species := Animal species  // Copy each slot
+catCopy age := Animal age
+catCopy describe := Animal describe
+
+// But cloning actually creates a link:
+catClone := Animal clone  // Empty object linked to Animal

Differential Inheritance in Action

Objects only store their differences from their prototypes:

Vehicle := Object clone
+Vehicle speed := 60
+Vehicle color := "white"
+Vehicle drive := method(
+    ("Driving at " .. speed .. " mph") println
+)
+
+car := Vehicle clone
+car color = "red"  // Override color
+car model := "Sedan"  // Add new slot
+
+// Inspect what's stored where
+car slotNames println          // list(color, model) - only differences!
+Vehicle slotNames println      // list(speed, color, drive)
+
+// But car can access everything
+car speed println              // 60 - from Vehicle
+car color println              // "red" - from car (overrides Vehicle)
+car model println              // "Sedan" - from car
+car drive                      // "Driving at 60 mph"

Memory efficiency comparison:

// Creating 1000 cars
+cars := list()
+1000 times(i,
+    car := Vehicle clone
+    car id := i
+    cars append(car)
+)
+
+// Each car only stores its 'id' slot
+// All share Vehicle's methods and default values
+// In a copying system, each would duplicate everything

The Prototype Chain

Objects can have chains of prototypes:

Organism := Object clone
+Organism alive := true
+Organism metabolize := method("Converting energy..." println)
+
+Animal := Organism clone
+Animal mobile := true
+Animal move := method("Moving..." println)
+
+Mammal := Animal clone
+Mammal warmBlooded := true
+Mammal nurse := method("Nursing young..." println)
+
+Dog := Mammal clone
+Dog loyal := true
+Dog bark := method("Woof!" println)
+
+fido := Dog clone
+fido name := "Fido"
+
+// fido can access methods from the entire chain
+fido metabolize  // From Organism
+fido move        // From Animal
+fido nurse       // From Mammal
+fido bark        // From Dog
+
+// Trace the chain
+obj := fido
+while(obj != Object,
+    obj type println
+    obj = obj proto
+)
+// Dog
+// Mammal
+// Animal
+// Organism
+// Object

Method Resolution Order

When you send a message, Io searches up the prototype chain:

A := Object clone
+A foo := method("A's foo" println)
+A bar := method("A's bar" println)
+
+B := A clone
+B foo := method("B's foo" println)  // Override
+
+C := B clone
+C bar := method("C's bar" println)  // Override different method
+
+obj := C clone
+
+obj foo  // "B's foo" - found in B (C doesn't have it)
+obj bar  // "C's bar" - found in C
+obj baz  // Exception - not found anywhere

You can visualize the search:

Object findSlot := method(slotName,
+    obj := self
+    while(obj,
+        if(obj hasLocalSlot(slotName),
+            ("Found '" .. slotName .. "' in " .. obj type) println
+            return obj getSlot(slotName)
+        )
+        obj = obj proto
+    )
+    "Not found" println
+)
+
+obj findSlot("foo")  // Found 'foo' in B
+obj findSlot("bar")  // Found 'bar' in C

Multiple Inheritance

Io supports multiple inheritance through the protos list:

// Define capabilities
+Flyable := Object clone
+Flyable altitude := 0
+Flyable fly := method(height,
+    altitude = height
+    ("Flying at " .. altitude .. " feet") println
+)
+
+Swimmable := Object clone
+Swimmable depth := 0
+Swimmable swim := method(d,
+    depth = d
+    ("Swimming at " .. depth .. " feet deep") println
+)
+
+// Single inheritance
+Bird := Flyable clone
+Bird chirp := method("Chirp!" println)
+
+// Multiple inheritance
+Duck := Object clone
+Duck appendProto(Flyable)
+Duck appendProto(Swimmable)
+Duck quack := method("Quack!" println)
+
+mallard := Duck clone
+mallard fly(100)    // Flying at 100 feet
+mallard swim(5)     // Swimming at 5 feet deep
+mallard quack       // Quack!
+
+// Check the prototype list
+Duck protos println  // list(Object_0x..., Flyable_0x..., Swimmable_0x...)

Diamond Problem Resolution

The diamond problem occurs when multiple inheritance paths lead to the same ancestor:

// Diamond structure
+Grandparent := Object clone
+Grandparent value := "from grandparent"
+Grandparent method1 := method("Grandparent method1" println)
+
+Parent1 := Grandparent clone
+Parent1 method1 := method("Parent1 method1" println)
+Parent1 method2 := method("Parent1 method2" println)
+
+Parent2 := Grandparent clone
+Parent2 method1 := method("Parent2 method1" println)
+Parent2 method3 := method("Parent2 method3" println)
+
+Child := Object clone
+Child appendProto(Parent1)
+Child appendProto(Parent2)
+
+// Resolution order matters
+Child method1  // "Parent1 method1" - Parent1 comes first
+
+// Reorder to change priority
+Child protos := list(Parent2, Parent1)
+Child method1  // "Parent2 method1" - Parent2 now comes first

Shallow vs Deep Cloning

By default, cloning is shallow—slot values are shared:

Original := Object clone
+Original data := list(1, 2, 3)
+Original info := Map clone atPut("key", "value")
+
+Shallow := Original clone
+
+// Modifying mutable objects affects both
+Shallow data append(4)
+Original data println  // list(1, 2, 3, 4) - changed!
+
+// Need deep cloning for independence
+Object deepClone := method(
+    new := self clone
+    self slotNames foreach(name,
+        value := self getSlot(name)
+        if(value hasSlot("clone"),
+            new setSlot(name, value clone)
+        )
+    )
+    new
+)
+
+Deep := Original deepClone
+Deep data append(5)
+Original data println  // list(1, 2, 3, 4) - unchanged
+Deep data println      // list(1, 2, 3, 4, 5)

init Methods and Constructors

While Io doesn't have constructors, you can create initialization patterns:

Person := Object clone
+Person init := method(
+    self name := "Unknown"
+    self age := 0
+    self contacts := list()  // Important: new list for each instance
+    self  // Return self for chaining
+)
+
+// Override clone to call init
+Person clone := method(
+    resend init
+)
+
+// Now each person gets their own contacts list
+alice := Person clone
+alice name = "Alice"
+alice contacts append("Bob")
+
+bob := Person clone
+bob name = "Bob"
+bob contacts append("Charlie")
+
+alice contacts println  // list("Bob") - independent!
+bob contacts println    // list("Charlie")

Factory Methods

Create specialized cloning methods:

Animal := Object clone
+Animal species := "Unknown"
+Animal sound := "..."
+
+Animal withSpecies := method(s,
+    new := self clone
+    new species = s
+    new
+)
+
+Animal dog := method(
+    self clone species = "Dog" sound = "Woof"
+)
+
+Animal cat := method(
+    self clone species = "Cat" sound = "Meow"
+)
+
+// Usage
+myDog := Animal dog
+myCat := Animal cat
+genericAnimal := Animal withSpecies("Elephant")

Prototype Switching

Unlike class-based languages, you can change an object's prototype at runtime:

// Start with one prototype
+Bird := Object clone
+Bird fly := method("Flying..." println)
+
+Fish := Object clone
+Fish swim := method("Swimming..." println)
+
+creature := Bird clone
+creature fly  // "Flying..."
+
+// Change its prototype!
+creature protos = list(Fish)
+creature swim  // "Swimming..."
+creature fly   // Exception - no longer a Bird!
+
+// Or add capabilities
+creature appendProto(Bird)
+creature fly   // "Flying..." - now it can do both
+creature swim  // "Swimming..."

Mixins and Traits

Use prototypes as mixins for composable behavior:

// Define mixins
+Comparable := Object clone
+Comparable < := method(other, self compare(other) < 0)
+Comparable > := method(other, self compare(other) > 0)
+Comparable == := method(other, self compare(other) == 0)
+Comparable <= := method(other, self compare(other) <= 0)
+Comparable >= := method(other, self compare(other) >= 0)
+
+Enumerable := Object clone
+Enumerable select := method(block,
+    result := list()
+    self foreach(item,
+        if(block call(item), result append(item))
+    )
+    result
+)
+Enumerable map := method(block,
+    result := list()
+    self foreach(item,
+        result append(block call(item))
+    )
+    result
+)
+
+// Use mixins
+SortedList := List clone
+SortedList appendProto(Comparable)
+SortedList appendProto(Enumerable)
+SortedList compare := method(other,
+    self size compare(other size)
+)
+
+list1 := SortedList clone append(1, 2, 3)
+list2 := SortedList clone append(4, 5)
+(list1 > list2) println  // true (3 > 2)

Clone Hooks

Customize cloning behavior:

Counted := Object clone
+Counted instances := 0
+
+Counted clone := method(
+    Counted instances = Counted instances + 1
+    new := resend
+    new id := Counted instances
+    new
+)
+
+// Each clone gets a unique ID
+obj1 := Counted clone
+obj2 := Counted clone
+obj3 := Counted clone
+
+obj1 id println  // 1
+obj2 id println  // 2
+obj3 id println  // 3
+Counted instances println  // 3

Inheritance Patterns

Classical Inheritance Pattern

Emulate class-based inheritance:

// Base "class"
+Class := Object clone
+Class new := method(
+    instance := self clone
+    instance init
+    instance
+)
+
+// Define a "class"
+Rectangle := Class clone
+Rectangle init := method(
+    self width := 0
+    self height := 0
+)
+Rectangle area := method(width * height)
+
+// Inheritance
+Square := Rectangle clone
+Square init := method(
+    resend  // Call parent init
+    self side := 0
+)
+Square setSide := method(s,
+    side = s
+    width = s
+    height = s
+)
+
+// Usage
+rect := Rectangle new
+rect width = 10
+rect height = 20
+rect area println  // 200
+
+square := Square new
+square setSide(5)
+square area println  // 25

Delegation Pattern

Delegator := Object clone
+Delegator delegate := nil
+Delegator forward := method(
+    if(delegate,
+        delegate doMessage(call message, call sender)
+    ,
+        Exception raise("No delegate set")
+    )
+)
+
+Logger := Object clone
+Logger log := method(msg, ("[LOG] " .. msg) println)
+
+obj := Delegator clone
+obj delegate = Logger
+obj log("Hello")  // [LOG] Hello

Testing Inheritance

Check inheritance relationships:

Object isKindOf := method(proto,
+    obj := self
+    while(obj,
+        if(obj == proto, return true)
+        if(obj protos,
+            obj protos foreach(p,
+                if(p isKindOf(proto), return true)
+            )
+        )
+        obj = obj proto
+    )
+    false
+)
+
+Animal := Object clone
+Dog := Animal clone
+fido := Dog clone
+
+fido isKindOf(Dog) println     // true
+fido isKindOf(Animal) println  // true
+fido isKindOf(Object) println  // true
+fido isKindOf(Number) println  // false

Performance Considerations

Prototype chains affect performance:

// Deep chain - slower lookup
+A := Object clone
+B := A clone
+C := B clone
+D := C clone
+E := D clone
+obj := E clone
+obj method := method("Found!")
+
+// Shallow chain - faster lookup
+Flat := Object clone
+Flat method := method("Found!")
+obj2 := Flat clone
+
+// Benchmark
+time(100000 times(obj method))   // Slower
+time(100000 times(obj2 method))  // Faster

Common Pitfalls

Shared Mutable State

// WRONG - shares list between instances
+BadTemplate := Object clone
+BadTemplate items := list()
+
+obj1 := BadTemplate clone
+obj2 := BadTemplate clone
+obj1 items append(1)
+obj2 items println  // list(1) - Oops! Shared!
+
+// RIGHT - create new list for each instance
+GoodTemplate := Object clone
+GoodTemplate init := method(
+    self items := list()
+    self
+)
+GoodTemplate clone := method(resend init)

Circular Prototypes

// Don't do this!
+A := Object clone
+B := Object clone
+A appendProto(B)
+B appendProto(A)  // Circular!
+
+// A foo  // Infinite loop!

Exercises

  1. Instance Counter: Create a prototype that tracks how many objects have been cloned from it, directly or indirectly.
  2. Prototype Inspector: Write a method that visualizes an object's complete prototype hierarchy as a tree.
  3. Deep Clone: Implement a robust deep cloning method that handles circular references.
  4. Multiple Inheritance Resolver: Create a system that detects and reports conflicts in multiple inheritance.
  5. Class Emulator: Build a complete class-based OOP system on top of Io's prototypes, including abstract classes and interfaces.

Real-World Example: Game Entity System

// Base entity
+Entity := Object clone
+Entity init := method(
+    self x := 0
+    self y := 0
+    self health := 100
+    self
+)
+Entity clone := method(resend init)
+Entity takeDamage := method(amount,
+    health = health - amount
+    if(health <= 0, self die)
+)
+Entity die := method("Entity died" println)
+
+// Moveable capability
+Moveable := Object clone
+Moveable speed := 1
+Moveable moveTo := method(newX, newY,
+    x = newX
+    y = newY
+)
+
+// Attacker capability
+Attacker := Object clone
+Attacker damage := 10
+Attacker attack := method(target,
+    target takeDamage(damage)
+)
+
+// Compose entities
+Player := Entity clone
+Player appendProto(Moveable)
+Player appendProto(Attacker)
+Player speed = 5
+Player damage = 20
+
+Enemy := Entity clone
+Enemy appendProto(Moveable)
+Enemy appendProto(Attacker)
+Enemy speed = 3
+Enemy damage = 15
+
+// Static entity
+Turret := Entity clone
+Turret appendProto(Attacker)
+Turret damage = 25
+
+// Usage
+player := Player clone
+enemy := Enemy clone
+turret := Turret clone
+
+player moveTo(10, 10)
+player attack(enemy)
+turret attack(player)

Conclusion

Cloning and inheritance in Io demonstrate how complex behavior can emerge from simple mechanisms. Instead of classes, instances, and inheritance hierarchies defined at compile time, you have objects cloning objects, maintaining prototype links, and delegating message handling up the chain.

This flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating "classes" as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile.

Understanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren't just how you create objects—they're how you structure entire programs.

+ + + + diff --git a/website/content/docs/08-collections.md b/Collections/_index.md similarity index 99% rename from website/content/docs/08-collections.md rename to Collections/_index.md index 634e9b4..9c9fbc1 100644 --- a/website/content/docs/08-collections.md +++ b/Collections/_index.md @@ -1,12 +1,10 @@ --- -title: "Collections" -weight: 90 +title: Collections +topTitle: Io +subtitle: "Lists, Maps, and Sequences: Io's core data structures and how to extend them." +nextSectionLink: true --- - - -# Chapter 8: Collections - Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types. ## Lists: Ordered Collections @@ -705,6 +703,3 @@ todos pending foreach(item, Io's collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They're all objects, following Io's uniform object model, and support functional programming patterns like map, select, and reduce. The real power comes from Io's flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks. - ---- - diff --git a/Collections/index.html b/Collections/index.html new file mode 100644 index 0000000..2aea32a --- /dev/null +++ b/Collections/index.html @@ -0,0 +1,541 @@ + + + + + + +Collections – Io + + + + +

Lists, Maps, and Sequences: Io's core data structures and how to extend them.

Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types.

Lists: Ordered Collections

Lists in Io are dynamic arrays that can hold any type of object:

// Creating lists
+empty := list()
+numbers := list(1, 2, 3, 4, 5)
+mixed := list("hello", 42, true, Object clone)
+
+// Lists are objects
+numbers type println  // List
+
+// Basic operations
+numbers size println      // 5
+numbers isEmpty println   // false
+numbers first println     // 1
+numbers last println      // 5
+numbers at(2) println     // 3 (zero-indexed)

List Manipulation

fruits := list("apple", "banana")
+
+// Adding elements
+fruits append("orange")
+fruits prepend("grape")
+fruits println  // list(grape, apple, banana, orange)
+
+// Insert at position
+fruits atInsert(2, "mango")
+fruits println  // list(grape, apple, mango, banana, orange)
+
+// Removing elements
+fruits remove("mango")
+fruits removeAt(0)
+fruits pop  // Removes and returns last element
+fruits println  // list(apple, banana)
+
+// Multiple operations
+fruits appendSeq(list("kiwi", "peach"))
+fruits println  // list(apple, banana, kiwi, peach)

List Iteration

numbers := list(1, 2, 3, 4, 5)
+
+// Basic iteration
+numbers foreach(n,
+    n println
+)
+
+// With index
+numbers foreach(i, n,
+    (i .. ": " .. n) println
+)
+
+// Reverse iteration
+numbers reverseForEach(n,
+    n println
+)

Functional Operations

numbers := list(1, 2, 3, 4, 5)
+
+// Map: transform each element
+squared := numbers map(x, x * x)
+squared println  // list(1, 4, 9, 16, 25)
+
+// Select: filter elements
+evens := numbers select(x, x % 2 == 0)
+evens println  // list(2, 4)
+
+// Reject: inverse of select
+odds := numbers reject(x, x % 2 == 0)
+odds println  // list(1, 3, 5)
+
+// Detect: find first match
+firstEven := numbers detect(x, x % 2 == 0)
+firstEven println  // 2
+
+// Reduce: aggregate
+sum := numbers reduce(+)
+sum println  // 15
+
+// Custom reduce
+product := numbers reduce(a, b, a * b)
+product println  // 120
+
+// Any/all predicates
+numbers contains(3) println  // true
+numbers containsAll(list(2, 4)) println  // true
+numbers containsAny(list(10, 3)) println  // true

List Slicing and Manipulation

letters := list("a", "b", "c", "d", "e")
+
+// Slicing
+letters slice(1, 3) println  // list(b, c, d)
+letters slice(2) println     // list(c, d, e)
+
+// Copying
+copy := letters copy
+copy atPut(0, "z")
+letters println  // list(a, b, c, d, e) - unchanged
+copy println     // list(z, b, c, d, e)
+
+// Sorting
+numbers := list(3, 1, 4, 1, 5, 9)
+numbers sort println  // list(1, 1, 3, 4, 5, 9)
+
+// Custom sort
+people := list(
+    Object clone do(name := "Alice"; age := 30),
+    Object clone do(name := "Bob"; age := 25),
+    Object clone do(name := "Charlie"; age := 35)
+)
+
+people sortBy(block(p, p age)) foreach(p,
+    (p name .. ": " .. p age) println
+)
+// Bob: 25
+// Alice: 30
+// Charlie: 35

Maps: Key-Value Stores

Maps (also called dictionaries or hash tables) store key-value pairs:

// Creating maps
+empty := Map clone
+person := Map clone atPut("name", "Alice") atPut("age", 30)
+
+// Alternative creation
+person := Map with(
+    "name", "Alice",
+    "age", 30,
+    "city", "New York"
+)
+
+// Accessing values
+person at("name") println     // Alice
+person at("missing") println  // nil
+person at("missing", "default") println  // default
+
+// Setting values
+person atPut("age", 31)
+person atPut("email", "alice@example.com")
+
+// Checking keys
+person hasKey("name") println  // true
+person hasKey("phone") println  // false

Map Operations

map := Map with("a", 1, "b", 2, "c", 3)
+
+// Get all keys and values
+map keys println    // list(a, b, c)
+map values println  // list(1, 2, 3)
+
+// Size and emptiness
+map size println      // 3
+map isEmpty println   // false
+
+// Removing entries
+map removeAt("b")
+map println  // Map_0x...: a=1, c=3
+
+// Iteration
+map foreach(key, value,
+    (key .. " => " .. value) println
+)
+
+// Merging maps
+other := Map with("c", 30, "d", 4)
+map merge(other)
+map println  // a=1, c=30, d=4 (note c was overwritten)

Maps as Objects

Maps can act like objects with dynamic properties:

// Create object-like map
+obj := Map clone
+obj atPut("greet", method(name,
+    ("Hello, " .. name .. "!") println
+))
+obj atPut("x", 10)
+obj atPut("y", 20)
+
+// Use like object (sort of)
+obj at("greet") call("World")  // Hello, World!
+obj at("x") println  // 10

Sequences: String Handling

Sequences are Io's strings, but they're mutable and act like byte arrays:

text := "Hello, World!"
+
+// Basic operations
+text size println          // 13
+text at(0) println        // 72 (ASCII 'H')
+text at(0) asCharacter println  // H
+
+// Slicing
+text slice(0, 5) println   // Hello
+text slice(7) println      // World!
+
+// Searching
+text findSeq("World") println  // 7 (index)
+text containsSeq("Hello") println  // true
+text beginsWithSeq("Hello") println  // true
+text endsWithSeq("!") println  // true

String Manipulation

text := "  Hello, World!  "
+
+// Trimming
+text strip println         // "Hello, World!"
+text lstrip println        // "Hello, World!  "
+text rstrip println        // "  Hello, World!"
+
+// Case conversion
+"hello" upper println      // HELLO
+"WORLD" lower println      // world
+"hello world" asCapitalized println  // Hello world
+
+// Replacement
+"hello world" replaceSeq("world", "Io") println  // hello Io
+"abcabc" replaceFirstSeq("a", "X") println  // Xbcabc
+
+// Splitting and joining
+words := "apple,banana,orange" split(",")
+words println  // list(apple, banana, orange)
+
+words join("-") println  // apple-banana-orange

String Building

// Inefficient string concatenation
+result := ""
+for(i, 1, 1000,
+    result = result .. i .. ", "
+)
+
+// Better: use a list
+parts := list()
+for(i, 1, 1000,
+    parts append(i)
+)
+result := parts join(", ")
+
+// Or use Sequence's mutable nature
+seq := Sequence clone
+for(i, 1, 100,
+    seq appendSeq(i asString) appendSeq(", ")
+)

Regular Expressions

Io has built-in regex support:

text := "The year 2024 has 365 days"
+
+// Find matches
+text findRegex("\\d+") println  // MatchResult...
+text allMatchesOfRegex("\\d+") foreach(match,
+    match println  // 2024, 365
+)
+
+// Replace with regex
+text replaceAllRegex("\\d+", "N") println  // The year N has N days
+
+// Capture groups
+email := "user@example.com"
+match := email matchesOfRegex("(\\w+)@(\\w+\\.\\w+)") 
+if(match,
+    match at(1) println  // user
+    match at(2) println  // example.com
+)

Creating Custom Collections

Stack Implementation

Stack := List clone
+Stack push := method(item,
+    self append(item)
+)
+
+Stack pop := method(
+    if(size > 0,
+        removeAt(size - 1),
+        nil
+    )
+)
+
+Stack peek := method(
+    if(size > 0,
+        at(size - 1),
+        nil
+    )
+)
+
+// Usage
+stack := Stack clone
+stack push(1) push(2) push(3)
+stack pop println   // 3
+stack peek println  // 2
+stack pop println   // 2
+stack pop println   // 1

Queue Implementation

Queue := Object clone
+Queue init := method(
+    self items := list()
+    self
+)
+
+Queue enqueue := method(item,
+    items append(item)
+    self
+)
+
+Queue dequeue := method(
+    if(items size > 0,
+        items removeAt(0),
+        nil
+    )
+)
+
+Queue isEmpty := method(items isEmpty)
+Queue size := method(items size)
+
+// Usage
+queue := Queue clone init
+queue enqueue("a") enqueue("b") enqueue("c")
+queue dequeue println  // a
+queue dequeue println  // b
+queue size println     // 1

Set Implementation

Set := Object clone
+Set init := method(
+    self items := Map clone
+    self
+)
+
+Set add := method(item,
+    items atPut(item asString, item)
+    self
+)
+
+Set remove := method(item,
+    items removeAt(item asString)
+    self
+)
+
+Set contains := method(item,
+    items hasKey(item asString)
+)
+
+Set union := method(other,
+    result := Set clone init
+    items foreach(k, v, result add(v))
+    other items foreach(k, v, result add(v))
+    result
+)
+
+Set intersection := method(other,
+    result := Set clone init
+    items foreach(k, v,
+        if(other contains(v), result add(v))
+    )
+    result
+)
+
+// Usage
+set1 := Set clone init add(1) add(2) add(3)
+set2 := Set clone init add(2) add(3) add(4)
+
+set1 contains(2) println  // true
+union := set1 union(set2)
+intersection := set1 intersection(set2)

Advanced Collection Patterns

Lazy Evaluation

LazyList := Object clone
+LazyList init := method(generator,
+    self generator := generator
+    self cache := list()
+    self
+)
+
+LazyList at := method(index,
+    while(cache size <= index,
+        cache append(generator call(cache size))
+    )
+    cache at(index)
+)
+
+LazyList take := method(n,
+    result := list()
+    for(i, 0, n - 1,
+        result append(self at(i))
+    )
+    result
+)
+
+// Infinite fibonacci sequence
+fibGen := LazyList clone init(block(n,
+    if(n < 2, n, self at(n - 1) + self at(n - 2))
+))
+
+fibGen take(10) println  // list(0, 1, 1, 2, 3, 5, 8, 13, 21, 34)

Collection Pipeline

// Method chaining for data processing
+data := list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
+
+result := data select(x, x % 2 == 0) \
+    map(x, x * x) \
+    select(x, x > 10) \
+    reduce(+)
+
+result println  // 120 (16 + 36 + 64)
+
+// Custom pipeline
+List pipeline := method(
+    Pipeline clone setList(self)
+)
+
+Pipeline := Object clone
+Pipeline setList := method(list,
+    self list := list
+    self
+)
+
+Pipeline where := method(predicate,
+    self list = list select(predicate)
+    self
+)
+
+Pipeline transform := method(mapper,
+    self list = list map(mapper)
+    self
+)
+
+Pipeline aggregate := method(reducer,
+    list reduce(reducer)
+)
+
+// Usage
+numbers := list(1, 2, 3, 4, 5)
+total := numbers pipeline \
+    where(x, x % 2 == 0) \
+    transform(x, x * x) \
+    aggregate(+)
+
+total println  // 20 (4 + 16)

Nested Collections

// Matrix as list of lists
+matrix := list(
+    list(1, 2, 3),
+    list(4, 5, 6),
+    list(7, 8, 9)
+)
+
+// Access element
+matrix at(1) at(2) println  // 6
+
+// Transpose
+transpose := method(matrix,
+    rows := matrix size
+    cols := matrix at(0) size
+    result := list()
+    
+    for(c, 0, cols - 1,
+        col := list()
+        for(r, 0, rows - 1,
+            col append(matrix at(r) at(c))
+        )
+        result append(col)
+    )
+    result
+)
+
+transpose(matrix) println
+// list(list(1, 4, 7), list(2, 5, 8), list(3, 6, 9))

Performance Considerations

// List operations performance
+list := List clone
+
+// O(1) operations
+list append(item)      // Constant time
+list at(index)         // Constant time
+list size              // Constant time
+
+// O(n) operations
+list indexOf(item)     // Linear search
+list contains(item)    // Linear search
+list remove(item)      // Linear search + shift
+
+// Map operations are generally O(1)
+map := Map clone
+map atPut(key, value)  // Constant average
+map at(key)            // Constant average
+map removeAt(key)      // Constant average
+
+// Choose the right collection for your needs

Collection Serialization

// JSON serialization
+list := list(1, 2, 3, Map with("name", "Alice"))
+json := list asJson
+json println  // [1,2,3,{"name":"Alice"}]
+
+// Deserialize
+restored := json parseJson
+restored println
+
+// Custom serialization
+Collection := Object clone
+Collection serialize := method(
+    result := list()
+    self foreach(item,
+        if(item hasSlot("serialize"),
+            result append(item serialize),
+            result append(item asString)
+        )
+    )
+    result join("|")
+)

Common Pitfalls

Shared References

// PROBLEM: Shared reference
+original := list(1, 2, 3)
+copy := original  // Not a copy!
+copy append(4)
+original println  // list(1, 2, 3, 4) - modified!
+
+// SOLUTION: Use copy
+original := list(1, 2, 3)
+copy := original copy
+copy append(4)
+original println  // list(1, 2, 3) - unchanged

Iterator Invalidation

// PROBLEM: Modifying while iterating
+list := list(1, 2, 3, 4, 5)
+list foreach(item,
+    if(item % 2 == 0,
+        list remove(item)  // Dangerous!
+    )
+)
+
+// SOLUTION: Use select/reject or iterate on copy
+list := list(1, 2, 3, 4, 5)
+list = list reject(item, item % 2 == 0)

Exercises

  1. Circular Buffer: Implement a fixed-size circular buffer that overwrites old elements.
  2. MultiMap: Create a map that can store multiple values per key.
  3. Sorted List: Implement a list that maintains sorted order on insertion.
  4. Tree Structure: Build a tree collection with parent-child relationships.
  5. Graph: Implement a graph data structure with nodes and edges.

Real-World Example: Todo List with Tags

TodoItem := Object clone
+TodoItem init := method(description,
+    self description := description
+    self tags := Set clone init
+    self completed := false
+    self
+)
+
+TodoList := Object clone
+TodoList init := method(
+    self items := list()
+    self
+)
+
+TodoList add := method(description,
+    item := TodoItem clone init(description)
+    items append(item)
+    item
+)
+
+TodoList taggedWith := method(tag,
+    items select(item, item tags contains(tag))
+)
+
+TodoList pending := method(
+    items select(item, item completed not)
+)
+
+TodoList complete := method(description,
+    item := items detect(i, i description == description)
+    if(item, item completed = true)
+    self
+)
+
+// Usage
+todos := TodoList clone init
+
+todos add("Write documentation") tags add("work") add("writing")
+todos add("Fix bugs") tags add("work") add("urgent")
+todos add("Buy groceries") tags add("personal")
+
+todos taggedWith("urgent") foreach(item,
+    item description println
+)
+// Fix bugs
+
+todos complete("Buy groceries")
+todos pending foreach(item,
+    item description println
+)
+// Write documentation
+// Fix bugs

Conclusion

Io's collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They're all objects, following Io's uniform object model, and support functional programming patterns like map, select, and reduce.

The real power comes from Io's flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks.

+ + + + diff --git a/website/content/docs/18-conclusion.md b/Conclusion/_index.md similarity index 98% rename from website/content/docs/18-conclusion.md rename to Conclusion/_index.md index 1d02f7b..519bcfd 100644 --- a/website/content/docs/18-conclusion.md +++ b/Conclusion/_index.md @@ -1,12 +1,10 @@ --- -title: "Conclusion" -weight: 190 +title: "Conclusion: The Io Way" +topTitle: Io +subtitle: "What Io teaches about simplicity, uniformity, and the design of programming languages." +nextSectionLink: true --- - - -# Chapter 18: Conclusion - The Io Way - We've reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we've explored a language that challenges conventional programming wisdom. This final chapter reflects on what we've learned, when to use Io, and what it teaches us about programming itself. ## What Makes Io Special @@ -353,4 +351,4 @@ For continued learning: Visit https://iolanguage.org for more information. -*"Simplicity is the ultimate sophistication."* — Leonardo da Vinci +*"Simplicity is the ultimate sophistication."* — Leonardo da Vinci \ No newline at end of file diff --git a/Conclusion/index.html b/Conclusion/index.html new file mode 100644 index 0000000..d05fe46 --- /dev/null +++ b/Conclusion/index.html @@ -0,0 +1,117 @@ + + + + + + +Conclusion: The Io Way – Io + + + + +

Conclusion: The Io Way

← The Io Programming Language
Io

What Io teaches about simplicity, uniformity, and the design of programming languages.

We've reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we've explored a language that challenges conventional programming wisdom. This final chapter reflects on what we've learned, when to use Io, and what it teaches us about programming itself.

What Makes Io Special

After eighteen chapters, we can distill Io's essence to a few key principles:

Radical Simplicity

Io achieves remarkable expressiveness with minimal concepts:

  • Everything is an object
  • All computation is message passing
  • Objects clone objects (no classes)
  • Code is data (messages are objects)

Compare Io's ~10,000 lines of C to Python's ~500,000 or Java's millions. This isn't just about code size—it's about conceptual simplicity. You can understand all of Io, not just use it.

Uniformity

Where other languages have special cases, Io has objects:

// Numbers? Objects.
+5 squared := method(self * self)
+
+// Booleans? Objects.
+true celebrate := method("Yes!" println)
+
+// Control structures? Objects receiving messages.
+if := method(condition, trueBlock, falseBlock, ...)
+
+// Operators? Messages.
+Number + := method(n, ...)
+
+// Even nil? An object.
+nil comfort := method("It's okay to be nothing" println)

This uniformity isn't just elegant—it's powerful. When everything follows the same rules, there's less to remember and more you can do.

Openness

Most languages protect you from yourself. Io trusts you completely:

// Modify fundamental types
+String shout := method(self upper .. "!!!")
+
+// Change how the language works
+Object if := method(...)  // Redefine conditionals
+
+// Inspect everything
+anyObject slotNames  // See all slots
+anyMethod code       // See implementation

This openness enables profound metaprogramming but requires responsibility.

When to Use Io

Io excels in specific contexts:

Rapid Prototyping

When you need to explore ideas quickly:

// From idea to working code in minutes
+Api := Object clone
+Api route := method(path, handler, ...)
+Api get("/users", block(...))
+Api start(8080)

Domain-Specific Languages

When you need expressive, domain-appropriate interfaces:

recipe "Pasta" serves(4) {
+    boil water in("large pot")
+    add pasta after("water boils")
+    cook for(8) minutes
+    drain
+    serve with("marinara sauce")
+}

Learning and Teaching

When you want to understand programming concepts deeply:

  • How objects really work
  • What message passing means
  • How languages are implemented
  • Why certain design choices matter

Embedded Scripting

When you need a lightweight, embeddable language:

  • Game scripting
  • Application automation
  • Configuration languages
  • Plugin systems

When Not to Use Io

Io has limitations to consider:

Performance-Critical Systems

// Io: Elegant but slower
+numbers map(x, x * x) select(x, x > 100)
+
+// C: Verbose but fast
+for(int i = 0; i < n; i++) {
+    squared[i] = numbers[i] * numbers[i];
+    if(squared[i] > 100) ...
+}

Message passing has overhead. For number crunching, system programming, or real-time systems, choose C, Rust, or C++.

Large Team Projects

Io lacks:

  • Static type checking
  • Comprehensive IDE support
  • Large ecosystem of libraries
  • Extensive documentation
  • Big community for support

For enterprise applications with many developers, Java, C#, or TypeScript offer better tooling and guardrails.

Production Web Services

While you can build web services in Io, you probably shouldn't for production:

  • Limited web frameworks
  • No battle-tested libraries
  • Small community for security issues
  • Few deployment options

Use Python, Ruby, JavaScript, or Go instead.

Lessons for Other Languages

Even if you never use Io professionally, it teaches valuable lessons:

Question Everything

Why do we need classes? Io shows prototypes work fine. Why special syntax for control flow? Io uses methods. Why distinguish data and code? Io treats both as messages.

These aren't necessarily better—but questioning assumptions makes you a better programmer.

Simplicity Has Power

Io shows how much you can achieve with few concepts. This influences how you design:

  • APIs with consistent interfaces
  • Systems with uniform principles
  • Code that does one thing well

Metaprogramming Isn't Magic

In Io, metaprogramming is just programming:

// Not magic, just objects
+method := block(x, x * 2)
+method code println       // x *(2)
+method setCode("x + 2")  // Changed!

This demystifies metaprogramming in any language.

Everything Has Trade-offs

Io's choices have consequences:

  • Simplicity vs Performance
  • Flexibility vs Safety
  • Power vs Complexity
  • Expressiveness vs Familiarity

Understanding these trade-offs helps you choose the right tool for each job.

Io's Influence

Despite its small community, Io has influenced programming:

JavaScript's Prototype Pattern

// JavaScript embracing prototypes (pre-ES6)
+var animal = {
+    speak: function() { console.log("..."); }
+};
+
+var dog = Object.create(animal);
+dog.bark = function() { console.log("Woof!"); };

Ruby's Method Missing

class DynamicObject
+  def method_missing(name, *args)
+    if name.to_s.start_with?("get_")
+      # Handle dynamically
+    end
+  end
+end

Minimalist Language Design

Languages like Lua and Factor share Io's minimalist philosophy, proving that small can be powerful.

The Future of Io

Io may never become mainstream, and that's okay. Its value isn't in market share but in:

Educational Impact

Io remains excellent for teaching:

  • Prototype-based OOP
  • Message passing
  • Language implementation
  • Metaprogramming concepts

Research Platform

Io's simplicity makes it ideal for experimenting with:

  • New concurrency models
  • Novel object systems
  • DSL techniques
  • Language features

Inspiration

Future language designers study Io to understand:

  • How simple a language can be
  • Alternative object models
  • The power of uniformity
  • Trade-offs in language design

Personal Reflection

Learning Io changes how you think about programming. You realize that many "fundamental" concepts are just choices. Classes aren't necessary. Syntax isn't sacred. Types aren't mandatory. These aren't revelations that everything should be like Io—rather, they free you to think more broadly about problems and solutions.

When you return to your daily programming language—be it Python, JavaScript, Java, or something else—you bring new perspectives:

  • You see the prototype pattern hiding in JavaScript's classes
  • You recognize message passing in Ruby's method calls
  • You understand metaprogramming isn't mysterious
  • You appreciate both the safety of types and the freedom of their absence

A Final Example

Let's end with a small program that captures Io's spirit:

// The Io Philosophy in Code
+Philosophy := Object clone
+
+Philosophy simplicity := "Everything is an object"
+Philosophy uniformity := "Everything is a message"
+Philosophy openness := "Everything is modifiable"
+
+Philosophy embrace := method(concept,
+    ("Embracing " .. concept .. "...") println
+    self setSlot(concept, true)
+    self
+)
+
+Philosophy question := method(assumption,
+    ("Why must " .. assumption .. "?") println
+    ("Perhaps there's another way...") println
+)
+
+Philosophy learn := method(
+    lessons := list(
+        "Simplicity enables understanding",
+        "Uniformity reduces cognitive load",
+        "Openness enables exploration",
+        "Constraints inspire creativity",
+        "Every choice has consequences"
+    )
+    
+    lessons foreach(lesson,
+        ("  • " .. lesson) println
+        wait(0.5)  // Pause to reflect
+    )
+)
+
+// The journey
+journey := Philosophy clone
+
+journey embrace("simplicity") \
+        embrace("uniformity") \
+        embrace("openness")
+
+journey question("languages be complex")
+journey question("we have classes")
+journey question("syntax be fixed")
+
+"Lessons learned:" println
+journey learn
+
+"Thank you for exploring Io." println
+"May it inspire your programming journey." println

Parting Thoughts

Io isn't trying to replace your favorite language. It's not competing for market dominance. It's not the solution to all programming problems.

What Io offers is perspective—a radically different view of what programming can be. It shows that our familiar concepts aren't immutable laws but design choices. It demonstrates that simplicity and power aren't opposites. It proves that small languages can have big ideas.

Whether you use Io for a weekend experiment, a personal project, or just intellectual exploration, it will change how you think about programming. You'll question more, assume less, and see possibilities where you once saw constraints.

That's the real gift of Io: not the language itself, but the mindset it instills. A mindset that questions, explores, and imagines. A mindset that sees programming not as applying fixed rules but as creatively solving problems with the tools at hand—or creating new tools when needed.

Thank You

Thank you for joining me on this exploration of Io. I hope you've found it as enlightening to read as I found it to write. The language may be small, but the ideas are vast.

Now go forth and experiment. Clone some objects. Send some messages. Build something unusual. Question something fundamental. And remember: in Io, as in programming, as in life—everything is possible when you embrace simplicity, seek uniformity, and remain open to new ideas.

Happy coding, and may your messages always find their slots.

End of Book

Appendices

For continued learning:

  • Appendix A: Io Language Reference
  • Appendix B: Standard Library Documentation
  • Appendix C: Building Io from Source
  • Appendix D: Creating C Addons
  • Appendix E: Io Resources and Community

Visit https://iolanguage.org for more information.

"Simplicity is the ultimate sophistication." — Leonardo da Vinci

+ + + + diff --git a/website/content/docs/12-concurrency.md b/Concurrency/_index.md similarity index 99% rename from website/content/docs/12-concurrency.md rename to Concurrency/_index.md index e733d34..6a16877 100644 --- a/website/content/docs/12-concurrency.md +++ b/Concurrency/_index.md @@ -1,12 +1,10 @@ --- -title: "Concurrency" -weight: 130 +title: Concurrency +topTitle: Io +subtitle: "Coroutines, actors, and futures for cooperative and message-passing concurrency." +nextSectionLink: true --- - - -# Chapter 12: Concurrency - Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io. ## Coroutines: Cooperative Multitasking @@ -737,6 +735,3 @@ wait(2) Io's concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages. The beauty of Io's approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with `@`, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible. - ---- - diff --git a/Concurrency/index.html b/Concurrency/index.html new file mode 100644 index 0000000..be177c6 --- /dev/null +++ b/Concurrency/index.html @@ -0,0 +1,601 @@ + + + + + + +Concurrency – Io + + + + +

Coroutines, actors, and futures for cooperative and message-passing concurrency.

Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io.

Coroutines: Cooperative Multitasking

Coroutines are the foundation of Io's concurrency model. They're lightweight threads that yield control cooperatively:

// Create a coroutine
+coro := coroutine(
+    5 repeat(i,
+        ("Coroutine: " .. i) println
+        yield  // Give control back
+    )
+)
+
+// Run it
+5 repeat(
+    "Main" println
+    coro resume  // Resume the coroutine
+)
+// Output interleaves Main and Coroutine messages

Compare with threads in other languages:

# Python with threads (preemptive)
+import threading
+def worker():
+    for i in range(5):
+        print(f"Thread: {i}")
+        # No explicit yield needed
+
+# Python with async (cooperative)
+async def worker():
+    for i in range(5):
+        print(f"Coroutine: {i}")
+        await asyncio.sleep(0)  # Explicit yield

Creating and Managing Coroutines

// Basic coroutine creation
+coro := Coroutine clone
+coro setRunMessage(message(
+    "Running in coroutine" println
+    self  // Return value
+))
+coro resume println  // "Running in coroutine", then returns self
+
+// Using @ for async execution
+future := obj @method(arg)  // Runs method in new coroutine
+result := future resolve     // Wait for result
+
+// Coroutine with arguments
+producer := coroutine(
+    10 repeat(i,
+        yield(i * i)  // Yield a value
+    )
+)
+
+5 repeat(
+    producer resume println  // 0, 1, 4, 9, 16
+)

Actors: Message-Passing Concurrency

Actors are objects that process messages asynchronously in their own coroutine:

// Create an actor
+Counter := Object clone
+Counter count := 0
+Counter increment := method(
+    count = count + 1
+    count
+)
+
+// Make it an actor
+counter := Counter clone
+counterActor := counter @  // @ makes it an actor
+
+// Send messages asynchronously
+future1 := counterActor increment
+future2 := counterActor increment
+future3 := counterActor increment
+
+// Get results
+future1 resolve println  // 1
+future2 resolve println  // 2
+future3 resolve println  // 3

This is similar to Erlang's actor model:

% Erlang
+counter(Count) ->
+    receive
+        {increment, From} ->
+            From ! Count + 1,
+            counter(Count + 1)
+    end.

Futures and Promises

Futures represent values that will be available later:

// Create a future manually
+future := Future clone
+
+// In another coroutine, fulfill it
+@(
+    wait(1)  // Simulate work
+    future setResult(42)
+)
+
+// Wait for result
+"Waiting..." println
+result := future resolve
+("Got result: " .. result) println  // Got result: 42
+
+// Futures from async calls
+slowOperation := method(n,
+    wait(n)
+    n * 2
+)
+
+f := self @slowOperation(2)
+"Doing other work..." println
+result := f resolve
+result println  // 4

Channels for Communication

Implement Go-style channels:

Channel := Object clone
+Channel init := method(
+    self queue := list()
+    self waiters := list()
+    self
+)
+
+Channel send := method(value,
+    if(waiters size > 0,
+        waiter := waiters removeFirst
+        waiter resume(value),
+        queue append(value)
+    )
+)
+
+Channel receive := method(
+    if(queue size > 0,
+        queue removeFirst,
+        waiters append(Coroutine currentCoroutine)
+        Coroutine currentCoroutine pause
+    )
+)
+
+// Usage
+ch := Channel clone init
+
+// Producer
+@(
+    5 repeat(i,
+        ch send(i * i)
+        wait(0.1)
+    )
+)
+
+// Consumer
+@(
+    5 repeat(
+        value := ch receive
+        ("Received: " .. value) println
+    )
+)
+
+wait(1)  // Let them run

Synchronization Primitives

Mutex (Mutual Exclusion)

Mutex := Object clone
+Mutex locked := false
+Mutex waitQueue := list()
+
+Mutex lock := method(
+    while(locked,
+        waitQueue append(Coroutine currentCoroutine)
+        Coroutine currentCoroutine pause
+    )
+    locked = true
+)
+
+Mutex unlock := method(
+    locked = false
+    if(waitQueue size > 0,
+        waiter := waitQueue removeFirst
+        waiter resume
+    )
+)
+
+Mutex synchronize := method(block,
+    lock
+    e := try(result := block call)
+    unlock
+    if(e, e raise, result)
+)
+
+// Usage
+sharedCounter := 0
+mutex := Mutex clone
+
+10 repeat(
+    @(
+        mutex synchronize(
+            temp := sharedCounter
+            yield  // Simulate race condition
+            sharedCounter = temp + 1
+        )
+    )
+)
+
+wait(0.5)
+sharedCounter println  // 10 (without mutex would be unpredictable)

Semaphore

Semaphore := Object clone
+Semaphore init := method(permits,
+    self permits := permits
+    self waitQueue := list()
+    self
+)
+
+Semaphore acquire := method(
+    while(permits <= 0,
+        waitQueue append(Coroutine currentCoroutine)
+        Coroutine currentCoroutine pause
+    )
+    permits = permits - 1
+)
+
+Semaphore release := method(
+    permits = permits + 1
+    if(waitQueue size > 0,
+        waiter := waitQueue removeFirst
+        waiter resume
+    )
+)
+
+// Usage: Limit concurrent connections
+connectionPool := Semaphore clone init(3)
+
+10 repeat(i,
+    @(
+        connectionPool acquire
+        ("Connection " .. i .. " started") println
+        wait(Random value)
+        ("Connection " .. i .. " finished") println
+        connectionPool release
+    )
+)
+
+wait(3)

Concurrent Collections

// Thread-safe list
+ConcurrentList := List clone
+ConcurrentList mutex := Mutex clone
+
+ConcurrentList append := method(item,
+    mutex synchronize(resend(item))
+)
+
+ConcurrentList at := method(index,
+    mutex synchronize(resend(index))
+)
+
+ConcurrentList size := method(
+    mutex synchronize(resend)
+)
+
+// Usage
+list := ConcurrentList clone
+
+10 repeat(i,
+    @(list append(i))
+)
+
+wait(0.1)
+list size println  // 10

Worker Pool Pattern

WorkerPool := Object clone
+WorkerPool init := method(workerCount,
+    self workers := list()
+    self taskQueue := Channel clone init
+    self results := Channel clone init
+    
+    workerCount repeat(
+        worker := @(
+            loop(
+                task := taskQueue receive
+                if(task isNil, break)  // Poison pill
+                
+                result := task call
+                results send(result)
+            )
+        )
+        workers append(worker)
+    )
+    
+    self
+)
+
+WorkerPool submit := method(task,
+    taskQueue send(task)
+)
+
+WorkerPool shutdown := method(
+    workers size repeat(taskQueue send(nil))
+)
+
+WorkerPool getResult := method(
+    results receive
+)
+
+// Usage
+pool := WorkerPool clone init(4)
+
+// Submit tasks
+10 repeat(i,
+    pool submit(block(
+        wait(Random value * 0.1)
+        i * i
+    ))
+)
+
+// Collect results
+results := list()
+10 repeat(
+    results append(pool getResult)
+)
+
+pool shutdown
+results println

Async/Await Pattern

// Implement async/await style
+Object async := method(
+    future := Future clone
+    
+    @(
+        e := try(result := call activated doMessage(call message, call sender))
+        if(e,
+            future setException(e),
+            future setResult(result)
+        )
+    )
+    
+    future
+)
+
+Object await := method(future,
+    future resolve
+)
+
+// Usage
+fetchData := async method(url,
+    wait(1)  // Simulate network delay
+    "Data from " .. url
+)
+
+processData := async method(
+    data1 := await(fetchData("api/users"))
+    data2 := await(fetchData("api/posts"))
+    data1 .. " + " .. data2
+)
+
+result := await(processData)
+result println  // Data from api/users + Data from api/posts

Parallel Map

List parallelMap := method(block,
+    futures := self map(item,
+        self @(block call(item))
+    )
+    
+    futures map(resolve)
+)
+
+// Usage
+numbers := list(1, 2, 3, 4, 5)
+
+// Sequential map
+time(
+    sequential := numbers map(n,
+        wait(0.1)
+        n * n
+    )
+)
+
+// Parallel map
+time(
+    parallel := numbers parallelMap(n,
+        wait(0.1)
+        n * n
+    )
+)
+
+sequential println  // list(1, 4, 9, 16, 25)
+parallel println    // list(1, 4, 9, 16, 25) but faster

Deadlock Detection

DeadlockDetector := Object clone
+DeadlockDetector init := method(
+    self resources := Map clone
+    self waitGraph := Map clone
+    self
+)
+
+DeadlockDetector requestResource := method(coroutine, resource,
+    // Add to wait graph
+    if(resources hasKey(resource),
+        owner := resources at(resource)
+        if(owner != coroutine,
+            waitGraph atPut(coroutine, resource)
+            
+            // Check for cycle
+            if(hasCycle(coroutine),
+                Exception raise("Deadlock detected!")
+            )
+        )
+    )
+)
+
+DeadlockDetector hasCycle := method(start,
+    // Simplified cycle detection
+    visited := list()
+    current := start
+    
+    while(waitGraph hasKey(current),
+        if(visited contains(current), return true)
+        visited append(current)
+        
+        resource := waitGraph at(current)
+        if(resources hasKey(resource),
+            current = resources at(resource)
+        ,
+            break
+        )
+    )
+    
+    false
+)

Event Loop

EventLoop := Object clone
+EventLoop init := method(
+    self events := list()
+    self running := true
+    self
+)
+
+EventLoop schedule := method(delay, block,
+    events append(list(Date now + delay, block))
+    events sortInPlaceBy(block(e, e at(0)))
+)
+
+EventLoop run := method(
+    while(running and events size > 0,
+        now := Date now
+        
+        while(events size > 0 and events first at(0) <= now,
+            event := events removeFirst
+            event at(1) @call
+        )
+        
+        if(events size > 0,
+            wait((events first at(0) - now) max(0))
+        )
+    )
+)
+
+EventLoop stop := method(running = false)
+
+// Usage
+loop := EventLoop clone init
+
+loop schedule(0.1, block("First" println))
+loop schedule(0.2, block("Second" println))
+loop schedule(0.15, block("Between" println))
+
+loop run

Common Patterns

Producer-Consumer

Buffer := Object clone
+Buffer init := method(capacity,
+    self items := list()
+    self capacity := capacity
+    self notFull := Semaphore clone init(capacity)
+    self notEmpty := Semaphore clone init(0)
+    self mutex := Mutex clone
+    self
+)
+
+Buffer put := method(item,
+    notFull acquire
+    mutex synchronize(items append(item))
+    notEmpty release
+)
+
+Buffer get := method(
+    notEmpty acquire
+    item := mutex synchronize(items removeFirst)
+    notFull release
+    item
+)
+
+// Usage
+buffer := Buffer clone init(5)
+
+// Producer
+@(
+    10 repeat(i,
+        ("Producing " .. i) println
+        buffer put(i)
+        wait(Random value * 0.1)
+    )
+)
+
+// Consumer
+@(
+    10 repeat(
+        item := buffer get
+        ("Consumed " .. item) println
+        wait(Random value * 0.2)
+    )
+)
+
+wait(3)

Fork-Join

Object forkJoin := method(tasks,
+    futures := tasks map(task,
+        @(task call)
+    )
+    
+    futures map(resolve)
+)
+
+// Parallel quicksort
+quicksort := method(list,
+    if(list size <= 1, return list)
+    
+    pivot := list at(list size / 2)
+    
+    results := forkJoin(list(
+        block(list select(x, x < pivot) quicksort),
+        block(list select(x, x == pivot)),
+        block(list select(x, x > pivot) quicksort)
+    ))
+    
+    results at(0) appendSeq(results at(1)) appendSeq(results at(2))
+)
+
+sorted := quicksort(list(3, 1, 4, 1, 5, 9, 2, 6))
+sorted println  // list(1, 1, 2, 3, 4, 5, 6, 9)

Performance Considerations

// Coroutines are lightweight
+time(
+    coroutines := list()
+    1000 repeat(i,
+        coroutines append(@(i * i))
+    )
+    coroutines map(resolve)
+)
+
+// But context switching has overhead
+benchmarkConcurrency := method(taskCount, taskWork,
+    // Sequential
+    seqTime := time(
+        taskCount repeat(i, taskWork call(i))
+    )
+    
+    // Concurrent
+    concTime := time(
+        futures := list()
+        taskCount repeat(i,
+            futures append(@(taskWork call(i)))
+        )
+        futures map(resolve)
+    )
+    
+    ("Sequential: " .. seqTime) println
+    ("Concurrent: " .. concTime) println
+    ("Speedup: " .. (seqTime / concTime)) println
+)
+
+// Light work - concurrency overhead dominates
+benchmarkConcurrency(100, block(i, i * i))
+
+// Heavy work - concurrency helps
+benchmarkConcurrency(10, block(i,
+    sum := 0
+    10000 repeat(j, sum = sum + j)
+    sum
+))

Exercises

  1. Rate Limiter: Implement a rate limiter that allows N operations per second.
  2. Parallel Reduce: Create a parallel version of reduce that divides work among workers.
  3. Actor Supervisor: Build a supervisor that restarts failed actors.
  4. CSP Channels: Implement Communicating Sequential Processes with select statement.
  5. STM: Implement Software Transactional Memory for conflict-free concurrent updates.

Real-World Example: Web Scraper

WebScraper := Object clone
+WebScraper init := method(maxConcurrent,
+    self semaphore := Semaphore clone init(maxConcurrent)
+    self visited := ConcurrentSet clone init
+    self results := ConcurrentList clone
+    self
+)
+
+WebScraper scrape := method(urls,
+    futures := list()
+    
+    urls foreach(url,
+        if(visited contains(url) not,
+            visited add(url)
+            
+            future := @(
+                semaphore acquire
+                e := try(
+                    ("Scraping " .. url) println
+                    // Simulate HTTP request
+                    wait(Random value)
+                    
+                    content := "Content from " .. url
+                    results append(Map with("url", url, "content", content))
+                    
+                    // Find more URLs (simplified)
+                    if(Random value < 0.3,
+                        newUrl := url .. "/" .. Random value round
+                        self scrape(list(newUrl))
+                    )
+                )
+                
+                semaphore release
+                if(e, ("Error scraping " .. url .. ": " .. e message) println)
+            )
+            
+            futures append(future)
+        )
+    )
+    
+    futures map(resolve)
+    self
+)
+
+// Usage
+scraper := WebScraper clone init(3)
+scraper scrape(list(
+    "https://example.com",
+    "https://example.org",
+    "https://example.net"
+))
+
+wait(2)
+("Scraped " .. scraper results size .. " pages") println

Conclusion

Io's concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages.

The beauty of Io's approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with @, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible.

+ + + + diff --git a/website/content/docs/07-control-flow.md b/Control-Flow/_index.md similarity index 98% rename from website/content/docs/07-control-flow.md rename to Control-Flow/_index.md index 743c06a..aeaada5 100644 --- a/website/content/docs/07-control-flow.md +++ b/Control-Flow/_index.md @@ -1,12 +1,10 @@ --- -title: "Control Flow" -weight: 80 +title: Control Flow +topTitle: Io +subtitle: "if, while, for, and friends are just methods—and you can write your own." +nextSectionLink: true --- - - -# Chapter 7: Control Flow - In most programming languages, control flow structures like `if`, `while`, and `for` are built-in syntax with special rules. In Io, they're just methods that receive messages. This chapter explores how Io's message-passing philosophy extends to control flow, and how you can create your own control structures. ## Everything Is a Message @@ -673,6 +671,3 @@ This flexibility allows you to: - Understand exactly how your program executes The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs. - ---- - diff --git a/Control-Flow/index.html b/Control-Flow/index.html new file mode 100644 index 0000000..91cb587 --- /dev/null +++ b/Control-Flow/index.html @@ -0,0 +1,463 @@ + + + + + + +Control Flow – Io + + + + +

if, while, for, and friends are just methods—and you can write your own.

In most programming languages, control flow structures like if, while, and for are built-in syntax with special rules. In Io, they're just methods that receive messages. This chapter explores how Io's message-passing philosophy extends to control flow, and how you can create your own control structures.

Everything Is a Message

Let's start with a simple comparison. In C or Java:

if (x > 5) {
+    printf("Big\n");
+} else {
+    printf("Small\n");
+}

This is special syntax that the compiler understands. But in Io:

if(x > 5,
+    "Big" println,
+    "Small" println
+)

The if is just a method call! You can even see its implementation:

if println
+// method(...)
+
+// You could redefine it (don't actually do this!)
+Object if := method(condition, trueBlock, falseBlock,
+    "Making a decision!" println
+    resend  // Call original if
+)

The if Method

The if method takes two or three arguments:

// Two arguments: if-then
+if(temperature > 30,
+    "It's hot!" println
+)
+
+// Three arguments: if-then-else
+if(temperature > 30,
+    "It's hot!" println,
+    "It's nice!" println
+)
+
+// if returns the value of the executed block
+result := if(5 > 3, "yes", "no")
+result println  // "yes"
+
+// Nested if
+category := if(score > 90, "A",
+    if(score > 80, "B",
+        if(score > 70, "C", "F")
+    )
+)

Understanding Blocks

The key to Io's control flow is that code blocks are objects that aren't evaluated immediately:

// This prints immediately
+"Hello" println
+
+// This creates a block object but doesn't execute it
+block := method("Hello" println)
+
+// Execute it later
+block call  // Now it prints "Hello"
+
+// Blocks in if
+if(true,
+    "This is a block" println  // Not executed until if decides to
+)

This lazy evaluation is crucial. If both branches of an if were evaluated immediately, both would execute!

// In a hypothetical eager language:
+eagerIf := method(condition, trueValue, falseValue,
+    if(condition, trueValue, falseValue)
+)
+
+x := 5
+eagerIf(x > 3,
+    "Greater" println,  // This executes immediately
+    "Lesser" println    // This also executes immediately!
+)
+// Would print both!
+
+// But Io's if receives unevaluated blocks
+if(x > 3,
+    "Greater" println,  // Only this executes
+    "Lesser" println    // This never executes
+)

The while Loop

The while method repeatedly evaluates its condition and body:

i := 0
+while(i < 5,
+    i println
+    i = i + 1
+)
+// Prints 0, 1, 2, 3, 4
+
+// while returns nil by default
+result := while(false, "Never runs")
+result println  // nil
+
+// Infinite loops
+while(true,
+    input := File standardInput readLine
+    if(input == "quit", break)
+    ("You said: " .. input) println
+)

The for Loop

The for method provides a counting loop:

// Basic for loop
+for(i, 1, 5,
+    i println
+)
+// Prints 1, 2, 3, 4, 5
+
+// With step
+for(i, 0, 10, 2,
+    i println
+)
+// Prints 0, 2, 4, 6, 8, 10
+
+// Backward
+for(i, 5, 1,
+    i println
+)
+// Prints 5, 4, 3, 2, 1
+
+// for can return values
+sum := 0
+for(i, 1, 100,
+    sum = sum + i
+)
+sum println  // 5050

The loop Method

Io provides a loop method for infinite loops:

count := 0
+loop(
+    count = count + 1
+    if(count > 10, break)
+    count println
+)
+
+// Equivalent to while(true, ...)

break and continue

These work like in other languages, but they're methods too:

// break exits the loop
+for(i, 1, 10,
+    if(i == 5, break)
+    i println
+)
+// Prints 1, 2, 3, 4
+
+// continue skips to next iteration
+for(i, 1, 10,
+    if(i % 2 == 0, continue)
+    i println
+)
+// Prints 1, 3, 5, 7, 9
+
+// break can return a value
+result := for(i, 1, 100,
+    if(i * i > 50, break(i))
+)
+result println  // 8 (first i where i*i > 50)

The repeat Method

A simpler counting mechanism:

5 repeat("Hello" println)
+// Prints "Hello" 5 times
+
+// repeat with index
+5 repeat(i, 
+    ("Count: " .. i) println
+)
+// Count: 0
+// Count: 1
+// Count: 2
+// Count: 3
+// Count: 4

Creating Custom Control Structures

Since control structures are just methods, you can create your own:

// unless: opposite of if
+Object unless := method(condition, falseBlock,
+    if(condition not, falseBlock call)
+)
+
+unless(5 > 10,
+    "5 is not greater than 10" println
+)
+
+// until: opposite of while
+Object until := method(condition, body,
+    while(condition not, body)
+)
+
+x := 0
+until(x > 5,
+    x println
+    x = x + 1
+)
+
+// times: repeat n times with cleaner syntax
+Number times := method(body,
+    for(i, 1, self, body)
+)
+
+3 times("Hello" println)

The elseif Pattern

Io uses elseif for chained conditionals:

score := 85
+
+if(score >= 90) then(
+    "A" println
+) elseif(score >= 80) then(
+    "B" println
+) elseif(score >= 70) then(
+    "C" println
+) else(
+    "F" println
+)
+// Prints "B"
+
+// This is actually a chain of methods
+// if returns a special object when false
+// that object has elseif and else methods

Switch-like Behavior

Io doesn't have a switch statement, but you can build one:

Object switch := method(value,
+    self switchValue := value
+    self
+)
+
+Object case := method(testValue, action,
+    if(switchValue == testValue,
+        action call
+        self switchMatched := true
+    )
+    self
+)
+
+Object default := method(action,
+    if(hasSlot("switchMatched") not,
+        action call
+    )
+    self
+)
+
+// Usage
+day := "Tuesday"
+
+switch(day) case("Monday", 
+    "Start of the week" println
+) case("Tuesday",
+    "Second day" println
+) case("Friday",
+    "TGIF!" println
+) default(
+    "Regular day" println
+)
+// Prints "Second day"

Pattern Matching

Build more sophisticated matching:

Object match := method(
+    self matchValue := call evalArgAt(0)
+    self matchContext := call sender
+    self
+)
+
+Object when := method(pattern, action,
+    if(hasSlot("matchFound") not,
+        matched := false
+        
+        // Check different pattern types
+        if(pattern type == "Block",
+            matched = pattern call(matchValue),
+            matched = (pattern == matchValue)
+        )
+        
+        if(matched,
+            self matchResult := action call(matchValue)
+            self matchFound := true
+        )
+    )
+    self
+)
+
+Object otherwise := method(action,
+    if(hasSlot("matchFound") not,
+        self matchResult := action call(matchValue)
+    )
+    matchResult
+)
+
+// Usage
+result := match(x) when(
+    block(v, v < 0), 
+    method(v, "negative")
+) when(
+    0,
+    method(v, "zero")
+) when(
+    block(v, v > 0),
+    method(v, "positive")
+) otherwise(
+    method(v, "unknown")
+)

Iterating Over Collections

Collections have their own iteration methods:

// List iteration
+list(1, 2, 3) foreach(item,
+    item println
+)
+
+// With index
+list("a", "b", "c") foreach(i, item,
+    (i .. ": " .. item) println
+)
+// 0: a
+// 1: b
+// 2: c
+
+// Map iteration
+map := Map clone
+map atPut("name", "Alice")
+map atPut("age", 30)
+
+map foreach(key, value,
+    (key .. " = " .. value) println
+)
+// name = Alice
+// age = 30

Functional Control Flow

Io supports functional programming patterns:

// map: transform each element
+squares := list(1, 2, 3, 4) map(x, x * x)
+squares println  // list(1, 4, 9, 16)
+
+// select: filter elements
+evens := list(1, 2, 3, 4, 5, 6) select(x, x % 2 == 0)
+evens println  // list(2, 4, 6)
+
+// detect: find first matching element
+first_big := list(1, 3, 5, 7, 9) detect(x, x > 5)
+first_big println  // 7
+
+// reduce: aggregate elements
+sum := list(1, 2, 3, 4, 5) reduce(+)
+sum println  // 15
+
+product := list(1, 2, 3, 4) reduce(a, b, a * b)
+product println  // 24

Lazy Evaluation Control

Create control structures with lazy evaluation:

Object lazyIf := method(
+    condition := call argAt(0)
+    trueBlock := call argAt(1)
+    falseBlock := call argAt(2)
+    
+    if(condition doInContext(call sender),
+        trueBlock doInContext(call sender),
+        if(falseBlock,
+            falseBlock doInContext(call sender)
+        )
+    )
+)
+
+// Both condition and blocks are lazy
+x := 5
+lazyIf(x > 3 and computeExpensive(),
+    "True branch" println,
+    "False branch" println
+)

Exception Handling as Control Flow

Io's try is also a control flow method:

try(
+    // Code that might fail
+    riskyOperation()
+) catch(Exception,
+    "An error occurred" println
+)
+
+// try-catch-finally pattern
+result := try(
+    file := File with("data.txt") openForReading
+    file contents
+) catch(Exception, e,
+    ("Error: " .. e message) println
+    nil
+) finally(
+    if(file, file close)
+)

Performance Considerations

Since control structures are methods, they have overhead:

// Method-based loop (slower)
+i := 0
+while(i < 1000000,
+    i = i + 1
+)
+
+// But you can't really avoid it in Io
+// The language is optimized for expressiveness over speed

Advanced: Coroutine-based Control

Io's coroutines enable advanced control flow:

// Generator pattern
+Generator := Object clone
+Generator init := method(
+    self coro := Coroutine currentCoroutine
+    self
+)
+
+Generator yield := method(value,
+    coro pause(value)
+)
+
+Generator fibonacci := method(
+    a := 0
+    b := 1
+    loop(
+        yield(a)
+        temp := a + b
+        a = b
+        b = temp
+    )
+)
+
+// Usage
+gen := Generator clone
+fib := gen @fibonacci  // @ runs in new coroutine
+
+10 repeat(
+    fib resume println
+)
+// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Common Patterns

Early Return Pattern

Object findFirst := method(list, condition,
+    list foreach(item,
+        if(condition call(item),
+            return item
+        )
+    )
+    nil
+)
+
+result := findFirst(list(1, 2, 3, 4, 5), 
+    block(x, x > 3)
+)
+result println  // 4

Guard Clause Pattern

processData := method(data,
+    if(data isNil, return "No data")
+    if(data size == 0, return "Empty data")
+    if(data size > 1000, return "Too much data")
+    
+    // Process data
+    "Processed" return
+)

Loop with State

Object loopWithState := method(initial, condition, update, body,
+    state := initial
+    while(condition call(state),
+        body call(state)
+        state = update call(state)
+    )
+    state
+)
+
+// Sum squares until sum > 100
+result := loopWithState(
+    list(0, 1),  // [sum, n]
+    block(state, state at(0) <= 100),
+    block(state, list(state at(0) + state at(1) squared, state at(1) + 1)),
+    block(state, ("n=" .. state at(1) .. " sum=" .. state at(0)) println)
+)

Debugging Control Flow

Object trace := method(label,
+    (label .. " - evaluating") println
+    self
+)
+
+Object debugIf := method(condition, trueBlock, falseBlock,
+    "Evaluating condition..." println
+    result := condition
+    ("Condition is: " .. result) println
+    
+    if(result,
+        "Taking true branch" println
+        trueBlock,
+        "Taking false branch" println
+        falseBlock
+    )
+)
+
+x := 5
+debugIf(x trace("x") > trace("3") 3,
+    "Greater" println,
+    "Lesser" println
+)

Exercises

  1. do-while Loop: Implement a doWhile method that executes the body at least once.
  2. for-each with Break: Create a forEachBreakable that allows breaking with a return value.
  3. Retry Logic: Build a retry control structure that retries an operation n times on failure.
  4. Parallel If: Create a parallelIf that evaluates both branches concurrently and returns the first to complete.
  5. State Machine: Implement a state machine DSL using custom control structures.

Real-World Example: Retry with Backoff

Object retryWithBackoff := method(maxAttempts, baseDelay, operation,
+    attempt := 1
+    lastError := nil
+    
+    while(attempt <= maxAttempts,
+        try(
+            return operation call(attempt)
+        ) catch(Exception, e,
+            lastError = e
+            if(attempt < maxAttempts,
+                delay := baseDelay * (2 pow(attempt - 1))
+                ("Attempt " .. attempt .. " failed, waiting " .. delay .. "ms") println
+                System sleep(delay / 1000)
+            )
+        )
+        attempt = attempt + 1
+    )
+    
+    Exception raise("Failed after " .. maxAttempts .. " attempts: " .. lastError message)
+)
+
+// Usage
+result := retryWithBackoff(3, 100,
+    block(attempt,
+        ("Trying attempt " .. attempt) println
+        if(Random value < 0.7,
+            Exception raise("Random failure"),
+            "Success!"
+        )
+    )
+)

Conclusion

Io's approach to control flow—implementing everything as methods rather than special syntax—is both radical and elegant. It demonstrates the power of Io's uniform message-passing model: when everything is a message, even fundamental programming constructs become malleable and extensible.

This flexibility allows you to:

  • Create domain-specific control structures
  • Implement new programming paradigms
  • Debug and trace control flow
  • Understand exactly how your program executes

The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs.

+ + + + diff --git a/website/content/docs/13-domain-specific-languages.md b/Domain-Specific-Languages/_index.md similarity index 99% rename from website/content/docs/13-domain-specific-languages.md rename to Domain-Specific-Languages/_index.md index f49f0f2..311cab8 100644 --- a/website/content/docs/13-domain-specific-languages.md +++ b/Domain-Specific-Languages/_index.md @@ -1,12 +1,10 @@ --- -title: "Domain-Specific Languages" -weight: 140 +title: Domain-Specific Languages +topTitle: Io +subtitle: "Using Io's minimal syntax and metaprogramming to design expressive DSLs." +nextSectionLink: true --- - - -# Chapter 13: Domain-Specific Languages - Io's minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains. ## Why Io Excels at DSLs @@ -814,6 +812,3 @@ migration toSQL println Domain-Specific Languages in Io demonstrate the language's expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language. The key to successful DSLs in Io is understanding that you're not fighting against language syntax—you're working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable. - ---- - diff --git a/Domain-Specific-Languages/index.html b/Domain-Specific-Languages/index.html new file mode 100644 index 0000000..e2f0404 --- /dev/null +++ b/Domain-Specific-Languages/index.html @@ -0,0 +1,712 @@ + + + + + + +Domain-Specific Languages – Io + + + + +

Domain-Specific Languages

← The Io Programming Language
Io

Using Io's minimal syntax and metaprogramming to design expressive DSLs.

Io's minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains.

Why Io Excels at DSLs

Several features make Io particularly suitable for DSLs:

  1. Minimal syntax - Less language machinery to work around
  2. Optional parentheses - Clean, readable DSL code
  3. Message chains - Natural expression of domain concepts
  4. Runtime flexibility - Modify behavior on the fly
  5. Homoiconicity - Code as manipulable data

Compare a hypothetical DSL in Io vs Ruby:

// Io DSL - clean, minimal
+recipe "Chocolate Cake" makes(8) servings {
+    ingredient "flour" amount(2) cups
+    ingredient "sugar" amount(1.5) cups
+    
+    step "Mix dry ingredients"
+    step "Add wet ingredients"
+    bake at(350) degrees for(30) minutes
+}
# Ruby DSL - more syntax artifacts
+recipe "Chocolate Cake" do
+    makes 8.servings
+    
+    ingredient "flour", amount: 2.cups
+    ingredient "sugar", amount: 1.5.cups
+    
+    step "Mix dry ingredients"
+    step "Add wet ingredients"
+    bake at: 350.degrees, for: 30.minutes
+end

Building Your First DSL

Let's create a simple configuration DSL:

// Define the DSL
+Config := Object clone
+Config settings := Map clone
+
+Config set := method(key, value,
+    settings atPut(key asString, value)
+    self  // For chaining
+)
+
+Config get := method(key,
+    settings at(key asString)
+)
+
+Config section := method(name,
+    sec := Config clone
+    settings atPut(name asString, sec)
+    sec
+)
+
+// Use the DSL
+config := Config clone
+config set("host", "localhost") \
+      set("port", 8080) \
+      section("database") \
+          set("driver", "postgresql") \
+          set("name", "myapp")
+
+config get("host") println           // localhost
+config get("database") get("driver") println  // postgresql

HTML Builder DSL

A more complex example - generating HTML:

HTML := Object clone
+
+// Handle any tag name via forward
+HTML forward := method(
+    tagName := call message name
+    attributes := Map clone
+    children := list()
+    
+    // Process arguments
+    call message arguments foreach(arg,
+        argValue := call sender doMessage(arg)
+        
+        if(argValue type == "Map",
+            // It's attributes
+            attributes = argValue
+        ,
+            // It's content or children
+            if(argValue type == "Sequence",
+                children append(argValue),
+                if(argValue type == "List",
+                    children appendSeq(argValue),
+                    children append(argValue asString)
+                )
+            )
+        )
+    )
+    
+    // Build HTML
+    result := "<" .. tagName
+    attributes foreach(key, value,
+        result = result .. " " .. key .. "=\"" .. value .. "\""
+    )
+    
+    if(children size == 0,
+        result = result .. " />",
+        result = result .. ">"
+        children foreach(child, result = result .. child)
+        result = result .. "</" .. tagName .. ">"
+    )
+    
+    result
+)
+
+// Helper for attributes
+Object attrs := method(
+    args := call message arguments
+    map := Map clone
+    
+    args foreach(arg,
+        pair := arg name split(":")
+        if(pair size == 2,
+            map atPut(pair at(0), call sender doMessage(arg arguments at(0)))
+        )
+    )
+    map
+)
+
+// Usage
+html := HTML clone
+
+page := html div(attrs(class: "container", id: "main"),
+    html h1("Welcome to My Site"),
+    html p(attrs(class: "intro"), 
+        "This is a paragraph with ",
+        html strong("bold text"),
+        " in it."
+    ),
+    html ul(
+        html li("First item"),
+        html li("Second item"),
+        html li("Third item")
+    )
+)
+
+page println
+// <div class="container" id="main"><h1>Welcome to My Site</h1>...

SQL Query Builder

Query := Object clone
+Query init := method(
+    self selections := list("*")
+    self tables := list()
+    self conditions := list()
+    self joins := list()
+    self
+)
+
+Query select := method(
+    self selections = call message arguments map(arg,
+        call sender doMessage(arg) asString
+    )
+    self
+)
+
+Query from := method(table,
+    tables append(table)
+    self
+)
+
+Query where := method(
+    condition := call argAt(0)
+    conditions append(condition code asString)
+    self
+)
+
+Query join := method(table, on,
+    joins append("JOIN " .. table .. " ON " .. on code asString)
+    self
+)
+
+Query toSQL := method(
+    sql := "SELECT " .. selections join(", ")
+    sql = sql .. " FROM " .. tables join(", ")
+    
+    if(joins size > 0,
+        sql = sql .. " " .. joins join(" ")
+    )
+    
+    if(conditions size > 0,
+        sql = sql .. " WHERE " .. conditions join(" AND ")
+    )
+    
+    sql
+)
+
+// Usage
+query := Query clone init
+
+sql := query select("name", "age", "email") \
+            from("users") \
+            join("profiles", users.id == profiles.user_id) \
+            where(age > 18) \
+            where(status == "active") \
+            toSQL
+
+sql println
+// SELECT name, age, email FROM users JOIN profiles ON users.id == profiles.user_id WHERE age > 18 AND status == "active"

Unit Testing DSL

TestSuite := Object clone
+TestSuite tests := list()
+TestSuite currentTest := nil
+
+TestSuite describe := method(description,
+    suite := TestSuite clone
+    suite description := description
+    suite tests = list()
+    
+    # Execute the test definition block
+    call evalArgAt(1)
+    
+    suite
+)
+
+TestSuite it := method(testName,
+    test := Object clone
+    test name := testName
+    test block := call argAt(1)
+    tests append(test)
+)
+
+TestSuite before := method(
+    self beforeBlock := call argAt(0)
+)
+
+TestSuite after := method(
+    self afterBlock := call argAt(0)
+)
+
+TestSuite run := method(
+    ("\n" .. description) println
+    ("=" repeated(description size)) println
+    
+    passed := 0
+    failed := 0
+    
+    tests foreach(test,
+        if(hasSlot("beforeBlock"), beforeBlock doInContext(self))
+        
+        e := try(
+            test block doInContext(self)
+            ("✓ " .. test name) println
+            passed = passed + 1
+        ) catch(Exception, e,
+            ("✗ " .. test name) println
+            ("  " .. e message) println
+            failed = failed + 1
+        )
+        
+        if(hasSlot("afterBlock"), afterBlock doInContext(self))
+    )
+    
+    ("\nPassed: " .. passed .. ", Failed: " .. failed) println
+)
+
+// Assertion helpers
+Object expect := method(actual,
+    Expectation clone setActual(actual)
+)
+
+Expectation := Object clone
+Expectation setActual := method(value,
+    self actual := value
+    self
+)
+
+Expectation toBe := method(expected,
+    if(actual != expected,
+        Exception raise("Expected " .. expected .. " but got " .. actual)
+    )
+)
+
+Expectation toEqual := method(expected,
+    if(actual != expected,
+        Exception raise("Expected " .. expected .. " but got " .. actual)
+    )
+)
+
+Expectation toContain := method(item,
+    if(actual contains(item) not,
+        Exception raise("Expected " .. actual .. " to contain " .. item)
+    )
+)
+
+// Usage
+MathTests := describe("Math operations",
+    before(
+        self calculator := Object clone
+        calculator add := method(a, b, a + b)
+        calculator multiply := method(a, b, a * b)
+    )
+    
+    it("should add numbers correctly",
+        expect(calculator add(2, 3)) toBe(5)
+        expect(calculator add(-1, 1)) toBe(0)
+    )
+    
+    it("should multiply numbers correctly",
+        expect(calculator multiply(3, 4)) toBe(12)
+        expect(calculator multiply(0, 5)) toBe(0)
+    )
+    
+    it("should handle edge cases",
+        expect(calculator add(0, 0)) toBe(0)
+    )
+)
+
+MathTests run

State Machine DSL

StateMachine := Object clone
+StateMachine states := Map clone
+StateMachine currentState := nil
+StateMachine initialState := nil
+
+StateMachine state := method(name,
+    s := State clone
+    s name := name
+    s machine := self
+    states atPut(name, s)
+    
+    if(initialState isNil, initialState = s)
+    
+    s
+)
+
+State := Object clone
+State transitions := Map clone
+
+State on := method(event, targetState,
+    transitions atPut(event, targetState)
+    self
+)
+
+State enter := method(
+    self enterBlock := call argAt(0)
+    self
+)
+
+State exit := method(
+    self exitBlock := call argAt(0)
+    self
+)
+
+StateMachine start := method(
+    currentState = initialState
+    if(currentState hasSlot("enterBlock"),
+        currentState enterBlock call
+    )
+)
+
+StateMachine trigger := method(event,
+    if(currentState transitions hasKey(event),
+        nextStateName := currentState transitions at(event)
+        nextState := states at(nextStateName)
+        
+        if(currentState hasSlot("exitBlock"),
+            currentState exitBlock call
+        )
+        
+        ("Transitioning from " .. currentState name .. " to " .. nextStateName) println
+        currentState = nextState
+        
+        if(currentState hasSlot("enterBlock"),
+            currentState enterBlock call
+        )
+    ,
+        ("No transition for event '" .. event .. "' from state '" .. currentState name .. "'") println
+    )
+)
+
+// Usage
+door := StateMachine clone
+
+door state("closed") \
+    on("open", "opened") \
+    on("lock", "locked") \
+    enter(block("Door is now closed" println))
+
+door state("opened") \
+    on("close", "closed") \
+    enter(block("Door is now open" println))
+
+door state("locked") \
+    on("unlock", "closed") \
+    enter(block("Door is now locked" println))
+
+door start
+door trigger("open")   // Transitioning from closed to opened
+door trigger("close")  // Transitioning from opened to closed
+door trigger("lock")   // Transitioning from closed to locked
+door trigger("open")   // No transition for event 'open' from state 'locked'

Routing DSL (Web Framework Style)

Router := Object clone
+Router routes := list()
+
+Router get := method(path,
+    addRoute("GET", path, call argAt(1))
+)
+
+Router post := method(path,
+    addRoute("POST", path, call argAt(1))
+)
+
+Router put := method(path,
+    addRoute("PUT", path, call argAt(1))
+)
+
+Router delete := method(path,
+    addRoute("DELETE", path, call argAt(1))
+)
+
+Router addRoute := method(method, path, handler,
+    routes append(Map with(
+        "method", method,
+        "path", path,
+        "pattern", pathToRegex(path),
+        "handler", handler
+    ))
+    self
+)
+
+Router pathToRegex := method(path,
+    // Convert :param to regex groups
+    pattern := path
+    pattern = pattern replaceAllRegex(":([^/]+)", "([^/]+)")
+    "^" .. pattern .. "$"
+)
+
+Router handle := method(method, path,
+    routes foreach(route,
+        if(route at("method") == method,
+            match := path matchesRegex(route at("pattern"))
+            if(match,
+                params := extractParams(route at("path"), path, match)
+                return route at("handler") call(params)
+            )
+        )
+    )
+    
+    Map with("status", 404, "body", "Not Found")
+)
+
+Router extractParams := method(pattern, path, match,
+    params := Map clone
+    
+    // Extract named parameters
+    names := pattern allMatchesOfRegex(":([^/]+)") map(m, m at(1))
+    names foreach(i, name,
+        params atPut(name, match at(i + 1))
+    )
+    
+    params
+)
+
+// Usage
+app := Router clone
+
+app get("/", block(params,
+    Map with("status", 200, "body", "Welcome to the home page")
+))
+
+app get("/users/:id", block(params,
+    Map with("status", 200, "body", "User " .. params at("id"))
+))
+
+app post("/users", block(params,
+    Map with("status", 201, "body", "User created")
+))
+
+// Simulate requests
+app handle("GET", "/") at("body") println        // Welcome to the home page
+app handle("GET", "/users/123") at("body") println  // User 123
+app handle("POST", "/users") at("body") println  // User created
+app handle("GET", "/unknown") at("body") println // Not Found

Data Validation DSL

Validator := Object clone
+
+Validator field := method(name,
+    f := Field clone
+    f name := name
+    f rules := list()
+    self currentField := f
+    f
+)
+
+Field := Object clone
+
+Field required := method(
+    rules append(block(value,
+        if(value isNil or value == "",
+            Exception raise(name .. " is required"),
+            true
+        )
+    ))
+    self
+)
+
+Field minLength := method(min,
+    rules append(block(value,
+        if(value size < min,
+            Exception raise(name .. " must be at least " .. min .. " characters"),
+            true
+        )
+    ))
+    self
+)
+
+Field maxLength := method(max,
+    rules append(block(value,
+        if(value size > max,
+            Exception raise(name .. " must be at most " .. max .. " characters"),
+            true
+        )
+    ))
+    self
+)
+
+Field matches := method(regex,
+    rules append(block(value,
+        if(value matchesRegex(regex) not,
+            Exception raise(name .. " has invalid format"),
+            true
+        )
+    ))
+    self
+)
+
+Field validate := method(value,
+    rules foreach(rule,
+        rule call(value)
+    )
+    true
+)
+
+// Usage
+userValidator := Validator clone
+
+username := userValidator field("username") \
+    required \
+    minLength(3) \
+    maxLength(20) \
+    matches("^[a-zA-Z0-9_]+$")
+
+email := userValidator field("email") \
+    required \
+    matches("^[^@]+@[^@]+\\.[^@]+$")
+
+// Test validation
+try(
+    username validate("ab")
+) catch(Exception, e,
+    e message println  // username must be at least 3 characters
+)
+
+try(
+    email validate("not-an-email")
+) catch(Exception, e,
+    e message println  // email has invalid format
+)
+
+username validate("valid_user123") println  // true
+email validate("user@example.com") println  // true

DSL Best Practices

1. Natural Language Flow

// Good - reads naturally
+recipe needs(2) cups of("flour")
+order shipping priority within(3) days
+
+// Bad - programmer-centric
+recipe setAmount(2) setUnit("cups") setIngredient("flour")
+order setShipping("priority") setDeliveryDays(3)

2. Method Chaining

// Enable fluent interfaces
+Object withChaining := method(
+    call message arguments foreach(arg,
+        slotName := arg name
+        self setSlot(slotName, call evalArgAt(0))
+    )
+    self  // Always return self
+)
+
+Person := Object clone
+Person configure := method(
+    withChaining(
+        name(n, self name := n),
+        age(a, self age := a),
+        email(e, self email := e)
+    )
+)
+
+person := Person clone configure \
+    name("Alice") \
+    age(30) \
+    email("alice@example.com")

3. Context Management

DSLContext := Object clone
+DSLContext stack := list()
+
+DSLContext push := method(obj,
+    stack append(obj)
+)
+
+DSLContext pop := method(
+    stack pop
+)
+
+DSLContext current := method(
+    stack last
+)
+
+DSLContext with := method(obj, block,
+    push(obj)
+    e := try(result := block call)
+    pop
+    if(e, e raise, result)
+)
+
+// Usage in DSL
+Form := Object clone
+Form fields := list()
+
+Form field := method(name,
+    f := Field clone
+    f name := name
+    DSLContext with(f,
+        call evalArgAt(1)
+    )
+    fields append(f)
+)
+
+Field label := method(text,
+    DSLContext current label := text
+)

Exercises

  1. CSS DSL: Create a DSL for generating CSS with nested rules and variables.
  2. Graph Description Language: Build a DSL for describing graphs and their relationships.
  3. Build System DSL: Implement a make/rake-like build system DSL.
  4. BDD Testing DSL: Create a Behavior-Driven Development testing framework.
  5. Configuration Management: Build a DSL for system configuration management.

Real-World Example: Migration DSL

Migration := Object clone
+Migration changes := list()
+
+Migration createTable := method(name,
+    table := TableDefinition clone
+    table name := name
+    table columns := list()
+    
+    call evalArgAt(1)
+    
+    changes append(Map with(
+        "type", "createTable",
+        "table", table
+    ))
+    self
+)
+
+Migration dropTable := method(name,
+    changes append(Map with(
+        "type", "dropTable",
+        "name", name
+    ))
+    self
+)
+
+TableDefinition := Object clone
+
+TableDefinition column := method(name, type,
+    columns append(Map with(
+        "name", name,
+        "type", type,
+        "constraints", list()
+    ))
+    self
+)
+
+TableDefinition primaryKey := method(col,
+    columns last at("constraints") append("PRIMARY KEY")
+    self
+)
+
+TableDefinition notNull := method(
+    columns last at("constraints") append("NOT NULL")
+    self
+)
+
+TableDefinition unique := method(
+    columns last at("constraints") append("UNIQUE")
+    self
+)
+
+Migration toSQL := method(
+    sql := list()
+    
+    changes foreach(change,
+        if(change at("type") == "createTable",
+            table := change at("table")
+            stmt := "CREATE TABLE " .. table name .. " (\n"
+            
+            cols := table columns map(col,
+                "  " .. col at("name") .. " " .. col at("type") .. 
+                if(col at("constraints") size > 0,
+                    " " .. col at("constraints") join(" "),
+                    ""
+                )
+            )
+            
+            stmt = stmt .. cols join(",\n") .. "\n);"
+            sql append(stmt)
+        )
+        
+        if(change at("type") == "dropTable",
+            sql append("DROP TABLE " .. change at("name") .. ";")
+        )
+    )
+    
+    sql join("\n\n")
+)
+
+// Usage
+migration := Migration clone
+
+migration createTable("users",
+    column("id", "INTEGER") primaryKey,
+    column("username", "VARCHAR(50)") notNull unique,
+    column("email", "VARCHAR(100)") notNull unique,
+    column("created_at", "TIMESTAMP") notNull
+)
+
+migration createTable("posts",
+    column("id", "INTEGER") primaryKey,
+    column("user_id", "INTEGER") notNull,
+    column("title", "VARCHAR(200)") notNull,
+    column("content", "TEXT"),
+    column("published_at", "TIMESTAMP")
+)
+
+migration toSQL println

Conclusion

Domain-Specific Languages in Io demonstrate the language's expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language.

The key to successful DSLs in Io is understanding that you're not fighting against language syntax—you're working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable.

+ + + + diff --git a/website/content/docs/17-ecosystem-and-libraries.md b/Ecosystem-and-Libraries/_index.md similarity index 99% rename from website/content/docs/17-ecosystem-and-libraries.md rename to Ecosystem-and-Libraries/_index.md index d60f534..b08e53a 100644 --- a/website/content/docs/17-ecosystem-and-libraries.md +++ b/Ecosystem-and-Libraries/_index.md @@ -1,12 +1,10 @@ --- -title: "Ecosystem and Libraries" -weight: 180 +title: Ecosystem and Libraries +topTitle: Io +subtitle: "The available libraries, tools, and community resources around Io." +nextSectionLink: true --- - - -# Chapter 17: Ecosystem and Libraries - While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem. ## Core Libraries @@ -862,6 +860,3 @@ The Io ecosystem continues to evolve with: While Io's ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need. The key to working effectively with Io's ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need. - ---- - diff --git a/Ecosystem-and-Libraries/index.html b/Ecosystem-and-Libraries/index.html new file mode 100644 index 0000000..6655729 --- /dev/null +++ b/Ecosystem-and-Libraries/index.html @@ -0,0 +1,704 @@ + + + + + + +Ecosystem and Libraries – Io + + + + +

Ecosystem and Libraries

← The Io Programming Language
Io

The available libraries, tools, and community resources around Io.

While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem.

Core Libraries

Io comes with several built-in libraries that extend its capabilities:

File I/O and System

// File operations
+file := File with("data.txt")
+
+// Reading
+if(file exists,
+    contents := file contents
+    lines := file readLines
+    
+    // Read with encoding
+    file setEncoding("UTF-8")
+    text := file contents
+)
+
+// Writing
+file openForWriting
+file write("Hello, World!\n")
+file write("Line 2\n")
+file close
+
+// Appending
+file openForAppending
+file write("Additional line\n")
+file close
+
+// File information
+file size println
+file lastModified println
+file isDirectory println
+
+// Directory operations
+dir := Directory with("./src")
+dir files foreach(file,
+    file name println
+)
+
+dir directories foreach(subdir,
+    subdir path println
+)
+
+// Recursive directory walking
+dir recursiveFilesOfType("io") foreach(ioFile,
+    ioFile path println
+)
+
+// System operations
+System system("ls -la")  // Execute shell command
+System getEnvironmentVariable("HOME") println
+System setEnvironmentVariable("MY_VAR", "value")
+System exit(0)

Networking

// HTTP Client
+url := URL with("https://api.example.com/data")
+url fetch println  // Simple GET request
+
+// With headers
+url setHeader("Authorization", "Bearer token")
+url setHeader("Content-Type", "application/json")
+response := url fetch
+
+// POST request
+url setMethod("POST")
+url setBody("{\"key\": \"value\"}")
+response := url fetch
+
+// Socket programming
+// Server
+server := Socket clone
+server setHost("127.0.0.1")
+server setPort(8080)
+server bind
+server listen
+
+loop(
+    client := server accept
+    @(
+        data := client readUntilSeq("\n")
+        client write("Echo: " .. data)
+        client close
+    )
+)
+
+// Client
+client := Socket clone
+client setHost("127.0.0.1")
+client setPort(8080)
+client connect
+client write("Hello, server!\n")
+response := client readUntilSeq("\n")
+response println
+client close

Date and Time

// Current date/time
+now := Date now
+now println
+
+// Date components
+now year println
+now month println
+now day println
+now hour println
+now minute println
+now second println
+
+// Date arithmetic
+tomorrow := now + Duration days(1)
+nextWeek := now + Duration weeks(1)
+hourAgo := now - Duration hours(1)
+
+// Formatting
+now asString("%Y-%m-%d %H:%M:%S") println
+now asString("%B %d, %Y") println
+
+// Parsing
+date := Date fromString("2024-01-15", "%Y-%m-%d")
+
+// Duration
+duration := Duration clone
+duration setDays(2) setHours(3) setMinutes(30)
+duration asSeconds println
+
+// Timing code
+start := Date now
+// ... code to time ...
+elapsed := Date now - start
+("Elapsed: " .. elapsed) println

Regular Expressions

// Basic matching
+text := "The year 2024 has 365 days"
+text matchesRegex("\\d+") println  // true
+
+// Finding matches
+match := text findRegex("\\d+")
+match start println  // Starting position
+match end println    // Ending position
+match string println // Matched string
+
+// All matches
+matches := text allMatchesOfRegex("\\d+")
+matches foreach(m,
+    m string println  // 2024, 365
+)
+
+// Replacement
+result := text replaceFirstRegex("\\d+", "N")
+result println  // The year N has 365 days
+
+result := text replaceAllRegex("\\d+", "N")
+result println  // The year N has N days
+
+// Capture groups
+email := "user@example.com"
+pattern := "(\\w+)@([\\w.]+)"
+if(match := email matchesOfRegex(pattern),
+    match at(1) println  // user
+    match at(2) println  // example.com
+)
+
+// Compiling regex for reuse
+regex := Regex with("\\b\\w{5}\\b")  // 5-letter words
+regex matches("hello") println  // true
+regex matches("hi") println     // false

JSON

// Parsing JSON
+jsonString := """
+{
+    "name": "Alice",
+    "age": 30,
+    "interests": ["coding", "music"],
+    "address": {
+        "city": "New York",
+        "zip": "10001"
+    }
+}
+"""
+
+data := jsonString parseJson
+data at("name") println  // Alice
+data at("interests") at(0) println  // coding
+data at("address") at("city") println  // New York
+
+// Creating JSON
+person := Map with(
+    "name", "Bob",
+    "age", 25,
+    "active", true,
+    "tags", list("developer", "gamer")
+)
+
+json := person asJson
+json println  // {"name":"Bob","age":25,"active":true,"tags":["developer","gamer"]}
+
+// Pretty printing
+json := person asJson(true)  // Pretty format

XML

// Parsing XML
+xmlString := """
+<root>
+    <person id="1">
+        <name>Alice</name>
+        <age>30</age>
+    </person>
+    <person id="2">
+        <name>Bob</name>
+        <age>25</age>
+    </person>
+</root>
+"""
+
+doc := SGML parseString(xmlString)
+root := doc root
+
+// Navigate XML
+people := root elementsWithName("person")
+people foreach(person,
+    id := person attributeAt("id")
+    name := person elementWithName("name") text
+    age := person elementWithName("age") text
+    (id .. ": " .. name .. " (" .. age .. ")") println
+)
+
+// Build XML
+doc := SGML clone
+root := doc addElement("catalog")
+
+book := root addElement("book")
+book setAttribute("isbn", "123456")
+book addElement("title") setText("Io Programming")
+book addElement("author") setText("Jane Doe")
+book addElement("price") setText("29.99")
+
+doc asString println

Addon System

Io's addon system allows loading C-based extensions:

// Loading addons
+Addon load("Socket")   // Network programming
+Addon load("Random")   // Random number generation
+Addon load("Regex")    // Regular expressions
+Addon load("SQLite")   // Database access
+
+// Check available addons
+Addon availableAddons foreach(name,
+    name println
+)
+
+// Addon information
+addon := Addon named("Socket")
+addon path println
+addon dependencies println

Database Libraries

SQLite

// SQLite integration
+db := SQLite clone
+db open("app.db")
+
+// Create table
+db exec("""
+    CREATE TABLE IF NOT EXISTS users (
+        id INTEGER PRIMARY KEY,
+        name TEXT NOT NULL,
+        email TEXT UNIQUE,
+        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+    )
+""")
+
+// Insert data
+stmt := db prepare("INSERT INTO users (name, email) VALUES (?, ?)")
+stmt bind(1, "Alice")
+stmt bind(2, "alice@example.com")
+stmt step
+stmt reset
+
+// Query data
+results := db exec("SELECT * FROM users WHERE name LIKE 'A%'")
+results foreach(row,
+    ("ID: " .. row at("id") .. ", Name: " .. row at("name")) println
+)
+
+// Prepared statements with results
+stmt := db prepare("SELECT * FROM users WHERE id = ?")
+stmt bind(1, 1)
+
+while(stmt step == SQLite ROW,
+    name := stmt columnText(1)
+    email := stmt columnText(2)
+    (name .. " - " .. email) println
+)
+
+stmt finalize
+db close
+
+// Transactions
+db begin
+try(
+    db exec("INSERT INTO users ...")
+    db exec("UPDATE users ...")
+    db commit
+) catch(Exception, e,
+    db rollback
+    e raise
+)

Graphics and GUI

OpenGL

// OpenGL addon (if available)
+Addon load("OpenGL")
+
+// Basic window setup
+window := GLApp clone
+window width := 800
+window height := 600
+window title := "Io OpenGL"
+
+window draw := method(
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
+    
+    glBegin(GL_TRIANGLES)
+    glColor3f(1, 0, 0)
+    glVertex2f(-0.5, -0.5)
+    glColor3f(0, 1, 0)
+    glVertex2f(0.5, -0.5)
+    glColor3f(0, 0, 1)
+    glVertex2f(0, 0.5)
+    glEnd
+    
+    swapBuffers
+)
+
+window run

Image Processing

// Image addon
+Addon load("Image")
+
+// Load and manipulate images
+img := Image clone
+img open("photo.jpg")
+
+// Get information
+img width println
+img height println
+img componentCount println  // Color channels
+
+// Basic operations
+img resize(800, 600)
+img crop(100, 100, 400, 300)
+img flip("horizontal")
+img rotate(90)
+
+// Filters
+img blur(5)
+img sharpen
+img adjustBrightness(1.2)
+img adjustContrast(1.5)
+img grayscale
+
+// Save
+img save("modified.png")
+
+// Create new image
+canvas := Image clone
+canvas allocate(500, 500, 3)  // RGB
+canvas fill(Color with(0.5, 0.5, 1.0))  // Light blue
+
+// Draw on image
+canvas drawLine(0, 0, 500, 500, Color red)
+canvas drawCircle(250, 250, 100, Color green)
+canvas drawRectangle(100, 100, 300, 200, Color blue)
+
+canvas save("drawing.png")

Cryptography

// Crypto addon
+Addon load("MD5")
+Addon load("SHA1")
+
+// Hashing
+text := "Hello, World!"
+
+md5 := MD5 clone
+md5 appendSeq(text)
+md5 hexDigest println  // MD5 hash
+
+sha := SHA1 clone
+sha appendSeq(text)
+sha hexDigest println  // SHA1 hash
+
+// File hashing
+file := File with("document.pdf")
+hash := MD5 hashFile(file path)
+hash println
+
+// HMAC (if available)
+key := "secret-key"
+message := "Important message"
+hmac := HMAC sha256(key, message)
+hmac println

Third-Party Libraries

Package Management

While Io doesn't have a centralized package manager like npm or pip, libraries can be managed through:

// Simple package loader
+PackageLoader := Object clone
+PackageLoader paths := list(
+    "~/.io/packages",
+    "/usr/local/io/packages",
+    "./packages"
+)
+
+PackageLoader load := method(name,
+    paths foreach(path,
+        packageFile := Path with(path, name, "init.io")
+        if(File with(packageFile) exists,
+            doFile(packageFile)
+            return true
+        )
+    )
+    Exception raise("Package not found: " .. name)
+)
+
+// Usage
+PackageLoader load("web-framework")
+PackageLoader load("test-framework")

Creating Libraries

Structure for an Io library:

// mylib/init.io - Entry point
+MyLib := Object clone
+MyLib version := "1.0.0"
+
+// Load components
+doRelativeFile("core.io")
+doRelativeFile("utils.io")
+doRelativeFile("extensions.io")
+
+// Export public API
+MyLib
+
+// mylib/core.io
+MyLib Core := Object clone
+MyLib Core process := method(data,
+    // Core functionality
+)
+
+// mylib/utils.io
+MyLib Utils := Object clone
+MyLib Utils helper := method(
+    // Utility functions
+)
+
+// mylib/extensions.io
+// Extend built-in types
+List customMethod := method(
+    // Extended functionality
+)

Testing Frameworks

Simple testing framework example:

// SimpleTest framework
+Test := Object clone
+Test suites := list()
+
+Test describe := method(name, block,
+    suite := TestSuite clone
+    suite name := name
+    suite tests := list()
+    
+    suite it := method(desc, testBlock,
+        tests append(list(desc, testBlock))
+    )
+    
+    block call(suite)
+    suites append(suite)
+)
+
+Test run := method(
+    totalTests := 0
+    passedTests := 0
+    
+    suites foreach(suite,
+        ("\n" .. suite name) println
+        ("=" repeated(suite name size)) println
+        
+        suite tests foreach(test,
+            desc := test at(0)
+            block := test at(1)
+            totalTests = totalTests + 1
+            
+            e := try(
+                block call
+                ("  ✓ " .. desc) println
+                passedTests = passedTests + 1
+            ) catch(Exception, e,
+                ("  ✗ " .. desc) println
+                ("    " .. e message) println
+            )
+        )
+    )
+    
+    ("\n" .. passedTests .. "/" .. totalTests .. " tests passed") println
+)
+
+// Usage
+Test describe("Array operations", suite,
+    suite it("should append elements", 
+        arr := list(1, 2)
+        arr append(3)
+        assert(arr size == 3)
+    )
+    
+    suite it("should remove elements",
+        arr := list(1, 2, 3)
+        arr remove(2)
+        assert(arr contains(2) not)
+    )
+)
+
+Test run

Documentation Tools

Generating Documentation

// Simple documentation generator
+DocGen := Object clone
+DocGen init := method(
+    self docs := Map clone
+    self
+)
+
+DocGen document := method(obj, name,
+    info := Map clone
+    info atPut("name", name)
+    info atPut("type", obj type)
+    info atPut("slots", obj slotNames sort)
+    
+    // Extract method signatures
+    methods := Map clone
+    obj slotNames foreach(slotName,
+        slot := obj getSlot(slotName)
+        if(slot type == "Block",
+            methods atPut(slotName, slot argumentNames)
+        )
+    )
+    info atPut("methods", methods)
+    
+    docs atPut(name, info)
+    self
+)
+
+DocGen generateMarkdown := method(
+    md := "# API Documentation\n\n"
+    
+    docs foreach(name, info,
+        md = md .. "## " .. name .. "\n\n"
+        md = md .. "**Type**: " .. info at("type") .. "\n\n"
+        
+        methods := info at("methods")
+        if(methods size > 0,
+            md = md .. "### Methods\n\n"
+            methods foreach(method, args,
+                md = md .. "- `" .. method .. "(" .. args join(", ") .. ")`\n"
+            )
+            md = md .. "\n"
+        )
+    )
+    
+    md
+)
+
+// Usage
+docGen := DocGen clone init
+docGen document(MyClass, "MyClass")
+docGen document(MyUtils, "MyUtils")
+
+File with("API.md") openForWriting write(docGen generateMarkdown) close

Development Tools

REPL Enhancements

// Enhanced REPL
+REPL := Object clone
+REPL history := list()
+REPL commands := Map clone
+
+REPL registerCommand := method(name, block,
+    commands atPut(name, block)
+)
+
+REPL run := method(
+    loop(
+        "io> " print
+        input := File standardInput readLine
+        
+        if(input beginsWithSeq(":"),
+            // Handle commands
+            cmd := input afterSeq(":")
+            if(commands hasKey(cmd),
+                commands at(cmd) call,
+                ("Unknown command: " .. cmd) println
+            ),
+            // Evaluate Io code
+            history append(input)
+            e := try(
+                result := doString(input)
+                ("==> " .. result) println
+            ) catch(Exception, e,
+                ("Error: " .. e message) println
+            )
+        )
+    )
+)
+
+// Register commands
+REPL registerCommand("help", block(
+    "Available commands:" println
+    commands keys foreach(cmd,
+        ("  :" .. cmd) println
+    )
+))
+
+REPL registerCommand("history", block(
+    history foreach(i, line,
+        (i .. ": " .. line) println
+    )
+))
+
+REPL registerCommand("clear", block(
+    System system("clear")
+))
+
+REPL registerCommand("quit", block(
+    System exit
+))
+
+// Run enhanced REPL
+REPL run

Debugging Tools

// Simple debugger
+Debugger := Object clone
+Debugger breakpoints := list()
+Debugger stepping := false
+
+Object debug := method(
+    Debugger enter(self, call)
+)
+
+Debugger enter := method(context, callObj,
+    "=== Debugger ===" println
+    ("Context: " .. context type) println
+    ("Location: " .. callObj message) println
+    
+    loop(
+        "> " print
+        cmd := File standardInput readLine split(" ")
+        
+        if(cmd at(0) == "inspect",
+            target := cmd at(1)
+            if(target,
+                obj := context doString(target)
+                obj slotNames foreach(slot,
+                    ("  " .. slot .. ": " .. obj getSlot(slot) type) println
+                )
+            )
+        )
+        
+        if(cmd at(0) == "eval",
+            code := cmd slice(1) join(" ")
+            result := context doString(code)
+            result println
+        )
+        
+        if(cmd at(0) == "continue",
+            break
+        )
+        
+        if(cmd at(0) == "help",
+            "Commands: inspect <obj>, eval <code>, continue, help" println
+        )
+    )
+)

Community Resources

Finding Libraries

Common sources for Io libraries:

  1. GitHub: Search for "io-language" or "iolanguage" topics
  2. Official Repository: https://github.com/IoLanguage/io
  3. Community Addons: Various developers maintain addon collections

Contributing

Creating an addon for the community:

// addon.io - Addon metadata
+Addon := Object clone
+Addon name := "MyAddon"
+Addon version := "1.0.0"
+Addon author := "Your Name"
+Addon description := "Description of what your addon does"
+Addon license := "MIT"
+Addon dependencies := list("OtherAddon")
+
+Addon install := method(
+    // Installation logic
+    "Installing " .. name .. " v" .. version println
+    
+    // Copy files
+    // Compile C extensions if needed
+    // Register with Io
+)
+
+Addon uninstall := method(
+    // Cleanup logic
+)
+
+// Make addon discoverable
+Addon register

Performance Libraries

Profiling

// Simple profiler
+Profiler := Object clone
+Profiler data := Map clone
+
+Object profile := method(name,
+    start := Date now
+    result := call evalArgAt(0)
+    elapsed := Date now - start
+    
+    if(Profiler data hasKey(name) not,
+        Profiler data atPut(name, list(0, 0))
+    )
+    
+    stats := Profiler data at(name)
+    stats atPut(0, stats at(0) + 1)  // Count
+    stats atPut(1, stats at(1) + elapsed)  // Total time
+    
+    result
+)
+
+Profiler report := method(
+    "=== Profile Report ===" println
+    data foreach(name, stats,
+        count := stats at(0)
+        total := stats at(1)
+        avg := total / count
+        
+        (name .. ": " .. count .. " calls, " ..
+         total .. "s total, " .. avg .. "s average") println
+    )
+)
+
+// Usage
+profile("database",
+    // Expensive operation
+    wait(0.1)
+)
+
+Profiler report

Future of Io Libraries

The Io ecosystem continues to evolve with:

  1. WebAssembly Support: Potential for running Io in browsers
  2. Modern Addons: Integration with contemporary libraries
  3. Cloud Services: AWS, Azure, GCP client libraries
  4. Machine Learning: Bindings to TensorFlow, PyTorch
  5. Improved Tooling: Better IDE support, linters, formatters

Conclusion

While Io's ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need.

The key to working effectively with Io's ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need.

+ + + + diff --git a/website/content/docs/03-everything-is-an-object.md b/Everything-is-an-Object/_index.md similarity index 98% rename from website/content/docs/03-everything-is-an-object.md rename to Everything-is-an-Object/_index.md index bf9686e..180b62e 100644 --- a/website/content/docs/03-everything-is-an-object.md +++ b/Everything-is-an-Object/_index.md @@ -1,12 +1,10 @@ --- -title: "Everything is an Object" -weight: 40 +title: Everything is an Object +topTitle: Io +subtitle: "What it really means when every value—numbers, booleans, methods—is an object." +nextSectionLink: true --- - - -# Chapter 3: Everything is an Object - "Everything is an object" is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like `int` and `boolean` break the rule). But what does it really mean? And how thoroughly does Io embrace this principle? In this chapter, we'll explore how Io takes "everything is an object" to its logical extreme, and what this means for how you write and think about programs. @@ -519,6 +517,3 @@ In Io, "everything is an object" isn't marketing—it's a fundamental truth that This uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that *everything* is just objects sending messages to other objects, Io's entire design clicks into place. Next, we'll explore how objects relate to each other through Io's prototype-based inheritance system—a world without classes. - ---- - diff --git a/Everything-is-an-Object/index.html b/Everything-is-an-Object/index.html new file mode 100644 index 0000000..7da640f --- /dev/null +++ b/Everything-is-an-Object/index.html @@ -0,0 +1,277 @@ + + + + + + +Everything is an Object – Io + + + + +

Everything is an Object

← The Io Programming Language
Io

What it really means when every value—numbers, booleans, methods—is an object.

"Everything is an object" is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like int and boolean break the rule). But what does it really mean? And how thoroughly does Io embrace this principle?

In this chapter, we'll explore how Io takes "everything is an object" to its logical extreme, and what this means for how you write and think about programs.

What Is an Object?

Before we dive into Io's object model, let's establish what we mean by "object." In most object-oriented languages, an object is:

  1. A bundle of state (data/attributes/fields)
  2. A set of behaviors (methods/functions)
  3. An identity (distinct from other objects)

In Java, you might have:

class Dog {
+    String name;        // state
+    int age;           // state
+    
+    void bark() {      // behavior
+        System.out.println("Woof!");
+    }
+}
+
+Dog fido = new Dog();  // identity (fido is distinct from other Dogs)

But Java immediately breaks its own rules:

int x = 5;          // Not an object!
+x.toString();       // Error: int cannot be dereferenced
+Integer y = 5;      // Now it's an object (boxed)
+y.toString();       // "5"

Let's see how Io handles this.

Numbers are Objects

In Io, numbers aren't primitives—they're full objects:

5 type println           // Number
+5 slotNames println      // list(%, *, +, -, /, <, ...)
+
+// Numbers have methods
+5 abs println            // 5
+-5 abs println           // 5
+5 sqrt println           // 2.236...
+5 sin println            // -0.958...
+
+// You can add methods to numbers!
+Number double := method(self * 2)
+5 double println         // 10
+
+// You can even inspect a number's prototype chain
+5 proto println          // Number_0x...
+5 proto proto println    // Object_0x...

Compare this to Python, which claims everything is an object:

x = 5
+print(type(x))           # <class 'int'>
+print(dir(x))            # ['__abs__', '__add__', ...]
+
+# But you can't add methods to numbers
+x.double = lambda: x * 2  # AttributeError!

Python's numbers are objects, but they're immutable objects with a fixed set of methods. Io's numbers are fully modifiable objects.

Strings are Objects (and Mutable!)

text := "hello"
+text type println        // Sequence
+
+// Strings have methods
+text size println        // 5
+text upper println       // HELLO
+text reverse println     // olleh
+
+// But here's where it gets interesting - strings are MUTABLE
+text atPut(0, 72)       // ASCII for 'H'
+text println            // Hello
+
+// You can add methods to strings
+Sequence shout := method(self upper .. "!!!")
+"hello" shout println   // HELLO!!!

This mutability might shock programmers from languages where strings are immutable:

# Python - strings are immutable
+text = "hello"
+text[0] = 'H'  # TypeError: 'str' object does not support item assignment
+
+# Java - strings are immutable
+String text = "hello";
+text.charAt(0) = 'H';  // Error: cannot assign a value

Booleans are Objects

Even true and false are objects:

true type println        // true
+false type println       // false
+
+// They have methods
+true and(false) println  // false
+true or(false) println   // true
+true not println         // false
+
+// The actual objects
+true println             // true
+true proto println       // Object_0x...
+
+// You can even add methods to booleans!
+true celebrate := method("Yay!" println)
+(5 > 3) celebrate       // Yay!

This is different from most languages where booleans are either primitives or special immutable objects.

nil is an Object

Even nothingness is an object in Io:

nil type println         // Object
+nil slotNames println    // list(type, ...)
+
+// nil has methods!
+nil isNil println        // true
+nil not println          // true
+
+// You can add methods to nil
+nil greet := method("Hello from nothing!" println)
+x := nil
+x greet                  // Hello from nothing!

Compare with JavaScript's confusing null:

typeof null          // "object" (but it's not really)
+null.toString()      // TypeError: Cannot read property 'toString' of null

Methods are Objects

This is where things get really interesting. Methods themselves are objects:

add := method(a, b, a + b)
+add type println         // Block
+
+// Methods have methods!
+add argumentNames println // list(a, b)
+add code println         // a +(b)
+
+// You can modify methods
+add code println                    // a +(b)
+add setCode(block(a, b, a * b))   // Change implementation!
+add(3, 4) println                  // 12 (now multiplies!)
+
+// You can create methods from strings
+code := "a + b + 100"
+newMethod := block(a, b) setCode(code)
+newMethod call(5, 10) println      // 115

This is far more powerful than most languages' function objects:

# Python
+def add(a, b):
+    return a + b
+
+print(type(add))         # <class 'function'>
+print(add.__code__)      # <code object...>
+# But you can't easily modify the function's code at runtime

Control Structures are Objects (Messages)

This might be the most mind-bending: if, while, and for aren't syntax—they're methods:

// 'if' is a method on Object
+if type println          // nil (it's a method)
+
+// You can see its implementation
+Object getSlot("if") println  // method(...)
+
+// You can even redefine it!
+Object if := method(condition, trueBlock, falseBlock,
+    "Making a decision..." println
+    if(condition, trueBlock call, falseBlock call)
+)
+
+if(true, "yes" println, "no" println)
+// Prints: Making a decision...
+// Prints: yes

Let's create our own control structure:

Object unless := method(condition, block,
+    if(condition not, block call)
+)
+
+unless(5 > 10,
+    "Math still works!" println
+)
+// Prints: Math still works!

Try doing that in Java or C++!

Operators are Objects (Messages)

Operators aren't special syntax—they're messages:

// These are equivalent
+2 + 3
+2 +(3)
+2 send("+", 3)
+
+// You can redefine operators
+Number + := method(n,
+    "Adding #{self} and #{n}" interpolate println
+    self + n  // Would cause infinite recursion!
+)
+
+// Let's be more careful
+Number plusWithLogging := Number getSlot("+")
+Number + := method(n,
+    "Adding #{self} and #{n}" interpolate println
+    self plusWithLogging(n)
+)
+
+2 + 3
+// Prints: Adding 2 and 3
+// Returns: 5

You can even create new operators:

OperatorTable addOperator("**", 3)  // Right-associative, precedence 3
+Number ** := method(n, self pow(n))
+
+2 ** 3 println  // 8
+2 ** 3 ** 2 println  // 512 (right-associative: 2 ** (3 ** 2))

Lists are Objects

nums := list(1, 2, 3)
+nums type println        // List
+
+// Lists have many methods
+nums size println        // 3
+nums first println       // 1
+nums last println        // 3
+nums reverse println     // list(3, 2, 1)
+
+// Lists are mutable
+nums append(4)
+nums println            // list(1, 2, 3, 4)
+
+// You can add custom methods to lists
+List sum := method(
+    self reduce(+)
+)
+
+list(1, 2, 3, 4, 5) sum println  // 15

Even the Lobby is an Object

The global namespace in Io is an object called Lobby:

Lobby type println       // Object
+Lobby slotNames println  // list(all your global variables)
+
+// When you create a "global" variable, you're adding a slot to Lobby
+x := 10
+Lobby hasSlot("x") println  // true
+Lobby x println             // 10
+
+// You can manipulate the global namespace as an object
+Lobby removeSlot("x")
+x println                   // Exception: Slot x not found

This is radically different from languages with special global scope rules.

Messages Themselves are Objects

When you send a message, that message is an object:

msg := message(2 + 3)
+msg type println         // Message
+msg name println         // +
+msg arguments println    // list(Message_0x...)
+msg arguments first code println  // 3
+
+// You can evaluate messages
+msg doInContext(Lobby) println   // 5
+
+// You can build messages programmatically
+msg := Message clone setName("+") setArguments(list(Message clone setName("3")))
+2 doMessage(msg) println          // 5

This is the foundation of Io's metaprogramming capabilities.

The Object Hierarchy

Let's explore how all these objects relate:

// Everything ultimately inherits from Object
+5 proto proto == Object println      // true
+"hi" proto proto == Object println   // true
+true proto == Object println         // true
+list() proto proto == Object println // true
+
+// You can walk the prototype chain
+obj := 5
+while(obj,
+    obj type println
+    obj = obj proto
+)
+// Prints:
+// Number
+// Object

Practical Implications

What does it mean that everything is truly an object?

1. Uniform Interface

You can treat everything uniformly:

things := list(5, "hello", true, nil, method(x, x * 2), list(1, 2))
+
+things foreach(thing,
+    ("Type: " .. thing type) println
+)
+// Type: Number
+// Type: Sequence  
+// Type: true
+// Type: Object
+// Type: Block
+// Type: List

2. No Special Cases

You don't need to remember different rules for different types:

// Everything can receive messages
+5 println
+"hello" println
+true println
+nil println
+list(1,2,3) println
+
+// Everything can be inspected
+5 slotNames
+"hello" slotNames
+true slotNames
+nil slotNames

3. Extensibility

You can extend anything:

// Add methods to numbers for DSL
+Number days := method(
+    Duration clone setDays(self)
+)
+
+Number hours := method(
+    Duration clone setHours(self)
+)
+
+// Now you can write
+deadline := Date now + 3 days + 4 hours

4. Debugging Power

Since everything is an object, you can inspect everything:

Object debugMethod := method(name,
+    m := self getSlot(name)
+    ("Method " .. name .. ":") println
+    ("  Arguments: " .. m argumentNames) println
+    ("  Code: " .. m code) println
+)
+
+List debugMethod("append")
+// Method append:
+//   Arguments: list(...)
+//   Code: ...

Comparison with Other Languages

Ruby: "Everything is an object" (mostly)

5.class          # Integer
+"hello".class    # String
+true.class       # TrueClass
+nil.class        # NilClass
+
+# But...
+if.class         # SyntaxError! 'if' isn't an object

Python: "Everything is an object" (sort of)

type(5)          # <class 'int'>
+type("hello")    # <class 'str'>
+type(True)       # <class 'bool'>
+type(None)       # <class 'NoneType'>
+
+# But...
+type(if)         # SyntaxError! 'if' isn't an object
+type(+)          # SyntaxError! '+' isn't an object

JavaScript: "Everything is an object" (except when it's not)

typeof 5         // "number" (primitive)
+typeof "hello"   // "string" (primitive)
+typeof true      // "boolean" (primitive)
+typeof {}        // "object"
+
+// Autoboxing happens sometimes
+(5).toString()   // "5" (temporarily boxed)
+5.x = 10         // Silently fails!

Io: Everything IS an object (no exceptions)

5 type           // Number (object)
+"hello" type     // Sequence (object)
+true type        // true (object)
+if type          // nil (it's a method, which is an object)
++ type           // nil (it's a method, which is an object)

Exercises

  1. Object Inspector: Write a method inspect that can be called on any object and prints:
    • Its type
    • Its slot names
    • Its prototype chain
  2. Custom Boolean: Create your own boolean system with objects Yes and No that have methods and, or, and not.
  3. Operator Overloading: Define a Vector object with x and y slots, then overload the + operator to add vectors.
  4. Control Structure: Create a repeat(n, block) control structure that executes a block n times.
  5. Message Logger: Modify the Object prototype to log every message sent to any object (hint: override forward).

Philosophical Implications

Io's radical "everything is an object" approach has profound implications:

  1. Simplicity through uniformity: One concept (objects) explains everything
  2. Power through openness: Nothing is sealed or special
  3. Learning through exploration: You can inspect and understand everything
  4. Danger through freedom: You can break everything

This last point is important. With great power comes great responsibility. Io trusts you completely. You can redefine addition, break the if statement, or delete critical system objects. This isn't a bug—it's a philosophy.

Conclusion

In Io, "everything is an object" isn't marketing—it's a fundamental truth that shapes every aspect of the language. Numbers, strings, booleans, nil, methods, operators, control structures, and even messages themselves are all objects with slots that can be inspected, modified, and extended.

This uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that everything is just objects sending messages to other objects, Io's entire design clicks into place.

Next, we'll explore how objects relate to each other through Io's prototype-based inheritance system—a world without classes.

+ + + + diff --git a/website/content/docs/10-exceptions.md b/Exceptions/_index.md similarity index 99% rename from website/content/docs/10-exceptions.md rename to Exceptions/_index.md index 1ff5b8f..f1a2b16 100644 --- a/website/content/docs/10-exceptions.md +++ b/Exceptions/_index.md @@ -1,12 +1,10 @@ --- -title: "Exceptions" -weight: 110 +title: Exceptions +topTitle: Io +subtitle: "Error handling built, like everything else, from objects and messages." +nextSectionLink: true --- - - -# Chapter 10: Exceptions - Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types. ## Basic Exception Handling @@ -692,6 +690,3 @@ fetchUserData := method(userId, Io's exception system demonstrates the language's consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling. The key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with `finally` blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications. - ---- - diff --git a/Exceptions/index.html b/Exceptions/index.html new file mode 100644 index 0000000..34ad792 --- /dev/null +++ b/Exceptions/index.html @@ -0,0 +1,548 @@ + + + + + + +Exceptions – Io + + + + +

Error handling built, like everything else, from objects and messages.

Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types.

Basic Exception Handling

Io uses try, catch, and raise for exception handling:

// Basic try-catch
+try(
+    10 / 0  // Division by zero
+) catch(Exception, e,
+    ("Error: " .. e message) println
+)
+// Error: divide by zero
+
+// Multiple catch blocks
+try(
+    someRiskyOperation()
+) catch(TypeError, e,
+    "Type error occurred" println
+) catch(IOException, e,
+    "IO error occurred" println
+) catch(Exception, e,
+    "Some other error occurred" println
+)

Compare with other languages:

# Python
+try:
+    result = 10 / 0
+except ZeroDivisionError as e:
+    print(f"Error: {e}")
// Java
+try {
+    int result = 10 / 0;
+} catch (ArithmeticException e) {
+    System.out.println("Error: " + e.getMessage());
+}

Raising Exceptions

// Raise a simple exception
+Exception raise("Something went wrong")
+
+// Raise with more information
+e := Exception clone
+e setMessage("File not found")
+e raise
+
+// Conditional raising
+validateAge := method(age,
+    if(age < 0, Exception raise("Age cannot be negative"))
+    if(age > 150, Exception raise("Age seems unrealistic"))
+    age
+)
+
+try(
+    validateAge(-5)
+) catch(Exception, e,
+    e message println  // Age cannot be negative
+)

Exception Objects

Exceptions are just objects:

// Examine exception structure
+e := Exception clone
+e type println           // Exception
+e proto println          // Object_0x...
+
+// Exception slots
+e setMessage("Test error")
+e message println        // Test error
+
+// Stack trace
+try(
+    Exception raise("Test")
+) catch(Exception, e,
+    e showStack  // Prints full stack trace
+    e coroutine println  // The coroutine where error occurred
+)

Creating Custom Exceptions

// Define custom exception types
+ValidationError := Exception clone
+ValidationError type := "ValidationError"
+
+NetworkError := Exception clone
+NetworkError type := "NetworkError"
+NetworkError code := nil
+NetworkError setCode := method(c, self code = c; self)
+
+// Use custom exceptions
+validateEmail := method(email,
+    if(email containsSeq("@") not,
+        ValidationError clone setMessage("Invalid email format") raise
+    )
+    email
+)
+
+fetchData := method(url,
+    // Simulate network error
+    if(Random value < 0.3,
+        NetworkError clone setMessage("Connection timeout") setCode(408) raise
+    )
+    "data"
+)
+
+// Handle specific exception types
+try(
+    validateEmail("badEmail")
+) catch(ValidationError, e,
+    ("Validation failed: " .. e message) println
+) catch(Exception, e,
+    ("Unexpected error: " .. e message) println
+)

The finally Block

// Ensure cleanup with finally
+file := nil
+try(
+    file = File with("data.txt") openForReading
+    contents := file contents
+    processData(contents)
+) catch(Exception, e,
+    ("Error reading file: " .. e message) println
+) finally(
+    if(file, file close)
+    "Cleanup complete" println
+)
+
+// finally always executes
+result := try(
+    "Success" println
+    42
+) catch(Exception, e,
+    "Error" println
+    0
+) finally(
+    "Always runs" println
+)
+// Prints: Success, Always runs
+result println  // 42

Return Values and Exceptions

// try returns a value
+result := try(
+    10 / 2
+) catch(Exception, e,
+    0  // Default value on error
+)
+result println  // 5
+
+// With error
+result := try(
+    10 / 0
+) catch(Exception, e,
+    0  // Default value on error
+)
+result println  // 0
+
+// Pattern: Result or default
+safeDiv := method(a, b,
+    try(a / b) catch(Exception, 0)
+)
+
+safeDiv(10, 2) println  // 5
+safeDiv(10, 0) println  // 0

Exception Propagation

Exceptions bubble up through the call stack:

level3 := method(
+    Exception raise("Error at level 3")
+)
+
+level2 := method(
+    "Level 2 start" println
+    level3()
+    "Level 2 end" println  // Never reached
+)
+
+level1 := method(
+    "Level 1 start" println
+    level2()
+    "Level 1 end" println  // Never reached
+)
+
+try(
+    level1()
+) catch(Exception, e,
+    ("Caught at top level: " .. e message) println
+)
+// Level 1 start
+// Level 2 start
+// Caught at top level: Error at level 3

Rethrowing Exceptions

processFile := method(filename,
+    try(
+        file := File with(filename) openForReading
+        // Process file
+    ) catch(Exception, e,
+        ("Failed to process " .. filename) println
+        e raise  // Rethrow the original exception
+    )
+)
+
+try(
+    processFile("nonexistent.txt")
+) catch(Exception, e,
+    "Caught rethrown exception" println
+)

Error Recovery Patterns

Retry Pattern

retryOperation := method(operation, maxAttempts,
+    attempts := 0
+    lastError := nil
+    
+    while(attempts < maxAttempts,
+        attempts = attempts + 1
+        
+        e := try(
+            return operation call(attempts)
+        )
+        
+        if(e,
+            lastError = e
+            ("Attempt " .. attempts .. " failed: " .. e message) println
+            if(attempts < maxAttempts, wait(0.5))
+        )
+    )
+    
+    Exception raise("All " .. maxAttempts .. " attempts failed. Last error: " .. lastError message)
+)
+
+// Usage
+result := retryOperation(
+    block(attempt,
+        if(Random value < 0.7,
+            Exception raise("Random failure"),
+            "Success on attempt " .. attempt
+        )
+    ),
+    3
+)

Circuit Breaker

CircuitBreaker := Object clone
+CircuitBreaker init := method(threshold, timeout,
+    self failureCount := 0
+    self threshold := threshold
+    self timeout := timeout
+    self state := "closed"  // closed, open, half-open
+    self lastFailureTime := nil
+    self
+)
+
+CircuitBreaker call := method(operation,
+    if(state == "open",
+        if(Date now - lastFailureTime > timeout,
+            state = "half-open"
+            "Circuit breaker entering half-open state" println,
+            Exception raise("Circuit breaker is open")
+        )
+    )
+    
+    e := try(
+        result := operation call
+        if(state == "half-open",
+            state = "closed"
+            failureCount = 0
+            "Circuit breaker closed" println
+        )
+        return result
+    )
+    
+    if(e,
+        failureCount = failureCount + 1
+        lastFailureTime = Date now
+        
+        if(failureCount >= threshold,
+            state = "open"
+            "Circuit breaker opened" println
+        )
+        
+        e raise
+    )
+)
+
+// Usage
+breaker := CircuitBreaker clone init(3, 5)
+
+unreliableService := block(
+    if(Random value < 0.8,
+        Exception raise("Service unavailable"),
+        "Service response"
+    )
+)
+
+5 repeat(
+    try(
+        breaker call(unreliableService) println
+    ) catch(Exception, e,
+        ("Failed: " .. e message) println
+    )
+    wait(1)
+)

Assertion and Validation

// Simple assertion
+assert := method(condition, message,
+    if(condition not,
+        Exception raise(message ifNilEval("Assertion failed"))
+    )
+)
+
+assert(5 > 3, "Math is broken")
+// assert(3 > 5, "This will fail")
+
+// Validation framework
+Validator := Object clone
+Validator rules := list()
+
+Validator addRule := method(rule, message,
+    rules append(list(rule, message))
+    self
+)
+
+Validator validate := method(value,
+    errors := list()
+    
+    rules foreach(rule,
+        if(rule at(0) call(value) not,
+            errors append(rule at(1))
+        )
+    )
+    
+    if(errors size > 0,
+        ValidationError clone setMessage(errors join(", ")) raise
+    )
+    
+    value
+)
+
+// Usage
+ageValidator := Validator clone \
+    addRule(block(v, v isKindOf(Number)), "Must be a number") \
+    addRule(block(v, v >= 0), "Must be non-negative") \
+    addRule(block(v, v <= 150), "Must be realistic")
+
+try(
+    ageValidator validate(25) println  // 25
+    ageValidator validate(-5)  // Throws
+) catch(ValidationError, e,
+    e message println  // Must be non-negative
+)

Exception Context and Debugging

// Enhanced exception with context
+ContextualException := Exception clone
+ContextualException context := Map clone
+
+ContextualException addContext := method(key, value,
+    context atPut(key, value)
+    self
+)
+
+ContextualException describe := method(
+    result := message .. "\nContext:\n"
+    context foreach(key, value,
+        result = result .. "  " .. key .. ": " .. value .. "\n"
+    )
+    result
+)
+
+// Usage
+processUser := method(userData,
+    if(userData at("age") < 18,
+        ContextualException clone \
+            setMessage("User too young") \
+            addContext("userId", userData at("id")) \
+            addContext("age", userData at("age")) \
+            addContext("timestamp", Date now) \
+            raise
+    )
+)
+
+try(
+    processUser(Map with("id", 123, "age", 16))
+) catch(ContextualException, e,
+    e describe println
+)

Resource Management

// RAII-style resource management
+withResource := method(resourceCreator, resourceUser,
+    resource := nil
+    try(
+        resource = resourceCreator call
+        resourceUser call(resource)
+    ) finally(
+        if(resource and resource hasSlot("close"),
+            resource close
+        )
+    )
+)
+
+// Usage
+withResource(
+    block(File with("test.txt") openForReading),
+    block(file,
+        file contents println
+    )
+)
+
+// Database connection example
+withConnection := method(dbUrl, operation,
+    conn := nil
+    try(
+        conn = Database connect(dbUrl)
+        conn beginTransaction
+        result := operation call(conn)
+        conn commit
+        result
+    ) catch(Exception, e,
+        if(conn, conn rollback)
+        e raise
+    ) finally(
+        if(conn, conn close)
+    )
+)

Global Exception Handling

// Install global exception handler
+System handleException := method(e,
+    logFile := File with("errors.log") openForAppending
+    logFile write(Date now asString .. " - " .. e message .. "\n")
+    logFile close
+    
+    // Original behavior
+    e showStack
+    System exit(1)
+)
+
+// Uncaught exceptions now get logged
+// Exception raise("Uncaught error")

Testing with Exceptions

// Test framework with exception support
+Test := Object clone
+Test assertRaises := method(exceptionType, block,
+    raised := false
+    try(
+        block call
+    ) catch(Exception, e,
+        if(e type == exceptionType type,
+            raised = true,
+            Exception raise("Wrong exception type: expected " .. exceptionType type .. ", got " .. e type)
+        )
+    )
+    
+    if(raised not,
+        Exception raise("Expected exception " .. exceptionType type .. " was not raised")
+    )
+)
+
+// Usage
+Test assertRaises(ValidationError, block(
+    validateEmail("invalid")
+))
+"Test passed" println

Performance Considerations

// Exceptions have overhead
+benchmark := method(name, iterations, block,
+    start := Date now
+    iterations repeat(block)
+    elapsed := Date now - start
+    (name .. ": " .. elapsed) println
+)
+
+// Without exceptions
+benchmark("No exceptions", 100000, block(
+    if(Random value < 0.1, nil, "success")
+))
+
+// With exceptions
+benchmark("With exceptions", 100000, block(
+    try(
+        if(Random value < 0.1, Exception raise("error"))
+        "success"
+    ) catch(Exception, nil)
+))
+
+// Exceptions are slower - use for exceptional cases, not control flow

Common Pitfalls

Catching Too Broadly

// BAD: Catches everything, hiding bugs
+try(
+    complexOperation()
+) catch(Exception, e,
+    // Silently ignore all errors
+)
+
+// GOOD: Catch specific exceptions
+try(
+    complexOperation()
+) catch(NetworkError, e,
+    handleNetworkError(e)
+) catch(ValidationError, e,
+    handleValidationError(e)
+)

Resource Leaks

// BAD: File not closed on error
+file := File with("data.txt") openForReading
+processFile(file)  // If this throws, file never closes
+file close
+
+// GOOD: Use finally
+file := nil
+try(
+    file = File with("data.txt") openForReading
+    processFile(file)
+) finally(
+    if(file, file close)
+)

Exercises

  1. Result Type: Implement a Result type that can be either Ok(value) or Error(error), similar to Rust.
  2. Retry with Exponential Backoff: Create a retry mechanism with exponential backoff and jitter.
  3. Exception Logger: Build a logging system that captures and categorizes exceptions.
  4. Validation Chain: Create a validation system that accumulates all errors instead of failing on first.
  5. Async Exception Handling: Implement exception handling for coroutine-based async operations.

Real-World Example: HTTP Client with Error Handling

HttpClient := Object clone
+HttpClient timeoutMs := 5000
+HttpClient maxRetries := 3
+
+HttpError := Exception clone
+HttpError statusCode := nil
+
+HttpClient get := method(url,
+    retryCount := 0
+    
+    loop(
+        try(
+            response := self doRequest(url)
+            
+            if(response statusCode >= 200 and response statusCode < 300,
+                return response body
+            )
+            
+            if(response statusCode >= 400 and response statusCode < 500,
+                // Client error - don't retry
+                HttpError clone \
+                    setMessage("HTTP " .. response statusCode) \
+                    setSlot("statusCode", response statusCode) \
+                    raise
+            )
+            
+            // Server error - might retry
+            if(response statusCode >= 500,
+                error := HttpError clone \
+                    setMessage("Server error: " .. response statusCode) \
+                    setSlot("statusCode", response statusCode)
+                
+                if(retryCount < maxRetries,
+                    retryCount = retryCount + 1
+                    delay := (2 pow(retryCount)) * 100
+                    ("Retry " .. retryCount .. " after " .. delay .. "ms") println
+                    wait(delay / 1000)
+                    continue,
+                    error raise
+                )
+            )
+            
+        ) catch(NetworkError, e,
+            if(retryCount < maxRetries,
+                retryCount = retryCount + 1
+                ("Network error, retry " .. retryCount) println
+                wait(1)
+                continue,
+                e raise
+            )
+        )
+    )
+)
+
+// Usage with comprehensive error handling
+fetchUserData := method(userId,
+    try(
+        data := HttpClient get("https://api.example.com/users/" .. userId)
+        JSON parse(data)
+    ) catch(HttpError, e,
+        if(e statusCode == 404,
+            nil,  // User not found
+            if(e statusCode == 401,
+                Exception raise("Authentication required"),
+                Exception raise("HTTP error: " .. e statusCode)
+            )
+        )
+    ) catch(NetworkError, e,
+        Exception raise("Network unavailable")
+    ) catch(Exception, e,
+        Exception raise("Unexpected error: " .. e message)
+    )
+)

Conclusion

Io's exception system demonstrates the language's consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling.

The key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with finally blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications.

+ + + + diff --git a/website/content/docs/02-getting-started.md b/Getting-Started/_index.md similarity index 98% rename from website/content/docs/02-getting-started.md rename to Getting-Started/_index.md index 7759a97..369adc1 100644 --- a/website/content/docs/02-getting-started.md +++ b/Getting-Started/_index.md @@ -1,12 +1,10 @@ --- -title: "Getting Started" -weight: 30 +title: Getting Started with Io +topTitle: Io +subtitle: "Install Io, explore the REPL, and write your first programs." +nextSectionLink: true --- - - -# Chapter 2: Getting Started with Io - The best way to understand Io is to use it. In this chapter, we'll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you'll have a feel for Io's syntax and flow. ## Installing Io @@ -545,6 +543,3 @@ You now have enough Io knowledge to explore the deeper concepts. You can: - Read and write files In the next chapter, we'll dive deep into Io's object model and understand what "everything is an object" really means. - ---- - diff --git a/Getting-Started/index.html b/Getting-Started/index.html new file mode 100644 index 0000000..039cee7 --- /dev/null +++ b/Getting-Started/index.html @@ -0,0 +1,243 @@ + + + + + + +Getting Started with Io – Io + + + + +

Getting Started with Io

← The Io Programming Language
Io

Install Io, explore the REPL, and write your first programs.

The best way to understand Io is to use it. In this chapter, we'll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you'll have a feel for Io's syntax and flow.

Installing Io

macOS

If you're on macOS with Homebrew, installation is simple:

brew install io

Linux

On most Linux distributions, you'll need to build from source:

git clone https://github.com/IoLanguage/io.git
+cd io
+mkdir build
+cd build
+cmake ..
+make
+sudo make install

Windows

Windows users should use WSL (Windows Subsystem for Linux) and follow the Linux instructions, or use Docker:

docker run -it --rm stevedekorte/io

Verifying Installation

Once installed, verify Io is working:

$ io --version
+Io Programming Language, v. 20170906
+
+$ io
+Io> "Hello, World!" println
+Hello, World!
+==> Hello, World!
+Io> ^C

The REPL: Your Io Playground

Io's REPL is where you'll spend most of your learning time. Unlike compiled languages where you write, compile, and run, Io lets you experiment immediately.

Start the REPL by typing io:

$ io
+Io>

The prompt Io> indicates Io is ready for input. Let's explore:

Io> 2 + 2
+==> 4
+
+Io> "Hello" .. " " .. "World"
+==> Hello World
+
+Io> 10 > 5
+==> true

Notice the ==> prefix? That shows the return value of your expression. Everything in Io returns a value.

REPL Tips

  1. Multi-line input: The REPL detects incomplete expressions:
Io> if(true,
+...     "yes" println,
+...     "no" println
+... )
+yes
+==> yes
  1. Previous result: Use _ to reference the last result:
Io> 100 * 2
+==> 200
+Io> _ + 50
+==> 250
  1. Getting help: The REPL has built-in documentation:
Io> Lobby slotNames
+==> list(Protos, _, exit, forward, set_)
+
+Io> Number slotNames sort
+==> list(%, *, +, -, /, <, <=, ==, >, >=, abs, acos, asin, atan, between, ceil, cos, ...)

Your First Io Program

Let's write the traditional "Hello, World!" program. Create a file called hello.io:

"Hello, World!" println

Run it:

$ io hello.io
+Hello, World!

That's it. No class definitions, no main function, no boilerplate. Compare with Java:

public class Hello {
+    public static void main(String[] args) {
+        System.out.println("Hello, World!");
+    }
+}

Or even Python:

if __name__ == "__main__":
+    print("Hello, World!")

Io just runs your code.

Understanding Basic Syntax

Io's syntax is minimal. Let's explore the basics:

Messages and Receivers

In Io, everything is about sending messages to objects:

"hello" size         // Send 'size' message to "hello"
+==> 5
+
+"hello" at(0)        // Send 'at' message with argument 0
+==> h
+
+"hello" upper        // Send 'upper' message
+==> HELLO

Compare with method calls in Python:

"hello".upper()      # Python
"hello" upper        // Io - parentheses optional for no arguments

Arguments

Messages can have arguments, passed in parentheses:

"hello" at(1)                    // One argument
+==> e
+
+"hello" slice(1, 3)              // Two arguments
+==> el
+
+List append(1, 2, 3)            // Multiple arguments
+==> list(1, 2, 3)

Operators are Messages

This is crucial: operators in Io are just messages with special precedence:

2 + 3          // Send message "+" to 2 with argument 3
+2 +(3)         // Exactly the same thing
+2 send("+", 3) // Still the same thing!

This uniformity means you can redefine operators:

Number + := method(n, self - n)  // Redefine + to subtract!
+5 + 3
+==> 2

(Don't actually do this in real code!)

Variables and Assignment

In Io, variables are just slots on objects. By default, you're working with the Lobby object:

x := 10        // Create slot 'x' on Lobby with value 10
+x println      // Print it
+==> 10
+
+x = 20         // Update existing slot
+x println
+==> 20
+
+y = 30         // Error! Slot doesn't exist
+// Exception: Slot y not found

Note the distinction:

  • := creates a new slot
  • = updates an existing slot

This prevents accidental variable creation from typos:

counter := 0
+countr = 1     // Error - probably a typo!

Compare with JavaScript's similar issue:

let counter = 0;
+countr = 1;    // Creates global variable - probably a bug!

Control Flow

Io's control structures are methods, not special syntax:

If Statements

if(10 > 5,
+    "Yes" println,
+    "No" println
+)
+// Prints: Yes

Compare with Python:

if 10 > 5:
+    print("Yes")
+else:
+    print("No")

Since if is a method, you can even look at its implementation:

Io> if
+==> method(...)

Loops

// While loop
+i := 0
+while(i < 5,
+    i println
+    i = i + 1
+)
+
+// For loop
+for(i, 0, 4,
+    i println
+)
+
+// Times loop
+5 times(i,
+    i println
+)

Creating Objects

Let's create our first custom object:

Person := Object clone
+Person name := "Unknown"
+Person greet := method(
+    ("Hello, I'm " .. name) println
+)
+
+alice := Person clone
+alice name = "Alice"
+alice greet
+// Prints: Hello, I'm Alice

Compare with Python:

class Person:
+    def __init__(self):
+        self.name = "Unknown"
+    
+    def greet(self):
+        print(f"Hello, I'm {self.name}")
+
+alice = Person()
+alice.name = "Alice"
+alice.greet()

The key difference: Io has no class definition. Person is just an object we're using as a prototype.

Methods

Methods in Io are created with the method function:

Calculator := Object clone
+Calculator add := method(a, b, a + b)
+Calculator multiply := method(a, b, a * b)
+
+calc := Calculator clone
+calc add(5, 3) println        // 8
+calc multiply(4, 7) println    // 28

Methods have access to self (the receiver):

Counter := Object clone
+Counter count := 0
+Counter increment := method(
+    count = count + 1
+    self            // Return self for chaining
+)
+
+c := Counter clone
+c increment increment increment
+c count println    // 3

Lists and Iteration

Lists are fundamental in Io:

numbers := list(1, 2, 3, 4, 5)
+
+// Iteration
+numbers foreach(n,
+    n println
+)
+
+// Map
+squared := numbers map(n, n * n)
+squared println    // list(1, 4, 9, 16, 25)
+
+// Select (filter)
+evens := numbers select(n, n % 2 == 0)
+evens println      // list(2, 4)
+
+// Reduce
+sum := numbers reduce(+)
+sum println        // 15

Compare with Python:

numbers = [1, 2, 3, 4, 5]
+
+# Iteration
+for n in numbers:
+    print(n)
+
+# Map
+squared = [n * n for n in numbers]
+
+# Filter
+evens = [n for n in numbers if n % 2 == 0]
+
+# Reduce
+from functools import reduce
+sum = reduce(lambda a, b: a + b, numbers)

Working with Files

Reading and writing files is straightforward:

// Write to file
+file := File with("test.txt")
+file openForWriting
+file write("Hello, file!")
+file close
+
+// Read from file
+file := File with("test.txt")
+file openForReading
+contents := file contents
+contents println
+file close
+
+// Or more concisely
+File with("test.txt") contents println

A More Complete Example

Let's build something more substantial—a simple to-do list:

// todo.io - A simple to-do list manager
+
+TodoList := Object clone
+TodoList items := list()
+
+TodoList add := method(task,
+    items append(task)
+    self
+)
+
+TodoList show := method(
+    if(items size == 0,
+        "No tasks!" println,
+        items foreach(i, task,
+            ("  " .. (i + 1) .. ". " .. task) println
+        )
+    )
+    self
+)
+
+TodoList complete := method(index,
+    if(index > 0 and index <= items size,
+        task := items at(index - 1)
+        items removeAt(index - 1)
+        ("Completed: " .. task) println,
+        "Invalid task number" println
+    )
+    self
+)
+
+TodoList save := method(filename,
+    File with(filename) openForWriting write(items asJson) close
+    "Saved!" println
+    self
+)
+
+TodoList load := method(filename,
+    if(File with(filename) exists,
+        items = Yajl parseJson(File with(filename) contents)
+        "Loaded!" println,
+        "File not found" println
+    )
+    self
+)
+
+// Usage
+todo := TodoList clone
+todo add("Learn Io") add("Build something cool") add("Share with friends")
+todo show
+//   1. Learn Io
+//   2. Build something cool  
+//   3. Share with friends
+
+todo complete(1)
+// Completed: Learn Io
+
+todo show
+//   1. Build something cool
+//   2. Share with friends

Key Takeaways

Having written your first Io programs, you've probably noticed:

  1. Minimal syntax: No keywords for defining classes, functions, or variables. Everything uses the same message-passing syntax.
  2. Immediate feedback: The REPL makes experimentation effortless.
  3. Uniform model: Whether you're doing arithmetic, defining methods, or creating objects, it's all message passing.
  4. Flexibility: You can modify anything, even built-in types and operators.
  5. Simplicity: Programs are often shorter than their equivalents in other languages.

Exercises

Try these exercises to solidify your understanding:

  1. Number methods: Add a squared method to Number that returns the square of a number. Test it with 5 squared.
  2. String reversal: Create a method on Sequence (Io's string type) called reverse that returns the reversed string.
  3. Bank account: Create a BankAccount object with balance, deposit, and withdraw methods. Include protection against negative balances.
  4. FizzBuzz: Implement FizzBuzz in Io (print numbers 1-100, but "Fizz" for multiples of 3, "Buzz" for multiples of 5, "FizzBuzz" for both).
  5. Method chaining: Create a StringBuilder object that allows chaining: StringBuilder clone add("Hello") add(" ") add("World") toString

What's Different?

If you're coming from mainstream languages, here's what might feel strange:

  • No compile step: Your code runs immediately
  • No type declarations: Everything is dynamically typed
  • No class keyword: Objects are created by cloning
  • Operators aren't special: They're just messages
  • Everything returns a value: Even assignments and control structures

These differences aren't arbitrary—they all flow from Io's core principle of uniform message passing.

Moving Forward

You now have enough Io knowledge to explore the deeper concepts. You can:

  • Create and manipulate objects
  • Define methods
  • Use control structures
  • Work with collections
  • Read and write files

In the next chapter, we'll dive deep into Io's object model and understand what "everything is an object" really means.

+ + + + diff --git a/01-introduction.md b/Introduction/_index.md similarity index 98% rename from 01-introduction.md rename to Introduction/_index.md index 026cad1..4ef5c60 100644 --- a/01-introduction.md +++ b/Introduction/_index.md @@ -1,4 +1,9 @@ -# Chapter 1: Introduction - The Philosophy of Io +--- +title: "Introduction: The Philosophy of Io" +topTitle: Io +subtitle: "The history, philosophy, and seven pillars behind Io's radical simplicity." +nextSectionLink: true +--- > "The limits of my language mean the limits of my world." > - Ludwig Wittgenstein @@ -234,7 +239,3 @@ In the following chapters, we'll explore Io systematically: Along the way, we'll constantly compare Io with languages you know, helping you see familiar concepts in a new light. Ready to challenge everything you know about objects? Let's begin. - ---- - -*Next: [Chapter 2 - Getting Started with Io](02-getting-started.md)* \ No newline at end of file diff --git a/Introduction/index.html b/Introduction/index.html new file mode 100644 index 0000000..b5984dc --- /dev/null +++ b/Introduction/index.html @@ -0,0 +1,69 @@ + + + + + + +Introduction: The Philosophy of Io – Io + + + + +

Introduction: The Philosophy of Io

← The Io Programming Language
Io

The history, philosophy, and seven pillars behind Io's radical simplicity.

> "The limits of my language mean the limits of my world." > - Ludwig Wittgenstein

Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity.

Io believes in radical simplicity through uniform message passing.

The Birth of Io

Steve Dekorte created Io in 2002, during an interesting period in programming language history. Java had conquered the enterprise. Python and Ruby were gaining traction as "scripting" languages. JavaScript was still dismissed as a toy for web browsers. The mainstream programming world had largely settled on class-based object-orientation as the "right" way to organize programs.

But Dekorte was inspired by older, more radical ideas:

  • Smalltalk (1972): Everything is an object, computation happens through message passing
  • Self (1986): Objects without classes, prototype-based inheritance
  • Lisp (1958): Code as data, minimal syntax, powerful macros
  • Lua (1993): Simplicity, embeddability, tables as the universal data structure
  • NewtonScript (1993): Prototype-based inheritance in a practical system

Here's how Dekorte himself described his motivation:

> "I wanted a language that was small, simple, and consistent. Something you could understand completely. Most languages accumulate features over time, becoming more complex. I wanted to go the opposite direction—to see how much you could accomplish with how little."

The Seven Pillars of Io

Io rests on seven fundamental concepts. Master these, and you've mastered the language:

1. Everything is an Object

In Java or C++, primitives like integers and booleans aren't objects—they're special cases with different rules. In Io, everything is an object:

3 type println          // Number
+"hello" type println    // Sequence
+true type println       // true
+method() type println   // Block

Even true and false are objects. Even methods are objects. This uniformity eliminates countless special cases.

2. Objects are Collections of Slots

An object in Io is essentially a collection of named slots. Each slot can hold any value—data, methods, other objects:

person := Object clone
+person name := "Alice"              // data slot
+person age := 30                    // data slot  
+person greet := method("Hello!")    // method slot
+person friend := Object clone       // object slot

Compare this to JavaScript, which has a similar model but complicated by functions, prototypes, constructors, and (now) classes. Io keeps it simple: objects have slots, period.

3. Computation is Message Passing

This is perhaps Io's most radical idea. In most languages, computation involves various mechanisms:

  • Function calls: sqrt(16)
  • Method invocations: list.append(5)
  • Operators: x + y
  • Control structures: if (x > 0) { ... }
  • Assignment: x = 5

In Io, all of these are just messages sent to objects:

sqrt(16)           // send message "sqrt" with argument 16 to current object
+list append(5)     // send message "append" with argument 5 to list
+x + y              // send message "+" with argument y to x
+if(x > 0, ...)     // send message "if" with arguments to current object
+x = 5              // send message "setSlot" to current object

This uniformity has profound implications we'll explore throughout this book.

4. Objects Inherit from Prototypes

Rather than defining classes as templates for objects, Io uses prototypes—objects that serve as templates for other objects:

Animal := Object clone
+Animal move := method("Moving..." println)
+
+Dog := Animal clone
+Dog bark := method("Woof!" println)
+
+fido := Dog clone
+fido move  // "Moving..." (inherited from Animal)
+fido bark  // "Woof!" (inherited from Dog)

There's no distinction between "class" and "instance"—just objects cloning other objects.

5. Differential Inheritance

When you clone an object in Io, the new object doesn't copy all the slots from its prototype. Instead, it maintains a reference to its prototype and only stores its differences:

proto := Object clone
+proto x := 10
+proto y := 20
+
+child := proto clone
+child y = 30  // Only stores the difference
+
+child x println  // 10 (from proto)
+child y println  // 30 (from child)

This is memory efficient and enables powerful runtime modifications.

6. Everything is Modifiable at Runtime

In Io, nothing is sacred. You can modify any object at any time, including built-in types:

Number double := method(self * 2)
+5 double println  // 10
+
+// Even more radical - redefine addition!
+Number + := method(n, self * n)
+3 + 4 println  // 12 (now multiplication!)

This flexibility enables patterns impossible in more restrictive languages.

7. Homoiconicity Through Messages

Like Lisp, Io code is represented as data structures that can be manipulated by the program itself. But where Lisp uses lists, Io uses messages:

code := message(1 + 2)
+code println        // 1 +(2)
+code name println   // +
+code arguments println  // list(2)

This enables powerful metaprogramming without special syntax.

Comparing Philosophies

To understand Io's philosophy, let's contrast it with mainstream languages:

Java: Protection Through Types

public class BankAccount {
+    private double balance;  // Protected from direct access
+    
+    public void deposit(double amount) {
+        if (amount > 0) {
+            balance += amount;
+        }
+    }
+}

Java believes in protection—private fields, type checking, compile-time verification. The compiler prevents mistakes.

Python: Practicality and Conventions

class BankAccount:
+    def __init__(self):
+        self._balance = 0  # Convention: _ means "private"
+    
+    def deposit(self, amount):
+        if amount > 0:
+            self._balance += amount

Python believes in "we're all consenting adults." Protection through convention, not enforcement.

Io: Radical Flexibility

BankAccount := Object clone
+BankAccount balance := 0
+BankAccount deposit := method(amount,
+    if(amount > 0, balance = balance + amount)
+)

Io believes in complete openness. Any object can be modified by any code at any time. Power with responsibility.

The Cost of Simplicity

Io's radical simplicity comes with trade-offs:

Performance: Without static typing or compile-time optimization, Io can't match the speed of C++ or even JIT-compiled languages like Java. Message passing has overhead.

Tool Support: IDEs can't provide the same level of assistance without static types and fixed class definitions. Refactoring tools are limited.

Error Detection: Many errors that would be caught at compile-time in other languages only surface at runtime in Io.

Learning Curve: Paradoxically, Io's simplicity can make it harder to learn. With fewer built-in concepts, you have to build more from primitives.

The Power of Simplicity

But simplicity also brings power:

Understandability: You can understand the entire language. No edge cases, no historical baggage, no features that interact in surprising ways.

Flexibility: Patterns that require language extensions or complex frameworks in other languages are trivial in Io.

Expressiveness: With everything built from the same primitives, you can create abstractions that feel native to the language.

Exploration: Io is a playground for ideas that would be difficult to explore in more complex languages.

A Living Language

Despite its small community, Io continues to evolve and inspire. Its ideas have influenced:

  • JavaScript frameworks that embrace prototype-based patterns
  • Ruby libraries that use method_missing for DSLs
  • Newer languages like Factor and Ioke

More importantly, Io continues to teach programmers that our familiar concepts—classes, types, compilation—are choices, not requirements.

What's Next

In the following chapters, we'll explore Io systematically:

  • First, we'll get Io running and write our first programs
  • Then, we'll dive deep into the object model
  • We'll explore message passing and method resolution
  • We'll see how control structures emerge from simple primitives
  • We'll build increasingly sophisticated abstractions
  • Finally, we'll tackle advanced topics like concurrency and metaprogramming

Along the way, we'll constantly compare Io with languages you know, helping you see familiar concepts in a new light.

Ready to challenge everything you know about objects? Let's begin.

+ + + + diff --git a/05-messages-and-slots.md b/Messages-and-Slots/_index.md similarity index 99% rename from 05-messages-and-slots.md rename to Messages-and-Slots/_index.md index 7bb45c0..d58b16a 100644 --- a/05-messages-and-slots.md +++ b/Messages-and-Slots/_index.md @@ -1,4 +1,9 @@ -# Chapter 5: Messages and Slots +--- +title: Messages and Slots +topTitle: Io +subtitle: "The two mechanisms that drive every computation in Io." +nextSectionLink: true +--- At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth. @@ -623,7 +628,3 @@ Messages and slots form the foundation of Io's object model. Every computation This uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system. Understanding messages and slots deeply is essential to mastering Io. They're not just an implementation detail—they're the conceptual core that makes Io's radical simplicity possible. - ---- - -*Next: [Chapter 6 - Cloning and Inheritance](06-cloning-and-inheritance.md)* \ No newline at end of file diff --git a/Messages-and-Slots/index.html b/Messages-and-Slots/index.html new file mode 100644 index 0000000..930f8f7 --- /dev/null +++ b/Messages-and-Slots/index.html @@ -0,0 +1,425 @@ + + + + + + +Messages and Slots – Io + + + + +

The two mechanisms that drive every computation in Io.

At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth.

The Anatomy of a Message

When you write this in Io:

person setName("Alice")

What actually happens? Let's break it down:

  1. person is the receiver - the object receiving the message
  2. setName is the message name (or selector)
  3. "Alice" is the argument to the message
  4. The entire expression is a message send

But here's where it gets interesting. Messages are objects too:

// Create a message object
+msg := message(person setName("Alice"))
+
+// Inspect it
+msg name println          // setName
+msg arguments println     // list(Message_0x...)
+msg arguments first code println  // "Alice"
+
+// Execute it
+msg doInContext(Lobby)    // Actually calls person setName("Alice")

Slots: The Object's Memory

Slots are named storage locations in objects. They can hold any value:

obj := Object clone
+
+// Create slots with different values
+obj number := 42                    // Number
+obj text := "hello"                 // String
+obj method := method(x, x * 2)      // Method
+obj child := Object clone            // Another object
+obj flag := true                     // Boolean
+
+// List all slots
+obj slotNames println
+// list(number, text, method, child, flag)
+
+// Check for slots
+obj hasSlot("number") println       // true
+obj hasSlot("missing") println      // false
+
+// Get slot values
+obj getSlot("number") println       // 42
+obj getSlot("method") println       // method(x, ...)

The Message Resolution Algorithm

When an object receives a message, Io follows a specific algorithm to find the corresponding slot:

Animal := Object clone
+Animal speak := method("generic sound" println)
+
+Dog := Animal clone
+Dog speak := method("woof" println)
+Dog wagTail := method("wagging..." println)
+
+rover := Dog clone
+rover name := "Rover"
+
+// When rover receives 'speak':
+rover speak
+// 1. Look for 'speak' in rover - not found
+// 2. Look for 'speak' in rover's proto (Dog) - found!
+// 3. Execute Dog's speak method with rover as self
+
+// When rover receives 'name':
+rover name
+// 1. Look for 'name' in rover - found!
+// 2. Return the value
+
+// Visual representation:
+/*
+    Object
+      ↑
+    Animal (speak: "generic sound")
+      ↑
+     Dog (speak: "woof", wagTail)
+      ↑
+    rover (name: "Rover")
+*/

Creating and Modifying Slots

Io distinguishes between creating new slots and updating existing ones:

obj := Object clone
+
+// Create a new slot with :=
+obj x := 10
+obj hasSlot("x") println         // true
+
+// Update existing slot with =
+obj x = 20
+obj x println                    // 20
+
+// Trying to update non-existent slot fails
+obj y = 30                       // Exception: Slot y not found
+
+// But you can use setSlot to create or update
+obj setSlot("y", 30)            // Creates if doesn't exist
+obj y println                    // 30
+
+// Remove slots
+obj removeSlot("y")
+obj hasSlot("y") println        // false

This distinction helps catch typos:

counter := 0
+countr = 1    // Error! Probably meant 'counter'

Methods Are Just Slots

In Io, methods aren't special—they're just slots that hold executable blocks:

Calculator := Object clone
+
+// Method is just a slot containing a method object
+Calculator add := method(a, b, a + b)
+
+// You can manipulate methods like any other value
+addMethod := Calculator getSlot("add")
+addMethod type println           // Block
+
+// You can copy methods between objects
+ScientificCalc := Object clone
+ScientificCalc addition := Calculator getSlot("add")
+ScientificCalc addition(5, 3) println  // 8
+
+// You can even store methods in variables
+operation := method(x, x * 2)
+Calculator double := operation
+Calculator double(21) println    // 42

The 'self' and 'sender' Context

Every method has access to special variables:

Printer := Object clone
+Printer name := "HP"
+Printer print := method(doc,
+    ("Printer: " .. self name) println    // self = receiver
+    ("Sender: " .. sender type) println   // sender = who sent the message
+    ("Document: " .. doc) println
+)
+
+Computer := Object clone
+Computer sendJob := method(
+    Printer print("report.pdf")
+)
+
+Computer sendJob
+// Printer: HP
+// Sender: Computer
+// Document: report.pdf

Message Forwarding

When an object doesn't have a slot for a received message, it calls forward:

Proxy := Object clone
+Proxy target := nil
+Proxy forward := method(
+    ("Forwarding " .. call message name .. " to target") println
+    call evalArgAt(0) // This would forward to target
+)
+
+p := Proxy clone
+p doSomething("arg")
+// Forwarding doSomething to target

This enables powerful patterns like delegation and method missing:

// Ruby-style method_missing
+DynamicObject := Object clone
+DynamicObject forward := method(
+    methodName := call message name
+    if(methodName beginsWithSeq("get"),
+        # Handle getters
+        property := methodName afterSeq("get") lowercase
+        self getSlot(property),
+        # Handle setters
+        if(methodName beginsWithSeq("set"),
+            property := methodName afterSeq("set") lowercase
+            value := call evalArgAt(0)
+            self setSlot(property, value)
+        )
+    )
+)
+
+obj := DynamicObject clone
+obj setName("Alice")     // Creates 'name' slot
+obj getName println       // "Alice"

Lazy Evaluation with Messages

Messages don't evaluate immediately—they're data structures you can manipulate:

// Messages as data
+expr := message(2 + 3 * 4)
+expr println             // 2 +(3 *(4))
+
+// Evaluate when ready
+result := expr doInContext(Lobby)
+result println           // 14
+
+// Modify messages before evaluation
+expr := message(x + y)
+context := Object clone
+context x := 10
+context y := 20
+expr doInContext(context) println  // 30

This enables macro-like capabilities:

// Create a timing macro
+Object time := method(
+    code := call argAt(0)  // Get the message, not its value
+    start := Date now
+    result := code doInContext(call sender)
+    elapsed := Date now - start
+    ("Elapsed: " .. elapsed) println
+    result
+)
+
+// Use it
+time(
+    sum := 0
+    for(i, 1, 1000000, sum = sum + i)
+    sum
+)
+// Elapsed: 0.234
+// Returns: 500000500000

Call Introspection

The call object provides detailed information about the current method invocation:

Object debug := method(
+    "=== Call Debug ===" println
+    ("Sender: " .. call sender type) println
+    ("Target: " .. call target type) println
+    ("Message: " .. call message name) println
+    ("Args: " .. call message arguments) println
+    ("Activated: " .. call activated type) println
+    "================" println
+)
+
+TestObject := Object clone
+TestObject test := method(
+    debug
+)
+
+TestObject test
+// === Call Debug ===
+// Sender: Lobby
+// Target: TestObject
+// Message: debug
+// Args: list()
+// Activated: Block
+// ================

Operator Messages

Operators are messages with special precedence rules. Unlike many languages where operators are built-in syntax, in Io they're regular messages that follow configurable precedence levels. This means you can treat operators like any other method - you can override them, create new ones, or call them using regular message passing syntax.

The OperatorTable manages operator precedence, with levels from 0 (highest) to 13 (lowest). Standard arithmetic follows familiar rules: multiplication and division (level 3) bind tighter than addition and subtraction (level 4). Assignment operators like := and = have the lowest precedence (level 13), ensuring they capture everything to their right.

// These are equivalent
+2 + 3 * 4
+2 +(3 *(4))
+
+// You can see the precedence
+OperatorTable println
+
+// You can add custom operators
+OperatorTable addOperator("@@", 5)
+Number @@ := method(n,
+    self pow(n) + n pow(self)
+)
+
+2 @@ 3 println  // 17 (2^3 + 3^2 = 8 + 9)
+
+// Operators are just messages
+5 send("+", 3) println  // 8
+"hello" send("at", 1) println  // e

This unified treatment of operators as messages enables powerful metaprogramming techniques. You can intercept arithmetic operations for logging, create domain-specific operators for mathematical or business logic, or even implement operator overloading for custom types - all using the same message passing mechanism that underlies the entire language.

Assignment Messages

Even assignment is message passing:

// These are equivalent
+x := 10
+setSlot("x", 10)
+
+// And these
+x = 20
+updateSlot("x", 20)
+
+// You can override assignment behavior
+Object setSlot := method(name, value,
+    ("Setting " .. name .. " to " .. value) println
+    resend  // Call original setSlot
+)
+
+y := 42
+// Setting y to 42

Method Activation vs. Value Access

Io distinguishes between activatable and non-activatable values:

obj := Object clone
+
+// Methods are activatable - they run when accessed
+obj greet := method("Hello!" println)
+obj greet  // Prints "Hello!"
+
+// Other values are just returned
+obj name := "Alice"
+obj name  // Returns "Alice"
+
+// You can get a method without activating it
+m := obj getSlot("greet")
+m println  // method(...)
+
+// And activate it later
+m call  // Prints "Hello!"
+
+// Check if something is activatable
+obj getSlot("greet") isActivatable println  // true
+obj getSlot("name") isActivatable println   // false

Building a Message-Based DSL

Let's build a simple HTML DSL using messages:

HTML := Object clone
+HTML forward := method(
+    tagName := call message name
+    args := call message arguments
+    
+    // Build opening tag
+    result := "<" .. tagName
+    
+    // Handle attributes (first arg if it's a Map)
+    if(args size > 0 and args at(0) name == "curlyBrackets",
+        attrs := call evalArgAt(0)
+        attrs foreach(key, value,
+            result = result .. " " .. key .. "=\"" .. value .. "\""
+        )
+        args removeFirst
+    )
+    
+    result = result .. ">"
+    
+    // Handle content
+    args foreach(arg,
+        content := call sender doMessage(arg)
+        if(content, result = result .. content)
+    )
+    
+    // Closing tag
+    result = result .. "</" .. tagName .. ">"
+    result
+)
+
+// Usage
+html := HTML clone
+
+page := html div({ "class": "container" },
+    html h1("Welcome"),
+    html p("This is a paragraph"),
+    html ul(
+        html li("Item 1"),
+        html li("Item 2")
+    )
+)
+
+page println
+// <div class="container"><h1>Welcome</h1><p>This is a paragraph</p><ul><li>Item 1</li><li>Item 2</li></ul></div>

Performance Considerations

Message passing has overhead compared to direct function calls:

// Traditional method call
+obj := Object clone
+obj directMethod := method(x, x * 2)
+
+// Message construction and sending
+msg := Message clone setName("directMethod") setArguments(list(Message clone setName("5")))
+
+// Benchmark
+time(
+    100000 times(obj directMethod(5))
+)
+// 0.015000 seconds
+
+time(
+    100000 times(obj doMessage(msg))
+)
+// 0.048000 seconds
+
+// Direct calls are ~3x faster, but message objects enable metaprogramming

Common Patterns

Message passing and slot manipulation enable elegant implementations of common design patterns. These patterns leverage Io's dynamic nature to create flexible, maintainable code structures that would require significant boilerplate in more static languages.

Property Access Pattern

This pattern demonstrates how to dynamically generate getters and setters using message construction. Instead of manually writing accessor methods for each property, we use Io's metaprogramming capabilities to create them on demand. The generated methods follow a naming convention where properties are stored with an underscore prefix internally, while the public interface uses clean method names.

Person := Object clone
+Person init := method(
+    self name := nil
+    self age := nil
+    self
+)
+
+// Generate getters/setters with messages
+Person addAccessors := method(slotName,
+    // Getter
+    self setSlot(slotName,
+        method(self getSlot("_" .. slotName))
+    )
+
+    // Setter
+    self setSlot("set" .. slotName asCapitalized,
+        method(value, self setSlot("_" .. slotName, value))
+    )
+)
+
+Person addAccessors("name")
+Person addAccessors("age")
+
+p := Person clone
+p setName("Alice")
+p name println  // "Alice"

The beauty of this approach is that it scales effortlessly - adding new properties requires just one line of code per property, and the accessor methods are created with consistent behavior and naming. This pattern is particularly useful when building data models or domain objects where property access needs to be controlled or monitored.

Chain of Responsibility

The Chain of Responsibility pattern creates a pipeline of handlers where each handler decides whether to process a request or pass it to the next handler. In Io, this pattern is particularly clean because message passing naturally supports delegation. Each handler in the chain examines the request and either processes it or forwards it using simple message passing.

Handler := Object clone
+Handler next := nil
+Handler handle := method(request,
+    if(self canHandle(request),
+        self process(request),
+        if(next, next handle(request))
+    )
+)
+
+AuthHandler := Handler clone
+AuthHandler canHandle := method(request,
+    request hasSlot("needsAuth")
+)
+AuthHandler process := method(request,
+    "Authenticating..." println
+)
+
+LogHandler := Handler clone
+LogHandler canHandle := method(request, true)
+LogHandler process := method(request,
+    ("Logging: " .. request type) println
+)
+
+// Build chain
+auth := AuthHandler clone
+log := LogHandler clone
+auth next := log
+
+// Process requests
+request := Object clone
+request type := "GET"
+request needsAuth := true
+
+auth handle(request)
+// Authenticating...
+// Logging: GET

This pattern is invaluable for building middleware systems, request processors, or event handling pipelines. The chain can be dynamically reconfigured at runtime by simply changing the next references, and new handler types can be added without modifying existing code. The pattern also naturally supports optional processing - handlers can choose to stop the chain or allow it to continue based on the request's characteristics.

Debugging Messages

Understanding message flow is crucial for debugging:

Object trace := method(
+    self setSlot("forward",
+        method(
+            ("Missing: " .. call message name) println
+            ("Arguments: " .. call message arguments) println
+            ("Sender: " .. sender type) println
+        )
+    )
+    self
+)
+
+buggy := Object clone trace
+buggy doSomethingWrong(1, 2, 3)
+// Missing: doSomethingWrong
+// Arguments: list(1, 2, 3)
+// Sender: Lobby

Exercises

  1. Message Logger: Create a wrapper that logs all messages sent to an object, including arguments and return values.
  2. Lazy Properties: Implement properties that are only computed when first accessed, then cached.
  3. Message Queue: Build an object that queues messages and executes them later in order.
  4. Method Decorators: Create a system for wrapping methods with before/after behavior using messages.
  5. Message Router: Build a router that directs messages to different handlers based on patterns.

Advanced Message Techniques

Message Rewriting

Rewriter := Object clone
+Rewriter forward := method(
+    msg := call message
+    
+    // Rewrite add to multiply
+    if(msg name == "add",
+        msg setName("multiply")
+    )
+    
+    // Continue with modified message
+    resend
+)
+
+calc := Rewriter clone
+calc multiply := method(a, b, a * b)
+calc add(3, 4) println  // 12 (rewritten to multiply!)

Conditional Message Sending

Object sendIf := method(condition, messageName,
+    if(condition,
+        self doMessage(Message clone setName(messageName))
+    )
+)
+
+Object sendUnless := method(condition, messageName,
+    if(condition not,
+        self doMessage(Message clone setName(messageName))
+    )
+)
+
+obj := Object clone
+obj greet := method("Hello!" println)
+
+obj sendIf(true, "greet")      // Hello!
+obj sendUnless(false, "greet")  // Hello!

Conclusion

Messages and slots form the foundation of Io's object model. Every computation—from simple arithmetic to complex method calls—is accomplished through message passing. Objects store their state and behavior in slots, and respond to messages by looking up the corresponding slots.

This uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system.

Understanding messages and slots deeply is essential to mastering Io. They're not just an implementation detail—they're the conceptual core that makes Io's radical simplicity possible.

+ + + + diff --git a/website/content/docs/11-metaprogramming.md b/Metaprogramming/_index.md similarity index 99% rename from website/content/docs/11-metaprogramming.md rename to Metaprogramming/_index.md index 428e628..307120c 100644 --- a/website/content/docs/11-metaprogramming.md +++ b/Metaprogramming/_index.md @@ -1,12 +1,10 @@ --- -title: "Metaprogramming" -weight: 120 +title: Metaprogramming +topTitle: Io +subtitle: "Inspecting, modifying, and generating code at runtime." +nextSectionLink: true --- - - -# Chapter 11: Metaprogramming - Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io's powerful metaprogramming capabilities. ## Messages as Data @@ -684,6 +682,3 @@ foundUser := User findById(1) Metaprogramming in Io isn't a special feature—it's a natural consequence of the language's design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages. The key to effective metaprogramming in Io is understanding that you're not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications. - ---- - diff --git a/Metaprogramming/index.html b/Metaprogramming/index.html new file mode 100644 index 0000000..95c6e74 --- /dev/null +++ b/Metaprogramming/index.html @@ -0,0 +1,528 @@ + + + + + + +Metaprogramming – Io + + + + +

Inspecting, modifying, and generating code at runtime.

Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io's powerful metaprogramming capabilities.

Messages as Data

In Io, code is data. Messages are objects you can create, inspect, and manipulate:

// Create a message from code
+msg := message(2 + 3 * 4)
+
+// Inspect its structure
+msg println              // 2 +(3 *(4))
+msg name println         // +
+msg arguments println    // list(Message_0x...)
+msg arguments at(0) println  // 3 *(4)
+
+// Evaluate it
+result := msg doInContext(Lobby)
+result println           // 14
+
+// Modify it
+msg setName("*")
+msg doInContext(Lobby) println  // 6 (now it's 2 * 3 * 4)

Compare this to Lisp's code-as-data philosophy:

; Lisp
+(defparameter code '(+ 2 (* 3 4)))
+(eval code)  ; 14

But Io uses messages instead of lists, which feels more natural for object-oriented code.

Building Messages Programmatically

// Build a message from scratch
+msg := Message clone
+msg setName("println")
+msg setArguments(list(Message clone setName("\"Hello, World!\"")))
+
+// Execute it
+Lobby doMessage(msg)  // Hello, World!
+
+// Build more complex messages
+createAdder := method(n,
+    msg := Message clone setName("+")
+    msg setArguments(list(Message clone setName(n asString)))
+    msg
+)
+
+adder5 := createAdder(5)
+7 doMessage(adder5) println  // 12

Method Introspection

Methods are objects you can examine and modify:

obj := Object clone
+obj greet := method(name, "Hello, " .. name .. "!")
+
+// Get the method object
+m := obj getSlot("greet")
+m type println                    // Block
+m argumentNames println           // list(name)
+m code println                   // "Hello, " ..(name) ..("!")
+
+// Modify method implementation
+obj greet = method(name, "Goodbye, " .. name .. "!")
+obj greet("World") println       // Goodbye, World!
+
+// Copy methods between objects
+other := Object clone
+other sayHi := obj getSlot("greet")
+other sayHi("Io") println        // Goodbye, Io!

The call Object

The call object provides runtime context information:

Object introspect := method(
+    "=== Call Introspection ===" println
+    ("Sender: " .. call sender type) println
+    ("Target: " .. call target type) println
+    ("Message: " .. call message) println
+    ("Arguments: " .. call message arguments) println
+    ("Activated: " .. call activated) println
+    "========================" println
+)
+
+TestObj := Object clone
+TestObj test := method(a, b,
+    introspect
+    a + b
+)
+
+TestObj test(5, 3)
+// === Call Introspection ===
+// Sender: Lobby
+// Target: TestObj
+// Message: introspect
+// Arguments: list()
+// Activated: method(...)
+// ========================

Dynamic Method Creation

Create methods at runtime:

// Create getters and setters dynamically
+Object addProperty := method(name, defaultValue,
+    // Create storage slot
+    self setSlot("_" .. name, defaultValue)
+    
+    // Create getter
+    self setSlot(name, 
+        method(self getSlot("_" .. call message name))
+    )
+    
+    // Create setter
+    self setSlot("set" .. name asCapitalized,
+        method(value,
+            self setSlot("_" .. call message name beforeSeq("set") asLowercase, value)
+            self  // For chaining
+        )
+    )
+)
+
+Person := Object clone
+Person addProperty("name", "Unknown")
+Person addProperty("age", 0)
+
+p := Person clone
+p setName("Alice") setAge(30)
+p name println   // Alice
+p age println    // 30

Method Missing Pattern

Intercept undefined method calls:

DynamicObject := Object clone
+DynamicObject forward := method(
+    messageName := call message name
+    args := call message arguments
+    
+    ("Intercepted: " .. messageName) println
+    ("Arguments: " .. args) println
+    
+    // Handle dynamically
+    if(messageName beginsWithSeq("get"),
+        property := messageName afterSeq("get") asLowercase
+        return self getSlot(property)
+    )
+    
+    if(messageName beginsWithSeq("set"),
+        property := messageName afterSeq("set") asLowercase
+        value := call evalArgAt(0)
+        return self setSlot(property, value)
+    )
+    
+    Exception raise("Unknown method: " .. messageName)
+)
+
+obj := DynamicObject clone
+obj setName("Bob")      // Intercepted: setName
+obj getName println      // Bob

Code Generation

Generate code as strings and evaluate:

// Generate a class-like structure
+generateClass := method(className, properties,
+    code := className .. " := Object clone\n"
+    
+    // Generate init method
+    code = code .. className .. " init := method(\n"
+    properties foreach(prop,
+        code = code .. "    self " .. prop .. " := nil\n"
+    )
+    code = code .. "    self\n)\n"
+    
+    // Generate property accessors
+    properties foreach(prop,
+        // Getter
+        code = code .. className .. " " .. prop .. " := method(_" .. prop .. ")\n"
+        // Setter
+        code = code .. className .. " set" .. prop asCapitalized .. " := method(v, _" .. prop .. " = v; self)\n"
+    )
+    
+    code doString  // Evaluate the generated code
+    Lobby getSlot(className)  // Return the created object
+)
+
+// Use the generator
+Car := generateClass("Car", list("make", "model", "year"))
+myCar := Car clone init
+myCar setMake("Toyota") setModel("Camry") setYear(2020)
+myCar make println  // Toyota

Aspect-Oriented Programming

Implement cross-cutting concerns:

// Method wrapping for logging
+Object addLogging := method(methodName,
+    original := self getSlot(methodName)
+    
+    self setSlot(methodName, method(
+        ("Calling " .. methodName .. " with args: " .. call message arguments) println
+        result := nil
+        e := try(result = original doMessage(call message, call sender))
+        if(e,
+            ("Error in " .. methodName .. ": " .. e message) println
+            e raise,
+            ("Returned: " .. result) println
+            result
+        )
+    ))
+)
+
+Calculator := Object clone
+Calculator add := method(a, b, a + b)
+Calculator divide := method(a, b, a / b)
+
+Calculator addLogging("add")
+Calculator addLogging("divide")
+
+Calculator add(5, 3)
+// Calling add with args: list(5, 3)
+// Returned: 8
+
+Calculator divide(10, 0)
+// Calling divide with args: list(10, 0)
+// Error in divide: divide by zero

Macro System

Io's macros transform code before evaluation:

// Define a macro
+Object unless := macro(condition, action,
+    // Macros receive unevaluated arguments as messages
+    // Transform to if(condition not, action)
+    message(if) setArguments(
+        list(
+            message(not) setTarget(condition),
+            action
+        )
+    )
+)
+
+// Use the macro
+x := 5
+unless(x > 10, "x is not greater than 10" println)
+// x is not greater than 10
+
+// Timing macro
+Object time := macro(code,
+    // Generate timing code
+    message(do) setArguments(list(
+        message(start := Date now),
+        code,
+        message(elapsed := Date now - start),
+        message(("Elapsed: " .. elapsed) println),
+        message(result)
+    ))
+)
+
+// Use it
+time(
+    sum := 0
+    for(i, 1, 1000000, sum = sum + i)
+    sum
+)
+// Elapsed: 0.234

Self-Modifying Code

Objects can modify their own methods:

Counter := Object clone
+Counter count := 0
+Counter increment := method(
+    count = count + 1
+    
+    // Self-modify after 5 calls
+    if(count >= 5,
+        self increment = method(
+            Exception raise("Counter limit reached")
+        )
+    )
+    
+    count
+)
+
+c := Counter clone
+5 repeat(i, c increment println)  // 1, 2, 3, 4, 5
+c increment  // Exception: Counter limit reached

Reflection API

Io provides comprehensive reflection capabilities:

// Object introspection utilities
+Object describe := method(
+    ("Type: " .. self type) println
+    
+    "Local Slots:" println
+    self slotNames sort foreach(name,
+        value := self getSlot(name)
+        ("  " .. name .. " = " .. value type) println
+    )
+    
+    "Proto chain:" println
+    proto := self proto
+    while(proto and proto != Object,
+        ("  -> " .. proto type) println
+        proto = proto proto
+    )
+)
+
+// Usage
+person := Object clone
+person name := "Alice"
+person age := 30
+person greet := method("Hello!")
+
+person describe
+// Type: Object
+// Local Slots:
+//   age = Number
+//   greet = Block
+//   name = Sequence
+// Proto chain:
+//   -> Object

DSL Creation with Metaprogramming

Build domain-specific languages:

// SQL-like DSL
+Table := Object clone
+Table columns := list()
+Table rows := list()
+
+Table select := method(
+    query := SelectQuery clone
+    query table := self
+    query
+)
+
+SelectQuery := Object clone
+SelectQuery conditions := list()
+
+SelectQuery where := method(
+    // Parse conditions from arguments
+    args := call message arguments
+    args foreach(arg,
+        conditions append(arg)
+    )
+    self
+)
+
+SelectQuery execute := method(
+    table rows select(row,
+        result := true
+        conditions foreach(cond,
+            result = result and cond doInContext(row)
+        )
+        result
+    )
+)
+
+// Usage
+users := Table clone
+users columns = list("name", "age", "city")
+users rows = list(
+    Object clone do(name := "Alice"; age := 30; city := "NYC"),
+    Object clone do(name := "Bob"; age := 25; city := "LA"),
+    Object clone do(name := "Charlie"; age := 35; city := "NYC")
+)
+
+results := users select where(age > 25, city == "NYC") execute
+results foreach(r, (r name .. ": " .. r age) println)
+// Alice: 30
+// Charlie: 35

Performance Profiling

Use metaprogramming for profiling:

Profiler := Object clone
+Profiler stats := Map clone
+
+Object profile := method(methodName,
+    original := self getSlot(methodName)
+    
+    self setSlot(methodName, method(
+        start := Date now
+        result := original doMessage(call message, call sender)
+        elapsed := Date now - start
+        
+        key := self type .. "::" .. methodName
+        if(Profiler stats hasKey(key) not,
+            Profiler stats atPut(key, list(0, 0))
+        )
+        
+        stats := Profiler stats at(key)
+        stats atPut(0, stats at(0) + 1)      // Count
+        stats atPut(1, stats at(1) + elapsed) // Total time
+        
+        result
+    ))
+)
+
+Profiler report := method(
+    "=== Profiling Report ===" println
+    stats foreach(key, data,
+        avg := data at(1) / data at(0)
+        (key .. ": " .. data at(0) .. " calls, " .. 
+         data at(1) .. "s total, " .. avg .. "s avg") println
+    )
+)
+
+// Usage
+Math := Object clone
+Math factorial := method(n,
+    if(n <= 1, 1, n * factorial(n - 1))
+)
+Math profile("factorial")
+
+10 repeat(Math factorial(20))
+Profiler report

Compile-Time Computation

Use macros for compile-time optimization:

// Macro that pre-computes constant expressions
+Object precompute := macro(expr,
+    // If expression contains only literals, evaluate now
+    result := nil
+    e := try(result = expr doInContext(Object clone))
+    
+    if(e isNil,
+        // Successfully evaluated - return literal
+        Message clone setName(result asString),
+        // Contains variables - return original
+        expr
+    )
+)
+
+// Usage
+x := 10
+y := precompute(5 * 6 + 7)  // Computed at parse time
+z := precompute(x * 2)      // Can't precompute, has variable
+
+y println  // 37 (was precomputed)

Method Combination

Implement method combination patterns:

// Before/After/Around methods
+Object addBefore := method(methodName, beforeBlock,
+    original := self getSlot(methodName)
+    self setSlot(methodName, method(
+        beforeBlock doMessage(call message, call sender)
+        original doMessage(call message, call sender)
+    ))
+)
+
+Object addAfter := method(methodName, afterBlock,
+    original := self getSlot(methodName)
+    self setSlot(methodName, method(
+        result := original doMessage(call message, call sender)
+        afterBlock call(result)
+        result
+    ))
+)
+
+Object addAround := method(methodName, aroundBlock,
+    original := self getSlot(methodName)
+    self setSlot(methodName, method(
+        aroundBlock call(original, call message, call sender)
+    ))
+)
+
+// Usage
+BankAccount := Object clone
+BankAccount balance := 100
+BankAccount withdraw := method(amount, balance = balance - amount)
+
+BankAccount addBefore("withdraw", method(amount,
+    ("Withdrawing " .. amount) println
+))
+
+BankAccount addAfter("withdraw", method(result,
+    ("New balance: " .. balance) println
+))
+
+BankAccount addAround("withdraw", method(original, msg, sender,
+    amount := msg argAt(0) doInContext(sender)
+    if(amount > balance,
+        Exception raise("Insufficient funds"),
+        original doMessage(msg, sender)
+    )
+))
+
+account := BankAccount clone
+account withdraw(50)
+// Withdrawing 50
+// New balance: 50

Common Pitfalls

Evaluation Context

// PROBLEM: Wrong context
+makeMethod := method(code,
+    method doString(code)  // code evaluates in method's context
+)
+
+obj := Object clone
+obj value := 10
+obj badMethod := makeMethod("value * 2")
+// obj badMethod  // Error: value not found
+
+// SOLUTION: Use message objects
+makeMethod := method(code,
+    method(code doInContext(self))
+)

Performance Impact

// Metaprogramming has runtime cost
+directCall := method(x, x * 2)
+dynamicCall := method(x,
+    msg := Message clone setName("*") setArguments(list(Message clone setName("2")))
+    x doMessage(msg)
+)
+
+// directCall is much faster than dynamicCall

Exercises

  1. Memoization Decorator: Create a decorator that automatically memoizes any method.
  2. Contract System: Implement Design by Contract with pre/post conditions.
  3. Mock Object Generator: Build a system that generates mock objects for testing.
  4. Dependency Injection: Create a DI container using metaprogramming.
  5. ORM: Build a simple object-relational mapper that generates methods from table schemas.

Real-World Example: ActiveRecord Pattern

// Simple ActiveRecord implementation
+ActiveRecord := Object clone
+ActiveRecord tableName := nil
+ActiveRecord connection := nil  // Database connection
+
+ActiveRecord findById := method(id,
+    sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id
+    row := connection execute(sql) first
+    if(row,
+        obj := self clone
+        row foreach(column, value,
+            obj setSlot(column, value)
+        )
+        obj
+    )
+)
+
+ActiveRecord save := method(
+    if(hasSlot("id"),
+        // Update
+        sql := "UPDATE " .. tableName .. " SET "
+        updates := list()
+        slotNames foreach(name,
+            if(name != "id",
+                updates append(name .. " = '" .. getSlot(name) .. "'")
+            )
+        )
+        sql = sql .. updates join(", ") .. " WHERE id = " .. id
+    ,
+        // Insert
+        sql := "INSERT INTO " .. tableName
+        columns := list()
+        values := list()
+        slotNames foreach(name,
+            columns append(name)
+            values append("'" .. getSlot(name) .. "'")
+        )
+        sql = sql .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")"
+    )
+    
+    connection execute(sql)
+    self
+)
+
+// Generate model from table
+generateModel := method(name, table, columns,
+    model := ActiveRecord clone
+    model type := name
+    model tableName = table
+    
+    // Add properties
+    columns foreach(column,
+        model setSlot(column, nil)
+    )
+    
+    // Add validations
+    model validate := method(
+        // Generated validation code
+        true
+    )
+    
+    // Store in Lobby
+    Lobby setSlot(name, model)
+    model
+)
+
+// Usage
+User := generateModel("User", "users", list("id", "name", "email", "age"))
+
+user := User clone
+user name = "Alice"
+user email = "alice@example.com"
+user age = 30
+// user save
+
+foundUser := User findById(1)

Conclusion

Metaprogramming in Io isn't a special feature—it's a natural consequence of the language's design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages.

The key to effective metaprogramming in Io is understanding that you're not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications.

+ + + + diff --git a/website/content/docs/00-preface.md b/Preface/_index.md similarity index 97% rename from website/content/docs/00-preface.md rename to Preface/_index.md index c6ee549..3903199 100644 --- a/website/content/docs/00-preface.md +++ b/Preface/_index.md @@ -1,12 +1,10 @@ --- -title: "Why Io?" -weight: 10 +title: "Preface: Why Io?" +topTitle: Io +subtitle: "Why learn a prototype-based language with a small community? An honest answer." +nextSectionLink: true --- - - -# Preface: Why Io? - In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer. ## The Value of Alternative Paradigms @@ -109,6 +107,3 @@ I've been programming for [X] years and have worked in dozens of languages. Most Whether you spend a weekend or a month with Io, I believe you'll emerge a better programmer. Not because you'll use Io in production (though you might), but because you'll have a broader perspective on what programming languages can be. Let's begin. - ---- - diff --git a/Preface/index.html b/Preface/index.html new file mode 100644 index 0000000..66a7747 --- /dev/null +++ b/Preface/index.html @@ -0,0 +1,29 @@ + + + + + + +Preface: Why Io? – Io + + + + +

Why learn a prototype-based language with a small community? An honest answer.

In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer.

The Value of Alternative Paradigms

Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you're writing Java, C#, Python, or Ruby, you're likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought.

Io offers something different: a pure prototype-based object system where these familiar distinctions dissolve. There are no classes, only objects. There is no separation between data and behavior. Everything—including control structures and operators—is accomplished through message passing between objects.

Consider this simple comparison. In Python, you might write:

class Dog:
+    def __init__(self, name):
+        self.name = name
+    
+    def bark(self):
+        return f"{self.name} says woof!"
+
+fido = Dog("Fido")
+print(fido.bark())

In Io, the same concept looks like this:

Dog := Object clone
+Dog bark := method(name .. " says woof!")
+
+fido := Dog clone
+fido name := "Fido"
+fido bark println

At first glance, this might seem like a minor syntactic difference. But look closer: there's no class definition, no constructor, no special initialization syntax. Dog is just an object that we've cloned from the base Object. fido is just a clone of Dog. The simplicity is profound.

What You'll Gain

1. A Deeper Understanding of JavaScript

If you've ever been puzzled by JavaScript's prototype chain, or wondered why typeof null === "object", studying Io will illuminate these mysteries. JavaScript's object model is essentially prototype-based (though complicated by the later addition of class syntax), and Io presents these same concepts in a much purer form.

2. Freedom from Artificial Boundaries

In most languages, there's a rigid distinction between what the language provides and what you can build. You can't change how if statements work. You can't modify how method calls are resolved. You can't alter fundamental objects.

In Io, these boundaries don't exist. The if statement is just a message sent to an object. Method resolution is customizable. Even basic types like Number and String can be modified at runtime. This isn't just academically interesting—it enables patterns of expression impossible in more rigid languages.

3. Appreciation for Message Passing

While many languages claim to support "message passing," few take it as seriously as Io. When everything is truly a message—including operators, control flow, and assignment—you begin to see the elegant simplicity possible in language design. This perspective will change how you think about method calls and object interaction in any language.

4. Metaprogramming Without Magic

Languages like Ruby pride themselves on metaprogramming capabilities, but often these features feel like special cases—magic methods, decorators, metaclasses. In Io, metaprogramming isn't a special feature; it's the natural consequence of a simple, consistent object model. When you can inspect and modify any object at runtime, including the objects that define the language itself, metaprogramming becomes straightforward rather than mystical.

Who Should Read This Book

This book assumes you're already a programmer. You should be comfortable with:

  • Basic programming concepts (variables, functions, loops, conditions)
  • Object-oriented programming in at least one language
  • Using a command line and text editor
  • The idea that different languages encourage different ways of thinking

You don't need to be an expert. In fact, if you've only worked in one or two mainstream languages, you might find Io's different perspective especially valuable. Sometimes, those deeply entrenched in certain paradigms have the most difficulty seeing alternatives.

What Makes Io Special

Steve Dekorte created Io in 2002 with several goals:

  1. Simplicity - A minimal syntax with maximum expressiveness
  2. Flexibility - Everything modifiable at runtime
  3. Uniformity - One consistent model for everything
  4. Power - Advanced features like coroutines and actors built-in

The result is a language that fits in roughly 10,000 lines of C code, yet provides capabilities that mainstream languages achieve only through complex implementations or external libraries.

A Language for Learning

I won't pretend that Io is likely to become your primary development language. Its community is small, its libraries limited, and its performance, while respectable, isn't competitive with systems languages or JIT-compiled platforms.

But Io excels as a language for learning. Its simple, consistent design makes it easy to understand completely. You can hold the entire language in your head. There are no special cases to remember, no historical baggage to work around. When you understand Io's seven basic concepts, you understand the entire language.

How to Approach This Book

As you read, I encourage you to:

  1. Run every example. Io's REPL starts instantly and makes experimentation effortless.
  2. Modify the examples. What happens if you change this? What if you clone from a different object? What if you override this method?
  3. Compare with languages you know. When you see an Io pattern, think about how you'd accomplish the same thing in Python, JavaScript, or Java. What's easier? What's harder? What's impossible?
  4. Embrace the discomfort. Some Io concepts will feel alien at first. That's good—it means you're learning something genuinely new.

A Personal Note

I've been programming for [X] years and have worked in dozens of languages. Most taught me new syntax or libraries. Io taught me new ways to think. It challenged assumptions I didn't know I had. It showed me that many "fundamental" concepts in programming are actually just design choices, and different choices lead to different possibilities.

Whether you spend a weekend or a month with Io, I believe you'll emerge a better programmer. Not because you'll use Io in production (though you might), but because you'll have a broader perspective on what programming languages can be.

Let's begin.

+ + + + diff --git a/website/content/docs/04-prototypes-not-classes.md b/Prototypes-Not-Classes/_index.md similarity index 98% rename from website/content/docs/04-prototypes-not-classes.md rename to Prototypes-Not-Classes/_index.md index 2600c80..54f9a7f 100644 --- a/website/content/docs/04-prototypes-not-classes.md +++ b/Prototypes-Not-Classes/_index.md @@ -1,12 +1,10 @@ --- -title: "Prototypes, Not Classes" -weight: 50 +title: Prototypes, Not Classes +topTitle: Io +subtitle: "How Io replaces classes and instances with a single uniform notion of object." +nextSectionLink: true --- - - -# Chapter 4: Prototypes, Not Classes - Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There's a fundamental distinction between the template (class) and the things created from it (instances). Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs. @@ -541,6 +539,3 @@ Prototype-based programming isn't just "classes with different syntax"—it's a This flexibility can be overwhelming at first, especially if you're used to the safety of static classes. But it can also be liberating. You're not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows. In the next chapter, we'll dive deeper into how objects communicate through Io's message passing system—the heartbeat of the language. - ---- - diff --git a/Prototypes-Not-Classes/index.html b/Prototypes-Not-Classes/index.html new file mode 100644 index 0000000..bfd01cb --- /dev/null +++ b/Prototypes-Not-Classes/index.html @@ -0,0 +1,331 @@ + + + + + + +Prototypes, Not Classes – Io + + + + +

Prototypes, Not Classes

← The Io Programming Language
Io

How Io replaces classes and instances with a single uniform notion of object.

Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There's a fundamental distinction between the template (class) and the things created from it (instances).

Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs.

The Class-Based World

Let's start with what you probably know. In a class-based language like Java:

// Define a class (template)
+class Animal {
+    String name;
+    
+    void speak() {
+        System.out.println("Some sound");
+    }
+}
+
+// Define a subclass
+class Dog extends Animal {
+    void speak() {
+        System.out.println("Woof!");
+    }
+}
+
+// Create instances
+Dog fido = new Dog();
+Dog rover = new Dog();

The key points:

  • Animal and Dog are classes (templates)
  • fido and rover are instances (objects)
  • Classes and instances are fundamentally different things
  • Inheritance happens between classes

The Prototype-Based World

In Io, there are no classes:

// Create an object to serve as a prototype
+Animal := Object clone
+Animal speak := method("Some sound" println)
+
+// Create another object using Animal as a prototype
+Dog := Animal clone
+Dog speak := method("Woof!" println)
+
+// Create more objects using Dog as a prototype
+fido := Dog clone
+rover := Dog clone

The key differences:

  • Animal, Dog, fido, and rover are all objects
  • No fundamental distinction between "classes" and "instances"
  • Objects are created by cloning other objects
  • Any object can serve as a prototype for other objects

Understanding Cloning

When you clone an object in Io, you don't copy all its slots. Instead, you create a new, empty object that maintains a reference to its prototype:

Animal := Object clone
+Animal name := "Generic Animal"
+Animal speak := method(name println)
+
+dog := Animal clone
+
+// dog doesn't have its own 'name' slot
+dog hasLocalSlot("name") println    // false
+
+// But it can access 'name' through its prototype
+dog name println                     // "Generic Animal"
+
+// Now give dog its own name
+dog name = "Fido"
+dog hasLocalSlot("name") println    // true
+dog name println                     // "Fido"
+
+// Animal's name is unchanged
+Animal name println                  // "Generic Animal"

This is called differential inheritance—objects only store their differences from their prototypes.

The Prototype Chain

When you send a message to an object, Io looks for a matching slot:

  1. First in the object itself
  2. Then in its prototype
  3. Then in the prototype's prototype
  4. And so on until it reaches Object
// Create a chain of prototypes
+Organism := Object clone
+Organism live := method("Living..." println)
+
+Animal := Organism clone
+Animal move := method("Moving..." println)
+
+Dog := Animal clone
+Dog bark := method("Woof!" println)
+
+fido := Dog clone
+fido name := "Fido"
+
+// fido can access methods from anywhere in the chain
+fido live    // "Living..." (from Organism)
+fido move    // "Moving..." (from Animal)
+fido bark    // "Woof!" (from Dog)
+
+// You can inspect the chain
+fido proto == Dog println           // true
+fido proto proto == Animal println  // true
+fido proto proto proto == Organism println  // true

Dynamic Prototype Modification

Since prototypes are just objects, you can modify them at runtime, and all objects using that prototype see the changes:

Dog := Object clone
+fido := Dog clone
+rover := Dog clone
+
+// Add a method to Dog
+Dog bark := method("Woof!" println)
+
+// Both fido and rover can now bark
+fido bark    // "Woof!"
+rover bark   // "Woof!"
+
+// Modify the method
+Dog bark = method("WOOF! WOOF!" println)
+
+// The change affects all dogs
+fido bark    // "WOOF! WOOF!"
+rover bark   // "WOOF! WOOF!"

Try doing that with classes in Java! You'd need complex reflection APIs, and even then, you couldn't modify existing instances.

Multiple Prototypes

Io supports multiple inheritance through its Protos list:

// Create two prototypes
+Flyable := Object clone
+Flyable fly := method("Flying..." println)
+
+Swimmable := Object clone
+Swimmable swim := method("Swimming..." println)
+
+// Create an object with multiple prototypes
+Duck := Object clone
+Duck appendProto(Flyable)
+Duck appendProto(Swimmable)
+
+mallard := Duck clone
+mallard fly     // "Flying..."
+mallard swim    // "Swimming..."
+
+// Inspect the prototype list
+Duck protos println  // list(Object_0x..., Flyable_0x..., Swimmable_0x...)

The search order for slots is depth-first through the Protos list.

Comparing Approaches: Class vs Prototype

Let's implement the same concept in both paradigms to see the differences.

Class-Based (Python)

class Shape:
+    def __init__(self):
+        self.x = 0
+        self.y = 0
+    
+    def move(self, dx, dy):
+        self.x += dx
+        self.y += dy
+
+class Circle(Shape):
+    def __init__(self, radius):
+        super().__init__()
+        self.radius = radius
+    
+    def area(self):
+        return 3.14159 * self.radius ** 2
+
+# Usage
+circle = Circle(5)
+circle.move(10, 20)
+print(circle.area())
+
+# Can't easily create a one-off variation
+# Would need to define a new class

Prototype-Based (Io)

Shape := Object clone
+Shape x := 0
+Shape y := 0
+Shape move := method(dx, dy,
+    x = x + dx
+    y = y + dy
+)
+
+Circle := Shape clone
+Circle radius := 0
+Circle area := method(
+    3.14159 * radius * radius
+)
+
+// Usage
+circle := Circle clone
+circle radius = 5
+circle move(10, 20)
+circle area println
+
+// Easy to create one-off variations
+specialCircle := Circle clone
+specialCircle area = method(
+    "Special area: " print
+    resend  // Call the original method
+)
+specialCircle area  // "Special area: 78.53975"

The Power of Prototypes

1. Objects as Classes

In Io, objects can act as classes when needed:

// Person acts like a class
+Person := Object clone
+Person init := method(
+    self name := "Unknown"
+    self age := 0
+    self
+)
+
+Person create := method(n, a,
+    clone init name = n age = a
+)
+
+// Usage feels class-like
+alice := Person create("Alice", 30)
+bob := Person create("Bob", 25)

2. One-Off Objects

You can create unique objects without defining a "class":

// Create a unique object with no "class"
+singleton := Object clone
+singleton data := Map clone
+singleton store := method(key, value,
+    data atPut(key, value)
+)
+singleton retrieve := method(key,
+    data at(key)
+)
+
+// Use it directly
+singleton store("user", "Alice")
+singleton retrieve("user") println  // "Alice"

3. Runtime Class Modification

You can fundamentally change what a "class" does:

Number := Object clone
+Number value := 0
+Number + := method(n,
+    result := Number clone
+    result value = self value + n value
+    result
+)
+
+// Create numbers
+five := Number clone value = 5
+three := Number clone value = 3
+
+// Now change how Number works
+Number + = method(n,
+    result := Number clone
+    result value = self value * n value  // Multiply instead!
+    result
+)
+
+// Existing numbers use the new behavior
+eight := five + three
+eight value println  // 15 (multiplication!)

Delegation vs Inheritance

Prototype-based languages use delegation rather than inheritance. When an object doesn't have a slot, it delegates to its prototype:

Account := Object clone
+Account balance := 0
+Account deposit := method(amount,
+    balance = balance + amount
+    self
+)
+
+savings := Account clone
+savings deposit(100)
+
+// Let's trace what happens:
+// 1. savings receives 'deposit' message
+// 2. savings doesn't have 'deposit' slot
+// 3. savings delegates to Account
+// 4. Account's deposit method runs
+// 5. But 'self' is still savings
+// 6. So savings's balance is updated
+
+savings balance println    // 100
+Account balance println    // 0 (unchanged)

This is subtly different from class-based inheritance where methods are copied or looked up in a class hierarchy.

Practical Patterns

The Constructor Pattern

While Io doesn't have constructors, you can create them:

Person := Object clone
+Person init := method(name, age,
+    self name := name
+    self age := age
+    self
+)
+
+Person new := method(name, age,
+    self clone init(name, age)
+)
+
+// Usage
+alice := Person new("Alice", 30)

The Mixin Pattern

Use prototypes as mixins for shared behavior:

// Define mixins
+Timestamped := Object clone
+Timestamped createdAt := Date now
+Timestamped age := method(
+    Date now - createdAt
+)
+
+Serializable := Object clone
+Serializable toJson := method(
+    // Implementation
+)
+
+// Use mixins
+Document := Object clone
+Document appendProto(Timestamped)
+Document appendProto(Serializable)
+
+doc := Document clone
+doc age println
+doc toJson

The Factory Pattern

Objects can create other objects with specific configurations:

ShapeFactory := Object clone
+ShapeFactory circle := method(radius,
+    c := Object clone
+    c radius := radius
+    c area := method(3.14159 * radius * radius)
+    c
+)
+
+ShapeFactory rectangle := method(width, height,
+    r := Object clone
+    r width := width
+    r height := height
+    r area := method(width * height)
+    r
+)
+
+// Usage
+myCircle := ShapeFactory circle(5)
+myRect := ShapeFactory rectangle(10, 20)

JavaScript: A Familiar Prototype System

If you know JavaScript, you've already used prototype-based programming:

// JavaScript (before ES6 classes)
+function Animal(name) {
+    this.name = name;
+}
+
+Animal.prototype.speak = function() {
+    console.log("Some sound");
+};
+
+function Dog(name) {
+    Animal.call(this, name);
+}
+
+Dog.prototype = Object.create(Animal.prototype);
+Dog.prototype.bark = function() {
+    console.log("Woof!");
+};

But JavaScript complicated things with constructor functions and later added class syntax as sugar. Io keeps prototypes pure and simple.

Common Misconceptions

"No Classes Means No Structure"

False. You can create well-structured programs with prototypes:

// Define clear prototype hierarchies
+Vehicle := Object clone
+Vehicle speed := 0
+
+Car := Vehicle clone
+Car wheels := 4
+
+ElectricCar := Car clone
+ElectricCar batteryLevel := 100
+
+// The structure is clear and maintainable

"Prototypes Are Just Classes With Different Syntax"

False. Prototypes are more flexible:

// Start with a prototype
+Dog := Object clone
+Dog bark := method("Woof!" println)
+
+fido := Dog clone
+
+// Later, change fido's prototype!
+Cat := Object clone
+Cat meow := method("Meow!" println)
+
+fido protos = list(Cat)
+fido meow  // "Meow!" - fido is now a cat!

You can't change an object's class at runtime in most class-based languages.

"Multiple Inheritance Is Always Confusing"

Io's prototype lists make multiple inheritance explicit and controllable:

A := Object clone
+A foo := method("A's foo" println)
+
+B := Object clone  
+B foo := method("B's foo" println)
+
+C := Object clone
+C appendProto(A)
+C appendProto(B)
+
+C foo  // "A's foo" (A comes first in the list)
+
+// Reorder to change priority
+C protos = list(B, A)
+C foo  // "B's foo" (B now comes first)

Exercises

  1. Prototype Chain Explorer: Write a method that prints an object's complete prototype chain with indentation showing the hierarchy.
  2. Class Emulator: Create a Class object that provides new, extends, and other class-like conveniences while using prototypes underneath.
  3. Multiple Inheritance Diamond: Create a diamond inheritance pattern (D inherits from B and C, which both inherit from A) and explore how Io resolves method conflicts.
  4. Dynamic Reclassing: Write a become method that changes an object's prototype chain to make it "become" an instance of a different prototype.
  5. Prototype Versioning: Implement a system where objects can "lock" to a specific version of their prototype, unaffected by later prototype modifications.

Real-World Implications

Prototype-based programming shines in certain scenarios:

  1. Rapid Prototyping: Create and modify objects on the fly without defining classes
  2. Dynamic Systems: Systems where object behavior needs to change at runtime
  3. DSLs: Domain-specific languages where objects morph based on context
  4. Learning: Understanding prototypes deepens your understanding of JavaScript
  5. Simplicity: No distinction between classes and objects means fewer concepts

Conclusion

Prototype-based programming isn't just "classes with different syntax"—it's a fundamentally different way of thinking about objects and inheritance. Instead of rigid templates (classes) and instances, you have a fluid world where any object can serve as a template for others, where inheritance is delegation, and where the structure of your program can change at runtime.

This flexibility can be overwhelming at first, especially if you're used to the safety of static classes. But it can also be liberating. You're not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows.

In the next chapter, we'll dive deeper into how objects communicate through Io's message passing system—the heartbeat of the language.

+ + + + diff --git a/website/content/docs/15-real-world-patterns.md b/Real-World-Patterns/_index.md similarity index 99% rename from website/content/docs/15-real-world-patterns.md rename to Real-World-Patterns/_index.md index 65b87f3..2f3830c 100644 --- a/website/content/docs/15-real-world-patterns.md +++ b/Real-World-Patterns/_index.md @@ -1,12 +1,10 @@ --- -title: "Real-World Patterns" -weight: 160 +title: Real-World Patterns +topTitle: Io +subtitle: "Architectures and patterns for building substantial applications in Io." +nextSectionLink: true --- - - -# Chapter 15: Real-World Patterns - After exploring Io's features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We'll see how Io's unique features enable elegant solutions to common programming challenges. ## Model-View-Controller (MVC) @@ -950,6 +948,3 @@ fibonacci compute(10) println // From cache These patterns demonstrate how Io's features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language's flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code. The key insight is that Io's uniform object model means patterns aren't special constructs but natural expressions of the language's core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches. - ---- - diff --git a/Real-World-Patterns/index.html b/Real-World-Patterns/index.html new file mode 100644 index 0000000..45597e4 --- /dev/null +++ b/Real-World-Patterns/index.html @@ -0,0 +1,880 @@ + + + + + + +Real-World Patterns – Io + + + + +

Architectures and patterns for building substantial applications in Io.

After exploring Io's features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We'll see how Io's unique features enable elegant solutions to common programming challenges.

Model-View-Controller (MVC)

Implementing MVC in Io leverages prototypes and message passing:

// Model
+Model := Object clone
+Model init := method(
+    self observers := list()
+    self data := Map clone
+    self
+)
+
+Model set := method(key, value,
+    oldValue := data at(key)
+    if(oldValue != value,
+        data atPut(key, value)
+        notifyObservers(key, oldValue, value)
+    )
+    self
+)
+
+Model get := method(key,
+    data at(key)
+)
+
+Model observe := method(observer,
+    observers append(observer)
+    self
+)
+
+Model notifyObservers := method(key, oldValue, newValue,
+    observers foreach(observer,
+        if(observer hasSlot("modelChanged"),
+            observer modelChanged(self, key, oldValue, newValue)
+        )
+    )
+)
+
+// View
+View := Object clone
+View init := method(model,
+    self model := model
+    model observe(self)
+    self elements := Map clone
+    self
+)
+
+View modelChanged := method(model, key, oldValue, newValue,
+    render
+)
+
+View render := method(
+    // Override in subclasses
+)
+
+// Controller
+Controller := Object clone
+Controller init := method(model, view,
+    self model := model
+    self view := view
+    self
+)
+
+Controller handleInput := method(input,
+    // Process input and update model
+)
+
+// Example: Todo MVC
+TodoModel := Model clone
+TodoModel init := method(
+    resend
+    self set("todos", list())
+    self
+)
+
+TodoModel addTodo := method(text,
+    todos := get("todos") copy
+    todos append(Map with("text", text, "done", false))
+    set("todos", todos)
+)
+
+TodoModel toggleTodo := method(index,
+    todos := get("todos") copy
+    todo := todos at(index)
+    todo atPut("done", todo at("done") not)
+    set("todos", todos)
+)
+
+TodoView := View clone
+TodoView render := method(
+    "=== Todo List ===" println
+    model get("todos") foreach(i, todo,
+        status := if(todo at("done"), "[✓]", "[ ]")
+        (i .. ". " .. status .. " " .. todo at("text")) println
+    )
+    "================" println
+)
+
+TodoController := Controller clone
+TodoController processCommand := method(cmd,
+    parts := cmd split(" ")
+    action := parts at(0)
+    
+    if(action == "add",
+        text := parts slice(1) join(" ")
+        model addTodo(text)
+    )
+    
+    if(action == "toggle",
+        index := parts at(1) asNumber
+        model toggleTodo(index)
+    )
+    
+    if(action == "quit",
+        System exit
+    )
+)
+
+// Usage
+app := Object clone
+app model := TodoModel clone init
+app view := TodoView clone init(app model)
+app controller := TodoController clone init(app model, app view)
+
+app view render
+// Simulate commands
+app controller processCommand("add Buy groceries")
+app controller processCommand("add Write documentation")
+app controller processCommand("toggle 0")

Repository Pattern

Abstracting data access:

// Base Repository
+Repository := Object clone
+Repository init := method(
+    self storage := list()
+    self nextId := 1
+    self
+)
+
+Repository save := method(entity,
+    if(entity hasSlot("id") not or entity id isNil,
+        entity id := nextId
+        nextId = nextId + 1
+        storage append(entity)
+    ,
+        // Update existing
+        index := storage detectIndex(e, e id == entity id)
+        if(index, storage atPut(index, entity))
+    )
+    entity
+)
+
+Repository findById := method(id,
+    storage detect(e, e id == id)
+)
+
+Repository findAll := method(
+    storage copy
+)
+
+Repository delete := method(entity,
+    storage remove(entity)
+)
+
+Repository where := method(predicate,
+    storage select(predicate)
+)
+
+// Specialized repository with persistence
+FileRepository := Repository clone
+FileRepository filename := "data.json"
+
+FileRepository init := method(
+    resend
+    load
+    self
+)
+
+FileRepository load := method(
+    if(File with(filename) exists,
+        data := File with(filename) contents parseJson
+        storage = data map(item, entityFromMap(item))
+        nextId = storage map(e, e id) max + 1
+    )
+)
+
+FileRepository save := method(entity,
+    resend(entity)
+    persist
+    entity
+)
+
+FileRepository persist := method(
+    data := storage map(e, e asMap)
+    File with(filename) openForWriting write(data asJson) close
+)
+
+// Entity
+User := Object clone
+User init := method(name, email,
+    self id := nil
+    self name := name
+    self email := email
+    self createdAt := Date now
+    self
+)
+
+User asMap := method(
+    Map with(
+        "id", id,
+        "name", name,
+        "email", email,
+        "createdAt", createdAt asString
+    )
+)
+
+// Usage
+userRepo := FileRepository clone init
+
+user1 := User clone init("Alice", "alice@example.com")
+user2 := User clone init("Bob", "bob@example.com")
+
+userRepo save(user1)
+userRepo save(user2)
+
+found := userRepo findById(1)
+active := userRepo where(u, u createdAt > Date now - Duration days(30))

Observer Pattern

Native implementation using Io's message passing:

Observable := Object clone
+Observable init := method(
+    self observers := Map clone
+    self
+)
+
+Observable on := method(event, observer, methodName,
+    if(observers hasKey(event) not,
+        observers atPut(event, list())
+    )
+    observers at(event) append(list(observer, methodName))
+    self
+)
+
+Observable off := method(event, observer,
+    if(observers hasKey(event),
+        observers at(event) := observers at(event) reject(pair,
+            pair at(0) == observer
+        )
+    )
+    self
+)
+
+Observable emit := method(event,
+    args := call message arguments slice(1)
+    
+    if(observers hasKey(event),
+        observers at(event) foreach(pair,
+            observer := pair at(0)
+            methodName := pair at(1)
+            
+            msg := Message clone setName(methodName)
+            args foreach(arg, msg appendArg(arg))
+            
+            observer doMessage(msg)
+        )
+    )
+    self
+)
+
+// Example: Stock price monitor
+Stock := Observable clone
+Stock init := method(symbol, price,
+    resend
+    self symbol := symbol
+    self price := price
+    self
+)
+
+Stock setPrice := method(newPrice,
+    oldPrice := price
+    price = newPrice
+    
+    change := ((newPrice - oldPrice) / oldPrice * 100) round
+    emit("priceChanged", symbol, oldPrice, newPrice, change)
+    
+    if(change abs > 5,
+        emit("largeMoveDetected", symbol, change)
+    )
+)
+
+StockAlert := Object clone
+StockAlert onPriceChange := method(symbol, oldPrice, newPrice, change,
+    ("Price alert: " .. symbol .. " moved from $" .. oldPrice .. 
+     " to $" .. newPrice .. " (" .. change .. "%)") println
+)
+
+StockAlert onLargeMove := method(symbol, change,
+    ("⚠️  Large move detected: " .. symbol .. " changed " .. change .. "%") println
+)
+
+// Usage
+apple := Stock clone init("AAPL", 150.00)
+alert := StockAlert clone
+
+apple on("priceChanged", alert, "onPriceChange")
+apple on("largeMoveDetected", alert, "onLargeMove")
+
+apple setPrice(155.00)  // Normal change
+apple setPrice(165.00)  // Large move triggers both alerts

Dependency Injection

Using Io's dynamic nature for DI:

// DI Container
+Container := Object clone
+Container init := method(
+    self services := Map clone
+    self singletons := Map clone
+    self
+)
+
+Container register := method(name, factory,
+    services atPut(name, factory)
+    self
+)
+
+Container singleton := method(name, factory,
+    services atPut(name, factory)
+    singletons atPut(name, nil)
+    self
+)
+
+Container get := method(name,
+    if(services hasKey(name) not,
+        Exception raise("Service '" .. name .. "' not registered")
+    )
+    
+    // Check if singleton
+    if(singletons hasKey(name),
+        if(singletons at(name) isNil,
+            singletons atPut(name, services at(name) call(self))
+        )
+        return singletons at(name)
+    )
+    
+    // Regular service
+    services at(name) call(self)
+)
+
+// Services
+Logger := Object clone
+Logger init := method(output,
+    self output := output
+    self
+)
+Logger log := method(message,
+    output write("[" .. Date now .. "] " .. message .. "\n")
+)
+
+Database := Object clone
+Database init := method(connectionString, logger,
+    self connectionString := connectionString
+    self logger := logger
+    logger log("Database initialized: " .. connectionString)
+    self
+)
+
+UserService := Object clone
+UserService init := method(database, logger,
+    self database := database
+    self logger := logger
+    self
+)
+UserService createUser := method(name,
+    logger log("Creating user: " .. name)
+    // database operations...
+    Map with("id", 1, "name", name)
+)
+
+// Configure container
+container := Container clone init
+
+container singleton("logger", block(c,
+    Logger clone init(File standardOutput)
+))
+
+container singleton("database", block(c,
+    Database clone init("postgres://localhost/myapp", c get("logger"))
+))
+
+container register("userService", block(c,
+    UserService clone init(c get("database"), c get("logger"))
+))
+
+// Usage
+service := container get("userService")
+service createUser("Alice")
+
+// Different instance each time
+service1 := container get("userService")
+service2 := container get("userService")
+(service1 == service2) println  // false
+
+// Same logger instance
+logger1 := container get("logger")
+logger2 := container get("logger")
+(logger1 == logger2) println  // true

Strategy Pattern

Leveraging blocks and dynamic dispatch:

// Sorting strategies
+SortStrategy := Object clone
+
+BubbleSort := SortStrategy clone
+BubbleSort execute := method(list,
+    result := list copy
+    n := result size
+    
+    for(i, 0, n - 2,
+        for(j, 0, n - i - 2,
+            if(result at(j) > result at(j + 1),
+                temp := result at(j)
+                result atPut(j, result at(j + 1))
+                result atPut(j + 1, temp)
+            )
+        )
+    )
+    result
+)
+
+QuickSort := SortStrategy clone
+QuickSort execute := method(list,
+    if(list size <= 1, return list)
+    
+    pivot := list at(list size / 2)
+    less := list select(x, x < pivot)
+    equal := list select(x, x == pivot)
+    greater := list select(x, x > pivot)
+    
+    execute(less) appendSeq(equal) appendSeq(execute(greater))
+)
+
+// Context
+DataProcessor := Object clone
+DataProcessor init := method(
+    self strategy := QuickSort
+    self
+)
+
+DataProcessor setStrategy := method(s,
+    strategy = s
+    self
+)
+
+DataProcessor process := method(data,
+    "Processing data..." println
+    strategy execute(data)
+)
+
+// Usage with different strategies
+processor := DataProcessor clone init
+
+data := list(3, 1, 4, 1, 5, 9, 2, 6)
+
+processor setStrategy(BubbleSort) process(data) println
+processor setStrategy(QuickSort) process(data) println
+
+// Dynamic strategy selection
+selectStrategy := method(dataSize,
+    if(dataSize < 10, BubbleSort, QuickSort)
+)
+
+processor setStrategy(selectStrategy(data size))

Chain of Responsibility

Building processing pipelines:

Handler := Object clone
+Handler init := method(
+    self next := nil
+    self
+)
+
+Handler setNext := method(handler,
+    next = handler
+    handler
+)
+
+Handler handle := method(request,
+    if(canHandle(request),
+        process(request),
+        if(next, next handle(request), nil)
+    )
+)
+
+// Concrete handlers
+AuthenticationHandler := Handler clone
+AuthenticationHandler canHandle := method(request,
+    request at("requiresAuth")
+)
+AuthenticationHandler process := method(request,
+    if(request at("token") == "valid-token",
+        "Authentication successful" println
+        request atPut("authenticated", true)
+        if(next, next handle(request), request)
+    ,
+        Exception raise("Authentication failed")
+    )
+)
+
+LoggingHandler := Handler clone
+LoggingHandler canHandle := method(request, true)
+LoggingHandler process := method(request,
+    ("Logging request: " .. request at("path")) println
+    if(next, next handle(request), request)
+)
+
+RateLimitHandler := Handler clone
+RateLimitHandler init := method(
+    resend
+    self requests := Map clone
+    self limit := 10
+    self window := 60  // seconds
+    self
+)
+RateLimitHandler canHandle := method(request,
+    request hasKey("clientId")
+)
+RateLimitHandler process := method(request,
+    clientId := request at("clientId")
+    now := Date now
+    
+    if(requests hasKey(clientId) not,
+        requests atPut(clientId, list())
+    )
+    
+    // Clean old requests
+    clientRequests := requests at(clientId) select(time,
+        now - time < window
+    )
+    
+    if(clientRequests size >= limit,
+        Exception raise("Rate limit exceeded"),
+        clientRequests append(now)
+        requests atPut(clientId, clientRequests)
+        if(next, next handle(request), request)
+    )
+)
+
+// Build chain
+chain := LoggingHandler clone \
+    setNext(RateLimitHandler clone \
+        setNext(AuthenticationHandler clone))
+
+// Process requests
+request := Map with(
+    "path", "/api/users",
+    "clientId", "client-123",
+    "requiresAuth", true,
+    "token", "valid-token"
+)
+
+result := chain handle(request)

Plugin Architecture

Dynamic loading and extension:

PluginManager := Object clone
+PluginManager init := method(
+    self plugins := Map clone
+    self hooks := Map clone
+    self
+)
+
+PluginManager registerHook := method(name,
+    if(hooks hasKey(name) not,
+        hooks atPut(name, list())
+    )
+    self
+)
+
+PluginManager loadPlugin := method(path,
+    plugin := doFile(path)
+    
+    if(plugin hasSlot("name") not,
+        Exception raise("Plugin must have a name")
+    )
+    
+    plugins atPut(plugin name, plugin)
+    
+    if(plugin hasSlot("init"),
+        plugin init(self)
+    )
+    
+    ("Plugin loaded: " .. plugin name) println
+    self
+)
+
+PluginManager hook := method(name,
+    args := call message arguments slice(1)
+    results := list()
+    
+    if(hooks hasKey(name),
+        hooks at(name) foreach(handler,
+            result := handler doMessage(Message clone setName("call") setArguments(args))
+            results append(result)
+        )
+    )
+    
+    results
+)
+
+PluginManager addHook := method(hookName, handler,
+    if(hooks hasKey(hookName) not,
+        registerHook(hookName)
+    )
+    hooks at(hookName) append(handler)
+    self
+)
+
+// Example plugin
+MarkdownPlugin := Object clone
+MarkdownPlugin name := "markdown"
+MarkdownPlugin init := method(manager,
+    manager addHook("processText", block(text,
+        // Simple markdown processing
+        text replaceAllRegex("\\*\\*(.*?)\\*\\*", "<strong>$1</strong>") \
+             replaceAllRegex("\\*(.*?)\\*", "<em>$1</em>")
+    ))
+    
+    manager addHook("getFormats", block(
+        list("markdown", "md")
+    ))
+)
+
+// Usage
+manager := PluginManager clone init
+manager registerHook("processText")
+manager registerHook("getFormats")
+
+// Load plugins
+manager loadPlugin("markdown_plugin.io")
+
+// Use hooks
+text := "This is **bold** and this is *italic*"
+processed := manager hook("processText", text)
+processed foreach(result, result println)
+
+formats := manager hook("getFormats")
+"Supported formats: " print
+formats flatten unique println

Event Sourcing

Implementing event-driven architecture:

// Event
+Event := Object clone
+Event init := method(type, data,
+    self type := type
+    self data := data
+    self timestamp := Date now
+    self id := Random uuid
+    self
+)
+
+// Event Store
+EventStore := Object clone
+EventStore init := method(
+    self events := list()
+    self snapshots := Map clone
+    self
+)
+
+EventStore append := method(event,
+    events append(event)
+    self
+)
+
+EventStore getEvents := method(afterId,
+    if(afterId isNil,
+        return events
+    )
+    
+    startIndex := events detectIndex(e, e id == afterId)
+    if(startIndex,
+        events slice(startIndex + 1),
+        list()
+    )
+)
+
+// Aggregate
+Aggregate := Object clone
+Aggregate init := method(id,
+    self id := id
+    self version := 0
+    self uncommittedEvents := list()
+    self
+)
+
+Aggregate applyEvent := method(event,
+    // Override in subclasses
+)
+
+Aggregate raiseEvent := method(event,
+    applyEvent(event)
+    uncommittedEvents append(event)
+    version = version + 1
+)
+
+Aggregate markEventsAsCommitted := method(
+    uncommittedEvents = list()
+)
+
+Aggregate loadFromHistory := method(events,
+    events foreach(event,
+        applyEvent(event)
+        version = version + 1
+    )
+)
+
+// Example: Bank Account aggregate
+BankAccount := Aggregate clone
+BankAccount init := method(id,
+    resend(id)
+    self balance := 0
+    self
+)
+
+BankAccount deposit := method(amount,
+    if(amount <= 0,
+        Exception raise("Amount must be positive")
+    )
+    
+    raiseEvent(Event clone init("MoneyDeposited", 
+        Map with("accountId", id, "amount", amount)))
+)
+
+BankAccount withdraw := method(amount,
+    if(amount <= 0,
+        Exception raise("Amount must be positive")
+    )
+    if(amount > balance,
+        Exception raise("Insufficient funds")
+    )
+    
+    raiseEvent(Event clone init("MoneyWithdrawn",
+        Map with("accountId", id, "amount", amount)))
+)
+
+BankAccount applyEvent := method(event,
+    if(event type == "MoneyDeposited",
+        balance = balance + event data at("amount")
+    )
+    
+    if(event type == "MoneyWithdrawn",
+        balance = balance - event data at("amount")
+    )
+)
+
+// Repository using event sourcing
+AccountRepository := Object clone
+AccountRepository init := method(eventStore,
+    self eventStore := eventStore
+    self
+)
+
+AccountRepository save := method(account,
+    account uncommittedEvents foreach(event,
+        eventStore append(event)
+    )
+    account markEventsAsCommitted
+)
+
+AccountRepository getById := method(id,
+    events := eventStore getEvents select(e,
+        e data at("accountId") == id
+    )
+    
+    account := BankAccount clone init(id)
+    account loadFromHistory(events)
+    account
+)
+
+// Usage
+store := EventStore clone init
+repo := AccountRepository clone init(store)
+
+account := BankAccount clone init("acc-123")
+account deposit(100)
+account withdraw(30)
+account deposit(50)
+
+repo save(account)
+account balance println  // 120
+
+// Rebuild from events
+rebuilt := repo getById("acc-123")
+rebuilt balance println  // 120

Caching Strategy

Multi-level caching with different policies:

Cache := Object clone
+Cache init := method(maxSize, ttl,
+    self maxSize := maxSize
+    self ttl := ttl  // Time to live in seconds
+    self entries := Map clone
+    self accessOrder := list()
+    self
+)
+
+Cache get := method(key,
+    if(entries hasKey(key),
+        entry := entries at(key)
+        
+        // Check TTL
+        if(Date now - entry at("time") > ttl,
+            entries removeAt(key)
+            accessOrder remove(key)
+            return nil
+        )
+        
+        // Update access order (LRU)
+        accessOrder remove(key)
+        accessOrder append(key)
+        
+        entry at("value")
+    ,
+        nil
+    )
+)
+
+Cache put := method(key, value,
+    // Evict if necessary
+    while(entries size >= maxSize,
+        evictKey := accessOrder removeFirst
+        entries removeAt(evictKey)
+        ("Cache evicted: " .. evictKey) println
+    )
+    
+    entries atPut(key, Map with(
+        "value", value,
+        "time", Date now
+    ))
+    accessOrder append(key)
+    
+    value
+)
+
+Cache getOrCompute := method(key, computeBlock,
+    value := get(key)
+    if(value isNil,
+        value = computeBlock call
+        put(key, value)
+    )
+    value
+)
+
+// Multi-level cache
+MultiLevelCache := Object clone
+MultiLevelCache init := method(
+    self l1 := Cache clone init(10, 60)     // Small, fast, 1 minute TTL
+    self l2 := Cache clone init(100, 600)   // Larger, 10 minute TTL
+    self
+)
+
+MultiLevelCache get := method(key,
+    // Check L1
+    value := l1 get(key)
+    if(value, return value)
+    
+    // Check L2
+    value = l2 get(key)
+    if(value,
+        l1 put(key, value)  // Promote to L1
+        return value
+    )
+    
+    nil
+)
+
+MultiLevelCache put := method(key, value,
+    l1 put(key, value)
+    l2 put(key, value)
+    value
+)
+
+// Usage with expensive computation
+fibonacci := Object clone
+fibonacci cache := MultiLevelCache clone init
+
+fibonacci compute := method(n,
+    if(n <= 1, return n)
+    
+    cache get(n) ifNil(
+        ("Computing fib(" .. n .. ")") println
+        result := compute(n - 1) + compute(n - 2)
+        cache put(n, result)
+        result
+    )
+)
+
+fibonacci compute(10) println  // Computes
+fibonacci compute(10) println  // From cache

Conclusion

These patterns demonstrate how Io's features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language's flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code.

The key insight is that Io's uniform object model means patterns aren't special constructs but natural expressions of the language's core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches.

+ + + + diff --git a/_index.json b/_index.json new file mode 100644 index 0000000..007a245 --- /dev/null +++ b/_index.json @@ -0,0 +1,37 @@ +{ + "title": "The Io Programming Language", + "topTitle": "Io", + "subtitle": "A comprehensive guide to prototype-based programming with Io.", + "content": [ + { + "type": "ContentText", + "content": "This book provides an in-depth exploration of the Io programming language, designed for experienced programmers who want to understand prototype-based object-oriented programming. Through detailed comparisons with mainstream languages like JavaScript, Python, Ruby, and Java, readers will gain practical insights into Io's unique paradigm." + }, + { + "type": "ContentCards", + "title": "Chapters", + "columns": 2, + "items": [ + "Preface", + "Introduction", + "Getting-Started", + "Everything-is-an-Object", + "Prototypes-Not-Classes", + "Messages-and-Slots", + "Cloning-and-Inheritance", + "Control-Flow", + "Collections", + "Blocks-and-Closures", + "Exceptions", + "Metaprogramming", + "Concurrency", + "Domain-Specific-Languages", + "C-Integration", + "Real-World-Patterns", + "Case-Studies", + "Ecosystem-and-Libraries", + "Conclusion" + ] + } + ] +} diff --git a/colvmn b/colvmn new file mode 160000 index 0000000..1e6690c --- /dev/null +++ b/colvmn @@ -0,0 +1 @@ +Subproject commit 1e6690cf74a7423cc457bc68a6f1ff7f9a62fc0c diff --git a/index.html b/index.html index 818cf4c..570ba2a 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,16 @@ - + - - - - Redirecting... + + + +Io + + -

Redirecting to The Io Programming Language...

+

The Io Programming Language

Io

A comprehensive guide to prototype-based programming with Io.

Chapters

Preface: Why Io?

Why learn a prototype-based language with a small community? An honest answer.

View →

Introduction: The Philosophy of Io

The history, philosophy, and seven pillars behind Io's radical simplicity.

View →

Getting Started with Io

Install Io, explore the REPL, and write your first programs.

View →

Everything is an Object

What it really means when every value—numbers, booleans, methods—is an object.

View →

Prototypes, Not Classes

How Io replaces classes and instances with a single uniform notion of object.

View →

Messages and Slots

The two mechanisms that drive every computation in Io.

View →

Cloning and Inheritance

How inheritance chains emerge from the simpler operation of cloning.

View →

Control Flow

if, while, for, and friends are just methods—and you can write your own.

View →

Collections

Lists, Maps, and Sequences: Io's core data structures and how to extend them.

View →

Blocks and Closures

First-class code as objects that capture their lexical environment.

View →

Exceptions

Error handling built, like everything else, from objects and messages.

View →

Metaprogramming

Inspecting, modifying, and generating code at runtime.

View →

Concurrency

Coroutines, actors, and futures for cooperative and message-passing concurrency.

View →

Domain-Specific Languages

Using Io's minimal syntax and metaprogramming to design expressive DSLs.

View →

C Integration

Embedding Io in C and extending Io with high-performance C addons.

View →

Real-World Patterns

Architectures and patterns for building substantial applications in Io.

View →

Case Studies

Complete Io programs that bring the language's features together.

View →

Ecosystem and Libraries

The available libraries, tools, and community resources around Io.

View →

Conclusion: The Io Way

What Io teaches about simplicity, uniformity, and the design of programming languages.

View →
+ + - \ No newline at end of file + diff --git a/llms-full.txt b/llms-full.txt new file mode 100644 index 0000000..4ea3bb6 --- /dev/null +++ b/llms-full.txt @@ -0,0 +1,12430 @@ +# Io — Full Documentation + +See also: /llms.txt (curated index) and /sitemap.xml. + + + +--- + + +Source: / + +# The Io Programming Language + +A comprehensive guide to prototype-based programming with Io. + +## Chapters + +- Preface +- Introduction +- Getting-Started +- Everything-is-an-Object +- Prototypes-Not-Classes +- Messages-and-Slots +- Cloning-and-Inheritance +- Control-Flow +- Collections +- Blocks-and-Closures +- Exceptions +- Metaprogramming +- Concurrency +- Domain-Specific-Languages +- C-Integration +- Real-World-Patterns +- Case-Studies +- Ecosystem-and-Libraries +- Conclusion + + +--- + + +Source: /Blocks-and-Closures/ + +--- +title: Blocks and Closures +topTitle: Io +subtitle: "First-class code as objects that capture their lexical environment." +nextSectionLink: true +--- + +Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io. + +## Understanding Blocks and Methods + +In Io, `block` and `method` are similar but have a crucial difference: + +```io +// Block - creates its own scope +blk := block(x, x * 2) +blk call(5) println // 10 + +// Method - shares scope with receiver +obj := Object clone +obj value := 10 +obj meth := method(x, x * value) // Can access 'value' +obj blk := block(x, x * value) // Error when called - no 'value' in block scope + +obj meth(5) println // 50 +// obj blk call(5) // Exception: value not found +``` + +The key difference: +- **Methods** have access to `self` and the receiver's slots +- **Blocks** create their own scope and don't have automatic access to `self` + +## Creating and Calling Blocks + +```io +// Simple block +double := block(x, x * 2) +double call(5) println // 10 + +// Multi-argument block +add := block(a, b, a + b) +add call(3, 4) println // 7 + +// No-argument block +greet := block("Hello!" println) +greet call // Hello! + +// Blocks are objects +double type println // Block +double proto println // Block_0x... +``` + +## Blocks as Closures + +Blocks capture variables from their creation context: + +```io +makeCounter := method( + count := 0 + block( + count = count + 1 + count + ) +) + +counter1 := makeCounter() +counter2 := makeCounter() + +counter1 call println // 1 +counter1 call println // 2 +counter2 call println // 1 (independent) +counter1 call println // 3 +``` + +This is different from many languages where you need special syntax for closures: + +```javascript +// JavaScript +function makeCounter() { + let count = 0; + return function() { + count++; + return count; + }; +} +``` + +In Io, all blocks are closures automatically. + +## The Scope Chain + +Understanding scope is crucial for blocks: + +```io +x := "global" + +outer := method( + x := "outer" + + inner := block( + x println // What prints? + ) + + inner +) + +myBlock := outer() +myBlock call // "outer" - captured from creation context + +x = "changed global" +myBlock call // Still "outer" - closure captures variables, not global +``` + +## Methods and self + +Methods have access to `self` (the receiver): + +```io +Calculator := Object clone +Calculator value := 0 + +Calculator add := method(n, + self value = self value + n // Explicit self + value // Implicit self +) + +Calculator addBlock := block(n, + // No automatic self here! + // Would need to pass it explicitly +) + +calc := Calculator clone +calc add(5) println // 5 +calc add(3) println // 8 +``` + +## Block Arguments and Defaults + +```io +// Variable arguments +sumAll := block( + args := call message arguments + total := 0 + args foreach(arg, + total = total + call sender doMessage(arg) + ) + total +) + +sumAll call(1, 2, 3, 4, 5) println // 15 + +// Default arguments (manual) +greetWithDefault := block(name, + if(name isNil, name = "World") + ("Hello, " .. name .. "!") println +) + +greetWithDefault call("Alice") // Hello, Alice! +greetWithDefault call() // Hello, World! +``` + +## Higher-Order Functions + +Blocks enable functional programming patterns: + +```io +// Functions returning functions +makeMultiplier := method(factor, + block(x, x * factor) +) + +double := makeMultiplier(2) +triple := makeMultiplier(3) + +double call(5) println // 10 +triple call(5) println // 15 + +// Functions taking functions +twice := method(f, x, + f call(f call(x)) +) + +twice(block(n, n + 1), 5) println // 7 + +// Composition +compose := method(f, g, + block(x, f call(g call(x))) +) + +addOne := block(x, x + 1) +double := block(x, x * 2) +doubleThenAddOne := compose(addOne, double) + +doubleThenAddOne call(5) println // 11 +``` + +## Partial Application and Currying + +```io +// Partial application +add := block(a, b, a + b) + +addFive := block(x, add call(5, x)) +addFive call(3) println // 8 + +// Currying +curry := method(f, + block(a, + block(b, + f call(a, b) + ) + ) +) + +curriedAdd := curry(add) +add5 := curriedAdd call(5) +add5 call(3) println // 8 + +// More practical example +formatString := block(template, value, + template interpolate(value) +) + +curriedFormat := curry(formatString) +errorFormatter := curriedFormat call("Error: #{value}") +successFormatter := curriedFormat call("Success: #{value}") + +errorFormatter call("File not found") println // Error: File not found +successFormatter call("Operation complete") println // Success: Operation complete +``` + +## Lazy Evaluation with Blocks + +Blocks don't evaluate until called, enabling lazy patterns: + +```io +// Lazy if (already built-in, but here's how it works) +lazyIf := method(condition, trueBlock, falseBlock, + if(condition, + trueBlock call, + falseBlock call + ) +) + +x := 5 +lazyIf(x > 3, + block("Greater" println), + block("Lesser" println) +) + +// Lazy infinite sequences +naturals := method(start, + block( + n := start + block( + current := n + n = n + 1 + current + ) + ) call +) + +seq := naturals(1) +5 repeat(seq call println) // 1, 2, 3, 4, 5 +``` + +## Memoization + +Use closures to cache expensive computations: + +```io +memoize := method(f, + cache := Map clone + + block( + args := call message arguments + key := args asString + + if(cache hasKey(key), + cache at(key), + result := f call(args) + cache atPut(key, result) + result + ) + ) +) + +// Expensive fibonacci +fib := block(n, + if(n < 2, n, fib call(n - 1) + fib call(n - 2)) +) + +// Memoized version +fastFib := memoize(fib) + +// Much faster on repeated calls +time(fib call(30)) println +time(fastFib call(30)) println +``` + +## Block Introspection + +Blocks are objects you can inspect: + +```io +myBlock := block(x, y, x + y * 2) + +// Inspect structure +myBlock argumentNames println // list(x, y) +myBlock code println // x +(y *(2)) + +// Modify blocks +myBlock setArgumentNames(list("a", "b")) +myBlock argumentNames println // list(a, b) + +// Create blocks programmatically +code := "a + b" +args := list("a", "b") +dynamicBlock := Block clone setArgumentNames(args) setCode(code) +dynamicBlock call(3, 4) println // 7 +``` + +## Blocks in Data Structures + +```io +// Table of operations +operations := Map with( + "+", block(a, b, a + b), + "-", block(a, b, a - b), + "*", block(a, b, a * b), + "/", block(a, b, a / b) +) + +calculate := method(op, a, b, + operations at(op) call(a, b) +) + +calculate("+", 5, 3) println // 8 +calculate("*", 4, 7) println // 28 + +// Event handlers +EventEmitter := Object clone +EventEmitter init := method( + self events := Map clone + self +) + +EventEmitter on := method(event, handler, + if(events hasKey(event) not, + events atPut(event, list()) + ) + events at(event) append(handler) + self +) + +EventEmitter emit := method(event, data, + if(events hasKey(event), + events at(event) foreach(handler, + handler call(data) + ) + ) + self +) + +// Usage +emitter := EventEmitter clone init +emitter on("click", block(data, + ("Clicked at: " .. data) println +)) +emitter on("click", block(data, + ("Another handler: " .. data) println +)) + +emitter emit("click", "x=10, y=20") +// Clicked at: x=10, y=20 +// Another handler: x=10, y=20 +``` + +## Control Flow with Blocks + +Create custom control structures: + +```io +// Retry logic +retry := method(times, block, + attempts := 0 + loop( + attempts = attempts + 1 + e := try(result := block call) + + if(e isNil, return result) + if(attempts >= times, Exception raise(e)) + + ("Attempt " .. attempts .. " failed, retrying...") println + ) +) + +// Usage +result := retry(3, block( + if(Random value < 0.7, + Exception raise("Random failure"), + "Success!" + ) +)) + +// While with condition block +whileTrue := method(conditionBlock, bodyBlock, + while(conditionBlock call, bodyBlock call) +) + +i := 0 +whileTrue( + block(i < 5), + block( + i println + i = i + 1 + ) +) +``` + +## Performance Considerations + +```io +// Method vs Block performance +obj := Object clone +obj value := 10 + +obj method1 := method(x, x + value) +obj block1 := block(x, x + 10) + +// Methods are slightly faster for object operations +time(100000 repeat(obj method1(5))) +time(100000 repeat(obj block1 call(5))) + +// But blocks are better for functional patterns +numbers := list(1, 2, 3, 4, 5) +time(numbers map(x, x * 2)) // Using block syntax +``` + +## Advanced Patterns + +### Continuation-Style Programming + +```io +// Continuation passing style +factorial := method(n, continuation, + if(n <= 1, + continuation call(1), + factorial(n - 1, block(result, + continuation call(n * result) + )) + ) +) + +factorial(5, block(result, result println)) // 120 +``` + +### Monadic Patterns + +```io +// Maybe monad +Maybe := Object clone +Maybe Nothing := Maybe clone +Maybe Just := method(value, + m := Maybe clone + m value := value + m isNothing := false + m +) +Maybe Nothing isNothing := true + +Maybe bind := method(f, + if(isNothing, Maybe Nothing, f call(value)) +) + +Maybe map := method(f, + if(isNothing, + Maybe Nothing, + Maybe Just(f call(value)) + ) +) + +// Usage +result := Maybe Just(5) \ + map(block(x, x * 2)) \ + bind(block(x, + if(x > 5, + Maybe Just(x), + Maybe Nothing) + )) \ + map(block(x, x + 1)) + +if(result isNothing not, + result value println // 11 +) +``` + +### Transducers + +```io +// Composable transformations +mapping := method(f, + method(reducer, + block(acc, item, + reducer call(acc, f call(item)) + ) + ) +) + +filtering := method(pred, + method(reducer, + block(acc, item, + if(pred call(item), + reducer call(acc, item), + acc + ) + ) + ) +) + +// Compose transducers +transduce := method(xform, reducer, init, coll, + xreducer := xform call(reducer) + coll foreach(item, + init = xreducer call(init, item) + ) + init +) + +// Usage +xform := filtering(block(x, x % 2 == 0)) call( + mapping(block(x, x * 2)) +) + +result := transduce(xform, + block(acc, x, acc + x), + 0, + list(1, 2, 3, 4, 5, 6) +) +result println // 24 (2*2 + 4*2 + 6*2) +``` + +## Common Pitfalls + +### Variable Capture + +```io +// PROBLEM: Loop variable capture +handlers := list() +for(i, 1, 3, + handlers append(block(i println)) +) + +handlers foreach(h, h call) // All print 3! + +// SOLUTION: Create new scope +handlers := list() +for(i, 1, 3, + handlers append( + method(n, block(n println)) call(i) + ) +) + +handlers foreach(h, h call) // 1, 2, 3 +``` + +### Memory Leaks with Closures + +```io +// PROBLEM: Closure keeps large object alive +makeClosure := method( + hugeData := List clone + 10000 repeat(hugeData append(Random value)) + + block(x, x * 2) // Doesn't use hugeData but keeps it alive! +) + +// SOLUTION: Be explicit about captured variables +makeClosure := method( + hugeData := List clone + 10000 repeat(hugeData append(Random value)) + processedValue := hugeData size // Extract what you need + hugeData = nil // Release reference + + block(x, x * processedValue) +) +``` + +## Exercises + +1. **Promise Implementation**: Create a Promise/Future system using blocks for async operations. + +2. **Stream Processing**: Build a lazy stream processor with map, filter, and reduce. + +3. **Function Decorator**: Implement decorators for logging, timing, and caching. + +4. **Parser Combinators**: Create a simple parser combinator library using blocks. + +5. **Reactive System**: Build a simple FRP (Functional Reactive Programming) system. + +## Real-World Example: Pipeline Builder + +```io +Pipeline := Object clone +Pipeline init := method( + self steps := list() + self +) + +Pipeline add := method(step, + steps append(step) + self +) + +Pipeline map := method(f, + self add(block(data, + data map(f) + )) +) + +Pipeline filter := method(pred, + self add(block(data, + data select(pred) + )) +) + +Pipeline tap := method(f, + self add(block(data, + f call(data) + data + )) +) + +Pipeline run := method(input, + result := input + steps foreach(step, + result = step call(result) + ) + result +) + +// Usage +pipeline := Pipeline clone init \ + filter(block(x, x % 2 == 0)) \ + map(block(x, x * x)) \ + tap(block(data, ("After squaring: " .. data) println)) \ + filter(block(x, x > 10)) \ + map(block(x, x asString)) + +result := pipeline run(list(1, 2, 3, 4, 5, 6)) +// After squaring: list(4, 16, 36) +result println // list("16", "36") +``` + +## Conclusion + +Blocks and closures are fundamental to Io's expressiveness. They're not just anonymous functions—they're first-class objects that capture context, enable functional programming, and allow you to extend the language with new control structures. + +The distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io's scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement. + +Understanding blocks deeply unlocks Io's full potential, enabling you to write code that's both powerful and elegant. + + +--- + + +Source: /C-Integration/ + +--- +title: C Integration +topTitle: Io +subtitle: "Embedding Io in C and extending Io with high-performance C addons." +nextSectionLink: true +--- + +Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C. + +## Understanding Io's C Architecture + +Io's core is a small C library (around 10,000 lines) that implements: + +- The object model (IoObject) +- The message passing system +- Basic types (Number, String, List, etc.) +- The VM and garbage collector + +Everything else is built on top of this foundation, either in C addons or pure Io. + +## Creating a Simple C Addon + +Let's create a basic C addon that adds a method to calculate factorials: + +```c +// factorial.c +#include "IoState.h" +#include "IoObject.h" +#include "IoNumber.h" + +IoObject *IoObject_factorial(IoObject *self, IoObject *locals, IoMessage *m) +{ + // Get the number from the receiver + double n = IoNumber_asDouble(self); + + if (n < 0) { + IoState_error_(IOSTATE, m, "factorial of negative number"); + return IONIL(self); + } + + double result = 1; + for (int i = 2; i <= n; i++) { + result *= i; + } + + return IoNumber_newWithDouble_(IOSTATE, result); +} + +// Initialize the addon +void IoFactorial_init(IoState *state) +{ + IoObject *self = IoState_lobby(state); + + // Add method to Number prototype + IoObject *number = IoState_protoWithName_(state, "Number"); + IoObject_addMethod_(number, + IOSYMBOL("factorial"), + IoObject_factorial); +} +``` + +To compile and use: + +```bash +# Compile as shared library +gcc -shared -fPIC -o factorial.so factorial.c -lIo + +# In Io +DynLib load("./factorial.so") +5 factorial println // 120 +``` + +## Working with Io Objects in C + +```c +// Creating Io objects from C +IoObject *IoAddon_createObject(IoObject *self, IoObject *locals, IoMessage *m) +{ + IoState *state = IOSTATE; + + // Create different types + IoObject *num = IoNumber_newWithDouble_(state, 42.0); + IoObject *str = IoSeq_newWithCString_(state, "Hello from C"); + IoObject *list = IoList_new(state); + + // Add items to list + IoList_append_(list, num); + IoList_append_(list, str); + + // Create a new object with slots + IoObject *obj = IoObject_new(state); + IoObject_setSlot_to_(obj, IOSYMBOL("x"), num); + IoObject_setSlot_to_(obj, IOSYMBOL("message"), str); + IoObject_setSlot_to_(obj, IOSYMBOL("items"), list); + + return obj; +} + +// Accessing Io objects from C +IoObject *IoAddon_processObject(IoObject *self, IoObject *locals, IoMessage *m) +{ + // Get the first argument + IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, 0); + + // Check type + if (ISSEQ(arg)) { + char *cstr = IoSeq_asCString(arg); + printf("String argument: %s\n", cstr); + } + else if (ISNUMBER(arg)) { + double num = IoNumber_asDouble(arg); + printf("Number argument: %f\n", num); + } + else if (ISLIST(arg)) { + size_t size = IoList_size(arg); + printf("List with %zu items\n", size); + } + + return self; +} +``` + +## Creating Custom Types + +```c +// customtype.c - Define a Point type +#include "IoState.h" +#include "IoObject.h" +#include "IoNumber.h" + +// Define the type structure +typedef struct { + IoObject obj; // Must be first + double x; + double y; +} IoPoint; + +// Type tag +IoTag *IoPoint_tag(void) +{ + static IoTag *tag = NULL; + if (!tag) { + tag = IoTag_newWithName_("Point"); + } + return tag; +} + +// Constructor +IoPoint *IoPoint_new(IoState *state, double x, double y) +{ + IoPoint *self = IoObject_new(state); + IoObject_tag_(self, IoPoint_tag()); + + self->x = x; + self->y = y; + + return self; +} + +// Methods +IoObject *IoPoint_x(IoPoint *self, IoObject *locals, IoMessage *m) +{ + return IoNumber_newWithDouble_(IOSTATE, self->x); +} + +IoObject *IoPoint_y(IoPoint *self, IoObject *locals, IoMessage *m) +{ + return IoNumber_newWithDouble_(IOSTATE, self->y); +} + +IoObject *IoPoint_distance(IoPoint *self, IoObject *locals, IoMessage *m) +{ + IoPoint *other = IoMessage_locals_valueArgAt_(m, locals, 0); + + if (IoObject_tag(other) != IoPoint_tag()) { + IoState_error_(IOSTATE, m, "argument must be a Point"); + return IONIL(self); + } + + double dx = self->x - other->x; + double dy = self->y - other->y; + double distance = sqrt(dx*dx + dy*dy); + + return IoNumber_newWithDouble_(IOSTATE, distance); +} + +// Initialize the type +void IoPoint_init(IoState *state) +{ + IoObject *self = IoState_lobby(state); + + // Create prototype + IoPoint *proto = IoPoint_new(state, 0, 0); + IoState_registerProtoWithName_(state, proto, "Point"); + + // Add methods + IoObject_addMethod_(proto, IOSYMBOL("x"), IoPoint_x); + IoObject_addMethod_(proto, IOSYMBOL("y"), IoPoint_y); + IoObject_addMethod_(proto, IOSYMBOL("distance"), IoPoint_distance); +} +``` + +## Calling Io from C + +```c +// Evaluate Io code from C +IoObject *result = IoState_doString_(state, "1 + 2 * 3"); +double value = IoNumber_asDouble(result); +printf("Result: %f\n", value); // 7.0 + +// Call Io methods from C +IoObject *obj = IoState_doString_(state, "Object clone"); +IoObject *method = IoObject_getSlot_(obj, IOSYMBOL("type")); +IoObject *result = IoObject_activate(method, obj, locals, m, NULL); +char *type = IoSeq_asCString(result); +printf("Type: %s\n", type); // Object + +// Send messages +IoMessage *msg = IoMessage_newWithName_(state, IOSYMBOL("println")); +IoMessage_setCachedResult_(msg, NULL); +IoObject *result = IoObject_perform(obj, locals, msg); +``` + +## Memory Management + +Io uses a garbage collector, but when interfacing with C, you need to be careful: + +```c +// Protecting objects from GC +IoObject *IoAddon_keepAlive(IoObject *self, IoObject *locals, IoMessage *m) +{ + IoState *state = IOSTATE; + + // Create object that needs to survive GC + IoObject *important = IoObject_new(state); + + // Add reference from a persistent object + IoObject_setSlot_to_(IoState_lobby(state), + IOSYMBOL("_keepAlive"), important); + + // Or use IoState_retain/release + IoState_retain_(state, important); + + // Do work... + + // Release when done + IoState_release_(state, important); + + return important; +} + +// Managing C memory +typedef struct { + IoObject obj; + void *cdata; +} IoCWrapper; + +void IoCWrapper_free(IoCWrapper *self) +{ + if (self->cdata) { + free(self->cdata); + self->cdata = NULL; + } +} + +// Set up finalizer +IoTag *tag = IoTag_newWithName_("CWrapper"); +IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCWrapper_free); +``` + +## Wrapping C Libraries + +Example: Wrapping a simple math library: + +```c +// mathlib_wrapper.c +#include +#include "IoState.h" +#include "IoObject.h" +#include "IoNumber.h" +#include "IoList.h" + +// Wrap sin function +IoObject *IoMath_sin(IoObject *self, IoObject *locals, IoMessage *m) +{ + double x = IoMessage_locals_doubleArgAt_(m, locals, 0); + return IoNumber_newWithDouble_(IOSTATE, sin(x)); +} + +// Wrap complex function +IoObject *IoMath_stats(IoObject *self, IoObject *locals, IoMessage *m) +{ + IoList *list = IoMessage_locals_listArgAt_(m, locals, 0); + size_t count = IoList_size(list); + + if (count == 0) { + return IoList_new(IOSTATE); + } + + double sum = 0, min = INFINITY, max = -INFINITY; + + for (size_t i = 0; i < count; i++) { + IoObject *item = IoList_at_(list, i); + double value = IoNumber_asDouble(item); + + sum += value; + if (value < min) min = value; + if (value > max) max = value; + } + + double mean = sum / count; + + // Return statistics as list + IoList *result = IoList_new(IOSTATE); + IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, mean)); + IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, min)); + IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, max)); + + return result; +} + +void IoMathLib_init(IoState *state) +{ + IoObject *math = IoObject_new(state); + IoState_registerProtoWithName_(state, math, "Math"); + + IoObject_addMethod_(math, IOSYMBOL("sin"), IoMath_sin); + IoObject_addMethod_(math, IOSYMBOL("stats"), IoMath_stats); +} +``` + +Usage in Io: + +```io +DynLib load("./mathlib.so") + +Math sin(3.14159 / 2) println // 1.0 + +stats := Math stats(list(1, 2, 3, 4, 5)) +"Mean: " .. stats at(0) println // Mean: 3 +"Min: " .. stats at(1) println // Min: 1 +"Max: " .. stats at(2) println // Max: 5 +``` + +## Embedding Io in C Applications + +```c +// embed_io.c - Embedding Io in a C application +#include +#include "IoState.h" +#include "IoObject.h" +#include "IoSeq.h" + +// Custom function exposed to Io +IoObject *App_log(IoObject *self, IoObject *locals, IoMessage *m) +{ + char *msg = IoMessage_locals_cStringArgAt_(m, locals, 0); + printf("[APP LOG] %s\n", msg); + return self; +} + +int main(int argc, char *argv[]) +{ + // Initialize Io + IoState *state = IoState_new(); + IoState_init(state); + + // Add custom functions + IoObject *lobby = IoState_lobby(state); + IoObject *app = IoObject_new(state); + IoState_registerProtoWithName_(state, app, "App"); + IoObject_addMethod_(app, IOSYMBOL("log"), App_log); + + // Load and run Io script + IoState_doFile_(state, "script.io"); + + // Interact with Io objects + IoObject *result = IoState_doString_(state, + "x := 10; y := 20; x + y"); + printf("Result from Io: %f\n", IoNumber_asDouble(result)); + + // Clean up + IoState_free(state); + + return 0; +} +``` + +The Io script (script.io): + +```io +App log("Hello from Io!") + +// Define functions for C to call +calculate := method(a, b, + App log("Calculating in Io") + a * b + 100 +) +``` + +## Performance Optimization + +```c +// Optimized array operations +IoObject *IoArray_sum(IoObject *self, IoObject *locals, IoMessage *m) +{ + // Get underlying C array for performance + UArray *array = IoSeq_rawUArray(self); + size_t size = UArray_size(array); + uint8_t *data = UArray_bytes(array); + int itemSize = UArray_itemSize(array); + + double sum = 0; + + // Fast path for different types + if (itemSize == sizeof(double)) { + double *doubles = (double *)data; + for (size_t i = 0; i < size; i++) { + sum += doubles[i]; + } + } + else if (itemSize == sizeof(float)) { + float *floats = (float *)data; + for (size_t i = 0; i < size; i++) { + sum += floats[i]; + } + } + + return IoNumber_newWithDouble_(IOSTATE, sum); +} + +// Batch operations +IoObject *IoMatrix_multiply(IoObject *self, IoObject *locals, IoMessage *m) +{ + IoObject *other = IoMessage_locals_valueArgAt_(m, locals, 0); + + // Get dimensions + int rows1 = IoMessage_locals_intArgAt_(m, locals, 1); + int cols1 = IoMessage_locals_intArgAt_(m, locals, 2); + int cols2 = IoMessage_locals_intArgAt_(m, locals, 3); + + // Get raw data pointers + double *data1 = (double *)IoSeq_rawBytes(self); + double *data2 = (double *)IoSeq_rawBytes(other); + + // Allocate result + IoSeq *result = IoSeq_newWithData_length_(IOSTATE, + NULL, rows1 * cols2 * sizeof(double)); + double *resultData = (double *)IoSeq_rawBytes(result); + + // Optimized matrix multiplication + for (int i = 0; i < rows1; i++) { + for (int j = 0; j < cols2; j++) { + double sum = 0; + for (int k = 0; k < cols1; k++) { + sum += data1[i * cols1 + k] * data2[k * cols2 + j]; + } + resultData[i * cols2 + j] = sum; + } + } + + return result; +} +``` + +## Debugging C Addons + +```c +// Debug helpers +#define IO_DEBUG 1 + +#ifdef IO_DEBUG + #define DEBUG_PRINT(fmt, ...) \ + fprintf(stderr, "DEBUG: " fmt "\n", ##__VA_ARGS__) +#else + #define DEBUG_PRINT(fmt, ...) +#endif + +IoObject *IoDebug_function(IoObject *self, IoObject *locals, IoMessage *m) +{ + DEBUG_PRINT("Function called with %d arguments", + IoMessage_argCount(m)); + + // Print argument types + for (int i = 0; i < IoMessage_argCount(m); i++) { + IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, i); + DEBUG_PRINT(" Arg %d: %s", i, IoObject_name(arg)); + } + + // Check for memory issues + IoState *state = IOSTATE; + IoState_check(state); + + return self; +} +``` + +## Common Integration Patterns + +### Callback Pattern + +```c +// Store Io blocks as callbacks +typedef struct { + IoObject obj; + IoObject *callback; +} IoCallbackWrapper; + +IoObject *IoWrapper_setCallback(IoCallbackWrapper *self, + IoObject *locals, IoMessage *m) +{ + IoObject *block = IoMessage_locals_valueArgAt_(m, locals, 0); + + // Retain the block + IoState_retain_(IOSTATE, block); + if (self->callback) { + IoState_release_(IOSTATE, self->callback); + } + self->callback = block; + + return self; +} + +// Call the Io callback from C +void triggerCallback(IoCallbackWrapper *wrapper, double value) +{ + if (wrapper->callback) { + IoObject *arg = IoNumber_newWithDouble_(IOSTATE, value); + IoObject_perform(wrapper->callback, wrapper, + IoMessage_newWithName_label_(IOSTATE, + IOSYMBOL("call"), arg)); + } +} +``` + +### Event System + +```c +// Event emitter in C +typedef struct { + IoObject obj; + IoMap *handlers; // Event name -> List of handlers +} IoEventEmitter; + +IoObject *IoEventEmitter_on(IoEventEmitter *self, + IoObject *locals, IoMessage *m) +{ + IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); + IoObject *handler = IoMessage_locals_valueArgAt_(m, locals, 1); + + IoList *handlers = IoMap_at_(self->handlers, event); + if (!handlers) { + handlers = IoList_new(IOSTATE); + IoMap_atPut_(self->handlers, event, handlers); + } + + IoList_append_(handlers, handler); + return self; +} + +IoObject *IoEventEmitter_emit(IoEventEmitter *self, + IoObject *locals, IoMessage *m) +{ + IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); + IoList *handlers = IoMap_at_(self->handlers, event); + + if (handlers) { + size_t count = IoList_size(handlers); + for (size_t i = 0; i < count; i++) { + IoObject *handler = IoList_at_(handlers, i); + + // Pass remaining arguments to handler + IoMessage *msg = IoMessage_newWithName_(IOSTATE, + IOSYMBOL("call")); + for (int j = 1; j < IoMessage_argCount(m); j++) { + IoMessage_addArg_(msg, IoMessage_argAt_(m, j)); + } + + IoObject_perform(handler, locals, msg); + } + } + + return self; +} +``` + +## Build System Integration + +Makefile for Io addon: + +```makefile +# Makefile for Io addon +CC = gcc +CFLAGS = -shared -fPIC -Wall -O2 +INCLUDES = -I$(IO_HOME)/include +LIBS = -L$(IO_HOME)/lib -lIo + +ADDON = myaddon.so +SOURCES = myaddon.c utils.c +OBJECTS = $(SOURCES:.c=.o) + +all: $(ADDON) + +$(ADDON): $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LIBS) + +%.o: %.c + $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +clean: + rm -f $(OBJECTS) $(ADDON) + +install: $(ADDON) + cp $(ADDON) $(IO_HOME)/addons/ + +test: $(ADDON) + io test_addon.io +``` + +## Exercises + +1. **SQLite Wrapper**: Create a complete SQLite wrapper for Io. + +2. **Graphics Library**: Wrap SDL or Cairo for graphics programming. + +3. **Network Addon**: Implement high-performance networking primitives. + +4. **Crypto Library**: Wrap OpenSSL for cryptographic operations. + +5. **Scientific Computing**: Create bindings for BLAS/LAPACK. + +## Conclusion + +C integration is one of Io's strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns. + +Whether you're optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io's C integration provides the tools you need while maintaining the simplicity and elegance of the language. + + +--- + + +Source: /Case-Studies/ + +--- +title: Case Studies +topTitle: Io +subtitle: "Complete Io programs that bring the language's features together." +nextSectionLink: true +--- + +This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io's features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language. + +## Case Study 1: Web Server + +Building a simple but functional HTTP server demonstrates Io's networking, concurrency, and string handling: + +```io +// HTTP Server Implementation +HttpServer := Object clone +HttpServer init := method(port, + self port := port + self routes := Map clone + self middlewares := list() + self +) + +HttpRequest := Object clone +HttpRequest parse := method(rawData, + lines := rawData split("\r\n") + if(lines size == 0, return nil) + + // Parse request line + requestLine := lines at(0) split(" ") + self method := requestLine at(0) + self path := requestLine at(1) + self version := requestLine at(2) + + // Parse headers + self headers := Map clone + self body := "" + + bodyStart := false + lines slice(1) foreach(line, + if(bodyStart, + body = body .. line, + if(line size == 0, + bodyStart = true, + parts := line split(": ") + if(parts size == 2, + headers atPut(parts at(0), parts at(1)) + ) + ) + ) + ) + + // Parse query parameters + self params := Map clone + if(path containsSeq("?"), + parts := path split("?") + self path = parts at(0) + queryString := parts at(1) + + queryString split("&") foreach(param, + kv := param split("=") + if(kv size == 2, + params atPut(kv at(0), kv at(1) urlDecode) + ) + ) + ) + + self +) + +HttpResponse := Object clone +HttpResponse init := method( + self status := 200 + self headers := Map clone + self body := "" + + headers atPut("Content-Type", "text/html") + headers atPut("Server", "Io-Server/1.0") + self +) + +HttpResponse setStatus := method(code, + status = code + self +) + +HttpResponse setHeader := method(key, value, + headers atPut(key, value) + self +) + +HttpResponse write := method(content, + body = body .. content + self +) + +HttpResponse json := method(data, + setHeader("Content-Type", "application/json") + write(data asJson) + self +) + +HttpResponse build := method( + statusText := Map with( + 200, "OK", + 404, "Not Found", + 500, "Internal Server Error" + ) at(status, "Unknown") + + result := "HTTP/1.1 " .. status .. " " .. statusText .. "\r\n" + + headers atPut("Content-Length", body size asString) + headers foreach(key, value, + result = result .. key .. ": " .. value .. "\r\n" + ) + + result .. "\r\n" .. body +) + +// Middleware support +HttpServer use := method(middleware, + middlewares append(middleware) + self +) + +// Routing +HttpServer route := method(method, path, handler, + key := method .. ":" .. path + routes atPut(key, handler) + self +) + +HttpServer get := method(path, handler, + route("GET", path, handler) +) + +HttpServer post := method(path, handler, + route("POST", path, handler) +) + +// Request handling +HttpServer handleConnection := method(socket, + rawData := socket readUntilSeq("\r\n\r\n") + + request := HttpRequest parse(rawData) + if(request isNil, + socket close + return + ) + + response := HttpResponse clone init + + // Run middlewares + middlewares foreach(middleware, + middleware call(request, response) + ) + + // Find route + key := request method .. ":" .. request path + handler := routes at(key) + + if(handler, + e := try( + handler call(request, response) + ) catch(Exception, e, + response setStatus(500) write("Internal Server Error: " .. e message) + ) + , + // Try pattern matching for dynamic routes + handled := false + routes foreach(routeKey, routeHandler, + parts := routeKey split(":") + routeMethod := parts at(0) + routePath := parts at(1) + + if(routeMethod == request method and matchPath(routePath, request path), + routeHandler call(request, response) + handled = true + break + ) + ) + + if(handled not, + response setStatus(404) write("Not Found") + ) + ) + + socket write(response build) + socket close +) + +HttpServer matchPath := method(pattern, path, + // Simple pattern matching (e.g., /users/:id) + if(pattern containsSeq(":"), + patternParts := pattern split("/") + pathParts := path split("/") + + if(patternParts size != pathParts size, return false) + + patternParts foreach(i, part, + if(part beginsWithSeq(":") not, + if(part != pathParts at(i), return false) + ) + ) + + true + , + pattern == path + ) +) + +HttpServer start := method( + server := Socket clone + server setHost("127.0.0.1") + server setPort(port) + server bind + server listen + + ("Server listening on port " .. port) println + + loop( + client := server accept + @handleConnection(client) // Handle async + ) +) + +// Example application +app := HttpServer clone init(8080) + +// Middleware for logging +app use(block(request, response, + ("[" .. Date now .. "] " .. request method .. " " .. request path) println +)) + +// Static content +app get("/", block(request, response, + response write("

Welcome to Io Web Server

") + response write("

A simple server built with Io

") +)) + +// JSON API +app get("/api/info", block(request, response, + info := Map with( + "server", "Io-Server", + "version", "1.0", + "time", Date now asString + ) + response json(info) +)) + +// Dynamic routes +app get("/users/:id", block(request, response, + // Extract ID from path + id := request path split("/") at(2) + response write("

User Profile

") + response write("

User ID: " .. id .. "

") +)) + +// Form handling +app post("/submit", block(request, response, + // Parse form data from body + response write("

Form Submitted

") + response write("

Data: " .. request body .. "

") +)) + +// Start server +app start +``` + +## Case Study 2: Database ORM + +A simple object-relational mapper showcasing metaprogramming and DSL capabilities: + +```io +// ORM Implementation +ORM := Object clone + +// Database connection (simplified) +Database := Object clone +Database connections := Map clone + +Database connect := method(name, config, + conn := Connection clone init(config) + connections atPut(name, conn) + conn +) + +Connection := Object clone +Connection init := method(config, + self config := config + self tables := Map clone + self +) + +Connection execute := method(sql, + ("[SQL] " .. sql) println + // Simulate results + list() +) + +// Model base class +Model := Object clone +Model tableName := nil +Model fields := Map clone +Model connection := nil + +Model field := method(name, type, + fields atPut(name, Map with("type", type, "name", name)) + + // Generate getter + self setSlot(name, method( + self getSlot("_" .. name) + )) + + // Generate setter + self setSlot("set" .. name asCapitalized, method(value, + self setSlot("_" .. name, value) + self + )) + + self +) + +Model belongsTo := method(name, targetModel, + fields atPut(name .. "_id", Map with("type", "INTEGER", "name", name .. "_id")) + + self setSlot(name, method( + targetModel findById(self getSlot("_" .. name .. "_id")) + )) + + self +) + +Model hasMany := method(name, targetModel, foreignKey, + self setSlot(name, method( + targetModel where(foreignKey .. " = " .. self id) + )) + + self +) + +Model createTable := method( + sql := "CREATE TABLE IF NOT EXISTS " .. tableName .. " (\n" + sql = sql .. " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" + + fieldDefs := fields map(name, field, + " " .. name .. " " .. field at("type") + ) + + sql = sql .. fieldDefs join(",\n") .. "\n);" + + connection execute(sql) + self +) + +Model dropTable := method( + connection execute("DROP TABLE IF EXISTS " .. tableName) + self +) + +Model init := method( + fields foreach(name, field, + self setSlot("_" .. name, nil) + ) + self setSlot("_id", nil) + self +) + +Model save := method( + if(_id, + update, + insert + ) +) + +Model insert := method( + columns := list() + values := list() + + fields foreach(name, field, + value := self getSlot("_" .. name) + if(value isNil not, + columns append(name) + values append("'" .. value asString .. "'") + ) + ) + + sql := "INSERT INTO " .. tableName .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")" + + connection execute(sql) + self _id := connection lastInsertId // Simulated + self +) + +Model update := method( + updates := list() + + fields foreach(name, field, + value := self getSlot("_" .. name) + if(value isNil not, + updates append(name .. " = '" .. value asString .. "'") + ) + ) + + sql := "UPDATE " .. tableName .. " SET " .. updates join(", ") .. " WHERE id = " .. _id + + connection execute(sql) + self +) + +Model delete := method( + if(_id, + connection execute("DELETE FROM " .. tableName .. " WHERE id = " .. _id) + self _id := nil + ) + self +) + +// Class methods +Model all := method( + sql := "SELECT * FROM " .. tableName + rows := connection execute(sql) + + rows map(row, fromRow(row)) +) + +Model findById := method(id, + sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id + rows := connection execute(sql) + + if(rows size > 0, + fromRow(rows first), + nil + ) +) + +Model where := method(condition, + sql := "SELECT * FROM " .. tableName .. " WHERE " .. condition + rows := connection execute(sql) + + rows map(row, fromRow(row)) +) + +Model fromRow := method(row, + instance := self clone init + instance _id := row at("id") + + fields foreach(name, field, + instance setSlot("_" .. name, row at(name)) + ) + + instance +) + +// Query builder +QueryBuilder := Object clone +QueryBuilder init := method(model, + self model := model + self selections := list("*") + self conditions := list() + self orderBy := nil + self limitValue := nil + self +) + +QueryBuilder select := method( + self selections = call message arguments map(arg, + call sender doMessage(arg) asString + ) + self +) + +QueryBuilder where := method(condition, + conditions append(condition) + self +) + +QueryBuilder order := method(column, direction, + orderBy = column .. " " .. if(direction, direction, "ASC") + self +) + +QueryBuilder limit := method(n, + limitValue = n + self +) + +QueryBuilder build := method( + sql := "SELECT " .. selections join(", ") .. " FROM " .. model tableName + + if(conditions size > 0, + sql = sql .. " WHERE " .. conditions join(" AND ") + ) + + if(orderBy, + sql = sql .. " ORDER BY " .. orderBy + ) + + if(limitValue, + sql = sql .. " LIMIT " .. limitValue + ) + + sql +) + +QueryBuilder execute := method( + sql := build + rows := model connection execute(sql) + rows map(row, model fromRow(row)) +) + +// Define models +User := Model clone +User tableName = "users" +User connection = Database connect("main", Map with("file", "app.db")) + +User field("name", "VARCHAR(100)") \ + field("email", "VARCHAR(100)") \ + field("age", "INTEGER") \ + field("created_at", "DATETIME") + +User hasMany("posts", Post, "user_id") + +Post := Model clone +Post tableName = "posts" +Post connection = User connection + +Post field("title", "VARCHAR(200)") \ + field("content", "TEXT") \ + field("published", "BOOLEAN") \ + field("user_id", "INTEGER") + +Post belongsTo("user", User) + +// Validations +User validate := method( + errors := list() + + if(_name isNil or _name size == 0, + errors append("Name is required") + ) + + if(_email isNil or _email containsSeq("@") not, + errors append("Invalid email") + ) + + if(_age and (_age < 0 or _age > 150), + errors append("Invalid age") + ) + + if(errors size > 0, + Exception raise(errors join(", ")) + ) + + true +) + +User beforeSave := method( + validate + _created_at := Date now +) + +// Usage example +User createTable +Post createTable + +user := User clone init +user setName("Alice") setEmail("alice@example.com") setAge(30) +user save + +post := Post clone init +post setTitle("First Post") \ + setContent("Hello, World!") \ + setPublished(true) \ + setUserId(user id) +post save + +// Query examples +allUsers := User all +youngUsers := User where("age < 25") +userPosts := user posts + +// Query builder +query := QueryBuilder clone init(User) +results := query select("name", "email") \ + where("age > 21") \ + order("name") \ + limit(10) \ + execute +``` + +## Case Study 3: Game Engine + +A simple 2D game engine demonstrating real-time systems and graphics: + +```io +// Game Engine Core +GameEngine := Object clone +GameEngine init := method(width, height, + self width := width + self height := height + self entities := list() + self systems := list() + self running := true + self fps := 60 + self frameTime := 1.0 / fps + self +) + +// Entity Component System +Entity := Object clone +Entity init := method( + self id := Random uuid + self components := Map clone + self active := true + self +) + +Entity addComponent := method(name, component, + components atPut(name, component) + component entity := self + self +) + +Entity getComponent := method(name, + components at(name) +) + +Entity hasComponent := method(name, + components hasKey(name) +) + +// Components +Component := Object clone + +PositionComponent := Component clone +PositionComponent init := method(x, y, + self x := x + self y := y + self +) + +VelocityComponent := Component clone +VelocityComponent init := method(dx, dy, + self dx := dx + self dy := dy + self +) + +SpriteComponent := Component clone +SpriteComponent init := method(image, width, height, + self image := image + self width := width + self height := height + self +) + +ColliderComponent := Component clone +ColliderComponent init := method(width, height, + self width := width + self height := height + self +) + +HealthComponent := Component clone +HealthComponent init := method(maxHealth, + self maxHealth := maxHealth + self currentHealth := maxHealth + self +) + +// Systems +System := Object clone +System init := method( + self requiredComponents := list() + self +) + +System process := method(entity, deltaTime, + // Override in subclasses +) + +System canProcess := method(entity, + requiredComponents all(comp, + entity hasComponent(comp) + ) +) + +MovementSystem := System clone +MovementSystem requiredComponents = list("position", "velocity") + +MovementSystem process := method(entity, deltaTime, + pos := entity getComponent("position") + vel := entity getComponent("velocity") + + pos x = pos x + vel dx * deltaTime + pos y = pos y + vel dy * deltaTime +) + +CollisionSystem := System clone +CollisionSystem requiredComponents = list("position", "collider") + +CollisionSystem init := method( + resend + self collisions := list() + self +) + +CollisionSystem update := method(entities, deltaTime, + collisions = list() + + // Check all pairs + entities foreach(i, e1, + if(canProcess(e1), + entities slice(i + 1) foreach(e2, + if(canProcess(e2) and checkCollision(e1, e2), + collisions append(list(e1, e2)) + onCollision(e1, e2) + ) + ) + ) + ) +) + +CollisionSystem checkCollision := method(e1, e2, + p1 := e1 getComponent("position") + c1 := e1 getComponent("collider") + p2 := e2 getComponent("position") + c2 := e2 getComponent("collider") + + // AABB collision + p1 x < p2 x + c2 width and + p1 x + c1 width > p2 x and + p1 y < p2 y + c2 height and + p1 y + c1 height > p2 y +) + +CollisionSystem onCollision := method(e1, e2, + ("Collision between " .. e1 id .. " and " .. e2 id) println +) + +// Rendering (simulated) +RenderSystem := System clone +RenderSystem requiredComponents = list("position", "sprite") + +RenderSystem init := method( + resend + self screen := list() + self +) + +RenderSystem render := method(entities, + // Clear screen + screen = list() + + entities foreach(entity, + if(canProcess(entity), + pos := entity getComponent("position") + sprite := entity getComponent("sprite") + + screen append(Map with( + "x", pos x, + "y", pos y, + "image", sprite image + )) + ) + ) + + // Draw screen (simulated) + drawScreen +) + +RenderSystem drawScreen := method( + "Frame:" println + screen foreach(item, + (" [" .. item at("image") .. "] at (" .. + item at("x") round .. ", " .. item at("y") round .. ")") println + ) +) + +// Input handling +InputManager := Object clone +InputManager init := method( + self keys := Map clone + self mouseX := 0 + self mouseY := 0 + self +) + +InputManager isKeyPressed := method(key, + keys at(key, false) +) + +InputManager setKey := method(key, pressed, + keys atPut(key, pressed) +) + +// Game states +GameState := Object clone +GameState enter := method() +GameState exit := method() +GameState update := method(deltaTime) +GameState render := method() + +MenuState := GameState clone +MenuState enter := method( + "Entering menu" println + self selectedOption := 0 + self options := list("Start Game", "Options", "Quit") +) + +MenuState update := method(deltaTime, + // Handle menu input + if(InputManager isKeyPressed("up"), + selectedOption = (selectedOption - 1) max(0) + ) + if(InputManager isKeyPressed("down"), + selectedOption = (selectedOption + 1) min(options size - 1) + ) + if(InputManager isKeyPressed("enter"), + handleSelection + ) +) + +MenuState handleSelection := method( + option := options at(selectedOption) + if(option == "Start Game", + GameEngine setState(PlayState) + ) + if(option == "Quit", + GameEngine stop + ) +) + +PlayState := GameState clone +PlayState enter := method( + "Starting game" println + createLevel +) + +PlayState createLevel := method( + // Create player + player := Entity clone init + player addComponent("position", PositionComponent clone init(100, 100)) + player addComponent("velocity", VelocityComponent clone init(0, 0)) + player addComponent("sprite", SpriteComponent clone init("player", 32, 32)) + player addComponent("collider", ColliderComponent clone init(32, 32)) + player addComponent("health", HealthComponent clone init(100)) + + GameEngine addEntity(player) + + // Create enemies + 3 repeat(i, + enemy := Entity clone init + enemy addComponent("position", + PositionComponent clone init(200 + i * 50, 200)) + enemy addComponent("velocity", + VelocityComponent clone init(Random value * 20 - 10, Random value * 20 - 10)) + enemy addComponent("sprite", + SpriteComponent clone init("enemy", 24, 24)) + enemy addComponent("collider", + ColliderComponent clone init(24, 24)) + + GameEngine addEntity(enemy) + ) +) + +PlayState update := method(deltaTime, + // Handle player input + player := GameEngine entities first + if(player, + vel := player getComponent("velocity") + + vel dx = 0 + vel dy = 0 + + if(InputManager isKeyPressed("left"), vel dx = -100) + if(InputManager isKeyPressed("right"), vel dx = 100) + if(InputManager isKeyPressed("up"), vel dy = -100) + if(InputManager isKeyPressed("down"), vel dy = 100) + ) +) + +// Main game engine methods +GameEngine addEntity := method(entity, + entities append(entity) + entity +) + +GameEngine removeEntity := method(entity, + entities remove(entity) +) + +GameEngine addSystem := method(system, + systems append(system) + system +) + +GameEngine setState := method(state, + if(hasSlot("currentState") and currentState, + currentState exit + ) + currentState := state + currentState enter +) + +GameEngine update := method(deltaTime, + // Update current state + if(currentState, + currentState update(deltaTime) + ) + + // Update systems + systems foreach(system, + if(system hasSlot("update"), + system update(entities, deltaTime), + entities foreach(entity, + if(system canProcess(entity), + system process(entity, deltaTime) + ) + ) + ) + ) + + // Remove inactive entities + entities = entities select(e, e active) +) + +GameEngine render := method( + if(currentState, + currentState render + ) + + renderSystem render(entities) +) + +GameEngine run := method( + lastTime := Date now + + while(running, + currentTime := Date now + deltaTime := currentTime - lastTime + + if(deltaTime >= frameTime, + update(deltaTime) + render + lastTime = currentTime + ) + + // Small delay to prevent CPU spinning + wait(0.001) + ) +) + +GameEngine stop := method( + running = false +) + +// Initialize and run game +game := GameEngine clone init(800, 600) + +// Add systems +game addSystem(MovementSystem clone) +game addSystem(CollisionSystem clone init) +game renderSystem := RenderSystem clone init + +// Set initial state +game setState(MenuState) + +// Simulate some gameplay +"=== Game Engine Demo ===" println +MenuState handleSelection // Start game + +// Run a few frames +5 repeat(i, + ("Frame " .. i) println + game update(game frameTime) + game render + wait(0.1) +) +``` + +## Case Study 4: Build System + +A build system similar to Make or Rake: + +```io +// Build System +BuildSystem := Object clone +BuildSystem init := method( + self tasks := Map clone + self dependencies := Map clone + self executed := list() + self config := Map clone + self +) + +Task := Object clone +Task init := method(name, deps, action, + self name := name + self dependencies := if(deps, deps, list()) + self action := action + self outputs := list() + self inputs := list() + self +) + +Task execute := method(context, + ("Executing task: " .. name) println + if(action, + action call(context) + ) +) + +Task upToDate := method( + if(outputs size == 0 or inputs size == 0, + return false + ) + + outputTime := outputs map(f, File with(f) lastModified) min + inputTime := inputs map(f, File with(f) lastModified) max + + outputTime > inputTime +) + +// DSL for defining tasks +BuildSystem task := method(name, + t := Task clone init(name, list(), nil) + tasks atPut(name, t) + + self currentTask := t + call evalArgAt(0) + t +) + +BuildSystem desc := method(description, + if(currentTask, + currentTask description := description + ) +) + +BuildSystem depends := method( + deps := call message arguments map(arg, + call sender doMessage(arg) asString + ) + if(currentTask, + currentTask dependencies = deps + ) +) + +BuildSystem action := method( + if(currentTask, + currentTask action = call argAt(0) + ) +) + +BuildSystem file := method(output, inputs, + name := output + t := Task clone init(name, list(), nil) + t outputs = list(output) + t inputs = if(inputs type == "List", inputs, list(inputs)) + + tasks atPut(name, t) + self currentTask := t + + call evalArgAt(2) + t +) + +// Running tasks +BuildSystem run := method(taskName, + executed = list() + executeTask(taskName) +) + +BuildSystem executeTask := method(taskName, + if(executed contains(taskName), + return + ) + + task := tasks at(taskName) + if(task isNil, + Exception raise("Task not found: " .. taskName) + ) + + // Check if up to date + if(task upToDate, + ("Task " .. taskName .. " is up to date") println + return + ) + + // Execute dependencies first + task dependencies foreach(dep, + executeTask(dep) + ) + + // Execute the task + task execute(self) + executed append(taskName) +) + +// Utilities +BuildSystem sh := method(command, + ("$ " .. command) println + System system(command) +) + +BuildSystem glob := method(pattern, + Directory with(".") files select(f, + f name matchesRegex(pattern) + ) map(name) +) + +BuildSystem mkdir := method(path, + Directory with(path) create +) + +BuildSystem cp := method(src, dest, + File with(src) copyTo(dest) +) + +BuildSystem rm := method(path, + File with(path) remove +) + +// Configuration +BuildSystem configure := method( + call message arguments foreach(arg, + key := arg name + value := call sender doMessage(arg arguments at(0)) + config atPut(key, value) + ) + self +) + +// Example Buildfile +build := BuildSystem clone init + +build configure( + compiler: "gcc", + flags: "-Wall -O2", + srcDir: "src", + buildDir: "build" +) + +build task("clean", + desc("Remove all build artifacts") + action( + rm(config at("buildDir")) + "Cleaned" println + ) +) + +build task("init", + desc("Initialize build directory") + action( + mkdir(config at("buildDir")) + ) +) + +build task("compile", + desc("Compile C sources") + depends("init") + action( + sources := glob("src/*.c") + sources foreach(src, + obj := src replaceSeq(".c", ".o") replaceSeq("src/", "build/") + sh(config at("compiler") .. " " .. config at("flags") .. + " -c " .. src .. " -o " .. obj) + ) + ) +) + +build task("link", + desc("Link object files") + depends("compile") + action( + objects := glob("build/*.o") join(" ") + sh(config at("compiler") .. " " .. objects .. " -o build/app") + ) +) + +build task("test", + desc("Run tests") + depends("link") + action( + sh("./build/app --test") + ) +) + +build task("default", + depends("link") +) + +// File tasks for individual files +build file("build/main.o", list("src/main.c"), + action( + sh(config at("compiler") .. " " .. config at("flags") .. + " -c src/main.c -o build/main.o") + ) +) + +// Run build +build run("default") +``` + +## Lessons Learned + +These case studies demonstrate several key insights about building real applications in Io: + +### Strengths + +1. **Rapid Prototyping**: Io's minimal syntax and dynamic nature make it excellent for quickly building working prototypes. + +2. **DSL Creation**: The HTTP server's routing, ORM's query builder, and build system all show how naturally DSLs emerge in Io. + +3. **Flexibility**: The ability to modify anything at runtime made it easy to add features like middleware, validations, and hooks. + +4. **Concurrency**: The `@` operator and coroutines made async request handling in the web server trivial. + +### Challenges + +1. **Performance**: For the game engine, Io's interpreted nature and message passing overhead would limit frame rates in a real game. + +2. **Type Safety**: The ORM would benefit from type checking that Io doesn't provide, leading to potential runtime errors. + +3. **Tooling**: Lack of IDE support makes maintaining larger codebases challenging. + +4. **Libraries**: Many features had to be built from scratch due to limited ecosystem. + +### Best Practices + +1. **Use Prototypes Effectively**: Define clear prototype hierarchies (Model -> User, Component -> PositionComponent). + +2. **Leverage Message Passing**: The game engine's entity-component system naturally maps to message passing. + +3. **Build Abstractions**: Each case study built higher-level abstractions (Repository, Task, System) on Io's primitives. + +4. **Embrace DSLs**: Don't fight the language—use its strengths to create domain-appropriate interfaces. + +## Conclusion + +These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value. + + +--- + + +Source: /Cloning-and-Inheritance/ + +--- +title: Cloning and Inheritance +topTitle: Io +subtitle: "How inheritance chains emerge from the simpler operation of cloning." +nextSectionLink: true +--- + +In class-based languages, inheritance is a relationship between classes. In Io's prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively. + +## The Mechanics of Cloning + +When you clone an object in Io, you don't copy all its data. Instead, you create a new, empty object with a reference to the original: + +```io +// Create a prototype +Animal := Object clone +Animal species := "Unknown" +Animal age := 0 +Animal describe := method( + ("A " .. age .. " year old " .. species) println +) + +// Clone it +cat := Animal clone + +// cat is empty but linked to Animal +cat slotNames println // list() - no local slots! +cat species println // "Unknown" - from Animal +cat age println // 0 - from Animal + +// The link is through 'proto' +cat proto == Animal println // true +``` + +This is fundamentally different from copying: + +```io +// If cloning was copying (it's not!), it would work like: +catCopy := Object clone +catCopy species := Animal species // Copy each slot +catCopy age := Animal age +catCopy describe := Animal describe + +// But cloning actually creates a link: +catClone := Animal clone // Empty object linked to Animal +``` + +## Differential Inheritance in Action + +Objects only store their differences from their prototypes: + +```io +Vehicle := Object clone +Vehicle speed := 60 +Vehicle color := "white" +Vehicle drive := method( + ("Driving at " .. speed .. " mph") println +) + +car := Vehicle clone +car color = "red" // Override color +car model := "Sedan" // Add new slot + +// Inspect what's stored where +car slotNames println // list(color, model) - only differences! +Vehicle slotNames println // list(speed, color, drive) + +// But car can access everything +car speed println // 60 - from Vehicle +car color println // "red" - from car (overrides Vehicle) +car model println // "Sedan" - from car +car drive // "Driving at 60 mph" +``` + +Memory efficiency comparison: + +```io +// Creating 1000 cars +cars := list() +1000 times(i, + car := Vehicle clone + car id := i + cars append(car) +) + +// Each car only stores its 'id' slot +// All share Vehicle's methods and default values +// In a copying system, each would duplicate everything +``` + +## The Prototype Chain + +Objects can have chains of prototypes: + +```io +Organism := Object clone +Organism alive := true +Organism metabolize := method("Converting energy..." println) + +Animal := Organism clone +Animal mobile := true +Animal move := method("Moving..." println) + +Mammal := Animal clone +Mammal warmBlooded := true +Mammal nurse := method("Nursing young..." println) + +Dog := Mammal clone +Dog loyal := true +Dog bark := method("Woof!" println) + +fido := Dog clone +fido name := "Fido" + +// fido can access methods from the entire chain +fido metabolize // From Organism +fido move // From Animal +fido nurse // From Mammal +fido bark // From Dog + +// Trace the chain +obj := fido +while(obj != Object, + obj type println + obj = obj proto +) +// Dog +// Mammal +// Animal +// Organism +// Object +``` + +## Method Resolution Order + +When you send a message, Io searches up the prototype chain: + +```io +A := Object clone +A foo := method("A's foo" println) +A bar := method("A's bar" println) + +B := A clone +B foo := method("B's foo" println) // Override + +C := B clone +C bar := method("C's bar" println) // Override different method + +obj := C clone + +obj foo // "B's foo" - found in B (C doesn't have it) +obj bar // "C's bar" - found in C +obj baz // Exception - not found anywhere +``` + +You can visualize the search: + +```io +Object findSlot := method(slotName, + obj := self + while(obj, + if(obj hasLocalSlot(slotName), + ("Found '" .. slotName .. "' in " .. obj type) println + return obj getSlot(slotName) + ) + obj = obj proto + ) + "Not found" println +) + +obj findSlot("foo") // Found 'foo' in B +obj findSlot("bar") // Found 'bar' in C +``` + +## Multiple Inheritance + +Io supports multiple inheritance through the `protos` list: + +```io +// Define capabilities +Flyable := Object clone +Flyable altitude := 0 +Flyable fly := method(height, + altitude = height + ("Flying at " .. altitude .. " feet") println +) + +Swimmable := Object clone +Swimmable depth := 0 +Swimmable swim := method(d, + depth = d + ("Swimming at " .. depth .. " feet deep") println +) + +// Single inheritance +Bird := Flyable clone +Bird chirp := method("Chirp!" println) + +// Multiple inheritance +Duck := Object clone +Duck appendProto(Flyable) +Duck appendProto(Swimmable) +Duck quack := method("Quack!" println) + +mallard := Duck clone +mallard fly(100) // Flying at 100 feet +mallard swim(5) // Swimming at 5 feet deep +mallard quack // Quack! + +// Check the prototype list +Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) +``` + +## Diamond Problem Resolution + +The diamond problem occurs when multiple inheritance paths lead to the same ancestor: + +```io +// Diamond structure +Grandparent := Object clone +Grandparent value := "from grandparent" +Grandparent method1 := method("Grandparent method1" println) + +Parent1 := Grandparent clone +Parent1 method1 := method("Parent1 method1" println) +Parent1 method2 := method("Parent1 method2" println) + +Parent2 := Grandparent clone +Parent2 method1 := method("Parent2 method1" println) +Parent2 method3 := method("Parent2 method3" println) + +Child := Object clone +Child appendProto(Parent1) +Child appendProto(Parent2) + +// Resolution order matters +Child method1 // "Parent1 method1" - Parent1 comes first + +// Reorder to change priority +Child protos := list(Parent2, Parent1) +Child method1 // "Parent2 method1" - Parent2 now comes first +``` + +## Shallow vs Deep Cloning + +By default, cloning is shallow—slot values are shared: + +```io +Original := Object clone +Original data := list(1, 2, 3) +Original info := Map clone atPut("key", "value") + +Shallow := Original clone + +// Modifying mutable objects affects both +Shallow data append(4) +Original data println // list(1, 2, 3, 4) - changed! + +// Need deep cloning for independence +Object deepClone := method( + new := self clone + self slotNames foreach(name, + value := self getSlot(name) + if(value hasSlot("clone"), + new setSlot(name, value clone) + ) + ) + new +) + +Deep := Original deepClone +Deep data append(5) +Original data println // list(1, 2, 3, 4) - unchanged +Deep data println // list(1, 2, 3, 4, 5) +``` + +## init Methods and Constructors + +While Io doesn't have constructors, you can create initialization patterns: + +```io +Person := Object clone +Person init := method( + self name := "Unknown" + self age := 0 + self contacts := list() // Important: new list for each instance + self // Return self for chaining +) + +// Override clone to call init +Person clone := method( + resend init +) + +// Now each person gets their own contacts list +alice := Person clone +alice name = "Alice" +alice contacts append("Bob") + +bob := Person clone +bob name = "Bob" +bob contacts append("Charlie") + +alice contacts println // list("Bob") - independent! +bob contacts println // list("Charlie") +``` + +## Factory Methods + +Create specialized cloning methods: + +```io +Animal := Object clone +Animal species := "Unknown" +Animal sound := "..." + +Animal withSpecies := method(s, + new := self clone + new species = s + new +) + +Animal dog := method( + self clone species = "Dog" sound = "Woof" +) + +Animal cat := method( + self clone species = "Cat" sound = "Meow" +) + +// Usage +myDog := Animal dog +myCat := Animal cat +genericAnimal := Animal withSpecies("Elephant") +``` + +## Prototype Switching + +Unlike class-based languages, you can change an object's prototype at runtime: + +```io +// Start with one prototype +Bird := Object clone +Bird fly := method("Flying..." println) + +Fish := Object clone +Fish swim := method("Swimming..." println) + +creature := Bird clone +creature fly // "Flying..." + +// Change its prototype! +creature protos = list(Fish) +creature swim // "Swimming..." +creature fly // Exception - no longer a Bird! + +// Or add capabilities +creature appendProto(Bird) +creature fly // "Flying..." - now it can do both +creature swim // "Swimming..." +``` + +## Mixins and Traits + +Use prototypes as mixins for composable behavior: + +```io +// Define mixins +Comparable := Object clone +Comparable < := method(other, self compare(other) < 0) +Comparable > := method(other, self compare(other) > 0) +Comparable == := method(other, self compare(other) == 0) +Comparable <= := method(other, self compare(other) <= 0) +Comparable >= := method(other, self compare(other) >= 0) + +Enumerable := Object clone +Enumerable select := method(block, + result := list() + self foreach(item, + if(block call(item), result append(item)) + ) + result +) +Enumerable map := method(block, + result := list() + self foreach(item, + result append(block call(item)) + ) + result +) + +// Use mixins +SortedList := List clone +SortedList appendProto(Comparable) +SortedList appendProto(Enumerable) +SortedList compare := method(other, + self size compare(other size) +) + +list1 := SortedList clone append(1, 2, 3) +list2 := SortedList clone append(4, 5) +(list1 > list2) println // true (3 > 2) +``` + +## Clone Hooks + +Customize cloning behavior: + +```io +Counted := Object clone +Counted instances := 0 + +Counted clone := method( + Counted instances = Counted instances + 1 + new := resend + new id := Counted instances + new +) + +// Each clone gets a unique ID +obj1 := Counted clone +obj2 := Counted clone +obj3 := Counted clone + +obj1 id println // 1 +obj2 id println // 2 +obj3 id println // 3 +Counted instances println // 3 +``` + +## Inheritance Patterns + +### Classical Inheritance Pattern + +Emulate class-based inheritance: + +```io +// Base "class" +Class := Object clone +Class new := method( + instance := self clone + instance init + instance +) + +// Define a "class" +Rectangle := Class clone +Rectangle init := method( + self width := 0 + self height := 0 +) +Rectangle area := method(width * height) + +// Inheritance +Square := Rectangle clone +Square init := method( + resend // Call parent init + self side := 0 +) +Square setSide := method(s, + side = s + width = s + height = s +) + +// Usage +rect := Rectangle new +rect width = 10 +rect height = 20 +rect area println // 200 + +square := Square new +square setSide(5) +square area println // 25 +``` + +### Delegation Pattern + +```io +Delegator := Object clone +Delegator delegate := nil +Delegator forward := method( + if(delegate, + delegate doMessage(call message, call sender) + , + Exception raise("No delegate set") + ) +) + +Logger := Object clone +Logger log := method(msg, ("[LOG] " .. msg) println) + +obj := Delegator clone +obj delegate = Logger +obj log("Hello") // [LOG] Hello +``` + +## Testing Inheritance + +Check inheritance relationships: + +```io +Object isKindOf := method(proto, + obj := self + while(obj, + if(obj == proto, return true) + if(obj protos, + obj protos foreach(p, + if(p isKindOf(proto), return true) + ) + ) + obj = obj proto + ) + false +) + +Animal := Object clone +Dog := Animal clone +fido := Dog clone + +fido isKindOf(Dog) println // true +fido isKindOf(Animal) println // true +fido isKindOf(Object) println // true +fido isKindOf(Number) println // false +``` + +## Performance Considerations + +Prototype chains affect performance: + +```io +// Deep chain - slower lookup +A := Object clone +B := A clone +C := B clone +D := C clone +E := D clone +obj := E clone +obj method := method("Found!") + +// Shallow chain - faster lookup +Flat := Object clone +Flat method := method("Found!") +obj2 := Flat clone + +// Benchmark +time(100000 times(obj method)) // Slower +time(100000 times(obj2 method)) // Faster +``` + +## Common Pitfalls + +### Shared Mutable State + +```io +// WRONG - shares list between instances +BadTemplate := Object clone +BadTemplate items := list() + +obj1 := BadTemplate clone +obj2 := BadTemplate clone +obj1 items append(1) +obj2 items println // list(1) - Oops! Shared! + +// RIGHT - create new list for each instance +GoodTemplate := Object clone +GoodTemplate init := method( + self items := list() + self +) +GoodTemplate clone := method(resend init) +``` + +### Circular Prototypes + +```io +// Don't do this! +A := Object clone +B := Object clone +A appendProto(B) +B appendProto(A) // Circular! + +// A foo // Infinite loop! +``` + +## Exercises + +1. **Instance Counter**: Create a prototype that tracks how many objects have been cloned from it, directly or indirectly. + +2. **Prototype Inspector**: Write a method that visualizes an object's complete prototype hierarchy as a tree. + +3. **Deep Clone**: Implement a robust deep cloning method that handles circular references. + +4. **Multiple Inheritance Resolver**: Create a system that detects and reports conflicts in multiple inheritance. + +5. **Class Emulator**: Build a complete class-based OOP system on top of Io's prototypes, including abstract classes and interfaces. + +## Real-World Example: Game Entity System + +```io +// Base entity +Entity := Object clone +Entity init := method( + self x := 0 + self y := 0 + self health := 100 + self +) +Entity clone := method(resend init) +Entity takeDamage := method(amount, + health = health - amount + if(health <= 0, self die) +) +Entity die := method("Entity died" println) + +// Moveable capability +Moveable := Object clone +Moveable speed := 1 +Moveable moveTo := method(newX, newY, + x = newX + y = newY +) + +// Attacker capability +Attacker := Object clone +Attacker damage := 10 +Attacker attack := method(target, + target takeDamage(damage) +) + +// Compose entities +Player := Entity clone +Player appendProto(Moveable) +Player appendProto(Attacker) +Player speed = 5 +Player damage = 20 + +Enemy := Entity clone +Enemy appendProto(Moveable) +Enemy appendProto(Attacker) +Enemy speed = 3 +Enemy damage = 15 + +// Static entity +Turret := Entity clone +Turret appendProto(Attacker) +Turret damage = 25 + +// Usage +player := Player clone +enemy := Enemy clone +turret := Turret clone + +player moveTo(10, 10) +player attack(enemy) +turret attack(player) +``` + +## Conclusion + +Cloning and inheritance in Io demonstrate how complex behavior can emerge from simple mechanisms. Instead of classes, instances, and inheritance hierarchies defined at compile time, you have objects cloning objects, maintaining prototype links, and delegating message handling up the chain. + +This flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating "classes" as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile. + +Understanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren't just how you create objects—they're how you structure entire programs. + + +--- + + +Source: /Collections/ + +--- +title: Collections +topTitle: Io +subtitle: "Lists, Maps, and Sequences: Io's core data structures and how to extend them." +nextSectionLink: true +--- + +Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types. + +## Lists: Ordered Collections + +Lists in Io are dynamic arrays that can hold any type of object: + +```io +// Creating lists +empty := list() +numbers := list(1, 2, 3, 4, 5) +mixed := list("hello", 42, true, Object clone) + +// Lists are objects +numbers type println // List + +// Basic operations +numbers size println // 5 +numbers isEmpty println // false +numbers first println // 1 +numbers last println // 5 +numbers at(2) println // 3 (zero-indexed) +``` + +### List Manipulation + +```io +fruits := list("apple", "banana") + +// Adding elements +fruits append("orange") +fruits prepend("grape") +fruits println // list(grape, apple, banana, orange) + +// Insert at position +fruits atInsert(2, "mango") +fruits println // list(grape, apple, mango, banana, orange) + +// Removing elements +fruits remove("mango") +fruits removeAt(0) +fruits pop // Removes and returns last element +fruits println // list(apple, banana) + +// Multiple operations +fruits appendSeq(list("kiwi", "peach")) +fruits println // list(apple, banana, kiwi, peach) +``` + +### List Iteration + +```io +numbers := list(1, 2, 3, 4, 5) + +// Basic iteration +numbers foreach(n, + n println +) + +// With index +numbers foreach(i, n, + (i .. ": " .. n) println +) + +// Reverse iteration +numbers reverseForEach(n, + n println +) +``` + +### Functional Operations + +```io +numbers := list(1, 2, 3, 4, 5) + +// Map: transform each element +squared := numbers map(x, x * x) +squared println // list(1, 4, 9, 16, 25) + +// Select: filter elements +evens := numbers select(x, x % 2 == 0) +evens println // list(2, 4) + +// Reject: inverse of select +odds := numbers reject(x, x % 2 == 0) +odds println // list(1, 3, 5) + +// Detect: find first match +firstEven := numbers detect(x, x % 2 == 0) +firstEven println // 2 + +// Reduce: aggregate +sum := numbers reduce(+) +sum println // 15 + +// Custom reduce +product := numbers reduce(a, b, a * b) +product println // 120 + +// Any/all predicates +numbers contains(3) println // true +numbers containsAll(list(2, 4)) println // true +numbers containsAny(list(10, 3)) println // true +``` + +### List Slicing and Manipulation + +```io +letters := list("a", "b", "c", "d", "e") + +// Slicing +letters slice(1, 3) println // list(b, c, d) +letters slice(2) println // list(c, d, e) + +// Copying +copy := letters copy +copy atPut(0, "z") +letters println // list(a, b, c, d, e) - unchanged +copy println // list(z, b, c, d, e) + +// Sorting +numbers := list(3, 1, 4, 1, 5, 9) +numbers sort println // list(1, 1, 3, 4, 5, 9) + +// Custom sort +people := list( + Object clone do(name := "Alice"; age := 30), + Object clone do(name := "Bob"; age := 25), + Object clone do(name := "Charlie"; age := 35) +) + +people sortBy(block(p, p age)) foreach(p, + (p name .. ": " .. p age) println +) +// Bob: 25 +// Alice: 30 +// Charlie: 35 +``` + +## Maps: Key-Value Stores + +Maps (also called dictionaries or hash tables) store key-value pairs: + +```io +// Creating maps +empty := Map clone +person := Map clone atPut("name", "Alice") atPut("age", 30) + +// Alternative creation +person := Map with( + "name", "Alice", + "age", 30, + "city", "New York" +) + +// Accessing values +person at("name") println // Alice +person at("missing") println // nil +person at("missing", "default") println // default + +// Setting values +person atPut("age", 31) +person atPut("email", "alice@example.com") + +// Checking keys +person hasKey("name") println // true +person hasKey("phone") println // false +``` + +### Map Operations + +```io +map := Map with("a", 1, "b", 2, "c", 3) + +// Get all keys and values +map keys println // list(a, b, c) +map values println // list(1, 2, 3) + +// Size and emptiness +map size println // 3 +map isEmpty println // false + +// Removing entries +map removeAt("b") +map println // Map_0x...: a=1, c=3 + +// Iteration +map foreach(key, value, + (key .. " => " .. value) println +) + +// Merging maps +other := Map with("c", 30, "d", 4) +map merge(other) +map println // a=1, c=30, d=4 (note c was overwritten) +``` + +### Maps as Objects + +Maps can act like objects with dynamic properties: + +```io +// Create object-like map +obj := Map clone +obj atPut("greet", method(name, + ("Hello, " .. name .. "!") println +)) +obj atPut("x", 10) +obj atPut("y", 20) + +// Use like object (sort of) +obj at("greet") call("World") // Hello, World! +obj at("x") println // 10 +``` + +## Sequences: String Handling + +Sequences are Io's strings, but they're mutable and act like byte arrays: + +```io +text := "Hello, World!" + +// Basic operations +text size println // 13 +text at(0) println // 72 (ASCII 'H') +text at(0) asCharacter println // H + +// Slicing +text slice(0, 5) println // Hello +text slice(7) println // World! + +// Searching +text findSeq("World") println // 7 (index) +text containsSeq("Hello") println // true +text beginsWithSeq("Hello") println // true +text endsWithSeq("!") println // true +``` + +### String Manipulation + +```io +text := " Hello, World! " + +// Trimming +text strip println // "Hello, World!" +text lstrip println // "Hello, World! " +text rstrip println // " Hello, World!" + +// Case conversion +"hello" upper println // HELLO +"WORLD" lower println // world +"hello world" asCapitalized println // Hello world + +// Replacement +"hello world" replaceSeq("world", "Io") println // hello Io +"abcabc" replaceFirstSeq("a", "X") println // Xbcabc + +// Splitting and joining +words := "apple,banana,orange" split(",") +words println // list(apple, banana, orange) + +words join("-") println // apple-banana-orange +``` + +### String Building + +```io +// Inefficient string concatenation +result := "" +for(i, 1, 1000, + result = result .. i .. ", " +) + +// Better: use a list +parts := list() +for(i, 1, 1000, + parts append(i) +) +result := parts join(", ") + +// Or use Sequence's mutable nature +seq := Sequence clone +for(i, 1, 100, + seq appendSeq(i asString) appendSeq(", ") +) +``` + +### Regular Expressions + +Io has built-in regex support: + +```io +text := "The year 2024 has 365 days" + +// Find matches +text findRegex("\\d+") println // MatchResult... +text allMatchesOfRegex("\\d+") foreach(match, + match println // 2024, 365 +) + +// Replace with regex +text replaceAllRegex("\\d+", "N") println // The year N has N days + +// Capture groups +email := "user@example.com" +match := email matchesOfRegex("(\\w+)@(\\w+\\.\\w+)") +if(match, + match at(1) println // user + match at(2) println // example.com +) +``` + +## Creating Custom Collections + +### Stack Implementation + +```io +Stack := List clone +Stack push := method(item, + self append(item) +) + +Stack pop := method( + if(size > 0, + removeAt(size - 1), + nil + ) +) + +Stack peek := method( + if(size > 0, + at(size - 1), + nil + ) +) + +// Usage +stack := Stack clone +stack push(1) push(2) push(3) +stack pop println // 3 +stack peek println // 2 +stack pop println // 2 +stack pop println // 1 +``` + +### Queue Implementation + +```io +Queue := Object clone +Queue init := method( + self items := list() + self +) + +Queue enqueue := method(item, + items append(item) + self +) + +Queue dequeue := method( + if(items size > 0, + items removeAt(0), + nil + ) +) + +Queue isEmpty := method(items isEmpty) +Queue size := method(items size) + +// Usage +queue := Queue clone init +queue enqueue("a") enqueue("b") enqueue("c") +queue dequeue println // a +queue dequeue println // b +queue size println // 1 +``` + +### Set Implementation + +```io +Set := Object clone +Set init := method( + self items := Map clone + self +) + +Set add := method(item, + items atPut(item asString, item) + self +) + +Set remove := method(item, + items removeAt(item asString) + self +) + +Set contains := method(item, + items hasKey(item asString) +) + +Set union := method(other, + result := Set clone init + items foreach(k, v, result add(v)) + other items foreach(k, v, result add(v)) + result +) + +Set intersection := method(other, + result := Set clone init + items foreach(k, v, + if(other contains(v), result add(v)) + ) + result +) + +// Usage +set1 := Set clone init add(1) add(2) add(3) +set2 := Set clone init add(2) add(3) add(4) + +set1 contains(2) println // true +union := set1 union(set2) +intersection := set1 intersection(set2) +``` + +## Advanced Collection Patterns + +### Lazy Evaluation + +```io +LazyList := Object clone +LazyList init := method(generator, + self generator := generator + self cache := list() + self +) + +LazyList at := method(index, + while(cache size <= index, + cache append(generator call(cache size)) + ) + cache at(index) +) + +LazyList take := method(n, + result := list() + for(i, 0, n - 1, + result append(self at(i)) + ) + result +) + +// Infinite fibonacci sequence +fibGen := LazyList clone init(block(n, + if(n < 2, n, self at(n - 1) + self at(n - 2)) +)) + +fibGen take(10) println // list(0, 1, 1, 2, 3, 5, 8, 13, 21, 34) +``` + +### Collection Pipeline + +```io +// Method chaining for data processing +data := list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) + +result := data select(x, x % 2 == 0) \ + map(x, x * x) \ + select(x, x > 10) \ + reduce(+) + +result println // 120 (16 + 36 + 64) + +// Custom pipeline +List pipeline := method( + Pipeline clone setList(self) +) + +Pipeline := Object clone +Pipeline setList := method(list, + self list := list + self +) + +Pipeline where := method(predicate, + self list = list select(predicate) + self +) + +Pipeline transform := method(mapper, + self list = list map(mapper) + self +) + +Pipeline aggregate := method(reducer, + list reduce(reducer) +) + +// Usage +numbers := list(1, 2, 3, 4, 5) +total := numbers pipeline \ + where(x, x % 2 == 0) \ + transform(x, x * x) \ + aggregate(+) + +total println // 20 (4 + 16) +``` + +### Nested Collections + +```io +// Matrix as list of lists +matrix := list( + list(1, 2, 3), + list(4, 5, 6), + list(7, 8, 9) +) + +// Access element +matrix at(1) at(2) println // 6 + +// Transpose +transpose := method(matrix, + rows := matrix size + cols := matrix at(0) size + result := list() + + for(c, 0, cols - 1, + col := list() + for(r, 0, rows - 1, + col append(matrix at(r) at(c)) + ) + result append(col) + ) + result +) + +transpose(matrix) println +// list(list(1, 4, 7), list(2, 5, 8), list(3, 6, 9)) +``` + +## Performance Considerations + +```io +// List operations performance +list := List clone + +// O(1) operations +list append(item) // Constant time +list at(index) // Constant time +list size // Constant time + +// O(n) operations +list indexOf(item) // Linear search +list contains(item) // Linear search +list remove(item) // Linear search + shift + +// Map operations are generally O(1) +map := Map clone +map atPut(key, value) // Constant average +map at(key) // Constant average +map removeAt(key) // Constant average + +// Choose the right collection for your needs +``` + +## Collection Serialization + +```io +// JSON serialization +list := list(1, 2, 3, Map with("name", "Alice")) +json := list asJson +json println // [1,2,3,{"name":"Alice"}] + +// Deserialize +restored := json parseJson +restored println + +// Custom serialization +Collection := Object clone +Collection serialize := method( + result := list() + self foreach(item, + if(item hasSlot("serialize"), + result append(item serialize), + result append(item asString) + ) + ) + result join("|") +) +``` + +## Common Pitfalls + +### Shared References + +```io +// PROBLEM: Shared reference +original := list(1, 2, 3) +copy := original // Not a copy! +copy append(4) +original println // list(1, 2, 3, 4) - modified! + +// SOLUTION: Use copy +original := list(1, 2, 3) +copy := original copy +copy append(4) +original println // list(1, 2, 3) - unchanged +``` + +### Iterator Invalidation + +```io +// PROBLEM: Modifying while iterating +list := list(1, 2, 3, 4, 5) +list foreach(item, + if(item % 2 == 0, + list remove(item) // Dangerous! + ) +) + +// SOLUTION: Use select/reject or iterate on copy +list := list(1, 2, 3, 4, 5) +list = list reject(item, item % 2 == 0) +``` + +## Exercises + +1. **Circular Buffer**: Implement a fixed-size circular buffer that overwrites old elements. + +2. **MultiMap**: Create a map that can store multiple values per key. + +3. **Sorted List**: Implement a list that maintains sorted order on insertion. + +4. **Tree Structure**: Build a tree collection with parent-child relationships. + +5. **Graph**: Implement a graph data structure with nodes and edges. + +## Real-World Example: Todo List with Tags + +```io +TodoItem := Object clone +TodoItem init := method(description, + self description := description + self tags := Set clone init + self completed := false + self +) + +TodoList := Object clone +TodoList init := method( + self items := list() + self +) + +TodoList add := method(description, + item := TodoItem clone init(description) + items append(item) + item +) + +TodoList taggedWith := method(tag, + items select(item, item tags contains(tag)) +) + +TodoList pending := method( + items select(item, item completed not) +) + +TodoList complete := method(description, + item := items detect(i, i description == description) + if(item, item completed = true) + self +) + +// Usage +todos := TodoList clone init + +todos add("Write documentation") tags add("work") add("writing") +todos add("Fix bugs") tags add("work") add("urgent") +todos add("Buy groceries") tags add("personal") + +todos taggedWith("urgent") foreach(item, + item description println +) +// Fix bugs + +todos complete("Buy groceries") +todos pending foreach(item, + item description println +) +// Write documentation +// Fix bugs +``` + +## Conclusion + +Io's collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They're all objects, following Io's uniform object model, and support functional programming patterns like map, select, and reduce. + +The real power comes from Io's flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks. + + +--- + + +Source: /Conclusion/ + +--- +title: "Conclusion: The Io Way" +topTitle: Io +subtitle: "What Io teaches about simplicity, uniformity, and the design of programming languages." +nextSectionLink: true +--- + +We've reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we've explored a language that challenges conventional programming wisdom. This final chapter reflects on what we've learned, when to use Io, and what it teaches us about programming itself. + +## What Makes Io Special + +After eighteen chapters, we can distill Io's essence to a few key principles: + +### Radical Simplicity + +Io achieves remarkable expressiveness with minimal concepts: +- Everything is an object +- All computation is message passing +- Objects clone objects (no classes) +- Code is data (messages are objects) + +Compare Io's ~10,000 lines of C to Python's ~500,000 or Java's millions. This isn't just about code size—it's about conceptual simplicity. You can understand all of Io, not just use it. + +### Uniformity + +Where other languages have special cases, Io has objects: + +```io +// Numbers? Objects. +5 squared := method(self * self) + +// Booleans? Objects. +true celebrate := method("Yes!" println) + +// Control structures? Objects receiving messages. +if := method(condition, trueBlock, falseBlock, ...) + +// Operators? Messages. +Number + := method(n, ...) + +// Even nil? An object. +nil comfort := method("It's okay to be nothing" println) +``` + +This uniformity isn't just elegant—it's powerful. When everything follows the same rules, there's less to remember and more you can do. + +### Openness + +Most languages protect you from yourself. Io trusts you completely: + +```io +// Modify fundamental types +String shout := method(self upper .. "!!!") + +// Change how the language works +Object if := method(...) // Redefine conditionals + +// Inspect everything +anyObject slotNames // See all slots +anyMethod code // See implementation +``` + +This openness enables profound metaprogramming but requires responsibility. + +## When to Use Io + +Io excels in specific contexts: + +### Rapid Prototyping + +When you need to explore ideas quickly: + +```io +// From idea to working code in minutes +Api := Object clone +Api route := method(path, handler, ...) +Api get("/users", block(...)) +Api start(8080) +``` + +### Domain-Specific Languages + +When you need expressive, domain-appropriate interfaces: + +```io +recipe "Pasta" serves(4) { + boil water in("large pot") + add pasta after("water boils") + cook for(8) minutes + drain + serve with("marinara sauce") +} +``` + +### Learning and Teaching + +When you want to understand programming concepts deeply: +- How objects really work +- What message passing means +- How languages are implemented +- Why certain design choices matter + +### Embedded Scripting + +When you need a lightweight, embeddable language: +- Game scripting +- Application automation +- Configuration languages +- Plugin systems + +## When Not to Use Io + +Io has limitations to consider: + +### Performance-Critical Systems + +```io +// Io: Elegant but slower +numbers map(x, x * x) select(x, x > 100) + +// C: Verbose but fast +for(int i = 0; i < n; i++) { + squared[i] = numbers[i] * numbers[i]; + if(squared[i] > 100) ... +} +``` + +Message passing has overhead. For number crunching, system programming, or real-time systems, choose C, Rust, or C++. + +### Large Team Projects + +Io lacks: +- Static type checking +- Comprehensive IDE support +- Large ecosystem of libraries +- Extensive documentation +- Big community for support + +For enterprise applications with many developers, Java, C#, or TypeScript offer better tooling and guardrails. + +### Production Web Services + +While you can build web services in Io, you probably shouldn't for production: +- Limited web frameworks +- No battle-tested libraries +- Small community for security issues +- Few deployment options + +Use Python, Ruby, JavaScript, or Go instead. + +## Lessons for Other Languages + +Even if you never use Io professionally, it teaches valuable lessons: + +### Question Everything + +Why do we need classes? Io shows prototypes work fine. +Why special syntax for control flow? Io uses methods. +Why distinguish data and code? Io treats both as messages. + +These aren't necessarily better—but questioning assumptions makes you a better programmer. + +### Simplicity Has Power + +Io shows how much you can achieve with few concepts. This influences how you design: +- APIs with consistent interfaces +- Systems with uniform principles +- Code that does one thing well + +### Metaprogramming Isn't Magic + +In Io, metaprogramming is just programming: + +```io +// Not magic, just objects +method := block(x, x * 2) +method code println // x *(2) +method setCode("x + 2") // Changed! +``` + +This demystifies metaprogramming in any language. + +### Everything Has Trade-offs + +Io's choices have consequences: +- Simplicity vs Performance +- Flexibility vs Safety +- Power vs Complexity +- Expressiveness vs Familiarity + +Understanding these trade-offs helps you choose the right tool for each job. + +## Io's Influence + +Despite its small community, Io has influenced programming: + +### JavaScript's Prototype Pattern + +```javascript +// JavaScript embracing prototypes (pre-ES6) +var animal = { + speak: function() { console.log("..."); } +}; + +var dog = Object.create(animal); +dog.bark = function() { console.log("Woof!"); }; +``` + +### Ruby's Method Missing + +```ruby +class DynamicObject + def method_missing(name, *args) + if name.to_s.start_with?("get_") + # Handle dynamically + end + end +end +``` + +### Minimalist Language Design + +Languages like Lua and Factor share Io's minimalist philosophy, proving that small can be powerful. + +## The Future of Io + +Io may never become mainstream, and that's okay. Its value isn't in market share but in: + +### Educational Impact + +Io remains excellent for teaching: +- Prototype-based OOP +- Message passing +- Language implementation +- Metaprogramming concepts + +### Research Platform + +Io's simplicity makes it ideal for experimenting with: +- New concurrency models +- Novel object systems +- DSL techniques +- Language features + +### Inspiration + +Future language designers study Io to understand: +- How simple a language can be +- Alternative object models +- The power of uniformity +- Trade-offs in language design + +## Personal Reflection + +Learning Io changes how you think about programming. You realize that many "fundamental" concepts are just choices. Classes aren't necessary. Syntax isn't sacred. Types aren't mandatory. These aren't revelations that everything should be like Io—rather, they free you to think more broadly about problems and solutions. + +When you return to your daily programming language—be it Python, JavaScript, Java, or something else—you bring new perspectives: + +- You see the prototype pattern hiding in JavaScript's classes +- You recognize message passing in Ruby's method calls +- You understand metaprogramming isn't mysterious +- You appreciate both the safety of types and the freedom of their absence + +## A Final Example + +Let's end with a small program that captures Io's spirit: + +```io +// The Io Philosophy in Code +Philosophy := Object clone + +Philosophy simplicity := "Everything is an object" +Philosophy uniformity := "Everything is a message" +Philosophy openness := "Everything is modifiable" + +Philosophy embrace := method(concept, + ("Embracing " .. concept .. "...") println + self setSlot(concept, true) + self +) + +Philosophy question := method(assumption, + ("Why must " .. assumption .. "?") println + ("Perhaps there's another way...") println +) + +Philosophy learn := method( + lessons := list( + "Simplicity enables understanding", + "Uniformity reduces cognitive load", + "Openness enables exploration", + "Constraints inspire creativity", + "Every choice has consequences" + ) + + lessons foreach(lesson, + (" • " .. lesson) println + wait(0.5) // Pause to reflect + ) +) + +// The journey +journey := Philosophy clone + +journey embrace("simplicity") \ + embrace("uniformity") \ + embrace("openness") + +journey question("languages be complex") +journey question("we have classes") +journey question("syntax be fixed") + +"Lessons learned:" println +journey learn + +"Thank you for exploring Io." println +"May it inspire your programming journey." println +``` + +## Parting Thoughts + +Io isn't trying to replace your favorite language. It's not competing for market dominance. It's not the solution to all programming problems. + +What Io offers is perspective—a radically different view of what programming can be. It shows that our familiar concepts aren't immutable laws but design choices. It demonstrates that simplicity and power aren't opposites. It proves that small languages can have big ideas. + +Whether you use Io for a weekend experiment, a personal project, or just intellectual exploration, it will change how you think about programming. You'll question more, assume less, and see possibilities where you once saw constraints. + +That's the real gift of Io: not the language itself, but the mindset it instills. A mindset that questions, explores, and imagines. A mindset that sees programming not as applying fixed rules but as creatively solving problems with the tools at hand—or creating new tools when needed. + +## Thank You + +Thank you for joining me on this exploration of Io. I hope you've found it as enlightening to read as I found it to write. The language may be small, but the ideas are vast. + +Now go forth and experiment. Clone some objects. Send some messages. Build something unusual. Question something fundamental. And remember: in Io, as in programming, as in life—everything is possible when you embrace simplicity, seek uniformity, and remain open to new ideas. + +Happy coding, and may your messages always find their slots. + +--- + +*End of Book* + +## Appendices + +For continued learning: + +- **Appendix A**: Io Language Reference +- **Appendix B**: Standard Library Documentation +- **Appendix C**: Building Io from Source +- **Appendix D**: Creating C Addons +- **Appendix E**: Io Resources and Community + +Visit https://iolanguage.org for more information. + +*"Simplicity is the ultimate sophistication."* — Leonardo da Vinci + + +--- + + +Source: /Concurrency/ + +--- +title: Concurrency +topTitle: Io +subtitle: "Coroutines, actors, and futures for cooperative and message-passing concurrency." +nextSectionLink: true +--- + +Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io. + +## Coroutines: Cooperative Multitasking + +Coroutines are the foundation of Io's concurrency model. They're lightweight threads that yield control cooperatively: + +```io +// Create a coroutine +coro := coroutine( + 5 repeat(i, + ("Coroutine: " .. i) println + yield // Give control back + ) +) + +// Run it +5 repeat( + "Main" println + coro resume // Resume the coroutine +) +// Output interleaves Main and Coroutine messages +``` + +Compare with threads in other languages: + +```python +# Python with threads (preemptive) +import threading +def worker(): + for i in range(5): + print(f"Thread: {i}") + # No explicit yield needed + +# Python with async (cooperative) +async def worker(): + for i in range(5): + print(f"Coroutine: {i}") + await asyncio.sleep(0) # Explicit yield +``` + +## Creating and Managing Coroutines + +```io +// Basic coroutine creation +coro := Coroutine clone +coro setRunMessage(message( + "Running in coroutine" println + self // Return value +)) +coro resume println // "Running in coroutine", then returns self + +// Using @ for async execution +future := obj @method(arg) // Runs method in new coroutine +result := future resolve // Wait for result + +// Coroutine with arguments +producer := coroutine( + 10 repeat(i, + yield(i * i) // Yield a value + ) +) + +5 repeat( + producer resume println // 0, 1, 4, 9, 16 +) +``` + +## Actors: Message-Passing Concurrency + +Actors are objects that process messages asynchronously in their own coroutine: + +```io +// Create an actor +Counter := Object clone +Counter count := 0 +Counter increment := method( + count = count + 1 + count +) + +// Make it an actor +counter := Counter clone +counterActor := counter @ // @ makes it an actor + +// Send messages asynchronously +future1 := counterActor increment +future2 := counterActor increment +future3 := counterActor increment + +// Get results +future1 resolve println // 1 +future2 resolve println // 2 +future3 resolve println // 3 +``` + +This is similar to Erlang's actor model: + +```erlang +% Erlang +counter(Count) -> + receive + {increment, From} -> + From ! Count + 1, + counter(Count + 1) + end. +``` + +## Futures and Promises + +Futures represent values that will be available later: + +```io +// Create a future manually +future := Future clone + +// In another coroutine, fulfill it +@( + wait(1) // Simulate work + future setResult(42) +) + +// Wait for result +"Waiting..." println +result := future resolve +("Got result: " .. result) println // Got result: 42 + +// Futures from async calls +slowOperation := method(n, + wait(n) + n * 2 +) + +f := self @slowOperation(2) +"Doing other work..." println +result := f resolve +result println // 4 +``` + +## Channels for Communication + +Implement Go-style channels: + +```io +Channel := Object clone +Channel init := method( + self queue := list() + self waiters := list() + self +) + +Channel send := method(value, + if(waiters size > 0, + waiter := waiters removeFirst + waiter resume(value), + queue append(value) + ) +) + +Channel receive := method( + if(queue size > 0, + queue removeFirst, + waiters append(Coroutine currentCoroutine) + Coroutine currentCoroutine pause + ) +) + +// Usage +ch := Channel clone init + +// Producer +@( + 5 repeat(i, + ch send(i * i) + wait(0.1) + ) +) + +// Consumer +@( + 5 repeat( + value := ch receive + ("Received: " .. value) println + ) +) + +wait(1) // Let them run +``` + +## Synchronization Primitives + +### Mutex (Mutual Exclusion) + +```io +Mutex := Object clone +Mutex locked := false +Mutex waitQueue := list() + +Mutex lock := method( + while(locked, + waitQueue append(Coroutine currentCoroutine) + Coroutine currentCoroutine pause + ) + locked = true +) + +Mutex unlock := method( + locked = false + if(waitQueue size > 0, + waiter := waitQueue removeFirst + waiter resume + ) +) + +Mutex synchronize := method(block, + lock + e := try(result := block call) + unlock + if(e, e raise, result) +) + +// Usage +sharedCounter := 0 +mutex := Mutex clone + +10 repeat( + @( + mutex synchronize( + temp := sharedCounter + yield // Simulate race condition + sharedCounter = temp + 1 + ) + ) +) + +wait(0.5) +sharedCounter println // 10 (without mutex would be unpredictable) +``` + +### Semaphore + +```io +Semaphore := Object clone +Semaphore init := method(permits, + self permits := permits + self waitQueue := list() + self +) + +Semaphore acquire := method( + while(permits <= 0, + waitQueue append(Coroutine currentCoroutine) + Coroutine currentCoroutine pause + ) + permits = permits - 1 +) + +Semaphore release := method( + permits = permits + 1 + if(waitQueue size > 0, + waiter := waitQueue removeFirst + waiter resume + ) +) + +// Usage: Limit concurrent connections +connectionPool := Semaphore clone init(3) + +10 repeat(i, + @( + connectionPool acquire + ("Connection " .. i .. " started") println + wait(Random value) + ("Connection " .. i .. " finished") println + connectionPool release + ) +) + +wait(3) +``` + +## Concurrent Collections + +```io +// Thread-safe list +ConcurrentList := List clone +ConcurrentList mutex := Mutex clone + +ConcurrentList append := method(item, + mutex synchronize(resend(item)) +) + +ConcurrentList at := method(index, + mutex synchronize(resend(index)) +) + +ConcurrentList size := method( + mutex synchronize(resend) +) + +// Usage +list := ConcurrentList clone + +10 repeat(i, + @(list append(i)) +) + +wait(0.1) +list size println // 10 +``` + +## Worker Pool Pattern + +```io +WorkerPool := Object clone +WorkerPool init := method(workerCount, + self workers := list() + self taskQueue := Channel clone init + self results := Channel clone init + + workerCount repeat( + worker := @( + loop( + task := taskQueue receive + if(task isNil, break) // Poison pill + + result := task call + results send(result) + ) + ) + workers append(worker) + ) + + self +) + +WorkerPool submit := method(task, + taskQueue send(task) +) + +WorkerPool shutdown := method( + workers size repeat(taskQueue send(nil)) +) + +WorkerPool getResult := method( + results receive +) + +// Usage +pool := WorkerPool clone init(4) + +// Submit tasks +10 repeat(i, + pool submit(block( + wait(Random value * 0.1) + i * i + )) +) + +// Collect results +results := list() +10 repeat( + results append(pool getResult) +) + +pool shutdown +results println +``` + +## Async/Await Pattern + +```io +// Implement async/await style +Object async := method( + future := Future clone + + @( + e := try(result := call activated doMessage(call message, call sender)) + if(e, + future setException(e), + future setResult(result) + ) + ) + + future +) + +Object await := method(future, + future resolve +) + +// Usage +fetchData := async method(url, + wait(1) // Simulate network delay + "Data from " .. url +) + +processData := async method( + data1 := await(fetchData("api/users")) + data2 := await(fetchData("api/posts")) + data1 .. " + " .. data2 +) + +result := await(processData) +result println // Data from api/users + Data from api/posts +``` + +## Parallel Map + +```io +List parallelMap := method(block, + futures := self map(item, + self @(block call(item)) + ) + + futures map(resolve) +) + +// Usage +numbers := list(1, 2, 3, 4, 5) + +// Sequential map +time( + sequential := numbers map(n, + wait(0.1) + n * n + ) +) + +// Parallel map +time( + parallel := numbers parallelMap(n, + wait(0.1) + n * n + ) +) + +sequential println // list(1, 4, 9, 16, 25) +parallel println // list(1, 4, 9, 16, 25) but faster +``` + +## Deadlock Detection + +```io +DeadlockDetector := Object clone +DeadlockDetector init := method( + self resources := Map clone + self waitGraph := Map clone + self +) + +DeadlockDetector requestResource := method(coroutine, resource, + // Add to wait graph + if(resources hasKey(resource), + owner := resources at(resource) + if(owner != coroutine, + waitGraph atPut(coroutine, resource) + + // Check for cycle + if(hasCycle(coroutine), + Exception raise("Deadlock detected!") + ) + ) + ) +) + +DeadlockDetector hasCycle := method(start, + // Simplified cycle detection + visited := list() + current := start + + while(waitGraph hasKey(current), + if(visited contains(current), return true) + visited append(current) + + resource := waitGraph at(current) + if(resources hasKey(resource), + current = resources at(resource) + , + break + ) + ) + + false +) +``` + +## Event Loop + +```io +EventLoop := Object clone +EventLoop init := method( + self events := list() + self running := true + self +) + +EventLoop schedule := method(delay, block, + events append(list(Date now + delay, block)) + events sortInPlaceBy(block(e, e at(0))) +) + +EventLoop run := method( + while(running and events size > 0, + now := Date now + + while(events size > 0 and events first at(0) <= now, + event := events removeFirst + event at(1) @call + ) + + if(events size > 0, + wait((events first at(0) - now) max(0)) + ) + ) +) + +EventLoop stop := method(running = false) + +// Usage +loop := EventLoop clone init + +loop schedule(0.1, block("First" println)) +loop schedule(0.2, block("Second" println)) +loop schedule(0.15, block("Between" println)) + +loop run +``` + +## Common Patterns + +### Producer-Consumer + +```io +Buffer := Object clone +Buffer init := method(capacity, + self items := list() + self capacity := capacity + self notFull := Semaphore clone init(capacity) + self notEmpty := Semaphore clone init(0) + self mutex := Mutex clone + self +) + +Buffer put := method(item, + notFull acquire + mutex synchronize(items append(item)) + notEmpty release +) + +Buffer get := method( + notEmpty acquire + item := mutex synchronize(items removeFirst) + notFull release + item +) + +// Usage +buffer := Buffer clone init(5) + +// Producer +@( + 10 repeat(i, + ("Producing " .. i) println + buffer put(i) + wait(Random value * 0.1) + ) +) + +// Consumer +@( + 10 repeat( + item := buffer get + ("Consumed " .. item) println + wait(Random value * 0.2) + ) +) + +wait(3) +``` + +### Fork-Join + +```io +Object forkJoin := method(tasks, + futures := tasks map(task, + @(task call) + ) + + futures map(resolve) +) + +// Parallel quicksort +quicksort := method(list, + if(list size <= 1, return list) + + pivot := list at(list size / 2) + + results := forkJoin(list( + block(list select(x, x < pivot) quicksort), + block(list select(x, x == pivot)), + block(list select(x, x > pivot) quicksort) + )) + + results at(0) appendSeq(results at(1)) appendSeq(results at(2)) +) + +sorted := quicksort(list(3, 1, 4, 1, 5, 9, 2, 6)) +sorted println // list(1, 1, 2, 3, 4, 5, 6, 9) +``` + +## Performance Considerations + +```io +// Coroutines are lightweight +time( + coroutines := list() + 1000 repeat(i, + coroutines append(@(i * i)) + ) + coroutines map(resolve) +) + +// But context switching has overhead +benchmarkConcurrency := method(taskCount, taskWork, + // Sequential + seqTime := time( + taskCount repeat(i, taskWork call(i)) + ) + + // Concurrent + concTime := time( + futures := list() + taskCount repeat(i, + futures append(@(taskWork call(i))) + ) + futures map(resolve) + ) + + ("Sequential: " .. seqTime) println + ("Concurrent: " .. concTime) println + ("Speedup: " .. (seqTime / concTime)) println +) + +// Light work - concurrency overhead dominates +benchmarkConcurrency(100, block(i, i * i)) + +// Heavy work - concurrency helps +benchmarkConcurrency(10, block(i, + sum := 0 + 10000 repeat(j, sum = sum + j) + sum +)) +``` + +## Exercises + +1. **Rate Limiter**: Implement a rate limiter that allows N operations per second. + +2. **Parallel Reduce**: Create a parallel version of reduce that divides work among workers. + +3. **Actor Supervisor**: Build a supervisor that restarts failed actors. + +4. **CSP Channels**: Implement Communicating Sequential Processes with select statement. + +5. **STM**: Implement Software Transactional Memory for conflict-free concurrent updates. + +## Real-World Example: Web Scraper + +```io +WebScraper := Object clone +WebScraper init := method(maxConcurrent, + self semaphore := Semaphore clone init(maxConcurrent) + self visited := ConcurrentSet clone init + self results := ConcurrentList clone + self +) + +WebScraper scrape := method(urls, + futures := list() + + urls foreach(url, + if(visited contains(url) not, + visited add(url) + + future := @( + semaphore acquire + e := try( + ("Scraping " .. url) println + // Simulate HTTP request + wait(Random value) + + content := "Content from " .. url + results append(Map with("url", url, "content", content)) + + // Find more URLs (simplified) + if(Random value < 0.3, + newUrl := url .. "/" .. Random value round + self scrape(list(newUrl)) + ) + ) + + semaphore release + if(e, ("Error scraping " .. url .. ": " .. e message) println) + ) + + futures append(future) + ) + ) + + futures map(resolve) + self +) + +// Usage +scraper := WebScraper clone init(3) +scraper scrape(list( + "https://example.com", + "https://example.org", + "https://example.net" +)) + +wait(2) +("Scraped " .. scraper results size .. " pages") println +``` + +## Conclusion + +Io's concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages. + +The beauty of Io's approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with `@`, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible. + + +--- + + +Source: /Control-Flow/ + +--- +title: Control Flow +topTitle: Io +subtitle: "if, while, for, and friends are just methods—and you can write your own." +nextSectionLink: true +--- + +In most programming languages, control flow structures like `if`, `while`, and `for` are built-in syntax with special rules. In Io, they're just methods that receive messages. This chapter explores how Io's message-passing philosophy extends to control flow, and how you can create your own control structures. + +## Everything Is a Message + +Let's start with a simple comparison. In C or Java: + +```c +if (x > 5) { + printf("Big\n"); +} else { + printf("Small\n"); +} +``` + +This is special syntax that the compiler understands. But in Io: + +```io +if(x > 5, + "Big" println, + "Small" println +) +``` + +The `if` is just a method call! You can even see its implementation: + +```io +if println +// method(...) + +// You could redefine it (don't actually do this!) +Object if := method(condition, trueBlock, falseBlock, + "Making a decision!" println + resend // Call original if +) +``` + +## The if Method + +The `if` method takes two or three arguments: + +```io +// Two arguments: if-then +if(temperature > 30, + "It's hot!" println +) + +// Three arguments: if-then-else +if(temperature > 30, + "It's hot!" println, + "It's nice!" println +) + +// if returns the value of the executed block +result := if(5 > 3, "yes", "no") +result println // "yes" + +// Nested if +category := if(score > 90, "A", + if(score > 80, "B", + if(score > 70, "C", "F") + ) +) +``` + +## Understanding Blocks + +The key to Io's control flow is that code blocks are objects that aren't evaluated immediately: + +```io +// This prints immediately +"Hello" println + +// This creates a block object but doesn't execute it +block := method("Hello" println) + +// Execute it later +block call // Now it prints "Hello" + +// Blocks in if +if(true, + "This is a block" println // Not executed until if decides to +) +``` + +This lazy evaluation is crucial. If both branches of an `if` were evaluated immediately, both would execute! + +```io +// In a hypothetical eager language: +eagerIf := method(condition, trueValue, falseValue, + if(condition, trueValue, falseValue) +) + +x := 5 +eagerIf(x > 3, + "Greater" println, // This executes immediately + "Lesser" println // This also executes immediately! +) +// Would print both! + +// But Io's if receives unevaluated blocks +if(x > 3, + "Greater" println, // Only this executes + "Lesser" println // This never executes +) +``` + +## The while Loop + +The `while` method repeatedly evaluates its condition and body: + +```io +i := 0 +while(i < 5, + i println + i = i + 1 +) +// Prints 0, 1, 2, 3, 4 + +// while returns nil by default +result := while(false, "Never runs") +result println // nil + +// Infinite loops +while(true, + input := File standardInput readLine + if(input == "quit", break) + ("You said: " .. input) println +) +``` + +## The for Loop + +The `for` method provides a counting loop: + +```io +// Basic for loop +for(i, 1, 5, + i println +) +// Prints 1, 2, 3, 4, 5 + +// With step +for(i, 0, 10, 2, + i println +) +// Prints 0, 2, 4, 6, 8, 10 + +// Backward +for(i, 5, 1, + i println +) +// Prints 5, 4, 3, 2, 1 + +// for can return values +sum := 0 +for(i, 1, 100, + sum = sum + i +) +sum println // 5050 +``` + +## The loop Method + +Io provides a `loop` method for infinite loops: + +```io +count := 0 +loop( + count = count + 1 + if(count > 10, break) + count println +) + +// Equivalent to while(true, ...) +``` + +## break and continue + +These work like in other languages, but they're methods too: + +```io +// break exits the loop +for(i, 1, 10, + if(i == 5, break) + i println +) +// Prints 1, 2, 3, 4 + +// continue skips to next iteration +for(i, 1, 10, + if(i % 2 == 0, continue) + i println +) +// Prints 1, 3, 5, 7, 9 + +// break can return a value +result := for(i, 1, 100, + if(i * i > 50, break(i)) +) +result println // 8 (first i where i*i > 50) +``` + +## The repeat Method + +A simpler counting mechanism: + +```io +5 repeat("Hello" println) +// Prints "Hello" 5 times + +// repeat with index +5 repeat(i, + ("Count: " .. i) println +) +// Count: 0 +// Count: 1 +// Count: 2 +// Count: 3 +// Count: 4 +``` + +## Creating Custom Control Structures + +Since control structures are just methods, you can create your own: + +```io +// unless: opposite of if +Object unless := method(condition, falseBlock, + if(condition not, falseBlock call) +) + +unless(5 > 10, + "5 is not greater than 10" println +) + +// until: opposite of while +Object until := method(condition, body, + while(condition not, body) +) + +x := 0 +until(x > 5, + x println + x = x + 1 +) + +// times: repeat n times with cleaner syntax +Number times := method(body, + for(i, 1, self, body) +) + +3 times("Hello" println) +``` + +## The elseif Pattern + +Io uses `elseif` for chained conditionals: + +```io +score := 85 + +if(score >= 90) then( + "A" println +) elseif(score >= 80) then( + "B" println +) elseif(score >= 70) then( + "C" println +) else( + "F" println +) +// Prints "B" + +// This is actually a chain of methods +// if returns a special object when false +// that object has elseif and else methods +``` + +## Switch-like Behavior + +Io doesn't have a switch statement, but you can build one: + +```io +Object switch := method(value, + self switchValue := value + self +) + +Object case := method(testValue, action, + if(switchValue == testValue, + action call + self switchMatched := true + ) + self +) + +Object default := method(action, + if(hasSlot("switchMatched") not, + action call + ) + self +) + +// Usage +day := "Tuesday" + +switch(day) case("Monday", + "Start of the week" println +) case("Tuesday", + "Second day" println +) case("Friday", + "TGIF!" println +) default( + "Regular day" println +) +// Prints "Second day" +``` + +## Pattern Matching + +Build more sophisticated matching: + +```io +Object match := method( + self matchValue := call evalArgAt(0) + self matchContext := call sender + self +) + +Object when := method(pattern, action, + if(hasSlot("matchFound") not, + matched := false + + // Check different pattern types + if(pattern type == "Block", + matched = pattern call(matchValue), + matched = (pattern == matchValue) + ) + + if(matched, + self matchResult := action call(matchValue) + self matchFound := true + ) + ) + self +) + +Object otherwise := method(action, + if(hasSlot("matchFound") not, + self matchResult := action call(matchValue) + ) + matchResult +) + +// Usage +result := match(x) when( + block(v, v < 0), + method(v, "negative") +) when( + 0, + method(v, "zero") +) when( + block(v, v > 0), + method(v, "positive") +) otherwise( + method(v, "unknown") +) +``` + +## Iterating Over Collections + +Collections have their own iteration methods: + +```io +// List iteration +list(1, 2, 3) foreach(item, + item println +) + +// With index +list("a", "b", "c") foreach(i, item, + (i .. ": " .. item) println +) +// 0: a +// 1: b +// 2: c + +// Map iteration +map := Map clone +map atPut("name", "Alice") +map atPut("age", 30) + +map foreach(key, value, + (key .. " = " .. value) println +) +// name = Alice +// age = 30 +``` + +## Functional Control Flow + +Io supports functional programming patterns: + +```io +// map: transform each element +squares := list(1, 2, 3, 4) map(x, x * x) +squares println // list(1, 4, 9, 16) + +// select: filter elements +evens := list(1, 2, 3, 4, 5, 6) select(x, x % 2 == 0) +evens println // list(2, 4, 6) + +// detect: find first matching element +first_big := list(1, 3, 5, 7, 9) detect(x, x > 5) +first_big println // 7 + +// reduce: aggregate elements +sum := list(1, 2, 3, 4, 5) reduce(+) +sum println // 15 + +product := list(1, 2, 3, 4) reduce(a, b, a * b) +product println // 24 +``` + +## Lazy Evaluation Control + +Create control structures with lazy evaluation: + +```io +Object lazyIf := method( + condition := call argAt(0) + trueBlock := call argAt(1) + falseBlock := call argAt(2) + + if(condition doInContext(call sender), + trueBlock doInContext(call sender), + if(falseBlock, + falseBlock doInContext(call sender) + ) + ) +) + +// Both condition and blocks are lazy +x := 5 +lazyIf(x > 3 and computeExpensive(), + "True branch" println, + "False branch" println +) +``` + +## Exception Handling as Control Flow + +Io's `try` is also a control flow method: + +```io +try( + // Code that might fail + riskyOperation() +) catch(Exception, + "An error occurred" println +) + +// try-catch-finally pattern +result := try( + file := File with("data.txt") openForReading + file contents +) catch(Exception, e, + ("Error: " .. e message) println + nil +) finally( + if(file, file close) +) +``` + +## Performance Considerations + +Since control structures are methods, they have overhead: + +```io +// Method-based loop (slower) +i := 0 +while(i < 1000000, + i = i + 1 +) + +// But you can't really avoid it in Io +// The language is optimized for expressiveness over speed +``` + +## Advanced: Coroutine-based Control + +Io's coroutines enable advanced control flow: + +```io +// Generator pattern +Generator := Object clone +Generator init := method( + self coro := Coroutine currentCoroutine + self +) + +Generator yield := method(value, + coro pause(value) +) + +Generator fibonacci := method( + a := 0 + b := 1 + loop( + yield(a) + temp := a + b + a = b + b = temp + ) +) + +// Usage +gen := Generator clone +fib := gen @fibonacci // @ runs in new coroutine + +10 repeat( + fib resume println +) +// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 +``` + +## Common Patterns + +### Early Return Pattern + +```io +Object findFirst := method(list, condition, + list foreach(item, + if(condition call(item), + return item + ) + ) + nil +) + +result := findFirst(list(1, 2, 3, 4, 5), + block(x, x > 3) +) +result println // 4 +``` + +### Guard Clause Pattern + +```io +processData := method(data, + if(data isNil, return "No data") + if(data size == 0, return "Empty data") + if(data size > 1000, return "Too much data") + + // Process data + "Processed" return +) +``` + +### Loop with State + +```io +Object loopWithState := method(initial, condition, update, body, + state := initial + while(condition call(state), + body call(state) + state = update call(state) + ) + state +) + +// Sum squares until sum > 100 +result := loopWithState( + list(0, 1), // [sum, n] + block(state, state at(0) <= 100), + block(state, list(state at(0) + state at(1) squared, state at(1) + 1)), + block(state, ("n=" .. state at(1) .. " sum=" .. state at(0)) println) +) +``` + +## Debugging Control Flow + +```io +Object trace := method(label, + (label .. " - evaluating") println + self +) + +Object debugIf := method(condition, trueBlock, falseBlock, + "Evaluating condition..." println + result := condition + ("Condition is: " .. result) println + + if(result, + "Taking true branch" println + trueBlock, + "Taking false branch" println + falseBlock + ) +) + +x := 5 +debugIf(x trace("x") > trace("3") 3, + "Greater" println, + "Lesser" println +) +``` + +## Exercises + +1. **do-while Loop**: Implement a `doWhile` method that executes the body at least once. + +2. **for-each with Break**: Create a `forEachBreakable` that allows breaking with a return value. + +3. **Retry Logic**: Build a `retry` control structure that retries an operation n times on failure. + +4. **Parallel If**: Create a `parallelIf` that evaluates both branches concurrently and returns the first to complete. + +5. **State Machine**: Implement a state machine DSL using custom control structures. + +## Real-World Example: Retry with Backoff + +```io +Object retryWithBackoff := method(maxAttempts, baseDelay, operation, + attempt := 1 + lastError := nil + + while(attempt <= maxAttempts, + try( + return operation call(attempt) + ) catch(Exception, e, + lastError = e + if(attempt < maxAttempts, + delay := baseDelay * (2 pow(attempt - 1)) + ("Attempt " .. attempt .. " failed, waiting " .. delay .. "ms") println + System sleep(delay / 1000) + ) + ) + attempt = attempt + 1 + ) + + Exception raise("Failed after " .. maxAttempts .. " attempts: " .. lastError message) +) + +// Usage +result := retryWithBackoff(3, 100, + block(attempt, + ("Trying attempt " .. attempt) println + if(Random value < 0.7, + Exception raise("Random failure"), + "Success!" + ) + ) +) +``` + +## Conclusion + +Io's approach to control flow—implementing everything as methods rather than special syntax—is both radical and elegant. It demonstrates the power of Io's uniform message-passing model: when everything is a message, even fundamental programming constructs become malleable and extensible. + +This flexibility allows you to: +- Create domain-specific control structures +- Implement new programming paradigms +- Debug and trace control flow +- Understand exactly how your program executes + +The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs. + + +--- + + +Source: /Domain-Specific-Languages/ + +--- +title: Domain-Specific Languages +topTitle: Io +subtitle: "Using Io's minimal syntax and metaprogramming to design expressive DSLs." +nextSectionLink: true +--- + +Io's minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains. + +## Why Io Excels at DSLs + +Several features make Io particularly suitable for DSLs: + +1. **Minimal syntax** - Less language machinery to work around +2. **Optional parentheses** - Clean, readable DSL code +3. **Message chains** - Natural expression of domain concepts +4. **Runtime flexibility** - Modify behavior on the fly +5. **Homoiconicity** - Code as manipulable data + +Compare a hypothetical DSL in Io vs Ruby: + +```io +// Io DSL - clean, minimal +recipe "Chocolate Cake" makes(8) servings { + ingredient "flour" amount(2) cups + ingredient "sugar" amount(1.5) cups + + step "Mix dry ingredients" + step "Add wet ingredients" + bake at(350) degrees for(30) minutes +} +``` + +```ruby +# Ruby DSL - more syntax artifacts +recipe "Chocolate Cake" do + makes 8.servings + + ingredient "flour", amount: 2.cups + ingredient "sugar", amount: 1.5.cups + + step "Mix dry ingredients" + step "Add wet ingredients" + bake at: 350.degrees, for: 30.minutes +end +``` + +## Building Your First DSL + +Let's create a simple configuration DSL: + +```io +// Define the DSL +Config := Object clone +Config settings := Map clone + +Config set := method(key, value, + settings atPut(key asString, value) + self // For chaining +) + +Config get := method(key, + settings at(key asString) +) + +Config section := method(name, + sec := Config clone + settings atPut(name asString, sec) + sec +) + +// Use the DSL +config := Config clone +config set("host", "localhost") \ + set("port", 8080) \ + section("database") \ + set("driver", "postgresql") \ + set("name", "myapp") + +config get("host") println // localhost +config get("database") get("driver") println // postgresql +``` + +## HTML Builder DSL + +A more complex example - generating HTML: + +```io +HTML := Object clone + +// Handle any tag name via forward +HTML forward := method( + tagName := call message name + attributes := Map clone + children := list() + + // Process arguments + call message arguments foreach(arg, + argValue := call sender doMessage(arg) + + if(argValue type == "Map", + // It's attributes + attributes = argValue + , + // It's content or children + if(argValue type == "Sequence", + children append(argValue), + if(argValue type == "List", + children appendSeq(argValue), + children append(argValue asString) + ) + ) + ) + ) + + // Build HTML + result := "<" .. tagName + attributes foreach(key, value, + result = result .. " " .. key .. "=\"" .. value .. "\"" + ) + + if(children size == 0, + result = result .. " />", + result = result .. ">" + children foreach(child, result = result .. child) + result = result .. "" + ) + + result +) + +// Helper for attributes +Object attrs := method( + args := call message arguments + map := Map clone + + args foreach(arg, + pair := arg name split(":") + if(pair size == 2, + map atPut(pair at(0), call sender doMessage(arg arguments at(0))) + ) + ) + map +) + +// Usage +html := HTML clone + +page := html div(attrs(class: "container", id: "main"), + html h1("Welcome to My Site"), + html p(attrs(class: "intro"), + "This is a paragraph with ", + html strong("bold text"), + " in it." + ), + html ul( + html li("First item"), + html li("Second item"), + html li("Third item") + ) +) + +page println +//

Welcome to My Site

... +``` + +## SQL Query Builder + +```io +Query := Object clone +Query init := method( + self selections := list("*") + self tables := list() + self conditions := list() + self joins := list() + self +) + +Query select := method( + self selections = call message arguments map(arg, + call sender doMessage(arg) asString + ) + self +) + +Query from := method(table, + tables append(table) + self +) + +Query where := method( + condition := call argAt(0) + conditions append(condition code asString) + self +) + +Query join := method(table, on, + joins append("JOIN " .. table .. " ON " .. on code asString) + self +) + +Query toSQL := method( + sql := "SELECT " .. selections join(", ") + sql = sql .. " FROM " .. tables join(", ") + + if(joins size > 0, + sql = sql .. " " .. joins join(" ") + ) + + if(conditions size > 0, + sql = sql .. " WHERE " .. conditions join(" AND ") + ) + + sql +) + +// Usage +query := Query clone init + +sql := query select("name", "age", "email") \ + from("users") \ + join("profiles", users.id == profiles.user_id) \ + where(age > 18) \ + where(status == "active") \ + toSQL + +sql println +// SELECT name, age, email FROM users JOIN profiles ON users.id == profiles.user_id WHERE age > 18 AND status == "active" +``` + +## Unit Testing DSL + +```io +TestSuite := Object clone +TestSuite tests := list() +TestSuite currentTest := nil + +TestSuite describe := method(description, + suite := TestSuite clone + suite description := description + suite tests = list() + + # Execute the test definition block + call evalArgAt(1) + + suite +) + +TestSuite it := method(testName, + test := Object clone + test name := testName + test block := call argAt(1) + tests append(test) +) + +TestSuite before := method( + self beforeBlock := call argAt(0) +) + +TestSuite after := method( + self afterBlock := call argAt(0) +) + +TestSuite run := method( + ("\n" .. description) println + ("=" repeated(description size)) println + + passed := 0 + failed := 0 + + tests foreach(test, + if(hasSlot("beforeBlock"), beforeBlock doInContext(self)) + + e := try( + test block doInContext(self) + ("✓ " .. test name) println + passed = passed + 1 + ) catch(Exception, e, + ("✗ " .. test name) println + (" " .. e message) println + failed = failed + 1 + ) + + if(hasSlot("afterBlock"), afterBlock doInContext(self)) + ) + + ("\nPassed: " .. passed .. ", Failed: " .. failed) println +) + +// Assertion helpers +Object expect := method(actual, + Expectation clone setActual(actual) +) + +Expectation := Object clone +Expectation setActual := method(value, + self actual := value + self +) + +Expectation toBe := method(expected, + if(actual != expected, + Exception raise("Expected " .. expected .. " but got " .. actual) + ) +) + +Expectation toEqual := method(expected, + if(actual != expected, + Exception raise("Expected " .. expected .. " but got " .. actual) + ) +) + +Expectation toContain := method(item, + if(actual contains(item) not, + Exception raise("Expected " .. actual .. " to contain " .. item) + ) +) + +// Usage +MathTests := describe("Math operations", + before( + self calculator := Object clone + calculator add := method(a, b, a + b) + calculator multiply := method(a, b, a * b) + ) + + it("should add numbers correctly", + expect(calculator add(2, 3)) toBe(5) + expect(calculator add(-1, 1)) toBe(0) + ) + + it("should multiply numbers correctly", + expect(calculator multiply(3, 4)) toBe(12) + expect(calculator multiply(0, 5)) toBe(0) + ) + + it("should handle edge cases", + expect(calculator add(0, 0)) toBe(0) + ) +) + +MathTests run +``` + +## State Machine DSL + +```io +StateMachine := Object clone +StateMachine states := Map clone +StateMachine currentState := nil +StateMachine initialState := nil + +StateMachine state := method(name, + s := State clone + s name := name + s machine := self + states atPut(name, s) + + if(initialState isNil, initialState = s) + + s +) + +State := Object clone +State transitions := Map clone + +State on := method(event, targetState, + transitions atPut(event, targetState) + self +) + +State enter := method( + self enterBlock := call argAt(0) + self +) + +State exit := method( + self exitBlock := call argAt(0) + self +) + +StateMachine start := method( + currentState = initialState + if(currentState hasSlot("enterBlock"), + currentState enterBlock call + ) +) + +StateMachine trigger := method(event, + if(currentState transitions hasKey(event), + nextStateName := currentState transitions at(event) + nextState := states at(nextStateName) + + if(currentState hasSlot("exitBlock"), + currentState exitBlock call + ) + + ("Transitioning from " .. currentState name .. " to " .. nextStateName) println + currentState = nextState + + if(currentState hasSlot("enterBlock"), + currentState enterBlock call + ) + , + ("No transition for event '" .. event .. "' from state '" .. currentState name .. "'") println + ) +) + +// Usage +door := StateMachine clone + +door state("closed") \ + on("open", "opened") \ + on("lock", "locked") \ + enter(block("Door is now closed" println)) + +door state("opened") \ + on("close", "closed") \ + enter(block("Door is now open" println)) + +door state("locked") \ + on("unlock", "closed") \ + enter(block("Door is now locked" println)) + +door start +door trigger("open") // Transitioning from closed to opened +door trigger("close") // Transitioning from opened to closed +door trigger("lock") // Transitioning from closed to locked +door trigger("open") // No transition for event 'open' from state 'locked' +``` + +## Routing DSL (Web Framework Style) + +```io +Router := Object clone +Router routes := list() + +Router get := method(path, + addRoute("GET", path, call argAt(1)) +) + +Router post := method(path, + addRoute("POST", path, call argAt(1)) +) + +Router put := method(path, + addRoute("PUT", path, call argAt(1)) +) + +Router delete := method(path, + addRoute("DELETE", path, call argAt(1)) +) + +Router addRoute := method(method, path, handler, + routes append(Map with( + "method", method, + "path", path, + "pattern", pathToRegex(path), + "handler", handler + )) + self +) + +Router pathToRegex := method(path, + // Convert :param to regex groups + pattern := path + pattern = pattern replaceAllRegex(":([^/]+)", "([^/]+)") + "^" .. pattern .. "$" +) + +Router handle := method(method, path, + routes foreach(route, + if(route at("method") == method, + match := path matchesRegex(route at("pattern")) + if(match, + params := extractParams(route at("path"), path, match) + return route at("handler") call(params) + ) + ) + ) + + Map with("status", 404, "body", "Not Found") +) + +Router extractParams := method(pattern, path, match, + params := Map clone + + // Extract named parameters + names := pattern allMatchesOfRegex(":([^/]+)") map(m, m at(1)) + names foreach(i, name, + params atPut(name, match at(i + 1)) + ) + + params +) + +// Usage +app := Router clone + +app get("/", block(params, + Map with("status", 200, "body", "Welcome to the home page") +)) + +app get("/users/:id", block(params, + Map with("status", 200, "body", "User " .. params at("id")) +)) + +app post("/users", block(params, + Map with("status", 201, "body", "User created") +)) + +// Simulate requests +app handle("GET", "/") at("body") println // Welcome to the home page +app handle("GET", "/users/123") at("body") println // User 123 +app handle("POST", "/users") at("body") println // User created +app handle("GET", "/unknown") at("body") println // Not Found +``` + +## Data Validation DSL + +```io +Validator := Object clone + +Validator field := method(name, + f := Field clone + f name := name + f rules := list() + self currentField := f + f +) + +Field := Object clone + +Field required := method( + rules append(block(value, + if(value isNil or value == "", + Exception raise(name .. " is required"), + true + ) + )) + self +) + +Field minLength := method(min, + rules append(block(value, + if(value size < min, + Exception raise(name .. " must be at least " .. min .. " characters"), + true + ) + )) + self +) + +Field maxLength := method(max, + rules append(block(value, + if(value size > max, + Exception raise(name .. " must be at most " .. max .. " characters"), + true + ) + )) + self +) + +Field matches := method(regex, + rules append(block(value, + if(value matchesRegex(regex) not, + Exception raise(name .. " has invalid format"), + true + ) + )) + self +) + +Field validate := method(value, + rules foreach(rule, + rule call(value) + ) + true +) + +// Usage +userValidator := Validator clone + +username := userValidator field("username") \ + required \ + minLength(3) \ + maxLength(20) \ + matches("^[a-zA-Z0-9_]+$") + +email := userValidator field("email") \ + required \ + matches("^[^@]+@[^@]+\\.[^@]+$") + +// Test validation +try( + username validate("ab") +) catch(Exception, e, + e message println // username must be at least 3 characters +) + +try( + email validate("not-an-email") +) catch(Exception, e, + e message println // email has invalid format +) + +username validate("valid_user123") println // true +email validate("user@example.com") println // true +``` + +## DSL Best Practices + +### 1. Natural Language Flow + +```io +// Good - reads naturally +recipe needs(2) cups of("flour") +order shipping priority within(3) days + +// Bad - programmer-centric +recipe setAmount(2) setUnit("cups") setIngredient("flour") +order setShipping("priority") setDeliveryDays(3) +``` + +### 2. Method Chaining + +```io +// Enable fluent interfaces +Object withChaining := method( + call message arguments foreach(arg, + slotName := arg name + self setSlot(slotName, call evalArgAt(0)) + ) + self // Always return self +) + +Person := Object clone +Person configure := method( + withChaining( + name(n, self name := n), + age(a, self age := a), + email(e, self email := e) + ) +) + +person := Person clone configure \ + name("Alice") \ + age(30) \ + email("alice@example.com") +``` + +### 3. Context Management + +```io +DSLContext := Object clone +DSLContext stack := list() + +DSLContext push := method(obj, + stack append(obj) +) + +DSLContext pop := method( + stack pop +) + +DSLContext current := method( + stack last +) + +DSLContext with := method(obj, block, + push(obj) + e := try(result := block call) + pop + if(e, e raise, result) +) + +// Usage in DSL +Form := Object clone +Form fields := list() + +Form field := method(name, + f := Field clone + f name := name + DSLContext with(f, + call evalArgAt(1) + ) + fields append(f) +) + +Field label := method(text, + DSLContext current label := text +) +``` + +## Exercises + +1. **CSS DSL**: Create a DSL for generating CSS with nested rules and variables. + +2. **Graph Description Language**: Build a DSL for describing graphs and their relationships. + +3. **Build System DSL**: Implement a make/rake-like build system DSL. + +4. **BDD Testing DSL**: Create a Behavior-Driven Development testing framework. + +5. **Configuration Management**: Build a DSL for system configuration management. + +## Real-World Example: Migration DSL + +```io +Migration := Object clone +Migration changes := list() + +Migration createTable := method(name, + table := TableDefinition clone + table name := name + table columns := list() + + call evalArgAt(1) + + changes append(Map with( + "type", "createTable", + "table", table + )) + self +) + +Migration dropTable := method(name, + changes append(Map with( + "type", "dropTable", + "name", name + )) + self +) + +TableDefinition := Object clone + +TableDefinition column := method(name, type, + columns append(Map with( + "name", name, + "type", type, + "constraints", list() + )) + self +) + +TableDefinition primaryKey := method(col, + columns last at("constraints") append("PRIMARY KEY") + self +) + +TableDefinition notNull := method( + columns last at("constraints") append("NOT NULL") + self +) + +TableDefinition unique := method( + columns last at("constraints") append("UNIQUE") + self +) + +Migration toSQL := method( + sql := list() + + changes foreach(change, + if(change at("type") == "createTable", + table := change at("table") + stmt := "CREATE TABLE " .. table name .. " (\n" + + cols := table columns map(col, + " " .. col at("name") .. " " .. col at("type") .. + if(col at("constraints") size > 0, + " " .. col at("constraints") join(" "), + "" + ) + ) + + stmt = stmt .. cols join(",\n") .. "\n);" + sql append(stmt) + ) + + if(change at("type") == "dropTable", + sql append("DROP TABLE " .. change at("name") .. ";") + ) + ) + + sql join("\n\n") +) + +// Usage +migration := Migration clone + +migration createTable("users", + column("id", "INTEGER") primaryKey, + column("username", "VARCHAR(50)") notNull unique, + column("email", "VARCHAR(100)") notNull unique, + column("created_at", "TIMESTAMP") notNull +) + +migration createTable("posts", + column("id", "INTEGER") primaryKey, + column("user_id", "INTEGER") notNull, + column("title", "VARCHAR(200)") notNull, + column("content", "TEXT"), + column("published_at", "TIMESTAMP") +) + +migration toSQL println +``` + +## Conclusion + +Domain-Specific Languages in Io demonstrate the language's expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language. + +The key to successful DSLs in Io is understanding that you're not fighting against language syntax—you're working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable. + + +--- + + +Source: /Ecosystem-and-Libraries/ + +--- +title: Ecosystem and Libraries +topTitle: Io +subtitle: "The available libraries, tools, and community resources around Io." +nextSectionLink: true +--- + +While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem. + +## Core Libraries + +Io comes with several built-in libraries that extend its capabilities: + +### File I/O and System + +```io +// File operations +file := File with("data.txt") + +// Reading +if(file exists, + contents := file contents + lines := file readLines + + // Read with encoding + file setEncoding("UTF-8") + text := file contents +) + +// Writing +file openForWriting +file write("Hello, World!\n") +file write("Line 2\n") +file close + +// Appending +file openForAppending +file write("Additional line\n") +file close + +// File information +file size println +file lastModified println +file isDirectory println + +// Directory operations +dir := Directory with("./src") +dir files foreach(file, + file name println +) + +dir directories foreach(subdir, + subdir path println +) + +// Recursive directory walking +dir recursiveFilesOfType("io") foreach(ioFile, + ioFile path println +) + +// System operations +System system("ls -la") // Execute shell command +System getEnvironmentVariable("HOME") println +System setEnvironmentVariable("MY_VAR", "value") +System exit(0) +``` + +### Networking + +```io +// HTTP Client +url := URL with("https://api.example.com/data") +url fetch println // Simple GET request + +// With headers +url setHeader("Authorization", "Bearer token") +url setHeader("Content-Type", "application/json") +response := url fetch + +// POST request +url setMethod("POST") +url setBody("{\"key\": \"value\"}") +response := url fetch + +// Socket programming +// Server +server := Socket clone +server setHost("127.0.0.1") +server setPort(8080) +server bind +server listen + +loop( + client := server accept + @( + data := client readUntilSeq("\n") + client write("Echo: " .. data) + client close + ) +) + +// Client +client := Socket clone +client setHost("127.0.0.1") +client setPort(8080) +client connect +client write("Hello, server!\n") +response := client readUntilSeq("\n") +response println +client close +``` + +### Date and Time + +```io +// Current date/time +now := Date now +now println + +// Date components +now year println +now month println +now day println +now hour println +now minute println +now second println + +// Date arithmetic +tomorrow := now + Duration days(1) +nextWeek := now + Duration weeks(1) +hourAgo := now - Duration hours(1) + +// Formatting +now asString("%Y-%m-%d %H:%M:%S") println +now asString("%B %d, %Y") println + +// Parsing +date := Date fromString("2024-01-15", "%Y-%m-%d") + +// Duration +duration := Duration clone +duration setDays(2) setHours(3) setMinutes(30) +duration asSeconds println + +// Timing code +start := Date now +// ... code to time ... +elapsed := Date now - start +("Elapsed: " .. elapsed) println +``` + +### Regular Expressions + +```io +// Basic matching +text := "The year 2024 has 365 days" +text matchesRegex("\\d+") println // true + +// Finding matches +match := text findRegex("\\d+") +match start println // Starting position +match end println // Ending position +match string println // Matched string + +// All matches +matches := text allMatchesOfRegex("\\d+") +matches foreach(m, + m string println // 2024, 365 +) + +// Replacement +result := text replaceFirstRegex("\\d+", "N") +result println // The year N has 365 days + +result := text replaceAllRegex("\\d+", "N") +result println // The year N has N days + +// Capture groups +email := "user@example.com" +pattern := "(\\w+)@([\\w.]+)" +if(match := email matchesOfRegex(pattern), + match at(1) println // user + match at(2) println // example.com +) + +// Compiling regex for reuse +regex := Regex with("\\b\\w{5}\\b") // 5-letter words +regex matches("hello") println // true +regex matches("hi") println // false +``` + +### JSON + +```io +// Parsing JSON +jsonString := """ +{ + "name": "Alice", + "age": 30, + "interests": ["coding", "music"], + "address": { + "city": "New York", + "zip": "10001" + } +} +""" + +data := jsonString parseJson +data at("name") println // Alice +data at("interests") at(0) println // coding +data at("address") at("city") println // New York + +// Creating JSON +person := Map with( + "name", "Bob", + "age", 25, + "active", true, + "tags", list("developer", "gamer") +) + +json := person asJson +json println // {"name":"Bob","age":25,"active":true,"tags":["developer","gamer"]} + +// Pretty printing +json := person asJson(true) // Pretty format +``` + +### XML + +```io +// Parsing XML +xmlString := """ + + + Alice + 30 + + + Bob + 25 + + +""" + +doc := SGML parseString(xmlString) +root := doc root + +// Navigate XML +people := root elementsWithName("person") +people foreach(person, + id := person attributeAt("id") + name := person elementWithName("name") text + age := person elementWithName("age") text + (id .. ": " .. name .. " (" .. age .. ")") println +) + +// Build XML +doc := SGML clone +root := doc addElement("catalog") + +book := root addElement("book") +book setAttribute("isbn", "123456") +book addElement("title") setText("Io Programming") +book addElement("author") setText("Jane Doe") +book addElement("price") setText("29.99") + +doc asString println +``` + +## Addon System + +Io's addon system allows loading C-based extensions: + +```io +// Loading addons +Addon load("Socket") // Network programming +Addon load("Random") // Random number generation +Addon load("Regex") // Regular expressions +Addon load("SQLite") // Database access + +// Check available addons +Addon availableAddons foreach(name, + name println +) + +// Addon information +addon := Addon named("Socket") +addon path println +addon dependencies println +``` + +## Database Libraries + +### SQLite + +```io +// SQLite integration +db := SQLite clone +db open("app.db") + +// Create table +db exec(""" + CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY, + name TEXT NOT NULL, + email TEXT UNIQUE, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + ) +""") + +// Insert data +stmt := db prepare("INSERT INTO users (name, email) VALUES (?, ?)") +stmt bind(1, "Alice") +stmt bind(2, "alice@example.com") +stmt step +stmt reset + +// Query data +results := db exec("SELECT * FROM users WHERE name LIKE 'A%'") +results foreach(row, + ("ID: " .. row at("id") .. ", Name: " .. row at("name")) println +) + +// Prepared statements with results +stmt := db prepare("SELECT * FROM users WHERE id = ?") +stmt bind(1, 1) + +while(stmt step == SQLite ROW, + name := stmt columnText(1) + email := stmt columnText(2) + (name .. " - " .. email) println +) + +stmt finalize +db close + +// Transactions +db begin +try( + db exec("INSERT INTO users ...") + db exec("UPDATE users ...") + db commit +) catch(Exception, e, + db rollback + e raise +) +``` + +## Graphics and GUI + +### OpenGL + +```io +// OpenGL addon (if available) +Addon load("OpenGL") + +// Basic window setup +window := GLApp clone +window width := 800 +window height := 600 +window title := "Io OpenGL" + +window draw := method( + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) + + glBegin(GL_TRIANGLES) + glColor3f(1, 0, 0) + glVertex2f(-0.5, -0.5) + glColor3f(0, 1, 0) + glVertex2f(0.5, -0.5) + glColor3f(0, 0, 1) + glVertex2f(0, 0.5) + glEnd + + swapBuffers +) + +window run +``` + +### Image Processing + +```io +// Image addon +Addon load("Image") + +// Load and manipulate images +img := Image clone +img open("photo.jpg") + +// Get information +img width println +img height println +img componentCount println // Color channels + +// Basic operations +img resize(800, 600) +img crop(100, 100, 400, 300) +img flip("horizontal") +img rotate(90) + +// Filters +img blur(5) +img sharpen +img adjustBrightness(1.2) +img adjustContrast(1.5) +img grayscale + +// Save +img save("modified.png") + +// Create new image +canvas := Image clone +canvas allocate(500, 500, 3) // RGB +canvas fill(Color with(0.5, 0.5, 1.0)) // Light blue + +// Draw on image +canvas drawLine(0, 0, 500, 500, Color red) +canvas drawCircle(250, 250, 100, Color green) +canvas drawRectangle(100, 100, 300, 200, Color blue) + +canvas save("drawing.png") +``` + +## Cryptography + +```io +// Crypto addon +Addon load("MD5") +Addon load("SHA1") + +// Hashing +text := "Hello, World!" + +md5 := MD5 clone +md5 appendSeq(text) +md5 hexDigest println // MD5 hash + +sha := SHA1 clone +sha appendSeq(text) +sha hexDigest println // SHA1 hash + +// File hashing +file := File with("document.pdf") +hash := MD5 hashFile(file path) +hash println + +// HMAC (if available) +key := "secret-key" +message := "Important message" +hmac := HMAC sha256(key, message) +hmac println +``` + +## Third-Party Libraries + +### Package Management + +While Io doesn't have a centralized package manager like npm or pip, libraries can be managed through: + +```io +// Simple package loader +PackageLoader := Object clone +PackageLoader paths := list( + "~/.io/packages", + "/usr/local/io/packages", + "./packages" +) + +PackageLoader load := method(name, + paths foreach(path, + packageFile := Path with(path, name, "init.io") + if(File with(packageFile) exists, + doFile(packageFile) + return true + ) + ) + Exception raise("Package not found: " .. name) +) + +// Usage +PackageLoader load("web-framework") +PackageLoader load("test-framework") +``` + +### Creating Libraries + +Structure for an Io library: + +```io +// mylib/init.io - Entry point +MyLib := Object clone +MyLib version := "1.0.0" + +// Load components +doRelativeFile("core.io") +doRelativeFile("utils.io") +doRelativeFile("extensions.io") + +// Export public API +MyLib + +// mylib/core.io +MyLib Core := Object clone +MyLib Core process := method(data, + // Core functionality +) + +// mylib/utils.io +MyLib Utils := Object clone +MyLib Utils helper := method( + // Utility functions +) + +// mylib/extensions.io +// Extend built-in types +List customMethod := method( + // Extended functionality +) +``` + +### Testing Frameworks + +Simple testing framework example: + +```io +// SimpleTest framework +Test := Object clone +Test suites := list() + +Test describe := method(name, block, + suite := TestSuite clone + suite name := name + suite tests := list() + + suite it := method(desc, testBlock, + tests append(list(desc, testBlock)) + ) + + block call(suite) + suites append(suite) +) + +Test run := method( + totalTests := 0 + passedTests := 0 + + suites foreach(suite, + ("\n" .. suite name) println + ("=" repeated(suite name size)) println + + suite tests foreach(test, + desc := test at(0) + block := test at(1) + totalTests = totalTests + 1 + + e := try( + block call + (" ✓ " .. desc) println + passedTests = passedTests + 1 + ) catch(Exception, e, + (" ✗ " .. desc) println + (" " .. e message) println + ) + ) + ) + + ("\n" .. passedTests .. "/" .. totalTests .. " tests passed") println +) + +// Usage +Test describe("Array operations", suite, + suite it("should append elements", + arr := list(1, 2) + arr append(3) + assert(arr size == 3) + ) + + suite it("should remove elements", + arr := list(1, 2, 3) + arr remove(2) + assert(arr contains(2) not) + ) +) + +Test run +``` + +## Documentation Tools + +### Generating Documentation + +```io +// Simple documentation generator +DocGen := Object clone +DocGen init := method( + self docs := Map clone + self +) + +DocGen document := method(obj, name, + info := Map clone + info atPut("name", name) + info atPut("type", obj type) + info atPut("slots", obj slotNames sort) + + // Extract method signatures + methods := Map clone + obj slotNames foreach(slotName, + slot := obj getSlot(slotName) + if(slot type == "Block", + methods atPut(slotName, slot argumentNames) + ) + ) + info atPut("methods", methods) + + docs atPut(name, info) + self +) + +DocGen generateMarkdown := method( + md := "# API Documentation\n\n" + + docs foreach(name, info, + md = md .. "## " .. name .. "\n\n" + md = md .. "**Type**: " .. info at("type") .. "\n\n" + + methods := info at("methods") + if(methods size > 0, + md = md .. "### Methods\n\n" + methods foreach(method, args, + md = md .. "- `" .. method .. "(" .. args join(", ") .. ")`\n" + ) + md = md .. "\n" + ) + ) + + md +) + +// Usage +docGen := DocGen clone init +docGen document(MyClass, "MyClass") +docGen document(MyUtils, "MyUtils") + +File with("API.md") openForWriting write(docGen generateMarkdown) close +``` + +## Development Tools + +### REPL Enhancements + +```io +// Enhanced REPL +REPL := Object clone +REPL history := list() +REPL commands := Map clone + +REPL registerCommand := method(name, block, + commands atPut(name, block) +) + +REPL run := method( + loop( + "io> " print + input := File standardInput readLine + + if(input beginsWithSeq(":"), + // Handle commands + cmd := input afterSeq(":") + if(commands hasKey(cmd), + commands at(cmd) call, + ("Unknown command: " .. cmd) println + ), + // Evaluate Io code + history append(input) + e := try( + result := doString(input) + ("==> " .. result) println + ) catch(Exception, e, + ("Error: " .. e message) println + ) + ) + ) +) + +// Register commands +REPL registerCommand("help", block( + "Available commands:" println + commands keys foreach(cmd, + (" :" .. cmd) println + ) +)) + +REPL registerCommand("history", block( + history foreach(i, line, + (i .. ": " .. line) println + ) +)) + +REPL registerCommand("clear", block( + System system("clear") +)) + +REPL registerCommand("quit", block( + System exit +)) + +// Run enhanced REPL +REPL run +``` + +### Debugging Tools + +```io +// Simple debugger +Debugger := Object clone +Debugger breakpoints := list() +Debugger stepping := false + +Object debug := method( + Debugger enter(self, call) +) + +Debugger enter := method(context, callObj, + "=== Debugger ===" println + ("Context: " .. context type) println + ("Location: " .. callObj message) println + + loop( + "> " print + cmd := File standardInput readLine split(" ") + + if(cmd at(0) == "inspect", + target := cmd at(1) + if(target, + obj := context doString(target) + obj slotNames foreach(slot, + (" " .. slot .. ": " .. obj getSlot(slot) type) println + ) + ) + ) + + if(cmd at(0) == "eval", + code := cmd slice(1) join(" ") + result := context doString(code) + result println + ) + + if(cmd at(0) == "continue", + break + ) + + if(cmd at(0) == "help", + "Commands: inspect , eval , continue, help" println + ) + ) +) +``` + +## Community Resources + +### Finding Libraries + +Common sources for Io libraries: + +1. **GitHub**: Search for "io-language" or "iolanguage" topics +2. **Official Repository**: https://github.com/IoLanguage/io +3. **Community Addons**: Various developers maintain addon collections + +### Contributing + +Creating an addon for the community: + +```io +// addon.io - Addon metadata +Addon := Object clone +Addon name := "MyAddon" +Addon version := "1.0.0" +Addon author := "Your Name" +Addon description := "Description of what your addon does" +Addon license := "MIT" +Addon dependencies := list("OtherAddon") + +Addon install := method( + // Installation logic + "Installing " .. name .. " v" .. version println + + // Copy files + // Compile C extensions if needed + // Register with Io +) + +Addon uninstall := method( + // Cleanup logic +) + +// Make addon discoverable +Addon register +``` + +## Performance Libraries + +### Profiling + +```io +// Simple profiler +Profiler := Object clone +Profiler data := Map clone + +Object profile := method(name, + start := Date now + result := call evalArgAt(0) + elapsed := Date now - start + + if(Profiler data hasKey(name) not, + Profiler data atPut(name, list(0, 0)) + ) + + stats := Profiler data at(name) + stats atPut(0, stats at(0) + 1) // Count + stats atPut(1, stats at(1) + elapsed) // Total time + + result +) + +Profiler report := method( + "=== Profile Report ===" println + data foreach(name, stats, + count := stats at(0) + total := stats at(1) + avg := total / count + + (name .. ": " .. count .. " calls, " .. + total .. "s total, " .. avg .. "s average") println + ) +) + +// Usage +profile("database", + // Expensive operation + wait(0.1) +) + +Profiler report +``` + +## Future of Io Libraries + +The Io ecosystem continues to evolve with: + +1. **WebAssembly Support**: Potential for running Io in browsers +2. **Modern Addons**: Integration with contemporary libraries +3. **Cloud Services**: AWS, Azure, GCP client libraries +4. **Machine Learning**: Bindings to TensorFlow, PyTorch +5. **Improved Tooling**: Better IDE support, linters, formatters + +## Conclusion + +While Io's ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need. + +The key to working effectively with Io's ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need. + + +--- + + +Source: /Everything-is-an-Object/ + +--- +title: Everything is an Object +topTitle: Io +subtitle: "What it really means when every value—numbers, booleans, methods—is an object." +nextSectionLink: true +--- + +"Everything is an object" is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like `int` and `boolean` break the rule). But what does it really mean? And how thoroughly does Io embrace this principle? + +In this chapter, we'll explore how Io takes "everything is an object" to its logical extreme, and what this means for how you write and think about programs. + +## What Is an Object? + +Before we dive into Io's object model, let's establish what we mean by "object." In most object-oriented languages, an object is: + +1. A bundle of state (data/attributes/fields) +2. A set of behaviors (methods/functions) +3. An identity (distinct from other objects) + +In Java, you might have: + +```java +class Dog { + String name; // state + int age; // state + + void bark() { // behavior + System.out.println("Woof!"); + } +} + +Dog fido = new Dog(); // identity (fido is distinct from other Dogs) +``` + +But Java immediately breaks its own rules: + +```java +int x = 5; // Not an object! +x.toString(); // Error: int cannot be dereferenced +Integer y = 5; // Now it's an object (boxed) +y.toString(); // "5" +``` + +Let's see how Io handles this. + +## Numbers are Objects + +In Io, numbers aren't primitives—they're full objects: + +```io +5 type println // Number +5 slotNames println // list(%, *, +, -, /, <, ...) + +// Numbers have methods +5 abs println // 5 +-5 abs println // 5 +5 sqrt println // 2.236... +5 sin println // -0.958... + +// You can add methods to numbers! +Number double := method(self * 2) +5 double println // 10 + +// You can even inspect a number's prototype chain +5 proto println // Number_0x... +5 proto proto println // Object_0x... +``` + +Compare this to Python, which claims everything is an object: + +```python +x = 5 +print(type(x)) # +print(dir(x)) # ['__abs__', '__add__', ...] + +# But you can't add methods to numbers +x.double = lambda: x * 2 # AttributeError! +``` + +Python's numbers are objects, but they're *immutable* objects with a *fixed* set of methods. Io's numbers are fully modifiable objects. + +## Strings are Objects (and Mutable!) + +```io +text := "hello" +text type println // Sequence + +// Strings have methods +text size println // 5 +text upper println // HELLO +text reverse println // olleh + +// But here's where it gets interesting - strings are MUTABLE +text atPut(0, 72) // ASCII for 'H' +text println // Hello + +// You can add methods to strings +Sequence shout := method(self upper .. "!!!") +"hello" shout println // HELLO!!! +``` + +This mutability might shock programmers from languages where strings are immutable: + +```python +# Python - strings are immutable +text = "hello" +text[0] = 'H' # TypeError: 'str' object does not support item assignment + +# Java - strings are immutable +String text = "hello"; +text.charAt(0) = 'H'; // Error: cannot assign a value +``` + +## Booleans are Objects + +Even `true` and `false` are objects: + +```io +true type println // true +false type println // false + +// They have methods +true and(false) println // false +true or(false) println // true +true not println // false + +// The actual objects +true println // true +true proto println // Object_0x... + +// You can even add methods to booleans! +true celebrate := method("Yay!" println) +(5 > 3) celebrate // Yay! +``` + +This is different from most languages where booleans are either primitives or special immutable objects. + +## nil is an Object + +Even nothingness is an object in Io: + +```io +nil type println // Object +nil slotNames println // list(type, ...) + +// nil has methods! +nil isNil println // true +nil not println // true + +// You can add methods to nil +nil greet := method("Hello from nothing!" println) +x := nil +x greet // Hello from nothing! +``` + +Compare with JavaScript's confusing null: + +```javascript +typeof null // "object" (but it's not really) +null.toString() // TypeError: Cannot read property 'toString' of null +``` + +## Methods are Objects + +This is where things get really interesting. Methods themselves are objects: + +```io +add := method(a, b, a + b) +add type println // Block + +// Methods have methods! +add argumentNames println // list(a, b) +add code println // a +(b) + +// You can modify methods +add code println // a +(b) +add setCode(block(a, b, a * b)) // Change implementation! +add(3, 4) println // 12 (now multiplies!) + +// You can create methods from strings +code := "a + b + 100" +newMethod := block(a, b) setCode(code) +newMethod call(5, 10) println // 115 +``` + +This is far more powerful than most languages' function objects: + +```python +# Python +def add(a, b): + return a + b + +print(type(add)) # +print(add.__code__) # +# But you can't easily modify the function's code at runtime +``` + +## Control Structures are Objects (Messages) + +This might be the most mind-bending: `if`, `while`, and `for` aren't syntax—they're methods: + +```io +// 'if' is a method on Object +if type println // nil (it's a method) + +// You can see its implementation +Object getSlot("if") println // method(...) + +// You can even redefine it! +Object if := method(condition, trueBlock, falseBlock, + "Making a decision..." println + if(condition, trueBlock call, falseBlock call) +) + +if(true, "yes" println, "no" println) +// Prints: Making a decision... +// Prints: yes +``` + +Let's create our own control structure: + +```io +Object unless := method(condition, block, + if(condition not, block call) +) + +unless(5 > 10, + "Math still works!" println +) +// Prints: Math still works! +``` + +Try doing that in Java or C++! + +## Operators are Objects (Messages) + +Operators aren't special syntax—they're messages: + +```io +// These are equivalent +2 + 3 +2 +(3) +2 send("+", 3) + +// You can redefine operators +Number + := method(n, + "Adding #{self} and #{n}" interpolate println + self + n // Would cause infinite recursion! +) + +// Let's be more careful +Number plusWithLogging := Number getSlot("+") +Number + := method(n, + "Adding #{self} and #{n}" interpolate println + self plusWithLogging(n) +) + +2 + 3 +// Prints: Adding 2 and 3 +// Returns: 5 +``` + +You can even create new operators: + +```io +OperatorTable addOperator("**", 3) // Right-associative, precedence 3 +Number ** := method(n, self pow(n)) + +2 ** 3 println // 8 +2 ** 3 ** 2 println // 512 (right-associative: 2 ** (3 ** 2)) +``` + +## Lists are Objects + +```io +nums := list(1, 2, 3) +nums type println // List + +// Lists have many methods +nums size println // 3 +nums first println // 1 +nums last println // 3 +nums reverse println // list(3, 2, 1) + +// Lists are mutable +nums append(4) +nums println // list(1, 2, 3, 4) + +// You can add custom methods to lists +List sum := method( + self reduce(+) +) + +list(1, 2, 3, 4, 5) sum println // 15 +``` + +## Even the Lobby is an Object + +The global namespace in Io is an object called `Lobby`: + +```io +Lobby type println // Object +Lobby slotNames println // list(all your global variables) + +// When you create a "global" variable, you're adding a slot to Lobby +x := 10 +Lobby hasSlot("x") println // true +Lobby x println // 10 + +// You can manipulate the global namespace as an object +Lobby removeSlot("x") +x println // Exception: Slot x not found +``` + +This is radically different from languages with special global scope rules. + +## Messages Themselves are Objects + +When you send a message, that message is an object: + +```io +msg := message(2 + 3) +msg type println // Message +msg name println // + +msg arguments println // list(Message_0x...) +msg arguments first code println // 3 + +// You can evaluate messages +msg doInContext(Lobby) println // 5 + +// You can build messages programmatically +msg := Message clone setName("+") setArguments(list(Message clone setName("3"))) +2 doMessage(msg) println // 5 +``` + +This is the foundation of Io's metaprogramming capabilities. + +## The Object Hierarchy + +Let's explore how all these objects relate: + +```io +// Everything ultimately inherits from Object +5 proto proto == Object println // true +"hi" proto proto == Object println // true +true proto == Object println // true +list() proto proto == Object println // true + +// You can walk the prototype chain +obj := 5 +while(obj, + obj type println + obj = obj proto +) +// Prints: +// Number +// Object +``` + +## Practical Implications + +What does it mean that everything is truly an object? + +### 1. Uniform Interface + +You can treat everything uniformly: + +```io +things := list(5, "hello", true, nil, method(x, x * 2), list(1, 2)) + +things foreach(thing, + ("Type: " .. thing type) println +) +// Type: Number +// Type: Sequence +// Type: true +// Type: Object +// Type: Block +// Type: List +``` + +### 2. No Special Cases + +You don't need to remember different rules for different types: + +```io +// Everything can receive messages +5 println +"hello" println +true println +nil println +list(1,2,3) println + +// Everything can be inspected +5 slotNames +"hello" slotNames +true slotNames +nil slotNames +``` + +### 3. Extensibility + +You can extend anything: + +```io +// Add methods to numbers for DSL +Number days := method( + Duration clone setDays(self) +) + +Number hours := method( + Duration clone setHours(self) +) + +// Now you can write +deadline := Date now + 3 days + 4 hours +``` + +### 4. Debugging Power + +Since everything is an object, you can inspect everything: + +```io +Object debugMethod := method(name, + m := self getSlot(name) + ("Method " .. name .. ":") println + (" Arguments: " .. m argumentNames) println + (" Code: " .. m code) println +) + +List debugMethod("append") +// Method append: +// Arguments: list(...) +// Code: ... +``` + +## Comparison with Other Languages + +### Ruby: "Everything is an object" (mostly) + +```ruby +5.class # Integer +"hello".class # String +true.class # TrueClass +nil.class # NilClass + +# But... +if.class # SyntaxError! 'if' isn't an object +``` + +### Python: "Everything is an object" (sort of) + +```python +type(5) # +type("hello") # +type(True) # +type(None) # + +# But... +type(if) # SyntaxError! 'if' isn't an object +type(+) # SyntaxError! '+' isn't an object +``` + +### JavaScript: "Everything is an object" (except when it's not) + +```javascript +typeof 5 // "number" (primitive) +typeof "hello" // "string" (primitive) +typeof true // "boolean" (primitive) +typeof {} // "object" + +// Autoboxing happens sometimes +(5).toString() // "5" (temporarily boxed) +5.x = 10 // Silently fails! +``` + +### Io: Everything IS an object (no exceptions) + +```io +5 type // Number (object) +"hello" type // Sequence (object) +true type // true (object) +if type // nil (it's a method, which is an object) ++ type // nil (it's a method, which is an object) +``` + +## Exercises + +1. **Object Inspector**: Write a method `inspect` that can be called on any object and prints: + - Its type + - Its slot names + - Its prototype chain + +2. **Custom Boolean**: Create your own boolean system with objects `Yes` and `No` that have methods `and`, `or`, and `not`. + +3. **Operator Overloading**: Define a `Vector` object with `x` and `y` slots, then overload the `+` operator to add vectors. + +4. **Control Structure**: Create a `repeat(n, block)` control structure that executes a block n times. + +5. **Message Logger**: Modify the `Object` prototype to log every message sent to any object (hint: override `forward`). + +## Philosophical Implications + +Io's radical "everything is an object" approach has profound implications: + +1. **Simplicity through uniformity**: One concept (objects) explains everything +2. **Power through openness**: Nothing is sealed or special +3. **Learning through exploration**: You can inspect and understand everything +4. **Danger through freedom**: You can break everything + +This last point is important. With great power comes great responsibility. Io trusts you completely. You can redefine addition, break the `if` statement, or delete critical system objects. This isn't a bug—it's a philosophy. + +## Conclusion + +In Io, "everything is an object" isn't marketing—it's a fundamental truth that shapes every aspect of the language. Numbers, strings, booleans, nil, methods, operators, control structures, and even messages themselves are all objects with slots that can be inspected, modified, and extended. + +This uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that *everything* is just objects sending messages to other objects, Io's entire design clicks into place. + +Next, we'll explore how objects relate to each other through Io's prototype-based inheritance system—a world without classes. + + +--- + + +Source: /Exceptions/ + +--- +title: Exceptions +topTitle: Io +subtitle: "Error handling built, like everything else, from objects and messages." +nextSectionLink: true +--- + +Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types. + +## Basic Exception Handling + +Io uses `try`, `catch`, and `raise` for exception handling: + +```io +// Basic try-catch +try( + 10 / 0 // Division by zero +) catch(Exception, e, + ("Error: " .. e message) println +) +// Error: divide by zero + +// Multiple catch blocks +try( + someRiskyOperation() +) catch(TypeError, e, + "Type error occurred" println +) catch(IOException, e, + "IO error occurred" println +) catch(Exception, e, + "Some other error occurred" println +) +``` + +Compare with other languages: + +```python +# Python +try: + result = 10 / 0 +except ZeroDivisionError as e: + print(f"Error: {e}") +``` + +```java +// Java +try { + int result = 10 / 0; +} catch (ArithmeticException e) { + System.out.println("Error: " + e.getMessage()); +} +``` + +## Raising Exceptions + +```io +// Raise a simple exception +Exception raise("Something went wrong") + +// Raise with more information +e := Exception clone +e setMessage("File not found") +e raise + +// Conditional raising +validateAge := method(age, + if(age < 0, Exception raise("Age cannot be negative")) + if(age > 150, Exception raise("Age seems unrealistic")) + age +) + +try( + validateAge(-5) +) catch(Exception, e, + e message println // Age cannot be negative +) +``` + +## Exception Objects + +Exceptions are just objects: + +```io +// Examine exception structure +e := Exception clone +e type println // Exception +e proto println // Object_0x... + +// Exception slots +e setMessage("Test error") +e message println // Test error + +// Stack trace +try( + Exception raise("Test") +) catch(Exception, e, + e showStack // Prints full stack trace + e coroutine println // The coroutine where error occurred +) +``` + +## Creating Custom Exceptions + +```io +// Define custom exception types +ValidationError := Exception clone +ValidationError type := "ValidationError" + +NetworkError := Exception clone +NetworkError type := "NetworkError" +NetworkError code := nil +NetworkError setCode := method(c, self code = c; self) + +// Use custom exceptions +validateEmail := method(email, + if(email containsSeq("@") not, + ValidationError clone setMessage("Invalid email format") raise + ) + email +) + +fetchData := method(url, + // Simulate network error + if(Random value < 0.3, + NetworkError clone setMessage("Connection timeout") setCode(408) raise + ) + "data" +) + +// Handle specific exception types +try( + validateEmail("badEmail") +) catch(ValidationError, e, + ("Validation failed: " .. e message) println +) catch(Exception, e, + ("Unexpected error: " .. e message) println +) +``` + +## The finally Block + +```io +// Ensure cleanup with finally +file := nil +try( + file = File with("data.txt") openForReading + contents := file contents + processData(contents) +) catch(Exception, e, + ("Error reading file: " .. e message) println +) finally( + if(file, file close) + "Cleanup complete" println +) + +// finally always executes +result := try( + "Success" println + 42 +) catch(Exception, e, + "Error" println + 0 +) finally( + "Always runs" println +) +// Prints: Success, Always runs +result println // 42 +``` + +## Return Values and Exceptions + +```io +// try returns a value +result := try( + 10 / 2 +) catch(Exception, e, + 0 // Default value on error +) +result println // 5 + +// With error +result := try( + 10 / 0 +) catch(Exception, e, + 0 // Default value on error +) +result println // 0 + +// Pattern: Result or default +safeDiv := method(a, b, + try(a / b) catch(Exception, 0) +) + +safeDiv(10, 2) println // 5 +safeDiv(10, 0) println // 0 +``` + +## Exception Propagation + +Exceptions bubble up through the call stack: + +```io +level3 := method( + Exception raise("Error at level 3") +) + +level2 := method( + "Level 2 start" println + level3() + "Level 2 end" println // Never reached +) + +level1 := method( + "Level 1 start" println + level2() + "Level 1 end" println // Never reached +) + +try( + level1() +) catch(Exception, e, + ("Caught at top level: " .. e message) println +) +// Level 1 start +// Level 2 start +// Caught at top level: Error at level 3 +``` + +## Rethrowing Exceptions + +```io +processFile := method(filename, + try( + file := File with(filename) openForReading + // Process file + ) catch(Exception, e, + ("Failed to process " .. filename) println + e raise // Rethrow the original exception + ) +) + +try( + processFile("nonexistent.txt") +) catch(Exception, e, + "Caught rethrown exception" println +) +``` + +## Error Recovery Patterns + +### Retry Pattern + +```io +retryOperation := method(operation, maxAttempts, + attempts := 0 + lastError := nil + + while(attempts < maxAttempts, + attempts = attempts + 1 + + e := try( + return operation call(attempts) + ) + + if(e, + lastError = e + ("Attempt " .. attempts .. " failed: " .. e message) println + if(attempts < maxAttempts, wait(0.5)) + ) + ) + + Exception raise("All " .. maxAttempts .. " attempts failed. Last error: " .. lastError message) +) + +// Usage +result := retryOperation( + block(attempt, + if(Random value < 0.7, + Exception raise("Random failure"), + "Success on attempt " .. attempt + ) + ), + 3 +) +``` + +### Circuit Breaker + +```io +CircuitBreaker := Object clone +CircuitBreaker init := method(threshold, timeout, + self failureCount := 0 + self threshold := threshold + self timeout := timeout + self state := "closed" // closed, open, half-open + self lastFailureTime := nil + self +) + +CircuitBreaker call := method(operation, + if(state == "open", + if(Date now - lastFailureTime > timeout, + state = "half-open" + "Circuit breaker entering half-open state" println, + Exception raise("Circuit breaker is open") + ) + ) + + e := try( + result := operation call + if(state == "half-open", + state = "closed" + failureCount = 0 + "Circuit breaker closed" println + ) + return result + ) + + if(e, + failureCount = failureCount + 1 + lastFailureTime = Date now + + if(failureCount >= threshold, + state = "open" + "Circuit breaker opened" println + ) + + e raise + ) +) + +// Usage +breaker := CircuitBreaker clone init(3, 5) + +unreliableService := block( + if(Random value < 0.8, + Exception raise("Service unavailable"), + "Service response" + ) +) + +5 repeat( + try( + breaker call(unreliableService) println + ) catch(Exception, e, + ("Failed: " .. e message) println + ) + wait(1) +) +``` + +## Assertion and Validation + +```io +// Simple assertion +assert := method(condition, message, + if(condition not, + Exception raise(message ifNilEval("Assertion failed")) + ) +) + +assert(5 > 3, "Math is broken") +// assert(3 > 5, "This will fail") + +// Validation framework +Validator := Object clone +Validator rules := list() + +Validator addRule := method(rule, message, + rules append(list(rule, message)) + self +) + +Validator validate := method(value, + errors := list() + + rules foreach(rule, + if(rule at(0) call(value) not, + errors append(rule at(1)) + ) + ) + + if(errors size > 0, + ValidationError clone setMessage(errors join(", ")) raise + ) + + value +) + +// Usage +ageValidator := Validator clone \ + addRule(block(v, v isKindOf(Number)), "Must be a number") \ + addRule(block(v, v >= 0), "Must be non-negative") \ + addRule(block(v, v <= 150), "Must be realistic") + +try( + ageValidator validate(25) println // 25 + ageValidator validate(-5) // Throws +) catch(ValidationError, e, + e message println // Must be non-negative +) +``` + +## Exception Context and Debugging + +```io +// Enhanced exception with context +ContextualException := Exception clone +ContextualException context := Map clone + +ContextualException addContext := method(key, value, + context atPut(key, value) + self +) + +ContextualException describe := method( + result := message .. "\nContext:\n" + context foreach(key, value, + result = result .. " " .. key .. ": " .. value .. "\n" + ) + result +) + +// Usage +processUser := method(userData, + if(userData at("age") < 18, + ContextualException clone \ + setMessage("User too young") \ + addContext("userId", userData at("id")) \ + addContext("age", userData at("age")) \ + addContext("timestamp", Date now) \ + raise + ) +) + +try( + processUser(Map with("id", 123, "age", 16)) +) catch(ContextualException, e, + e describe println +) +``` + +## Resource Management + +```io +// RAII-style resource management +withResource := method(resourceCreator, resourceUser, + resource := nil + try( + resource = resourceCreator call + resourceUser call(resource) + ) finally( + if(resource and resource hasSlot("close"), + resource close + ) + ) +) + +// Usage +withResource( + block(File with("test.txt") openForReading), + block(file, + file contents println + ) +) + +// Database connection example +withConnection := method(dbUrl, operation, + conn := nil + try( + conn = Database connect(dbUrl) + conn beginTransaction + result := operation call(conn) + conn commit + result + ) catch(Exception, e, + if(conn, conn rollback) + e raise + ) finally( + if(conn, conn close) + ) +) +``` + +## Global Exception Handling + +```io +// Install global exception handler +System handleException := method(e, + logFile := File with("errors.log") openForAppending + logFile write(Date now asString .. " - " .. e message .. "\n") + logFile close + + // Original behavior + e showStack + System exit(1) +) + +// Uncaught exceptions now get logged +// Exception raise("Uncaught error") +``` + +## Testing with Exceptions + +```io +// Test framework with exception support +Test := Object clone +Test assertRaises := method(exceptionType, block, + raised := false + try( + block call + ) catch(Exception, e, + if(e type == exceptionType type, + raised = true, + Exception raise("Wrong exception type: expected " .. exceptionType type .. ", got " .. e type) + ) + ) + + if(raised not, + Exception raise("Expected exception " .. exceptionType type .. " was not raised") + ) +) + +// Usage +Test assertRaises(ValidationError, block( + validateEmail("invalid") +)) +"Test passed" println +``` + +## Performance Considerations + +```io +// Exceptions have overhead +benchmark := method(name, iterations, block, + start := Date now + iterations repeat(block) + elapsed := Date now - start + (name .. ": " .. elapsed) println +) + +// Without exceptions +benchmark("No exceptions", 100000, block( + if(Random value < 0.1, nil, "success") +)) + +// With exceptions +benchmark("With exceptions", 100000, block( + try( + if(Random value < 0.1, Exception raise("error")) + "success" + ) catch(Exception, nil) +)) + +// Exceptions are slower - use for exceptional cases, not control flow +``` + +## Common Pitfalls + +### Catching Too Broadly + +```io +// BAD: Catches everything, hiding bugs +try( + complexOperation() +) catch(Exception, e, + // Silently ignore all errors +) + +// GOOD: Catch specific exceptions +try( + complexOperation() +) catch(NetworkError, e, + handleNetworkError(e) +) catch(ValidationError, e, + handleValidationError(e) +) +``` + +### Resource Leaks + +```io +// BAD: File not closed on error +file := File with("data.txt") openForReading +processFile(file) // If this throws, file never closes +file close + +// GOOD: Use finally +file := nil +try( + file = File with("data.txt") openForReading + processFile(file) +) finally( + if(file, file close) +) +``` + +## Exercises + +1. **Result Type**: Implement a Result type that can be either Ok(value) or Error(error), similar to Rust. + +2. **Retry with Exponential Backoff**: Create a retry mechanism with exponential backoff and jitter. + +3. **Exception Logger**: Build a logging system that captures and categorizes exceptions. + +4. **Validation Chain**: Create a validation system that accumulates all errors instead of failing on first. + +5. **Async Exception Handling**: Implement exception handling for coroutine-based async operations. + +## Real-World Example: HTTP Client with Error Handling + +```io +HttpClient := Object clone +HttpClient timeoutMs := 5000 +HttpClient maxRetries := 3 + +HttpError := Exception clone +HttpError statusCode := nil + +HttpClient get := method(url, + retryCount := 0 + + loop( + try( + response := self doRequest(url) + + if(response statusCode >= 200 and response statusCode < 300, + return response body + ) + + if(response statusCode >= 400 and response statusCode < 500, + // Client error - don't retry + HttpError clone \ + setMessage("HTTP " .. response statusCode) \ + setSlot("statusCode", response statusCode) \ + raise + ) + + // Server error - might retry + if(response statusCode >= 500, + error := HttpError clone \ + setMessage("Server error: " .. response statusCode) \ + setSlot("statusCode", response statusCode) + + if(retryCount < maxRetries, + retryCount = retryCount + 1 + delay := (2 pow(retryCount)) * 100 + ("Retry " .. retryCount .. " after " .. delay .. "ms") println + wait(delay / 1000) + continue, + error raise + ) + ) + + ) catch(NetworkError, e, + if(retryCount < maxRetries, + retryCount = retryCount + 1 + ("Network error, retry " .. retryCount) println + wait(1) + continue, + e raise + ) + ) + ) +) + +// Usage with comprehensive error handling +fetchUserData := method(userId, + try( + data := HttpClient get("https://api.example.com/users/" .. userId) + JSON parse(data) + ) catch(HttpError, e, + if(e statusCode == 404, + nil, // User not found + if(e statusCode == 401, + Exception raise("Authentication required"), + Exception raise("HTTP error: " .. e statusCode) + ) + ) + ) catch(NetworkError, e, + Exception raise("Network unavailable") + ) catch(Exception, e, + Exception raise("Unexpected error: " .. e message) + ) +) +``` + +## Conclusion + +Io's exception system demonstrates the language's consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling. + +The key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with `finally` blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications. + + +--- + + +Source: /Getting-Started/ + +--- +title: Getting Started with Io +topTitle: Io +subtitle: "Install Io, explore the REPL, and write your first programs." +nextSectionLink: true +--- + +The best way to understand Io is to use it. In this chapter, we'll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you'll have a feel for Io's syntax and flow. + +## Installing Io + +### macOS + +If you're on macOS with Homebrew, installation is simple: + +```bash +brew install io +``` + +### Linux + +On most Linux distributions, you'll need to build from source: + +```bash +git clone https://github.com/IoLanguage/io.git +cd io +mkdir build +cd build +cmake .. +make +sudo make install +``` + +### Windows + +Windows users should use WSL (Windows Subsystem for Linux) and follow the Linux instructions, or use Docker: + +```bash +docker run -it --rm stevedekorte/io +``` + +### Verifying Installation + +Once installed, verify Io is working: + +```bash +$ io --version +Io Programming Language, v. 20170906 + +$ io +Io> "Hello, World!" println +Hello, World! +==> Hello, World! +Io> ^C +``` + +## The REPL: Your Io Playground + +Io's REPL is where you'll spend most of your learning time. Unlike compiled languages where you write, compile, and run, Io lets you experiment immediately. + +Start the REPL by typing `io`: + +```io +$ io +Io> +``` + +The prompt `Io>` indicates Io is ready for input. Let's explore: + +```io +Io> 2 + 2 +==> 4 + +Io> "Hello" .. " " .. "World" +==> Hello World + +Io> 10 > 5 +==> true +``` + +Notice the `==>` prefix? That shows the return value of your expression. Everything in Io returns a value. + +### REPL Tips + +1. **Multi-line input**: The REPL detects incomplete expressions: + +```io +Io> if(true, +... "yes" println, +... "no" println +... ) +yes +==> yes +``` + +2. **Previous result**: Use `_` to reference the last result: + +```io +Io> 100 * 2 +==> 200 +Io> _ + 50 +==> 250 +``` + +3. **Getting help**: The REPL has built-in documentation: + +```io +Io> Lobby slotNames +==> list(Protos, _, exit, forward, set_) + +Io> Number slotNames sort +==> list(%, *, +, -, /, <, <=, ==, >, >=, abs, acos, asin, atan, between, ceil, cos, ...) +``` + +## Your First Io Program + +Let's write the traditional "Hello, World!" program. Create a file called `hello.io`: + +```io +"Hello, World!" println +``` + +Run it: + +```bash +$ io hello.io +Hello, World! +``` + +That's it. No class definitions, no main function, no boilerplate. Compare with Java: + +```java +public class Hello { + public static void main(String[] args) { + System.out.println("Hello, World!"); + } +} +``` + +Or even Python: + +```python +if __name__ == "__main__": + print("Hello, World!") +``` + +Io just runs your code. + +## Understanding Basic Syntax + +Io's syntax is minimal. Let's explore the basics: + +### Messages and Receivers + +In Io, everything is about sending messages to objects: + +```io +"hello" size // Send 'size' message to "hello" +==> 5 + +"hello" at(0) // Send 'at' message with argument 0 +==> h + +"hello" upper // Send 'upper' message +==> HELLO +``` + +Compare with method calls in Python: + +```python +"hello".upper() # Python +``` + +```io +"hello" upper // Io - parentheses optional for no arguments +``` + +### Arguments + +Messages can have arguments, passed in parentheses: + +```io +"hello" at(1) // One argument +==> e + +"hello" slice(1, 3) // Two arguments +==> el + +List append(1, 2, 3) // Multiple arguments +==> list(1, 2, 3) +``` + +### Operators are Messages + +This is crucial: operators in Io are just messages with special precedence: + +```io +2 + 3 // Send message "+" to 2 with argument 3 +2 +(3) // Exactly the same thing +2 send("+", 3) // Still the same thing! +``` + +This uniformity means you can redefine operators: + +```io +Number + := method(n, self - n) // Redefine + to subtract! +5 + 3 +==> 2 +``` + +(Don't actually do this in real code!) + +## Variables and Assignment + +In Io, variables are just slots on objects. By default, you're working with the `Lobby` object: + +```io +x := 10 // Create slot 'x' on Lobby with value 10 +x println // Print it +==> 10 + +x = 20 // Update existing slot +x println +==> 20 + +y = 30 // Error! Slot doesn't exist +// Exception: Slot y not found +``` + +Note the distinction: +- `:=` creates a new slot +- `=` updates an existing slot + +This prevents accidental variable creation from typos: + +```io +counter := 0 +countr = 1 // Error - probably a typo! +``` + +Compare with JavaScript's similar issue: + +```javascript +let counter = 0; +countr = 1; // Creates global variable - probably a bug! +``` + +## Control Flow + +Io's control structures are methods, not special syntax: + +### If Statements + +```io +if(10 > 5, + "Yes" println, + "No" println +) +// Prints: Yes +``` + +Compare with Python: + +```python +if 10 > 5: + print("Yes") +else: + print("No") +``` + +Since `if` is a method, you can even look at its implementation: + +```io +Io> if +==> method(...) +``` + +### Loops + +```io +// While loop +i := 0 +while(i < 5, + i println + i = i + 1 +) + +// For loop +for(i, 0, 4, + i println +) + +// Times loop +5 times(i, + i println +) +``` + +## Creating Objects + +Let's create our first custom object: + +```io +Person := Object clone +Person name := "Unknown" +Person greet := method( + ("Hello, I'm " .. name) println +) + +alice := Person clone +alice name = "Alice" +alice greet +// Prints: Hello, I'm Alice +``` + +Compare with Python: + +```python +class Person: + def __init__(self): + self.name = "Unknown" + + def greet(self): + print(f"Hello, I'm {self.name}") + +alice = Person() +alice.name = "Alice" +alice.greet() +``` + +The key difference: Io has no class definition. `Person` is just an object we're using as a prototype. + +## Methods + +Methods in Io are created with the `method` function: + +```io +Calculator := Object clone +Calculator add := method(a, b, a + b) +Calculator multiply := method(a, b, a * b) + +calc := Calculator clone +calc add(5, 3) println // 8 +calc multiply(4, 7) println // 28 +``` + +Methods have access to `self` (the receiver): + +```io +Counter := Object clone +Counter count := 0 +Counter increment := method( + count = count + 1 + self // Return self for chaining +) + +c := Counter clone +c increment increment increment +c count println // 3 +``` + +## Lists and Iteration + +Lists are fundamental in Io: + +```io +numbers := list(1, 2, 3, 4, 5) + +// Iteration +numbers foreach(n, + n println +) + +// Map +squared := numbers map(n, n * n) +squared println // list(1, 4, 9, 16, 25) + +// Select (filter) +evens := numbers select(n, n % 2 == 0) +evens println // list(2, 4) + +// Reduce +sum := numbers reduce(+) +sum println // 15 +``` + +Compare with Python: + +```python +numbers = [1, 2, 3, 4, 5] + +# Iteration +for n in numbers: + print(n) + +# Map +squared = [n * n for n in numbers] + +# Filter +evens = [n for n in numbers if n % 2 == 0] + +# Reduce +from functools import reduce +sum = reduce(lambda a, b: a + b, numbers) +``` + +## Working with Files + +Reading and writing files is straightforward: + +```io +// Write to file +file := File with("test.txt") +file openForWriting +file write("Hello, file!") +file close + +// Read from file +file := File with("test.txt") +file openForReading +contents := file contents +contents println +file close + +// Or more concisely +File with("test.txt") contents println +``` + +## A More Complete Example + +Let's build something more substantial—a simple to-do list: + +```io +// todo.io - A simple to-do list manager + +TodoList := Object clone +TodoList items := list() + +TodoList add := method(task, + items append(task) + self +) + +TodoList show := method( + if(items size == 0, + "No tasks!" println, + items foreach(i, task, + (" " .. (i + 1) .. ". " .. task) println + ) + ) + self +) + +TodoList complete := method(index, + if(index > 0 and index <= items size, + task := items at(index - 1) + items removeAt(index - 1) + ("Completed: " .. task) println, + "Invalid task number" println + ) + self +) + +TodoList save := method(filename, + File with(filename) openForWriting write(items asJson) close + "Saved!" println + self +) + +TodoList load := method(filename, + if(File with(filename) exists, + items = Yajl parseJson(File with(filename) contents) + "Loaded!" println, + "File not found" println + ) + self +) + +// Usage +todo := TodoList clone +todo add("Learn Io") add("Build something cool") add("Share with friends") +todo show +// 1. Learn Io +// 2. Build something cool +// 3. Share with friends + +todo complete(1) +// Completed: Learn Io + +todo show +// 1. Build something cool +// 2. Share with friends +``` + +## Key Takeaways + +Having written your first Io programs, you've probably noticed: + +1. **Minimal syntax**: No keywords for defining classes, functions, or variables. Everything uses the same message-passing syntax. + +2. **Immediate feedback**: The REPL makes experimentation effortless. + +3. **Uniform model**: Whether you're doing arithmetic, defining methods, or creating objects, it's all message passing. + +4. **Flexibility**: You can modify anything, even built-in types and operators. + +5. **Simplicity**: Programs are often shorter than their equivalents in other languages. + +## Exercises + +Try these exercises to solidify your understanding: + +1. **Number methods**: Add a `squared` method to `Number` that returns the square of a number. Test it with `5 squared`. + +2. **String reversal**: Create a method on `Sequence` (Io's string type) called `reverse` that returns the reversed string. + +3. **Bank account**: Create a `BankAccount` object with `balance`, `deposit`, and `withdraw` methods. Include protection against negative balances. + +4. **FizzBuzz**: Implement FizzBuzz in Io (print numbers 1-100, but "Fizz" for multiples of 3, "Buzz" for multiples of 5, "FizzBuzz" for both). + +5. **Method chaining**: Create a `StringBuilder` object that allows chaining: `StringBuilder clone add("Hello") add(" ") add("World") toString` + +## What's Different? + +If you're coming from mainstream languages, here's what might feel strange: + +- **No compile step**: Your code runs immediately +- **No type declarations**: Everything is dynamically typed +- **No class keyword**: Objects are created by cloning +- **Operators aren't special**: They're just messages +- **Everything returns a value**: Even assignments and control structures + +These differences aren't arbitrary—they all flow from Io's core principle of uniform message passing. + +## Moving Forward + +You now have enough Io knowledge to explore the deeper concepts. You can: + +- Create and manipulate objects +- Define methods +- Use control structures +- Work with collections +- Read and write files + +In the next chapter, we'll dive deep into Io's object model and understand what "everything is an object" really means. + + +--- + + +Source: /Introduction/ + +--- +title: "Introduction: The Philosophy of Io" +topTitle: Io +subtitle: "The history, philosophy, and seven pillars behind Io's radical simplicity." +nextSectionLink: true +--- + +> "The limits of my language mean the limits of my world." +> - Ludwig Wittgenstein + +Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity. + +Io believes in radical simplicity through uniform message passing. + +## The Birth of Io + +Steve Dekorte created Io in 2002, during an interesting period in programming language history. Java had conquered the enterprise. Python and Ruby were gaining traction as "scripting" languages. JavaScript was still dismissed as a toy for web browsers. The mainstream programming world had largely settled on class-based object-orientation as the "right" way to organize programs. + +But Dekorte was inspired by older, more radical ideas: + +- **Smalltalk** (1972): Everything is an object, computation happens through message passing +- **Self** (1986): Objects without classes, prototype-based inheritance +- **Lisp** (1958): Code as data, minimal syntax, powerful macros +- **Lua** (1993): Simplicity, embeddability, tables as the universal data structure +- **NewtonScript** (1993): Prototype-based inheritance in a practical system + +Here's how Dekorte himself described his motivation: + +> "I wanted a language that was small, simple, and consistent. Something you could understand completely. Most languages accumulate features over time, becoming more complex. I wanted to go the opposite direction—to see how much you could accomplish with how little." + +## The Seven Pillars of Io + +Io rests on seven fundamental concepts. Master these, and you've mastered the language: + +### 1. **Everything is an Object** + +In Java or C++, primitives like integers and booleans aren't objects—they're special cases with different rules. In Io, everything is an object: + +```io +3 type println // Number +"hello" type println // Sequence +true type println // true +method() type println // Block +``` + +Even `true` and `false` are objects. Even methods are objects. This uniformity eliminates countless special cases. + +### 2. **Objects are Collections of Slots** + +An object in Io is essentially a collection of named slots. Each slot can hold any value—data, methods, other objects: + +```io +person := Object clone +person name := "Alice" // data slot +person age := 30 // data slot +person greet := method("Hello!") // method slot +person friend := Object clone // object slot +``` + +Compare this to JavaScript, which has a similar model but complicated by functions, prototypes, constructors, and (now) classes. Io keeps it simple: objects have slots, period. + +### 3. **Computation is Message Passing** + +This is perhaps Io's most radical idea. In most languages, computation involves various mechanisms: + +- Function calls: `sqrt(16)` +- Method invocations: `list.append(5)` +- Operators: `x + y` +- Control structures: `if (x > 0) { ... }` +- Assignment: `x = 5` + +In Io, all of these are just messages sent to objects: + +```io +sqrt(16) // send message "sqrt" with argument 16 to current object +list append(5) // send message "append" with argument 5 to list +x + y // send message "+" with argument y to x +if(x > 0, ...) // send message "if" with arguments to current object +x = 5 // send message "setSlot" to current object +``` + +This uniformity has profound implications we'll explore throughout this book. + +### 4. **Objects Inherit from Prototypes** + +Rather than defining classes as templates for objects, Io uses prototypes—objects that serve as templates for other objects: + +```io +Animal := Object clone +Animal move := method("Moving..." println) + +Dog := Animal clone +Dog bark := method("Woof!" println) + +fido := Dog clone +fido move // "Moving..." (inherited from Animal) +fido bark // "Woof!" (inherited from Dog) +``` + +There's no distinction between "class" and "instance"—just objects cloning other objects. + +### 5. **Differential Inheritance** + +When you clone an object in Io, the new object doesn't copy all the slots from its prototype. Instead, it maintains a reference to its prototype and only stores its differences: + +```io +proto := Object clone +proto x := 10 +proto y := 20 + +child := proto clone +child y = 30 // Only stores the difference + +child x println // 10 (from proto) +child y println // 30 (from child) +``` + +This is memory efficient and enables powerful runtime modifications. + +### 6. **Everything is Modifiable at Runtime** + +In Io, nothing is sacred. You can modify any object at any time, including built-in types: + +```io +Number double := method(self * 2) +5 double println // 10 + +// Even more radical - redefine addition! +Number + := method(n, self * n) +3 + 4 println // 12 (now multiplication!) +``` + +This flexibility enables patterns impossible in more restrictive languages. + +### 7. **Homoiconicity Through Messages** + +Like Lisp, Io code is represented as data structures that can be manipulated by the program itself. But where Lisp uses lists, Io uses messages: + +```io +code := message(1 + 2) +code println // 1 +(2) +code name println // + +code arguments println // list(2) +``` + +This enables powerful metaprogramming without special syntax. + +## Comparing Philosophies + +To understand Io's philosophy, let's contrast it with mainstream languages: + +### Java: Protection Through Types + +```java +public class BankAccount { + private double balance; // Protected from direct access + + public void deposit(double amount) { + if (amount > 0) { + balance += amount; + } + } +} +``` + +Java believes in protection—private fields, type checking, compile-time verification. The compiler prevents mistakes. + +### Python: Practicality and Conventions + +```python +class BankAccount: + def __init__(self): + self._balance = 0 # Convention: _ means "private" + + def deposit(self, amount): + if amount > 0: + self._balance += amount +``` + +Python believes in "we're all consenting adults." Protection through convention, not enforcement. + +### Io: Radical Flexibility + +```io +BankAccount := Object clone +BankAccount balance := 0 +BankAccount deposit := method(amount, + if(amount > 0, balance = balance + amount) +) +``` + +Io believes in complete openness. Any object can be modified by any code at any time. Power with responsibility. + +## The Cost of Simplicity + +Io's radical simplicity comes with trade-offs: + +**Performance**: Without static typing or compile-time optimization, Io can't match the speed of C++ or even JIT-compiled languages like Java. Message passing has overhead. + +**Tool Support**: IDEs can't provide the same level of assistance without static types and fixed class definitions. Refactoring tools are limited. + +**Error Detection**: Many errors that would be caught at compile-time in other languages only surface at runtime in Io. + +**Learning Curve**: Paradoxically, Io's simplicity can make it harder to learn. With fewer built-in concepts, you have to build more from primitives. + +## The Power of Simplicity + +But simplicity also brings power: + +**Understandability**: You can understand the entire language. No edge cases, no historical baggage, no features that interact in surprising ways. + +**Flexibility**: Patterns that require language extensions or complex frameworks in other languages are trivial in Io. + +**Expressiveness**: With everything built from the same primitives, you can create abstractions that feel native to the language. + +**Exploration**: Io is a playground for ideas that would be difficult to explore in more complex languages. + +## A Living Language + +Despite its small community, Io continues to evolve and inspire. Its ideas have influenced: + +- **JavaScript frameworks** that embrace prototype-based patterns +- **Ruby libraries** that use method_missing for DSLs +- **Newer languages** like Factor and Ioke + +More importantly, Io continues to teach programmers that our familiar concepts—classes, types, compilation—are choices, not requirements. + +## What's Next + +In the following chapters, we'll explore Io systematically: + +- First, we'll get Io running and write our first programs +- Then, we'll dive deep into the object model +- We'll explore message passing and method resolution +- We'll see how control structures emerge from simple primitives +- We'll build increasingly sophisticated abstractions +- Finally, we'll tackle advanced topics like concurrency and metaprogramming + +Along the way, we'll constantly compare Io with languages you know, helping you see familiar concepts in a new light. + +Ready to challenge everything you know about objects? Let's begin. + + +--- + + +Source: /Messages-and-Slots/ + +--- +title: Messages and Slots +topTitle: Io +subtitle: "The two mechanisms that drive every computation in Io." +nextSectionLink: true +--- + +At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth. + +## The Anatomy of a Message + +When you write this in Io: + +```io +person setName("Alice") +``` + +What actually happens? Let's break it down: + +1. `person` is the **receiver** - the object receiving the message +2. `setName` is the **message name** (or selector) +3. `"Alice"` is the **argument** to the message +4. The entire expression is a **message send** + +But here's where it gets interesting. Messages are objects too: + +```io +// Create a message object +msg := message(person setName("Alice")) + +// Inspect it +msg name println // setName +msg arguments println // list(Message_0x...) +msg arguments first code println // "Alice" + +// Execute it +msg doInContext(Lobby) // Actually calls person setName("Alice") +``` + +## Slots: The Object's Memory + +Slots are named storage locations in objects. They can hold any value: + +```io +obj := Object clone + +// Create slots with different values +obj number := 42 // Number +obj text := "hello" // String +obj method := method(x, x * 2) // Method +obj child := Object clone // Another object +obj flag := true // Boolean + +// List all slots +obj slotNames println +// list(number, text, method, child, flag) + +// Check for slots +obj hasSlot("number") println // true +obj hasSlot("missing") println // false + +// Get slot values +obj getSlot("number") println // 42 +obj getSlot("method") println // method(x, ...) +``` + +## The Message Resolution Algorithm + +When an object receives a message, Io follows a specific algorithm to find the corresponding slot: + +```io +Animal := Object clone +Animal speak := method("generic sound" println) + +Dog := Animal clone +Dog speak := method("woof" println) +Dog wagTail := method("wagging..." println) + +rover := Dog clone +rover name := "Rover" + +// When rover receives 'speak': +rover speak +// 1. Look for 'speak' in rover - not found +// 2. Look for 'speak' in rover's proto (Dog) - found! +// 3. Execute Dog's speak method with rover as self + +// When rover receives 'name': +rover name +// 1. Look for 'name' in rover - found! +// 2. Return the value + +// Visual representation: +/* + Object + ↑ + Animal (speak: "generic sound") + ↑ + Dog (speak: "woof", wagTail) + ↑ + rover (name: "Rover") +*/ +``` + +## Creating and Modifying Slots + +Io distinguishes between creating new slots and updating existing ones: + +```io +obj := Object clone + +// Create a new slot with := +obj x := 10 +obj hasSlot("x") println // true + +// Update existing slot with = +obj x = 20 +obj x println // 20 + +// Trying to update non-existent slot fails +obj y = 30 // Exception: Slot y not found + +// But you can use setSlot to create or update +obj setSlot("y", 30) // Creates if doesn't exist +obj y println // 30 + +// Remove slots +obj removeSlot("y") +obj hasSlot("y") println // false +``` + +This distinction helps catch typos: + +```io +counter := 0 +countr = 1 // Error! Probably meant 'counter' +``` + +## Methods Are Just Slots + +In Io, methods aren't special—they're just slots that hold executable blocks: + +```io +Calculator := Object clone + +// Method is just a slot containing a method object +Calculator add := method(a, b, a + b) + +// You can manipulate methods like any other value +addMethod := Calculator getSlot("add") +addMethod type println // Block + +// You can copy methods between objects +ScientificCalc := Object clone +ScientificCalc addition := Calculator getSlot("add") +ScientificCalc addition(5, 3) println // 8 + +// You can even store methods in variables +operation := method(x, x * 2) +Calculator double := operation +Calculator double(21) println // 42 +``` + +## The 'self' and 'sender' Context + +Every method has access to special variables: + +```io +Printer := Object clone +Printer name := "HP" +Printer print := method(doc, + ("Printer: " .. self name) println // self = receiver + ("Sender: " .. sender type) println // sender = who sent the message + ("Document: " .. doc) println +) + +Computer := Object clone +Computer sendJob := method( + Printer print("report.pdf") +) + +Computer sendJob +// Printer: HP +// Sender: Computer +// Document: report.pdf +``` + +## Message Forwarding + +When an object doesn't have a slot for a received message, it calls `forward`: + +```io +Proxy := Object clone +Proxy target := nil +Proxy forward := method( + ("Forwarding " .. call message name .. " to target") println + call evalArgAt(0) // This would forward to target +) + +p := Proxy clone +p doSomething("arg") +// Forwarding doSomething to target +``` + +This enables powerful patterns like delegation and method missing: + +```io +// Ruby-style method_missing +DynamicObject := Object clone +DynamicObject forward := method( + methodName := call message name + if(methodName beginsWithSeq("get"), + # Handle getters + property := methodName afterSeq("get") lowercase + self getSlot(property), + # Handle setters + if(methodName beginsWithSeq("set"), + property := methodName afterSeq("set") lowercase + value := call evalArgAt(0) + self setSlot(property, value) + ) + ) +) + +obj := DynamicObject clone +obj setName("Alice") // Creates 'name' slot +obj getName println // "Alice" +``` + +## Lazy Evaluation with Messages + +Messages don't evaluate immediately—they're data structures you can manipulate: + +```io +// Messages as data +expr := message(2 + 3 * 4) +expr println // 2 +(3 *(4)) + +// Evaluate when ready +result := expr doInContext(Lobby) +result println // 14 + +// Modify messages before evaluation +expr := message(x + y) +context := Object clone +context x := 10 +context y := 20 +expr doInContext(context) println // 30 +``` + +This enables macro-like capabilities: + +```io +// Create a timing macro +Object time := method( + code := call argAt(0) // Get the message, not its value + start := Date now + result := code doInContext(call sender) + elapsed := Date now - start + ("Elapsed: " .. elapsed) println + result +) + +// Use it +time( + sum := 0 + for(i, 1, 1000000, sum = sum + i) + sum +) +// Elapsed: 0.234 +// Returns: 500000500000 +``` + +## Call Introspection + +The `call` object provides detailed information about the current method invocation: + +```io +Object debug := method( + "=== Call Debug ===" println + ("Sender: " .. call sender type) println + ("Target: " .. call target type) println + ("Message: " .. call message name) println + ("Args: " .. call message arguments) println + ("Activated: " .. call activated type) println + "================" println +) + +TestObject := Object clone +TestObject test := method( + debug +) + +TestObject test +// === Call Debug === +// Sender: Lobby +// Target: TestObject +// Message: debug +// Args: list() +// Activated: Block +// ================ +``` + +## Operator Messages + +Operators are messages with special precedence rules. Unlike many languages where operators are built-in syntax, in Io they're regular messages that follow configurable precedence levels. This means you can treat operators like any other method - you can override them, create new ones, or call them using regular message passing syntax. + +The OperatorTable manages operator precedence, with levels from 0 (highest) to 13 (lowest). Standard arithmetic follows familiar rules: multiplication and division (level 3) bind tighter than addition and subtraction (level 4). Assignment operators like := and = have the lowest precedence (level 13), ensuring they capture everything to their right. + +```io +// These are equivalent +2 + 3 * 4 +2 +(3 *(4)) + +// You can see the precedence +OperatorTable println + +// You can add custom operators +OperatorTable addOperator("@@", 5) +Number @@ := method(n, + self pow(n) + n pow(self) +) + +2 @@ 3 println // 17 (2^3 + 3^2 = 8 + 9) + +// Operators are just messages +5 send("+", 3) println // 8 +"hello" send("at", 1) println // e +``` + +This unified treatment of operators as messages enables powerful metaprogramming techniques. You can intercept arithmetic operations for logging, create domain-specific operators for mathematical or business logic, or even implement operator overloading for custom types - all using the same message passing mechanism that underlies the entire language. + +## Assignment Messages + +Even assignment is message passing: + +```io +// These are equivalent +x := 10 +setSlot("x", 10) + +// And these +x = 20 +updateSlot("x", 20) + +// You can override assignment behavior +Object setSlot := method(name, value, + ("Setting " .. name .. " to " .. value) println + resend // Call original setSlot +) + +y := 42 +// Setting y to 42 +``` + +## Method Activation vs. Value Access + +Io distinguishes between activatable and non-activatable values: + +```io +obj := Object clone + +// Methods are activatable - they run when accessed +obj greet := method("Hello!" println) +obj greet // Prints "Hello!" + +// Other values are just returned +obj name := "Alice" +obj name // Returns "Alice" + +// You can get a method without activating it +m := obj getSlot("greet") +m println // method(...) + +// And activate it later +m call // Prints "Hello!" + +// Check if something is activatable +obj getSlot("greet") isActivatable println // true +obj getSlot("name") isActivatable println // false +``` + +## Building a Message-Based DSL + +Let's build a simple HTML DSL using messages: + +```io +HTML := Object clone +HTML forward := method( + tagName := call message name + args := call message arguments + + // Build opening tag + result := "<" .. tagName + + // Handle attributes (first arg if it's a Map) + if(args size > 0 and args at(0) name == "curlyBrackets", + attrs := call evalArgAt(0) + attrs foreach(key, value, + result = result .. " " .. key .. "=\"" .. value .. "\"" + ) + args removeFirst + ) + + result = result .. ">" + + // Handle content + args foreach(arg, + content := call sender doMessage(arg) + if(content, result = result .. content) + ) + + // Closing tag + result = result .. "" + result +) + +// Usage +html := HTML clone + +page := html div({ "class": "container" }, + html h1("Welcome"), + html p("This is a paragraph"), + html ul( + html li("Item 1"), + html li("Item 2") + ) +) + +page println +//

Welcome

This is a paragraph

  • Item 1
  • Item 2
+``` + +## Performance Considerations + +Message passing has overhead compared to direct function calls: + +```io +// Traditional method call +obj := Object clone +obj directMethod := method(x, x * 2) + +// Message construction and sending +msg := Message clone setName("directMethod") setArguments(list(Message clone setName("5"))) + +// Benchmark +time( + 100000 times(obj directMethod(5)) +) +// 0.015000 seconds + +time( + 100000 times(obj doMessage(msg)) +) +// 0.048000 seconds + +// Direct calls are ~3x faster, but message objects enable metaprogramming +``` + +## Common Patterns + +Message passing and slot manipulation enable elegant implementations of common design patterns. These patterns leverage Io's dynamic nature to create flexible, maintainable code structures that would require significant boilerplate in more static languages. + +### Property Access Pattern + +This pattern demonstrates how to dynamically generate getters and setters using message construction. Instead of manually writing accessor methods for each property, we use Io's metaprogramming capabilities to create them on demand. The generated methods follow a naming convention where properties are stored with an underscore prefix internally, while the public interface uses clean method names. + +```io +Person := Object clone +Person init := method( + self name := nil + self age := nil + self +) + +// Generate getters/setters with messages +Person addAccessors := method(slotName, + // Getter + self setSlot(slotName, + method(self getSlot("_" .. slotName)) + ) + + // Setter + self setSlot("set" .. slotName asCapitalized, + method(value, self setSlot("_" .. slotName, value)) + ) +) + +Person addAccessors("name") +Person addAccessors("age") + +p := Person clone +p setName("Alice") +p name println // "Alice" +``` + +The beauty of this approach is that it scales effortlessly - adding new properties requires just one line of code per property, and the accessor methods are created with consistent behavior and naming. This pattern is particularly useful when building data models or domain objects where property access needs to be controlled or monitored. + +### Chain of Responsibility + +The Chain of Responsibility pattern creates a pipeline of handlers where each handler decides whether to process a request or pass it to the next handler. In Io, this pattern is particularly clean because message passing naturally supports delegation. Each handler in the chain examines the request and either processes it or forwards it using simple message passing. + +```io +Handler := Object clone +Handler next := nil +Handler handle := method(request, + if(self canHandle(request), + self process(request), + if(next, next handle(request)) + ) +) + +AuthHandler := Handler clone +AuthHandler canHandle := method(request, + request hasSlot("needsAuth") +) +AuthHandler process := method(request, + "Authenticating..." println +) + +LogHandler := Handler clone +LogHandler canHandle := method(request, true) +LogHandler process := method(request, + ("Logging: " .. request type) println +) + +// Build chain +auth := AuthHandler clone +log := LogHandler clone +auth next := log + +// Process requests +request := Object clone +request type := "GET" +request needsAuth := true + +auth handle(request) +// Authenticating... +// Logging: GET +``` + +This pattern is invaluable for building middleware systems, request processors, or event handling pipelines. The chain can be dynamically reconfigured at runtime by simply changing the `next` references, and new handler types can be added without modifying existing code. The pattern also naturally supports optional processing - handlers can choose to stop the chain or allow it to continue based on the request's characteristics. + +## Debugging Messages + +Understanding message flow is crucial for debugging: + +```io +Object trace := method( + self setSlot("forward", + method( + ("Missing: " .. call message name) println + ("Arguments: " .. call message arguments) println + ("Sender: " .. sender type) println + ) + ) + self +) + +buggy := Object clone trace +buggy doSomethingWrong(1, 2, 3) +// Missing: doSomethingWrong +// Arguments: list(1, 2, 3) +// Sender: Lobby +``` + +## Exercises + +1. **Message Logger**: Create a wrapper that logs all messages sent to an object, including arguments and return values. + +2. **Lazy Properties**: Implement properties that are only computed when first accessed, then cached. + +3. **Message Queue**: Build an object that queues messages and executes them later in order. + +4. **Method Decorators**: Create a system for wrapping methods with before/after behavior using messages. + +5. **Message Router**: Build a router that directs messages to different handlers based on patterns. + +## Advanced Message Techniques + +### Message Rewriting + +```io +Rewriter := Object clone +Rewriter forward := method( + msg := call message + + // Rewrite add to multiply + if(msg name == "add", + msg setName("multiply") + ) + + // Continue with modified message + resend +) + +calc := Rewriter clone +calc multiply := method(a, b, a * b) +calc add(3, 4) println // 12 (rewritten to multiply!) +``` + +### Conditional Message Sending + +```io +Object sendIf := method(condition, messageName, + if(condition, + self doMessage(Message clone setName(messageName)) + ) +) + +Object sendUnless := method(condition, messageName, + if(condition not, + self doMessage(Message clone setName(messageName)) + ) +) + +obj := Object clone +obj greet := method("Hello!" println) + +obj sendIf(true, "greet") // Hello! +obj sendUnless(false, "greet") // Hello! +``` + +## Conclusion + +Messages and slots form the foundation of Io's object model. Every computation—from simple arithmetic to complex method calls—is accomplished through message passing. Objects store their state and behavior in slots, and respond to messages by looking up the corresponding slots. + +This uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system. + +Understanding messages and slots deeply is essential to mastering Io. They're not just an implementation detail—they're the conceptual core that makes Io's radical simplicity possible. + + +--- + + +Source: /Metaprogramming/ + +--- +title: Metaprogramming +topTitle: Io +subtitle: "Inspecting, modifying, and generating code at runtime." +nextSectionLink: true +--- + +Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io's powerful metaprogramming capabilities. + +## Messages as Data + +In Io, code is data. Messages are objects you can create, inspect, and manipulate: + +```io +// Create a message from code +msg := message(2 + 3 * 4) + +// Inspect its structure +msg println // 2 +(3 *(4)) +msg name println // + +msg arguments println // list(Message_0x...) +msg arguments at(0) println // 3 *(4) + +// Evaluate it +result := msg doInContext(Lobby) +result println // 14 + +// Modify it +msg setName("*") +msg doInContext(Lobby) println // 6 (now it's 2 * 3 * 4) +``` + +Compare this to Lisp's code-as-data philosophy: + +```lisp +; Lisp +(defparameter code '(+ 2 (* 3 4))) +(eval code) ; 14 +``` + +But Io uses messages instead of lists, which feels more natural for object-oriented code. + +## Building Messages Programmatically + +```io +// Build a message from scratch +msg := Message clone +msg setName("println") +msg setArguments(list(Message clone setName("\"Hello, World!\""))) + +// Execute it +Lobby doMessage(msg) // Hello, World! + +// Build more complex messages +createAdder := method(n, + msg := Message clone setName("+") + msg setArguments(list(Message clone setName(n asString))) + msg +) + +adder5 := createAdder(5) +7 doMessage(adder5) println // 12 +``` + +## Method Introspection + +Methods are objects you can examine and modify: + +```io +obj := Object clone +obj greet := method(name, "Hello, " .. name .. "!") + +// Get the method object +m := obj getSlot("greet") +m type println // Block +m argumentNames println // list(name) +m code println // "Hello, " ..(name) ..("!") + +// Modify method implementation +obj greet = method(name, "Goodbye, " .. name .. "!") +obj greet("World") println // Goodbye, World! + +// Copy methods between objects +other := Object clone +other sayHi := obj getSlot("greet") +other sayHi("Io") println // Goodbye, Io! +``` + +## The call Object + +The `call` object provides runtime context information: + +```io +Object introspect := method( + "=== Call Introspection ===" println + ("Sender: " .. call sender type) println + ("Target: " .. call target type) println + ("Message: " .. call message) println + ("Arguments: " .. call message arguments) println + ("Activated: " .. call activated) println + "========================" println +) + +TestObj := Object clone +TestObj test := method(a, b, + introspect + a + b +) + +TestObj test(5, 3) +// === Call Introspection === +// Sender: Lobby +// Target: TestObj +// Message: introspect +// Arguments: list() +// Activated: method(...) +// ======================== +``` + +## Dynamic Method Creation + +Create methods at runtime: + +```io +// Create getters and setters dynamically +Object addProperty := method(name, defaultValue, + // Create storage slot + self setSlot("_" .. name, defaultValue) + + // Create getter + self setSlot(name, + method(self getSlot("_" .. call message name)) + ) + + // Create setter + self setSlot("set" .. name asCapitalized, + method(value, + self setSlot("_" .. call message name beforeSeq("set") asLowercase, value) + self // For chaining + ) + ) +) + +Person := Object clone +Person addProperty("name", "Unknown") +Person addProperty("age", 0) + +p := Person clone +p setName("Alice") setAge(30) +p name println // Alice +p age println // 30 +``` + +## Method Missing Pattern + +Intercept undefined method calls: + +```io +DynamicObject := Object clone +DynamicObject forward := method( + messageName := call message name + args := call message arguments + + ("Intercepted: " .. messageName) println + ("Arguments: " .. args) println + + // Handle dynamically + if(messageName beginsWithSeq("get"), + property := messageName afterSeq("get") asLowercase + return self getSlot(property) + ) + + if(messageName beginsWithSeq("set"), + property := messageName afterSeq("set") asLowercase + value := call evalArgAt(0) + return self setSlot(property, value) + ) + + Exception raise("Unknown method: " .. messageName) +) + +obj := DynamicObject clone +obj setName("Bob") // Intercepted: setName +obj getName println // Bob +``` + +## Code Generation + +Generate code as strings and evaluate: + +```io +// Generate a class-like structure +generateClass := method(className, properties, + code := className .. " := Object clone\n" + + // Generate init method + code = code .. className .. " init := method(\n" + properties foreach(prop, + code = code .. " self " .. prop .. " := nil\n" + ) + code = code .. " self\n)\n" + + // Generate property accessors + properties foreach(prop, + // Getter + code = code .. className .. " " .. prop .. " := method(_" .. prop .. ")\n" + // Setter + code = code .. className .. " set" .. prop asCapitalized .. " := method(v, _" .. prop .. " = v; self)\n" + ) + + code doString // Evaluate the generated code + Lobby getSlot(className) // Return the created object +) + +// Use the generator +Car := generateClass("Car", list("make", "model", "year")) +myCar := Car clone init +myCar setMake("Toyota") setModel("Camry") setYear(2020) +myCar make println // Toyota +``` + +## Aspect-Oriented Programming + +Implement cross-cutting concerns: + +```io +// Method wrapping for logging +Object addLogging := method(methodName, + original := self getSlot(methodName) + + self setSlot(methodName, method( + ("Calling " .. methodName .. " with args: " .. call message arguments) println + result := nil + e := try(result = original doMessage(call message, call sender)) + if(e, + ("Error in " .. methodName .. ": " .. e message) println + e raise, + ("Returned: " .. result) println + result + ) + )) +) + +Calculator := Object clone +Calculator add := method(a, b, a + b) +Calculator divide := method(a, b, a / b) + +Calculator addLogging("add") +Calculator addLogging("divide") + +Calculator add(5, 3) +// Calling add with args: list(5, 3) +// Returned: 8 + +Calculator divide(10, 0) +// Calling divide with args: list(10, 0) +// Error in divide: divide by zero +``` + +## Macro System + +Io's macros transform code before evaluation: + +```io +// Define a macro +Object unless := macro(condition, action, + // Macros receive unevaluated arguments as messages + // Transform to if(condition not, action) + message(if) setArguments( + list( + message(not) setTarget(condition), + action + ) + ) +) + +// Use the macro +x := 5 +unless(x > 10, "x is not greater than 10" println) +// x is not greater than 10 + +// Timing macro +Object time := macro(code, + // Generate timing code + message(do) setArguments(list( + message(start := Date now), + code, + message(elapsed := Date now - start), + message(("Elapsed: " .. elapsed) println), + message(result) + )) +) + +// Use it +time( + sum := 0 + for(i, 1, 1000000, sum = sum + i) + sum +) +// Elapsed: 0.234 +``` + +## Self-Modifying Code + +Objects can modify their own methods: + +```io +Counter := Object clone +Counter count := 0 +Counter increment := method( + count = count + 1 + + // Self-modify after 5 calls + if(count >= 5, + self increment = method( + Exception raise("Counter limit reached") + ) + ) + + count +) + +c := Counter clone +5 repeat(i, c increment println) // 1, 2, 3, 4, 5 +c increment // Exception: Counter limit reached +``` + +## Reflection API + +Io provides comprehensive reflection capabilities: + +```io +// Object introspection utilities +Object describe := method( + ("Type: " .. self type) println + + "Local Slots:" println + self slotNames sort foreach(name, + value := self getSlot(name) + (" " .. name .. " = " .. value type) println + ) + + "Proto chain:" println + proto := self proto + while(proto and proto != Object, + (" -> " .. proto type) println + proto = proto proto + ) +) + +// Usage +person := Object clone +person name := "Alice" +person age := 30 +person greet := method("Hello!") + +person describe +// Type: Object +// Local Slots: +// age = Number +// greet = Block +// name = Sequence +// Proto chain: +// -> Object +``` + +## DSL Creation with Metaprogramming + +Build domain-specific languages: + +```io +// SQL-like DSL +Table := Object clone +Table columns := list() +Table rows := list() + +Table select := method( + query := SelectQuery clone + query table := self + query +) + +SelectQuery := Object clone +SelectQuery conditions := list() + +SelectQuery where := method( + // Parse conditions from arguments + args := call message arguments + args foreach(arg, + conditions append(arg) + ) + self +) + +SelectQuery execute := method( + table rows select(row, + result := true + conditions foreach(cond, + result = result and cond doInContext(row) + ) + result + ) +) + +// Usage +users := Table clone +users columns = list("name", "age", "city") +users rows = list( + Object clone do(name := "Alice"; age := 30; city := "NYC"), + Object clone do(name := "Bob"; age := 25; city := "LA"), + Object clone do(name := "Charlie"; age := 35; city := "NYC") +) + +results := users select where(age > 25, city == "NYC") execute +results foreach(r, (r name .. ": " .. r age) println) +// Alice: 30 +// Charlie: 35 +``` + +## Performance Profiling + +Use metaprogramming for profiling: + +```io +Profiler := Object clone +Profiler stats := Map clone + +Object profile := method(methodName, + original := self getSlot(methodName) + + self setSlot(methodName, method( + start := Date now + result := original doMessage(call message, call sender) + elapsed := Date now - start + + key := self type .. "::" .. methodName + if(Profiler stats hasKey(key) not, + Profiler stats atPut(key, list(0, 0)) + ) + + stats := Profiler stats at(key) + stats atPut(0, stats at(0) + 1) // Count + stats atPut(1, stats at(1) + elapsed) // Total time + + result + )) +) + +Profiler report := method( + "=== Profiling Report ===" println + stats foreach(key, data, + avg := data at(1) / data at(0) + (key .. ": " .. data at(0) .. " calls, " .. + data at(1) .. "s total, " .. avg .. "s avg") println + ) +) + +// Usage +Math := Object clone +Math factorial := method(n, + if(n <= 1, 1, n * factorial(n - 1)) +) +Math profile("factorial") + +10 repeat(Math factorial(20)) +Profiler report +``` + +## Compile-Time Computation + +Use macros for compile-time optimization: + +```io +// Macro that pre-computes constant expressions +Object precompute := macro(expr, + // If expression contains only literals, evaluate now + result := nil + e := try(result = expr doInContext(Object clone)) + + if(e isNil, + // Successfully evaluated - return literal + Message clone setName(result asString), + // Contains variables - return original + expr + ) +) + +// Usage +x := 10 +y := precompute(5 * 6 + 7) // Computed at parse time +z := precompute(x * 2) // Can't precompute, has variable + +y println // 37 (was precomputed) +``` + +## Method Combination + +Implement method combination patterns: + +```io +// Before/After/Around methods +Object addBefore := method(methodName, beforeBlock, + original := self getSlot(methodName) + self setSlot(methodName, method( + beforeBlock doMessage(call message, call sender) + original doMessage(call message, call sender) + )) +) + +Object addAfter := method(methodName, afterBlock, + original := self getSlot(methodName) + self setSlot(methodName, method( + result := original doMessage(call message, call sender) + afterBlock call(result) + result + )) +) + +Object addAround := method(methodName, aroundBlock, + original := self getSlot(methodName) + self setSlot(methodName, method( + aroundBlock call(original, call message, call sender) + )) +) + +// Usage +BankAccount := Object clone +BankAccount balance := 100 +BankAccount withdraw := method(amount, balance = balance - amount) + +BankAccount addBefore("withdraw", method(amount, + ("Withdrawing " .. amount) println +)) + +BankAccount addAfter("withdraw", method(result, + ("New balance: " .. balance) println +)) + +BankAccount addAround("withdraw", method(original, msg, sender, + amount := msg argAt(0) doInContext(sender) + if(amount > balance, + Exception raise("Insufficient funds"), + original doMessage(msg, sender) + ) +)) + +account := BankAccount clone +account withdraw(50) +// Withdrawing 50 +// New balance: 50 +``` + +## Common Pitfalls + +### Evaluation Context + +```io +// PROBLEM: Wrong context +makeMethod := method(code, + method doString(code) // code evaluates in method's context +) + +obj := Object clone +obj value := 10 +obj badMethod := makeMethod("value * 2") +// obj badMethod // Error: value not found + +// SOLUTION: Use message objects +makeMethod := method(code, + method(code doInContext(self)) +) +``` + +### Performance Impact + +```io +// Metaprogramming has runtime cost +directCall := method(x, x * 2) +dynamicCall := method(x, + msg := Message clone setName("*") setArguments(list(Message clone setName("2"))) + x doMessage(msg) +) + +// directCall is much faster than dynamicCall +``` + +## Exercises + +1. **Memoization Decorator**: Create a decorator that automatically memoizes any method. + +2. **Contract System**: Implement Design by Contract with pre/post conditions. + +3. **Mock Object Generator**: Build a system that generates mock objects for testing. + +4. **Dependency Injection**: Create a DI container using metaprogramming. + +5. **ORM**: Build a simple object-relational mapper that generates methods from table schemas. + +## Real-World Example: ActiveRecord Pattern + +```io +// Simple ActiveRecord implementation +ActiveRecord := Object clone +ActiveRecord tableName := nil +ActiveRecord connection := nil // Database connection + +ActiveRecord findById := method(id, + sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id + row := connection execute(sql) first + if(row, + obj := self clone + row foreach(column, value, + obj setSlot(column, value) + ) + obj + ) +) + +ActiveRecord save := method( + if(hasSlot("id"), + // Update + sql := "UPDATE " .. tableName .. " SET " + updates := list() + slotNames foreach(name, + if(name != "id", + updates append(name .. " = '" .. getSlot(name) .. "'") + ) + ) + sql = sql .. updates join(", ") .. " WHERE id = " .. id + , + // Insert + sql := "INSERT INTO " .. tableName + columns := list() + values := list() + slotNames foreach(name, + columns append(name) + values append("'" .. getSlot(name) .. "'") + ) + sql = sql .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")" + ) + + connection execute(sql) + self +) + +// Generate model from table +generateModel := method(name, table, columns, + model := ActiveRecord clone + model type := name + model tableName = table + + // Add properties + columns foreach(column, + model setSlot(column, nil) + ) + + // Add validations + model validate := method( + // Generated validation code + true + ) + + // Store in Lobby + Lobby setSlot(name, model) + model +) + +// Usage +User := generateModel("User", "users", list("id", "name", "email", "age")) + +user := User clone +user name = "Alice" +user email = "alice@example.com" +user age = 30 +// user save + +foundUser := User findById(1) +``` + +## Conclusion + +Metaprogramming in Io isn't a special feature—it's a natural consequence of the language's design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages. + +The key to effective metaprogramming in Io is understanding that you're not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications. + + +--- + + +Source: /Preface/ + +--- +title: "Preface: Why Io?" +topTitle: Io +subtitle: "Why learn a prototype-based language with a small community? An honest answer." +nextSectionLink: true +--- + +In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer. + +## The Value of Alternative Paradigms + +Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you're writing Java, C#, Python, or Ruby, you're likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought. + +Io offers something different: a pure prototype-based object system where these familiar distinctions dissolve. There are no classes, only objects. There is no separation between data and behavior. Everything—including control structures and operators—is accomplished through message passing between objects. + +Consider this simple comparison. In Python, you might write: + +```python +class Dog: + def __init__(self, name): + self.name = name + + def bark(self): + return f"{self.name} says woof!" + +fido = Dog("Fido") +print(fido.bark()) +``` + +In Io, the same concept looks like this: + +```io +Dog := Object clone +Dog bark := method(name .. " says woof!") + +fido := Dog clone +fido name := "Fido" +fido bark println +``` + +At first glance, this might seem like a minor syntactic difference. But look closer: there's no class definition, no constructor, no special initialization syntax. `Dog` is just an object that we've cloned from the base `Object`. `fido` is just a clone of `Dog`. The simplicity is profound. + +## What You'll Gain + +### 1. **A Deeper Understanding of JavaScript** + +If you've ever been puzzled by JavaScript's prototype chain, or wondered why `typeof null === "object"`, studying Io will illuminate these mysteries. JavaScript's object model is essentially prototype-based (though complicated by the later addition of class syntax), and Io presents these same concepts in a much purer form. + +### 2. **Freedom from Artificial Boundaries** + +In most languages, there's a rigid distinction between what the language provides and what you can build. You can't change how `if` statements work. You can't modify how method calls are resolved. You can't alter fundamental objects. + +In Io, these boundaries don't exist. The `if` statement is just a message sent to an object. Method resolution is customizable. Even basic types like `Number` and `String` can be modified at runtime. This isn't just academically interesting—it enables patterns of expression impossible in more rigid languages. + +### 3. **Appreciation for Message Passing** + +While many languages claim to support "message passing," few take it as seriously as Io. When everything is truly a message—including operators, control flow, and assignment—you begin to see the elegant simplicity possible in language design. This perspective will change how you think about method calls and object interaction in any language. + +### 4. **Metaprogramming Without Magic** + +Languages like Ruby pride themselves on metaprogramming capabilities, but often these features feel like special cases—magic methods, decorators, metaclasses. In Io, metaprogramming isn't a special feature; it's the natural consequence of a simple, consistent object model. When you can inspect and modify any object at runtime, including the objects that define the language itself, metaprogramming becomes straightforward rather than mystical. + +## Who Should Read This Book + +This book assumes you're already a programmer. You should be comfortable with: + +- Basic programming concepts (variables, functions, loops, conditions) +- Object-oriented programming in at least one language +- Using a command line and text editor +- The idea that different languages encourage different ways of thinking + +You don't need to be an expert. In fact, if you've only worked in one or two mainstream languages, you might find Io's different perspective especially valuable. Sometimes, those deeply entrenched in certain paradigms have the most difficulty seeing alternatives. + +## What Makes Io Special + +Steve Dekorte created Io in 2002 with several goals: + +1. **Simplicity** - A minimal syntax with maximum expressiveness +2. **Flexibility** - Everything modifiable at runtime +3. **Uniformity** - One consistent model for everything +4. **Power** - Advanced features like coroutines and actors built-in + +The result is a language that fits in roughly 10,000 lines of C code, yet provides capabilities that mainstream languages achieve only through complex implementations or external libraries. + +## A Language for Learning + +I won't pretend that Io is likely to become your primary development language. Its community is small, its libraries limited, and its performance, while respectable, isn't competitive with systems languages or JIT-compiled platforms. + +But Io excels as a language for *learning*. Its simple, consistent design makes it easy to understand completely. You can hold the entire language in your head. There are no special cases to remember, no historical baggage to work around. When you understand Io's seven basic concepts, you understand the entire language. + +## How to Approach This Book + +As you read, I encourage you to: + +1. **Run every example**. Io's REPL starts instantly and makes experimentation effortless. + +2. **Modify the examples**. What happens if you change this? What if you clone from a different object? What if you override this method? + +3. **Compare with languages you know**. When you see an Io pattern, think about how you'd accomplish the same thing in Python, JavaScript, or Java. What's easier? What's harder? What's impossible? + +4. **Embrace the discomfort**. Some Io concepts will feel alien at first. That's good—it means you're learning something genuinely new. + +## A Personal Note + +I've been programming for [X] years and have worked in dozens of languages. Most taught me new syntax or libraries. Io taught me new ways to think. It challenged assumptions I didn't know I had. It showed me that many "fundamental" concepts in programming are actually just design choices, and different choices lead to different possibilities. + +Whether you spend a weekend or a month with Io, I believe you'll emerge a better programmer. Not because you'll use Io in production (though you might), but because you'll have a broader perspective on what programming languages can be. + +Let's begin. + + +--- + + +Source: /Prototypes-Not-Classes/ + +--- +title: Prototypes, Not Classes +topTitle: Io +subtitle: "How Io replaces classes and instances with a single uniform notion of object." +nextSectionLink: true +--- + +Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There's a fundamental distinction between the template (class) and the things created from it (instances). + +Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs. + +## The Class-Based World + +Let's start with what you probably know. In a class-based language like Java: + +```java +// Define a class (template) +class Animal { + String name; + + void speak() { + System.out.println("Some sound"); + } +} + +// Define a subclass +class Dog extends Animal { + void speak() { + System.out.println("Woof!"); + } +} + +// Create instances +Dog fido = new Dog(); +Dog rover = new Dog(); +``` + +The key points: +- `Animal` and `Dog` are classes (templates) +- `fido` and `rover` are instances (objects) +- Classes and instances are fundamentally different things +- Inheritance happens between classes + +## The Prototype-Based World + +In Io, there are no classes: + +```io +// Create an object to serve as a prototype +Animal := Object clone +Animal speak := method("Some sound" println) + +// Create another object using Animal as a prototype +Dog := Animal clone +Dog speak := method("Woof!" println) + +// Create more objects using Dog as a prototype +fido := Dog clone +rover := Dog clone +``` + +The key differences: +- `Animal`, `Dog`, `fido`, and `rover` are all objects +- No fundamental distinction between "classes" and "instances" +- Objects are created by cloning other objects +- Any object can serve as a prototype for other objects + +## Understanding Cloning + +When you clone an object in Io, you don't copy all its slots. Instead, you create a new, empty object that maintains a reference to its prototype: + +```io +Animal := Object clone +Animal name := "Generic Animal" +Animal speak := method(name println) + +dog := Animal clone + +// dog doesn't have its own 'name' slot +dog hasLocalSlot("name") println // false + +// But it can access 'name' through its prototype +dog name println // "Generic Animal" + +// Now give dog its own name +dog name = "Fido" +dog hasLocalSlot("name") println // true +dog name println // "Fido" + +// Animal's name is unchanged +Animal name println // "Generic Animal" +``` + +This is called **differential inheritance**—objects only store their differences from their prototypes. + +## The Prototype Chain + +When you send a message to an object, Io looks for a matching slot: +1. First in the object itself +2. Then in its prototype +3. Then in the prototype's prototype +4. And so on until it reaches Object + +```io +// Create a chain of prototypes +Organism := Object clone +Organism live := method("Living..." println) + +Animal := Organism clone +Animal move := method("Moving..." println) + +Dog := Animal clone +Dog bark := method("Woof!" println) + +fido := Dog clone +fido name := "Fido" + +// fido can access methods from anywhere in the chain +fido live // "Living..." (from Organism) +fido move // "Moving..." (from Animal) +fido bark // "Woof!" (from Dog) + +// You can inspect the chain +fido proto == Dog println // true +fido proto proto == Animal println // true +fido proto proto proto == Organism println // true +``` + +## Dynamic Prototype Modification + +Since prototypes are just objects, you can modify them at runtime, and all objects using that prototype see the changes: + +```io +Dog := Object clone +fido := Dog clone +rover := Dog clone + +// Add a method to Dog +Dog bark := method("Woof!" println) + +// Both fido and rover can now bark +fido bark // "Woof!" +rover bark // "Woof!" + +// Modify the method +Dog bark = method("WOOF! WOOF!" println) + +// The change affects all dogs +fido bark // "WOOF! WOOF!" +rover bark // "WOOF! WOOF!" +``` + +Try doing that with classes in Java! You'd need complex reflection APIs, and even then, you couldn't modify existing instances. + +## Multiple Prototypes + +Io supports multiple inheritance through its `Protos` list: + +```io +// Create two prototypes +Flyable := Object clone +Flyable fly := method("Flying..." println) + +Swimmable := Object clone +Swimmable swim := method("Swimming..." println) + +// Create an object with multiple prototypes +Duck := Object clone +Duck appendProto(Flyable) +Duck appendProto(Swimmable) + +mallard := Duck clone +mallard fly // "Flying..." +mallard swim // "Swimming..." + +// Inspect the prototype list +Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) +``` + +The search order for slots is depth-first through the `Protos` list. + +## Comparing Approaches: Class vs Prototype + +Let's implement the same concept in both paradigms to see the differences. + +### Class-Based (Python) + +```python +class Shape: + def __init__(self): + self.x = 0 + self.y = 0 + + def move(self, dx, dy): + self.x += dx + self.y += dy + +class Circle(Shape): + def __init__(self, radius): + super().__init__() + self.radius = radius + + def area(self): + return 3.14159 * self.radius ** 2 + +# Usage +circle = Circle(5) +circle.move(10, 20) +print(circle.area()) + +# Can't easily create a one-off variation +# Would need to define a new class +``` + +### Prototype-Based (Io) + +```io +Shape := Object clone +Shape x := 0 +Shape y := 0 +Shape move := method(dx, dy, + x = x + dx + y = y + dy +) + +Circle := Shape clone +Circle radius := 0 +Circle area := method( + 3.14159 * radius * radius +) + +// Usage +circle := Circle clone +circle radius = 5 +circle move(10, 20) +circle area println + +// Easy to create one-off variations +specialCircle := Circle clone +specialCircle area = method( + "Special area: " print + resend // Call the original method +) +specialCircle area // "Special area: 78.53975" +``` + +## The Power of Prototypes + +### 1. Objects as Classes + +In Io, objects can act as classes when needed: + +```io +// Person acts like a class +Person := Object clone +Person init := method( + self name := "Unknown" + self age := 0 + self +) + +Person create := method(n, a, + clone init name = n age = a +) + +// Usage feels class-like +alice := Person create("Alice", 30) +bob := Person create("Bob", 25) +``` + +### 2. One-Off Objects + +You can create unique objects without defining a "class": + +```io +// Create a unique object with no "class" +singleton := Object clone +singleton data := Map clone +singleton store := method(key, value, + data atPut(key, value) +) +singleton retrieve := method(key, + data at(key) +) + +// Use it directly +singleton store("user", "Alice") +singleton retrieve("user") println // "Alice" +``` + +### 3. Runtime Class Modification + +You can fundamentally change what a "class" does: + +```io +Number := Object clone +Number value := 0 +Number + := method(n, + result := Number clone + result value = self value + n value + result +) + +// Create numbers +five := Number clone value = 5 +three := Number clone value = 3 + +// Now change how Number works +Number + = method(n, + result := Number clone + result value = self value * n value // Multiply instead! + result +) + +// Existing numbers use the new behavior +eight := five + three +eight value println // 15 (multiplication!) +``` + +## Delegation vs Inheritance + +Prototype-based languages use delegation rather than inheritance. When an object doesn't have a slot, it delegates to its prototype: + +```io +Account := Object clone +Account balance := 0 +Account deposit := method(amount, + balance = balance + amount + self +) + +savings := Account clone +savings deposit(100) + +// Let's trace what happens: +// 1. savings receives 'deposit' message +// 2. savings doesn't have 'deposit' slot +// 3. savings delegates to Account +// 4. Account's deposit method runs +// 5. But 'self' is still savings +// 6. So savings's balance is updated + +savings balance println // 100 +Account balance println // 0 (unchanged) +``` + +This is subtly different from class-based inheritance where methods are copied or looked up in a class hierarchy. + +## Practical Patterns + +### The Constructor Pattern + +While Io doesn't have constructors, you can create them: + +```io +Person := Object clone +Person init := method(name, age, + self name := name + self age := age + self +) + +Person new := method(name, age, + self clone init(name, age) +) + +// Usage +alice := Person new("Alice", 30) +``` + +### The Mixin Pattern + +Use prototypes as mixins for shared behavior: + +```io +// Define mixins +Timestamped := Object clone +Timestamped createdAt := Date now +Timestamped age := method( + Date now - createdAt +) + +Serializable := Object clone +Serializable toJson := method( + // Implementation +) + +// Use mixins +Document := Object clone +Document appendProto(Timestamped) +Document appendProto(Serializable) + +doc := Document clone +doc age println +doc toJson +``` + +### The Factory Pattern + +Objects can create other objects with specific configurations: + +```io +ShapeFactory := Object clone +ShapeFactory circle := method(radius, + c := Object clone + c radius := radius + c area := method(3.14159 * radius * radius) + c +) + +ShapeFactory rectangle := method(width, height, + r := Object clone + r width := width + r height := height + r area := method(width * height) + r +) + +// Usage +myCircle := ShapeFactory circle(5) +myRect := ShapeFactory rectangle(10, 20) +``` + +## JavaScript: A Familiar Prototype System + +If you know JavaScript, you've already used prototype-based programming: + +```javascript +// JavaScript (before ES6 classes) +function Animal(name) { + this.name = name; +} + +Animal.prototype.speak = function() { + console.log("Some sound"); +}; + +function Dog(name) { + Animal.call(this, name); +} + +Dog.prototype = Object.create(Animal.prototype); +Dog.prototype.bark = function() { + console.log("Woof!"); +}; +``` + +But JavaScript complicated things with constructor functions and later added class syntax as sugar. Io keeps prototypes pure and simple. + +## Common Misconceptions + +### "No Classes Means No Structure" + +False. You can create well-structured programs with prototypes: + +```io +// Define clear prototype hierarchies +Vehicle := Object clone +Vehicle speed := 0 + +Car := Vehicle clone +Car wheels := 4 + +ElectricCar := Car clone +ElectricCar batteryLevel := 100 + +// The structure is clear and maintainable +``` + +### "Prototypes Are Just Classes With Different Syntax" + +False. Prototypes are more flexible: + +```io +// Start with a prototype +Dog := Object clone +Dog bark := method("Woof!" println) + +fido := Dog clone + +// Later, change fido's prototype! +Cat := Object clone +Cat meow := method("Meow!" println) + +fido protos = list(Cat) +fido meow // "Meow!" - fido is now a cat! +``` + +You can't change an object's class at runtime in most class-based languages. + +### "Multiple Inheritance Is Always Confusing" + +Io's prototype lists make multiple inheritance explicit and controllable: + +```io +A := Object clone +A foo := method("A's foo" println) + +B := Object clone +B foo := method("B's foo" println) + +C := Object clone +C appendProto(A) +C appendProto(B) + +C foo // "A's foo" (A comes first in the list) + +// Reorder to change priority +C protos = list(B, A) +C foo // "B's foo" (B now comes first) +``` + +## Exercises + +1. **Prototype Chain Explorer**: Write a method that prints an object's complete prototype chain with indentation showing the hierarchy. + +2. **Class Emulator**: Create a `Class` object that provides `new`, `extends`, and other class-like conveniences while using prototypes underneath. + +3. **Multiple Inheritance Diamond**: Create a diamond inheritance pattern (D inherits from B and C, which both inherit from A) and explore how Io resolves method conflicts. + +4. **Dynamic Reclassing**: Write a `become` method that changes an object's prototype chain to make it "become" an instance of a different prototype. + +5. **Prototype Versioning**: Implement a system where objects can "lock" to a specific version of their prototype, unaffected by later prototype modifications. + +## Real-World Implications + +Prototype-based programming shines in certain scenarios: + +1. **Rapid Prototyping**: Create and modify objects on the fly without defining classes +2. **Dynamic Systems**: Systems where object behavior needs to change at runtime +3. **DSLs**: Domain-specific languages where objects morph based on context +4. **Learning**: Understanding prototypes deepens your understanding of JavaScript +5. **Simplicity**: No distinction between classes and objects means fewer concepts + +## Conclusion + +Prototype-based programming isn't just "classes with different syntax"—it's a fundamentally different way of thinking about objects and inheritance. Instead of rigid templates (classes) and instances, you have a fluid world where any object can serve as a template for others, where inheritance is delegation, and where the structure of your program can change at runtime. + +This flexibility can be overwhelming at first, especially if you're used to the safety of static classes. But it can also be liberating. You're not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows. + +In the next chapter, we'll dive deeper into how objects communicate through Io's message passing system—the heartbeat of the language. + + +--- + + +Source: /Real-World-Patterns/ + +--- +title: Real-World Patterns +topTitle: Io +subtitle: "Architectures and patterns for building substantial applications in Io." +nextSectionLink: true +--- + +After exploring Io's features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We'll see how Io's unique features enable elegant solutions to common programming challenges. + +## Model-View-Controller (MVC) + +Implementing MVC in Io leverages prototypes and message passing: + +```io +// Model +Model := Object clone +Model init := method( + self observers := list() + self data := Map clone + self +) + +Model set := method(key, value, + oldValue := data at(key) + if(oldValue != value, + data atPut(key, value) + notifyObservers(key, oldValue, value) + ) + self +) + +Model get := method(key, + data at(key) +) + +Model observe := method(observer, + observers append(observer) + self +) + +Model notifyObservers := method(key, oldValue, newValue, + observers foreach(observer, + if(observer hasSlot("modelChanged"), + observer modelChanged(self, key, oldValue, newValue) + ) + ) +) + +// View +View := Object clone +View init := method(model, + self model := model + model observe(self) + self elements := Map clone + self +) + +View modelChanged := method(model, key, oldValue, newValue, + render +) + +View render := method( + // Override in subclasses +) + +// Controller +Controller := Object clone +Controller init := method(model, view, + self model := model + self view := view + self +) + +Controller handleInput := method(input, + // Process input and update model +) + +// Example: Todo MVC +TodoModel := Model clone +TodoModel init := method( + resend + self set("todos", list()) + self +) + +TodoModel addTodo := method(text, + todos := get("todos") copy + todos append(Map with("text", text, "done", false)) + set("todos", todos) +) + +TodoModel toggleTodo := method(index, + todos := get("todos") copy + todo := todos at(index) + todo atPut("done", todo at("done") not) + set("todos", todos) +) + +TodoView := View clone +TodoView render := method( + "=== Todo List ===" println + model get("todos") foreach(i, todo, + status := if(todo at("done"), "[✓]", "[ ]") + (i .. ". " .. status .. " " .. todo at("text")) println + ) + "================" println +) + +TodoController := Controller clone +TodoController processCommand := method(cmd, + parts := cmd split(" ") + action := parts at(0) + + if(action == "add", + text := parts slice(1) join(" ") + model addTodo(text) + ) + + if(action == "toggle", + index := parts at(1) asNumber + model toggleTodo(index) + ) + + if(action == "quit", + System exit + ) +) + +// Usage +app := Object clone +app model := TodoModel clone init +app view := TodoView clone init(app model) +app controller := TodoController clone init(app model, app view) + +app view render +// Simulate commands +app controller processCommand("add Buy groceries") +app controller processCommand("add Write documentation") +app controller processCommand("toggle 0") +``` + +## Repository Pattern + +Abstracting data access: + +```io +// Base Repository +Repository := Object clone +Repository init := method( + self storage := list() + self nextId := 1 + self +) + +Repository save := method(entity, + if(entity hasSlot("id") not or entity id isNil, + entity id := nextId + nextId = nextId + 1 + storage append(entity) + , + // Update existing + index := storage detectIndex(e, e id == entity id) + if(index, storage atPut(index, entity)) + ) + entity +) + +Repository findById := method(id, + storage detect(e, e id == id) +) + +Repository findAll := method( + storage copy +) + +Repository delete := method(entity, + storage remove(entity) +) + +Repository where := method(predicate, + storage select(predicate) +) + +// Specialized repository with persistence +FileRepository := Repository clone +FileRepository filename := "data.json" + +FileRepository init := method( + resend + load + self +) + +FileRepository load := method( + if(File with(filename) exists, + data := File with(filename) contents parseJson + storage = data map(item, entityFromMap(item)) + nextId = storage map(e, e id) max + 1 + ) +) + +FileRepository save := method(entity, + resend(entity) + persist + entity +) + +FileRepository persist := method( + data := storage map(e, e asMap) + File with(filename) openForWriting write(data asJson) close +) + +// Entity +User := Object clone +User init := method(name, email, + self id := nil + self name := name + self email := email + self createdAt := Date now + self +) + +User asMap := method( + Map with( + "id", id, + "name", name, + "email", email, + "createdAt", createdAt asString + ) +) + +// Usage +userRepo := FileRepository clone init + +user1 := User clone init("Alice", "alice@example.com") +user2 := User clone init("Bob", "bob@example.com") + +userRepo save(user1) +userRepo save(user2) + +found := userRepo findById(1) +active := userRepo where(u, u createdAt > Date now - Duration days(30)) +``` + +## Observer Pattern + +Native implementation using Io's message passing: + +```io +Observable := Object clone +Observable init := method( + self observers := Map clone + self +) + +Observable on := method(event, observer, methodName, + if(observers hasKey(event) not, + observers atPut(event, list()) + ) + observers at(event) append(list(observer, methodName)) + self +) + +Observable off := method(event, observer, + if(observers hasKey(event), + observers at(event) := observers at(event) reject(pair, + pair at(0) == observer + ) + ) + self +) + +Observable emit := method(event, + args := call message arguments slice(1) + + if(observers hasKey(event), + observers at(event) foreach(pair, + observer := pair at(0) + methodName := pair at(1) + + msg := Message clone setName(methodName) + args foreach(arg, msg appendArg(arg)) + + observer doMessage(msg) + ) + ) + self +) + +// Example: Stock price monitor +Stock := Observable clone +Stock init := method(symbol, price, + resend + self symbol := symbol + self price := price + self +) + +Stock setPrice := method(newPrice, + oldPrice := price + price = newPrice + + change := ((newPrice - oldPrice) / oldPrice * 100) round + emit("priceChanged", symbol, oldPrice, newPrice, change) + + if(change abs > 5, + emit("largeMoveDetected", symbol, change) + ) +) + +StockAlert := Object clone +StockAlert onPriceChange := method(symbol, oldPrice, newPrice, change, + ("Price alert: " .. symbol .. " moved from $" .. oldPrice .. + " to $" .. newPrice .. " (" .. change .. "%)") println +) + +StockAlert onLargeMove := method(symbol, change, + ("⚠️ Large move detected: " .. symbol .. " changed " .. change .. "%") println +) + +// Usage +apple := Stock clone init("AAPL", 150.00) +alert := StockAlert clone + +apple on("priceChanged", alert, "onPriceChange") +apple on("largeMoveDetected", alert, "onLargeMove") + +apple setPrice(155.00) // Normal change +apple setPrice(165.00) // Large move triggers both alerts +``` + +## Dependency Injection + +Using Io's dynamic nature for DI: + +```io +// DI Container +Container := Object clone +Container init := method( + self services := Map clone + self singletons := Map clone + self +) + +Container register := method(name, factory, + services atPut(name, factory) + self +) + +Container singleton := method(name, factory, + services atPut(name, factory) + singletons atPut(name, nil) + self +) + +Container get := method(name, + if(services hasKey(name) not, + Exception raise("Service '" .. name .. "' not registered") + ) + + // Check if singleton + if(singletons hasKey(name), + if(singletons at(name) isNil, + singletons atPut(name, services at(name) call(self)) + ) + return singletons at(name) + ) + + // Regular service + services at(name) call(self) +) + +// Services +Logger := Object clone +Logger init := method(output, + self output := output + self +) +Logger log := method(message, + output write("[" .. Date now .. "] " .. message .. "\n") +) + +Database := Object clone +Database init := method(connectionString, logger, + self connectionString := connectionString + self logger := logger + logger log("Database initialized: " .. connectionString) + self +) + +UserService := Object clone +UserService init := method(database, logger, + self database := database + self logger := logger + self +) +UserService createUser := method(name, + logger log("Creating user: " .. name) + // database operations... + Map with("id", 1, "name", name) +) + +// Configure container +container := Container clone init + +container singleton("logger", block(c, + Logger clone init(File standardOutput) +)) + +container singleton("database", block(c, + Database clone init("postgres://localhost/myapp", c get("logger")) +)) + +container register("userService", block(c, + UserService clone init(c get("database"), c get("logger")) +)) + +// Usage +service := container get("userService") +service createUser("Alice") + +// Different instance each time +service1 := container get("userService") +service2 := container get("userService") +(service1 == service2) println // false + +// Same logger instance +logger1 := container get("logger") +logger2 := container get("logger") +(logger1 == logger2) println // true +``` + +## Strategy Pattern + +Leveraging blocks and dynamic dispatch: + +```io +// Sorting strategies +SortStrategy := Object clone + +BubbleSort := SortStrategy clone +BubbleSort execute := method(list, + result := list copy + n := result size + + for(i, 0, n - 2, + for(j, 0, n - i - 2, + if(result at(j) > result at(j + 1), + temp := result at(j) + result atPut(j, result at(j + 1)) + result atPut(j + 1, temp) + ) + ) + ) + result +) + +QuickSort := SortStrategy clone +QuickSort execute := method(list, + if(list size <= 1, return list) + + pivot := list at(list size / 2) + less := list select(x, x < pivot) + equal := list select(x, x == pivot) + greater := list select(x, x > pivot) + + execute(less) appendSeq(equal) appendSeq(execute(greater)) +) + +// Context +DataProcessor := Object clone +DataProcessor init := method( + self strategy := QuickSort + self +) + +DataProcessor setStrategy := method(s, + strategy = s + self +) + +DataProcessor process := method(data, + "Processing data..." println + strategy execute(data) +) + +// Usage with different strategies +processor := DataProcessor clone init + +data := list(3, 1, 4, 1, 5, 9, 2, 6) + +processor setStrategy(BubbleSort) process(data) println +processor setStrategy(QuickSort) process(data) println + +// Dynamic strategy selection +selectStrategy := method(dataSize, + if(dataSize < 10, BubbleSort, QuickSort) +) + +processor setStrategy(selectStrategy(data size)) +``` + +## Chain of Responsibility + +Building processing pipelines: + +```io +Handler := Object clone +Handler init := method( + self next := nil + self +) + +Handler setNext := method(handler, + next = handler + handler +) + +Handler handle := method(request, + if(canHandle(request), + process(request), + if(next, next handle(request), nil) + ) +) + +// Concrete handlers +AuthenticationHandler := Handler clone +AuthenticationHandler canHandle := method(request, + request at("requiresAuth") +) +AuthenticationHandler process := method(request, + if(request at("token") == "valid-token", + "Authentication successful" println + request atPut("authenticated", true) + if(next, next handle(request), request) + , + Exception raise("Authentication failed") + ) +) + +LoggingHandler := Handler clone +LoggingHandler canHandle := method(request, true) +LoggingHandler process := method(request, + ("Logging request: " .. request at("path")) println + if(next, next handle(request), request) +) + +RateLimitHandler := Handler clone +RateLimitHandler init := method( + resend + self requests := Map clone + self limit := 10 + self window := 60 // seconds + self +) +RateLimitHandler canHandle := method(request, + request hasKey("clientId") +) +RateLimitHandler process := method(request, + clientId := request at("clientId") + now := Date now + + if(requests hasKey(clientId) not, + requests atPut(clientId, list()) + ) + + // Clean old requests + clientRequests := requests at(clientId) select(time, + now - time < window + ) + + if(clientRequests size >= limit, + Exception raise("Rate limit exceeded"), + clientRequests append(now) + requests atPut(clientId, clientRequests) + if(next, next handle(request), request) + ) +) + +// Build chain +chain := LoggingHandler clone \ + setNext(RateLimitHandler clone \ + setNext(AuthenticationHandler clone)) + +// Process requests +request := Map with( + "path", "/api/users", + "clientId", "client-123", + "requiresAuth", true, + "token", "valid-token" +) + +result := chain handle(request) +``` + +## Plugin Architecture + +Dynamic loading and extension: + +```io +PluginManager := Object clone +PluginManager init := method( + self plugins := Map clone + self hooks := Map clone + self +) + +PluginManager registerHook := method(name, + if(hooks hasKey(name) not, + hooks atPut(name, list()) + ) + self +) + +PluginManager loadPlugin := method(path, + plugin := doFile(path) + + if(plugin hasSlot("name") not, + Exception raise("Plugin must have a name") + ) + + plugins atPut(plugin name, plugin) + + if(plugin hasSlot("init"), + plugin init(self) + ) + + ("Plugin loaded: " .. plugin name) println + self +) + +PluginManager hook := method(name, + args := call message arguments slice(1) + results := list() + + if(hooks hasKey(name), + hooks at(name) foreach(handler, + result := handler doMessage(Message clone setName("call") setArguments(args)) + results append(result) + ) + ) + + results +) + +PluginManager addHook := method(hookName, handler, + if(hooks hasKey(hookName) not, + registerHook(hookName) + ) + hooks at(hookName) append(handler) + self +) + +// Example plugin +MarkdownPlugin := Object clone +MarkdownPlugin name := "markdown" +MarkdownPlugin init := method(manager, + manager addHook("processText", block(text, + // Simple markdown processing + text replaceAllRegex("\\*\\*(.*?)\\*\\*", "$1") \ + replaceAllRegex("\\*(.*?)\\*", "$1") + )) + + manager addHook("getFormats", block( + list("markdown", "md") + )) +) + +// Usage +manager := PluginManager clone init +manager registerHook("processText") +manager registerHook("getFormats") + +// Load plugins +manager loadPlugin("markdown_plugin.io") + +// Use hooks +text := "This is **bold** and this is *italic*" +processed := manager hook("processText", text) +processed foreach(result, result println) + +formats := manager hook("getFormats") +"Supported formats: " print +formats flatten unique println +``` + +## Event Sourcing + +Implementing event-driven architecture: + +```io +// Event +Event := Object clone +Event init := method(type, data, + self type := type + self data := data + self timestamp := Date now + self id := Random uuid + self +) + +// Event Store +EventStore := Object clone +EventStore init := method( + self events := list() + self snapshots := Map clone + self +) + +EventStore append := method(event, + events append(event) + self +) + +EventStore getEvents := method(afterId, + if(afterId isNil, + return events + ) + + startIndex := events detectIndex(e, e id == afterId) + if(startIndex, + events slice(startIndex + 1), + list() + ) +) + +// Aggregate +Aggregate := Object clone +Aggregate init := method(id, + self id := id + self version := 0 + self uncommittedEvents := list() + self +) + +Aggregate applyEvent := method(event, + // Override in subclasses +) + +Aggregate raiseEvent := method(event, + applyEvent(event) + uncommittedEvents append(event) + version = version + 1 +) + +Aggregate markEventsAsCommitted := method( + uncommittedEvents = list() +) + +Aggregate loadFromHistory := method(events, + events foreach(event, + applyEvent(event) + version = version + 1 + ) +) + +// Example: Bank Account aggregate +BankAccount := Aggregate clone +BankAccount init := method(id, + resend(id) + self balance := 0 + self +) + +BankAccount deposit := method(amount, + if(amount <= 0, + Exception raise("Amount must be positive") + ) + + raiseEvent(Event clone init("MoneyDeposited", + Map with("accountId", id, "amount", amount))) +) + +BankAccount withdraw := method(amount, + if(amount <= 0, + Exception raise("Amount must be positive") + ) + if(amount > balance, + Exception raise("Insufficient funds") + ) + + raiseEvent(Event clone init("MoneyWithdrawn", + Map with("accountId", id, "amount", amount))) +) + +BankAccount applyEvent := method(event, + if(event type == "MoneyDeposited", + balance = balance + event data at("amount") + ) + + if(event type == "MoneyWithdrawn", + balance = balance - event data at("amount") + ) +) + +// Repository using event sourcing +AccountRepository := Object clone +AccountRepository init := method(eventStore, + self eventStore := eventStore + self +) + +AccountRepository save := method(account, + account uncommittedEvents foreach(event, + eventStore append(event) + ) + account markEventsAsCommitted +) + +AccountRepository getById := method(id, + events := eventStore getEvents select(e, + e data at("accountId") == id + ) + + account := BankAccount clone init(id) + account loadFromHistory(events) + account +) + +// Usage +store := EventStore clone init +repo := AccountRepository clone init(store) + +account := BankAccount clone init("acc-123") +account deposit(100) +account withdraw(30) +account deposit(50) + +repo save(account) +account balance println // 120 + +// Rebuild from events +rebuilt := repo getById("acc-123") +rebuilt balance println // 120 +``` + +## Caching Strategy + +Multi-level caching with different policies: + +```io +Cache := Object clone +Cache init := method(maxSize, ttl, + self maxSize := maxSize + self ttl := ttl // Time to live in seconds + self entries := Map clone + self accessOrder := list() + self +) + +Cache get := method(key, + if(entries hasKey(key), + entry := entries at(key) + + // Check TTL + if(Date now - entry at("time") > ttl, + entries removeAt(key) + accessOrder remove(key) + return nil + ) + + // Update access order (LRU) + accessOrder remove(key) + accessOrder append(key) + + entry at("value") + , + nil + ) +) + +Cache put := method(key, value, + // Evict if necessary + while(entries size >= maxSize, + evictKey := accessOrder removeFirst + entries removeAt(evictKey) + ("Cache evicted: " .. evictKey) println + ) + + entries atPut(key, Map with( + "value", value, + "time", Date now + )) + accessOrder append(key) + + value +) + +Cache getOrCompute := method(key, computeBlock, + value := get(key) + if(value isNil, + value = computeBlock call + put(key, value) + ) + value +) + +// Multi-level cache +MultiLevelCache := Object clone +MultiLevelCache init := method( + self l1 := Cache clone init(10, 60) // Small, fast, 1 minute TTL + self l2 := Cache clone init(100, 600) // Larger, 10 minute TTL + self +) + +MultiLevelCache get := method(key, + // Check L1 + value := l1 get(key) + if(value, return value) + + // Check L2 + value = l2 get(key) + if(value, + l1 put(key, value) // Promote to L1 + return value + ) + + nil +) + +MultiLevelCache put := method(key, value, + l1 put(key, value) + l2 put(key, value) + value +) + +// Usage with expensive computation +fibonacci := Object clone +fibonacci cache := MultiLevelCache clone init + +fibonacci compute := method(n, + if(n <= 1, return n) + + cache get(n) ifNil( + ("Computing fib(" .. n .. ")") println + result := compute(n - 1) + compute(n - 2) + cache put(n, result) + result + ) +) + +fibonacci compute(10) println // Computes +fibonacci compute(10) println // From cache +``` + +## Conclusion + +These patterns demonstrate how Io's features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language's flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code. + +The key insight is that Io's uniform object model means patterns aren't special constructs but natural expressions of the language's core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches. diff --git a/llms.txt b/llms.txt new file mode 100644 index 0000000..b4eaf3b --- /dev/null +++ b/llms.txt @@ -0,0 +1,80 @@ +# Io + +> A comprehensive guide to prototype-based programming with Io. + +## Blocks and Closures + +- [Blocks and Closures](/Blocks-and-Closures/): First-class code as objects that capture their lexical environment. + +## C Integration + +- [C Integration](/C-Integration/): Embedding Io in C and extending Io with high-performance C addons. + +## Case Studies + +- [Case Studies](/Case-Studies/): Complete Io programs that bring the language's features together. + +## Cloning and Inheritance + +- [Cloning and Inheritance](/Cloning-and-Inheritance/): How inheritance chains emerge from the simpler operation of cloning. + +## Collections + +- [Collections](/Collections/): Lists, Maps, and Sequences: Io's core data structures and how to extend them. + +## Conclusion: The Io Way + +- [Conclusion: The Io Way](/Conclusion/): What Io teaches about simplicity, uniformity, and the design of programming languages. + +## Concurrency + +- [Concurrency](/Concurrency/): Coroutines, actors, and futures for cooperative and message-passing concurrency. + +## Control Flow + +- [Control Flow](/Control-Flow/): if, while, for, and friends are just methods—and you can write your own. + +## Domain-Specific Languages + +- [Domain-Specific Languages](/Domain-Specific-Languages/): Using Io's minimal syntax and metaprogramming to design expressive DSLs. + +## Ecosystem and Libraries + +- [Ecosystem and Libraries](/Ecosystem-and-Libraries/): The available libraries, tools, and community resources around Io. + +## Everything is an Object + +- [Everything is an Object](/Everything-is-an-Object/): What it really means when every value—numbers, booleans, methods—is an object. + +## Exceptions + +- [Exceptions](/Exceptions/): Error handling built, like everything else, from objects and messages. + +## Getting Started with Io + +- [Getting Started with Io](/Getting-Started/): Install Io, explore the REPL, and write your first programs. + +## Introduction: The Philosophy of Io + +- [Introduction: The Philosophy of Io](/Introduction/): The history, philosophy, and seven pillars behind Io's radical simplicity. + +## Messages and Slots + +- [Messages and Slots](/Messages-and-Slots/): The two mechanisms that drive every computation in Io. + +## Metaprogramming + +- [Metaprogramming](/Metaprogramming/): Inspecting, modifying, and generating code at runtime. + +## Preface: Why Io? + +- [Preface: Why Io?](/Preface/): Why learn a prototype-based language with a small community? An honest answer. + +## Prototypes, Not Classes + +- [Prototypes, Not Classes](/Prototypes-Not-Classes/): How Io replaces classes and instances with a single uniform notion of object. + +## Real-World Patterns + +- [Real-World Patterns](/Real-World-Patterns/): Architectures and patterns for building substantial applications in Io. + diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..d92ee56 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,25 @@ + + + / + /Blocks-and-Closures/ + /C-Integration/ + /Case-Studies/ + /Cloning-and-Inheritance/ + /Collections/ + /Conclusion/ + /Concurrency/ + /Control-Flow/ + /Domain-Specific-Languages/ + /Ecosystem-and-Libraries/ + /Everything-is-an-Object/ + /Exceptions/ + /Getting-Started/ + /Introduction/ + /Messages-and-Slots/ + /Metaprogramming/ + /Preface/ + /Prototypes-Not-Classes/ + /Real-World-Patterns/ + /llms.txt + /llms-full.txt + diff --git a/website/.hugo_build.lock b/website/.hugo_build.lock deleted file mode 100644 index e69de29..0000000 diff --git a/website/content/_index.md b/website/content/_index.md deleted file mode 100644 index 1317afe..0000000 --- a/website/content/_index.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: "The Io Programming Language" ---- - -Welcome to this comprehensive guide to the Io programming language—a journey into prototype-based programming that will challenge and expand your understanding of object-oriented design. - -## Why Io? - -In a world dominated by class-based languages, Io offers a refreshingly different perspective. Everything is an object. Everything is a message. And everything can be changed at runtime. - -## What You'll Learn - -Through detailed comparisons with JavaScript, Python, Ruby, and Java, you'll discover: - -- How prototype-based inheritance creates more flexible designs -- Why message passing is more powerful than method calls -- How to think in objects without classes -- The elegance of homoiconic languages - -## Start Your Journey - -Begin with the [Preface](/docs/) to understand Io's philosophy, or jump directly to [Getting Started](/docs/part-1-foundations/02-getting-started/) to write your first Io program. - ---- - -*"Io's purpose is to refocus attention on expressiveness by exploring higher level dynamic programming features with greater levels of runtime flexibility."* -— Steve Dekorte, Creator of Io \ No newline at end of file diff --git a/website/content/docs/01-introduction.md b/website/content/docs/01-introduction.md deleted file mode 100644 index 9c54d3c..0000000 --- a/website/content/docs/01-introduction.md +++ /dev/null @@ -1,246 +0,0 @@ ---- -title: "Introduction" -weight: 20 ---- - - - -# Chapter 1: Introduction - The Philosophy of Io - -> "The limits of my language mean the limits of my world." -> — Ludwig Wittgenstein - -Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity. - -Io believes in radical simplicity through uniform message passing. - -## The Birth of Io - -Steve Dekorte created Io in 2002, during an interesting period in programming language history. Java had conquered the enterprise. Python and Ruby were gaining traction as "scripting" languages. JavaScript was still dismissed as a toy for web browsers. The mainstream programming world had largely settled on class-based object-orientation as the "right" way to organize programs. - -But Dekorte was inspired by older, more radical ideas: - -- **Smalltalk** (1972): Everything is an object, computation happens through message passing -- **Self** (1986): Objects without classes, prototype-based inheritance -- **Lisp** (1958): Code as data, minimal syntax, powerful macros -- **Lua** (1993): Simplicity, embeddability, tables as the universal data structure -- **NewtonScript** (1993): Prototype-based inheritance in a practical system - -Here's how Dekorte himself described his motivation: - -> "I wanted a language that was small, simple, and consistent. Something you could understand completely. Most languages accumulate features over time, becoming more complex. I wanted to go the opposite direction—to see how much you could accomplish with how little." - -## The Seven Pillars of Io - -Io rests on seven fundamental concepts. Master these, and you've mastered the language: - -### 1. **Everything is an Object** - -In Java or C++, primitives like integers and booleans aren't objects—they're special cases with different rules. In Io, everything is an object: - -```io -3 type println // Number -"hello" type println // Sequence -true type println // true -method() type println // Block -``` - -Even `true` and `false` are objects. Even methods are objects. This uniformity eliminates countless special cases. - -### 2. **Objects are Collections of Slots** - -An object in Io is essentially a collection of named slots. Each slot can hold any value—data, methods, other objects: - -```io -person := Object clone -person name := "Alice" // data slot -person age := 30 // data slot -person greet := method("Hello!") // method slot -person friend := Object clone // object slot -``` - -Compare this to JavaScript, which has a similar model but complicated by functions, prototypes, constructors, and (now) classes. Io keeps it simple: objects have slots, period. - -### 3. **Computation is Message Passing** - -This is perhaps Io's most radical idea. In most languages, computation involves various mechanisms: - -- Function calls: `sqrt(16)` -- Method invocations: `list.append(5)` -- Operators: `x + y` -- Control structures: `if (x > 0) { ... }` -- Assignment: `x = 5` - -In Io, all of these are just messages sent to objects: - -```io -sqrt(16) // send message "sqrt" with argument 16 to current object -list append(5) // send message "append" with argument 5 to list -x + y // send message "+" with argument y to x -if(x > 0, ...) // send message "if" with arguments to current object -x = 5 // send message "setSlot" to current object -``` - -This uniformity has profound implications we'll explore throughout this book. - -### 4. **Objects Inherit from Prototypes** - -Rather than defining classes as templates for objects, Io uses prototypes—objects that serve as templates for other objects: - -```io -Animal := Object clone -Animal move := method("Moving..." println) - -Dog := Animal clone -Dog bark := method("Woof!" println) - -fido := Dog clone -fido move // "Moving..." (inherited from Animal) -fido bark // "Woof!" (inherited from Dog) -``` - -There's no distinction between "class" and "instance"—just objects cloning other objects. - -### 5. **Differential Inheritance** - -When you clone an object in Io, the new object doesn't copy all the slots from its prototype. Instead, it maintains a reference to its prototype and only stores its differences: - -```io -proto := Object clone -proto x := 10 -proto y := 20 - -child := proto clone -child y = 30 // Only stores the difference - -child x println // 10 (from proto) -child y println // 30 (from child) -``` - -This is memory efficient and enables powerful runtime modifications. - -### 6. **Everything is Modifiable at Runtime** - -In Io, nothing is sacred. You can modify any object at any time, including built-in types: - -```io -Number double := method(self * 2) -5 double println // 10 - -// Even more radical - redefine addition! -Number + := method(n, self * n) -3 + 4 println // 12 (now multiplication!) -``` - -This flexibility enables patterns impossible in more restrictive languages. - -### 7. **Homoiconicity Through Messages** - -Like Lisp, Io code is represented as data structures that can be manipulated by the program itself. But where Lisp uses lists, Io uses messages: - -```io -code := message(1 + 2) -code println // 1 +(2) -code name println // + -code arguments println // list(2) -``` - -This enables powerful metaprogramming without special syntax. - -## Comparing Philosophies - -To understand Io's philosophy, let's contrast it with mainstream languages: - -### Java: Protection Through Types - -```java -public class BankAccount { - private double balance; // Protected from direct access - - public void deposit(double amount) { - if (amount > 0) { - balance += amount; - } - } -} -``` - -Java believes in protection—private fields, type checking, compile-time verification. The compiler prevents mistakes. - -### Python: Practicality and Conventions - -```python -class BankAccount: - def __init__(self): - self._balance = 0 # Convention: _ means "private" - - def deposit(self, amount): - if amount > 0: - self._balance += amount -``` - -Python believes in "we're all consenting adults." Protection through convention, not enforcement. - -### Io: Radical Flexibility - -```io -BankAccount := Object clone -BankAccount balance := 0 -BankAccount deposit := method(amount, - if(amount > 0, balance = balance + amount) -) -``` - -Io believes in complete openness. Any object can be modified by any code at any time. Power with responsibility. - -## The Cost of Simplicity - -Io's radical simplicity comes with trade-offs: - -**Performance**: Without static typing or compile-time optimization, Io can't match the speed of C++ or even JIT-compiled languages like Java. Message passing has overhead. - -**Tool Support**: IDEs can't provide the same level of assistance without static types and fixed class definitions. Refactoring tools are limited. - -**Error Detection**: Many errors that would be caught at compile-time in other languages only surface at runtime in Io. - -**Learning Curve**: Paradoxically, Io's simplicity can make it harder to learn. With fewer built-in concepts, you have to build more from primitives. - -## The Power of Simplicity - -But simplicity also brings power: - -**Understandability**: You can understand the entire language. No edge cases, no historical baggage, no features that interact in surprising ways. - -**Flexibility**: Patterns that require language extensions or complex frameworks in other languages are trivial in Io. - -**Expressiveness**: With everything built from the same primitives, you can create abstractions that feel native to the language. - -**Exploration**: Io is a playground for ideas that would be difficult to explore in more complex languages. - -## A Living Language - -Despite its small community, Io continues to evolve and inspire. Its ideas have influenced: - -- **JavaScript frameworks** that embrace prototype-based patterns -- **Ruby libraries** that use method_missing for DSLs -- **Newer languages** like Factor and Ioke - -More importantly, Io continues to teach programmers that our familiar concepts—classes, types, compilation—are choices, not requirements. - -## What's Next - -In the following chapters, we'll explore Io systematically: - -- First, we'll get Io running and write our first programs -- Then, we'll dive deep into the object model -- We'll explore message passing and method resolution -- We'll see how control structures emerge from simple primitives -- We'll build increasingly sophisticated abstractions -- Finally, we'll tackle advanced topics like concurrency and metaprogramming - -Along the way, we'll constantly compare Io with languages you know, helping you see familiar concepts in a new light. - -Ready to challenge everything you know about objects? Let's begin. - ---- - diff --git a/website/content/docs/05-messages-and-slots.md b/website/content/docs/05-messages-and-slots.md deleted file mode 100644 index ef09279..0000000 --- a/website/content/docs/05-messages-and-slots.md +++ /dev/null @@ -1,619 +0,0 @@ ---- -title: "Messages and Slots" -weight: 60 ---- - - - -# Chapter 5: Messages and Slots - -At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth. - -## The Anatomy of a Message - -When you write this in Io: - -```io -person setName("Alice") -``` - -What actually happens? Let's break it down: - -1. `person` is the **receiver** - the object receiving the message -2. `setName` is the **message name** (or selector) -3. `"Alice"` is the **argument** to the message -4. The entire expression is a **message send** - -But here's where it gets interesting. Messages are objects too: - -```io -// Create a message object -msg := message(person setName("Alice")) - -// Inspect it -msg name println // setName -msg arguments println // list(Message_0x...) -msg arguments first code println // "Alice" - -// Execute it -msg doInContext(Lobby) // Actually calls person setName("Alice") -``` - -## Slots: The Object's Memory - -Slots are named storage locations in objects. They can hold any value: - -```io -obj := Object clone - -// Create slots with different values -obj number := 42 // Number -obj text := "hello" // String -obj method := method(x, x * 2) // Method -obj child := Object clone // Another object -obj flag := true // Boolean - -// List all slots -obj slotNames println -// list(number, text, method, child, flag) - -// Check for slots -obj hasSlot("number") println // true -obj hasSlot("missing") println // false - -// Get slot values -obj getSlot("number") println // 42 -obj getSlot("method") println // method(x, ...) -``` - -## The Message Resolution Algorithm - -When an object receives a message, Io follows a specific algorithm to find the corresponding slot: - -```io -Animal := Object clone -Animal speak := method("generic sound" println) - -Dog := Animal clone -Dog speak := method("woof" println) -Dog wagTail := method("wagging..." println) - -rover := Dog clone -rover name := "Rover" - -// When rover receives 'speak': -rover speak -// 1. Look for 'speak' in rover - not found -// 2. Look for 'speak' in rover's proto (Dog) - found! -// 3. Execute Dog's speak method with rover as self - -// When rover receives 'name': -rover name -// 1. Look for 'name' in rover - found! -// 2. Return the value - -// Visual representation: -/* - Object - ↑ - Animal (speak: "generic sound") - ↑ - Dog (speak: "woof", wagTail) - ↑ - rover (name: "Rover") -*/ -``` - -## Creating and Modifying Slots - -Io distinguishes between creating new slots and updating existing ones: - -```io -obj := Object clone - -// Create a new slot with := -obj x := 10 -obj hasSlot("x") println // true - -// Update existing slot with = -obj x = 20 -obj x println // 20 - -// Trying to update non-existent slot fails -obj y = 30 // Exception: Slot y not found - -// But you can use setSlot to create or update -obj setSlot("y", 30) // Creates if doesn't exist -obj y println // 30 - -// Remove slots -obj removeSlot("y") -obj hasSlot("y") println // false -``` - -This distinction helps catch typos: - -```io -counter := 0 -countr = 1 // Error! Probably meant 'counter' -``` - -## Methods Are Just Slots - -In Io, methods aren't special—they're just slots that hold executable blocks: - -```io -Calculator := Object clone - -// Method is just a slot containing a method object -Calculator add := method(a, b, a + b) - -// You can manipulate methods like any other value -addMethod := Calculator getSlot("add") -addMethod type println // Block - -// You can copy methods between objects -ScientificCalc := Object clone -ScientificCalc addition := Calculator getSlot("add") -ScientificCalc addition(5, 3) println // 8 - -// You can even store methods in variables -operation := method(x, x * 2) -Calculator double := operation -Calculator double(21) println // 42 -``` - -## The 'self' and 'sender' Context - -Every method has access to special variables: - -```io -Printer := Object clone -Printer name := "HP" -Printer print := method(doc, - ("Printer: " .. self name) println // self = receiver - ("Sender: " .. sender type) println // sender = who sent the message - ("Document: " .. doc) println -) - -Computer := Object clone -Computer sendJob := method( - Printer print("report.pdf") -) - -Computer sendJob -// Printer: HP -// Sender: Computer -// Document: report.pdf -``` - -## Message Forwarding - -When an object doesn't have a slot for a received message, it calls `forward`: - -```io -Proxy := Object clone -Proxy target := nil -Proxy forward := method( - ("Forwarding " .. call message name .. " to target") println - call evalArgAt(0) // This would forward to target -) - -p := Proxy clone -p doSomething("arg") -// Forwarding doSomething to target -``` - -This enables powerful patterns like delegation and method missing: - -```io -// Ruby-style method_missing -DynamicObject := Object clone -DynamicObject forward := method( - methodName := call message name - if(methodName beginsWithSeq("get"), - # Handle getters - property := methodName afterSeq("get") lowercase - self getSlot(property), - # Handle setters - if(methodName beginsWithSeq("set"), - property := methodName afterSeq("set") lowercase - value := call evalArgAt(0) - self setSlot(property, value) - ) - ) -) - -obj := DynamicObject clone -obj setName("Alice") // Creates 'name' slot -obj getName println // "Alice" -``` - -## Lazy Evaluation with Messages - -Messages don't evaluate immediately—they're data structures you can manipulate: - -```io -// Messages as data -expr := message(2 + 3 * 4) -expr println // 2 +(3 *(4)) - -// Evaluate when ready -result := expr doInContext(Lobby) -result println // 14 - -// Modify messages before evaluation -expr := message(x + y) -context := Object clone -context x := 10 -context y := 20 -expr doInContext(context) println // 30 -``` - -This enables macro-like capabilities: - -```io -// Create a timing macro -Object time := method( - code := call argAt(0) // Get the message, not its value - start := Date now - result := code doInContext(call sender) - elapsed := Date now - start - ("Elapsed: " .. elapsed) println - result -) - -// Use it -time( - sum := 0 - for(i, 1, 1000000, sum = sum + i) - sum -) -// Elapsed: 0.234 -// Returns: 500000500000 -``` - -## Call Introspection - -The `call` object provides detailed information about the current method invocation: - -```io -Object debug := method( - "=== Call Debug ===" println - ("Sender: " .. call sender type) println - ("Target: " .. call target type) println - ("Message: " .. call message name) println - ("Args: " .. call message arguments) println - ("Activated: " .. call activated type) println - "================" println -) - -TestObject := Object clone -TestObject test := method( - debug -) - -TestObject test -// === Call Debug === -// Sender: Lobby -// Target: TestObject -// Message: debug -// Args: list() -// Activated: Block -// ================ -``` - -## Operator Messages - -Operators are messages with special precedence rules: - -```io -// These are equivalent -2 + 3 * 4 -2 +(3 *(4)) - -// You can see the precedence -OperatorTable println - -// You can add custom operators -OperatorTable addOperator("@@", 5) -Number @@ := method(n, - self pow(n) + n pow(self) -) - -2 @@ 3 println // 17 (2^3 + 3^2 = 8 + 9) - -// Operators are just messages -5 send("+", 3) println // 8 -"hello" send("at", 1) println // e -``` - -## Assignment Messages - -Even assignment is message passing: - -```io -// These are equivalent -x := 10 -setSlot("x", 10) - -// And these -x = 20 -updateSlot("x", 20) - -// You can override assignment behavior -Object setSlot := method(name, value, - ("Setting " .. name .. " to " .. value) println - resend // Call original setSlot -) - -y := 42 -// Setting y to 42 -``` - -## Method Activation vs. Value Access - -Io distinguishes between activatable and non-activatable values: - -```io -obj := Object clone - -// Methods are activatable - they run when accessed -obj greet := method("Hello!" println) -obj greet // Prints "Hello!" - -// Other values are just returned -obj name := "Alice" -obj name // Returns "Alice" - -// You can get a method without activating it -m := obj getSlot("greet") -m println // method(...) - -// And activate it later -m call // Prints "Hello!" - -// Check if something is activatable -obj getSlot("greet") isActivatable println // true -obj getSlot("name") isActivatable println // false -``` - -## Building a Message-Based DSL - -Let's build a simple HTML DSL using messages: - -```io -HTML := Object clone -HTML forward := method( - tagName := call message name - args := call message arguments - - // Build opening tag - result := "<" .. tagName - - // Handle attributes (first arg if it's a Map) - if(args size > 0 and args at(0) name == "curlyBrackets", - attrs := call evalArgAt(0) - attrs foreach(key, value, - result = result .. " " .. key .. "=\"" .. value .. "\"" - ) - args removeFirst - ) - - result = result .. ">" - - // Handle content - args foreach(arg, - content := call sender doMessage(arg) - if(content, result = result .. content) - ) - - // Closing tag - result = result .. "" - result -) - -// Usage -html := HTML clone - -page := html div({ "class": "container" }, - html h1("Welcome"), - html p("This is a paragraph"), - html ul( - html li("Item 1"), - html li("Item 2") - ) -) - -page println -//

Welcome

This is a paragraph

  • Item 1
  • Item 2
-``` - -## Performance Considerations - -Message passing has overhead compared to direct function calls: - -```io -// Traditional method call -obj := Object clone -obj directMethod := method(x, x * 2) - -// Message construction and sending -msg := Message clone setName("directMethod") setArguments(list(Message clone setName("5"))) - -// Benchmark -time( - 100000 times(obj directMethod(5)) -) - -time( - 100000 times(obj doMessage(msg)) -) - -// Direct calls are faster, but message objects enable metaprogramming -``` - -## Common Patterns - -### Property Access Pattern - -```io -Person := Object clone -Person init := method( - self name := nil - self age := nil - self -) - -// Generate getters/setters with messages -Person addAccessors := method(slotName, - // Getter - self setSlot(slotName, - method(self getSlot("_" .. slotName)) - ) - - // Setter - self setSlot("set" .. slotName asCapitalized, - method(value, self setSlot("_" .. slotName, value)) - ) -) - -Person addAccessors("name") -Person addAccessors("age") - -p := Person clone -p setName("Alice") -p name println // "Alice" -``` - -### Chain of Responsibility - -```io -Handler := Object clone -Handler next := nil -Handler handle := method(request, - if(self canHandle(request), - self process(request), - if(next, next handle(request)) - ) -) - -AuthHandler := Handler clone -AuthHandler canHandle := method(request, - request hasSlot("needsAuth") -) -AuthHandler process := method(request, - "Authenticating..." println -) - -LogHandler := Handler clone -LogHandler canHandle := method(request, true) -LogHandler process := method(request, - ("Logging: " .. request type) println -) - -// Build chain -auth := AuthHandler clone -log := LogHandler clone -auth next := log - -// Process requests -request := Object clone -request type := "GET" -request needsAuth := true - -auth handle(request) -// Authenticating... -// Logging: GET -``` - -## Debugging Messages - -Understanding message flow is crucial for debugging: - -```io -Object trace := method( - self setSlot("forward", - method( - ("Missing: " .. call message name) println - ("Arguments: " .. call message arguments) println - ("Sender: " .. sender type) println - ) - ) - self -) - -buggy := Object clone trace -buggy doSomethingWrong(1, 2, 3) -// Missing: doSomethingWrong -// Arguments: list(1, 2, 3) -// Sender: Lobby -``` - -## Exercises - -1. **Message Logger**: Create a wrapper that logs all messages sent to an object, including arguments and return values. - -2. **Lazy Properties**: Implement properties that are only computed when first accessed, then cached. - -3. **Message Queue**: Build an object that queues messages and executes them later in order. - -4. **Method Decorators**: Create a system for wrapping methods with before/after behavior using messages. - -5. **Message Router**: Build a router that directs messages to different handlers based on patterns. - -## Advanced Message Techniques - -### Message Rewriting - -```io -Rewriter := Object clone -Rewriter forward := method( - msg := call message - - // Rewrite add to multiply - if(msg name == "add", - msg setName("multiply") - ) - - // Continue with modified message - resend -) - -calc := Rewriter clone -calc multiply := method(a, b, a * b) -calc add(3, 4) println // 12 (rewritten to multiply!) -``` - -### Conditional Message Sending - -```io -Object sendIf := method(condition, messageName, - if(condition, - self doMessage(Message clone setName(messageName)) - ) -) - -Object sendUnless := method(condition, messageName, - if(condition not, - self doMessage(Message clone setName(messageName)) - ) -) - -obj := Object clone -obj greet := method("Hello!" println) - -obj sendIf(true, "greet") // Hello! -obj sendUnless(false, "greet") // Hello! -``` - -## Conclusion - -Messages and slots form the foundation of Io's object model. Every computation—from simple arithmetic to complex method calls—is accomplished through message passing. Objects store their state and behavior in slots, and respond to messages by looking up the corresponding slots. - -This uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system. - -Understanding messages and slots deeply is essential to mastering Io. They're not just an implementation detail—they're the conceptual core that makes Io's radical simplicity possible. - ---- - diff --git a/website/content/docs/_index.md b/website/content/docs/_index.md deleted file mode 100644 index 5d48e57..0000000 --- a/website/content/docs/_index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Chapters" -weight: 1 ---- - -# The Io Programming Language - -Navigate through the complete book below. \ No newline at end of file diff --git a/website/content/examples.md b/website/content/examples.md deleted file mode 100644 index 3718d57..0000000 --- a/website/content/examples.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: "Code Examples" -weight: 20 ---- - -# Code Examples - -All code examples from the book are available for download and experimentation. Each example is a standalone `.io` file that you can run directly with the Io interpreter. - -## Running Examples - -To run any example, use the Io interpreter: - -```bash -io hello.io -``` - -## Examples by Chapter - -### Part I: Foundations - -- **Chapter 2: Getting Started** - - [`hello.io`](/examples/chapter-02/hello.io) - Your first Io program - - [`todo-list.io`](/examples/chapter-02/todo-list.io) - A simple todo list application - -### Part II: Core Concepts - -- **Chapter 4: Prototypes, Not Classes** - - [`prototypes.io`](/examples/chapter-04/prototypes.io) - Working with prototypes - -### Part III: Language Features - -- **Chapter 9: Blocks and Closures** - - [`closures.io`](/examples/chapter-09/closures.io) - Understanding closures in Io - -### Part IV: Advanced Topics - -- **Chapter 11: Metaprogramming** - - [`metaprogramming.io`](/examples/chapter-11/metaprogramming.io) - Runtime code manipulation - -- **Chapter 12: Concurrency** - - [`concurrency.io`](/examples/chapter-12/concurrency.io) - Actors and coroutines - -- **Chapter 13: Domain-Specific Languages** - - [`html-dsl.io`](/examples/chapter-13/html-dsl.io) - Building an HTML DSL - -## Download All Examples - -You can [browse all examples](/examples/) or clone the repository to get all examples at once: - -```bash -git clone https://github.com/yourusername/io-book-examples.git -``` - -## Contributing - -Found an issue with an example? Want to contribute your own? Please submit a pull request or open an issue on GitHub. \ No newline at end of file diff --git a/website/convert_chapters.sh b/website/convert_chapters.sh deleted file mode 100755 index 8b76f77..0000000 --- a/website/convert_chapters.sh +++ /dev/null @@ -1,139 +0,0 @@ -#!/bin/bash - -# Part 1: Foundations -echo "--- -title: \"Preface\" -weight: 1 ---- -" > website/content/docs/part-1-foundations/00-preface.md -tail -n +2 00-preface.md >> website/content/docs/part-1-foundations/00-preface.md - -echo "--- -title: \"Introduction\" -weight: 2 ---- -" > website/content/docs/part-1-foundations/01-introduction.md -tail -n +2 01-introduction.md >> website/content/docs/part-1-foundations/01-introduction.md - -echo "--- -title: \"Getting Started\" -weight: 3 ---- -" > website/content/docs/part-1-foundations/02-getting-started.md -tail -n +2 02-getting-started.md >> website/content/docs/part-1-foundations/02-getting-started.md - -# Part 2: Core Concepts -echo "--- -title: \"Everything is an Object\" -weight: 4 ---- -" > website/content/docs/part-2-core-concepts/03-everything-is-an-object.md -tail -n +2 03-everything-is-an-object.md >> website/content/docs/part-2-core-concepts/03-everything-is-an-object.md - -echo "--- -title: \"Prototypes, Not Classes\" -weight: 5 ---- -" > website/content/docs/part-2-core-concepts/04-prototypes-not-classes.md -tail -n +2 04-prototypes-not-classes.md >> website/content/docs/part-2-core-concepts/04-prototypes-not-classes.md - -echo "--- -title: \"Messages and Slots\" -weight: 6 ---- -" > website/content/docs/part-2-core-concepts/05-messages-and-slots.md -tail -n +2 05-messages-and-slots.md >> website/content/docs/part-2-core-concepts/05-messages-and-slots.md - -echo "--- -title: \"Cloning and Inheritance\" -weight: 7 ---- -" > website/content/docs/part-2-core-concepts/06-cloning-and-inheritance.md -tail -n +2 06-cloning-and-inheritance.md >> website/content/docs/part-2-core-concepts/06-cloning-and-inheritance.md - -# Part 3: Language Features -echo "--- -title: \"Control Flow\" -weight: 8 ---- -" > website/content/docs/part-3-language-features/07-control-flow.md -tail -n +2 07-control-flow.md >> website/content/docs/part-3-language-features/07-control-flow.md - -echo "--- -title: \"Collections\" -weight: 9 ---- -" > website/content/docs/part-3-language-features/08-collections.md -tail -n +2 08-collections.md >> website/content/docs/part-3-language-features/08-collections.md - -echo "--- -title: \"Blocks and Closures\" -weight: 10 ---- -" > website/content/docs/part-3-language-features/09-blocks-and-closures.md -tail -n +2 09-blocks-and-closures.md >> website/content/docs/part-3-language-features/09-blocks-and-closures.md - -echo "--- -title: \"Exceptions\" -weight: 11 ---- -" > website/content/docs/part-3-language-features/10-exceptions.md -tail -n +2 10-exceptions.md >> website/content/docs/part-3-language-features/10-exceptions.md - -# Part 4: Advanced Topics -echo "--- -title: \"Metaprogramming\" -weight: 12 ---- -" > website/content/docs/part-4-advanced-topics/11-metaprogramming.md -tail -n +2 11-metaprogramming.md >> website/content/docs/part-4-advanced-topics/11-metaprogramming.md - -echo "--- -title: \"Concurrency\" -weight: 13 ---- -" > website/content/docs/part-4-advanced-topics/12-concurrency.md -tail -n +2 12-concurrency.md >> website/content/docs/part-4-advanced-topics/12-concurrency.md - -echo "--- -title: \"Domain-Specific Languages\" -weight: 14 ---- -" > website/content/docs/part-4-advanced-topics/13-domain-specific-languages.md -tail -n +2 13-domain-specific-languages.md >> website/content/docs/part-4-advanced-topics/13-domain-specific-languages.md - -echo "--- -title: \"C Integration\" -weight: 15 ---- -" > website/content/docs/part-4-advanced-topics/14-c-integration.md -tail -n +2 14-c-integration.md >> website/content/docs/part-4-advanced-topics/14-c-integration.md - -# Part 5: Practical Applications -echo "--- -title: \"Real-World Patterns\" -weight: 16 ---- -" > website/content/docs/part-5-practical-applications/15-real-world-patterns.md -tail -n +2 15-real-world-patterns.md >> website/content/docs/part-5-practical-applications/15-real-world-patterns.md - -echo "--- -title: \"Case Studies\" -weight: 17 ---- -" > website/content/docs/part-5-practical-applications/16-case-studies.md -tail -n +2 16-case-studies.md >> website/content/docs/part-5-practical-applications/16-case-studies.md - -echo "--- -title: \"Ecosystem and Libraries\" -weight: 18 ---- -" > website/content/docs/part-5-practical-applications/17-ecosystem-and-libraries.md -tail -n +2 17-ecosystem-and-libraries.md >> website/content/docs/part-5-practical-applications/17-ecosystem-and-libraries.md - -echo "--- -title: \"Conclusion\" -weight: 19 ---- -" > website/content/docs/part-5-practical-applications/18-conclusion.md -tail -n +2 18-conclusion.md >> website/content/docs/part-5-practical-applications/18-conclusion.md diff --git a/website/hugo.yaml b/website/hugo.yaml deleted file mode 100644 index 92dab4c..0000000 --- a/website/hugo.yaml +++ /dev/null @@ -1,77 +0,0 @@ -baseURL: 'https://example.org/' -languageCode: 'en-us' -title: 'The Io Programming Language' -theme: 'hugo-book' - -# Book configuration -params: - # (Optional, default light) Sets color theme: light, dark or auto. - BookTheme: 'light' - - # (Optional, default true) Controls table of contents visibility on right side of pages. - BookToC: false - - # (Optional, default false) Show TOC in menu as collapsible tree - BookCollapseSection: false - - # (Optional) Set how many levels of ToC to show in menu (default: 1) - BookTOCLevel: 2 - - # (Optional, default false) Enables search function with flexsearch - BookSearch: true - - # (Optional, default false) Enables comments template on pages - BookComments: false - - # (Optional, default none) Set the path to a logo for the book - BookLogo: '' - - # (Optional, default none) Set leaf bundle to render as side menu - BookMenuBundle: '/menu' - - # (Optional, default docs) Specify root page to render child pages as menu. - BookSection: 'docs' - - # Set source repository location. - BookRepo: 'https://github.com/IoLanguage/io' - - # Enable "Edit this page" links for 'doc' page type. - BookEditPath: '' - - # Configure the date format used on the pages - BookDateFormat: 'January 2, 2006' - - # (Optional, default true) Enables breadcrumb navigation - BookBreadcrumb: true - - # (Optional, default false) Enable source code copy buttons - BookCodeCopy: true - - # (Optional, default false) Enables portfolio page - BookPortfolio: false - -menu: - after: - - name: "GitHub" - url: "https://github.com/IoLanguage/io" - weight: 10 - - name: "Io Language" - url: "https://iolanguage.org" - weight: 20 - -markup: - goldmark: - renderer: - unsafe: true - highlight: - anchorLineNos: false - codeFences: false - guessSyntax: false - lineNos: false - noClasses: true - noHl: true - tabWidth: 4 - tableOfContents: - startLevel: 2 - endLevel: 3 - ordered: false \ No newline at end of file diff --git a/website/layouts/_default/baseof.html b/website/layouts/_default/baseof.html deleted file mode 100644 index 0fa16da..0000000 --- a/website/layouts/_default/baseof.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - {{ partial "docs/html-head" . }} - {{ partial "docs/inject/head" . }} - - - - - - -
-
- - -
-
- -
- {{ template "menu-container" . }} - -
-
- {{ template "header" . }} -
- - {{ partial "docs/inject/content-before" . }} - {{ template "main" . }} - {{ partial "docs/inject/content-after" . }} - -
- {{ template "footer" . }} - {{ partial "docs/inject/footer" . }} -
- - {{ template "comments" . }} - -
- - {{ template "toc-container" . }} -
- - {{ partial "docs/inject/body" . }} - - - -{{ define "menu-container" }} - -{{ end }} - -{{ define "menu" }} - {{ partial "docs/menu-custom" . }} -{{ end }} - -{{ define "header" }} - {{ partial "docs/header" . }} - - {{ if default true (default .Site.Params.BookToC .Params.BookToC) }} - - {{ end }} -{{ end }} - -{{ define "footer" }} - {{ partial "docs/footer" . }} -{{ end }} - -{{ define "comments" }} - {{ if and .Content (default true (default .Site.Params.BookComments .Params.BookComments)) }} -
- {{- partial "docs/comments" . -}} -
- {{ end }} -{{ end }} - -{{ define "main" }} -
- {{- .Content -}} -
-{{ end }} - -{{ define "toc-container" }} -{{ if partial "docs/toc-show" . }} - -{{ end }} -{{ end }} - -{{ define "toc" }} - {{ partial "docs/toc" . }} -{{ end }} \ No newline at end of file diff --git a/website/layouts/_default/single.html b/website/layouts/_default/single.html deleted file mode 100644 index 1f35503..0000000 --- a/website/layouts/_default/single.html +++ /dev/null @@ -1,31 +0,0 @@ -{{ define "main" }} -
- {{ $title := .Title }} - {{ $content := .Content }} - - {{/* Extract chapter number from content if it exists */}} - {{ $chapterMatch := findRE "# Chapter ([0-9]+):" .RawContent }} - {{ $chapterNum := "" }} - {{ if $chapterMatch }} - {{ $chapterNum = replaceRE ".*Chapter ([0-9]+):.*" "Chapter $1" (index $chapterMatch 0) }} - {{ else if (findRE "# Preface:" .RawContent) }} - {{ $chapterNum = "Preface" }} - {{ end }} - -
-

{{ $title }}

- {{ if $chapterNum }} -
{{ $chapterNum }}
- {{ end }} -
- - {{/* Remove the original title from content - handle multiline */}} - {{ $content = replaceRE "(?s)]*>.*?" "" $content 1 }} - - {{ $content | safeHTML }} - -
- {{ partial "docs/inject/footer" . }} -
-
-{{ end }} \ No newline at end of file diff --git a/website/layouts/docs/baseof.html b/website/layouts/docs/baseof.html deleted file mode 100644 index 0fa16da..0000000 --- a/website/layouts/docs/baseof.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - {{ partial "docs/html-head" . }} - {{ partial "docs/inject/head" . }} - - - - - - -
-
- - -
-
- -
- {{ template "menu-container" . }} - -
-
- {{ template "header" . }} -
- - {{ partial "docs/inject/content-before" . }} - {{ template "main" . }} - {{ partial "docs/inject/content-after" . }} - -
- {{ template "footer" . }} - {{ partial "docs/inject/footer" . }} -
- - {{ template "comments" . }} - -
- - {{ template "toc-container" . }} -
- - {{ partial "docs/inject/body" . }} - - - -{{ define "menu-container" }} - -{{ end }} - -{{ define "menu" }} - {{ partial "docs/menu-custom" . }} -{{ end }} - -{{ define "header" }} - {{ partial "docs/header" . }} - - {{ if default true (default .Site.Params.BookToC .Params.BookToC) }} - - {{ end }} -{{ end }} - -{{ define "footer" }} - {{ partial "docs/footer" . }} -{{ end }} - -{{ define "comments" }} - {{ if and .Content (default true (default .Site.Params.BookComments .Params.BookComments)) }} -
- {{- partial "docs/comments" . -}} -
- {{ end }} -{{ end }} - -{{ define "main" }} -
- {{- .Content -}} -
-{{ end }} - -{{ define "toc-container" }} -{{ if partial "docs/toc-show" . }} - -{{ end }} -{{ end }} - -{{ define "toc" }} - {{ partial "docs/toc" . }} -{{ end }} \ No newline at end of file diff --git a/website/layouts/docs/single.html b/website/layouts/docs/single.html deleted file mode 100644 index 1f35503..0000000 --- a/website/layouts/docs/single.html +++ /dev/null @@ -1,31 +0,0 @@ -{{ define "main" }} -
- {{ $title := .Title }} - {{ $content := .Content }} - - {{/* Extract chapter number from content if it exists */}} - {{ $chapterMatch := findRE "# Chapter ([0-9]+):" .RawContent }} - {{ $chapterNum := "" }} - {{ if $chapterMatch }} - {{ $chapterNum = replaceRE ".*Chapter ([0-9]+):.*" "Chapter $1" (index $chapterMatch 0) }} - {{ else if (findRE "# Preface:" .RawContent) }} - {{ $chapterNum = "Preface" }} - {{ end }} - -
-

{{ $title }}

- {{ if $chapterNum }} -
{{ $chapterNum }}
- {{ end }} -
- - {{/* Remove the original title from content - handle multiline */}} - {{ $content = replaceRE "(?s)]*>.*?" "" $content 1 }} - - {{ $content | safeHTML }} - -
- {{ partial "docs/inject/footer" . }} -
-
-{{ end }} \ No newline at end of file diff --git a/website/layouts/partials/docs/inject/head.html b/website/layouts/partials/docs/inject/head.html deleted file mode 100644 index 98417ac..0000000 --- a/website/layouts/partials/docs/inject/head.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/layouts/partials/docs/menu-custom.html b/website/layouts/partials/docs/menu-custom.html deleted file mode 100644 index 4dde110..0000000 --- a/website/layouts/partials/docs/menu-custom.html +++ /dev/null @@ -1,19 +0,0 @@ - - - -{{ $script := resources.Get "menu-reset.js" | resources.Minify }} -{{ with $script.Content }} - -{{ end }} \ No newline at end of file diff --git a/website/public/404.html b/website/public/404.html deleted file mode 100644 index 6f7447c..0000000 --- a/website/public/404.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - -404 Page not found | The Io Programming Language - - - - - - - - - - - - - -
-
-

404

-

Page Not Found

-

- The Io Programming Language -

-
-
- - - - - diff --git a/website/public/book.min.4cb515616f615b2a0bff9bc1586e8704536e3d9ada38b7ed57973b3f954b35de.css b/website/public/book.min.4cb515616f615b2a0bff9bc1586e8704536e3d9ada38b7ed57973b3f954b35de.css deleted file mode 100644 index fd2df76..0000000 --- a/website/public/book.min.4cb515616f615b2a0bff9bc1586e8704536e3d9ada38b7ed57973b3f954b35de.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";:root{--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-500:#adb5bd;--color-link:#0055bb;--color-visited-link:#8440f1;--body-background:white;--body-font-color:black;--icon-filter:none}/*!modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize*/*,::before,::after{box-sizing:border-box}html{font-family:system-ui,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji;line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,liberation mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:initial}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.flex{display:flex}.flex-auto{flex:auto}.flex-even{flex:1 1}.flex-wrap{flex-wrap:wrap}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.align-center{align-items:center}.mx-auto{margin:0 auto}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-small{font-size:.875em}.hidden{display:none}input.toggle{height:0;width:0;overflow:hidden;opacity:0;position:absolute}.clearfix::after{content:"";display:table;clear:both}html{font-size:16px;scroll-behavior:smooth;touch-action:manipulation;scrollbar-gutter:stable}body{min-width:20rem;color:var(--body-font-color);background:var(--body-background);font-weight:400;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:400}a{text-decoration:none}a[href]{color:var(--color-link)}img{vertical-align:baseline}:focus{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}nav ul{padding:0;margin:0;list-style:none}nav ul li{position:relative}nav ul a,nav ul span{padding:.5em 0;display:block}nav ul a:hover{opacity:.5}nav ul ul{padding-inline-start:1rem}ul.pagination{display:flex;justify-content:center;list-style-type:none;padding-inline-start:0}ul.pagination .page-item a{padding:1rem}.container{max-width:80rem;margin:0 auto}.book-icon{filter:var(--icon-filter)}a .book-icon{height:1em;width:1em}a .book-icon:first-child{margin-inline-end:.5rem}a .book-icon:last-child{margin-inline-start:.5rem}.book-brand{margin-top:0;margin-bottom:1rem}.book-brand img{height:1.5em;width:1.5em;margin-inline-end:.5rem}.book-menu{flex:0 0 16rem;font-size:.875rem}.book-menu .book-menu-content{width:16rem;padding:1rem;background:var(--body-background);position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-menu a,.book-menu label{color:inherit;cursor:pointer;word-wrap:break-word}.book-menu a.active{color:var(--color-link)}.book-menu input.toggle+label+ul{display:none}.book-menu input.toggle:checked+label+ul{display:block}.book-menu input.toggle+label::after{content:"▸";align-self:center;transition:transform .1s ease-in-out}.book-menu input.toggle:checked+label::after{transform:rotate(90deg)}body[dir=rtl] .book-menu input.toggle+label::after{content:"◂"}body[dir=rtl] .book-menu input.toggle:checked+label::after{transform:rotate(-90deg)}.book-section-flat{margin:1rem 0}.book-section-flat>a,.book-section-flat>span,.book-section-flat>label{font-weight:bolder}.book-section-flat>ul{padding-inline-start:0}.book-page{min-width:20rem;flex-grow:1;padding:1rem}.book-post{margin-bottom:4rem}.book-post .book-post-date img{height:1em;width:1em;margin-inline-end:.5em}.book-post .book-post-content>:first-child{margin-top:1rem}.book-header{display:none;margin-bottom:1rem}.book-header label{line-height:0}.book-header h3{overflow:hidden;text-overflow:ellipsis;margin:0 1rem}.book-header img.book-icon{height:1.5em;width:1.5em}.book-layout-landing .book-header{display:block;position:relative;z-index:1}.book-layout-landing .book-header nav>ul{display:flex;gap:1rem;justify-content:end}.book-layout-landing .book-header nav>ul>li{display:block;white-space:nowrap}.book-layout-landing .book-header nav>ul>li>ul{display:none;position:absolute;padding:0}.book-layout-landing .book-header nav>ul>li:hover>ul{display:block}.book-search{position:relative;margin:.5rem 0;border-bottom:1px solid transparent}.book-search input{width:100%;padding:.5rem;border:0;border-radius:.25rem;background:var(--gray-100);color:var(--body-font-color)}.book-search input:required+.book-search-spinner{display:block}.book-search .book-search-spinner{position:absolute;top:0;margin:.5rem;margin-inline-start:calc(100% - 1.5rem);width:1rem;height:1rem;border:1px solid transparent;border-top-color:var(--body-font-color);border-radius:50%;animation:spin 1s ease infinite}@keyframes spin{100%{transform:rotate(360deg)}}.book-search ul a{padding-bottom:0}.book-search small{opacity:.5}.book-toc{flex:0 0 16rem;font-size:.75rem}.book-toc .book-toc-content{width:16rem;padding:1rem;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-toc img{height:1em;width:1em}.book-toc nav>ul>li:first-child{margin-top:0}.book-footer{padding-top:1rem;font-size:.875rem}.book-footer a{margin:.5rem 0}.book-comments{margin-top:1rem}.book-languages{margin-bottom:1rem}.book-languages span{padding:0}.book-languages ul{padding-inline-start:1.5em}.book-menu-content,.book-toc-content{transition:.2s ease-in-out;transition-property:transform,margin,opacity,visibility;will-change:transform,margin,opacity}@media screen and (max-width:56rem){#menu-control,#toc-control{display:inline}.book-menu{visibility:hidden;margin-inline-start:-16rem;z-index:1}.book-toc{display:none}.book-header{display:block}#menu-control:focus~main label[for=menu-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#menu-control:checked~main .book-menu{visibility:initial}#menu-control:checked~main .book-menu .book-menu-content{transform:translateX(16rem);box-shadow:0 0 .5rem rgba(0,0,0,.1)}#menu-control:checked~main .book-page{opacity:.25}#menu-control:checked~main .book-menu-overlay{display:block;position:absolute;top:0;bottom:0;left:0;right:0}#toc-control:focus~main label[for=toc-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#toc-control:checked~main .book-header aside{display:block}body[dir=rtl] #menu-control:checked~main .book-menu .book-menu-content{transform:translateX(-16rem)}}@media screen and (min-width:80rem){.book-page,.book-menu .book-menu-content,.book-toc .book-toc-content{padding:2rem 1rem}}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-math-400.woff2)format("woff2");unicode-range:U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-symbols-400.woff2)format("woff2");unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-ext-400.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-400.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-math-700.woff2)format("woff2");unicode-range:U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-symbols-700.woff2)format("woff2");unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-ext-700.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-700.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-ext-400.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-400.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto mono;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-ext-700.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto mono;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-700.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}body{font-family:roboto,sans-serif}code{font-family:roboto mono,monospace}@media print{.book-menu,.book-footer,.book-toc{display:none}.book-header,.book-header aside{display:block}main{display:block!important}}.markdown{line-height:1.6}.markdown>:first-child{margin-top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-weight:400;line-height:1;margin-top:1.5em;margin-bottom:1rem}.markdown h1 a.anchor,.markdown h2 a.anchor,.markdown h3 a.anchor,.markdown h4 a.anchor,.markdown h5 a.anchor,.markdown h6 a.anchor{opacity:0;font-size:.75em;vertical-align:middle;text-decoration:none}.markdown h1:hover a.anchor,.markdown h1 a.anchor:focus,.markdown h2:hover a.anchor,.markdown h2 a.anchor:focus,.markdown h3:hover a.anchor,.markdown h3 a.anchor:focus,.markdown h4:hover a.anchor,.markdown h4 a.anchor:focus,.markdown h5:hover a.anchor,.markdown h5 a.anchor:focus,.markdown h6:hover a.anchor,.markdown h6 a.anchor:focus{opacity:initial}.markdown h1{font-size:2rem}.markdown h2{font-size:1.5rem}.markdown h3{font-size:1.25rem}.markdown h4{font-size:1.125rem}.markdown h5{font-size:1rem}.markdown h6{font-size:.875rem}.markdown b,.markdown optgroup,.markdown strong{font-weight:bolder}.markdown a{text-decoration:none}.markdown a[href]:hover{text-decoration:underline}.markdown a[href]:visited{color:var(--color-visited-link)}.markdown img{max-width:100%;height:auto}.markdown code{direction:ltr;unicode-bidi:embed;padding:0 .25rem;background:var(--gray-200);border-radius:.25rem;font-size:.875em}.markdown pre{direction:ltr;unicode-bidi:embed;padding:1rem;background:var(--gray-100);border-radius:.25rem;overflow-x:auto}.markdown pre code{padding:0;background:0 0}.markdown p{word-wrap:break-word}.markdown blockquote{margin:1rem 0;padding:.5rem 1rem .5rem .75rem;border-inline-start:.25rem solid var(--gray-200);border-radius:.25rem}.markdown blockquote :first-child{margin-top:0}.markdown blockquote :last-child{margin-bottom:0}.markdown table{overflow:auto;display:block;border-spacing:0;border-collapse:collapse;margin-top:1rem;margin-bottom:1rem}.markdown table tr th,.markdown table tr td{padding:.5rem 1rem;border:1px solid var(--gray-200);text-align:start}.markdown table tr:nth-child(2n){background:var(--gray-100)}.markdown hr{height:1px;border:none;background:var(--gray-200)}.markdown ul,.markdown ol{padding-inline-start:2rem;word-wrap:break-word}.markdown dl dt{font-weight:bolder;margin-top:1rem}.markdown dl dd{margin-inline-start:0;margin-bottom:1rem}.markdown .highlight{direction:ltr;unicode-bidi:embed;border-radius:.25rem}.markdown .highlight table tr td pre code>span{display:flex}.markdown .highlight table tr td:nth-child(1) pre{margin:0;padding-inline-end:0}.markdown .highlight table tr td:nth-child(2) pre{margin:0;padding-inline-start:0}.markdown details{padding:1rem;border:1px solid var(--gray-200);border-radius:.25rem}.markdown details summary{line-height:1;padding:1rem;margin:-1rem;cursor:pointer;list-style:none}.markdown details summary::before{content:"▸";display:inline-block;margin-inline-end:.5rem;transition:transform .1s ease-in-out}.markdown details[open] summary{margin-bottom:0}.markdown details[open] summary::before{transform:rotate(90deg)}.markdown figure{margin:1rem 0}.markdown-inner>:first-child,.markdown .book-card figcaption>:first-child,.markdown figure figcaption>:first-child,.markdown .book-steps>ol>li>:first-child{margin-top:0}.markdown-inner>:last-child,.markdown .book-card figcaption>:last-child,.markdown figure figcaption>:last-child,.markdown .book-steps>ol>li>:last-child{margin-bottom:0}.markdown .book-expand{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden}.markdown .book-expand .book-expand-head{background:var(--gray-100);padding:.5rem 1rem;cursor:pointer}.markdown .book-expand .book-expand-content{display:none;padding:1rem}.markdown .book-expand input[type=checkbox]:checked+.book-expand-content{display:block}.markdown .book-tabs{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden;display:flex;flex-wrap:wrap}.markdown .book-tabs label{display:inline-block;padding:.5rem 1rem;border-bottom:1px transparent;cursor:pointer}.markdown .book-tabs .book-tabs-content{order:999;width:100%;border-top:1px solid var(--gray-100);padding:1rem;display:none}.markdown .book-tabs input[type=radio]:checked+label{border-bottom:1px solid var(--color-link)}.markdown .book-tabs input[type=radio]:checked+label+.book-tabs-content{display:block}.markdown .book-tabs input[type=radio]:focus+label{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}.markdown .book-columns{gap:1rem}.markdown .book-columns>div{margin:1rem 0;min-width:13.2rem}.markdown .book-columns>ul{list-style:none;display:flex;padding:0;flex-wrap:wrap;gap:1rem}.markdown .book-columns>ul>li{flex:1 1;min-width:13.2rem}.markdown a.book-btn[href]{display:inline-block;font-size:.875rem;color:var(--color-link);line-height:2rem;padding:0 1rem;border:1px solid var(--color-link);border-radius:.25rem;cursor:pointer}.markdown a.book-btn[href]:hover{text-decoration:none}.markdown .book-hint.default{border-color:#64748b;background-color:rgba(100,116,139,.1)}.markdown .book-hint.info{border-color:#4486dd;background-color:rgba(68,134,221,.1)}.markdown .book-hint.success{border-color:#3bad3b;background-color:rgba(59,173,59,.1)}.markdown .book-hint.warning{border-color:#f59e42;background-color:rgba(245,158,66,.1)}.markdown .book-hint.danger{border-color:#d84747;background-color:rgba(216,71,71,.1)}.markdown .book-hint.note{border-color:#4486dd;background-color:rgba(68,134,221,.1)}.markdown .book-hint.tip{border-color:#3bad3b;background-color:rgba(59,173,59,.1)}.markdown .book-hint.important{border-color:#8144dd;background-color:rgba(129,68,221,.1)}.markdown .book-hint.caution{border-color:#d84747;background-color:rgba(216,71,71,.1)}.markdown .book-badge{display:inline-block;font-size:.875rem;font-weight:400;vertical-align:middle;border-radius:.25rem;overflow:hidden;text-wrap:nowrap;color:var(--body-font-color)}.markdown .book-badge span{display:inline-block;padding:0 .5rem}.markdown .book-badge span.book-badge-title{--background-opacity:0.1}.markdown .book-badge span.book-badge-value{--background-opacity:1;color:var(--body-background)}.markdown .book-badge.default span{background-color:rgba(100,116,139,var(--background-opacity))}.markdown .book-badge.info span{background-color:rgba(68,134,221,var(--background-opacity))}.markdown .book-badge.success span{background-color:rgba(59,173,59,var(--background-opacity))}.markdown .book-badge.warning span{background-color:rgba(245,158,66,var(--background-opacity))}.markdown .book-badge.danger span{background-color:rgba(216,71,71,var(--background-opacity))}.markdown .book-badge.note span{background-color:rgba(68,134,221,var(--background-opacity))}.markdown .book-badge.tip span{background-color:rgba(59,173,59,var(--background-opacity))}.markdown .book-badge.important span{background-color:rgba(129,68,221,var(--background-opacity))}.markdown .book-badge.caution span{background-color:rgba(216,71,71,var(--background-opacity))}.markdown .book-steps{position:relative}.markdown .book-steps>ol{counter-reset:steps;list-style:none;padding-inline-start:1.25rem;margin-top:2rem}.markdown .book-steps>ol>li::before{content:counter(steps);counter-increment:steps;position:absolute;display:flex;justify-content:center;left:.5rem;height:1.5rem;width:1.5rem;padding:.25rem;border-radius:.5rem;white-space:nowrap;line-height:1rem;color:var(--body-background);background:var(--gray-500);outline:.25rem solid var(--body-background)}.markdown .book-steps>ol>li{border-inline-start:1px solid var(--gray-500);padding-inline-start:3rem;padding-bottom:2rem}.markdown .book-steps>ol>li:last-child{border:0}.markdown .book-card,.markdown figure{display:inline-block;overflow:hidden;height:100%;border-radius:.25rem;border:1px solid var(--gray-200)}.markdown .book-card[href],.markdown .book-card[href]:visited,.markdown figure[href],.markdown figure[href]:visited{color:var(--body-font-color)}.markdown .book-card[href]:hover,.markdown figure[href]:hover{text-decoration:none;background:var(--gray-100)}.markdown .book-card img,.markdown figure img{width:100%;display:block;aspect-ratio:4/3;object-fit:cover}.markdown .book-card .markdown-inner,.markdown .book-card figcaption,.markdown .book-card figure figcaption,.markdown figure .book-card figcaption,.markdown .book-card .book-steps>ol>li,.markdown figure .markdown-inner,.markdown figure figcaption,.markdown figure .book-steps>ol>li{padding:1rem}.markdown .book-card figcaption,.markdown figure figcaption{padding:1rem}.markdown .book-image input+img{cursor:zoom-in;transition:transform .2s ease-in-out}.markdown .book-image input:checked+img{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--body-background);object-fit:contain;width:100%;height:100%;z-index:1;cursor:zoom-out;padding:1rem}.markdown .book-hero{min-height:24rem;align-content:center}.markdown .book-hero h1{font-size:3em} \ No newline at end of file diff --git a/website/public/categories/index.html b/website/public/categories/index.html deleted file mode 100644 index eb5a5d3..0000000 --- a/website/public/categories/index.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - -Categories | The Io Programming Language - - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Categories

- - -
- - - - -
- - - -
-

Categories

- - -
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/categories/index.xml b/website/public/categories/index.xml deleted file mode 100644 index 4cf6cb1..0000000 --- a/website/public/categories/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Categories on The Io Programming Language - https://example.org/categories/ - Recent content in Categories on The Io Programming Language - Hugo - en-us - - - diff --git a/website/public/custom.css b/website/public/custom.css deleted file mode 100644 index 21729fa..0000000 --- a/website/public/custom.css +++ /dev/null @@ -1,329 +0,0 @@ -/* Import Geist Mono font */ -@import url('https://cdn.jsdelivr.net/npm/geist@1.3.1/dist/fonts/geist-mono/style.css'); - -/* Text selection styling */ -::selection { - background-color: #999999; - color: #000000; -} - -::-moz-selection { - background-color: #999999; - color: #000000; -} - -/* Top Header Bar */ -.top-header { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 60px; - background: #ffffff; - border-bottom: 1px solid #e5e5e7; - z-index: 1000; - display: flex; - align-items: center; -} - -.header-container { - width: 100%; - max-width: 100%; - margin: 0; - padding: 0 20px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - position: relative; -} - -.header-brand { - display: flex; - align-items: center; - margin-left: 30px; /* Align with sidebar content */ -} - -.header-title { - font-size: 1.25rem; - font-weight: 600; - color: #000 !important; - text-decoration: none; -} - -.header-title:hover { - color: #333 !important; -} - -.header-search { - position: absolute; - right: 1rem; - top: calc(50% - 18px); - height: 36px; -} - -.header-search .book-search { - margin: 0; - display: block; - height: 100%; -} - -.header-search .book-search input { - margin: 0; - height: 36px; - text-align: left; - width: 200px; - display: block; -} - -/* Adjust main content for header */ -body { - margin: 0; - padding: 0; - padding-top: 0; -} - -/* Ensure main container starts below header */ -.container.flex { - padding-top: 60px !important; - margin-top: 0 !important; - position: relative; -} - -main.container { - position: relative; - top: 0; - min-height: 100vh; -} - -/* Override default sidebar positioning */ -.book-menu { - position: fixed !important; - left: 0; - top: 60px !important; - bottom: 0; - width: 250px !important; - height: calc(100vh - 60px) !important; - overflow-y: auto; - z-index: 50; - background: white; - padding-top: 1rem !important; - padding-left: 0 !important; - box-sizing: border-box; -} - -aside.book-menu { - width: 250px !important; - flex: none !important; -} - -/* Sidebar content */ -.book-menu-content { - width: 100%; - padding: 1rem 20px 1rem 30px; - margin: 0; - margin-top: 4em; - box-sizing: border-box; -} - -.book-menu nav { - text-align: left; - width: auto; - padding: 0 !important; - margin: 0 !important; -} - -.book-menu nav ul { - padding-left: 0 !important; - margin: 0 !important; - list-style: none; - text-align: left; -} - -.book-menu nav li { - text-align: left; - margin: 0; - padding: 0; -} - -.book-menu nav a { - display: block; - padding: 0.25rem 0; - text-align: left; -} - -/* Adjust main content to account for narrower sidebar */ -.book-page { - margin-left: 250px !important; - padding: 2rem 2rem; - margin-top: 0; -} - -@media screen and (max-width: 56rem) { - .book-page { - margin-left: 0 !important; - } -} - -/* Add padding to top of right TOC if present */ -.book-toc { - top: 60px; - height: calc(100vh - 60px); -} - -.book-toc-content { - padding-top: 1.5rem; -} - -/* Hide search in sidebar */ -.book-menu .book-search { - display: none; -} - -/* Main font override */ -body, .book-menu, .markdown { - font-family: "Helvetica Neue", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif !important; -} - -/* Page padding */ -.book-page, .container, main { - padding-left: max(1em, env(safe-area-inset-left)) !important; - padding-right: max(1em, env(safe-area-inset-right)) !important; -} - -.markdown, .book-article { - padding: 0 1em; -} - -@media (max-width: 56rem) { - .book-page, .container, main { - padding: 0 1em !important; - } -} - -/* Code block styling - black text on light grey */ -pre, code { - background-color: #eeeff1 !important; - color: #000000 !important; - font-family: 'Geist Mono', 'SF Mono', Monaco, 'Courier New', monospace; - font-weight: 500 !important; -} - -pre { - padding: 1rem !important; - border-radius: 6px !important; - overflow-x: auto !important; - line-height: 1.45 !important; - font-size: 0.75em !important; - font-weight: 500 !important; -} - -code { - padding: 0.2em 0.4em !important; - border-radius: 3px !important; - font-size: 0.75em !important; - font-weight: 500 !important; -} - -pre code { - padding: 0 !important; - background-color: transparent !important; - font-size: inherit !important; - font-weight: 500 !important; -} - -/* Remove any syntax highlighting colors but keep medium weight */ -pre * { - color: #000000 !important; - background-color: transparent !important; - font-weight: 500 !important; - font-style: normal !important; - text-decoration: none !important; -} - -/* Blockquote styling */ -blockquote { - font-family: 'Times New Roman', Times, serif !important; - font-style: italic !important; - font-size: 1.1rem !important; - border-left: none !important; - border: none !important; - padding-left: 1.5rem; - margin: 1.5rem 0; -} - -blockquote p { - font-family: inherit; - font-style: inherit; -} - -.book-hint { - border-left: none !important; - border: none !important; -} - -/* Chapter header styling */ -.chapter-header { - margin-bottom: 4rem; -} - -.chapter-title { - font-size: 2.5rem !important; - font-weight: 600; - margin: 0 0 0.25rem 0 !important; - line-height: 1.2; -} - -.chapter-number { - font-size: 0.9rem; - color: #6e6e73; - font-weight: 400; - letter-spacing: 0.02em; -} - -/* Sidebar navigation enhancements */ -.book-menu nav { - font-size: 0.95rem; -} - -/* Style nested TOC items in sidebar */ -.book-menu .book-section-flat { - margin-left: 0; -} - -.book-menu .book-page.with-toc { - margin-left: 1rem; - font-size: 0.9rem; -} - -/* Active chapter highlighting */ -.book-menu .active { - font-weight: 600; - color: #000000; -} - -.book-menu a.active { - color: #000000; -} - -.book-menu nav a:hover { - color: #000000; - opacity: 0.7; -} - -/* Collapsible sections */ -.book-menu .book-section-container { - margin-left: 1rem; -} - -/* Center the content better */ -.book-page { - max-width: 48rem; - margin: 0 auto; -} - -/* Hide back arrow navigation but keep forward arrow */ -.book-pagination .book-pagination-item:first-child { - display: none !important; -} - diff --git a/website/public/docs/00-preface/index.html b/website/public/docs/00-preface/index.html deleted file mode 100644 index 26dba98..0000000 --- a/website/public/docs/00-preface/index.html +++ /dev/null @@ -1,637 +0,0 @@ - - - - - - - - - - - - - - - -Why Io? | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Why Io?

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Why Io?

- -
Preface
- -
- - - - - -

In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer.

-

- The Value of Alternative Paradigms - - # - -

-

Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you’re writing Java, C#, Python, or Ruby, you’re likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought.

-

Io offers something different: a pure prototype-based object system where these familiar distinctions dissolve. There are no classes, only objects. There is no separation between data and behavior. Everything—including control structures and operators—is accomplished through message passing between objects.

-

Consider this simple comparison. In Python, you might write:

-
class Dog:
-    def __init__(self, name):
-        self.name = name
-    
-    def bark(self):
-        return f"{self.name} says woof!"
-
-fido = Dog("Fido")
-print(fido.bark())
-
-

In Io, the same concept looks like this:

-
Dog := Object clone
-Dog bark := method(name .. " says woof!")
-
-fido := Dog clone
-fido name := "Fido"
-fido bark println
-
-

At first glance, this might seem like a minor syntactic difference. But look closer: there’s no class definition, no constructor, no special initialization syntax. Dog is just an object that we’ve cloned from the base Object. fido is just a clone of Dog. The simplicity is profound.

-

- What You’ll Gain - - # - -

-

- 1. A Deeper Understanding of JavaScript - - # - -

-

If you’ve ever been puzzled by JavaScript’s prototype chain, or wondered why typeof null === "object", studying Io will illuminate these mysteries. JavaScript’s object model is essentially prototype-based (though complicated by the later addition of class syntax), and Io presents these same concepts in a much purer form.

-

- 2. Freedom from Artificial Boundaries - - # - -

-

In most languages, there’s a rigid distinction between what the language provides and what you can build. You can’t change how if statements work. You can’t modify how method calls are resolved. You can’t alter fundamental objects.

-

In Io, these boundaries don’t exist. The if statement is just a message sent to an object. Method resolution is customizable. Even basic types like Number and String can be modified at runtime. This isn’t just academically interesting—it enables patterns of expression impossible in more rigid languages.

-

- 3. Appreciation for Message Passing - - # - -

-

While many languages claim to support “message passing,” few take it as seriously as Io. When everything is truly a message—including operators, control flow, and assignment—you begin to see the elegant simplicity possible in language design. This perspective will change how you think about method calls and object interaction in any language.

-

- 4. Metaprogramming Without Magic - - # - -

-

Languages like Ruby pride themselves on metaprogramming capabilities, but often these features feel like special cases—magic methods, decorators, metaclasses. In Io, metaprogramming isn’t a special feature; it’s the natural consequence of a simple, consistent object model. When you can inspect and modify any object at runtime, including the objects that define the language itself, metaprogramming becomes straightforward rather than mystical.

-

- Who Should Read This Book - - # - -

-

This book assumes you’re already a programmer. You should be comfortable with:

-
    -
  • Basic programming concepts (variables, functions, loops, conditions)
  • -
  • Object-oriented programming in at least one language
  • -
  • Using a command line and text editor
  • -
  • The idea that different languages encourage different ways of thinking
  • -
-

You don’t need to be an expert. In fact, if you’ve only worked in one or two mainstream languages, you might find Io’s different perspective especially valuable. Sometimes, those deeply entrenched in certain paradigms have the most difficulty seeing alternatives.

-

- What Makes Io Special - - # - -

-

Steve Dekorte created Io in 2002 with several goals:

-
    -
  1. Simplicity - A minimal syntax with maximum expressiveness
  2. -
  3. Flexibility - Everything modifiable at runtime
  4. -
  5. Uniformity - One consistent model for everything
  6. -
  7. Power - Advanced features like coroutines and actors built-in
  8. -
-

The result is a language that fits in roughly 10,000 lines of C code, yet provides capabilities that mainstream languages achieve only through complex implementations or external libraries.

-

- A Language for Learning - - # - -

-

I won’t pretend that Io is likely to become your primary development language. Its community is small, its libraries limited, and its performance, while respectable, isn’t competitive with systems languages or JIT-compiled platforms.

-

But Io excels as a language for learning. Its simple, consistent design makes it easy to understand completely. You can hold the entire language in your head. There are no special cases to remember, no historical baggage to work around. When you understand Io’s seven basic concepts, you understand the entire language.

-

- How to Approach This Book - - # - -

-

As you read, I encourage you to:

-
    -
  1. -

    Run every example. Io’s REPL starts instantly and makes experimentation effortless.

    -
  2. -
  3. -

    Modify the examples. What happens if you change this? What if you clone from a different object? What if you override this method?

    -
  4. -
  5. -

    Compare with languages you know. When you see an Io pattern, think about how you’d accomplish the same thing in Python, JavaScript, or Java. What’s easier? What’s harder? What’s impossible?

    -
  6. -
  7. -

    Embrace the discomfort. Some Io concepts will feel alien at first. That’s good—it means you’re learning something genuinely new.

    -
  8. -
-

- A Personal Note - - # - -

-

I’ve been programming for [X] years and have worked in dozens of languages. Most taught me new syntax or libraries. Io taught me new ways to think. It challenged assumptions I didn’t know I had. It showed me that many “fundamental” concepts in programming are actually just design choices, and different choices lead to different possibilities.

-

Whether you spend a weekend or a month with Io, I believe you’ll emerge a better programmer. Not because you’ll use Io in production (though you might), but because you’ll have a broader perspective on what programming languages can be.

-

Let’s begin.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - -
- - - - - - - Introduction - Next - - - -
- - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/01-introduction/index.html b/website/public/docs/01-introduction/index.html deleted file mode 100644 index 3c0934b..0000000 --- a/website/public/docs/01-introduction/index.html +++ /dev/null @@ -1,759 +0,0 @@ - - - - - - - - - - - - - - - -Introduction | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Introduction

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Introduction

- -
Chapter 1
- -
- - - - - - -
-

“The limits of my language mean the limits of my world.”
-— Ludwig Wittgenstein

-

Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity.

-

Io believes in radical simplicity through uniform message passing.

-

- The Birth of Io - - # - -

-

Steve Dekorte created Io in 2002, during an interesting period in programming language history. Java had conquered the enterprise. Python and Ruby were gaining traction as “scripting” languages. JavaScript was still dismissed as a toy for web browsers. The mainstream programming world had largely settled on class-based object-orientation as the “right” way to organize programs.

-

But Dekorte was inspired by older, more radical ideas:

-
    -
  • Smalltalk (1972): Everything is an object, computation happens through message passing
  • -
  • Self (1986): Objects without classes, prototype-based inheritance
  • -
  • Lisp (1958): Code as data, minimal syntax, powerful macros
  • -
  • Lua (1993): Simplicity, embeddability, tables as the universal data structure
  • -
  • NewtonScript (1993): Prototype-based inheritance in a practical system
  • -
-

Here’s how Dekorte himself described his motivation:

- -
-

“I wanted a language that was small, simple, and consistent. Something you could understand completely. Most languages accumulate features over time, becoming more complex. I wanted to go the opposite direction—to see how much you could accomplish with how little.”

-

- The Seven Pillars of Io - - # - -

-

Io rests on seven fundamental concepts. Master these, and you’ve mastered the language:

-

- 1. Everything is an Object - - # - -

-

In Java or C++, primitives like integers and booleans aren’t objects—they’re special cases with different rules. In Io, everything is an object:

-
3 type println          // Number
-"hello" type println    // Sequence
-true type println       // true
-method() type println   // Block
-
-

Even true and false are objects. Even methods are objects. This uniformity eliminates countless special cases.

-

- 2. Objects are Collections of Slots - - # - -

-

An object in Io is essentially a collection of named slots. Each slot can hold any value—data, methods, other objects:

-
person := Object clone
-person name := "Alice"              // data slot
-person age := 30                    // data slot  
-person greet := method("Hello!")    // method slot
-person friend := Object clone       // object slot
-
-

Compare this to JavaScript, which has a similar model but complicated by functions, prototypes, constructors, and (now) classes. Io keeps it simple: objects have slots, period.

-

- 3. Computation is Message Passing - - # - -

-

This is perhaps Io’s most radical idea. In most languages, computation involves various mechanisms:

-
    -
  • Function calls: sqrt(16)
  • -
  • Method invocations: list.append(5)
  • -
  • Operators: x + y
  • -
  • Control structures: if (x > 0) { ... }
  • -
  • Assignment: x = 5
  • -
-

In Io, all of these are just messages sent to objects:

-
sqrt(16)           // send message "sqrt" with argument 16 to current object
-list append(5)     // send message "append" with argument 5 to list
-x + y              // send message "+" with argument y to x
-if(x > 0, ...)     // send message "if" with arguments to current object
-x = 5              // send message "setSlot" to current object
-
-

This uniformity has profound implications we’ll explore throughout this book.

-

- 4. Objects Inherit from Prototypes - - # - -

-

Rather than defining classes as templates for objects, Io uses prototypes—objects that serve as templates for other objects:

-
Animal := Object clone
-Animal move := method("Moving..." println)
-
-Dog := Animal clone
-Dog bark := method("Woof!" println)
-
-fido := Dog clone
-fido move  // "Moving..." (inherited from Animal)
-fido bark  // "Woof!" (inherited from Dog)
-
-

There’s no distinction between “class” and “instance”—just objects cloning other objects.

-

- 5. Differential Inheritance - - # - -

-

When you clone an object in Io, the new object doesn’t copy all the slots from its prototype. Instead, it maintains a reference to its prototype and only stores its differences:

-
proto := Object clone
-proto x := 10
-proto y := 20
-
-child := proto clone
-child y = 30  // Only stores the difference
-
-child x println  // 10 (from proto)
-child y println  // 30 (from child)
-
-

This is memory efficient and enables powerful runtime modifications.

-

- 6. Everything is Modifiable at Runtime - - # - -

-

In Io, nothing is sacred. You can modify any object at any time, including built-in types:

-
Number double := method(self * 2)
-5 double println  // 10
-
-// Even more radical - redefine addition!
-Number + := method(n, self * n)
-3 + 4 println  // 12 (now multiplication!)
-
-

This flexibility enables patterns impossible in more restrictive languages.

-

- 7. Homoiconicity Through Messages - - # - -

-

Like Lisp, Io code is represented as data structures that can be manipulated by the program itself. But where Lisp uses lists, Io uses messages:

-
code := message(1 + 2)
-code println        // 1 +(2)
-code name println   // +
-code arguments println  // list(2)
-
-

This enables powerful metaprogramming without special syntax.

-

- Comparing Philosophies - - # - -

-

To understand Io’s philosophy, let’s contrast it with mainstream languages:

-

- Java: Protection Through Types - - # - -

-
public class BankAccount {
-    private double balance;  // Protected from direct access
-    
-    public void deposit(double amount) {
-        if (amount > 0) {
-            balance += amount;
-        }
-    }
-}
-
-

Java believes in protection—private fields, type checking, compile-time verification. The compiler prevents mistakes.

-

- Python: Practicality and Conventions - - # - -

-
class BankAccount:
-    def __init__(self):
-        self._balance = 0  # Convention: _ means "private"
-    
-    def deposit(self, amount):
-        if amount > 0:
-            self._balance += amount
-
-

Python believes in “we’re all consenting adults.” Protection through convention, not enforcement.

-

- Io: Radical Flexibility - - # - -

-
BankAccount := Object clone
-BankAccount balance := 0
-BankAccount deposit := method(amount,
-    if(amount > 0, balance = balance + amount)
-)
-
-

Io believes in complete openness. Any object can be modified by any code at any time. Power with responsibility.

-

- The Cost of Simplicity - - # - -

-

Io’s radical simplicity comes with trade-offs:

-

Performance: Without static typing or compile-time optimization, Io can’t match the speed of C++ or even JIT-compiled languages like Java. Message passing has overhead.

-

Tool Support: IDEs can’t provide the same level of assistance without static types and fixed class definitions. Refactoring tools are limited.

-

Error Detection: Many errors that would be caught at compile-time in other languages only surface at runtime in Io.

-

Learning Curve: Paradoxically, Io’s simplicity can make it harder to learn. With fewer built-in concepts, you have to build more from primitives.

-

- The Power of Simplicity - - # - -

-

But simplicity also brings power:

-

Understandability: You can understand the entire language. No edge cases, no historical baggage, no features that interact in surprising ways.

-

Flexibility: Patterns that require language extensions or complex frameworks in other languages are trivial in Io.

-

Expressiveness: With everything built from the same primitives, you can create abstractions that feel native to the language.

-

Exploration: Io is a playground for ideas that would be difficult to explore in more complex languages.

-

- A Living Language - - # - -

-

Despite its small community, Io continues to evolve and inspire. Its ideas have influenced:

-
    -
  • JavaScript frameworks that embrace prototype-based patterns
  • -
  • Ruby libraries that use method_missing for DSLs
  • -
  • Newer languages like Factor and Ioke
  • -
-

More importantly, Io continues to teach programmers that our familiar concepts—classes, types, compilation—are choices, not requirements.

-

- What’s Next - - # - -

-

In the following chapters, we’ll explore Io systematically:

-
    -
  • First, we’ll get Io running and write our first programs
  • -
  • Then, we’ll dive deep into the object model
  • -
  • We’ll explore message passing and method resolution
  • -
  • We’ll see how control structures emerge from simple primitives
  • -
  • We’ll build increasingly sophisticated abstractions
  • -
  • Finally, we’ll tackle advanced topics like concurrency and metaprogramming
  • -
-

Along the way, we’ll constantly compare Io with languages you know, helping you see familiar concepts in a new light.

-

Ready to challenge everything you know about objects? Let’s begin.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/02-getting-started/index.html b/website/public/docs/02-getting-started/index.html deleted file mode 100644 index 1c3becb..0000000 --- a/website/public/docs/02-getting-started/index.html +++ /dev/null @@ -1,1077 +0,0 @@ - - - - - - - - - - - - - - - -Getting Started | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Getting Started

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Getting Started

- -
Chapter 2
- -
- - - - - -

The best way to understand Io is to use it. In this chapter, we’ll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you’ll have a feel for Io’s syntax and flow.

-

- Installing Io - - # - -

-

- macOS - - # - -

-

If you’re on macOS with Homebrew, installation is simple:

-
brew install io
-
-

- Linux - - # - -

-

On most Linux distributions, you’ll need to build from source:

-
git clone https://github.com/IoLanguage/io.git
-cd io
-mkdir build
-cd build
-cmake ..
-make
-sudo make install
-
-

- Windows - - # - -

-

Windows users should use WSL (Windows Subsystem for Linux) and follow the Linux instructions, or use Docker:

-
docker run -it --rm stevedekorte/io
-
-

- Verifying Installation - - # - -

-

Once installed, verify Io is working:

-
$ io --version
-Io Programming Language, v. 20170906
-
-$ io
-Io> "Hello, World!" println
-Hello, World!
-==> Hello, World!
-Io> ^C
-
-

- The REPL: Your Io Playground - - # - -

-

Io’s REPL is where you’ll spend most of your learning time. Unlike compiled languages where you write, compile, and run, Io lets you experiment immediately.

-

Start the REPL by typing io:

-
$ io
-Io>
-
-

The prompt Io> indicates Io is ready for input. Let’s explore:

-
Io> 2 + 2
-==> 4
-
-Io> "Hello" .. " " .. "World"
-==> Hello World
-
-Io> 10 > 5
-==> true
-
-

Notice the ==> prefix? That shows the return value of your expression. Everything in Io returns a value.

-

- REPL Tips - - # - -

-
    -
  1. Multi-line input: The REPL detects incomplete expressions:
  2. -
-
Io> if(true,
-...     "yes" println,
-...     "no" println
-... )
-yes
-==> yes
-
-
    -
  1. Previous result: Use _ to reference the last result:
  2. -
-
Io> 100 * 2
-==> 200
-Io> _ + 50
-==> 250
-
-
    -
  1. Getting help: The REPL has built-in documentation:
  2. -
-
Io> Lobby slotNames
-==> list(Protos, _, exit, forward, set_)
-
-Io> Number slotNames sort
-==> list(%, *, +, -, /, <, <=, ==, >, >=, abs, acos, asin, atan, between, ceil, cos, ...)
-
-

- Your First Io Program - - # - -

-

Let’s write the traditional “Hello, World!” program. Create a file called hello.io:

-
"Hello, World!" println
-
-

Run it:

-
$ io hello.io
-Hello, World!
-
-

That’s it. No class definitions, no main function, no boilerplate. Compare with Java:

-
public class Hello {
-    public static void main(String[] args) {
-        System.out.println("Hello, World!");
-    }
-}
-
-

Or even Python:

-
if __name__ == "__main__":
-    print("Hello, World!")
-
-

Io just runs your code.

-

- Understanding Basic Syntax - - # - -

-

Io’s syntax is minimal. Let’s explore the basics:

-

- Messages and Receivers - - # - -

-

In Io, everything is about sending messages to objects:

-
"hello" size         // Send 'size' message to "hello"
-==> 5
-
-"hello" at(0)        // Send 'at' message with argument 0
-==> h
-
-"hello" upper        // Send 'upper' message
-==> HELLO
-
-

Compare with method calls in Python:

-
"hello".upper()      # Python
-
-
"hello" upper        // Io - parentheses optional for no arguments
-
-

- Arguments - - # - -

-

Messages can have arguments, passed in parentheses:

-
"hello" at(1)                    // One argument
-==> e
-
-"hello" slice(1, 3)              // Two arguments
-==> el
-
-List append(1, 2, 3)            // Multiple arguments
-==> list(1, 2, 3)
-
-

- Operators are Messages - - # - -

-

This is crucial: operators in Io are just messages with special precedence:

-
2 + 3          // Send message "+" to 2 with argument 3
-2 +(3)         // Exactly the same thing
-2 send("+", 3) // Still the same thing!
-
-

This uniformity means you can redefine operators:

-
Number + := method(n, self - n)  // Redefine + to subtract!
-5 + 3
-==> 2
-
-

(Don’t actually do this in real code!)

-

- Variables and Assignment - - # - -

-

In Io, variables are just slots on objects. By default, you’re working with the Lobby object:

-
x := 10        // Create slot 'x' on Lobby with value 10
-x println      // Print it
-==> 10
-
-x = 20         // Update existing slot
-x println
-==> 20
-
-y = 30         // Error! Slot doesn't exist
-// Exception: Slot y not found
-
-

Note the distinction:

-
    -
  • := creates a new slot
  • -
  • = updates an existing slot
  • -
-

This prevents accidental variable creation from typos:

-
counter := 0
-countr = 1     // Error - probably a typo!
-
-

Compare with JavaScript’s similar issue:

-
let counter = 0;
-countr = 1;    // Creates global variable - probably a bug!
-
-

- Control Flow - - # - -

-

Io’s control structures are methods, not special syntax:

-

- If Statements - - # - -

-
if(10 > 5,
-    "Yes" println,
-    "No" println
-)
-// Prints: Yes
-
-

Compare with Python:

-
if 10 > 5:
-    print("Yes")
-else:
-    print("No")
-
-

Since if is a method, you can even look at its implementation:

-
Io> if
-==> method(...)
-
-

- Loops - - # - -

-
// While loop
-i := 0
-while(i < 5,
-    i println
-    i = i + 1
-)
-
-// For loop
-for(i, 0, 4,
-    i println
-)
-
-// Times loop
-5 times(i,
-    i println
-)
-
-

- Creating Objects - - # - -

-

Let’s create our first custom object:

-
Person := Object clone
-Person name := "Unknown"
-Person greet := method(
-    ("Hello, I'm " .. name) println
-)
-
-alice := Person clone
-alice name = "Alice"
-alice greet
-// Prints: Hello, I'm Alice
-
-

Compare with Python:

-
class Person:
-    def __init__(self):
-        self.name = "Unknown"
-    
-    def greet(self):
-        print(f"Hello, I'm {self.name}")
-
-alice = Person()
-alice.name = "Alice"
-alice.greet()
-
-

The key difference: Io has no class definition. Person is just an object we’re using as a prototype.

-

- Methods - - # - -

-

Methods in Io are created with the method function:

-
Calculator := Object clone
-Calculator add := method(a, b, a + b)
-Calculator multiply := method(a, b, a * b)
-
-calc := Calculator clone
-calc add(5, 3) println        // 8
-calc multiply(4, 7) println    // 28
-
-

Methods have access to self (the receiver):

-
Counter := Object clone
-Counter count := 0
-Counter increment := method(
-    count = count + 1
-    self            // Return self for chaining
-)
-
-c := Counter clone
-c increment increment increment
-c count println    // 3
-
-

- Lists and Iteration - - # - -

-

Lists are fundamental in Io:

-
numbers := list(1, 2, 3, 4, 5)
-
-// Iteration
-numbers foreach(n,
-    n println
-)
-
-// Map
-squared := numbers map(n, n * n)
-squared println    // list(1, 4, 9, 16, 25)
-
-// Select (filter)
-evens := numbers select(n, n % 2 == 0)
-evens println      // list(2, 4)
-
-// Reduce
-sum := numbers reduce(+)
-sum println        // 15
-
-

Compare with Python:

-
numbers = [1, 2, 3, 4, 5]
-
-# Iteration
-for n in numbers:
-    print(n)
-
-# Map
-squared = [n * n for n in numbers]
-
-# Filter
-evens = [n for n in numbers if n % 2 == 0]
-
-# Reduce
-from functools import reduce
-sum = reduce(lambda a, b: a + b, numbers)
-
-

- Working with Files - - # - -

-

Reading and writing files is straightforward:

-
// Write to file
-file := File with("test.txt")
-file openForWriting
-file write("Hello, file!")
-file close
-
-// Read from file
-file := File with("test.txt")
-file openForReading
-contents := file contents
-contents println
-file close
-
-// Or more concisely
-File with("test.txt") contents println
-
-

- A More Complete Example - - # - -

-

Let’s build something more substantial—a simple to-do list:

-
// todo.io - A simple to-do list manager
-
-TodoList := Object clone
-TodoList items := list()
-
-TodoList add := method(task,
-    items append(task)
-    self
-)
-
-TodoList show := method(
-    if(items size == 0,
-        "No tasks!" println,
-        items foreach(i, task,
-            ("  " .. (i + 1) .. ". " .. task) println
-        )
-    )
-    self
-)
-
-TodoList complete := method(index,
-    if(index > 0 and index <= items size,
-        task := items at(index - 1)
-        items removeAt(index - 1)
-        ("Completed: " .. task) println,
-        "Invalid task number" println
-    )
-    self
-)
-
-TodoList save := method(filename,
-    File with(filename) openForWriting write(items asJson) close
-    "Saved!" println
-    self
-)
-
-TodoList load := method(filename,
-    if(File with(filename) exists,
-        items = Yajl parseJson(File with(filename) contents)
-        "Loaded!" println,
-        "File not found" println
-    )
-    self
-)
-
-// Usage
-todo := TodoList clone
-todo add("Learn Io") add("Build something cool") add("Share with friends")
-todo show
-//   1. Learn Io
-//   2. Build something cool  
-//   3. Share with friends
-
-todo complete(1)
-// Completed: Learn Io
-
-todo show
-//   1. Build something cool
-//   2. Share with friends
-
-

- Key Takeaways - - # - -

-

Having written your first Io programs, you’ve probably noticed:

-
    -
  1. -

    Minimal syntax: No keywords for defining classes, functions, or variables. Everything uses the same message-passing syntax.

    -
  2. -
  3. -

    Immediate feedback: The REPL makes experimentation effortless.

    -
  4. -
  5. -

    Uniform model: Whether you’re doing arithmetic, defining methods, or creating objects, it’s all message passing.

    -
  6. -
  7. -

    Flexibility: You can modify anything, even built-in types and operators.

    -
  8. -
  9. -

    Simplicity: Programs are often shorter than their equivalents in other languages.

    -
  10. -
-

- Exercises - - # - -

-

Try these exercises to solidify your understanding:

-
    -
  1. -

    Number methods: Add a squared method to Number that returns the square of a number. Test it with 5 squared.

    -
  2. -
  3. -

    String reversal: Create a method on Sequence (Io’s string type) called reverse that returns the reversed string.

    -
  4. -
  5. -

    Bank account: Create a BankAccount object with balance, deposit, and withdraw methods. Include protection against negative balances.

    -
  6. -
  7. -

    FizzBuzz: Implement FizzBuzz in Io (print numbers 1-100, but “Fizz” for multiples of 3, “Buzz” for multiples of 5, “FizzBuzz” for both).

    -
  8. -
  9. -

    Method chaining: Create a StringBuilder object that allows chaining: StringBuilder clone add("Hello") add(" ") add("World") toString

    -
  10. -
-

- What’s Different? - - # - -

-

If you’re coming from mainstream languages, here’s what might feel strange:

-
    -
  • No compile step: Your code runs immediately
  • -
  • No type declarations: Everything is dynamically typed
  • -
  • No class keyword: Objects are created by cloning
  • -
  • Operators aren’t special: They’re just messages
  • -
  • Everything returns a value: Even assignments and control structures
  • -
-

These differences aren’t arbitrary—they all flow from Io’s core principle of uniform message passing.

-

- Moving Forward - - # - -

-

You now have enough Io knowledge to explore the deeper concepts. You can:

-
    -
  • Create and manipulate objects
  • -
  • Define methods
  • -
  • Use control structures
  • -
  • Work with collections
  • -
  • Read and write files
  • -
-

In the next chapter, we’ll dive deep into Io’s object model and understand what “everything is an object” really means.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/03-everything-is-an-object/index.html b/website/public/docs/03-everything-is-an-object/index.html deleted file mode 100644 index 322e341..0000000 --- a/website/public/docs/03-everything-is-an-object/index.html +++ /dev/null @@ -1,1040 +0,0 @@ - - - - - - - - - - - - - - - -Everything is an Object | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Everything is an Object

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Everything is an Object

- -
Chapter 3
- -
- - - - - -

“Everything is an object” is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like int and boolean break the rule). But what does it really mean? And how thoroughly does Io embrace this principle?

-

In this chapter, we’ll explore how Io takes “everything is an object” to its logical extreme, and what this means for how you write and think about programs.

-

- What Is an Object? - - # - -

-

Before we dive into Io’s object model, let’s establish what we mean by “object.” In most object-oriented languages, an object is:

-
    -
  1. A bundle of state (data/attributes/fields)
  2. -
  3. A set of behaviors (methods/functions)
  4. -
  5. An identity (distinct from other objects)
  6. -
-

In Java, you might have:

-
class Dog {
-    String name;        // state
-    int age;           // state
-    
-    void bark() {      // behavior
-        System.out.println("Woof!");
-    }
-}
-
-Dog fido = new Dog();  // identity (fido is distinct from other Dogs)
-
-

But Java immediately breaks its own rules:

-
int x = 5;          // Not an object!
-x.toString();       // Error: int cannot be dereferenced
-Integer y = 5;      // Now it's an object (boxed)
-y.toString();       // "5"
-
-

Let’s see how Io handles this.

-

- Numbers are Objects - - # - -

-

In Io, numbers aren’t primitives—they’re full objects:

-
5 type println           // Number
-5 slotNames println      // list(%, *, +, -, /, <, ...)
-
-// Numbers have methods
-5 abs println            // 5
--5 abs println           // 5
-5 sqrt println           // 2.236...
-5 sin println            // -0.958...
-
-// You can add methods to numbers!
-Number double := method(self * 2)
-5 double println         // 10
-
-// You can even inspect a number's prototype chain
-5 proto println          // Number_0x...
-5 proto proto println    // Object_0x...
-
-

Compare this to Python, which claims everything is an object:

-
x = 5
-print(type(x))           # <class 'int'>
-print(dir(x))            # ['__abs__', '__add__', ...]
-
-# But you can't add methods to numbers
-x.double = lambda: x * 2  # AttributeError!
-
-

Python’s numbers are objects, but they’re immutable objects with a fixed set of methods. Io’s numbers are fully modifiable objects.

-

- Strings are Objects (and Mutable!) - - # - -

-
text := "hello"
-text type println        // Sequence
-
-// Strings have methods
-text size println        // 5
-text upper println       // HELLO
-text reverse println     // olleh
-
-// But here's where it gets interesting - strings are MUTABLE
-text atPut(0, 72)       // ASCII for 'H'
-text println            // Hello
-
-// You can add methods to strings
-Sequence shout := method(self upper .. "!!!")
-"hello" shout println   // HELLO!!!
-
-

This mutability might shock programmers from languages where strings are immutable:

-
# Python - strings are immutable
-text = "hello"
-text[0] = 'H'  # TypeError: 'str' object does not support item assignment
-
-# Java - strings are immutable
-String text = "hello";
-text.charAt(0) = 'H';  // Error: cannot assign a value
-
-

- Booleans are Objects - - # - -

-

Even true and false are objects:

-
true type println        // true
-false type println       // false
-
-// They have methods
-true and(false) println  // false
-true or(false) println   // true
-true not println         // false
-
-// The actual objects
-true println             // true
-true proto println       // Object_0x...
-
-// You can even add methods to booleans!
-true celebrate := method("Yay!" println)
-(5 > 3) celebrate       // Yay!
-
-

This is different from most languages where booleans are either primitives or special immutable objects.

-

- nil is an Object - - # - -

-

Even nothingness is an object in Io:

-
nil type println         // Object
-nil slotNames println    // list(type, ...)
-
-// nil has methods!
-nil isNil println        // true
-nil not println          // true
-
-// You can add methods to nil
-nil greet := method("Hello from nothing!" println)
-x := nil
-x greet                  // Hello from nothing!
-
-

Compare with JavaScript’s confusing null:

-
typeof null          // "object" (but it's not really)
-null.toString()      // TypeError: Cannot read property 'toString' of null
-
-

- Methods are Objects - - # - -

-

This is where things get really interesting. Methods themselves are objects:

-
add := method(a, b, a + b)
-add type println         // Block
-
-// Methods have methods!
-add argumentNames println // list(a, b)
-add code println         // a +(b)
-
-// You can modify methods
-add code println                    // a +(b)
-add setCode(block(a, b, a * b))   // Change implementation!
-add(3, 4) println                  // 12 (now multiplies!)
-
-// You can create methods from strings
-code := "a + b + 100"
-newMethod := block(a, b) setCode(code)
-newMethod call(5, 10) println      // 115
-
-

This is far more powerful than most languages’ function objects:

-
# Python
-def add(a, b):
-    return a + b
-
-print(type(add))         # <class 'function'>
-print(add.__code__)      # <code object...>
-# But you can't easily modify the function's code at runtime
-
-

- Control Structures are Objects (Messages) - - # - -

-

This might be the most mind-bending: if, while, and for aren’t syntax—they’re methods:

-
// 'if' is a method on Object
-if type println          // nil (it's a method)
-
-// You can see its implementation
-Object getSlot("if") println  // method(...)
-
-// You can even redefine it!
-Object if := method(condition, trueBlock, falseBlock,
-    "Making a decision..." println
-    if(condition, trueBlock call, falseBlock call)
-)
-
-if(true, "yes" println, "no" println)
-// Prints: Making a decision...
-// Prints: yes
-
-

Let’s create our own control structure:

-
Object unless := method(condition, block,
-    if(condition not, block call)
-)
-
-unless(5 > 10,
-    "Math still works!" println
-)
-// Prints: Math still works!
-
-

Try doing that in Java or C++!

-

- Operators are Objects (Messages) - - # - -

-

Operators aren’t special syntax—they’re messages:

-
// These are equivalent
-2 + 3
-2 +(3)
-2 send("+", 3)
-
-// You can redefine operators
-Number + := method(n,
-    "Adding #{self} and #{n}" interpolate println
-    self + n  // Would cause infinite recursion!
-)
-
-// Let's be more careful
-Number plusWithLogging := Number getSlot("+")
-Number + := method(n,
-    "Adding #{self} and #{n}" interpolate println
-    self plusWithLogging(n)
-)
-
-2 + 3
-// Prints: Adding 2 and 3
-// Returns: 5
-
-

You can even create new operators:

-
OperatorTable addOperator("**", 3)  // Right-associative, precedence 3
-Number ** := method(n, self pow(n))
-
-2 ** 3 println  // 8
-2 ** 3 ** 2 println  // 512 (right-associative: 2 ** (3 ** 2))
-
-

- Lists are Objects - - # - -

-
nums := list(1, 2, 3)
-nums type println        // List
-
-// Lists have many methods
-nums size println        // 3
-nums first println       // 1
-nums last println        // 3
-nums reverse println     // list(3, 2, 1)
-
-// Lists are mutable
-nums append(4)
-nums println            // list(1, 2, 3, 4)
-
-// You can add custom methods to lists
-List sum := method(
-    self reduce(+)
-)
-
-list(1, 2, 3, 4, 5) sum println  // 15
-
-

- Even the Lobby is an Object - - # - -

-

The global namespace in Io is an object called Lobby:

-
Lobby type println       // Object
-Lobby slotNames println  // list(all your global variables)
-
-// When you create a "global" variable, you're adding a slot to Lobby
-x := 10
-Lobby hasSlot("x") println  // true
-Lobby x println             // 10
-
-// You can manipulate the global namespace as an object
-Lobby removeSlot("x")
-x println                   // Exception: Slot x not found
-
-

This is radically different from languages with special global scope rules.

-

- Messages Themselves are Objects - - # - -

-

When you send a message, that message is an object:

-
msg := message(2 + 3)
-msg type println         // Message
-msg name println         // +
-msg arguments println    // list(Message_0x...)
-msg arguments first code println  // 3
-
-// You can evaluate messages
-msg doInContext(Lobby) println   // 5
-
-// You can build messages programmatically
-msg := Message clone setName("+") setArguments(list(Message clone setName("3")))
-2 doMessage(msg) println          // 5
-
-

This is the foundation of Io’s metaprogramming capabilities.

-

- The Object Hierarchy - - # - -

-

Let’s explore how all these objects relate:

-
// Everything ultimately inherits from Object
-5 proto proto == Object println      // true
-"hi" proto proto == Object println   // true
-true proto == Object println         // true
-list() proto proto == Object println // true
-
-// You can walk the prototype chain
-obj := 5
-while(obj,
-    obj type println
-    obj = obj proto
-)
-// Prints:
-// Number
-// Object
-
-

- Practical Implications - - # - -

-

What does it mean that everything is truly an object?

-

- 1. Uniform Interface - - # - -

-

You can treat everything uniformly:

-
things := list(5, "hello", true, nil, method(x, x * 2), list(1, 2))
-
-things foreach(thing,
-    ("Type: " .. thing type) println
-)
-// Type: Number
-// Type: Sequence  
-// Type: true
-// Type: Object
-// Type: Block
-// Type: List
-
-

- 2. No Special Cases - - # - -

-

You don’t need to remember different rules for different types:

-
// Everything can receive messages
-5 println
-"hello" println
-true println
-nil println
-list(1,2,3) println
-
-// Everything can be inspected
-5 slotNames
-"hello" slotNames
-true slotNames
-nil slotNames
-
-

- 3. Extensibility - - # - -

-

You can extend anything:

-
// Add methods to numbers for DSL
-Number days := method(
-    Duration clone setDays(self)
-)
-
-Number hours := method(
-    Duration clone setHours(self)
-)
-
-// Now you can write
-deadline := Date now + 3 days + 4 hours
-
-

- 4. Debugging Power - - # - -

-

Since everything is an object, you can inspect everything:

-
Object debugMethod := method(name,
-    m := self getSlot(name)
-    ("Method " .. name .. ":") println
-    ("  Arguments: " .. m argumentNames) println
-    ("  Code: " .. m code) println
-)
-
-List debugMethod("append")
-// Method append:
-//   Arguments: list(...)
-//   Code: ...
-
-

- Comparison with Other Languages - - # - -

-

- Ruby: “Everything is an object” (mostly) - - # - -

-
5.class          # Integer
-"hello".class    # String
-true.class       # TrueClass
-nil.class        # NilClass
-
-# But...
-if.class         # SyntaxError! 'if' isn't an object
-
-

- Python: “Everything is an object” (sort of) - - # - -

-
type(5)          # <class 'int'>
-type("hello")    # <class 'str'>
-type(True)       # <class 'bool'>
-type(None)       # <class 'NoneType'>
-
-# But...
-type(if)         # SyntaxError! 'if' isn't an object
-type(+)          # SyntaxError! '+' isn't an object
-
-

- JavaScript: “Everything is an object” (except when it’s not) - - # - -

-
typeof 5         // "number" (primitive)
-typeof "hello"   // "string" (primitive)
-typeof true      // "boolean" (primitive)
-typeof {}        // "object"
-
-// Autoboxing happens sometimes
-(5).toString()   // "5" (temporarily boxed)
-5.x = 10         // Silently fails!
-
-

- Io: Everything IS an object (no exceptions) - - # - -

-
5 type           // Number (object)
-"hello" type     // Sequence (object)
-true type        // true (object)
-if type          // nil (it's a method, which is an object)
-+ type           // nil (it's a method, which is an object)
-
-

- Exercises - - # - -

-
    -
  1. -

    Object Inspector: Write a method inspect that can be called on any object and prints:

    -
      -
    • Its type
    • -
    • Its slot names
    • -
    • Its prototype chain
    • -
    -
  2. -
  3. -

    Custom Boolean: Create your own boolean system with objects Yes and No that have methods and, or, and not.

    -
  4. -
  5. -

    Operator Overloading: Define a Vector object with x and y slots, then overload the + operator to add vectors.

    -
  6. -
  7. -

    Control Structure: Create a repeat(n, block) control structure that executes a block n times.

    -
  8. -
  9. -

    Message Logger: Modify the Object prototype to log every message sent to any object (hint: override forward).

    -
  10. -
-

- Philosophical Implications - - # - -

-

Io’s radical “everything is an object” approach has profound implications:

-
    -
  1. Simplicity through uniformity: One concept (objects) explains everything
  2. -
  3. Power through openness: Nothing is sealed or special
  4. -
  5. Learning through exploration: You can inspect and understand everything
  6. -
  7. Danger through freedom: You can break everything
  8. -
-

This last point is important. With great power comes great responsibility. Io trusts you completely. You can redefine addition, break the if statement, or delete critical system objects. This isn’t a bug—it’s a philosophy.

-

- Conclusion - - # - -

-

In Io, “everything is an object” isn’t marketing—it’s a fundamental truth that shapes every aspect of the language. Numbers, strings, booleans, nil, methods, operators, control structures, and even messages themselves are all objects with slots that can be inspected, modified, and extended.

-

This uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that everything is just objects sending messages to other objects, Io’s entire design clicks into place.

-

Next, we’ll explore how objects relate to each other through Io’s prototype-based inheritance system—a world without classes.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/04-prototypes-not-classes/index.html b/website/public/docs/04-prototypes-not-classes/index.html deleted file mode 100644 index 0d1a45a..0000000 --- a/website/public/docs/04-prototypes-not-classes/index.html +++ /dev/null @@ -1,1089 +0,0 @@ - - - - - - - - - - - - - - - -Prototypes, Not Classes | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Prototypes, Not Classes

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Prototypes, Not Classes

- -
Chapter 4
- -
- - - - - -

Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There’s a fundamental distinction between the template (class) and the things created from it (instances).

-

Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs.

-

- The Class-Based World - - # - -

-

Let’s start with what you probably know. In a class-based language like Java:

-
// Define a class (template)
-class Animal {
-    String name;
-    
-    void speak() {
-        System.out.println("Some sound");
-    }
-}
-
-// Define a subclass
-class Dog extends Animal {
-    void speak() {
-        System.out.println("Woof!");
-    }
-}
-
-// Create instances
-Dog fido = new Dog();
-Dog rover = new Dog();
-
-

The key points:

-
    -
  • Animal and Dog are classes (templates)
  • -
  • fido and rover are instances (objects)
  • -
  • Classes and instances are fundamentally different things
  • -
  • Inheritance happens between classes
  • -
-

- The Prototype-Based World - - # - -

-

In Io, there are no classes:

-
// Create an object to serve as a prototype
-Animal := Object clone
-Animal speak := method("Some sound" println)
-
-// Create another object using Animal as a prototype
-Dog := Animal clone
-Dog speak := method("Woof!" println)
-
-// Create more objects using Dog as a prototype
-fido := Dog clone
-rover := Dog clone
-
-

The key differences:

-
    -
  • Animal, Dog, fido, and rover are all objects
  • -
  • No fundamental distinction between “classes” and “instances”
  • -
  • Objects are created by cloning other objects
  • -
  • Any object can serve as a prototype for other objects
  • -
-

- Understanding Cloning - - # - -

-

When you clone an object in Io, you don’t copy all its slots. Instead, you create a new, empty object that maintains a reference to its prototype:

-
Animal := Object clone
-Animal name := "Generic Animal"
-Animal speak := method(name println)
-
-dog := Animal clone
-
-// dog doesn't have its own 'name' slot
-dog hasLocalSlot("name") println    // false
-
-// But it can access 'name' through its prototype
-dog name println                     // "Generic Animal"
-
-// Now give dog its own name
-dog name = "Fido"
-dog hasLocalSlot("name") println    // true
-dog name println                     // "Fido"
-
-// Animal's name is unchanged
-Animal name println                  // "Generic Animal"
-
-

This is called differential inheritance—objects only store their differences from their prototypes.

-

- The Prototype Chain - - # - -

-

When you send a message to an object, Io looks for a matching slot:

-
    -
  1. First in the object itself
  2. -
  3. Then in its prototype
  4. -
  5. Then in the prototype’s prototype
  6. -
  7. And so on until it reaches Object
  8. -
-
// Create a chain of prototypes
-Organism := Object clone
-Organism live := method("Living..." println)
-
-Animal := Organism clone
-Animal move := method("Moving..." println)
-
-Dog := Animal clone
-Dog bark := method("Woof!" println)
-
-fido := Dog clone
-fido name := "Fido"
-
-// fido can access methods from anywhere in the chain
-fido live    // "Living..." (from Organism)
-fido move    // "Moving..." (from Animal)
-fido bark    // "Woof!" (from Dog)
-
-// You can inspect the chain
-fido proto == Dog println           // true
-fido proto proto == Animal println  // true
-fido proto proto proto == Organism println  // true
-
-

- Dynamic Prototype Modification - - # - -

-

Since prototypes are just objects, you can modify them at runtime, and all objects using that prototype see the changes:

-
Dog := Object clone
-fido := Dog clone
-rover := Dog clone
-
-// Add a method to Dog
-Dog bark := method("Woof!" println)
-
-// Both fido and rover can now bark
-fido bark    // "Woof!"
-rover bark   // "Woof!"
-
-// Modify the method
-Dog bark = method("WOOF! WOOF!" println)
-
-// The change affects all dogs
-fido bark    // "WOOF! WOOF!"
-rover bark   // "WOOF! WOOF!"
-
-

Try doing that with classes in Java! You’d need complex reflection APIs, and even then, you couldn’t modify existing instances.

-

- Multiple Prototypes - - # - -

-

Io supports multiple inheritance through its Protos list:

-
// Create two prototypes
-Flyable := Object clone
-Flyable fly := method("Flying..." println)
-
-Swimmable := Object clone
-Swimmable swim := method("Swimming..." println)
-
-// Create an object with multiple prototypes
-Duck := Object clone
-Duck appendProto(Flyable)
-Duck appendProto(Swimmable)
-
-mallard := Duck clone
-mallard fly     // "Flying..."
-mallard swim    // "Swimming..."
-
-// Inspect the prototype list
-Duck protos println  // list(Object_0x..., Flyable_0x..., Swimmable_0x...)
-
-

The search order for slots is depth-first through the Protos list.

-

- Comparing Approaches: Class vs Prototype - - # - -

-

Let’s implement the same concept in both paradigms to see the differences.

-

- Class-Based (Python) - - # - -

-
class Shape:
-    def __init__(self):
-        self.x = 0
-        self.y = 0
-    
-    def move(self, dx, dy):
-        self.x += dx
-        self.y += dy
-
-class Circle(Shape):
-    def __init__(self, radius):
-        super().__init__()
-        self.radius = radius
-    
-    def area(self):
-        return 3.14159 * self.radius ** 2
-
-# Usage
-circle = Circle(5)
-circle.move(10, 20)
-print(circle.area())
-
-# Can't easily create a one-off variation
-# Would need to define a new class
-
-

- Prototype-Based (Io) - - # - -

-
Shape := Object clone
-Shape x := 0
-Shape y := 0
-Shape move := method(dx, dy,
-    x = x + dx
-    y = y + dy
-)
-
-Circle := Shape clone
-Circle radius := 0
-Circle area := method(
-    3.14159 * radius * radius
-)
-
-// Usage
-circle := Circle clone
-circle radius = 5
-circle move(10, 20)
-circle area println
-
-// Easy to create one-off variations
-specialCircle := Circle clone
-specialCircle area = method(
-    "Special area: " print
-    resend  // Call the original method
-)
-specialCircle area  // "Special area: 78.53975"
-
-

- The Power of Prototypes - - # - -

-

- 1. Objects as Classes - - # - -

-

In Io, objects can act as classes when needed:

-
// Person acts like a class
-Person := Object clone
-Person init := method(
-    self name := "Unknown"
-    self age := 0
-    self
-)
-
-Person create := method(n, a,
-    clone init name = n age = a
-)
-
-// Usage feels class-like
-alice := Person create("Alice", 30)
-bob := Person create("Bob", 25)
-
-

- 2. One-Off Objects - - # - -

-

You can create unique objects without defining a “class”:

-
// Create a unique object with no "class"
-singleton := Object clone
-singleton data := Map clone
-singleton store := method(key, value,
-    data atPut(key, value)
-)
-singleton retrieve := method(key,
-    data at(key)
-)
-
-// Use it directly
-singleton store("user", "Alice")
-singleton retrieve("user") println  // "Alice"
-
-

- 3. Runtime Class Modification - - # - -

-

You can fundamentally change what a “class” does:

-
Number := Object clone
-Number value := 0
-Number + := method(n,
-    result := Number clone
-    result value = self value + n value
-    result
-)
-
-// Create numbers
-five := Number clone value = 5
-three := Number clone value = 3
-
-// Now change how Number works
-Number + = method(n,
-    result := Number clone
-    result value = self value * n value  // Multiply instead!
-    result
-)
-
-// Existing numbers use the new behavior
-eight := five + three
-eight value println  // 15 (multiplication!)
-
-

- Delegation vs Inheritance - - # - -

-

Prototype-based languages use delegation rather than inheritance. When an object doesn’t have a slot, it delegates to its prototype:

-
Account := Object clone
-Account balance := 0
-Account deposit := method(amount,
-    balance = balance + amount
-    self
-)
-
-savings := Account clone
-savings deposit(100)
-
-// Let's trace what happens:
-// 1. savings receives 'deposit' message
-// 2. savings doesn't have 'deposit' slot
-// 3. savings delegates to Account
-// 4. Account's deposit method runs
-// 5. But 'self' is still savings
-// 6. So savings's balance is updated
-
-savings balance println    // 100
-Account balance println    // 0 (unchanged)
-
-

This is subtly different from class-based inheritance where methods are copied or looked up in a class hierarchy.

-

- Practical Patterns - - # - -

-

- The Constructor Pattern - - # - -

-

While Io doesn’t have constructors, you can create them:

-
Person := Object clone
-Person init := method(name, age,
-    self name := name
-    self age := age
-    self
-)
-
-Person new := method(name, age,
-    self clone init(name, age)
-)
-
-// Usage
-alice := Person new("Alice", 30)
-
-

- The Mixin Pattern - - # - -

-

Use prototypes as mixins for shared behavior:

-
// Define mixins
-Timestamped := Object clone
-Timestamped createdAt := Date now
-Timestamped age := method(
-    Date now - createdAt
-)
-
-Serializable := Object clone
-Serializable toJson := method(
-    // Implementation
-)
-
-// Use mixins
-Document := Object clone
-Document appendProto(Timestamped)
-Document appendProto(Serializable)
-
-doc := Document clone
-doc age println
-doc toJson
-
-

- The Factory Pattern - - # - -

-

Objects can create other objects with specific configurations:

-
ShapeFactory := Object clone
-ShapeFactory circle := method(radius,
-    c := Object clone
-    c radius := radius
-    c area := method(3.14159 * radius * radius)
-    c
-)
-
-ShapeFactory rectangle := method(width, height,
-    r := Object clone
-    r width := width
-    r height := height
-    r area := method(width * height)
-    r
-)
-
-// Usage
-myCircle := ShapeFactory circle(5)
-myRect := ShapeFactory rectangle(10, 20)
-
-

- JavaScript: A Familiar Prototype System - - # - -

-

If you know JavaScript, you’ve already used prototype-based programming:

-
// JavaScript (before ES6 classes)
-function Animal(name) {
-    this.name = name;
-}
-
-Animal.prototype.speak = function() {
-    console.log("Some sound");
-};
-
-function Dog(name) {
-    Animal.call(this, name);
-}
-
-Dog.prototype = Object.create(Animal.prototype);
-Dog.prototype.bark = function() {
-    console.log("Woof!");
-};
-
-

But JavaScript complicated things with constructor functions and later added class syntax as sugar. Io keeps prototypes pure and simple.

-

- Common Misconceptions - - # - -

-

- “No Classes Means No Structure” - - # - -

-

False. You can create well-structured programs with prototypes:

-
// Define clear prototype hierarchies
-Vehicle := Object clone
-Vehicle speed := 0
-
-Car := Vehicle clone
-Car wheels := 4
-
-ElectricCar := Car clone
-ElectricCar batteryLevel := 100
-
-// The structure is clear and maintainable
-
-

- “Prototypes Are Just Classes With Different Syntax” - - # - -

-

False. Prototypes are more flexible:

-
// Start with a prototype
-Dog := Object clone
-Dog bark := method("Woof!" println)
-
-fido := Dog clone
-
-// Later, change fido's prototype!
-Cat := Object clone
-Cat meow := method("Meow!" println)
-
-fido protos = list(Cat)
-fido meow  // "Meow!" - fido is now a cat!
-
-

You can’t change an object’s class at runtime in most class-based languages.

-

- “Multiple Inheritance Is Always Confusing” - - # - -

-

Io’s prototype lists make multiple inheritance explicit and controllable:

-
A := Object clone
-A foo := method("A's foo" println)
-
-B := Object clone  
-B foo := method("B's foo" println)
-
-C := Object clone
-C appendProto(A)
-C appendProto(B)
-
-C foo  // "A's foo" (A comes first in the list)
-
-// Reorder to change priority
-C protos = list(B, A)
-C foo  // "B's foo" (B now comes first)
-
-

- Exercises - - # - -

-
    -
  1. -

    Prototype Chain Explorer: Write a method that prints an object’s complete prototype chain with indentation showing the hierarchy.

    -
  2. -
  3. -

    Class Emulator: Create a Class object that provides new, extends, and other class-like conveniences while using prototypes underneath.

    -
  4. -
  5. -

    Multiple Inheritance Diamond: Create a diamond inheritance pattern (D inherits from B and C, which both inherit from A) and explore how Io resolves method conflicts.

    -
  6. -
  7. -

    Dynamic Reclassing: Write a become method that changes an object’s prototype chain to make it “become” an instance of a different prototype.

    -
  8. -
  9. -

    Prototype Versioning: Implement a system where objects can “lock” to a specific version of their prototype, unaffected by later prototype modifications.

    -
  10. -
-

- Real-World Implications - - # - -

-

Prototype-based programming shines in certain scenarios:

-
    -
  1. Rapid Prototyping: Create and modify objects on the fly without defining classes
  2. -
  3. Dynamic Systems: Systems where object behavior needs to change at runtime
  4. -
  5. DSLs: Domain-specific languages where objects morph based on context
  6. -
  7. Learning: Understanding prototypes deepens your understanding of JavaScript
  8. -
  9. Simplicity: No distinction between classes and objects means fewer concepts
  10. -
-

- Conclusion - - # - -

-

Prototype-based programming isn’t just “classes with different syntax”—it’s a fundamentally different way of thinking about objects and inheritance. Instead of rigid templates (classes) and instances, you have a fluid world where any object can serve as a template for others, where inheritance is delegation, and where the structure of your program can change at runtime.

-

This flexibility can be overwhelming at first, especially if you’re used to the safety of static classes. But it can also be liberating. You’re not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows.

-

In the next chapter, we’ll dive deeper into how objects communicate through Io’s message passing system—the heartbeat of the language.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/05-messages-and-slots/index.html b/website/public/docs/05-messages-and-slots/index.html deleted file mode 100644 index df81518..0000000 --- a/website/public/docs/05-messages-and-slots/index.html +++ /dev/null @@ -1,1154 +0,0 @@ - - - - - - - - - - - - - - - -Messages and Slots | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Messages and Slots

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Messages and Slots

- -
Chapter 5
- -
- - - - - -

At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth.

-

- The Anatomy of a Message - - # - -

-

When you write this in Io:

-
person setName("Alice")
-
-

What actually happens? Let’s break it down:

-
    -
  1. person is the receiver - the object receiving the message
  2. -
  3. setName is the message name (or selector)
  4. -
  5. "Alice" is the argument to the message
  6. -
  7. The entire expression is a message send
  8. -
-

But here’s where it gets interesting. Messages are objects too:

-
// Create a message object
-msg := message(person setName("Alice"))
-
-// Inspect it
-msg name println          // setName
-msg arguments println     // list(Message_0x...)
-msg arguments first code println  // "Alice"
-
-// Execute it
-msg doInContext(Lobby)    // Actually calls person setName("Alice")
-
-

- Slots: The Object’s Memory - - # - -

-

Slots are named storage locations in objects. They can hold any value:

-
obj := Object clone
-
-// Create slots with different values
-obj number := 42                    // Number
-obj text := "hello"                 // String
-obj method := method(x, x * 2)      // Method
-obj child := Object clone            // Another object
-obj flag := true                     // Boolean
-
-// List all slots
-obj slotNames println
-// list(number, text, method, child, flag)
-
-// Check for slots
-obj hasSlot("number") println       // true
-obj hasSlot("missing") println      // false
-
-// Get slot values
-obj getSlot("number") println       // 42
-obj getSlot("method") println       // method(x, ...)
-
-

- The Message Resolution Algorithm - - # - -

-

When an object receives a message, Io follows a specific algorithm to find the corresponding slot:

-
Animal := Object clone
-Animal speak := method("generic sound" println)
-
-Dog := Animal clone
-Dog speak := method("woof" println)
-Dog wagTail := method("wagging..." println)
-
-rover := Dog clone
-rover name := "Rover"
-
-// When rover receives 'speak':
-rover speak
-// 1. Look for 'speak' in rover - not found
-// 2. Look for 'speak' in rover's proto (Dog) - found!
-// 3. Execute Dog's speak method with rover as self
-
-// When rover receives 'name':
-rover name
-// 1. Look for 'name' in rover - found!
-// 2. Return the value
-
-// Visual representation:
-/*
-    Object
-      ↑
-    Animal (speak: "generic sound")
-      ↑
-     Dog (speak: "woof", wagTail)
-      ↑
-    rover (name: "Rover")
-*/
-
-

- Creating and Modifying Slots - - # - -

-

Io distinguishes between creating new slots and updating existing ones:

-
obj := Object clone
-
-// Create a new slot with :=
-obj x := 10
-obj hasSlot("x") println         // true
-
-// Update existing slot with =
-obj x = 20
-obj x println                    // 20
-
-// Trying to update non-existent slot fails
-obj y = 30                       // Exception: Slot y not found
-
-// But you can use setSlot to create or update
-obj setSlot("y", 30)            // Creates if doesn't exist
-obj y println                    // 30
-
-// Remove slots
-obj removeSlot("y")
-obj hasSlot("y") println        // false
-
-

This distinction helps catch typos:

-
counter := 0
-countr = 1    // Error! Probably meant 'counter'
-
-

- Methods Are Just Slots - - # - -

-

In Io, methods aren’t special—they’re just slots that hold executable blocks:

-
Calculator := Object clone
-
-// Method is just a slot containing a method object
-Calculator add := method(a, b, a + b)
-
-// You can manipulate methods like any other value
-addMethod := Calculator getSlot("add")
-addMethod type println           // Block
-
-// You can copy methods between objects
-ScientificCalc := Object clone
-ScientificCalc addition := Calculator getSlot("add")
-ScientificCalc addition(5, 3) println  // 8
-
-// You can even store methods in variables
-operation := method(x, x * 2)
-Calculator double := operation
-Calculator double(21) println    // 42
-
-

- The ‘self’ and ‘sender’ Context - - # - -

-

Every method has access to special variables:

-
Printer := Object clone
-Printer name := "HP"
-Printer print := method(doc,
-    ("Printer: " .. self name) println    // self = receiver
-    ("Sender: " .. sender type) println   // sender = who sent the message
-    ("Document: " .. doc) println
-)
-
-Computer := Object clone
-Computer sendJob := method(
-    Printer print("report.pdf")
-)
-
-Computer sendJob
-// Printer: HP
-// Sender: Computer
-// Document: report.pdf
-
-

- Message Forwarding - - # - -

-

When an object doesn’t have a slot for a received message, it calls forward:

-
Proxy := Object clone
-Proxy target := nil
-Proxy forward := method(
-    ("Forwarding " .. call message name .. " to target") println
-    call evalArgAt(0) // This would forward to target
-)
-
-p := Proxy clone
-p doSomething("arg")
-// Forwarding doSomething to target
-
-

This enables powerful patterns like delegation and method missing:

-
// Ruby-style method_missing
-DynamicObject := Object clone
-DynamicObject forward := method(
-    methodName := call message name
-    if(methodName beginsWithSeq("get"),
-        # Handle getters
-        property := methodName afterSeq("get") lowercase
-        self getSlot(property),
-        # Handle setters
-        if(methodName beginsWithSeq("set"),
-            property := methodName afterSeq("set") lowercase
-            value := call evalArgAt(0)
-            self setSlot(property, value)
-        )
-    )
-)
-
-obj := DynamicObject clone
-obj setName("Alice")     // Creates 'name' slot
-obj getName println       // "Alice"
-
-

- Lazy Evaluation with Messages - - # - -

-

Messages don’t evaluate immediately—they’re data structures you can manipulate:

-
// Messages as data
-expr := message(2 + 3 * 4)
-expr println             // 2 +(3 *(4))
-
-// Evaluate when ready
-result := expr doInContext(Lobby)
-result println           // 14
-
-// Modify messages before evaluation
-expr := message(x + y)
-context := Object clone
-context x := 10
-context y := 20
-expr doInContext(context) println  // 30
-
-

This enables macro-like capabilities:

-
// Create a timing macro
-Object time := method(
-    code := call argAt(0)  // Get the message, not its value
-    start := Date now
-    result := code doInContext(call sender)
-    elapsed := Date now - start
-    ("Elapsed: " .. elapsed) println
-    result
-)
-
-// Use it
-time(
-    sum := 0
-    for(i, 1, 1000000, sum = sum + i)
-    sum
-)
-// Elapsed: 0.234
-// Returns: 500000500000
-
-

- Call Introspection - - # - -

-

The call object provides detailed information about the current method invocation:

-
Object debug := method(
-    "=== Call Debug ===" println
-    ("Sender: " .. call sender type) println
-    ("Target: " .. call target type) println
-    ("Message: " .. call message name) println
-    ("Args: " .. call message arguments) println
-    ("Activated: " .. call activated type) println
-    "================" println
-)
-
-TestObject := Object clone
-TestObject test := method(
-    debug
-)
-
-TestObject test
-// === Call Debug ===
-// Sender: Lobby
-// Target: TestObject
-// Message: debug
-// Args: list()
-// Activated: Block
-// ================
-
-

- Operator Messages - - # - -

-

Operators are messages with special precedence rules:

-
// These are equivalent
-2 + 3 * 4
-2 +(3 *(4))
-
-// You can see the precedence
-OperatorTable println
-
-// You can add custom operators
-OperatorTable addOperator("@@", 5)
-Number @@ := method(n,
-    self pow(n) + n pow(self)
-)
-
-2 @@ 3 println  // 17 (2^3 + 3^2 = 8 + 9)
-
-// Operators are just messages
-5 send("+", 3) println  // 8
-"hello" send("at", 1) println  // e
-
-

- Assignment Messages - - # - -

-

Even assignment is message passing:

-
// These are equivalent
-x := 10
-setSlot("x", 10)
-
-// And these
-x = 20
-updateSlot("x", 20)
-
-// You can override assignment behavior
-Object setSlot := method(name, value,
-    ("Setting " .. name .. " to " .. value) println
-    resend  // Call original setSlot
-)
-
-y := 42
-// Setting y to 42
-
-

- Method Activation vs. Value Access - - # - -

-

Io distinguishes between activatable and non-activatable values:

-
obj := Object clone
-
-// Methods are activatable - they run when accessed
-obj greet := method("Hello!" println)
-obj greet  // Prints "Hello!"
-
-// Other values are just returned
-obj name := "Alice"
-obj name  // Returns "Alice"
-
-// You can get a method without activating it
-m := obj getSlot("greet")
-m println  // method(...)
-
-// And activate it later
-m call  // Prints "Hello!"
-
-// Check if something is activatable
-obj getSlot("greet") isActivatable println  // true
-obj getSlot("name") isActivatable println   // false
-
-

- Building a Message-Based DSL - - # - -

-

Let’s build a simple HTML DSL using messages:

-
HTML := Object clone
-HTML forward := method(
-    tagName := call message name
-    args := call message arguments
-    
-    // Build opening tag
-    result := "<" .. tagName
-    
-    // Handle attributes (first arg if it's a Map)
-    if(args size > 0 and args at(0) name == "curlyBrackets",
-        attrs := call evalArgAt(0)
-        attrs foreach(key, value,
-            result = result .. " " .. key .. "=\"" .. value .. "\""
-        )
-        args removeFirst
-    )
-    
-    result = result .. ">"
-    
-    // Handle content
-    args foreach(arg,
-        content := call sender doMessage(arg)
-        if(content, result = result .. content)
-    )
-    
-    // Closing tag
-    result = result .. "</" .. tagName .. ">"
-    result
-)
-
-// Usage
-html := HTML clone
-
-page := html div({ "class": "container" },
-    html h1("Welcome"),
-    html p("This is a paragraph"),
-    html ul(
-        html li("Item 1"),
-        html li("Item 2")
-    )
-)
-
-page println
-// <div class="container"><h1>Welcome</h1><p>This is a paragraph</p><ul><li>Item 1</li><li>Item 2</li></ul></div>
-
-

- Performance Considerations - - # - -

-

Message passing has overhead compared to direct function calls:

-
// Traditional method call
-obj := Object clone
-obj directMethod := method(x, x * 2)
-
-// Message construction and sending
-msg := Message clone setName("directMethod") setArguments(list(Message clone setName("5")))
-
-// Benchmark
-time(
-    100000 times(obj directMethod(5))
-)
-
-time(
-    100000 times(obj doMessage(msg))
-)
-
-// Direct calls are faster, but message objects enable metaprogramming
-
-

- Common Patterns - - # - -

-

- Property Access Pattern - - # - -

-
Person := Object clone
-Person init := method(
-    self name := nil
-    self age := nil
-    self
-)
-
-// Generate getters/setters with messages
-Person addAccessors := method(slotName,
-    // Getter
-    self setSlot(slotName, 
-        method(self getSlot("_" .. slotName))
-    )
-    
-    // Setter  
-    self setSlot("set" .. slotName asCapitalized,
-        method(value, self setSlot("_" .. slotName, value))
-    )
-)
-
-Person addAccessors("name")
-Person addAccessors("age")
-
-p := Person clone
-p setName("Alice")
-p name println  // "Alice"
-
-

- Chain of Responsibility - - # - -

-
Handler := Object clone
-Handler next := nil
-Handler handle := method(request,
-    if(self canHandle(request),
-        self process(request),
-        if(next, next handle(request))
-    )
-)
-
-AuthHandler := Handler clone
-AuthHandler canHandle := method(request,
-    request hasSlot("needsAuth")
-)
-AuthHandler process := method(request,
-    "Authenticating..." println
-)
-
-LogHandler := Handler clone  
-LogHandler canHandle := method(request, true)
-LogHandler process := method(request,
-    ("Logging: " .. request type) println
-)
-
-// Build chain
-auth := AuthHandler clone
-log := LogHandler clone
-auth next := log
-
-// Process requests
-request := Object clone
-request type := "GET"
-request needsAuth := true
-
-auth handle(request)
-// Authenticating...
-// Logging: GET
-
-

- Debugging Messages - - # - -

-

Understanding message flow is crucial for debugging:

-
Object trace := method(
-    self setSlot("forward",
-        method(
-            ("Missing: " .. call message name) println
-            ("Arguments: " .. call message arguments) println
-            ("Sender: " .. sender type) println
-        )
-    )
-    self
-)
-
-buggy := Object clone trace
-buggy doSomethingWrong(1, 2, 3)
-// Missing: doSomethingWrong
-// Arguments: list(1, 2, 3)
-// Sender: Lobby
-
-

- Exercises - - # - -

-
    -
  1. -

    Message Logger: Create a wrapper that logs all messages sent to an object, including arguments and return values.

    -
  2. -
  3. -

    Lazy Properties: Implement properties that are only computed when first accessed, then cached.

    -
  4. -
  5. -

    Message Queue: Build an object that queues messages and executes them later in order.

    -
  6. -
  7. -

    Method Decorators: Create a system for wrapping methods with before/after behavior using messages.

    -
  8. -
  9. -

    Message Router: Build a router that directs messages to different handlers based on patterns.

    -
  10. -
-

- Advanced Message Techniques - - # - -

-

- Message Rewriting - - # - -

-
Rewriter := Object clone
-Rewriter forward := method(
-    msg := call message
-    
-    // Rewrite add to multiply
-    if(msg name == "add",
-        msg setName("multiply")
-    )
-    
-    // Continue with modified message
-    resend
-)
-
-calc := Rewriter clone
-calc multiply := method(a, b, a * b)
-calc add(3, 4) println  // 12 (rewritten to multiply!)
-
-

- Conditional Message Sending - - # - -

-
Object sendIf := method(condition, messageName,
-    if(condition,
-        self doMessage(Message clone setName(messageName))
-    )
-)
-
-Object sendUnless := method(condition, messageName,
-    if(condition not,
-        self doMessage(Message clone setName(messageName))
-    )
-)
-
-obj := Object clone
-obj greet := method("Hello!" println)
-
-obj sendIf(true, "greet")      // Hello!
-obj sendUnless(false, "greet")  // Hello!
-
-

- Conclusion - - # - -

-

Messages and slots form the foundation of Io’s object model. Every computation—from simple arithmetic to complex method calls—is accomplished through message passing. Objects store their state and behavior in slots, and respond to messages by looking up the corresponding slots.

-

This uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system.

-

Understanding messages and slots deeply is essential to mastering Io. They’re not just an implementation detail—they’re the conceptual core that makes Io’s radical simplicity possible.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/06-cloning-and-inheritance/index.html b/website/public/docs/06-cloning-and-inheritance/index.html deleted file mode 100644 index 45eed4f..0000000 --- a/website/public/docs/06-cloning-and-inheritance/index.html +++ /dev/null @@ -1,1204 +0,0 @@ - - - - - - - - - - - - - - - -Cloning and Inheritance | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Cloning and Inheritance

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Cloning and Inheritance

- -
Chapter 6
- -
- - - - - -

In class-based languages, inheritance is a relationship between classes. In Io’s prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively.

-

- The Mechanics of Cloning - - # - -

-

When you clone an object in Io, you don’t copy all its data. Instead, you create a new, empty object with a reference to the original:

-
// Create a prototype
-Animal := Object clone
-Animal species := "Unknown"
-Animal age := 0
-Animal describe := method(
-    ("A " .. age .. " year old " .. species) println
-)
-
-// Clone it
-cat := Animal clone
-
-// cat is empty but linked to Animal
-cat slotNames println        // list() - no local slots!
-cat species println          // "Unknown" - from Animal
-cat age println             // 0 - from Animal
-
-// The link is through 'proto'
-cat proto == Animal println  // true
-
-

This is fundamentally different from copying:

-
// If cloning was copying (it's not!), it would work like:
-catCopy := Object clone
-catCopy species := Animal species  // Copy each slot
-catCopy age := Animal age
-catCopy describe := Animal describe
-
-// But cloning actually creates a link:
-catClone := Animal clone  // Empty object linked to Animal
-
-

- Differential Inheritance in Action - - # - -

-

Objects only store their differences from their prototypes:

-
Vehicle := Object clone
-Vehicle speed := 60
-Vehicle color := "white"
-Vehicle drive := method(
-    ("Driving at " .. speed .. " mph") println
-)
-
-car := Vehicle clone
-car color = "red"  // Override color
-car model := "Sedan"  // Add new slot
-
-// Inspect what's stored where
-car slotNames println          // list(color, model) - only differences!
-Vehicle slotNames println      // list(speed, color, drive)
-
-// But car can access everything
-car speed println              // 60 - from Vehicle
-car color println              // "red" - from car (overrides Vehicle)
-car model println              // "Sedan" - from car
-car drive                      // "Driving at 60 mph"
-
-

Memory efficiency comparison:

-
// Creating 1000 cars
-cars := list()
-1000 times(i,
-    car := Vehicle clone
-    car id := i
-    cars append(car)
-)
-
-// Each car only stores its 'id' slot
-// All share Vehicle's methods and default values
-// In a copying system, each would duplicate everything
-
-

- The Prototype Chain - - # - -

-

Objects can have chains of prototypes:

-
Organism := Object clone
-Organism alive := true
-Organism metabolize := method("Converting energy..." println)
-
-Animal := Organism clone
-Animal mobile := true
-Animal move := method("Moving..." println)
-
-Mammal := Animal clone
-Mammal warmBlooded := true
-Mammal nurse := method("Nursing young..." println)
-
-Dog := Mammal clone
-Dog loyal := true
-Dog bark := method("Woof!" println)
-
-fido := Dog clone
-fido name := "Fido"
-
-// fido can access methods from the entire chain
-fido metabolize  // From Organism
-fido move        // From Animal
-fido nurse       // From Mammal
-fido bark        // From Dog
-
-// Trace the chain
-obj := fido
-while(obj != Object,
-    obj type println
-    obj = obj proto
-)
-// Dog
-// Mammal
-// Animal
-// Organism
-// Object
-
-

- Method Resolution Order - - # - -

-

When you send a message, Io searches up the prototype chain:

-
A := Object clone
-A foo := method("A's foo" println)
-A bar := method("A's bar" println)
-
-B := A clone
-B foo := method("B's foo" println)  // Override
-
-C := B clone
-C bar := method("C's bar" println)  // Override different method
-
-obj := C clone
-
-obj foo  // "B's foo" - found in B (C doesn't have it)
-obj bar  // "C's bar" - found in C
-obj baz  // Exception - not found anywhere
-
-

You can visualize the search:

-
Object findSlot := method(slotName,
-    obj := self
-    while(obj,
-        if(obj hasLocalSlot(slotName),
-            ("Found '" .. slotName .. "' in " .. obj type) println
-            return obj getSlot(slotName)
-        )
-        obj = obj proto
-    )
-    "Not found" println
-)
-
-obj findSlot("foo")  // Found 'foo' in B
-obj findSlot("bar")  // Found 'bar' in C
-
-

- Multiple Inheritance - - # - -

-

Io supports multiple inheritance through the protos list:

-
// Define capabilities
-Flyable := Object clone
-Flyable altitude := 0
-Flyable fly := method(height,
-    altitude = height
-    ("Flying at " .. altitude .. " feet") println
-)
-
-Swimmable := Object clone
-Swimmable depth := 0
-Swimmable swim := method(d,
-    depth = d
-    ("Swimming at " .. depth .. " feet deep") println
-)
-
-// Single inheritance
-Bird := Flyable clone
-Bird chirp := method("Chirp!" println)
-
-// Multiple inheritance
-Duck := Object clone
-Duck appendProto(Flyable)
-Duck appendProto(Swimmable)
-Duck quack := method("Quack!" println)
-
-mallard := Duck clone
-mallard fly(100)    // Flying at 100 feet
-mallard swim(5)     // Swimming at 5 feet deep
-mallard quack       // Quack!
-
-// Check the prototype list
-Duck protos println  // list(Object_0x..., Flyable_0x..., Swimmable_0x...)
-
-

- Diamond Problem Resolution - - # - -

-

The diamond problem occurs when multiple inheritance paths lead to the same ancestor:

-
// Diamond structure
-Grandparent := Object clone
-Grandparent value := "from grandparent"
-Grandparent method1 := method("Grandparent method1" println)
-
-Parent1 := Grandparent clone
-Parent1 method1 := method("Parent1 method1" println)
-Parent1 method2 := method("Parent1 method2" println)
-
-Parent2 := Grandparent clone
-Parent2 method1 := method("Parent2 method1" println)
-Parent2 method3 := method("Parent2 method3" println)
-
-Child := Object clone
-Child appendProto(Parent1)
-Child appendProto(Parent2)
-
-// Resolution order matters
-Child method1  // "Parent1 method1" - Parent1 comes first
-
-// Reorder to change priority
-Child protos := list(Parent2, Parent1)
-Child method1  // "Parent2 method1" - Parent2 now comes first
-
-

- Shallow vs Deep Cloning - - # - -

-

By default, cloning is shallow—slot values are shared:

-
Original := Object clone
-Original data := list(1, 2, 3)
-Original info := Map clone atPut("key", "value")
-
-Shallow := Original clone
-
-// Modifying mutable objects affects both
-Shallow data append(4)
-Original data println  // list(1, 2, 3, 4) - changed!
-
-// Need deep cloning for independence
-Object deepClone := method(
-    new := self clone
-    self slotNames foreach(name,
-        value := self getSlot(name)
-        if(value hasSlot("clone"),
-            new setSlot(name, value clone)
-        )
-    )
-    new
-)
-
-Deep := Original deepClone
-Deep data append(5)
-Original data println  // list(1, 2, 3, 4) - unchanged
-Deep data println      // list(1, 2, 3, 4, 5)
-
-

- init Methods and Constructors - - # - -

-

While Io doesn’t have constructors, you can create initialization patterns:

-
Person := Object clone
-Person init := method(
-    self name := "Unknown"
-    self age := 0
-    self contacts := list()  // Important: new list for each instance
-    self  // Return self for chaining
-)
-
-// Override clone to call init
-Person clone := method(
-    resend init
-)
-
-// Now each person gets their own contacts list
-alice := Person clone
-alice name = "Alice"
-alice contacts append("Bob")
-
-bob := Person clone
-bob name = "Bob"
-bob contacts append("Charlie")
-
-alice contacts println  // list("Bob") - independent!
-bob contacts println    // list("Charlie")
-
-

- Factory Methods - - # - -

-

Create specialized cloning methods:

-
Animal := Object clone
-Animal species := "Unknown"
-Animal sound := "..."
-
-Animal withSpecies := method(s,
-    new := self clone
-    new species = s
-    new
-)
-
-Animal dog := method(
-    self clone species = "Dog" sound = "Woof"
-)
-
-Animal cat := method(
-    self clone species = "Cat" sound = "Meow"
-)
-
-// Usage
-myDog := Animal dog
-myCat := Animal cat
-genericAnimal := Animal withSpecies("Elephant")
-
-

- Prototype Switching - - # - -

-

Unlike class-based languages, you can change an object’s prototype at runtime:

-
// Start with one prototype
-Bird := Object clone
-Bird fly := method("Flying..." println)
-
-Fish := Object clone
-Fish swim := method("Swimming..." println)
-
-creature := Bird clone
-creature fly  // "Flying..."
-
-// Change its prototype!
-creature protos = list(Fish)
-creature swim  // "Swimming..."
-creature fly   // Exception - no longer a Bird!
-
-// Or add capabilities
-creature appendProto(Bird)
-creature fly   // "Flying..." - now it can do both
-creature swim  // "Swimming..."
-
-

- Mixins and Traits - - # - -

-

Use prototypes as mixins for composable behavior:

-
// Define mixins
-Comparable := Object clone
-Comparable < := method(other, self compare(other) < 0)
-Comparable > := method(other, self compare(other) > 0)
-Comparable == := method(other, self compare(other) == 0)
-Comparable <= := method(other, self compare(other) <= 0)
-Comparable >= := method(other, self compare(other) >= 0)
-
-Enumerable := Object clone
-Enumerable select := method(block,
-    result := list()
-    self foreach(item,
-        if(block call(item), result append(item))
-    )
-    result
-)
-Enumerable map := method(block,
-    result := list()
-    self foreach(item,
-        result append(block call(item))
-    )
-    result
-)
-
-// Use mixins
-SortedList := List clone
-SortedList appendProto(Comparable)
-SortedList appendProto(Enumerable)
-SortedList compare := method(other,
-    self size compare(other size)
-)
-
-list1 := SortedList clone append(1, 2, 3)
-list2 := SortedList clone append(4, 5)
-(list1 > list2) println  // true (3 > 2)
-
-

- Clone Hooks - - # - -

-

Customize cloning behavior:

-
Counted := Object clone
-Counted instances := 0
-
-Counted clone := method(
-    Counted instances = Counted instances + 1
-    new := resend
-    new id := Counted instances
-    new
-)
-
-// Each clone gets a unique ID
-obj1 := Counted clone
-obj2 := Counted clone
-obj3 := Counted clone
-
-obj1 id println  // 1
-obj2 id println  // 2
-obj3 id println  // 3
-Counted instances println  // 3
-
-

- Inheritance Patterns - - # - -

-

- Classical Inheritance Pattern - - # - -

-

Emulate class-based inheritance:

-
// Base "class"
-Class := Object clone
-Class new := method(
-    instance := self clone
-    instance init
-    instance
-)
-
-// Define a "class"
-Rectangle := Class clone
-Rectangle init := method(
-    self width := 0
-    self height := 0
-)
-Rectangle area := method(width * height)
-
-// Inheritance
-Square := Rectangle clone
-Square init := method(
-    resend  // Call parent init
-    self side := 0
-)
-Square setSide := method(s,
-    side = s
-    width = s
-    height = s
-)
-
-// Usage
-rect := Rectangle new
-rect width = 10
-rect height = 20
-rect area println  // 200
-
-square := Square new
-square setSide(5)
-square area println  // 25
-
-

- Delegation Pattern - - # - -

-
Delegator := Object clone
-Delegator delegate := nil
-Delegator forward := method(
-    if(delegate,
-        delegate doMessage(call message, call sender)
-    ,
-        Exception raise("No delegate set")
-    )
-)
-
-Logger := Object clone
-Logger log := method(msg, ("[LOG] " .. msg) println)
-
-obj := Delegator clone
-obj delegate = Logger
-obj log("Hello")  // [LOG] Hello
-
-

- Testing Inheritance - - # - -

-

Check inheritance relationships:

-
Object isKindOf := method(proto,
-    obj := self
-    while(obj,
-        if(obj == proto, return true)
-        if(obj protos,
-            obj protos foreach(p,
-                if(p isKindOf(proto), return true)
-            )
-        )
-        obj = obj proto
-    )
-    false
-)
-
-Animal := Object clone
-Dog := Animal clone
-fido := Dog clone
-
-fido isKindOf(Dog) println     // true
-fido isKindOf(Animal) println  // true
-fido isKindOf(Object) println  // true
-fido isKindOf(Number) println  // false
-
-

- Performance Considerations - - # - -

-

Prototype chains affect performance:

-
// Deep chain - slower lookup
-A := Object clone
-B := A clone
-C := B clone
-D := C clone
-E := D clone
-obj := E clone
-obj method := method("Found!")
-
-// Shallow chain - faster lookup
-Flat := Object clone
-Flat method := method("Found!")
-obj2 := Flat clone
-
-// Benchmark
-time(100000 times(obj method))   // Slower
-time(100000 times(obj2 method))  // Faster
-
-

- Common Pitfalls - - # - -

-

- Shared Mutable State - - # - -

-
// WRONG - shares list between instances
-BadTemplate := Object clone
-BadTemplate items := list()
-
-obj1 := BadTemplate clone
-obj2 := BadTemplate clone
-obj1 items append(1)
-obj2 items println  // list(1) - Oops! Shared!
-
-// RIGHT - create new list for each instance
-GoodTemplate := Object clone
-GoodTemplate init := method(
-    self items := list()
-    self
-)
-GoodTemplate clone := method(resend init)
-
-

- Circular Prototypes - - # - -

-
// Don't do this!
-A := Object clone
-B := Object clone
-A appendProto(B)
-B appendProto(A)  // Circular!
-
-// A foo  // Infinite loop!
-
-

- Exercises - - # - -

-
    -
  1. -

    Instance Counter: Create a prototype that tracks how many objects have been cloned from it, directly or indirectly.

    -
  2. -
  3. -

    Prototype Inspector: Write a method that visualizes an object’s complete prototype hierarchy as a tree.

    -
  4. -
  5. -

    Deep Clone: Implement a robust deep cloning method that handles circular references.

    -
  6. -
  7. -

    Multiple Inheritance Resolver: Create a system that detects and reports conflicts in multiple inheritance.

    -
  8. -
  9. -

    Class Emulator: Build a complete class-based OOP system on top of Io’s prototypes, including abstract classes and interfaces.

    -
  10. -
-

- Real-World Example: Game Entity System - - # - -

-
// Base entity
-Entity := Object clone
-Entity init := method(
-    self x := 0
-    self y := 0
-    self health := 100
-    self
-)
-Entity clone := method(resend init)
-Entity takeDamage := method(amount,
-    health = health - amount
-    if(health <= 0, self die)
-)
-Entity die := method("Entity died" println)
-
-// Moveable capability
-Moveable := Object clone
-Moveable speed := 1
-Moveable moveTo := method(newX, newY,
-    x = newX
-    y = newY
-)
-
-// Attacker capability
-Attacker := Object clone
-Attacker damage := 10
-Attacker attack := method(target,
-    target takeDamage(damage)
-)
-
-// Compose entities
-Player := Entity clone
-Player appendProto(Moveable)
-Player appendProto(Attacker)
-Player speed = 5
-Player damage = 20
-
-Enemy := Entity clone
-Enemy appendProto(Moveable)
-Enemy appendProto(Attacker)
-Enemy speed = 3
-Enemy damage = 15
-
-// Static entity
-Turret := Entity clone
-Turret appendProto(Attacker)
-Turret damage = 25
-
-// Usage
-player := Player clone
-enemy := Enemy clone
-turret := Turret clone
-
-player moveTo(10, 10)
-player attack(enemy)
-turret attack(player)
-
-

- Conclusion - - # - -

-

Cloning and inheritance in Io demonstrate how complex behavior can emerge from simple mechanisms. Instead of classes, instances, and inheritance hierarchies defined at compile time, you have objects cloning objects, maintaining prototype links, and delegating message handling up the chain.

-

This flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating “classes” as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile.

-

Understanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren’t just how you create objects—they’re how you structure entire programs.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/07-control-flow/index.html b/website/public/docs/07-control-flow/index.html deleted file mode 100644 index 522d12c..0000000 --- a/website/public/docs/07-control-flow/index.html +++ /dev/null @@ -1,1223 +0,0 @@ - - - - - - - - - - - - - - - -Control Flow | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Control Flow

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Control Flow

- -
Chapter 7
- -
- - - - - -

In most programming languages, control flow structures like if, while, and for are built-in syntax with special rules. In Io, they’re just methods that receive messages. This chapter explores how Io’s message-passing philosophy extends to control flow, and how you can create your own control structures.

-

- Everything Is a Message - - # - -

-

Let’s start with a simple comparison. In C or Java:

-
if (x > 5) {
-    printf("Big\n");
-} else {
-    printf("Small\n");
-}
-
-

This is special syntax that the compiler understands. But in Io:

-
if(x > 5,
-    "Big" println,
-    "Small" println
-)
-
-

The if is just a method call! You can even see its implementation:

-
if println
-// method(...)
-
-// You could redefine it (don't actually do this!)
-Object if := method(condition, trueBlock, falseBlock,
-    "Making a decision!" println
-    resend  // Call original if
-)
-
-

- The if Method - - # - -

-

The if method takes two or three arguments:

-
// Two arguments: if-then
-if(temperature > 30,
-    "It's hot!" println
-)
-
-// Three arguments: if-then-else
-if(temperature > 30,
-    "It's hot!" println,
-    "It's nice!" println
-)
-
-// if returns the value of the executed block
-result := if(5 > 3, "yes", "no")
-result println  // "yes"
-
-// Nested if
-category := if(score > 90, "A",
-    if(score > 80, "B",
-        if(score > 70, "C", "F")
-    )
-)
-
-

- Understanding Blocks - - # - -

-

The key to Io’s control flow is that code blocks are objects that aren’t evaluated immediately:

-
// This prints immediately
-"Hello" println
-
-// This creates a block object but doesn't execute it
-block := method("Hello" println)
-
-// Execute it later
-block call  // Now it prints "Hello"
-
-// Blocks in if
-if(true,
-    "This is a block" println  // Not executed until if decides to
-)
-
-

This lazy evaluation is crucial. If both branches of an if were evaluated immediately, both would execute!

-
// In a hypothetical eager language:
-eagerIf := method(condition, trueValue, falseValue,
-    if(condition, trueValue, falseValue)
-)
-
-x := 5
-eagerIf(x > 3,
-    "Greater" println,  // This executes immediately
-    "Lesser" println    // This also executes immediately!
-)
-// Would print both!
-
-// But Io's if receives unevaluated blocks
-if(x > 3,
-    "Greater" println,  // Only this executes
-    "Lesser" println    // This never executes
-)
-
-

- The while Loop - - # - -

-

The while method repeatedly evaluates its condition and body:

-
i := 0
-while(i < 5,
-    i println
-    i = i + 1
-)
-// Prints 0, 1, 2, 3, 4
-
-// while returns nil by default
-result := while(false, "Never runs")
-result println  // nil
-
-// Infinite loops
-while(true,
-    input := File standardInput readLine
-    if(input == "quit", break)
-    ("You said: " .. input) println
-)
-
-

- The for Loop - - # - -

-

The for method provides a counting loop:

-
// Basic for loop
-for(i, 1, 5,
-    i println
-)
-// Prints 1, 2, 3, 4, 5
-
-// With step
-for(i, 0, 10, 2,
-    i println
-)
-// Prints 0, 2, 4, 6, 8, 10
-
-// Backward
-for(i, 5, 1,
-    i println
-)
-// Prints 5, 4, 3, 2, 1
-
-// for can return values
-sum := 0
-for(i, 1, 100,
-    sum = sum + i
-)
-sum println  // 5050
-
-

- The loop Method - - # - -

-

Io provides a loop method for infinite loops:

-
count := 0
-loop(
-    count = count + 1
-    if(count > 10, break)
-    count println
-)
-
-// Equivalent to while(true, ...)
-
-

- break and continue - - # - -

-

These work like in other languages, but they’re methods too:

-
// break exits the loop
-for(i, 1, 10,
-    if(i == 5, break)
-    i println
-)
-// Prints 1, 2, 3, 4
-
-// continue skips to next iteration
-for(i, 1, 10,
-    if(i % 2 == 0, continue)
-    i println
-)
-// Prints 1, 3, 5, 7, 9
-
-// break can return a value
-result := for(i, 1, 100,
-    if(i * i > 50, break(i))
-)
-result println  // 8 (first i where i*i > 50)
-
-

- The repeat Method - - # - -

-

A simpler counting mechanism:

-
5 repeat("Hello" println)
-// Prints "Hello" 5 times
-
-// repeat with index
-5 repeat(i, 
-    ("Count: " .. i) println
-)
-// Count: 0
-// Count: 1
-// Count: 2
-// Count: 3
-// Count: 4
-
-

- Creating Custom Control Structures - - # - -

-

Since control structures are just methods, you can create your own:

-
// unless: opposite of if
-Object unless := method(condition, falseBlock,
-    if(condition not, falseBlock call)
-)
-
-unless(5 > 10,
-    "5 is not greater than 10" println
-)
-
-// until: opposite of while
-Object until := method(condition, body,
-    while(condition not, body)
-)
-
-x := 0
-until(x > 5,
-    x println
-    x = x + 1
-)
-
-// times: repeat n times with cleaner syntax
-Number times := method(body,
-    for(i, 1, self, body)
-)
-
-3 times("Hello" println)
-
-

- The elseif Pattern - - # - -

-

Io uses elseif for chained conditionals:

-
score := 85
-
-if(score >= 90) then(
-    "A" println
-) elseif(score >= 80) then(
-    "B" println
-) elseif(score >= 70) then(
-    "C" println
-) else(
-    "F" println
-)
-// Prints "B"
-
-// This is actually a chain of methods
-// if returns a special object when false
-// that object has elseif and else methods
-
-

- Switch-like Behavior - - # - -

-

Io doesn’t have a switch statement, but you can build one:

-
Object switch := method(value,
-    self switchValue := value
-    self
-)
-
-Object case := method(testValue, action,
-    if(switchValue == testValue,
-        action call
-        self switchMatched := true
-    )
-    self
-)
-
-Object default := method(action,
-    if(hasSlot("switchMatched") not,
-        action call
-    )
-    self
-)
-
-// Usage
-day := "Tuesday"
-
-switch(day) case("Monday", 
-    "Start of the week" println
-) case("Tuesday",
-    "Second day" println
-) case("Friday",
-    "TGIF!" println
-) default(
-    "Regular day" println
-)
-// Prints "Second day"
-
-

- Pattern Matching - - # - -

-

Build more sophisticated matching:

-
Object match := method(
-    self matchValue := call evalArgAt(0)
-    self matchContext := call sender
-    self
-)
-
-Object when := method(pattern, action,
-    if(hasSlot("matchFound") not,
-        matched := false
-        
-        // Check different pattern types
-        if(pattern type == "Block",
-            matched = pattern call(matchValue),
-            matched = (pattern == matchValue)
-        )
-        
-        if(matched,
-            self matchResult := action call(matchValue)
-            self matchFound := true
-        )
-    )
-    self
-)
-
-Object otherwise := method(action,
-    if(hasSlot("matchFound") not,
-        self matchResult := action call(matchValue)
-    )
-    matchResult
-)
-
-// Usage
-result := match(x) when(
-    block(v, v < 0), 
-    method(v, "negative")
-) when(
-    0,
-    method(v, "zero")
-) when(
-    block(v, v > 0),
-    method(v, "positive")
-) otherwise(
-    method(v, "unknown")
-)
-
-

- Iterating Over Collections - - # - -

-

Collections have their own iteration methods:

-
// List iteration
-list(1, 2, 3) foreach(item,
-    item println
-)
-
-// With index
-list("a", "b", "c") foreach(i, item,
-    (i .. ": " .. item) println
-)
-// 0: a
-// 1: b
-// 2: c
-
-// Map iteration
-map := Map clone
-map atPut("name", "Alice")
-map atPut("age", 30)
-
-map foreach(key, value,
-    (key .. " = " .. value) println
-)
-// name = Alice
-// age = 30
-
-

- Functional Control Flow - - # - -

-

Io supports functional programming patterns:

-
// map: transform each element
-squares := list(1, 2, 3, 4) map(x, x * x)
-squares println  // list(1, 4, 9, 16)
-
-// select: filter elements
-evens := list(1, 2, 3, 4, 5, 6) select(x, x % 2 == 0)
-evens println  // list(2, 4, 6)
-
-// detect: find first matching element
-first_big := list(1, 3, 5, 7, 9) detect(x, x > 5)
-first_big println  // 7
-
-// reduce: aggregate elements
-sum := list(1, 2, 3, 4, 5) reduce(+)
-sum println  // 15
-
-product := list(1, 2, 3, 4) reduce(a, b, a * b)
-product println  // 24
-
-

- Lazy Evaluation Control - - # - -

-

Create control structures with lazy evaluation:

-
Object lazyIf := method(
-    condition := call argAt(0)
-    trueBlock := call argAt(1)
-    falseBlock := call argAt(2)
-    
-    if(condition doInContext(call sender),
-        trueBlock doInContext(call sender),
-        if(falseBlock,
-            falseBlock doInContext(call sender)
-        )
-    )
-)
-
-// Both condition and blocks are lazy
-x := 5
-lazyIf(x > 3 and computeExpensive(),
-    "True branch" println,
-    "False branch" println
-)
-
-

- Exception Handling as Control Flow - - # - -

-

Io’s try is also a control flow method:

-
try(
-    // Code that might fail
-    riskyOperation()
-) catch(Exception,
-    "An error occurred" println
-)
-
-// try-catch-finally pattern
-result := try(
-    file := File with("data.txt") openForReading
-    file contents
-) catch(Exception, e,
-    ("Error: " .. e message) println
-    nil
-) finally(
-    if(file, file close)
-)
-
-

- Performance Considerations - - # - -

-

Since control structures are methods, they have overhead:

-
// Method-based loop (slower)
-i := 0
-while(i < 1000000,
-    i = i + 1
-)
-
-// But you can't really avoid it in Io
-// The language is optimized for expressiveness over speed
-
-

- Advanced: Coroutine-based Control - - # - -

-

Io’s coroutines enable advanced control flow:

-
// Generator pattern
-Generator := Object clone
-Generator init := method(
-    self coro := Coroutine currentCoroutine
-    self
-)
-
-Generator yield := method(value,
-    coro pause(value)
-)
-
-Generator fibonacci := method(
-    a := 0
-    b := 1
-    loop(
-        yield(a)
-        temp := a + b
-        a = b
-        b = temp
-    )
-)
-
-// Usage
-gen := Generator clone
-fib := gen @fibonacci  // @ runs in new coroutine
-
-10 repeat(
-    fib resume println
-)
-// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
-
-

- Common Patterns - - # - -

-

- Early Return Pattern - - # - -

-
Object findFirst := method(list, condition,
-    list foreach(item,
-        if(condition call(item),
-            return item
-        )
-    )
-    nil
-)
-
-result := findFirst(list(1, 2, 3, 4, 5), 
-    block(x, x > 3)
-)
-result println  // 4
-
-

- Guard Clause Pattern - - # - -

-
processData := method(data,
-    if(data isNil, return "No data")
-    if(data size == 0, return "Empty data")
-    if(data size > 1000, return "Too much data")
-    
-    // Process data
-    "Processed" return
-)
-
-

- Loop with State - - # - -

-
Object loopWithState := method(initial, condition, update, body,
-    state := initial
-    while(condition call(state),
-        body call(state)
-        state = update call(state)
-    )
-    state
-)
-
-// Sum squares until sum > 100
-result := loopWithState(
-    list(0, 1),  // [sum, n]
-    block(state, state at(0) <= 100),
-    block(state, list(state at(0) + state at(1) squared, state at(1) + 1)),
-    block(state, ("n=" .. state at(1) .. " sum=" .. state at(0)) println)
-)
-
-

- Debugging Control Flow - - # - -

-
Object trace := method(label,
-    (label .. " - evaluating") println
-    self
-)
-
-Object debugIf := method(condition, trueBlock, falseBlock,
-    "Evaluating condition..." println
-    result := condition
-    ("Condition is: " .. result) println
-    
-    if(result,
-        "Taking true branch" println
-        trueBlock,
-        "Taking false branch" println
-        falseBlock
-    )
-)
-
-x := 5
-debugIf(x trace("x") > trace("3") 3,
-    "Greater" println,
-    "Lesser" println
-)
-
-

- Exercises - - # - -

-
    -
  1. -

    do-while Loop: Implement a doWhile method that executes the body at least once.

    -
  2. -
  3. -

    for-each with Break: Create a forEachBreakable that allows breaking with a return value.

    -
  4. -
  5. -

    Retry Logic: Build a retry control structure that retries an operation n times on failure.

    -
  6. -
  7. -

    Parallel If: Create a parallelIf that evaluates both branches concurrently and returns the first to complete.

    -
  8. -
  9. -

    State Machine: Implement a state machine DSL using custom control structures.

    -
  10. -
-

- Real-World Example: Retry with Backoff - - # - -

-
Object retryWithBackoff := method(maxAttempts, baseDelay, operation,
-    attempt := 1
-    lastError := nil
-    
-    while(attempt <= maxAttempts,
-        try(
-            return operation call(attempt)
-        ) catch(Exception, e,
-            lastError = e
-            if(attempt < maxAttempts,
-                delay := baseDelay * (2 pow(attempt - 1))
-                ("Attempt " .. attempt .. " failed, waiting " .. delay .. "ms") println
-                System sleep(delay / 1000)
-            )
-        )
-        attempt = attempt + 1
-    )
-    
-    Exception raise("Failed after " .. maxAttempts .. " attempts: " .. lastError message)
-)
-
-// Usage
-result := retryWithBackoff(3, 100,
-    block(attempt,
-        ("Trying attempt " .. attempt) println
-        if(Random value < 0.7,
-            Exception raise("Random failure"),
-            "Success!"
-        )
-    )
-)
-
-

- Conclusion - - # - -

-

Io’s approach to control flow—implementing everything as methods rather than special syntax—is both radical and elegant. It demonstrates the power of Io’s uniform message-passing model: when everything is a message, even fundamental programming constructs become malleable and extensible.

-

This flexibility allows you to:

-
    -
  • Create domain-specific control structures
  • -
  • Implement new programming paradigms
  • -
  • Debug and trace control flow
  • -
  • Understand exactly how your program executes
  • -
-

The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/08-collections/index.html b/website/public/docs/08-collections/index.html deleted file mode 100644 index f9a836f..0000000 --- a/website/public/docs/08-collections/index.html +++ /dev/null @@ -1,1422 +0,0 @@ - - - - - - - - - - - - - - - -Collections | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Collections

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Collections

- -
Chapter 8
- -
- - - - - -

Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types.

-

- Lists: Ordered Collections - - # - -

-

Lists in Io are dynamic arrays that can hold any type of object:

-
// Creating lists
-empty := list()
-numbers := list(1, 2, 3, 4, 5)
-mixed := list("hello", 42, true, Object clone)
-
-// Lists are objects
-numbers type println  // List
-
-// Basic operations
-numbers size println      // 5
-numbers isEmpty println   // false
-numbers first println     // 1
-numbers last println      // 5
-numbers at(2) println     // 3 (zero-indexed)
-
-

- List Manipulation - - # - -

-
fruits := list("apple", "banana")
-
-// Adding elements
-fruits append("orange")
-fruits prepend("grape")
-fruits println  // list(grape, apple, banana, orange)
-
-// Insert at position
-fruits atInsert(2, "mango")
-fruits println  // list(grape, apple, mango, banana, orange)
-
-// Removing elements
-fruits remove("mango")
-fruits removeAt(0)
-fruits pop  // Removes and returns last element
-fruits println  // list(apple, banana)
-
-// Multiple operations
-fruits appendSeq(list("kiwi", "peach"))
-fruits println  // list(apple, banana, kiwi, peach)
-
-

- List Iteration - - # - -

-
numbers := list(1, 2, 3, 4, 5)
-
-// Basic iteration
-numbers foreach(n,
-    n println
-)
-
-// With index
-numbers foreach(i, n,
-    (i .. ": " .. n) println
-)
-
-// Reverse iteration
-numbers reverseForEach(n,
-    n println
-)
-
-

- Functional Operations - - # - -

-
numbers := list(1, 2, 3, 4, 5)
-
-// Map: transform each element
-squared := numbers map(x, x * x)
-squared println  // list(1, 4, 9, 16, 25)
-
-// Select: filter elements
-evens := numbers select(x, x % 2 == 0)
-evens println  // list(2, 4)
-
-// Reject: inverse of select
-odds := numbers reject(x, x % 2 == 0)
-odds println  // list(1, 3, 5)
-
-// Detect: find first match
-firstEven := numbers detect(x, x % 2 == 0)
-firstEven println  // 2
-
-// Reduce: aggregate
-sum := numbers reduce(+)
-sum println  // 15
-
-// Custom reduce
-product := numbers reduce(a, b, a * b)
-product println  // 120
-
-// Any/all predicates
-numbers contains(3) println  // true
-numbers containsAll(list(2, 4)) println  // true
-numbers containsAny(list(10, 3)) println  // true
-
-

- List Slicing and Manipulation - - # - -

-
letters := list("a", "b", "c", "d", "e")
-
-// Slicing
-letters slice(1, 3) println  // list(b, c, d)
-letters slice(2) println     // list(c, d, e)
-
-// Copying
-copy := letters copy
-copy atPut(0, "z")
-letters println  // list(a, b, c, d, e) - unchanged
-copy println     // list(z, b, c, d, e)
-
-// Sorting
-numbers := list(3, 1, 4, 1, 5, 9)
-numbers sort println  // list(1, 1, 3, 4, 5, 9)
-
-// Custom sort
-people := list(
-    Object clone do(name := "Alice"; age := 30),
-    Object clone do(name := "Bob"; age := 25),
-    Object clone do(name := "Charlie"; age := 35)
-)
-
-people sortBy(block(p, p age)) foreach(p,
-    (p name .. ": " .. p age) println
-)
-// Bob: 25
-// Alice: 30
-// Charlie: 35
-
-

- Maps: Key-Value Stores - - # - -

-

Maps (also called dictionaries or hash tables) store key-value pairs:

-
// Creating maps
-empty := Map clone
-person := Map clone atPut("name", "Alice") atPut("age", 30)
-
-// Alternative creation
-person := Map with(
-    "name", "Alice",
-    "age", 30,
-    "city", "New York"
-)
-
-// Accessing values
-person at("name") println     // Alice
-person at("missing") println  // nil
-person at("missing", "default") println  // default
-
-// Setting values
-person atPut("age", 31)
-person atPut("email", "alice@example.com")
-
-// Checking keys
-person hasKey("name") println  // true
-person hasKey("phone") println  // false
-
-

- Map Operations - - # - -

-
map := Map with("a", 1, "b", 2, "c", 3)
-
-// Get all keys and values
-map keys println    // list(a, b, c)
-map values println  // list(1, 2, 3)
-
-// Size and emptiness
-map size println      // 3
-map isEmpty println   // false
-
-// Removing entries
-map removeAt("b")
-map println  // Map_0x...: a=1, c=3
-
-// Iteration
-map foreach(key, value,
-    (key .. " => " .. value) println
-)
-
-// Merging maps
-other := Map with("c", 30, "d", 4)
-map merge(other)
-map println  // a=1, c=30, d=4 (note c was overwritten)
-
-

- Maps as Objects - - # - -

-

Maps can act like objects with dynamic properties:

-
// Create object-like map
-obj := Map clone
-obj atPut("greet", method(name,
-    ("Hello, " .. name .. "!") println
-))
-obj atPut("x", 10)
-obj atPut("y", 20)
-
-// Use like object (sort of)
-obj at("greet") call("World")  // Hello, World!
-obj at("x") println  // 10
-
-

- Sequences: String Handling - - # - -

-

Sequences are Io’s strings, but they’re mutable and act like byte arrays:

-
text := "Hello, World!"
-
-// Basic operations
-text size println          // 13
-text at(0) println        // 72 (ASCII 'H')
-text at(0) asCharacter println  // H
-
-// Slicing
-text slice(0, 5) println   // Hello
-text slice(7) println      // World!
-
-// Searching
-text findSeq("World") println  // 7 (index)
-text containsSeq("Hello") println  // true
-text beginsWithSeq("Hello") println  // true
-text endsWithSeq("!") println  // true
-
-

- String Manipulation - - # - -

-
text := "  Hello, World!  "
-
-// Trimming
-text strip println         // "Hello, World!"
-text lstrip println        // "Hello, World!  "
-text rstrip println        // "  Hello, World!"
-
-// Case conversion
-"hello" upper println      // HELLO
-"WORLD" lower println      // world
-"hello world" asCapitalized println  // Hello world
-
-// Replacement
-"hello world" replaceSeq("world", "Io") println  // hello Io
-"abcabc" replaceFirstSeq("a", "X") println  // Xbcabc
-
-// Splitting and joining
-words := "apple,banana,orange" split(",")
-words println  // list(apple, banana, orange)
-
-words join("-") println  // apple-banana-orange
-
-

- String Building - - # - -

-
// Inefficient string concatenation
-result := ""
-for(i, 1, 1000,
-    result = result .. i .. ", "
-)
-
-// Better: use a list
-parts := list()
-for(i, 1, 1000,
-    parts append(i)
-)
-result := parts join(", ")
-
-// Or use Sequence's mutable nature
-seq := Sequence clone
-for(i, 1, 100,
-    seq appendSeq(i asString) appendSeq(", ")
-)
-
-

- Regular Expressions - - # - -

-

Io has built-in regex support:

-
text := "The year 2024 has 365 days"
-
-// Find matches
-text findRegex("\\d+") println  // MatchResult...
-text allMatchesOfRegex("\\d+") foreach(match,
-    match println  // 2024, 365
-)
-
-// Replace with regex
-text replaceAllRegex("\\d+", "N") println  // The year N has N days
-
-// Capture groups
-email := "user@example.com"
-match := email matchesOfRegex("(\\w+)@(\\w+\\.\\w+)") 
-if(match,
-    match at(1) println  // user
-    match at(2) println  // example.com
-)
-
-

- Creating Custom Collections - - # - -

-

- Stack Implementation - - # - -

-
Stack := List clone
-Stack push := method(item,
-    self append(item)
-)
-
-Stack pop := method(
-    if(size > 0,
-        removeAt(size - 1),
-        nil
-    )
-)
-
-Stack peek := method(
-    if(size > 0,
-        at(size - 1),
-        nil
-    )
-)
-
-// Usage
-stack := Stack clone
-stack push(1) push(2) push(3)
-stack pop println   // 3
-stack peek println  // 2
-stack pop println   // 2
-stack pop println   // 1
-
-

- Queue Implementation - - # - -

-
Queue := Object clone
-Queue init := method(
-    self items := list()
-    self
-)
-
-Queue enqueue := method(item,
-    items append(item)
-    self
-)
-
-Queue dequeue := method(
-    if(items size > 0,
-        items removeAt(0),
-        nil
-    )
-)
-
-Queue isEmpty := method(items isEmpty)
-Queue size := method(items size)
-
-// Usage
-queue := Queue clone init
-queue enqueue("a") enqueue("b") enqueue("c")
-queue dequeue println  // a
-queue dequeue println  // b
-queue size println     // 1
-
-

- Set Implementation - - # - -

-
Set := Object clone
-Set init := method(
-    self items := Map clone
-    self
-)
-
-Set add := method(item,
-    items atPut(item asString, item)
-    self
-)
-
-Set remove := method(item,
-    items removeAt(item asString)
-    self
-)
-
-Set contains := method(item,
-    items hasKey(item asString)
-)
-
-Set union := method(other,
-    result := Set clone init
-    items foreach(k, v, result add(v))
-    other items foreach(k, v, result add(v))
-    result
-)
-
-Set intersection := method(other,
-    result := Set clone init
-    items foreach(k, v,
-        if(other contains(v), result add(v))
-    )
-    result
-)
-
-// Usage
-set1 := Set clone init add(1) add(2) add(3)
-set2 := Set clone init add(2) add(3) add(4)
-
-set1 contains(2) println  // true
-union := set1 union(set2)
-intersection := set1 intersection(set2)
-
-

- Advanced Collection Patterns - - # - -

-

- Lazy Evaluation - - # - -

-
LazyList := Object clone
-LazyList init := method(generator,
-    self generator := generator
-    self cache := list()
-    self
-)
-
-LazyList at := method(index,
-    while(cache size <= index,
-        cache append(generator call(cache size))
-    )
-    cache at(index)
-)
-
-LazyList take := method(n,
-    result := list()
-    for(i, 0, n - 1,
-        result append(self at(i))
-    )
-    result
-)
-
-// Infinite fibonacci sequence
-fibGen := LazyList clone init(block(n,
-    if(n < 2, n, self at(n - 1) + self at(n - 2))
-))
-
-fibGen take(10) println  // list(0, 1, 1, 2, 3, 5, 8, 13, 21, 34)
-
-

- Collection Pipeline - - # - -

-
// Method chaining for data processing
-data := list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
-
-result := data select(x, x % 2 == 0) \
-    map(x, x * x) \
-    select(x, x > 10) \
-    reduce(+)
-
-result println  // 120 (16 + 36 + 64)
-
-// Custom pipeline
-List pipeline := method(
-    Pipeline clone setList(self)
-)
-
-Pipeline := Object clone
-Pipeline setList := method(list,
-    self list := list
-    self
-)
-
-Pipeline where := method(predicate,
-    self list = list select(predicate)
-    self
-)
-
-Pipeline transform := method(mapper,
-    self list = list map(mapper)
-    self
-)
-
-Pipeline aggregate := method(reducer,
-    list reduce(reducer)
-)
-
-// Usage
-numbers := list(1, 2, 3, 4, 5)
-total := numbers pipeline \
-    where(x, x % 2 == 0) \
-    transform(x, x * x) \
-    aggregate(+)
-
-total println  // 20 (4 + 16)
-
-

- Nested Collections - - # - -

-
// Matrix as list of lists
-matrix := list(
-    list(1, 2, 3),
-    list(4, 5, 6),
-    list(7, 8, 9)
-)
-
-// Access element
-matrix at(1) at(2) println  // 6
-
-// Transpose
-transpose := method(matrix,
-    rows := matrix size
-    cols := matrix at(0) size
-    result := list()
-    
-    for(c, 0, cols - 1,
-        col := list()
-        for(r, 0, rows - 1,
-            col append(matrix at(r) at(c))
-        )
-        result append(col)
-    )
-    result
-)
-
-transpose(matrix) println
-// list(list(1, 4, 7), list(2, 5, 8), list(3, 6, 9))
-
-

- Performance Considerations - - # - -

-
// List operations performance
-list := List clone
-
-// O(1) operations
-list append(item)      // Constant time
-list at(index)         // Constant time
-list size              // Constant time
-
-// O(n) operations
-list indexOf(item)     // Linear search
-list contains(item)    // Linear search
-list remove(item)      // Linear search + shift
-
-// Map operations are generally O(1)
-map := Map clone
-map atPut(key, value)  // Constant average
-map at(key)            // Constant average
-map removeAt(key)      // Constant average
-
-// Choose the right collection for your needs
-
-

- Collection Serialization - - # - -

-
// JSON serialization
-list := list(1, 2, 3, Map with("name", "Alice"))
-json := list asJson
-json println  // [1,2,3,{"name":"Alice"}]
-
-// Deserialize
-restored := json parseJson
-restored println
-
-// Custom serialization
-Collection := Object clone
-Collection serialize := method(
-    result := list()
-    self foreach(item,
-        if(item hasSlot("serialize"),
-            result append(item serialize),
-            result append(item asString)
-        )
-    )
-    result join("|")
-)
-
-

- Common Pitfalls - - # - -

-

- Shared References - - # - -

-
// PROBLEM: Shared reference
-original := list(1, 2, 3)
-copy := original  // Not a copy!
-copy append(4)
-original println  // list(1, 2, 3, 4) - modified!
-
-// SOLUTION: Use copy
-original := list(1, 2, 3)
-copy := original copy
-copy append(4)
-original println  // list(1, 2, 3) - unchanged
-
-

- Iterator Invalidation - - # - -

-
// PROBLEM: Modifying while iterating
-list := list(1, 2, 3, 4, 5)
-list foreach(item,
-    if(item % 2 == 0,
-        list remove(item)  // Dangerous!
-    )
-)
-
-// SOLUTION: Use select/reject or iterate on copy
-list := list(1, 2, 3, 4, 5)
-list = list reject(item, item % 2 == 0)
-
-

- Exercises - - # - -

-
    -
  1. -

    Circular Buffer: Implement a fixed-size circular buffer that overwrites old elements.

    -
  2. -
  3. -

    MultiMap: Create a map that can store multiple values per key.

    -
  4. -
  5. -

    Sorted List: Implement a list that maintains sorted order on insertion.

    -
  6. -
  7. -

    Tree Structure: Build a tree collection with parent-child relationships.

    -
  8. -
  9. -

    Graph: Implement a graph data structure with nodes and edges.

    -
  10. -
-

- Real-World Example: Todo List with Tags - - # - -

-
TodoItem := Object clone
-TodoItem init := method(description,
-    self description := description
-    self tags := Set clone init
-    self completed := false
-    self
-)
-
-TodoList := Object clone
-TodoList init := method(
-    self items := list()
-    self
-)
-
-TodoList add := method(description,
-    item := TodoItem clone init(description)
-    items append(item)
-    item
-)
-
-TodoList taggedWith := method(tag,
-    items select(item, item tags contains(tag))
-)
-
-TodoList pending := method(
-    items select(item, item completed not)
-)
-
-TodoList complete := method(description,
-    item := items detect(i, i description == description)
-    if(item, item completed = true)
-    self
-)
-
-// Usage
-todos := TodoList clone init
-
-todos add("Write documentation") tags add("work") add("writing")
-todos add("Fix bugs") tags add("work") add("urgent")
-todos add("Buy groceries") tags add("personal")
-
-todos taggedWith("urgent") foreach(item,
-    item description println
-)
-// Fix bugs
-
-todos complete("Buy groceries")
-todos pending foreach(item,
-    item description println
-)
-// Write documentation
-// Fix bugs
-
-

- Conclusion - - # - -

-

Io’s collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They’re all objects, following Io’s uniform object model, and support functional programming patterns like map, select, and reduce.

-

The real power comes from Io’s flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/09-blocks-and-closures/index.html b/website/public/docs/09-blocks-and-closures/index.html deleted file mode 100644 index ef96055..0000000 --- a/website/public/docs/09-blocks-and-closures/index.html +++ /dev/null @@ -1,1229 +0,0 @@ - - - - - - - - - - - - - - - -Blocks and Closures | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Blocks and Closures

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Blocks and Closures

- -
Chapter 9
- -
- - - - - -

Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io.

-

- Understanding Blocks and Methods - - # - -

-

In Io, block and method are similar but have a crucial difference:

-
// Block - creates its own scope
-blk := block(x, x * 2)
-blk call(5) println  // 10
-
-// Method - shares scope with receiver
-obj := Object clone
-obj value := 10
-obj meth := method(x, x * value)  // Can access 'value'
-obj blk := block(x, x * value)    // Error when called - no 'value' in block scope
-
-obj meth(5) println  // 50
-// obj blk call(5)  // Exception: value not found
-
-

The key difference:

-
    -
  • Methods have access to self and the receiver’s slots
  • -
  • Blocks create their own scope and don’t have automatic access to self
  • -
-

- Creating and Calling Blocks - - # - -

-
// Simple block
-double := block(x, x * 2)
-double call(5) println  // 10
-
-// Multi-argument block
-add := block(a, b, a + b)
-add call(3, 4) println  // 7
-
-// No-argument block
-greet := block("Hello!" println)
-greet call  // Hello!
-
-// Blocks are objects
-double type println  // Block
-double proto println  // Block_0x...
-
-

- Blocks as Closures - - # - -

-

Blocks capture variables from their creation context:

-
makeCounter := method(
-    count := 0
-    block(
-        count = count + 1
-        count
-    )
-)
-
-counter1 := makeCounter()
-counter2 := makeCounter()
-
-counter1 call println  // 1
-counter1 call println  // 2
-counter2 call println  // 1 (independent)
-counter1 call println  // 3
-
-

This is different from many languages where you need special syntax for closures:

-
// JavaScript
-function makeCounter() {
-    let count = 0;
-    return function() {
-        count++;
-        return count;
-    };
-}
-
-

In Io, all blocks are closures automatically.

-

- The Scope Chain - - # - -

-

Understanding scope is crucial for blocks:

-
x := "global"
-
-outer := method(
-    x := "outer"
-    
-    inner := block(
-        x println  // What prints?
-    )
-    
-    inner
-)
-
-myBlock := outer()
-myBlock call  // "outer" - captured from creation context
-
-x = "changed global"
-myBlock call  // Still "outer" - closure captures variables, not global
-
-

- Methods and self - - # - -

-

Methods have access to self (the receiver):

-
Calculator := Object clone
-Calculator value := 0
-
-Calculator add := method(n,
-    self value = self value + n  // Explicit self
-    value  // Implicit self
-)
-
-Calculator addBlock := block(n,
-    // No automatic self here!
-    // Would need to pass it explicitly
-)
-
-calc := Calculator clone
-calc add(5) println  // 5
-calc add(3) println  // 8
-
-

- Block Arguments and Defaults - - # - -

-
// Variable arguments
-sumAll := block(
-    args := call message arguments
-    total := 0
-    args foreach(arg,
-        total = total + call sender doMessage(arg)
-    )
-    total
-)
-
-sumAll call(1, 2, 3, 4, 5) println  // 15
-
-// Default arguments (manual)
-greetWithDefault := block(name,
-    if(name isNil, name = "World")
-    ("Hello, " .. name .. "!") println
-)
-
-greetWithDefault call("Alice")  // Hello, Alice!
-greetWithDefault call()        // Hello, World!
-
-

- Higher-Order Functions - - # - -

-

Blocks enable functional programming patterns:

-
// Functions returning functions
-makeMultiplier := method(factor,
-    block(x, x * factor)
-)
-
-double := makeMultiplier(2)
-triple := makeMultiplier(3)
-
-double call(5) println  // 10
-triple call(5) println  // 15
-
-// Functions taking functions
-twice := method(f, x,
-    f call(f call(x))
-)
-
-twice(block(n, n + 1), 5) println  // 7
-
-// Composition
-compose := method(f, g,
-    block(x, f call(g call(x)))
-)
-
-addOne := block(x, x + 1)
-double := block(x, x * 2)
-doubleThenAddOne := compose(addOne, double)
-
-doubleThenAddOne call(5) println  // 11
-
-

- Partial Application and Currying - - # - -

-
// Partial application
-add := block(a, b, a + b)
-
-addFive := block(x, add call(5, x))
-addFive call(3) println  // 8
-
-// Currying
-curry := method(f,
-    block(a,
-        block(b,
-            f call(a, b)
-        )
-    )
-)
-
-curriedAdd := curry(add)
-add5 := curriedAdd call(5)
-add5 call(3) println  // 8
-
-// More practical example
-formatString := block(template, value,
-    template interpolate(value)
-)
-
-curriedFormat := curry(formatString)
-errorFormatter := curriedFormat call("Error: #{value}")
-successFormatter := curriedFormat call("Success: #{value}")
-
-errorFormatter call("File not found") println  // Error: File not found
-successFormatter call("Operation complete") println  // Success: Operation complete
-
-

- Lazy Evaluation with Blocks - - # - -

-

Blocks don’t evaluate until called, enabling lazy patterns:

-
// Lazy if (already built-in, but here's how it works)
-lazyIf := method(condition, trueBlock, falseBlock,
-    if(condition,
-        trueBlock call,
-        falseBlock call
-    )
-)
-
-x := 5
-lazyIf(x > 3,
-    block("Greater" println),
-    block("Lesser" println)
-)
-
-// Lazy infinite sequences
-naturals := method(start,
-    block(
-        n := start
-        block(
-            current := n
-            n = n + 1
-            current
-        )
-    ) call
-)
-
-seq := naturals(1)
-5 repeat(seq call println)  // 1, 2, 3, 4, 5
-
-

- Memoization - - # - -

-

Use closures to cache expensive computations:

-
memoize := method(f,
-    cache := Map clone
-    
-    block(
-        args := call message arguments
-        key := args asString
-        
-        if(cache hasKey(key),
-            cache at(key),
-            result := f call(args)
-            cache atPut(key, result)
-            result
-        )
-    )
-)
-
-// Expensive fibonacci
-fib := block(n,
-    if(n < 2, n, fib call(n - 1) + fib call(n - 2))
-)
-
-// Memoized version
-fastFib := memoize(fib)
-
-// Much faster on repeated calls
-time(fib call(30)) println
-time(fastFib call(30)) println
-
-

- Block Introspection - - # - -

-

Blocks are objects you can inspect:

-
myBlock := block(x, y, x + y * 2)
-
-// Inspect structure
-myBlock argumentNames println  // list(x, y)
-myBlock code println           // x +(y *(2))
-
-// Modify blocks
-myBlock setArgumentNames(list("a", "b"))
-myBlock argumentNames println  // list(a, b)
-
-// Create blocks programmatically
-code := "a + b"
-args := list("a", "b")
-dynamicBlock := Block clone setArgumentNames(args) setCode(code)
-dynamicBlock call(3, 4) println  // 7
-
-

- Blocks in Data Structures - - # - -

-
// Table of operations
-operations := Map with(
-    "+", block(a, b, a + b),
-    "-", block(a, b, a - b),
-    "*", block(a, b, a * b),
-    "/", block(a, b, a / b)
-)
-
-calculate := method(op, a, b,
-    operations at(op) call(a, b)
-)
-
-calculate("+", 5, 3) println  // 8
-calculate("*", 4, 7) println  // 28
-
-// Event handlers
-EventEmitter := Object clone
-EventEmitter init := method(
-    self events := Map clone
-    self
-)
-
-EventEmitter on := method(event, handler,
-    if(events hasKey(event) not,
-        events atPut(event, list())
-    )
-    events at(event) append(handler)
-    self
-)
-
-EventEmitter emit := method(event, data,
-    if(events hasKey(event),
-        events at(event) foreach(handler,
-            handler call(data)
-        )
-    )
-    self
-)
-
-// Usage
-emitter := EventEmitter clone init
-emitter on("click", block(data,
-    ("Clicked at: " .. data) println
-))
-emitter on("click", block(data,
-    ("Another handler: " .. data) println
-))
-
-emitter emit("click", "x=10, y=20")
-// Clicked at: x=10, y=20
-// Another handler: x=10, y=20
-
-

- Control Flow with Blocks - - # - -

-

Create custom control structures:

-
// Retry logic
-retry := method(times, block,
-    attempts := 0
-    loop(
-        attempts = attempts + 1
-        e := try(result := block call)
-        
-        if(e isNil, return result)
-        if(attempts >= times, Exception raise(e))
-        
-        ("Attempt " .. attempts .. " failed, retrying...") println
-    )
-)
-
-// Usage
-result := retry(3, block(
-    if(Random value < 0.7,
-        Exception raise("Random failure"),
-        "Success!"
-    )
-))
-
-// While with condition block
-whileTrue := method(conditionBlock, bodyBlock,
-    while(conditionBlock call, bodyBlock call)
-)
-
-i := 0
-whileTrue(
-    block(i < 5),
-    block(
-        i println
-        i = i + 1
-    )
-)
-
-

- Performance Considerations - - # - -

-
// Method vs Block performance
-obj := Object clone
-obj value := 10
-
-obj method1 := method(x, x + value)
-obj block1 := block(x, x + 10)
-
-// Methods are slightly faster for object operations
-time(100000 repeat(obj method1(5)))
-time(100000 repeat(obj block1 call(5)))
-
-// But blocks are better for functional patterns
-numbers := list(1, 2, 3, 4, 5)
-time(numbers map(x, x * 2))  // Using block syntax
-
-

- Advanced Patterns - - # - -

-

- Continuation-Style Programming - - # - -

-
// Continuation passing style
-factorial := method(n, continuation,
-    if(n <= 1,
-        continuation call(1),
-        factorial(n - 1, block(result,
-            continuation call(n * result)
-        ))
-    )
-)
-
-factorial(5, block(result, result println))  // 120
-
-

- Monadic Patterns - - # - -

-
// Maybe monad
-Maybe := Object clone
-Maybe Nothing := Maybe clone
-Maybe Just := method(value,
-    m := Maybe clone
-    m value := value
-    m isNothing := false
-    m
-)
-Maybe Nothing isNothing := true
-
-Maybe bind := method(f,
-    if(isNothing, Maybe Nothing, f call(value))
-)
-
-Maybe map := method(f,
-    if(isNothing, 
-        Maybe Nothing,
-        Maybe Just(f call(value))
-    )
-)
-
-// Usage
-result := Maybe Just(5) \
-    map(block(x, x * 2)) \
-    bind(block(x, 
-        if(x > 5, 
-            Maybe Just(x), 
-            Maybe Nothing)
-    )) \
-    map(block(x, x + 1))
-
-if(result isNothing not,
-    result value println  // 11
-)
-
-

- Transducers - - # - -

-
// Composable transformations
-mapping := method(f,
-    method(reducer,
-        block(acc, item,
-            reducer call(acc, f call(item))
-        )
-    )
-)
-
-filtering := method(pred,
-    method(reducer,
-        block(acc, item,
-            if(pred call(item),
-                reducer call(acc, item),
-                acc
-            )
-        )
-    )
-)
-
-// Compose transducers
-transduce := method(xform, reducer, init, coll,
-    xreducer := xform call(reducer)
-    coll foreach(item,
-        init = xreducer call(init, item)
-    )
-    init
-)
-
-// Usage
-xform := filtering(block(x, x % 2 == 0)) call(
-    mapping(block(x, x * 2))
-)
-
-result := transduce(xform, 
-    block(acc, x, acc + x),
-    0,
-    list(1, 2, 3, 4, 5, 6)
-)
-result println  // 24 (2*2 + 4*2 + 6*2)
-
-

- Common Pitfalls - - # - -

-

- Variable Capture - - # - -

-
// PROBLEM: Loop variable capture
-handlers := list()
-for(i, 1, 3,
-    handlers append(block(i println))
-)
-
-handlers foreach(h, h call)  // All print 3!
-
-// SOLUTION: Create new scope
-handlers := list()
-for(i, 1, 3,
-    handlers append(
-        method(n, block(n println)) call(i)
-    )
-)
-
-handlers foreach(h, h call)  // 1, 2, 3
-
-

- Memory Leaks with Closures - - # - -

-
// PROBLEM: Closure keeps large object alive
-makeClosure := method(
-    hugeData := List clone
-    10000 repeat(hugeData append(Random value))
-    
-    block(x, x * 2)  // Doesn't use hugeData but keeps it alive!
-)
-
-// SOLUTION: Be explicit about captured variables
-makeClosure := method(
-    hugeData := List clone
-    10000 repeat(hugeData append(Random value))
-    processedValue := hugeData size  // Extract what you need
-    hugeData = nil  // Release reference
-    
-    block(x, x * processedValue)
-)
-
-

- Exercises - - # - -

-
    -
  1. -

    Promise Implementation: Create a Promise/Future system using blocks for async operations.

    -
  2. -
  3. -

    Stream Processing: Build a lazy stream processor with map, filter, and reduce.

    -
  4. -
  5. -

    Function Decorator: Implement decorators for logging, timing, and caching.

    -
  6. -
  7. -

    Parser Combinators: Create a simple parser combinator library using blocks.

    -
  8. -
  9. -

    Reactive System: Build a simple FRP (Functional Reactive Programming) system.

    -
  10. -
-

- Real-World Example: Pipeline Builder - - # - -

-
Pipeline := Object clone
-Pipeline init := method(
-    self steps := list()
-    self
-)
-
-Pipeline add := method(step,
-    steps append(step)
-    self
-)
-
-Pipeline map := method(f,
-    self add(block(data,
-        data map(f)
-    ))
-)
-
-Pipeline filter := method(pred,
-    self add(block(data,
-        data select(pred)
-    ))
-)
-
-Pipeline tap := method(f,
-    self add(block(data,
-        f call(data)
-        data
-    ))
-)
-
-Pipeline run := method(input,
-    result := input
-    steps foreach(step,
-        result = step call(result)
-    )
-    result
-)
-
-// Usage
-pipeline := Pipeline clone init \
-    filter(block(x, x % 2 == 0)) \
-    map(block(x, x * x)) \
-    tap(block(data, ("After squaring: " .. data) println)) \
-    filter(block(x, x > 10)) \
-    map(block(x, x asString))
-
-result := pipeline run(list(1, 2, 3, 4, 5, 6))
-// After squaring: list(4, 16, 36)
-result println  // list("16", "36")
-
-

- Conclusion - - # - -

-

Blocks and closures are fundamental to Io’s expressiveness. They’re not just anonymous functions—they’re first-class objects that capture context, enable functional programming, and allow you to extend the language with new control structures.

-

The distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io’s scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement.

-

Understanding blocks deeply unlocks Io’s full potential, enabling you to write code that’s both powerful and elegant.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/10-exceptions/index.html b/website/public/docs/10-exceptions/index.html deleted file mode 100644 index 6e57943..0000000 --- a/website/public/docs/10-exceptions/index.html +++ /dev/null @@ -1,1269 +0,0 @@ - - - - - - - - - - - - - - - -Exceptions | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Exceptions

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Exceptions

- -
Chapter 10
- -
- - - - - -

Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types.

-

- Basic Exception Handling - - # - -

-

Io uses try, catch, and raise for exception handling:

-
// Basic try-catch
-try(
-    10 / 0  // Division by zero
-) catch(Exception, e,
-    ("Error: " .. e message) println
-)
-// Error: divide by zero
-
-// Multiple catch blocks
-try(
-    someRiskyOperation()
-) catch(TypeError, e,
-    "Type error occurred" println
-) catch(IOException, e,
-    "IO error occurred" println
-) catch(Exception, e,
-    "Some other error occurred" println
-)
-
-

Compare with other languages:

-
# Python
-try:
-    result = 10 / 0
-except ZeroDivisionError as e:
-    print(f"Error: {e}")
-
-
// Java
-try {
-    int result = 10 / 0;
-} catch (ArithmeticException e) {
-    System.out.println("Error: " + e.getMessage());
-}
-
-

- Raising Exceptions - - # - -

-
// Raise a simple exception
-Exception raise("Something went wrong")
-
-// Raise with more information
-e := Exception clone
-e setMessage("File not found")
-e raise
-
-// Conditional raising
-validateAge := method(age,
-    if(age < 0, Exception raise("Age cannot be negative"))
-    if(age > 150, Exception raise("Age seems unrealistic"))
-    age
-)
-
-try(
-    validateAge(-5)
-) catch(Exception, e,
-    e message println  // Age cannot be negative
-)
-
-

- Exception Objects - - # - -

-

Exceptions are just objects:

-
// Examine exception structure
-e := Exception clone
-e type println           // Exception
-e proto println          // Object_0x...
-
-// Exception slots
-e setMessage("Test error")
-e message println        // Test error
-
-// Stack trace
-try(
-    Exception raise("Test")
-) catch(Exception, e,
-    e showStack  // Prints full stack trace
-    e coroutine println  // The coroutine where error occurred
-)
-
-

- Creating Custom Exceptions - - # - -

-
// Define custom exception types
-ValidationError := Exception clone
-ValidationError type := "ValidationError"
-
-NetworkError := Exception clone
-NetworkError type := "NetworkError"
-NetworkError code := nil
-NetworkError setCode := method(c, self code = c; self)
-
-// Use custom exceptions
-validateEmail := method(email,
-    if(email containsSeq("@") not,
-        ValidationError clone setMessage("Invalid email format") raise
-    )
-    email
-)
-
-fetchData := method(url,
-    // Simulate network error
-    if(Random value < 0.3,
-        NetworkError clone setMessage("Connection timeout") setCode(408) raise
-    )
-    "data"
-)
-
-// Handle specific exception types
-try(
-    validateEmail("badEmail")
-) catch(ValidationError, e,
-    ("Validation failed: " .. e message) println
-) catch(Exception, e,
-    ("Unexpected error: " .. e message) println
-)
-
-

- The finally Block - - # - -

-
// Ensure cleanup with finally
-file := nil
-try(
-    file = File with("data.txt") openForReading
-    contents := file contents
-    processData(contents)
-) catch(Exception, e,
-    ("Error reading file: " .. e message) println
-) finally(
-    if(file, file close)
-    "Cleanup complete" println
-)
-
-// finally always executes
-result := try(
-    "Success" println
-    42
-) catch(Exception, e,
-    "Error" println
-    0
-) finally(
-    "Always runs" println
-)
-// Prints: Success, Always runs
-result println  // 42
-
-

- Return Values and Exceptions - - # - -

-
// try returns a value
-result := try(
-    10 / 2
-) catch(Exception, e,
-    0  // Default value on error
-)
-result println  // 5
-
-// With error
-result := try(
-    10 / 0
-) catch(Exception, e,
-    0  // Default value on error
-)
-result println  // 0
-
-// Pattern: Result or default
-safeDiv := method(a, b,
-    try(a / b) catch(Exception, 0)
-)
-
-safeDiv(10, 2) println  // 5
-safeDiv(10, 0) println  // 0
-
-

- Exception Propagation - - # - -

-

Exceptions bubble up through the call stack:

-
level3 := method(
-    Exception raise("Error at level 3")
-)
-
-level2 := method(
-    "Level 2 start" println
-    level3()
-    "Level 2 end" println  // Never reached
-)
-
-level1 := method(
-    "Level 1 start" println
-    level2()
-    "Level 1 end" println  // Never reached
-)
-
-try(
-    level1()
-) catch(Exception, e,
-    ("Caught at top level: " .. e message) println
-)
-// Level 1 start
-// Level 2 start
-// Caught at top level: Error at level 3
-
-

- Rethrowing Exceptions - - # - -

-
processFile := method(filename,
-    try(
-        file := File with(filename) openForReading
-        // Process file
-    ) catch(Exception, e,
-        ("Failed to process " .. filename) println
-        e raise  // Rethrow the original exception
-    )
-)
-
-try(
-    processFile("nonexistent.txt")
-) catch(Exception, e,
-    "Caught rethrown exception" println
-)
-
-

- Error Recovery Patterns - - # - -

-

- Retry Pattern - - # - -

-
retryOperation := method(operation, maxAttempts,
-    attempts := 0
-    lastError := nil
-    
-    while(attempts < maxAttempts,
-        attempts = attempts + 1
-        
-        e := try(
-            return operation call(attempts)
-        )
-        
-        if(e,
-            lastError = e
-            ("Attempt " .. attempts .. " failed: " .. e message) println
-            if(attempts < maxAttempts, wait(0.5))
-        )
-    )
-    
-    Exception raise("All " .. maxAttempts .. " attempts failed. Last error: " .. lastError message)
-)
-
-// Usage
-result := retryOperation(
-    block(attempt,
-        if(Random value < 0.7,
-            Exception raise("Random failure"),
-            "Success on attempt " .. attempt
-        )
-    ),
-    3
-)
-
-

- Circuit Breaker - - # - -

-
CircuitBreaker := Object clone
-CircuitBreaker init := method(threshold, timeout,
-    self failureCount := 0
-    self threshold := threshold
-    self timeout := timeout
-    self state := "closed"  // closed, open, half-open
-    self lastFailureTime := nil
-    self
-)
-
-CircuitBreaker call := method(operation,
-    if(state == "open",
-        if(Date now - lastFailureTime > timeout,
-            state = "half-open"
-            "Circuit breaker entering half-open state" println,
-            Exception raise("Circuit breaker is open")
-        )
-    )
-    
-    e := try(
-        result := operation call
-        if(state == "half-open",
-            state = "closed"
-            failureCount = 0
-            "Circuit breaker closed" println
-        )
-        return result
-    )
-    
-    if(e,
-        failureCount = failureCount + 1
-        lastFailureTime = Date now
-        
-        if(failureCount >= threshold,
-            state = "open"
-            "Circuit breaker opened" println
-        )
-        
-        e raise
-    )
-)
-
-// Usage
-breaker := CircuitBreaker clone init(3, 5)
-
-unreliableService := block(
-    if(Random value < 0.8,
-        Exception raise("Service unavailable"),
-        "Service response"
-    )
-)
-
-5 repeat(
-    try(
-        breaker call(unreliableService) println
-    ) catch(Exception, e,
-        ("Failed: " .. e message) println
-    )
-    wait(1)
-)
-
-

- Assertion and Validation - - # - -

-
// Simple assertion
-assert := method(condition, message,
-    if(condition not,
-        Exception raise(message ifNilEval("Assertion failed"))
-    )
-)
-
-assert(5 > 3, "Math is broken")
-// assert(3 > 5, "This will fail")
-
-// Validation framework
-Validator := Object clone
-Validator rules := list()
-
-Validator addRule := method(rule, message,
-    rules append(list(rule, message))
-    self
-)
-
-Validator validate := method(value,
-    errors := list()
-    
-    rules foreach(rule,
-        if(rule at(0) call(value) not,
-            errors append(rule at(1))
-        )
-    )
-    
-    if(errors size > 0,
-        ValidationError clone setMessage(errors join(", ")) raise
-    )
-    
-    value
-)
-
-// Usage
-ageValidator := Validator clone \
-    addRule(block(v, v isKindOf(Number)), "Must be a number") \
-    addRule(block(v, v >= 0), "Must be non-negative") \
-    addRule(block(v, v <= 150), "Must be realistic")
-
-try(
-    ageValidator validate(25) println  // 25
-    ageValidator validate(-5)  // Throws
-) catch(ValidationError, e,
-    e message println  // Must be non-negative
-)
-
-

- Exception Context and Debugging - - # - -

-
// Enhanced exception with context
-ContextualException := Exception clone
-ContextualException context := Map clone
-
-ContextualException addContext := method(key, value,
-    context atPut(key, value)
-    self
-)
-
-ContextualException describe := method(
-    result := message .. "\nContext:\n"
-    context foreach(key, value,
-        result = result .. "  " .. key .. ": " .. value .. "\n"
-    )
-    result
-)
-
-// Usage
-processUser := method(userData,
-    if(userData at("age") < 18,
-        ContextualException clone \
-            setMessage("User too young") \
-            addContext("userId", userData at("id")) \
-            addContext("age", userData at("age")) \
-            addContext("timestamp", Date now) \
-            raise
-    )
-)
-
-try(
-    processUser(Map with("id", 123, "age", 16))
-) catch(ContextualException, e,
-    e describe println
-)
-
-

- Resource Management - - # - -

-
// RAII-style resource management
-withResource := method(resourceCreator, resourceUser,
-    resource := nil
-    try(
-        resource = resourceCreator call
-        resourceUser call(resource)
-    ) finally(
-        if(resource and resource hasSlot("close"),
-            resource close
-        )
-    )
-)
-
-// Usage
-withResource(
-    block(File with("test.txt") openForReading),
-    block(file,
-        file contents println
-    )
-)
-
-// Database connection example
-withConnection := method(dbUrl, operation,
-    conn := nil
-    try(
-        conn = Database connect(dbUrl)
-        conn beginTransaction
-        result := operation call(conn)
-        conn commit
-        result
-    ) catch(Exception, e,
-        if(conn, conn rollback)
-        e raise
-    ) finally(
-        if(conn, conn close)
-    )
-)
-
-

- Global Exception Handling - - # - -

-
// Install global exception handler
-System handleException := method(e,
-    logFile := File with("errors.log") openForAppending
-    logFile write(Date now asString .. " - " .. e message .. "\n")
-    logFile close
-    
-    // Original behavior
-    e showStack
-    System exit(1)
-)
-
-// Uncaught exceptions now get logged
-// Exception raise("Uncaught error")
-
-

- Testing with Exceptions - - # - -

-
// Test framework with exception support
-Test := Object clone
-Test assertRaises := method(exceptionType, block,
-    raised := false
-    try(
-        block call
-    ) catch(Exception, e,
-        if(e type == exceptionType type,
-            raised = true,
-            Exception raise("Wrong exception type: expected " .. exceptionType type .. ", got " .. e type)
-        )
-    )
-    
-    if(raised not,
-        Exception raise("Expected exception " .. exceptionType type .. " was not raised")
-    )
-)
-
-// Usage
-Test assertRaises(ValidationError, block(
-    validateEmail("invalid")
-))
-"Test passed" println
-
-

- Performance Considerations - - # - -

-
// Exceptions have overhead
-benchmark := method(name, iterations, block,
-    start := Date now
-    iterations repeat(block)
-    elapsed := Date now - start
-    (name .. ": " .. elapsed) println
-)
-
-// Without exceptions
-benchmark("No exceptions", 100000, block(
-    if(Random value < 0.1, nil, "success")
-))
-
-// With exceptions
-benchmark("With exceptions", 100000, block(
-    try(
-        if(Random value < 0.1, Exception raise("error"))
-        "success"
-    ) catch(Exception, nil)
-))
-
-// Exceptions are slower - use for exceptional cases, not control flow
-
-

- Common Pitfalls - - # - -

-

- Catching Too Broadly - - # - -

-
// BAD: Catches everything, hiding bugs
-try(
-    complexOperation()
-) catch(Exception, e,
-    // Silently ignore all errors
-)
-
-// GOOD: Catch specific exceptions
-try(
-    complexOperation()
-) catch(NetworkError, e,
-    handleNetworkError(e)
-) catch(ValidationError, e,
-    handleValidationError(e)
-)
-
-

- Resource Leaks - - # - -

-
// BAD: File not closed on error
-file := File with("data.txt") openForReading
-processFile(file)  // If this throws, file never closes
-file close
-
-// GOOD: Use finally
-file := nil
-try(
-    file = File with("data.txt") openForReading
-    processFile(file)
-) finally(
-    if(file, file close)
-)
-
-

- Exercises - - # - -

-
    -
  1. -

    Result Type: Implement a Result type that can be either Ok(value) or Error(error), similar to Rust.

    -
  2. -
  3. -

    Retry with Exponential Backoff: Create a retry mechanism with exponential backoff and jitter.

    -
  4. -
  5. -

    Exception Logger: Build a logging system that captures and categorizes exceptions.

    -
  6. -
  7. -

    Validation Chain: Create a validation system that accumulates all errors instead of failing on first.

    -
  8. -
  9. -

    Async Exception Handling: Implement exception handling for coroutine-based async operations.

    -
  10. -
-

- Real-World Example: HTTP Client with Error Handling - - # - -

-
HttpClient := Object clone
-HttpClient timeoutMs := 5000
-HttpClient maxRetries := 3
-
-HttpError := Exception clone
-HttpError statusCode := nil
-
-HttpClient get := method(url,
-    retryCount := 0
-    
-    loop(
-        try(
-            response := self doRequest(url)
-            
-            if(response statusCode >= 200 and response statusCode < 300,
-                return response body
-            )
-            
-            if(response statusCode >= 400 and response statusCode < 500,
-                // Client error - don't retry
-                HttpError clone \
-                    setMessage("HTTP " .. response statusCode) \
-                    setSlot("statusCode", response statusCode) \
-                    raise
-            )
-            
-            // Server error - might retry
-            if(response statusCode >= 500,
-                error := HttpError clone \
-                    setMessage("Server error: " .. response statusCode) \
-                    setSlot("statusCode", response statusCode)
-                
-                if(retryCount < maxRetries,
-                    retryCount = retryCount + 1
-                    delay := (2 pow(retryCount)) * 100
-                    ("Retry " .. retryCount .. " after " .. delay .. "ms") println
-                    wait(delay / 1000)
-                    continue,
-                    error raise
-                )
-            )
-            
-        ) catch(NetworkError, e,
-            if(retryCount < maxRetries,
-                retryCount = retryCount + 1
-                ("Network error, retry " .. retryCount) println
-                wait(1)
-                continue,
-                e raise
-            )
-        )
-    )
-)
-
-// Usage with comprehensive error handling
-fetchUserData := method(userId,
-    try(
-        data := HttpClient get("https://api.example.com/users/" .. userId)
-        JSON parse(data)
-    ) catch(HttpError, e,
-        if(e statusCode == 404,
-            nil,  // User not found
-            if(e statusCode == 401,
-                Exception raise("Authentication required"),
-                Exception raise("HTTP error: " .. e statusCode)
-            )
-        )
-    ) catch(NetworkError, e,
-        Exception raise("Network unavailable")
-    ) catch(Exception, e,
-        Exception raise("Unexpected error: " .. e message)
-    )
-)
-
-

- Conclusion - - # - -

-

Io’s exception system demonstrates the language’s consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling.

-

The key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with finally blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/11-metaprogramming/index.html b/website/public/docs/11-metaprogramming/index.html deleted file mode 100644 index d5bd7a3..0000000 --- a/website/public/docs/11-metaprogramming/index.html +++ /dev/null @@ -1,1243 +0,0 @@ - - - - - - - - - - - - - - - -Metaprogramming | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Metaprogramming

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Metaprogramming

- -
Chapter 11
- -
- - - - - -

Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io’s powerful metaprogramming capabilities.

-

- Messages as Data - - # - -

-

In Io, code is data. Messages are objects you can create, inspect, and manipulate:

-
// Create a message from code
-msg := message(2 + 3 * 4)
-
-// Inspect its structure
-msg println              // 2 +(3 *(4))
-msg name println         // +
-msg arguments println    // list(Message_0x...)
-msg arguments at(0) println  // 3 *(4)
-
-// Evaluate it
-result := msg doInContext(Lobby)
-result println           // 14
-
-// Modify it
-msg setName("*")
-msg doInContext(Lobby) println  // 6 (now it's 2 * 3 * 4)
-
-

Compare this to Lisp’s code-as-data philosophy:

-
; Lisp
-(defparameter code '(+ 2 (* 3 4)))
-(eval code)  ; 14
-
-

But Io uses messages instead of lists, which feels more natural for object-oriented code.

-

- Building Messages Programmatically - - # - -

-
// Build a message from scratch
-msg := Message clone
-msg setName("println")
-msg setArguments(list(Message clone setName("\"Hello, World!\"")))
-
-// Execute it
-Lobby doMessage(msg)  // Hello, World!
-
-// Build more complex messages
-createAdder := method(n,
-    msg := Message clone setName("+")
-    msg setArguments(list(Message clone setName(n asString)))
-    msg
-)
-
-adder5 := createAdder(5)
-7 doMessage(adder5) println  // 12
-
-

- Method Introspection - - # - -

-

Methods are objects you can examine and modify:

-
obj := Object clone
-obj greet := method(name, "Hello, " .. name .. "!")
-
-// Get the method object
-m := obj getSlot("greet")
-m type println                    // Block
-m argumentNames println           // list(name)
-m code println                   // "Hello, " ..(name) ..("!")
-
-// Modify method implementation
-obj greet = method(name, "Goodbye, " .. name .. "!")
-obj greet("World") println       // Goodbye, World!
-
-// Copy methods between objects
-other := Object clone
-other sayHi := obj getSlot("greet")
-other sayHi("Io") println        // Goodbye, Io!
-
-

- The call Object - - # - -

-

The call object provides runtime context information:

-
Object introspect := method(
-    "=== Call Introspection ===" println
-    ("Sender: " .. call sender type) println
-    ("Target: " .. call target type) println
-    ("Message: " .. call message) println
-    ("Arguments: " .. call message arguments) println
-    ("Activated: " .. call activated) println
-    "========================" println
-)
-
-TestObj := Object clone
-TestObj test := method(a, b,
-    introspect
-    a + b
-)
-
-TestObj test(5, 3)
-// === Call Introspection ===
-// Sender: Lobby
-// Target: TestObj
-// Message: introspect
-// Arguments: list()
-// Activated: method(...)
-// ========================
-
-

- Dynamic Method Creation - - # - -

-

Create methods at runtime:

-
// Create getters and setters dynamically
-Object addProperty := method(name, defaultValue,
-    // Create storage slot
-    self setSlot("_" .. name, defaultValue)
-    
-    // Create getter
-    self setSlot(name, 
-        method(self getSlot("_" .. call message name))
-    )
-    
-    // Create setter
-    self setSlot("set" .. name asCapitalized,
-        method(value,
-            self setSlot("_" .. call message name beforeSeq("set") asLowercase, value)
-            self  // For chaining
-        )
-    )
-)
-
-Person := Object clone
-Person addProperty("name", "Unknown")
-Person addProperty("age", 0)
-
-p := Person clone
-p setName("Alice") setAge(30)
-p name println   // Alice
-p age println    // 30
-
-

- Method Missing Pattern - - # - -

-

Intercept undefined method calls:

-
DynamicObject := Object clone
-DynamicObject forward := method(
-    messageName := call message name
-    args := call message arguments
-    
-    ("Intercepted: " .. messageName) println
-    ("Arguments: " .. args) println
-    
-    // Handle dynamically
-    if(messageName beginsWithSeq("get"),
-        property := messageName afterSeq("get") asLowercase
-        return self getSlot(property)
-    )
-    
-    if(messageName beginsWithSeq("set"),
-        property := messageName afterSeq("set") asLowercase
-        value := call evalArgAt(0)
-        return self setSlot(property, value)
-    )
-    
-    Exception raise("Unknown method: " .. messageName)
-)
-
-obj := DynamicObject clone
-obj setName("Bob")      // Intercepted: setName
-obj getName println      // Bob
-
-

- Code Generation - - # - -

-

Generate code as strings and evaluate:

-
// Generate a class-like structure
-generateClass := method(className, properties,
-    code := className .. " := Object clone\n"
-    
-    // Generate init method
-    code = code .. className .. " init := method(\n"
-    properties foreach(prop,
-        code = code .. "    self " .. prop .. " := nil\n"
-    )
-    code = code .. "    self\n)\n"
-    
-    // Generate property accessors
-    properties foreach(prop,
-        // Getter
-        code = code .. className .. " " .. prop .. " := method(_" .. prop .. ")\n"
-        // Setter
-        code = code .. className .. " set" .. prop asCapitalized .. " := method(v, _" .. prop .. " = v; self)\n"
-    )
-    
-    code doString  // Evaluate the generated code
-    Lobby getSlot(className)  // Return the created object
-)
-
-// Use the generator
-Car := generateClass("Car", list("make", "model", "year"))
-myCar := Car clone init
-myCar setMake("Toyota") setModel("Camry") setYear(2020)
-myCar make println  // Toyota
-
-

- Aspect-Oriented Programming - - # - -

-

Implement cross-cutting concerns:

-
// Method wrapping for logging
-Object addLogging := method(methodName,
-    original := self getSlot(methodName)
-    
-    self setSlot(methodName, method(
-        ("Calling " .. methodName .. " with args: " .. call message arguments) println
-        result := nil
-        e := try(result = original doMessage(call message, call sender))
-        if(e,
-            ("Error in " .. methodName .. ": " .. e message) println
-            e raise,
-            ("Returned: " .. result) println
-            result
-        )
-    ))
-)
-
-Calculator := Object clone
-Calculator add := method(a, b, a + b)
-Calculator divide := method(a, b, a / b)
-
-Calculator addLogging("add")
-Calculator addLogging("divide")
-
-Calculator add(5, 3)
-// Calling add with args: list(5, 3)
-// Returned: 8
-
-Calculator divide(10, 0)
-// Calling divide with args: list(10, 0)
-// Error in divide: divide by zero
-
-

- Macro System - - # - -

-

Io’s macros transform code before evaluation:

-
// Define a macro
-Object unless := macro(condition, action,
-    // Macros receive unevaluated arguments as messages
-    // Transform to if(condition not, action)
-    message(if) setArguments(
-        list(
-            message(not) setTarget(condition),
-            action
-        )
-    )
-)
-
-// Use the macro
-x := 5
-unless(x > 10, "x is not greater than 10" println)
-// x is not greater than 10
-
-// Timing macro
-Object time := macro(code,
-    // Generate timing code
-    message(do) setArguments(list(
-        message(start := Date now),
-        code,
-        message(elapsed := Date now - start),
-        message(("Elapsed: " .. elapsed) println),
-        message(result)
-    ))
-)
-
-// Use it
-time(
-    sum := 0
-    for(i, 1, 1000000, sum = sum + i)
-    sum
-)
-// Elapsed: 0.234
-
-

- Self-Modifying Code - - # - -

-

Objects can modify their own methods:

-
Counter := Object clone
-Counter count := 0
-Counter increment := method(
-    count = count + 1
-    
-    // Self-modify after 5 calls
-    if(count >= 5,
-        self increment = method(
-            Exception raise("Counter limit reached")
-        )
-    )
-    
-    count
-)
-
-c := Counter clone
-5 repeat(i, c increment println)  // 1, 2, 3, 4, 5
-c increment  // Exception: Counter limit reached
-
-

- Reflection API - - # - -

-

Io provides comprehensive reflection capabilities:

-
// Object introspection utilities
-Object describe := method(
-    ("Type: " .. self type) println
-    
-    "Local Slots:" println
-    self slotNames sort foreach(name,
-        value := self getSlot(name)
-        ("  " .. name .. " = " .. value type) println
-    )
-    
-    "Proto chain:" println
-    proto := self proto
-    while(proto and proto != Object,
-        ("  -> " .. proto type) println
-        proto = proto proto
-    )
-)
-
-// Usage
-person := Object clone
-person name := "Alice"
-person age := 30
-person greet := method("Hello!")
-
-person describe
-// Type: Object
-// Local Slots:
-//   age = Number
-//   greet = Block
-//   name = Sequence
-// Proto chain:
-//   -> Object
-
-

- DSL Creation with Metaprogramming - - # - -

-

Build domain-specific languages:

-
// SQL-like DSL
-Table := Object clone
-Table columns := list()
-Table rows := list()
-
-Table select := method(
-    query := SelectQuery clone
-    query table := self
-    query
-)
-
-SelectQuery := Object clone
-SelectQuery conditions := list()
-
-SelectQuery where := method(
-    // Parse conditions from arguments
-    args := call message arguments
-    args foreach(arg,
-        conditions append(arg)
-    )
-    self
-)
-
-SelectQuery execute := method(
-    table rows select(row,
-        result := true
-        conditions foreach(cond,
-            result = result and cond doInContext(row)
-        )
-        result
-    )
-)
-
-// Usage
-users := Table clone
-users columns = list("name", "age", "city")
-users rows = list(
-    Object clone do(name := "Alice"; age := 30; city := "NYC"),
-    Object clone do(name := "Bob"; age := 25; city := "LA"),
-    Object clone do(name := "Charlie"; age := 35; city := "NYC")
-)
-
-results := users select where(age > 25, city == "NYC") execute
-results foreach(r, (r name .. ": " .. r age) println)
-// Alice: 30
-// Charlie: 35
-
-

- Performance Profiling - - # - -

-

Use metaprogramming for profiling:

-
Profiler := Object clone
-Profiler stats := Map clone
-
-Object profile := method(methodName,
-    original := self getSlot(methodName)
-    
-    self setSlot(methodName, method(
-        start := Date now
-        result := original doMessage(call message, call sender)
-        elapsed := Date now - start
-        
-        key := self type .. "::" .. methodName
-        if(Profiler stats hasKey(key) not,
-            Profiler stats atPut(key, list(0, 0))
-        )
-        
-        stats := Profiler stats at(key)
-        stats atPut(0, stats at(0) + 1)      // Count
-        stats atPut(1, stats at(1) + elapsed) // Total time
-        
-        result
-    ))
-)
-
-Profiler report := method(
-    "=== Profiling Report ===" println
-    stats foreach(key, data,
-        avg := data at(1) / data at(0)
-        (key .. ": " .. data at(0) .. " calls, " .. 
-         data at(1) .. "s total, " .. avg .. "s avg") println
-    )
-)
-
-// Usage
-Math := Object clone
-Math factorial := method(n,
-    if(n <= 1, 1, n * factorial(n - 1))
-)
-Math profile("factorial")
-
-10 repeat(Math factorial(20))
-Profiler report
-
-

- Compile-Time Computation - - # - -

-

Use macros for compile-time optimization:

-
// Macro that pre-computes constant expressions
-Object precompute := macro(expr,
-    // If expression contains only literals, evaluate now
-    result := nil
-    e := try(result = expr doInContext(Object clone))
-    
-    if(e isNil,
-        // Successfully evaluated - return literal
-        Message clone setName(result asString),
-        // Contains variables - return original
-        expr
-    )
-)
-
-// Usage
-x := 10
-y := precompute(5 * 6 + 7)  // Computed at parse time
-z := precompute(x * 2)      // Can't precompute, has variable
-
-y println  // 37 (was precomputed)
-
-

- Method Combination - - # - -

-

Implement method combination patterns:

-
// Before/After/Around methods
-Object addBefore := method(methodName, beforeBlock,
-    original := self getSlot(methodName)
-    self setSlot(methodName, method(
-        beforeBlock doMessage(call message, call sender)
-        original doMessage(call message, call sender)
-    ))
-)
-
-Object addAfter := method(methodName, afterBlock,
-    original := self getSlot(methodName)
-    self setSlot(methodName, method(
-        result := original doMessage(call message, call sender)
-        afterBlock call(result)
-        result
-    ))
-)
-
-Object addAround := method(methodName, aroundBlock,
-    original := self getSlot(methodName)
-    self setSlot(methodName, method(
-        aroundBlock call(original, call message, call sender)
-    ))
-)
-
-// Usage
-BankAccount := Object clone
-BankAccount balance := 100
-BankAccount withdraw := method(amount, balance = balance - amount)
-
-BankAccount addBefore("withdraw", method(amount,
-    ("Withdrawing " .. amount) println
-))
-
-BankAccount addAfter("withdraw", method(result,
-    ("New balance: " .. balance) println
-))
-
-BankAccount addAround("withdraw", method(original, msg, sender,
-    amount := msg argAt(0) doInContext(sender)
-    if(amount > balance,
-        Exception raise("Insufficient funds"),
-        original doMessage(msg, sender)
-    )
-))
-
-account := BankAccount clone
-account withdraw(50)
-// Withdrawing 50
-// New balance: 50
-
-

- Common Pitfalls - - # - -

-

- Evaluation Context - - # - -

-
// PROBLEM: Wrong context
-makeMethod := method(code,
-    method doString(code)  // code evaluates in method's context
-)
-
-obj := Object clone
-obj value := 10
-obj badMethod := makeMethod("value * 2")
-// obj badMethod  // Error: value not found
-
-// SOLUTION: Use message objects
-makeMethod := method(code,
-    method(code doInContext(self))
-)
-
-

- Performance Impact - - # - -

-
// Metaprogramming has runtime cost
-directCall := method(x, x * 2)
-dynamicCall := method(x,
-    msg := Message clone setName("*") setArguments(list(Message clone setName("2")))
-    x doMessage(msg)
-)
-
-// directCall is much faster than dynamicCall
-
-

- Exercises - - # - -

-
    -
  1. -

    Memoization Decorator: Create a decorator that automatically memoizes any method.

    -
  2. -
  3. -

    Contract System: Implement Design by Contract with pre/post conditions.

    -
  4. -
  5. -

    Mock Object Generator: Build a system that generates mock objects for testing.

    -
  6. -
  7. -

    Dependency Injection: Create a DI container using metaprogramming.

    -
  8. -
  9. -

    ORM: Build a simple object-relational mapper that generates methods from table schemas.

    -
  10. -
-

- Real-World Example: ActiveRecord Pattern - - # - -

-
// Simple ActiveRecord implementation
-ActiveRecord := Object clone
-ActiveRecord tableName := nil
-ActiveRecord connection := nil  // Database connection
-
-ActiveRecord findById := method(id,
-    sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id
-    row := connection execute(sql) first
-    if(row,
-        obj := self clone
-        row foreach(column, value,
-            obj setSlot(column, value)
-        )
-        obj
-    )
-)
-
-ActiveRecord save := method(
-    if(hasSlot("id"),
-        // Update
-        sql := "UPDATE " .. tableName .. " SET "
-        updates := list()
-        slotNames foreach(name,
-            if(name != "id",
-                updates append(name .. " = '" .. getSlot(name) .. "'")
-            )
-        )
-        sql = sql .. updates join(", ") .. " WHERE id = " .. id
-    ,
-        // Insert
-        sql := "INSERT INTO " .. tableName
-        columns := list()
-        values := list()
-        slotNames foreach(name,
-            columns append(name)
-            values append("'" .. getSlot(name) .. "'")
-        )
-        sql = sql .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")"
-    )
-    
-    connection execute(sql)
-    self
-)
-
-// Generate model from table
-generateModel := method(name, table, columns,
-    model := ActiveRecord clone
-    model type := name
-    model tableName = table
-    
-    // Add properties
-    columns foreach(column,
-        model setSlot(column, nil)
-    )
-    
-    // Add validations
-    model validate := method(
-        // Generated validation code
-        true
-    )
-    
-    // Store in Lobby
-    Lobby setSlot(name, model)
-    model
-)
-
-// Usage
-User := generateModel("User", "users", list("id", "name", "email", "age"))
-
-user := User clone
-user name = "Alice"
-user email = "alice@example.com"
-user age = 30
-// user save
-
-foundUser := User findById(1)
-
-

- Conclusion - - # - -

-

Metaprogramming in Io isn’t a special feature—it’s a natural consequence of the language’s design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages.

-

The key to effective metaprogramming in Io is understanding that you’re not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/12-concurrency/index.html b/website/public/docs/12-concurrency/index.html deleted file mode 100644 index 5aec4a3..0000000 --- a/website/public/docs/12-concurrency/index.html +++ /dev/null @@ -1,1304 +0,0 @@ - - - - - - - - - - - - - - - -Concurrency | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Concurrency

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Concurrency

- -
Chapter 12
- -
- - - - - -

Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io.

-

- Coroutines: Cooperative Multitasking - - # - -

-

Coroutines are the foundation of Io’s concurrency model. They’re lightweight threads that yield control cooperatively:

-
// Create a coroutine
-coro := coroutine(
-    5 repeat(i,
-        ("Coroutine: " .. i) println
-        yield  // Give control back
-    )
-)
-
-// Run it
-5 repeat(
-    "Main" println
-    coro resume  // Resume the coroutine
-)
-// Output interleaves Main and Coroutine messages
-
-

Compare with threads in other languages:

-
# Python with threads (preemptive)
-import threading
-def worker():
-    for i in range(5):
-        print(f"Thread: {i}")
-        # No explicit yield needed
-
-# Python with async (cooperative)
-async def worker():
-    for i in range(5):
-        print(f"Coroutine: {i}")
-        await asyncio.sleep(0)  # Explicit yield
-
-

- Creating and Managing Coroutines - - # - -

-
// Basic coroutine creation
-coro := Coroutine clone
-coro setRunMessage(message(
-    "Running in coroutine" println
-    self  // Return value
-))
-coro resume println  // "Running in coroutine", then returns self
-
-// Using @ for async execution
-future := obj @method(arg)  // Runs method in new coroutine
-result := future resolve     // Wait for result
-
-// Coroutine with arguments
-producer := coroutine(
-    10 repeat(i,
-        yield(i * i)  // Yield a value
-    )
-)
-
-5 repeat(
-    producer resume println  // 0, 1, 4, 9, 16
-)
-
-

- Actors: Message-Passing Concurrency - - # - -

-

Actors are objects that process messages asynchronously in their own coroutine:

-
// Create an actor
-Counter := Object clone
-Counter count := 0
-Counter increment := method(
-    count = count + 1
-    count
-)
-
-// Make it an actor
-counter := Counter clone
-counterActor := counter @  // @ makes it an actor
-
-// Send messages asynchronously
-future1 := counterActor increment
-future2 := counterActor increment
-future3 := counterActor increment
-
-// Get results
-future1 resolve println  // 1
-future2 resolve println  // 2
-future3 resolve println  // 3
-
-

This is similar to Erlang’s actor model:

-
% Erlang
-counter(Count) ->
-    receive
-        {increment, From} ->
-            From ! Count + 1,
-            counter(Count + 1)
-    end.
-
-

- Futures and Promises - - # - -

-

Futures represent values that will be available later:

-
// Create a future manually
-future := Future clone
-
-// In another coroutine, fulfill it
-@(
-    wait(1)  // Simulate work
-    future setResult(42)
-)
-
-// Wait for result
-"Waiting..." println
-result := future resolve
-("Got result: " .. result) println  // Got result: 42
-
-// Futures from async calls
-slowOperation := method(n,
-    wait(n)
-    n * 2
-)
-
-f := self @slowOperation(2)
-"Doing other work..." println
-result := f resolve
-result println  // 4
-
-

- Channels for Communication - - # - -

-

Implement Go-style channels:

-
Channel := Object clone
-Channel init := method(
-    self queue := list()
-    self waiters := list()
-    self
-)
-
-Channel send := method(value,
-    if(waiters size > 0,
-        waiter := waiters removeFirst
-        waiter resume(value),
-        queue append(value)
-    )
-)
-
-Channel receive := method(
-    if(queue size > 0,
-        queue removeFirst,
-        waiters append(Coroutine currentCoroutine)
-        Coroutine currentCoroutine pause
-    )
-)
-
-// Usage
-ch := Channel clone init
-
-// Producer
-@(
-    5 repeat(i,
-        ch send(i * i)
-        wait(0.1)
-    )
-)
-
-// Consumer
-@(
-    5 repeat(
-        value := ch receive
-        ("Received: " .. value) println
-    )
-)
-
-wait(1)  // Let them run
-
-

- Synchronization Primitives - - # - -

-

- Mutex (Mutual Exclusion) - - # - -

-
Mutex := Object clone
-Mutex locked := false
-Mutex waitQueue := list()
-
-Mutex lock := method(
-    while(locked,
-        waitQueue append(Coroutine currentCoroutine)
-        Coroutine currentCoroutine pause
-    )
-    locked = true
-)
-
-Mutex unlock := method(
-    locked = false
-    if(waitQueue size > 0,
-        waiter := waitQueue removeFirst
-        waiter resume
-    )
-)
-
-Mutex synchronize := method(block,
-    lock
-    e := try(result := block call)
-    unlock
-    if(e, e raise, result)
-)
-
-// Usage
-sharedCounter := 0
-mutex := Mutex clone
-
-10 repeat(
-    @(
-        mutex synchronize(
-            temp := sharedCounter
-            yield  // Simulate race condition
-            sharedCounter = temp + 1
-        )
-    )
-)
-
-wait(0.5)
-sharedCounter println  // 10 (without mutex would be unpredictable)
-
-

- Semaphore - - # - -

-
Semaphore := Object clone
-Semaphore init := method(permits,
-    self permits := permits
-    self waitQueue := list()
-    self
-)
-
-Semaphore acquire := method(
-    while(permits <= 0,
-        waitQueue append(Coroutine currentCoroutine)
-        Coroutine currentCoroutine pause
-    )
-    permits = permits - 1
-)
-
-Semaphore release := method(
-    permits = permits + 1
-    if(waitQueue size > 0,
-        waiter := waitQueue removeFirst
-        waiter resume
-    )
-)
-
-// Usage: Limit concurrent connections
-connectionPool := Semaphore clone init(3)
-
-10 repeat(i,
-    @(
-        connectionPool acquire
-        ("Connection " .. i .. " started") println
-        wait(Random value)
-        ("Connection " .. i .. " finished") println
-        connectionPool release
-    )
-)
-
-wait(3)
-
-

- Concurrent Collections - - # - -

-
// Thread-safe list
-ConcurrentList := List clone
-ConcurrentList mutex := Mutex clone
-
-ConcurrentList append := method(item,
-    mutex synchronize(resend(item))
-)
-
-ConcurrentList at := method(index,
-    mutex synchronize(resend(index))
-)
-
-ConcurrentList size := method(
-    mutex synchronize(resend)
-)
-
-// Usage
-list := ConcurrentList clone
-
-10 repeat(i,
-    @(list append(i))
-)
-
-wait(0.1)
-list size println  // 10
-
-

- Worker Pool Pattern - - # - -

-
WorkerPool := Object clone
-WorkerPool init := method(workerCount,
-    self workers := list()
-    self taskQueue := Channel clone init
-    self results := Channel clone init
-    
-    workerCount repeat(
-        worker := @(
-            loop(
-                task := taskQueue receive
-                if(task isNil, break)  // Poison pill
-                
-                result := task call
-                results send(result)
-            )
-        )
-        workers append(worker)
-    )
-    
-    self
-)
-
-WorkerPool submit := method(task,
-    taskQueue send(task)
-)
-
-WorkerPool shutdown := method(
-    workers size repeat(taskQueue send(nil))
-)
-
-WorkerPool getResult := method(
-    results receive
-)
-
-// Usage
-pool := WorkerPool clone init(4)
-
-// Submit tasks
-10 repeat(i,
-    pool submit(block(
-        wait(Random value * 0.1)
-        i * i
-    ))
-)
-
-// Collect results
-results := list()
-10 repeat(
-    results append(pool getResult)
-)
-
-pool shutdown
-results println
-
-

- Async/Await Pattern - - # - -

-
// Implement async/await style
-Object async := method(
-    future := Future clone
-    
-    @(
-        e := try(result := call activated doMessage(call message, call sender))
-        if(e,
-            future setException(e),
-            future setResult(result)
-        )
-    )
-    
-    future
-)
-
-Object await := method(future,
-    future resolve
-)
-
-// Usage
-fetchData := async method(url,
-    wait(1)  // Simulate network delay
-    "Data from " .. url
-)
-
-processData := async method(
-    data1 := await(fetchData("api/users"))
-    data2 := await(fetchData("api/posts"))
-    data1 .. " + " .. data2
-)
-
-result := await(processData)
-result println  // Data from api/users + Data from api/posts
-
-

- Parallel Map - - # - -

-
List parallelMap := method(block,
-    futures := self map(item,
-        self @(block call(item))
-    )
-    
-    futures map(resolve)
-)
-
-// Usage
-numbers := list(1, 2, 3, 4, 5)
-
-// Sequential map
-time(
-    sequential := numbers map(n,
-        wait(0.1)
-        n * n
-    )
-)
-
-// Parallel map
-time(
-    parallel := numbers parallelMap(n,
-        wait(0.1)
-        n * n
-    )
-)
-
-sequential println  // list(1, 4, 9, 16, 25)
-parallel println    // list(1, 4, 9, 16, 25) but faster
-
-

- Deadlock Detection - - # - -

-
DeadlockDetector := Object clone
-DeadlockDetector init := method(
-    self resources := Map clone
-    self waitGraph := Map clone
-    self
-)
-
-DeadlockDetector requestResource := method(coroutine, resource,
-    // Add to wait graph
-    if(resources hasKey(resource),
-        owner := resources at(resource)
-        if(owner != coroutine,
-            waitGraph atPut(coroutine, resource)
-            
-            // Check for cycle
-            if(hasCycle(coroutine),
-                Exception raise("Deadlock detected!")
-            )
-        )
-    )
-)
-
-DeadlockDetector hasCycle := method(start,
-    // Simplified cycle detection
-    visited := list()
-    current := start
-    
-    while(waitGraph hasKey(current),
-        if(visited contains(current), return true)
-        visited append(current)
-        
-        resource := waitGraph at(current)
-        if(resources hasKey(resource),
-            current = resources at(resource)
-        ,
-            break
-        )
-    )
-    
-    false
-)
-
-

- Event Loop - - # - -

-
EventLoop := Object clone
-EventLoop init := method(
-    self events := list()
-    self running := true
-    self
-)
-
-EventLoop schedule := method(delay, block,
-    events append(list(Date now + delay, block))
-    events sortInPlaceBy(block(e, e at(0)))
-)
-
-EventLoop run := method(
-    while(running and events size > 0,
-        now := Date now
-        
-        while(events size > 0 and events first at(0) <= now,
-            event := events removeFirst
-            event at(1) @call
-        )
-        
-        if(events size > 0,
-            wait((events first at(0) - now) max(0))
-        )
-    )
-)
-
-EventLoop stop := method(running = false)
-
-// Usage
-loop := EventLoop clone init
-
-loop schedule(0.1, block("First" println))
-loop schedule(0.2, block("Second" println))
-loop schedule(0.15, block("Between" println))
-
-loop run
-
-

- Common Patterns - - # - -

-

- Producer-Consumer - - # - -

-
Buffer := Object clone
-Buffer init := method(capacity,
-    self items := list()
-    self capacity := capacity
-    self notFull := Semaphore clone init(capacity)
-    self notEmpty := Semaphore clone init(0)
-    self mutex := Mutex clone
-    self
-)
-
-Buffer put := method(item,
-    notFull acquire
-    mutex synchronize(items append(item))
-    notEmpty release
-)
-
-Buffer get := method(
-    notEmpty acquire
-    item := mutex synchronize(items removeFirst)
-    notFull release
-    item
-)
-
-// Usage
-buffer := Buffer clone init(5)
-
-// Producer
-@(
-    10 repeat(i,
-        ("Producing " .. i) println
-        buffer put(i)
-        wait(Random value * 0.1)
-    )
-)
-
-// Consumer
-@(
-    10 repeat(
-        item := buffer get
-        ("Consumed " .. item) println
-        wait(Random value * 0.2)
-    )
-)
-
-wait(3)
-
-

- Fork-Join - - # - -

-
Object forkJoin := method(tasks,
-    futures := tasks map(task,
-        @(task call)
-    )
-    
-    futures map(resolve)
-)
-
-// Parallel quicksort
-quicksort := method(list,
-    if(list size <= 1, return list)
-    
-    pivot := list at(list size / 2)
-    
-    results := forkJoin(list(
-        block(list select(x, x < pivot) quicksort),
-        block(list select(x, x == pivot)),
-        block(list select(x, x > pivot) quicksort)
-    ))
-    
-    results at(0) appendSeq(results at(1)) appendSeq(results at(2))
-)
-
-sorted := quicksort(list(3, 1, 4, 1, 5, 9, 2, 6))
-sorted println  // list(1, 1, 2, 3, 4, 5, 6, 9)
-
-

- Performance Considerations - - # - -

-
// Coroutines are lightweight
-time(
-    coroutines := list()
-    1000 repeat(i,
-        coroutines append(@(i * i))
-    )
-    coroutines map(resolve)
-)
-
-// But context switching has overhead
-benchmarkConcurrency := method(taskCount, taskWork,
-    // Sequential
-    seqTime := time(
-        taskCount repeat(i, taskWork call(i))
-    )
-    
-    // Concurrent
-    concTime := time(
-        futures := list()
-        taskCount repeat(i,
-            futures append(@(taskWork call(i)))
-        )
-        futures map(resolve)
-    )
-    
-    ("Sequential: " .. seqTime) println
-    ("Concurrent: " .. concTime) println
-    ("Speedup: " .. (seqTime / concTime)) println
-)
-
-// Light work - concurrency overhead dominates
-benchmarkConcurrency(100, block(i, i * i))
-
-// Heavy work - concurrency helps
-benchmarkConcurrency(10, block(i,
-    sum := 0
-    10000 repeat(j, sum = sum + j)
-    sum
-))
-
-

- Exercises - - # - -

-
    -
  1. -

    Rate Limiter: Implement a rate limiter that allows N operations per second.

    -
  2. -
  3. -

    Parallel Reduce: Create a parallel version of reduce that divides work among workers.

    -
  4. -
  5. -

    Actor Supervisor: Build a supervisor that restarts failed actors.

    -
  6. -
  7. -

    CSP Channels: Implement Communicating Sequential Processes with select statement.

    -
  8. -
  9. -

    STM: Implement Software Transactional Memory for conflict-free concurrent updates.

    -
  10. -
-

- Real-World Example: Web Scraper - - # - -

-
WebScraper := Object clone
-WebScraper init := method(maxConcurrent,
-    self semaphore := Semaphore clone init(maxConcurrent)
-    self visited := ConcurrentSet clone init
-    self results := ConcurrentList clone
-    self
-)
-
-WebScraper scrape := method(urls,
-    futures := list()
-    
-    urls foreach(url,
-        if(visited contains(url) not,
-            visited add(url)
-            
-            future := @(
-                semaphore acquire
-                e := try(
-                    ("Scraping " .. url) println
-                    // Simulate HTTP request
-                    wait(Random value)
-                    
-                    content := "Content from " .. url
-                    results append(Map with("url", url, "content", content))
-                    
-                    // Find more URLs (simplified)
-                    if(Random value < 0.3,
-                        newUrl := url .. "/" .. Random value round
-                        self scrape(list(newUrl))
-                    )
-                )
-                
-                semaphore release
-                if(e, ("Error scraping " .. url .. ": " .. e message) println)
-            )
-            
-            futures append(future)
-        )
-    )
-    
-    futures map(resolve)
-    self
-)
-
-// Usage
-scraper := WebScraper clone init(3)
-scraper scrape(list(
-    "https://example.com",
-    "https://example.org",
-    "https://example.net"
-))
-
-wait(2)
-("Scraped " .. scraper results size .. " pages") println
-
-

- Conclusion - - # - -

-

Io’s concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages.

-

The beauty of Io’s approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with @, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/13-domain-specific-languages/index.html b/website/public/docs/13-domain-specific-languages/index.html deleted file mode 100644 index 6c27ff6..0000000 --- a/website/public/docs/13-domain-specific-languages/index.html +++ /dev/null @@ -1,1364 +0,0 @@ - - - - - - - - - - - - - - - -Domain-Specific Languages | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Domain-Specific Languages

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Domain-Specific Languages

- -
Chapter 13
- -
- - - - - -

Io’s minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains.

-

- Why Io Excels at DSLs - - # - -

-

Several features make Io particularly suitable for DSLs:

-
    -
  1. Minimal syntax - Less language machinery to work around
  2. -
  3. Optional parentheses - Clean, readable DSL code
  4. -
  5. Message chains - Natural expression of domain concepts
  6. -
  7. Runtime flexibility - Modify behavior on the fly
  8. -
  9. Homoiconicity - Code as manipulable data
  10. -
-

Compare a hypothetical DSL in Io vs Ruby:

-
// Io DSL - clean, minimal
-recipe "Chocolate Cake" makes(8) servings {
-    ingredient "flour" amount(2) cups
-    ingredient "sugar" amount(1.5) cups
-    
-    step "Mix dry ingredients"
-    step "Add wet ingredients"
-    bake at(350) degrees for(30) minutes
-}
-
-
# Ruby DSL - more syntax artifacts
-recipe "Chocolate Cake" do
-    makes 8.servings
-    
-    ingredient "flour", amount: 2.cups
-    ingredient "sugar", amount: 1.5.cups
-    
-    step "Mix dry ingredients"
-    step "Add wet ingredients"
-    bake at: 350.degrees, for: 30.minutes
-end
-
-

- Building Your First DSL - - # - -

-

Let’s create a simple configuration DSL:

-
// Define the DSL
-Config := Object clone
-Config settings := Map clone
-
-Config set := method(key, value,
-    settings atPut(key asString, value)
-    self  // For chaining
-)
-
-Config get := method(key,
-    settings at(key asString)
-)
-
-Config section := method(name,
-    sec := Config clone
-    settings atPut(name asString, sec)
-    sec
-)
-
-// Use the DSL
-config := Config clone
-config set("host", "localhost") \
-      set("port", 8080) \
-      section("database") \
-          set("driver", "postgresql") \
-          set("name", "myapp")
-
-config get("host") println           // localhost
-config get("database") get("driver") println  // postgresql
-
-

- HTML Builder DSL - - # - -

-

A more complex example - generating HTML:

-
HTML := Object clone
-
-// Handle any tag name via forward
-HTML forward := method(
-    tagName := call message name
-    attributes := Map clone
-    children := list()
-    
-    // Process arguments
-    call message arguments foreach(arg,
-        argValue := call sender doMessage(arg)
-        
-        if(argValue type == "Map",
-            // It's attributes
-            attributes = argValue
-        ,
-            // It's content or children
-            if(argValue type == "Sequence",
-                children append(argValue),
-                if(argValue type == "List",
-                    children appendSeq(argValue),
-                    children append(argValue asString)
-                )
-            )
-        )
-    )
-    
-    // Build HTML
-    result := "<" .. tagName
-    attributes foreach(key, value,
-        result = result .. " " .. key .. "=\"" .. value .. "\""
-    )
-    
-    if(children size == 0,
-        result = result .. " />",
-        result = result .. ">"
-        children foreach(child, result = result .. child)
-        result = result .. "</" .. tagName .. ">"
-    )
-    
-    result
-)
-
-// Helper for attributes
-Object attrs := method(
-    args := call message arguments
-    map := Map clone
-    
-    args foreach(arg,
-        pair := arg name split(":")
-        if(pair size == 2,
-            map atPut(pair at(0), call sender doMessage(arg arguments at(0)))
-        )
-    )
-    map
-)
-
-// Usage
-html := HTML clone
-
-page := html div(attrs(class: "container", id: "main"),
-    html h1("Welcome to My Site"),
-    html p(attrs(class: "intro"), 
-        "This is a paragraph with ",
-        html strong("bold text"),
-        " in it."
-    ),
-    html ul(
-        html li("First item"),
-        html li("Second item"),
-        html li("Third item")
-    )
-)
-
-page println
-// <div class="container" id="main"><h1>Welcome to My Site</h1>...
-
-

- SQL Query Builder - - # - -

-
Query := Object clone
-Query init := method(
-    self selections := list("*")
-    self tables := list()
-    self conditions := list()
-    self joins := list()
-    self
-)
-
-Query select := method(
-    self selections = call message arguments map(arg,
-        call sender doMessage(arg) asString
-    )
-    self
-)
-
-Query from := method(table,
-    tables append(table)
-    self
-)
-
-Query where := method(
-    condition := call argAt(0)
-    conditions append(condition code asString)
-    self
-)
-
-Query join := method(table, on,
-    joins append("JOIN " .. table .. " ON " .. on code asString)
-    self
-)
-
-Query toSQL := method(
-    sql := "SELECT " .. selections join(", ")
-    sql = sql .. " FROM " .. tables join(", ")
-    
-    if(joins size > 0,
-        sql = sql .. " " .. joins join(" ")
-    )
-    
-    if(conditions size > 0,
-        sql = sql .. " WHERE " .. conditions join(" AND ")
-    )
-    
-    sql
-)
-
-// Usage
-query := Query clone init
-
-sql := query select("name", "age", "email") \
-            from("users") \
-            join("profiles", users.id == profiles.user_id) \
-            where(age > 18) \
-            where(status == "active") \
-            toSQL
-
-sql println
-// SELECT name, age, email FROM users JOIN profiles ON users.id == profiles.user_id WHERE age > 18 AND status == "active"
-
-

- Unit Testing DSL - - # - -

-
TestSuite := Object clone
-TestSuite tests := list()
-TestSuite currentTest := nil
-
-TestSuite describe := method(description,
-    suite := TestSuite clone
-    suite description := description
-    suite tests = list()
-    
-    # Execute the test definition block
-    call evalArgAt(1)
-    
-    suite
-)
-
-TestSuite it := method(testName,
-    test := Object clone
-    test name := testName
-    test block := call argAt(1)
-    tests append(test)
-)
-
-TestSuite before := method(
-    self beforeBlock := call argAt(0)
-)
-
-TestSuite after := method(
-    self afterBlock := call argAt(0)
-)
-
-TestSuite run := method(
-    ("\n" .. description) println
-    ("=" repeated(description size)) println
-    
-    passed := 0
-    failed := 0
-    
-    tests foreach(test,
-        if(hasSlot("beforeBlock"), beforeBlock doInContext(self))
-        
-        e := try(
-            test block doInContext(self)
-            ("✓ " .. test name) println
-            passed = passed + 1
-        ) catch(Exception, e,
-            ("✗ " .. test name) println
-            ("  " .. e message) println
-            failed = failed + 1
-        )
-        
-        if(hasSlot("afterBlock"), afterBlock doInContext(self))
-    )
-    
-    ("\nPassed: " .. passed .. ", Failed: " .. failed) println
-)
-
-// Assertion helpers
-Object expect := method(actual,
-    Expectation clone setActual(actual)
-)
-
-Expectation := Object clone
-Expectation setActual := method(value,
-    self actual := value
-    self
-)
-
-Expectation toBe := method(expected,
-    if(actual != expected,
-        Exception raise("Expected " .. expected .. " but got " .. actual)
-    )
-)
-
-Expectation toEqual := method(expected,
-    if(actual != expected,
-        Exception raise("Expected " .. expected .. " but got " .. actual)
-    )
-)
-
-Expectation toContain := method(item,
-    if(actual contains(item) not,
-        Exception raise("Expected " .. actual .. " to contain " .. item)
-    )
-)
-
-// Usage
-MathTests := describe("Math operations",
-    before(
-        self calculator := Object clone
-        calculator add := method(a, b, a + b)
-        calculator multiply := method(a, b, a * b)
-    )
-    
-    it("should add numbers correctly",
-        expect(calculator add(2, 3)) toBe(5)
-        expect(calculator add(-1, 1)) toBe(0)
-    )
-    
-    it("should multiply numbers correctly",
-        expect(calculator multiply(3, 4)) toBe(12)
-        expect(calculator multiply(0, 5)) toBe(0)
-    )
-    
-    it("should handle edge cases",
-        expect(calculator add(0, 0)) toBe(0)
-    )
-)
-
-MathTests run
-
-

- State Machine DSL - - # - -

-
StateMachine := Object clone
-StateMachine states := Map clone
-StateMachine currentState := nil
-StateMachine initialState := nil
-
-StateMachine state := method(name,
-    s := State clone
-    s name := name
-    s machine := self
-    states atPut(name, s)
-    
-    if(initialState isNil, initialState = s)
-    
-    s
-)
-
-State := Object clone
-State transitions := Map clone
-
-State on := method(event, targetState,
-    transitions atPut(event, targetState)
-    self
-)
-
-State enter := method(
-    self enterBlock := call argAt(0)
-    self
-)
-
-State exit := method(
-    self exitBlock := call argAt(0)
-    self
-)
-
-StateMachine start := method(
-    currentState = initialState
-    if(currentState hasSlot("enterBlock"),
-        currentState enterBlock call
-    )
-)
-
-StateMachine trigger := method(event,
-    if(currentState transitions hasKey(event),
-        nextStateName := currentState transitions at(event)
-        nextState := states at(nextStateName)
-        
-        if(currentState hasSlot("exitBlock"),
-            currentState exitBlock call
-        )
-        
-        ("Transitioning from " .. currentState name .. " to " .. nextStateName) println
-        currentState = nextState
-        
-        if(currentState hasSlot("enterBlock"),
-            currentState enterBlock call
-        )
-    ,
-        ("No transition for event '" .. event .. "' from state '" .. currentState name .. "'") println
-    )
-)
-
-// Usage
-door := StateMachine clone
-
-door state("closed") \
-    on("open", "opened") \
-    on("lock", "locked") \
-    enter(block("Door is now closed" println))
-
-door state("opened") \
-    on("close", "closed") \
-    enter(block("Door is now open" println))
-
-door state("locked") \
-    on("unlock", "closed") \
-    enter(block("Door is now locked" println))
-
-door start
-door trigger("open")   // Transitioning from closed to opened
-door trigger("close")  // Transitioning from opened to closed
-door trigger("lock")   // Transitioning from closed to locked
-door trigger("open")   // No transition for event 'open' from state 'locked'
-
-

- Routing DSL (Web Framework Style) - - # - -

-
Router := Object clone
-Router routes := list()
-
-Router get := method(path,
-    addRoute("GET", path, call argAt(1))
-)
-
-Router post := method(path,
-    addRoute("POST", path, call argAt(1))
-)
-
-Router put := method(path,
-    addRoute("PUT", path, call argAt(1))
-)
-
-Router delete := method(path,
-    addRoute("DELETE", path, call argAt(1))
-)
-
-Router addRoute := method(method, path, handler,
-    routes append(Map with(
-        "method", method,
-        "path", path,
-        "pattern", pathToRegex(path),
-        "handler", handler
-    ))
-    self
-)
-
-Router pathToRegex := method(path,
-    // Convert :param to regex groups
-    pattern := path
-    pattern = pattern replaceAllRegex(":([^/]+)", "([^/]+)")
-    "^" .. pattern .. "$"
-)
-
-Router handle := method(method, path,
-    routes foreach(route,
-        if(route at("method") == method,
-            match := path matchesRegex(route at("pattern"))
-            if(match,
-                params := extractParams(route at("path"), path, match)
-                return route at("handler") call(params)
-            )
-        )
-    )
-    
-    Map with("status", 404, "body", "Not Found")
-)
-
-Router extractParams := method(pattern, path, match,
-    params := Map clone
-    
-    // Extract named parameters
-    names := pattern allMatchesOfRegex(":([^/]+)") map(m, m at(1))
-    names foreach(i, name,
-        params atPut(name, match at(i + 1))
-    )
-    
-    params
-)
-
-// Usage
-app := Router clone
-
-app get("/", block(params,
-    Map with("status", 200, "body", "Welcome to the home page")
-))
-
-app get("/users/:id", block(params,
-    Map with("status", 200, "body", "User " .. params at("id"))
-))
-
-app post("/users", block(params,
-    Map with("status", 201, "body", "User created")
-))
-
-// Simulate requests
-app handle("GET", "/") at("body") println        // Welcome to the home page
-app handle("GET", "/users/123") at("body") println  // User 123
-app handle("POST", "/users") at("body") println  // User created
-app handle("GET", "/unknown") at("body") println // Not Found
-
-

- Data Validation DSL - - # - -

-
Validator := Object clone
-
-Validator field := method(name,
-    f := Field clone
-    f name := name
-    f rules := list()
-    self currentField := f
-    f
-)
-
-Field := Object clone
-
-Field required := method(
-    rules append(block(value,
-        if(value isNil or value == "",
-            Exception raise(name .. " is required"),
-            true
-        )
-    ))
-    self
-)
-
-Field minLength := method(min,
-    rules append(block(value,
-        if(value size < min,
-            Exception raise(name .. " must be at least " .. min .. " characters"),
-            true
-        )
-    ))
-    self
-)
-
-Field maxLength := method(max,
-    rules append(block(value,
-        if(value size > max,
-            Exception raise(name .. " must be at most " .. max .. " characters"),
-            true
-        )
-    ))
-    self
-)
-
-Field matches := method(regex,
-    rules append(block(value,
-        if(value matchesRegex(regex) not,
-            Exception raise(name .. " has invalid format"),
-            true
-        )
-    ))
-    self
-)
-
-Field validate := method(value,
-    rules foreach(rule,
-        rule call(value)
-    )
-    true
-)
-
-// Usage
-userValidator := Validator clone
-
-username := userValidator field("username") \
-    required \
-    minLength(3) \
-    maxLength(20) \
-    matches("^[a-zA-Z0-9_]+$")
-
-email := userValidator field("email") \
-    required \
-    matches("^[^@]+@[^@]+\\.[^@]+$")
-
-// Test validation
-try(
-    username validate("ab")
-) catch(Exception, e,
-    e message println  // username must be at least 3 characters
-)
-
-try(
-    email validate("not-an-email")
-) catch(Exception, e,
-    e message println  // email has invalid format
-)
-
-username validate("valid_user123") println  // true
-email validate("user@example.com") println  // true
-
-

- DSL Best Practices - - # - -

-

- 1. Natural Language Flow - - # - -

-
// Good - reads naturally
-recipe needs(2) cups of("flour")
-order shipping priority within(3) days
-
-// Bad - programmer-centric
-recipe setAmount(2) setUnit("cups") setIngredient("flour")
-order setShipping("priority") setDeliveryDays(3)
-
-

- 2. Method Chaining - - # - -

-
// Enable fluent interfaces
-Object withChaining := method(
-    call message arguments foreach(arg,
-        slotName := arg name
-        self setSlot(slotName, call evalArgAt(0))
-    )
-    self  // Always return self
-)
-
-Person := Object clone
-Person configure := method(
-    withChaining(
-        name(n, self name := n),
-        age(a, self age := a),
-        email(e, self email := e)
-    )
-)
-
-person := Person clone configure \
-    name("Alice") \
-    age(30) \
-    email("alice@example.com")
-
-

- 3. Context Management - - # - -

-
DSLContext := Object clone
-DSLContext stack := list()
-
-DSLContext push := method(obj,
-    stack append(obj)
-)
-
-DSLContext pop := method(
-    stack pop
-)
-
-DSLContext current := method(
-    stack last
-)
-
-DSLContext with := method(obj, block,
-    push(obj)
-    e := try(result := block call)
-    pop
-    if(e, e raise, result)
-)
-
-// Usage in DSL
-Form := Object clone
-Form fields := list()
-
-Form field := method(name,
-    f := Field clone
-    f name := name
-    DSLContext with(f,
-        call evalArgAt(1)
-    )
-    fields append(f)
-)
-
-Field label := method(text,
-    DSLContext current label := text
-)
-
-

- Exercises - - # - -

-
    -
  1. -

    CSS DSL: Create a DSL for generating CSS with nested rules and variables.

    -
  2. -
  3. -

    Graph Description Language: Build a DSL for describing graphs and their relationships.

    -
  4. -
  5. -

    Build System DSL: Implement a make/rake-like build system DSL.

    -
  6. -
  7. -

    BDD Testing DSL: Create a Behavior-Driven Development testing framework.

    -
  8. -
  9. -

    Configuration Management: Build a DSL for system configuration management.

    -
  10. -
-

- Real-World Example: Migration DSL - - # - -

-
Migration := Object clone
-Migration changes := list()
-
-Migration createTable := method(name,
-    table := TableDefinition clone
-    table name := name
-    table columns := list()
-    
-    call evalArgAt(1)
-    
-    changes append(Map with(
-        "type", "createTable",
-        "table", table
-    ))
-    self
-)
-
-Migration dropTable := method(name,
-    changes append(Map with(
-        "type", "dropTable",
-        "name", name
-    ))
-    self
-)
-
-TableDefinition := Object clone
-
-TableDefinition column := method(name, type,
-    columns append(Map with(
-        "name", name,
-        "type", type,
-        "constraints", list()
-    ))
-    self
-)
-
-TableDefinition primaryKey := method(col,
-    columns last at("constraints") append("PRIMARY KEY")
-    self
-)
-
-TableDefinition notNull := method(
-    columns last at("constraints") append("NOT NULL")
-    self
-)
-
-TableDefinition unique := method(
-    columns last at("constraints") append("UNIQUE")
-    self
-)
-
-Migration toSQL := method(
-    sql := list()
-    
-    changes foreach(change,
-        if(change at("type") == "createTable",
-            table := change at("table")
-            stmt := "CREATE TABLE " .. table name .. " (\n"
-            
-            cols := table columns map(col,
-                "  " .. col at("name") .. " " .. col at("type") .. 
-                if(col at("constraints") size > 0,
-                    " " .. col at("constraints") join(" "),
-                    ""
-                )
-            )
-            
-            stmt = stmt .. cols join(",\n") .. "\n);"
-            sql append(stmt)
-        )
-        
-        if(change at("type") == "dropTable",
-            sql append("DROP TABLE " .. change at("name") .. ";")
-        )
-    )
-    
-    sql join("\n\n")
-)
-
-// Usage
-migration := Migration clone
-
-migration createTable("users",
-    column("id", "INTEGER") primaryKey,
-    column("username", "VARCHAR(50)") notNull unique,
-    column("email", "VARCHAR(100)") notNull unique,
-    column("created_at", "TIMESTAMP") notNull
-)
-
-migration createTable("posts",
-    column("id", "INTEGER") primaryKey,
-    column("user_id", "INTEGER") notNull,
-    column("title", "VARCHAR(200)") notNull,
-    column("content", "TEXT"),
-    column("published_at", "TIMESTAMP")
-)
-
-migration toSQL println
-
-

- Conclusion - - # - -

-

Domain-Specific Languages in Io demonstrate the language’s expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language.

-

The key to successful DSLs in Io is understanding that you’re not fighting against language syntax—you’re working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/14-c-integration/index.html b/website/public/docs/14-c-integration/index.html deleted file mode 100644 index 5cffdc6..0000000 --- a/website/public/docs/14-c-integration/index.html +++ /dev/null @@ -1,1180 +0,0 @@ - - - - - - - - - - - - - - - -C Integration | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

C Integration

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

C Integration

- -
Chapter 14
- -
- - - - - -

Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C.

-

- Understanding Io’s C Architecture - - # - -

-

Io’s core is a small C library (around 10,000 lines) that implements:

-
    -
  • The object model (IoObject)
  • -
  • The message passing system
  • -
  • Basic types (Number, String, List, etc.)
  • -
  • The VM and garbage collector
  • -
-

Everything else is built on top of this foundation, either in C addons or pure Io.

-

- Creating a Simple C Addon - - # - -

-

Let’s create a basic C addon that adds a method to calculate factorials:

-
// factorial.c
-#include "IoState.h"
-#include "IoObject.h"
-#include "IoNumber.h"
-
-IoObject *IoObject_factorial(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    // Get the number from the receiver
-    double n = IoNumber_asDouble(self);
-    
-    if (n < 0) {
-        IoState_error_(IOSTATE, m, "factorial of negative number");
-        return IONIL(self);
-    }
-    
-    double result = 1;
-    for (int i = 2; i <= n; i++) {
-        result *= i;
-    }
-    
-    return IoNumber_newWithDouble_(IOSTATE, result);
-}
-
-// Initialize the addon
-void IoFactorial_init(IoState *state)
-{
-    IoObject *self = IoState_lobby(state);
-    
-    // Add method to Number prototype
-    IoObject *number = IoState_protoWithName_(state, "Number");
-    IoObject_addMethod_(number, 
-        IOSYMBOL("factorial"), 
-        IoObject_factorial);
-}
-
-

To compile and use:

-
# Compile as shared library
-gcc -shared -fPIC -o factorial.so factorial.c -lIo
-
-# In Io
-DynLib load("./factorial.so")
-5 factorial println  // 120
-
-

- Working with Io Objects in C - - # - -

-
// Creating Io objects from C
-IoObject *IoAddon_createObject(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    IoState *state = IOSTATE;
-    
-    // Create different types
-    IoObject *num = IoNumber_newWithDouble_(state, 42.0);
-    IoObject *str = IoSeq_newWithCString_(state, "Hello from C");
-    IoObject *list = IoList_new(state);
-    
-    // Add items to list
-    IoList_append_(list, num);
-    IoList_append_(list, str);
-    
-    // Create a new object with slots
-    IoObject *obj = IoObject_new(state);
-    IoObject_setSlot_to_(obj, IOSYMBOL("x"), num);
-    IoObject_setSlot_to_(obj, IOSYMBOL("message"), str);
-    IoObject_setSlot_to_(obj, IOSYMBOL("items"), list);
-    
-    return obj;
-}
-
-// Accessing Io objects from C
-IoObject *IoAddon_processObject(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    // Get the first argument
-    IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, 0);
-    
-    // Check type
-    if (ISSEQ(arg)) {
-        char *cstr = IoSeq_asCString(arg);
-        printf("String argument: %s\n", cstr);
-    }
-    else if (ISNUMBER(arg)) {
-        double num = IoNumber_asDouble(arg);
-        printf("Number argument: %f\n", num);
-    }
-    else if (ISLIST(arg)) {
-        size_t size = IoList_size(arg);
-        printf("List with %zu items\n", size);
-    }
-    
-    return self;
-}
-
-

- Creating Custom Types - - # - -

-
// customtype.c - Define a Point type
-#include "IoState.h"
-#include "IoObject.h"
-#include "IoNumber.h"
-
-// Define the type structure
-typedef struct {
-    IoObject obj;  // Must be first
-    double x;
-    double y;
-} IoPoint;
-
-// Type tag
-IoTag *IoPoint_tag(void)
-{
-    static IoTag *tag = NULL;
-    if (!tag) {
-        tag = IoTag_newWithName_("Point");
-    }
-    return tag;
-}
-
-// Constructor
-IoPoint *IoPoint_new(IoState *state, double x, double y)
-{
-    IoPoint *self = IoObject_new(state);
-    IoObject_tag_(self, IoPoint_tag());
-    
-    self->x = x;
-    self->y = y;
-    
-    return self;
-}
-
-// Methods
-IoObject *IoPoint_x(IoPoint *self, IoObject *locals, IoMessage *m)
-{
-    return IoNumber_newWithDouble_(IOSTATE, self->x);
-}
-
-IoObject *IoPoint_y(IoPoint *self, IoObject *locals, IoMessage *m)
-{
-    return IoNumber_newWithDouble_(IOSTATE, self->y);
-}
-
-IoObject *IoPoint_distance(IoPoint *self, IoObject *locals, IoMessage *m)
-{
-    IoPoint *other = IoMessage_locals_valueArgAt_(m, locals, 0);
-    
-    if (IoObject_tag(other) != IoPoint_tag()) {
-        IoState_error_(IOSTATE, m, "argument must be a Point");
-        return IONIL(self);
-    }
-    
-    double dx = self->x - other->x;
-    double dy = self->y - other->y;
-    double distance = sqrt(dx*dx + dy*dy);
-    
-    return IoNumber_newWithDouble_(IOSTATE, distance);
-}
-
-// Initialize the type
-void IoPoint_init(IoState *state)
-{
-    IoObject *self = IoState_lobby(state);
-    
-    // Create prototype
-    IoPoint *proto = IoPoint_new(state, 0, 0);
-    IoState_registerProtoWithName_(state, proto, "Point");
-    
-    // Add methods
-    IoObject_addMethod_(proto, IOSYMBOL("x"), IoPoint_x);
-    IoObject_addMethod_(proto, IOSYMBOL("y"), IoPoint_y);
-    IoObject_addMethod_(proto, IOSYMBOL("distance"), IoPoint_distance);
-}
-
-

- Calling Io from C - - # - -

-
// Evaluate Io code from C
-IoObject *result = IoState_doString_(state, "1 + 2 * 3");
-double value = IoNumber_asDouble(result);
-printf("Result: %f\n", value);  // 7.0
-
-// Call Io methods from C
-IoObject *obj = IoState_doString_(state, "Object clone");
-IoObject *method = IoObject_getSlot_(obj, IOSYMBOL("type"));
-IoObject *result = IoObject_activate(method, obj, locals, m, NULL);
-char *type = IoSeq_asCString(result);
-printf("Type: %s\n", type);  // Object
-
-// Send messages
-IoMessage *msg = IoMessage_newWithName_(state, IOSYMBOL("println"));
-IoMessage_setCachedResult_(msg, NULL);
-IoObject *result = IoObject_perform(obj, locals, msg);
-
-

- Memory Management - - # - -

-

Io uses a garbage collector, but when interfacing with C, you need to be careful:

-
// Protecting objects from GC
-IoObject *IoAddon_keepAlive(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    IoState *state = IOSTATE;
-    
-    // Create object that needs to survive GC
-    IoObject *important = IoObject_new(state);
-    
-    // Add reference from a persistent object
-    IoObject_setSlot_to_(IoState_lobby(state), 
-        IOSYMBOL("_keepAlive"), important);
-    
-    // Or use IoState_retain/release
-    IoState_retain_(state, important);
-    
-    // Do work...
-    
-    // Release when done
-    IoState_release_(state, important);
-    
-    return important;
-}
-
-// Managing C memory
-typedef struct {
-    IoObject obj;
-    void *cdata;
-} IoCWrapper;
-
-void IoCWrapper_free(IoCWrapper *self)
-{
-    if (self->cdata) {
-        free(self->cdata);
-        self->cdata = NULL;
-    }
-}
-
-// Set up finalizer
-IoTag *tag = IoTag_newWithName_("CWrapper");
-IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCWrapper_free);
-
-

- Wrapping C Libraries - - # - -

-

Example: Wrapping a simple math library:

-
// mathlib_wrapper.c
-#include <math.h>
-#include "IoState.h"
-#include "IoObject.h"
-#include "IoNumber.h"
-#include "IoList.h"
-
-// Wrap sin function
-IoObject *IoMath_sin(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    double x = IoMessage_locals_doubleArgAt_(m, locals, 0);
-    return IoNumber_newWithDouble_(IOSTATE, sin(x));
-}
-
-// Wrap complex function
-IoObject *IoMath_stats(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    IoList *list = IoMessage_locals_listArgAt_(m, locals, 0);
-    size_t count = IoList_size(list);
-    
-    if (count == 0) {
-        return IoList_new(IOSTATE);
-    }
-    
-    double sum = 0, min = INFINITY, max = -INFINITY;
-    
-    for (size_t i = 0; i < count; i++) {
-        IoObject *item = IoList_at_(list, i);
-        double value = IoNumber_asDouble(item);
-        
-        sum += value;
-        if (value < min) min = value;
-        if (value > max) max = value;
-    }
-    
-    double mean = sum / count;
-    
-    // Return statistics as list
-    IoList *result = IoList_new(IOSTATE);
-    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, mean));
-    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, min));
-    IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, max));
-    
-    return result;
-}
-
-void IoMathLib_init(IoState *state)
-{
-    IoObject *math = IoObject_new(state);
-    IoState_registerProtoWithName_(state, math, "Math");
-    
-    IoObject_addMethod_(math, IOSYMBOL("sin"), IoMath_sin);
-    IoObject_addMethod_(math, IOSYMBOL("stats"), IoMath_stats);
-}
-
-

Usage in Io:

-
DynLib load("./mathlib.so")
-
-Math sin(3.14159 / 2) println  // 1.0
-
-stats := Math stats(list(1, 2, 3, 4, 5))
-"Mean: " .. stats at(0) println  // Mean: 3
-"Min: " .. stats at(1) println   // Min: 1
-"Max: " .. stats at(2) println   // Max: 5
-
-

- Embedding Io in C Applications - - # - -

-
// embed_io.c - Embedding Io in a C application
-#include <stdio.h>
-#include "IoState.h"
-#include "IoObject.h"
-#include "IoSeq.h"
-
-// Custom function exposed to Io
-IoObject *App_log(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    char *msg = IoMessage_locals_cStringArgAt_(m, locals, 0);
-    printf("[APP LOG] %s\n", msg);
-    return self;
-}
-
-int main(int argc, char *argv[])
-{
-    // Initialize Io
-    IoState *state = IoState_new();
-    IoState_init(state);
-    
-    // Add custom functions
-    IoObject *lobby = IoState_lobby(state);
-    IoObject *app = IoObject_new(state);
-    IoState_registerProtoWithName_(state, app, "App");
-    IoObject_addMethod_(app, IOSYMBOL("log"), App_log);
-    
-    // Load and run Io script
-    IoState_doFile_(state, "script.io");
-    
-    // Interact with Io objects
-    IoObject *result = IoState_doString_(state, 
-        "x := 10; y := 20; x + y");
-    printf("Result from Io: %f\n", IoNumber_asDouble(result));
-    
-    // Clean up
-    IoState_free(state);
-    
-    return 0;
-}
-
-

The Io script (script.io):

-
App log("Hello from Io!")
-
-// Define functions for C to call
-calculate := method(a, b,
-    App log("Calculating in Io")
-    a * b + 100
-)
-
-

- Performance Optimization - - # - -

-
// Optimized array operations
-IoObject *IoArray_sum(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    // Get underlying C array for performance
-    UArray *array = IoSeq_rawUArray(self);
-    size_t size = UArray_size(array);
-    uint8_t *data = UArray_bytes(array);
-    int itemSize = UArray_itemSize(array);
-    
-    double sum = 0;
-    
-    // Fast path for different types
-    if (itemSize == sizeof(double)) {
-        double *doubles = (double *)data;
-        for (size_t i = 0; i < size; i++) {
-            sum += doubles[i];
-        }
-    }
-    else if (itemSize == sizeof(float)) {
-        float *floats = (float *)data;
-        for (size_t i = 0; i < size; i++) {
-            sum += floats[i];
-        }
-    }
-    
-    return IoNumber_newWithDouble_(IOSTATE, sum);
-}
-
-// Batch operations
-IoObject *IoMatrix_multiply(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    IoObject *other = IoMessage_locals_valueArgAt_(m, locals, 0);
-    
-    // Get dimensions
-    int rows1 = IoMessage_locals_intArgAt_(m, locals, 1);
-    int cols1 = IoMessage_locals_intArgAt_(m, locals, 2);
-    int cols2 = IoMessage_locals_intArgAt_(m, locals, 3);
-    
-    // Get raw data pointers
-    double *data1 = (double *)IoSeq_rawBytes(self);
-    double *data2 = (double *)IoSeq_rawBytes(other);
-    
-    // Allocate result
-    IoSeq *result = IoSeq_newWithData_length_(IOSTATE, 
-        NULL, rows1 * cols2 * sizeof(double));
-    double *resultData = (double *)IoSeq_rawBytes(result);
-    
-    // Optimized matrix multiplication
-    for (int i = 0; i < rows1; i++) {
-        for (int j = 0; j < cols2; j++) {
-            double sum = 0;
-            for (int k = 0; k < cols1; k++) {
-                sum += data1[i * cols1 + k] * data2[k * cols2 + j];
-            }
-            resultData[i * cols2 + j] = sum;
-        }
-    }
-    
-    return result;
-}
-
-

- Debugging C Addons - - # - -

-
// Debug helpers
-#define IO_DEBUG 1
-
-#ifdef IO_DEBUG
-    #define DEBUG_PRINT(fmt, ...) \
-        fprintf(stderr, "DEBUG: " fmt "\n", ##__VA_ARGS__)
-#else
-    #define DEBUG_PRINT(fmt, ...)
-#endif
-
-IoObject *IoDebug_function(IoObject *self, IoObject *locals, IoMessage *m)
-{
-    DEBUG_PRINT("Function called with %d arguments", 
-        IoMessage_argCount(m));
-    
-    // Print argument types
-    for (int i = 0; i < IoMessage_argCount(m); i++) {
-        IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, i);
-        DEBUG_PRINT("  Arg %d: %s", i, IoObject_name(arg));
-    }
-    
-    // Check for memory issues
-    IoState *state = IOSTATE;
-    IoState_check(state);
-    
-    return self;
-}
-
-

- Common Integration Patterns - - # - -

-

- Callback Pattern - - # - -

-
// Store Io blocks as callbacks
-typedef struct {
-    IoObject obj;
-    IoObject *callback;
-} IoCallbackWrapper;
-
-IoObject *IoWrapper_setCallback(IoCallbackWrapper *self, 
-    IoObject *locals, IoMessage *m)
-{
-    IoObject *block = IoMessage_locals_valueArgAt_(m, locals, 0);
-    
-    // Retain the block
-    IoState_retain_(IOSTATE, block);
-    if (self->callback) {
-        IoState_release_(IOSTATE, self->callback);
-    }
-    self->callback = block;
-    
-    return self;
-}
-
-// Call the Io callback from C
-void triggerCallback(IoCallbackWrapper *wrapper, double value)
-{
-    if (wrapper->callback) {
-        IoObject *arg = IoNumber_newWithDouble_(IOSTATE, value);
-        IoObject_perform(wrapper->callback, wrapper, 
-            IoMessage_newWithName_label_(IOSTATE, 
-                IOSYMBOL("call"), arg));
-    }
-}
-
-

- Event System - - # - -

-
// Event emitter in C
-typedef struct {
-    IoObject obj;
-    IoMap *handlers;  // Event name -> List of handlers
-} IoEventEmitter;
-
-IoObject *IoEventEmitter_on(IoEventEmitter *self, 
-    IoObject *locals, IoMessage *m)
-{
-    IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0);
-    IoObject *handler = IoMessage_locals_valueArgAt_(m, locals, 1);
-    
-    IoList *handlers = IoMap_at_(self->handlers, event);
-    if (!handlers) {
-        handlers = IoList_new(IOSTATE);
-        IoMap_atPut_(self->handlers, event, handlers);
-    }
-    
-    IoList_append_(handlers, handler);
-    return self;
-}
-
-IoObject *IoEventEmitter_emit(IoEventEmitter *self, 
-    IoObject *locals, IoMessage *m)
-{
-    IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0);
-    IoList *handlers = IoMap_at_(self->handlers, event);
-    
-    if (handlers) {
-        size_t count = IoList_size(handlers);
-        for (size_t i = 0; i < count; i++) {
-            IoObject *handler = IoList_at_(handlers, i);
-            
-            // Pass remaining arguments to handler
-            IoMessage *msg = IoMessage_newWithName_(IOSTATE, 
-                IOSYMBOL("call"));
-            for (int j = 1; j < IoMessage_argCount(m); j++) {
-                IoMessage_addArg_(msg, IoMessage_argAt_(m, j));
-            }
-            
-            IoObject_perform(handler, locals, msg);
-        }
-    }
-    
-    return self;
-}
-
-

- Build System Integration - - # - -

-

Makefile for Io addon:

-
# Makefile for Io addon
-CC = gcc
-CFLAGS = -shared -fPIC -Wall -O2
-INCLUDES = -I$(IO_HOME)/include
-LIBS = -L$(IO_HOME)/lib -lIo
-
-ADDON = myaddon.so
-SOURCES = myaddon.c utils.c
-OBJECTS = $(SOURCES:.c=.o)
-
-all: $(ADDON)
-
-$(ADDON): $(OBJECTS)
-    $(CC) $(CFLAGS) -o $@ $^ $(LIBS)
-
-%.o: %.c
-    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
-
-clean:
-    rm -f $(OBJECTS) $(ADDON)
-
-install: $(ADDON)
-    cp $(ADDON) $(IO_HOME)/addons/
-
-test: $(ADDON)
-    io test_addon.io
-
-

- Exercises - - # - -

-
    -
  1. -

    SQLite Wrapper: Create a complete SQLite wrapper for Io.

    -
  2. -
  3. -

    Graphics Library: Wrap SDL or Cairo for graphics programming.

    -
  4. -
  5. -

    Network Addon: Implement high-performance networking primitives.

    -
  6. -
  7. -

    Crypto Library: Wrap OpenSSL for cryptographic operations.

    -
  8. -
  9. -

    Scientific Computing: Create bindings for BLAS/LAPACK.

    -
  10. -
-

- Conclusion - - # - -

-

C integration is one of Io’s strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns.

-

Whether you’re optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io’s C integration provides the tools you need while maintaining the simplicity and elegance of the language.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/15-real-world-patterns/index.html b/website/public/docs/15-real-world-patterns/index.html deleted file mode 100644 index ca4946a..0000000 --- a/website/public/docs/15-real-world-patterns/index.html +++ /dev/null @@ -1,1600 +0,0 @@ - - - - - - - - - - - - - - - -Real-World Patterns | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Real-World Patterns

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Real-World Patterns

- -
Chapter 15
- -
- - - - - -

After exploring Io’s features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We’ll see how Io’s unique features enable elegant solutions to common programming challenges.

-

- Model-View-Controller (MVC) - - # - -

-

Implementing MVC in Io leverages prototypes and message passing:

-
// Model
-Model := Object clone
-Model init := method(
-    self observers := list()
-    self data := Map clone
-    self
-)
-
-Model set := method(key, value,
-    oldValue := data at(key)
-    if(oldValue != value,
-        data atPut(key, value)
-        notifyObservers(key, oldValue, value)
-    )
-    self
-)
-
-Model get := method(key,
-    data at(key)
-)
-
-Model observe := method(observer,
-    observers append(observer)
-    self
-)
-
-Model notifyObservers := method(key, oldValue, newValue,
-    observers foreach(observer,
-        if(observer hasSlot("modelChanged"),
-            observer modelChanged(self, key, oldValue, newValue)
-        )
-    )
-)
-
-// View
-View := Object clone
-View init := method(model,
-    self model := model
-    model observe(self)
-    self elements := Map clone
-    self
-)
-
-View modelChanged := method(model, key, oldValue, newValue,
-    render
-)
-
-View render := method(
-    // Override in subclasses
-)
-
-// Controller
-Controller := Object clone
-Controller init := method(model, view,
-    self model := model
-    self view := view
-    self
-)
-
-Controller handleInput := method(input,
-    // Process input and update model
-)
-
-// Example: Todo MVC
-TodoModel := Model clone
-TodoModel init := method(
-    resend
-    self set("todos", list())
-    self
-)
-
-TodoModel addTodo := method(text,
-    todos := get("todos") copy
-    todos append(Map with("text", text, "done", false))
-    set("todos", todos)
-)
-
-TodoModel toggleTodo := method(index,
-    todos := get("todos") copy
-    todo := todos at(index)
-    todo atPut("done", todo at("done") not)
-    set("todos", todos)
-)
-
-TodoView := View clone
-TodoView render := method(
-    "=== Todo List ===" println
-    model get("todos") foreach(i, todo,
-        status := if(todo at("done"), "[✓]", "[ ]")
-        (i .. ". " .. status .. " " .. todo at("text")) println
-    )
-    "================" println
-)
-
-TodoController := Controller clone
-TodoController processCommand := method(cmd,
-    parts := cmd split(" ")
-    action := parts at(0)
-    
-    if(action == "add",
-        text := parts slice(1) join(" ")
-        model addTodo(text)
-    )
-    
-    if(action == "toggle",
-        index := parts at(1) asNumber
-        model toggleTodo(index)
-    )
-    
-    if(action == "quit",
-        System exit
-    )
-)
-
-// Usage
-app := Object clone
-app model := TodoModel clone init
-app view := TodoView clone init(app model)
-app controller := TodoController clone init(app model, app view)
-
-app view render
-// Simulate commands
-app controller processCommand("add Buy groceries")
-app controller processCommand("add Write documentation")
-app controller processCommand("toggle 0")
-
-

- Repository Pattern - - # - -

-

Abstracting data access:

-
// Base Repository
-Repository := Object clone
-Repository init := method(
-    self storage := list()
-    self nextId := 1
-    self
-)
-
-Repository save := method(entity,
-    if(entity hasSlot("id") not or entity id isNil,
-        entity id := nextId
-        nextId = nextId + 1
-        storage append(entity)
-    ,
-        // Update existing
-        index := storage detectIndex(e, e id == entity id)
-        if(index, storage atPut(index, entity))
-    )
-    entity
-)
-
-Repository findById := method(id,
-    storage detect(e, e id == id)
-)
-
-Repository findAll := method(
-    storage copy
-)
-
-Repository delete := method(entity,
-    storage remove(entity)
-)
-
-Repository where := method(predicate,
-    storage select(predicate)
-)
-
-// Specialized repository with persistence
-FileRepository := Repository clone
-FileRepository filename := "data.json"
-
-FileRepository init := method(
-    resend
-    load
-    self
-)
-
-FileRepository load := method(
-    if(File with(filename) exists,
-        data := File with(filename) contents parseJson
-        storage = data map(item, entityFromMap(item))
-        nextId = storage map(e, e id) max + 1
-    )
-)
-
-FileRepository save := method(entity,
-    resend(entity)
-    persist
-    entity
-)
-
-FileRepository persist := method(
-    data := storage map(e, e asMap)
-    File with(filename) openForWriting write(data asJson) close
-)
-
-// Entity
-User := Object clone
-User init := method(name, email,
-    self id := nil
-    self name := name
-    self email := email
-    self createdAt := Date now
-    self
-)
-
-User asMap := method(
-    Map with(
-        "id", id,
-        "name", name,
-        "email", email,
-        "createdAt", createdAt asString
-    )
-)
-
-// Usage
-userRepo := FileRepository clone init
-
-user1 := User clone init("Alice", "alice@example.com")
-user2 := User clone init("Bob", "bob@example.com")
-
-userRepo save(user1)
-userRepo save(user2)
-
-found := userRepo findById(1)
-active := userRepo where(u, u createdAt > Date now - Duration days(30))
-
-

- Observer Pattern - - # - -

-

Native implementation using Io’s message passing:

-
Observable := Object clone
-Observable init := method(
-    self observers := Map clone
-    self
-)
-
-Observable on := method(event, observer, methodName,
-    if(observers hasKey(event) not,
-        observers atPut(event, list())
-    )
-    observers at(event) append(list(observer, methodName))
-    self
-)
-
-Observable off := method(event, observer,
-    if(observers hasKey(event),
-        observers at(event) := observers at(event) reject(pair,
-            pair at(0) == observer
-        )
-    )
-    self
-)
-
-Observable emit := method(event,
-    args := call message arguments slice(1)
-    
-    if(observers hasKey(event),
-        observers at(event) foreach(pair,
-            observer := pair at(0)
-            methodName := pair at(1)
-            
-            msg := Message clone setName(methodName)
-            args foreach(arg, msg appendArg(arg))
-            
-            observer doMessage(msg)
-        )
-    )
-    self
-)
-
-// Example: Stock price monitor
-Stock := Observable clone
-Stock init := method(symbol, price,
-    resend
-    self symbol := symbol
-    self price := price
-    self
-)
-
-Stock setPrice := method(newPrice,
-    oldPrice := price
-    price = newPrice
-    
-    change := ((newPrice - oldPrice) / oldPrice * 100) round
-    emit("priceChanged", symbol, oldPrice, newPrice, change)
-    
-    if(change abs > 5,
-        emit("largeMoveDetected", symbol, change)
-    )
-)
-
-StockAlert := Object clone
-StockAlert onPriceChange := method(symbol, oldPrice, newPrice, change,
-    ("Price alert: " .. symbol .. " moved from $" .. oldPrice .. 
-     " to $" .. newPrice .. " (" .. change .. "%)") println
-)
-
-StockAlert onLargeMove := method(symbol, change,
-    ("⚠️  Large move detected: " .. symbol .. " changed " .. change .. "%") println
-)
-
-// Usage
-apple := Stock clone init("AAPL", 150.00)
-alert := StockAlert clone
-
-apple on("priceChanged", alert, "onPriceChange")
-apple on("largeMoveDetected", alert, "onLargeMove")
-
-apple setPrice(155.00)  // Normal change
-apple setPrice(165.00)  // Large move triggers both alerts
-
-

- Dependency Injection - - # - -

-

Using Io’s dynamic nature for DI:

-
// DI Container
-Container := Object clone
-Container init := method(
-    self services := Map clone
-    self singletons := Map clone
-    self
-)
-
-Container register := method(name, factory,
-    services atPut(name, factory)
-    self
-)
-
-Container singleton := method(name, factory,
-    services atPut(name, factory)
-    singletons atPut(name, nil)
-    self
-)
-
-Container get := method(name,
-    if(services hasKey(name) not,
-        Exception raise("Service '" .. name .. "' not registered")
-    )
-    
-    // Check if singleton
-    if(singletons hasKey(name),
-        if(singletons at(name) isNil,
-            singletons atPut(name, services at(name) call(self))
-        )
-        return singletons at(name)
-    )
-    
-    // Regular service
-    services at(name) call(self)
-)
-
-// Services
-Logger := Object clone
-Logger init := method(output,
-    self output := output
-    self
-)
-Logger log := method(message,
-    output write("[" .. Date now .. "] " .. message .. "\n")
-)
-
-Database := Object clone
-Database init := method(connectionString, logger,
-    self connectionString := connectionString
-    self logger := logger
-    logger log("Database initialized: " .. connectionString)
-    self
-)
-
-UserService := Object clone
-UserService init := method(database, logger,
-    self database := database
-    self logger := logger
-    self
-)
-UserService createUser := method(name,
-    logger log("Creating user: " .. name)
-    // database operations...
-    Map with("id", 1, "name", name)
-)
-
-// Configure container
-container := Container clone init
-
-container singleton("logger", block(c,
-    Logger clone init(File standardOutput)
-))
-
-container singleton("database", block(c,
-    Database clone init("postgres://localhost/myapp", c get("logger"))
-))
-
-container register("userService", block(c,
-    UserService clone init(c get("database"), c get("logger"))
-))
-
-// Usage
-service := container get("userService")
-service createUser("Alice")
-
-// Different instance each time
-service1 := container get("userService")
-service2 := container get("userService")
-(service1 == service2) println  // false
-
-// Same logger instance
-logger1 := container get("logger")
-logger2 := container get("logger")
-(logger1 == logger2) println  // true
-
-

- Strategy Pattern - - # - -

-

Leveraging blocks and dynamic dispatch:

-
// Sorting strategies
-SortStrategy := Object clone
-
-BubbleSort := SortStrategy clone
-BubbleSort execute := method(list,
-    result := list copy
-    n := result size
-    
-    for(i, 0, n - 2,
-        for(j, 0, n - i - 2,
-            if(result at(j) > result at(j + 1),
-                temp := result at(j)
-                result atPut(j, result at(j + 1))
-                result atPut(j + 1, temp)
-            )
-        )
-    )
-    result
-)
-
-QuickSort := SortStrategy clone
-QuickSort execute := method(list,
-    if(list size <= 1, return list)
-    
-    pivot := list at(list size / 2)
-    less := list select(x, x < pivot)
-    equal := list select(x, x == pivot)
-    greater := list select(x, x > pivot)
-    
-    execute(less) appendSeq(equal) appendSeq(execute(greater))
-)
-
-// Context
-DataProcessor := Object clone
-DataProcessor init := method(
-    self strategy := QuickSort
-    self
-)
-
-DataProcessor setStrategy := method(s,
-    strategy = s
-    self
-)
-
-DataProcessor process := method(data,
-    "Processing data..." println
-    strategy execute(data)
-)
-
-// Usage with different strategies
-processor := DataProcessor clone init
-
-data := list(3, 1, 4, 1, 5, 9, 2, 6)
-
-processor setStrategy(BubbleSort) process(data) println
-processor setStrategy(QuickSort) process(data) println
-
-// Dynamic strategy selection
-selectStrategy := method(dataSize,
-    if(dataSize < 10, BubbleSort, QuickSort)
-)
-
-processor setStrategy(selectStrategy(data size))
-
-

- Chain of Responsibility - - # - -

-

Building processing pipelines:

-
Handler := Object clone
-Handler init := method(
-    self next := nil
-    self
-)
-
-Handler setNext := method(handler,
-    next = handler
-    handler
-)
-
-Handler handle := method(request,
-    if(canHandle(request),
-        process(request),
-        if(next, next handle(request), nil)
-    )
-)
-
-// Concrete handlers
-AuthenticationHandler := Handler clone
-AuthenticationHandler canHandle := method(request,
-    request at("requiresAuth")
-)
-AuthenticationHandler process := method(request,
-    if(request at("token") == "valid-token",
-        "Authentication successful" println
-        request atPut("authenticated", true)
-        if(next, next handle(request), request)
-    ,
-        Exception raise("Authentication failed")
-    )
-)
-
-LoggingHandler := Handler clone
-LoggingHandler canHandle := method(request, true)
-LoggingHandler process := method(request,
-    ("Logging request: " .. request at("path")) println
-    if(next, next handle(request), request)
-)
-
-RateLimitHandler := Handler clone
-RateLimitHandler init := method(
-    resend
-    self requests := Map clone
-    self limit := 10
-    self window := 60  // seconds
-    self
-)
-RateLimitHandler canHandle := method(request,
-    request hasKey("clientId")
-)
-RateLimitHandler process := method(request,
-    clientId := request at("clientId")
-    now := Date now
-    
-    if(requests hasKey(clientId) not,
-        requests atPut(clientId, list())
-    )
-    
-    // Clean old requests
-    clientRequests := requests at(clientId) select(time,
-        now - time < window
-    )
-    
-    if(clientRequests size >= limit,
-        Exception raise("Rate limit exceeded"),
-        clientRequests append(now)
-        requests atPut(clientId, clientRequests)
-        if(next, next handle(request), request)
-    )
-)
-
-// Build chain
-chain := LoggingHandler clone \
-    setNext(RateLimitHandler clone \
-        setNext(AuthenticationHandler clone))
-
-// Process requests
-request := Map with(
-    "path", "/api/users",
-    "clientId", "client-123",
-    "requiresAuth", true,
-    "token", "valid-token"
-)
-
-result := chain handle(request)
-
-

- Plugin Architecture - - # - -

-

Dynamic loading and extension:

-
PluginManager := Object clone
-PluginManager init := method(
-    self plugins := Map clone
-    self hooks := Map clone
-    self
-)
-
-PluginManager registerHook := method(name,
-    if(hooks hasKey(name) not,
-        hooks atPut(name, list())
-    )
-    self
-)
-
-PluginManager loadPlugin := method(path,
-    plugin := doFile(path)
-    
-    if(plugin hasSlot("name") not,
-        Exception raise("Plugin must have a name")
-    )
-    
-    plugins atPut(plugin name, plugin)
-    
-    if(plugin hasSlot("init"),
-        plugin init(self)
-    )
-    
-    ("Plugin loaded: " .. plugin name) println
-    self
-)
-
-PluginManager hook := method(name,
-    args := call message arguments slice(1)
-    results := list()
-    
-    if(hooks hasKey(name),
-        hooks at(name) foreach(handler,
-            result := handler doMessage(Message clone setName("call") setArguments(args))
-            results append(result)
-        )
-    )
-    
-    results
-)
-
-PluginManager addHook := method(hookName, handler,
-    if(hooks hasKey(hookName) not,
-        registerHook(hookName)
-    )
-    hooks at(hookName) append(handler)
-    self
-)
-
-// Example plugin
-MarkdownPlugin := Object clone
-MarkdownPlugin name := "markdown"
-MarkdownPlugin init := method(manager,
-    manager addHook("processText", block(text,
-        // Simple markdown processing
-        text replaceAllRegex("\\*\\*(.*?)\\*\\*", "<strong>$1</strong>") \
-             replaceAllRegex("\\*(.*?)\\*", "<em>$1</em>")
-    ))
-    
-    manager addHook("getFormats", block(
-        list("markdown", "md")
-    ))
-)
-
-// Usage
-manager := PluginManager clone init
-manager registerHook("processText")
-manager registerHook("getFormats")
-
-// Load plugins
-manager loadPlugin("markdown_plugin.io")
-
-// Use hooks
-text := "This is **bold** and this is *italic*"
-processed := manager hook("processText", text)
-processed foreach(result, result println)
-
-formats := manager hook("getFormats")
-"Supported formats: " print
-formats flatten unique println
-
-

- Event Sourcing - - # - -

-

Implementing event-driven architecture:

-
// Event
-Event := Object clone
-Event init := method(type, data,
-    self type := type
-    self data := data
-    self timestamp := Date now
-    self id := Random uuid
-    self
-)
-
-// Event Store
-EventStore := Object clone
-EventStore init := method(
-    self events := list()
-    self snapshots := Map clone
-    self
-)
-
-EventStore append := method(event,
-    events append(event)
-    self
-)
-
-EventStore getEvents := method(afterId,
-    if(afterId isNil,
-        return events
-    )
-    
-    startIndex := events detectIndex(e, e id == afterId)
-    if(startIndex,
-        events slice(startIndex + 1),
-        list()
-    )
-)
-
-// Aggregate
-Aggregate := Object clone
-Aggregate init := method(id,
-    self id := id
-    self version := 0
-    self uncommittedEvents := list()
-    self
-)
-
-Aggregate applyEvent := method(event,
-    // Override in subclasses
-)
-
-Aggregate raiseEvent := method(event,
-    applyEvent(event)
-    uncommittedEvents append(event)
-    version = version + 1
-)
-
-Aggregate markEventsAsCommitted := method(
-    uncommittedEvents = list()
-)
-
-Aggregate loadFromHistory := method(events,
-    events foreach(event,
-        applyEvent(event)
-        version = version + 1
-    )
-)
-
-// Example: Bank Account aggregate
-BankAccount := Aggregate clone
-BankAccount init := method(id,
-    resend(id)
-    self balance := 0
-    self
-)
-
-BankAccount deposit := method(amount,
-    if(amount <= 0,
-        Exception raise("Amount must be positive")
-    )
-    
-    raiseEvent(Event clone init("MoneyDeposited", 
-        Map with("accountId", id, "amount", amount)))
-)
-
-BankAccount withdraw := method(amount,
-    if(amount <= 0,
-        Exception raise("Amount must be positive")
-    )
-    if(amount > balance,
-        Exception raise("Insufficient funds")
-    )
-    
-    raiseEvent(Event clone init("MoneyWithdrawn",
-        Map with("accountId", id, "amount", amount)))
-)
-
-BankAccount applyEvent := method(event,
-    if(event type == "MoneyDeposited",
-        balance = balance + event data at("amount")
-    )
-    
-    if(event type == "MoneyWithdrawn",
-        balance = balance - event data at("amount")
-    )
-)
-
-// Repository using event sourcing
-AccountRepository := Object clone
-AccountRepository init := method(eventStore,
-    self eventStore := eventStore
-    self
-)
-
-AccountRepository save := method(account,
-    account uncommittedEvents foreach(event,
-        eventStore append(event)
-    )
-    account markEventsAsCommitted
-)
-
-AccountRepository getById := method(id,
-    events := eventStore getEvents select(e,
-        e data at("accountId") == id
-    )
-    
-    account := BankAccount clone init(id)
-    account loadFromHistory(events)
-    account
-)
-
-// Usage
-store := EventStore clone init
-repo := AccountRepository clone init(store)
-
-account := BankAccount clone init("acc-123")
-account deposit(100)
-account withdraw(30)
-account deposit(50)
-
-repo save(account)
-account balance println  // 120
-
-// Rebuild from events
-rebuilt := repo getById("acc-123")
-rebuilt balance println  // 120
-
-

- Caching Strategy - - # - -

-

Multi-level caching with different policies:

-
Cache := Object clone
-Cache init := method(maxSize, ttl,
-    self maxSize := maxSize
-    self ttl := ttl  // Time to live in seconds
-    self entries := Map clone
-    self accessOrder := list()
-    self
-)
-
-Cache get := method(key,
-    if(entries hasKey(key),
-        entry := entries at(key)
-        
-        // Check TTL
-        if(Date now - entry at("time") > ttl,
-            entries removeAt(key)
-            accessOrder remove(key)
-            return nil
-        )
-        
-        // Update access order (LRU)
-        accessOrder remove(key)
-        accessOrder append(key)
-        
-        entry at("value")
-    ,
-        nil
-    )
-)
-
-Cache put := method(key, value,
-    // Evict if necessary
-    while(entries size >= maxSize,
-        evictKey := accessOrder removeFirst
-        entries removeAt(evictKey)
-        ("Cache evicted: " .. evictKey) println
-    )
-    
-    entries atPut(key, Map with(
-        "value", value,
-        "time", Date now
-    ))
-    accessOrder append(key)
-    
-    value
-)
-
-Cache getOrCompute := method(key, computeBlock,
-    value := get(key)
-    if(value isNil,
-        value = computeBlock call
-        put(key, value)
-    )
-    value
-)
-
-// Multi-level cache
-MultiLevelCache := Object clone
-MultiLevelCache init := method(
-    self l1 := Cache clone init(10, 60)     // Small, fast, 1 minute TTL
-    self l2 := Cache clone init(100, 600)   // Larger, 10 minute TTL
-    self
-)
-
-MultiLevelCache get := method(key,
-    // Check L1
-    value := l1 get(key)
-    if(value, return value)
-    
-    // Check L2
-    value = l2 get(key)
-    if(value,
-        l1 put(key, value)  // Promote to L1
-        return value
-    )
-    
-    nil
-)
-
-MultiLevelCache put := method(key, value,
-    l1 put(key, value)
-    l2 put(key, value)
-    value
-)
-
-// Usage with expensive computation
-fibonacci := Object clone
-fibonacci cache := MultiLevelCache clone init
-
-fibonacci compute := method(n,
-    if(n <= 1, return n)
-    
-    cache get(n) ifNil(
-        ("Computing fib(" .. n .. ")") println
-        result := compute(n - 1) + compute(n - 2)
-        cache put(n, result)
-        result
-    )
-)
-
-fibonacci compute(10) println  // Computes
-fibonacci compute(10) println  // From cache
-
-

- Conclusion - - # - -

-

These patterns demonstrate how Io’s features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language’s flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code.

-

The key insight is that Io’s uniform object model means patterns aren’t special constructs but natural expressions of the language’s core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/16-case-studies/index.html b/website/public/docs/16-case-studies/index.html deleted file mode 100644 index 793de1b..0000000 --- a/website/public/docs/16-case-studies/index.html +++ /dev/null @@ -1,2050 +0,0 @@ - - - - - - - - - - - - - - - -Case Studies | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Case Studies

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Case Studies

- -
Chapter 16
- -
- - - - - -

This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io’s features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language.

-

- Case Study 1: Web Server - - # - -

-

Building a simple but functional HTTP server demonstrates Io’s networking, concurrency, and string handling:

-
// HTTP Server Implementation
-HttpServer := Object clone
-HttpServer init := method(port,
-    self port := port
-    self routes := Map clone
-    self middlewares := list()
-    self
-)
-
-HttpRequest := Object clone
-HttpRequest parse := method(rawData,
-    lines := rawData split("\r\n")
-    if(lines size == 0, return nil)
-    
-    // Parse request line
-    requestLine := lines at(0) split(" ")
-    self method := requestLine at(0)
-    self path := requestLine at(1)
-    self version := requestLine at(2)
-    
-    // Parse headers
-    self headers := Map clone
-    self body := ""
-    
-    bodyStart := false
-    lines slice(1) foreach(line,
-        if(bodyStart,
-            body = body .. line,
-            if(line size == 0,
-                bodyStart = true,
-                parts := line split(": ")
-                if(parts size == 2,
-                    headers atPut(parts at(0), parts at(1))
-                )
-            )
-        )
-    )
-    
-    // Parse query parameters
-    self params := Map clone
-    if(path containsSeq("?"),
-        parts := path split("?")
-        self path = parts at(0)
-        queryString := parts at(1)
-        
-        queryString split("&") foreach(param,
-            kv := param split("=")
-            if(kv size == 2,
-                params atPut(kv at(0), kv at(1) urlDecode)
-            )
-        )
-    )
-    
-    self
-)
-
-HttpResponse := Object clone
-HttpResponse init := method(
-    self status := 200
-    self headers := Map clone
-    self body := ""
-    
-    headers atPut("Content-Type", "text/html")
-    headers atPut("Server", "Io-Server/1.0")
-    self
-)
-
-HttpResponse setStatus := method(code,
-    status = code
-    self
-)
-
-HttpResponse setHeader := method(key, value,
-    headers atPut(key, value)
-    self
-)
-
-HttpResponse write := method(content,
-    body = body .. content
-    self
-)
-
-HttpResponse json := method(data,
-    setHeader("Content-Type", "application/json")
-    write(data asJson)
-    self
-)
-
-HttpResponse build := method(
-    statusText := Map with(
-        200, "OK",
-        404, "Not Found",
-        500, "Internal Server Error"
-    ) at(status, "Unknown")
-    
-    result := "HTTP/1.1 " .. status .. " " .. statusText .. "\r\n"
-    
-    headers atPut("Content-Length", body size asString)
-    headers foreach(key, value,
-        result = result .. key .. ": " .. value .. "\r\n"
-    )
-    
-    result .. "\r\n" .. body
-)
-
-// Middleware support
-HttpServer use := method(middleware,
-    middlewares append(middleware)
-    self
-)
-
-// Routing
-HttpServer route := method(method, path, handler,
-    key := method .. ":" .. path
-    routes atPut(key, handler)
-    self
-)
-
-HttpServer get := method(path, handler,
-    route("GET", path, handler)
-)
-
-HttpServer post := method(path, handler,
-    route("POST", path, handler)
-)
-
-// Request handling
-HttpServer handleConnection := method(socket,
-    rawData := socket readUntilSeq("\r\n\r\n")
-    
-    request := HttpRequest parse(rawData)
-    if(request isNil,
-        socket close
-        return
-    )
-    
-    response := HttpResponse clone init
-    
-    // Run middlewares
-    middlewares foreach(middleware,
-        middleware call(request, response)
-    )
-    
-    // Find route
-    key := request method .. ":" .. request path
-    handler := routes at(key)
-    
-    if(handler,
-        e := try(
-            handler call(request, response)
-        ) catch(Exception, e,
-            response setStatus(500) write("Internal Server Error: " .. e message)
-        )
-    ,
-        // Try pattern matching for dynamic routes
-        handled := false
-        routes foreach(routeKey, routeHandler,
-            parts := routeKey split(":")
-            routeMethod := parts at(0)
-            routePath := parts at(1)
-            
-            if(routeMethod == request method and matchPath(routePath, request path),
-                routeHandler call(request, response)
-                handled = true
-                break
-            )
-        )
-        
-        if(handled not,
-            response setStatus(404) write("Not Found")
-        )
-    )
-    
-    socket write(response build)
-    socket close
-)
-
-HttpServer matchPath := method(pattern, path,
-    // Simple pattern matching (e.g., /users/:id)
-    if(pattern containsSeq(":"),
-        patternParts := pattern split("/")
-        pathParts := path split("/")
-        
-        if(patternParts size != pathParts size, return false)
-        
-        patternParts foreach(i, part,
-            if(part beginsWithSeq(":") not,
-                if(part != pathParts at(i), return false)
-            )
-        )
-        
-        true
-    ,
-        pattern == path
-    )
-)
-
-HttpServer start := method(
-    server := Socket clone
-    server setHost("127.0.0.1")
-    server setPort(port)
-    server bind
-    server listen
-    
-    ("Server listening on port " .. port) println
-    
-    loop(
-        client := server accept
-        @handleConnection(client)  // Handle async
-    )
-)
-
-// Example application
-app := HttpServer clone init(8080)
-
-// Middleware for logging
-app use(block(request, response,
-    ("[" .. Date now .. "] " .. request method .. " " .. request path) println
-))
-
-// Static content
-app get("/", block(request, response,
-    response write("<h1>Welcome to Io Web Server</h1>")
-    response write("<p>A simple server built with Io</p>")
-))
-
-// JSON API
-app get("/api/info", block(request, response,
-    info := Map with(
-        "server", "Io-Server",
-        "version", "1.0",
-        "time", Date now asString
-    )
-    response json(info)
-))
-
-// Dynamic routes
-app get("/users/:id", block(request, response,
-    // Extract ID from path
-    id := request path split("/") at(2)
-    response write("<h1>User Profile</h1>")
-    response write("<p>User ID: " .. id .. "</p>")
-))
-
-// Form handling
-app post("/submit", block(request, response,
-    // Parse form data from body
-    response write("<h1>Form Submitted</h1>")
-    response write("<p>Data: " .. request body .. "</p>")
-))
-
-// Start server
-app start
-
-

- Case Study 2: Database ORM - - # - -

-

A simple object-relational mapper showcasing metaprogramming and DSL capabilities:

-
// ORM Implementation
-ORM := Object clone
-
-// Database connection (simplified)
-Database := Object clone
-Database connections := Map clone
-
-Database connect := method(name, config,
-    conn := Connection clone init(config)
-    connections atPut(name, conn)
-    conn
-)
-
-Connection := Object clone
-Connection init := method(config,
-    self config := config
-    self tables := Map clone
-    self
-)
-
-Connection execute := method(sql,
-    ("[SQL] " .. sql) println
-    // Simulate results
-    list()
-)
-
-// Model base class
-Model := Object clone
-Model tableName := nil
-Model fields := Map clone
-Model connection := nil
-
-Model field := method(name, type,
-    fields atPut(name, Map with("type", type, "name", name))
-    
-    // Generate getter
-    self setSlot(name, method(
-        self getSlot("_" .. name)
-    ))
-    
-    // Generate setter
-    self setSlot("set" .. name asCapitalized, method(value,
-        self setSlot("_" .. name, value)
-        self
-    ))
-    
-    self
-)
-
-Model belongsTo := method(name, targetModel,
-    fields atPut(name .. "_id", Map with("type", "INTEGER", "name", name .. "_id"))
-    
-    self setSlot(name, method(
-        targetModel findById(self getSlot("_" .. name .. "_id"))
-    ))
-    
-    self
-)
-
-Model hasMany := method(name, targetModel, foreignKey,
-    self setSlot(name, method(
-        targetModel where(foreignKey .. " = " .. self id)
-    ))
-    
-    self
-)
-
-Model createTable := method(
-    sql := "CREATE TABLE IF NOT EXISTS " .. tableName .. " (\n"
-    sql = sql .. "  id INTEGER PRIMARY KEY AUTOINCREMENT,\n"
-    
-    fieldDefs := fields map(name, field,
-        "  " .. name .. " " .. field at("type")
-    )
-    
-    sql = sql .. fieldDefs join(",\n") .. "\n);"
-    
-    connection execute(sql)
-    self
-)
-
-Model dropTable := method(
-    connection execute("DROP TABLE IF EXISTS " .. tableName)
-    self
-)
-
-Model init := method(
-    fields foreach(name, field,
-        self setSlot("_" .. name, nil)
-    )
-    self setSlot("_id", nil)
-    self
-)
-
-Model save := method(
-    if(_id,
-        update,
-        insert
-    )
-)
-
-Model insert := method(
-    columns := list()
-    values := list()
-    
-    fields foreach(name, field,
-        value := self getSlot("_" .. name)
-        if(value isNil not,
-            columns append(name)
-            values append("'" .. value asString .. "'")
-        )
-    )
-    
-    sql := "INSERT INTO " .. tableName .. " (" .. columns join(", ") .. ") VALUES (" .. values join(", ") .. ")"
-    
-    connection execute(sql)
-    self _id := connection lastInsertId  // Simulated
-    self
-)
-
-Model update := method(
-    updates := list()
-    
-    fields foreach(name, field,
-        value := self getSlot("_" .. name)
-        if(value isNil not,
-            updates append(name .. " = '" .. value asString .. "'")
-        )
-    )
-    
-    sql := "UPDATE " .. tableName .. " SET " .. updates join(", ") .. " WHERE id = " .. _id
-    
-    connection execute(sql)
-    self
-)
-
-Model delete := method(
-    if(_id,
-        connection execute("DELETE FROM " .. tableName .. " WHERE id = " .. _id)
-        self _id := nil
-    )
-    self
-)
-
-// Class methods
-Model all := method(
-    sql := "SELECT * FROM " .. tableName
-    rows := connection execute(sql)
-    
-    rows map(row, fromRow(row))
-)
-
-Model findById := method(id,
-    sql := "SELECT * FROM " .. tableName .. " WHERE id = " .. id
-    rows := connection execute(sql)
-    
-    if(rows size > 0,
-        fromRow(rows first),
-        nil
-    )
-)
-
-Model where := method(condition,
-    sql := "SELECT * FROM " .. tableName .. " WHERE " .. condition
-    rows := connection execute(sql)
-    
-    rows map(row, fromRow(row))
-)
-
-Model fromRow := method(row,
-    instance := self clone init
-    instance _id := row at("id")
-    
-    fields foreach(name, field,
-        instance setSlot("_" .. name, row at(name))
-    )
-    
-    instance
-)
-
-// Query builder
-QueryBuilder := Object clone
-QueryBuilder init := method(model,
-    self model := model
-    self selections := list("*")
-    self conditions := list()
-    self orderBy := nil
-    self limitValue := nil
-    self
-)
-
-QueryBuilder select := method(
-    self selections = call message arguments map(arg,
-        call sender doMessage(arg) asString
-    )
-    self
-)
-
-QueryBuilder where := method(condition,
-    conditions append(condition)
-    self
-)
-
-QueryBuilder order := method(column, direction,
-    orderBy = column .. " " .. if(direction, direction, "ASC")
-    self
-)
-
-QueryBuilder limit := method(n,
-    limitValue = n
-    self
-)
-
-QueryBuilder build := method(
-    sql := "SELECT " .. selections join(", ") .. " FROM " .. model tableName
-    
-    if(conditions size > 0,
-        sql = sql .. " WHERE " .. conditions join(" AND ")
-    )
-    
-    if(orderBy,
-        sql = sql .. " ORDER BY " .. orderBy
-    )
-    
-    if(limitValue,
-        sql = sql .. " LIMIT " .. limitValue
-    )
-    
-    sql
-)
-
-QueryBuilder execute := method(
-    sql := build
-    rows := model connection execute(sql)
-    rows map(row, model fromRow(row))
-)
-
-// Define models
-User := Model clone
-User tableName = "users"
-User connection = Database connect("main", Map with("file", "app.db"))
-
-User field("name", "VARCHAR(100)") \
-    field("email", "VARCHAR(100)") \
-    field("age", "INTEGER") \
-    field("created_at", "DATETIME")
-
-User hasMany("posts", Post, "user_id")
-
-Post := Model clone
-Post tableName = "posts"
-Post connection = User connection
-
-Post field("title", "VARCHAR(200)") \
-    field("content", "TEXT") \
-    field("published", "BOOLEAN") \
-    field("user_id", "INTEGER")
-
-Post belongsTo("user", User)
-
-// Validations
-User validate := method(
-    errors := list()
-    
-    if(_name isNil or _name size == 0,
-        errors append("Name is required")
-    )
-    
-    if(_email isNil or _email containsSeq("@") not,
-        errors append("Invalid email")
-    )
-    
-    if(_age and (_age < 0 or _age > 150),
-        errors append("Invalid age")
-    )
-    
-    if(errors size > 0,
-        Exception raise(errors join(", "))
-    )
-    
-    true
-)
-
-User beforeSave := method(
-    validate
-    _created_at := Date now
-)
-
-// Usage example
-User createTable
-Post createTable
-
-user := User clone init
-user setName("Alice") setEmail("alice@example.com") setAge(30)
-user save
-
-post := Post clone init
-post setTitle("First Post") \
-    setContent("Hello, World!") \
-    setPublished(true) \
-    setUserId(user id)
-post save
-
-// Query examples
-allUsers := User all
-youngUsers := User where("age < 25")
-userPosts := user posts
-
-// Query builder
-query := QueryBuilder clone init(User)
-results := query select("name", "email") \
-                where("age > 21") \
-                order("name") \
-                limit(10) \
-                execute
-
-

- Case Study 3: Game Engine - - # - -

-

A simple 2D game engine demonstrating real-time systems and graphics:

-
// Game Engine Core
-GameEngine := Object clone
-GameEngine init := method(width, height,
-    self width := width
-    self height := height
-    self entities := list()
-    self systems := list()
-    self running := true
-    self fps := 60
-    self frameTime := 1.0 / fps
-    self
-)
-
-// Entity Component System
-Entity := Object clone
-Entity init := method(
-    self id := Random uuid
-    self components := Map clone
-    self active := true
-    self
-)
-
-Entity addComponent := method(name, component,
-    components atPut(name, component)
-    component entity := self
-    self
-)
-
-Entity getComponent := method(name,
-    components at(name)
-)
-
-Entity hasComponent := method(name,
-    components hasKey(name)
-)
-
-// Components
-Component := Object clone
-
-PositionComponent := Component clone
-PositionComponent init := method(x, y,
-    self x := x
-    self y := y
-    self
-)
-
-VelocityComponent := Component clone
-VelocityComponent init := method(dx, dy,
-    self dx := dx
-    self dy := dy
-    self
-)
-
-SpriteComponent := Component clone
-SpriteComponent init := method(image, width, height,
-    self image := image
-    self width := width
-    self height := height
-    self
-)
-
-ColliderComponent := Component clone
-ColliderComponent init := method(width, height,
-    self width := width
-    self height := height
-    self
-)
-
-HealthComponent := Component clone
-HealthComponent init := method(maxHealth,
-    self maxHealth := maxHealth
-    self currentHealth := maxHealth
-    self
-)
-
-// Systems
-System := Object clone
-System init := method(
-    self requiredComponents := list()
-    self
-)
-
-System process := method(entity, deltaTime,
-    // Override in subclasses
-)
-
-System canProcess := method(entity,
-    requiredComponents all(comp,
-        entity hasComponent(comp)
-    )
-)
-
-MovementSystem := System clone
-MovementSystem requiredComponents = list("position", "velocity")
-
-MovementSystem process := method(entity, deltaTime,
-    pos := entity getComponent("position")
-    vel := entity getComponent("velocity")
-    
-    pos x = pos x + vel dx * deltaTime
-    pos y = pos y + vel dy * deltaTime
-)
-
-CollisionSystem := System clone
-CollisionSystem requiredComponents = list("position", "collider")
-
-CollisionSystem init := method(
-    resend
-    self collisions := list()
-    self
-)
-
-CollisionSystem update := method(entities, deltaTime,
-    collisions = list()
-    
-    // Check all pairs
-    entities foreach(i, e1,
-        if(canProcess(e1),
-            entities slice(i + 1) foreach(e2,
-                if(canProcess(e2) and checkCollision(e1, e2),
-                    collisions append(list(e1, e2))
-                    onCollision(e1, e2)
-                )
-            )
-        )
-    )
-)
-
-CollisionSystem checkCollision := method(e1, e2,
-    p1 := e1 getComponent("position")
-    c1 := e1 getComponent("collider")
-    p2 := e2 getComponent("position")
-    c2 := e2 getComponent("collider")
-    
-    // AABB collision
-    p1 x < p2 x + c2 width and
-    p1 x + c1 width > p2 x and
-    p1 y < p2 y + c2 height and
-    p1 y + c1 height > p2 y
-)
-
-CollisionSystem onCollision := method(e1, e2,
-    ("Collision between " .. e1 id .. " and " .. e2 id) println
-)
-
-// Rendering (simulated)
-RenderSystem := System clone
-RenderSystem requiredComponents = list("position", "sprite")
-
-RenderSystem init := method(
-    resend
-    self screen := list()
-    self
-)
-
-RenderSystem render := method(entities,
-    // Clear screen
-    screen = list()
-    
-    entities foreach(entity,
-        if(canProcess(entity),
-            pos := entity getComponent("position")
-            sprite := entity getComponent("sprite")
-            
-            screen append(Map with(
-                "x", pos x,
-                "y", pos y,
-                "image", sprite image
-            ))
-        )
-    )
-    
-    // Draw screen (simulated)
-    drawScreen
-)
-
-RenderSystem drawScreen := method(
-    "Frame:" println
-    screen foreach(item,
-        ("  [" .. item at("image") .. "] at (" .. 
-         item at("x") round .. ", " .. item at("y") round .. ")") println
-    )
-)
-
-// Input handling
-InputManager := Object clone
-InputManager init := method(
-    self keys := Map clone
-    self mouseX := 0
-    self mouseY := 0
-    self
-)
-
-InputManager isKeyPressed := method(key,
-    keys at(key, false)
-)
-
-InputManager setKey := method(key, pressed,
-    keys atPut(key, pressed)
-)
-
-// Game states
-GameState := Object clone
-GameState enter := method()
-GameState exit := method()
-GameState update := method(deltaTime)
-GameState render := method()
-
-MenuState := GameState clone
-MenuState enter := method(
-    "Entering menu" println
-    self selectedOption := 0
-    self options := list("Start Game", "Options", "Quit")
-)
-
-MenuState update := method(deltaTime,
-    // Handle menu input
-    if(InputManager isKeyPressed("up"),
-        selectedOption = (selectedOption - 1) max(0)
-    )
-    if(InputManager isKeyPressed("down"),
-        selectedOption = (selectedOption + 1) min(options size - 1)
-    )
-    if(InputManager isKeyPressed("enter"),
-        handleSelection
-    )
-)
-
-MenuState handleSelection := method(
-    option := options at(selectedOption)
-    if(option == "Start Game",
-        GameEngine setState(PlayState)
-    )
-    if(option == "Quit",
-        GameEngine stop
-    )
-)
-
-PlayState := GameState clone
-PlayState enter := method(
-    "Starting game" println
-    createLevel
-)
-
-PlayState createLevel := method(
-    // Create player
-    player := Entity clone init
-    player addComponent("position", PositionComponent clone init(100, 100))
-    player addComponent("velocity", VelocityComponent clone init(0, 0))
-    player addComponent("sprite", SpriteComponent clone init("player", 32, 32))
-    player addComponent("collider", ColliderComponent clone init(32, 32))
-    player addComponent("health", HealthComponent clone init(100))
-    
-    GameEngine addEntity(player)
-    
-    // Create enemies
-    3 repeat(i,
-        enemy := Entity clone init
-        enemy addComponent("position", 
-            PositionComponent clone init(200 + i * 50, 200))
-        enemy addComponent("velocity", 
-            VelocityComponent clone init(Random value * 20 - 10, Random value * 20 - 10))
-        enemy addComponent("sprite", 
-            SpriteComponent clone init("enemy", 24, 24))
-        enemy addComponent("collider", 
-            ColliderComponent clone init(24, 24))
-        
-        GameEngine addEntity(enemy)
-    )
-)
-
-PlayState update := method(deltaTime,
-    // Handle player input
-    player := GameEngine entities first
-    if(player,
-        vel := player getComponent("velocity")
-        
-        vel dx = 0
-        vel dy = 0
-        
-        if(InputManager isKeyPressed("left"), vel dx = -100)
-        if(InputManager isKeyPressed("right"), vel dx = 100)
-        if(InputManager isKeyPressed("up"), vel dy = -100)
-        if(InputManager isKeyPressed("down"), vel dy = 100)
-    )
-)
-
-// Main game engine methods
-GameEngine addEntity := method(entity,
-    entities append(entity)
-    entity
-)
-
-GameEngine removeEntity := method(entity,
-    entities remove(entity)
-)
-
-GameEngine addSystem := method(system,
-    systems append(system)
-    system
-)
-
-GameEngine setState := method(state,
-    if(hasSlot("currentState") and currentState,
-        currentState exit
-    )
-    currentState := state
-    currentState enter
-)
-
-GameEngine update := method(deltaTime,
-    // Update current state
-    if(currentState,
-        currentState update(deltaTime)
-    )
-    
-    // Update systems
-    systems foreach(system,
-        if(system hasSlot("update"),
-            system update(entities, deltaTime),
-            entities foreach(entity,
-                if(system canProcess(entity),
-                    system process(entity, deltaTime)
-                )
-            )
-        )
-    )
-    
-    // Remove inactive entities
-    entities = entities select(e, e active)
-)
-
-GameEngine render := method(
-    if(currentState,
-        currentState render
-    )
-    
-    renderSystem render(entities)
-)
-
-GameEngine run := method(
-    lastTime := Date now
-    
-    while(running,
-        currentTime := Date now
-        deltaTime := currentTime - lastTime
-        
-        if(deltaTime >= frameTime,
-            update(deltaTime)
-            render
-            lastTime = currentTime
-        )
-        
-        // Small delay to prevent CPU spinning
-        wait(0.001)
-    )
-)
-
-GameEngine stop := method(
-    running = false
-)
-
-// Initialize and run game
-game := GameEngine clone init(800, 600)
-
-// Add systems
-game addSystem(MovementSystem clone)
-game addSystem(CollisionSystem clone init)
-game renderSystem := RenderSystem clone init
-
-// Set initial state
-game setState(MenuState)
-
-// Simulate some gameplay
-"=== Game Engine Demo ===" println
-MenuState handleSelection  // Start game
-
-// Run a few frames
-5 repeat(i,
-    ("Frame " .. i) println
-    game update(game frameTime)
-    game render
-    wait(0.1)
-)
-
-

- Case Study 4: Build System - - # - -

-

A build system similar to Make or Rake:

-
// Build System
-BuildSystem := Object clone
-BuildSystem init := method(
-    self tasks := Map clone
-    self dependencies := Map clone
-    self executed := list()
-    self config := Map clone
-    self
-)
-
-Task := Object clone
-Task init := method(name, deps, action,
-    self name := name
-    self dependencies := if(deps, deps, list())
-    self action := action
-    self outputs := list()
-    self inputs := list()
-    self
-)
-
-Task execute := method(context,
-    ("Executing task: " .. name) println
-    if(action,
-        action call(context)
-    )
-)
-
-Task upToDate := method(
-    if(outputs size == 0 or inputs size == 0,
-        return false
-    )
-    
-    outputTime := outputs map(f, File with(f) lastModified) min
-    inputTime := inputs map(f, File with(f) lastModified) max
-    
-    outputTime > inputTime
-)
-
-// DSL for defining tasks
-BuildSystem task := method(name,
-    t := Task clone init(name, list(), nil)
-    tasks atPut(name, t)
-    
-    self currentTask := t
-    call evalArgAt(0)
-    t
-)
-
-BuildSystem desc := method(description,
-    if(currentTask,
-        currentTask description := description
-    )
-)
-
-BuildSystem depends := method(
-    deps := call message arguments map(arg,
-        call sender doMessage(arg) asString
-    )
-    if(currentTask,
-        currentTask dependencies = deps
-    )
-)
-
-BuildSystem action := method(
-    if(currentTask,
-        currentTask action = call argAt(0)
-    )
-)
-
-BuildSystem file := method(output, inputs,
-    name := output
-    t := Task clone init(name, list(), nil)
-    t outputs = list(output)
-    t inputs = if(inputs type == "List", inputs, list(inputs))
-    
-    tasks atPut(name, t)
-    self currentTask := t
-    
-    call evalArgAt(2)
-    t
-)
-
-// Running tasks
-BuildSystem run := method(taskName,
-    executed = list()
-    executeTask(taskName)
-)
-
-BuildSystem executeTask := method(taskName,
-    if(executed contains(taskName),
-        return
-    )
-    
-    task := tasks at(taskName)
-    if(task isNil,
-        Exception raise("Task not found: " .. taskName)
-    )
-    
-    // Check if up to date
-    if(task upToDate,
-        ("Task " .. taskName .. " is up to date") println
-        return
-    )
-    
-    // Execute dependencies first
-    task dependencies foreach(dep,
-        executeTask(dep)
-    )
-    
-    // Execute the task
-    task execute(self)
-    executed append(taskName)
-)
-
-// Utilities
-BuildSystem sh := method(command,
-    ("$ " .. command) println
-    System system(command)
-)
-
-BuildSystem glob := method(pattern,
-    Directory with(".") files select(f,
-        f name matchesRegex(pattern)
-    ) map(name)
-)
-
-BuildSystem mkdir := method(path,
-    Directory with(path) create
-)
-
-BuildSystem cp := method(src, dest,
-    File with(src) copyTo(dest)
-)
-
-BuildSystem rm := method(path,
-    File with(path) remove
-)
-
-// Configuration
-BuildSystem configure := method(
-    call message arguments foreach(arg,
-        key := arg name
-        value := call sender doMessage(arg arguments at(0))
-        config atPut(key, value)
-    )
-    self
-)
-
-// Example Buildfile
-build := BuildSystem clone init
-
-build configure(
-    compiler: "gcc",
-    flags: "-Wall -O2",
-    srcDir: "src",
-    buildDir: "build"
-)
-
-build task("clean",
-    desc("Remove all build artifacts")
-    action(
-        rm(config at("buildDir"))
-        "Cleaned" println
-    )
-)
-
-build task("init",
-    desc("Initialize build directory")
-    action(
-        mkdir(config at("buildDir"))
-    )
-)
-
-build task("compile",
-    desc("Compile C sources")
-    depends("init")
-    action(
-        sources := glob("src/*.c")
-        sources foreach(src,
-            obj := src replaceSeq(".c", ".o") replaceSeq("src/", "build/")
-            sh(config at("compiler") .. " " .. config at("flags") .. 
-               " -c " .. src .. " -o " .. obj)
-        )
-    )
-)
-
-build task("link",
-    desc("Link object files")
-    depends("compile")
-    action(
-        objects := glob("build/*.o") join(" ")
-        sh(config at("compiler") .. " " .. objects .. " -o build/app")
-    )
-)
-
-build task("test",
-    desc("Run tests")
-    depends("link")
-    action(
-        sh("./build/app --test")
-    )
-)
-
-build task("default",
-    depends("link")
-)
-
-// File tasks for individual files
-build file("build/main.o", list("src/main.c"),
-    action(
-        sh(config at("compiler") .. " " .. config at("flags") .. 
-           " -c src/main.c -o build/main.o")
-    )
-)
-
-// Run build
-build run("default")
-
-

- Lessons Learned - - # - -

-

These case studies demonstrate several key insights about building real applications in Io:

-

- Strengths - - # - -

-
    -
  1. -

    Rapid Prototyping: Io’s minimal syntax and dynamic nature make it excellent for quickly building working prototypes.

    -
  2. -
  3. -

    DSL Creation: The HTTP server’s routing, ORM’s query builder, and build system all show how naturally DSLs emerge in Io.

    -
  4. -
  5. -

    Flexibility: The ability to modify anything at runtime made it easy to add features like middleware, validations, and hooks.

    -
  6. -
  7. -

    Concurrency: The @ operator and coroutines made async request handling in the web server trivial.

    -
  8. -
-

- Challenges - - # - -

-
    -
  1. -

    Performance: For the game engine, Io’s interpreted nature and message passing overhead would limit frame rates in a real game.

    -
  2. -
  3. -

    Type Safety: The ORM would benefit from type checking that Io doesn’t provide, leading to potential runtime errors.

    -
  4. -
  5. -

    Tooling: Lack of IDE support makes maintaining larger codebases challenging.

    -
  6. -
  7. -

    Libraries: Many features had to be built from scratch due to limited ecosystem.

    -
  8. -
-

- Best Practices - - # - -

-
    -
  1. -

    Use Prototypes Effectively: Define clear prototype hierarchies (Model -> User, Component -> PositionComponent).

    -
  2. -
  3. -

    Leverage Message Passing: The game engine’s entity-component system naturally maps to message passing.

    -
  4. -
  5. -

    Build Abstractions: Each case study built higher-level abstractions (Repository, Task, System) on Io’s primitives.

    -
  6. -
  7. -

    Embrace DSLs: Don’t fight the language—use its strengths to create domain-appropriate interfaces.

    -
  8. -
-

- Conclusion - - # - -

-

These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/17-ecosystem-and-libraries/index.html b/website/public/docs/17-ecosystem-and-libraries/index.html deleted file mode 100644 index e1a5d8d..0000000 --- a/website/public/docs/17-ecosystem-and-libraries/index.html +++ /dev/null @@ -1,1717 +0,0 @@ - - - - - - - - - - - - - - - -Ecosystem and Libraries | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Ecosystem and Libraries

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Ecosystem and Libraries

- -
Chapter 17
- -
- - - - - -

While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem.

-

- Core Libraries - - # - -

-

Io comes with several built-in libraries that extend its capabilities:

-

- File I/O and System - - # - -

-
// File operations
-file := File with("data.txt")
-
-// Reading
-if(file exists,
-    contents := file contents
-    lines := file readLines
-    
-    // Read with encoding
-    file setEncoding("UTF-8")
-    text := file contents
-)
-
-// Writing
-file openForWriting
-file write("Hello, World!\n")
-file write("Line 2\n")
-file close
-
-// Appending
-file openForAppending
-file write("Additional line\n")
-file close
-
-// File information
-file size println
-file lastModified println
-file isDirectory println
-
-// Directory operations
-dir := Directory with("./src")
-dir files foreach(file,
-    file name println
-)
-
-dir directories foreach(subdir,
-    subdir path println
-)
-
-// Recursive directory walking
-dir recursiveFilesOfType("io") foreach(ioFile,
-    ioFile path println
-)
-
-// System operations
-System system("ls -la")  // Execute shell command
-System getEnvironmentVariable("HOME") println
-System setEnvironmentVariable("MY_VAR", "value")
-System exit(0)
-
-

- Networking - - # - -

-
// HTTP Client
-url := URL with("https://api.example.com/data")
-url fetch println  // Simple GET request
-
-// With headers
-url setHeader("Authorization", "Bearer token")
-url setHeader("Content-Type", "application/json")
-response := url fetch
-
-// POST request
-url setMethod("POST")
-url setBody("{\"key\": \"value\"}")
-response := url fetch
-
-// Socket programming
-// Server
-server := Socket clone
-server setHost("127.0.0.1")
-server setPort(8080)
-server bind
-server listen
-
-loop(
-    client := server accept
-    @(
-        data := client readUntilSeq("\n")
-        client write("Echo: " .. data)
-        client close
-    )
-)
-
-// Client
-client := Socket clone
-client setHost("127.0.0.1")
-client setPort(8080)
-client connect
-client write("Hello, server!\n")
-response := client readUntilSeq("\n")
-response println
-client close
-
-

- Date and Time - - # - -

-
// Current date/time
-now := Date now
-now println
-
-// Date components
-now year println
-now month println
-now day println
-now hour println
-now minute println
-now second println
-
-// Date arithmetic
-tomorrow := now + Duration days(1)
-nextWeek := now + Duration weeks(1)
-hourAgo := now - Duration hours(1)
-
-// Formatting
-now asString("%Y-%m-%d %H:%M:%S") println
-now asString("%B %d, %Y") println
-
-// Parsing
-date := Date fromString("2024-01-15", "%Y-%m-%d")
-
-// Duration
-duration := Duration clone
-duration setDays(2) setHours(3) setMinutes(30)
-duration asSeconds println
-
-// Timing code
-start := Date now
-// ... code to time ...
-elapsed := Date now - start
-("Elapsed: " .. elapsed) println
-
-

- Regular Expressions - - # - -

-
// Basic matching
-text := "The year 2024 has 365 days"
-text matchesRegex("\\d+") println  // true
-
-// Finding matches
-match := text findRegex("\\d+")
-match start println  // Starting position
-match end println    // Ending position
-match string println // Matched string
-
-// All matches
-matches := text allMatchesOfRegex("\\d+")
-matches foreach(m,
-    m string println  // 2024, 365
-)
-
-// Replacement
-result := text replaceFirstRegex("\\d+", "N")
-result println  // The year N has 365 days
-
-result := text replaceAllRegex("\\d+", "N")
-result println  // The year N has N days
-
-// Capture groups
-email := "user@example.com"
-pattern := "(\\w+)@([\\w.]+)"
-if(match := email matchesOfRegex(pattern),
-    match at(1) println  // user
-    match at(2) println  // example.com
-)
-
-// Compiling regex for reuse
-regex := Regex with("\\b\\w{5}\\b")  // 5-letter words
-regex matches("hello") println  // true
-regex matches("hi") println     // false
-
-

- JSON - - # - -

-
// Parsing JSON
-jsonString := """
-{
-    "name": "Alice",
-    "age": 30,
-    "interests": ["coding", "music"],
-    "address": {
-        "city": "New York",
-        "zip": "10001"
-    }
-}
-"""
-
-data := jsonString parseJson
-data at("name") println  // Alice
-data at("interests") at(0) println  // coding
-data at("address") at("city") println  // New York
-
-// Creating JSON
-person := Map with(
-    "name", "Bob",
-    "age", 25,
-    "active", true,
-    "tags", list("developer", "gamer")
-)
-
-json := person asJson
-json println  // {"name":"Bob","age":25,"active":true,"tags":["developer","gamer"]}
-
-// Pretty printing
-json := person asJson(true)  // Pretty format
-
-

- XML - - # - -

-
// Parsing XML
-xmlString := """
-<root>
-    <person id="1">
-        <name>Alice</name>
-        <age>30</age>
-    </person>
-    <person id="2">
-        <name>Bob</name>
-        <age>25</age>
-    </person>
-</root>
-"""
-
-doc := SGML parseString(xmlString)
-root := doc root
-
-// Navigate XML
-people := root elementsWithName("person")
-people foreach(person,
-    id := person attributeAt("id")
-    name := person elementWithName("name") text
-    age := person elementWithName("age") text
-    (id .. ": " .. name .. " (" .. age .. ")") println
-)
-
-// Build XML
-doc := SGML clone
-root := doc addElement("catalog")
-
-book := root addElement("book")
-book setAttribute("isbn", "123456")
-book addElement("title") setText("Io Programming")
-book addElement("author") setText("Jane Doe")
-book addElement("price") setText("29.99")
-
-doc asString println
-
-

- Addon System - - # - -

-

Io’s addon system allows loading C-based extensions:

-
// Loading addons
-Addon load("Socket")   // Network programming
-Addon load("Random")   // Random number generation
-Addon load("Regex")    // Regular expressions
-Addon load("SQLite")   // Database access
-
-// Check available addons
-Addon availableAddons foreach(name,
-    name println
-)
-
-// Addon information
-addon := Addon named("Socket")
-addon path println
-addon dependencies println
-
-

- Database Libraries - - # - -

-

- SQLite - - # - -

-
// SQLite integration
-db := SQLite clone
-db open("app.db")
-
-// Create table
-db exec("""
-    CREATE TABLE IF NOT EXISTS users (
-        id INTEGER PRIMARY KEY,
-        name TEXT NOT NULL,
-        email TEXT UNIQUE,
-        created_at DATETIME DEFAULT CURRENT_TIMESTAMP
-    )
-""")
-
-// Insert data
-stmt := db prepare("INSERT INTO users (name, email) VALUES (?, ?)")
-stmt bind(1, "Alice")
-stmt bind(2, "alice@example.com")
-stmt step
-stmt reset
-
-// Query data
-results := db exec("SELECT * FROM users WHERE name LIKE 'A%'")
-results foreach(row,
-    ("ID: " .. row at("id") .. ", Name: " .. row at("name")) println
-)
-
-// Prepared statements with results
-stmt := db prepare("SELECT * FROM users WHERE id = ?")
-stmt bind(1, 1)
-
-while(stmt step == SQLite ROW,
-    name := stmt columnText(1)
-    email := stmt columnText(2)
-    (name .. " - " .. email) println
-)
-
-stmt finalize
-db close
-
-// Transactions
-db begin
-try(
-    db exec("INSERT INTO users ...")
-    db exec("UPDATE users ...")
-    db commit
-) catch(Exception, e,
-    db rollback
-    e raise
-)
-
-

- Graphics and GUI - - # - -

-

- OpenGL - - # - -

-
// OpenGL addon (if available)
-Addon load("OpenGL")
-
-// Basic window setup
-window := GLApp clone
-window width := 800
-window height := 600
-window title := "Io OpenGL"
-
-window draw := method(
-    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
-    
-    glBegin(GL_TRIANGLES)
-    glColor3f(1, 0, 0)
-    glVertex2f(-0.5, -0.5)
-    glColor3f(0, 1, 0)
-    glVertex2f(0.5, -0.5)
-    glColor3f(0, 0, 1)
-    glVertex2f(0, 0.5)
-    glEnd
-    
-    swapBuffers
-)
-
-window run
-
-

- Image Processing - - # - -

-
// Image addon
-Addon load("Image")
-
-// Load and manipulate images
-img := Image clone
-img open("photo.jpg")
-
-// Get information
-img width println
-img height println
-img componentCount println  // Color channels
-
-// Basic operations
-img resize(800, 600)
-img crop(100, 100, 400, 300)
-img flip("horizontal")
-img rotate(90)
-
-// Filters
-img blur(5)
-img sharpen
-img adjustBrightness(1.2)
-img adjustContrast(1.5)
-img grayscale
-
-// Save
-img save("modified.png")
-
-// Create new image
-canvas := Image clone
-canvas allocate(500, 500, 3)  // RGB
-canvas fill(Color with(0.5, 0.5, 1.0))  // Light blue
-
-// Draw on image
-canvas drawLine(0, 0, 500, 500, Color red)
-canvas drawCircle(250, 250, 100, Color green)
-canvas drawRectangle(100, 100, 300, 200, Color blue)
-
-canvas save("drawing.png")
-
-

- Cryptography - - # - -

-
// Crypto addon
-Addon load("MD5")
-Addon load("SHA1")
-
-// Hashing
-text := "Hello, World!"
-
-md5 := MD5 clone
-md5 appendSeq(text)
-md5 hexDigest println  // MD5 hash
-
-sha := SHA1 clone
-sha appendSeq(text)
-sha hexDigest println  // SHA1 hash
-
-// File hashing
-file := File with("document.pdf")
-hash := MD5 hashFile(file path)
-hash println
-
-// HMAC (if available)
-key := "secret-key"
-message := "Important message"
-hmac := HMAC sha256(key, message)
-hmac println
-
-

- Third-Party Libraries - - # - -

-

- Package Management - - # - -

-

While Io doesn’t have a centralized package manager like npm or pip, libraries can be managed through:

-
// Simple package loader
-PackageLoader := Object clone
-PackageLoader paths := list(
-    "~/.io/packages",
-    "/usr/local/io/packages",
-    "./packages"
-)
-
-PackageLoader load := method(name,
-    paths foreach(path,
-        packageFile := Path with(path, name, "init.io")
-        if(File with(packageFile) exists,
-            doFile(packageFile)
-            return true
-        )
-    )
-    Exception raise("Package not found: " .. name)
-)
-
-// Usage
-PackageLoader load("web-framework")
-PackageLoader load("test-framework")
-
-

- Creating Libraries - - # - -

-

Structure for an Io library:

-
// mylib/init.io - Entry point
-MyLib := Object clone
-MyLib version := "1.0.0"
-
-// Load components
-doRelativeFile("core.io")
-doRelativeFile("utils.io")
-doRelativeFile("extensions.io")
-
-// Export public API
-MyLib
-
-// mylib/core.io
-MyLib Core := Object clone
-MyLib Core process := method(data,
-    // Core functionality
-)
-
-// mylib/utils.io
-MyLib Utils := Object clone
-MyLib Utils helper := method(
-    // Utility functions
-)
-
-// mylib/extensions.io
-// Extend built-in types
-List customMethod := method(
-    // Extended functionality
-)
-
-

- Testing Frameworks - - # - -

-

Simple testing framework example:

-
// SimpleTest framework
-Test := Object clone
-Test suites := list()
-
-Test describe := method(name, block,
-    suite := TestSuite clone
-    suite name := name
-    suite tests := list()
-    
-    suite it := method(desc, testBlock,
-        tests append(list(desc, testBlock))
-    )
-    
-    block call(suite)
-    suites append(suite)
-)
-
-Test run := method(
-    totalTests := 0
-    passedTests := 0
-    
-    suites foreach(suite,
-        ("\n" .. suite name) println
-        ("=" repeated(suite name size)) println
-        
-        suite tests foreach(test,
-            desc := test at(0)
-            block := test at(1)
-            totalTests = totalTests + 1
-            
-            e := try(
-                block call
-                ("  ✓ " .. desc) println
-                passedTests = passedTests + 1
-            ) catch(Exception, e,
-                ("  ✗ " .. desc) println
-                ("    " .. e message) println
-            )
-        )
-    )
-    
-    ("\n" .. passedTests .. "/" .. totalTests .. " tests passed") println
-)
-
-// Usage
-Test describe("Array operations", suite,
-    suite it("should append elements", 
-        arr := list(1, 2)
-        arr append(3)
-        assert(arr size == 3)
-    )
-    
-    suite it("should remove elements",
-        arr := list(1, 2, 3)
-        arr remove(2)
-        assert(arr contains(2) not)
-    )
-)
-
-Test run
-
-

- Documentation Tools - - # - -

-

- Generating Documentation - - # - -

-
// Simple documentation generator
-DocGen := Object clone
-DocGen init := method(
-    self docs := Map clone
-    self
-)
-
-DocGen document := method(obj, name,
-    info := Map clone
-    info atPut("name", name)
-    info atPut("type", obj type)
-    info atPut("slots", obj slotNames sort)
-    
-    // Extract method signatures
-    methods := Map clone
-    obj slotNames foreach(slotName,
-        slot := obj getSlot(slotName)
-        if(slot type == "Block",
-            methods atPut(slotName, slot argumentNames)
-        )
-    )
-    info atPut("methods", methods)
-    
-    docs atPut(name, info)
-    self
-)
-
-DocGen generateMarkdown := method(
-    md := "# API Documentation\n\n"
-    
-    docs foreach(name, info,
-        md = md .. "## " .. name .. "\n\n"
-        md = md .. "**Type**: " .. info at("type") .. "\n\n"
-        
-        methods := info at("methods")
-        if(methods size > 0,
-            md = md .. "### Methods\n\n"
-            methods foreach(method, args,
-                md = md .. "- `" .. method .. "(" .. args join(", ") .. ")`\n"
-            )
-            md = md .. "\n"
-        )
-    )
-    
-    md
-)
-
-// Usage
-docGen := DocGen clone init
-docGen document(MyClass, "MyClass")
-docGen document(MyUtils, "MyUtils")
-
-File with("API.md") openForWriting write(docGen generateMarkdown) close
-
-

- Development Tools - - # - -

-

- REPL Enhancements - - # - -

-
// Enhanced REPL
-REPL := Object clone
-REPL history := list()
-REPL commands := Map clone
-
-REPL registerCommand := method(name, block,
-    commands atPut(name, block)
-)
-
-REPL run := method(
-    loop(
-        "io> " print
-        input := File standardInput readLine
-        
-        if(input beginsWithSeq(":"),
-            // Handle commands
-            cmd := input afterSeq(":")
-            if(commands hasKey(cmd),
-                commands at(cmd) call,
-                ("Unknown command: " .. cmd) println
-            ),
-            // Evaluate Io code
-            history append(input)
-            e := try(
-                result := doString(input)
-                ("==> " .. result) println
-            ) catch(Exception, e,
-                ("Error: " .. e message) println
-            )
-        )
-    )
-)
-
-// Register commands
-REPL registerCommand("help", block(
-    "Available commands:" println
-    commands keys foreach(cmd,
-        ("  :" .. cmd) println
-    )
-))
-
-REPL registerCommand("history", block(
-    history foreach(i, line,
-        (i .. ": " .. line) println
-    )
-))
-
-REPL registerCommand("clear", block(
-    System system("clear")
-))
-
-REPL registerCommand("quit", block(
-    System exit
-))
-
-// Run enhanced REPL
-REPL run
-
-

- Debugging Tools - - # - -

-
// Simple debugger
-Debugger := Object clone
-Debugger breakpoints := list()
-Debugger stepping := false
-
-Object debug := method(
-    Debugger enter(self, call)
-)
-
-Debugger enter := method(context, callObj,
-    "=== Debugger ===" println
-    ("Context: " .. context type) println
-    ("Location: " .. callObj message) println
-    
-    loop(
-        "> " print
-        cmd := File standardInput readLine split(" ")
-        
-        if(cmd at(0) == "inspect",
-            target := cmd at(1)
-            if(target,
-                obj := context doString(target)
-                obj slotNames foreach(slot,
-                    ("  " .. slot .. ": " .. obj getSlot(slot) type) println
-                )
-            )
-        )
-        
-        if(cmd at(0) == "eval",
-            code := cmd slice(1) join(" ")
-            result := context doString(code)
-            result println
-        )
-        
-        if(cmd at(0) == "continue",
-            break
-        )
-        
-        if(cmd at(0) == "help",
-            "Commands: inspect <obj>, eval <code>, continue, help" println
-        )
-    )
-)
-
-

- Community Resources - - # - -

-

- Finding Libraries - - # - -

-

Common sources for Io libraries:

-
    -
  1. GitHub: Search for “io-language” or “iolanguage” topics
  2. -
  3. Official Repository: https://github.com/IoLanguage/io
  4. -
  5. Community Addons: Various developers maintain addon collections
  6. -
-

- Contributing - - # - -

-

Creating an addon for the community:

-
// addon.io - Addon metadata
-Addon := Object clone
-Addon name := "MyAddon"
-Addon version := "1.0.0"
-Addon author := "Your Name"
-Addon description := "Description of what your addon does"
-Addon license := "MIT"
-Addon dependencies := list("OtherAddon")
-
-Addon install := method(
-    // Installation logic
-    "Installing " .. name .. " v" .. version println
-    
-    // Copy files
-    // Compile C extensions if needed
-    // Register with Io
-)
-
-Addon uninstall := method(
-    // Cleanup logic
-)
-
-// Make addon discoverable
-Addon register
-
-

- Performance Libraries - - # - -

-

- Profiling - - # - -

-
// Simple profiler
-Profiler := Object clone
-Profiler data := Map clone
-
-Object profile := method(name,
-    start := Date now
-    result := call evalArgAt(0)
-    elapsed := Date now - start
-    
-    if(Profiler data hasKey(name) not,
-        Profiler data atPut(name, list(0, 0))
-    )
-    
-    stats := Profiler data at(name)
-    stats atPut(0, stats at(0) + 1)  // Count
-    stats atPut(1, stats at(1) + elapsed)  // Total time
-    
-    result
-)
-
-Profiler report := method(
-    "=== Profile Report ===" println
-    data foreach(name, stats,
-        count := stats at(0)
-        total := stats at(1)
-        avg := total / count
-        
-        (name .. ": " .. count .. " calls, " ..
-         total .. "s total, " .. avg .. "s average") println
-    )
-)
-
-// Usage
-profile("database",
-    // Expensive operation
-    wait(0.1)
-)
-
-Profiler report
-
-

- Future of Io Libraries - - # - -

-

The Io ecosystem continues to evolve with:

-
    -
  1. WebAssembly Support: Potential for running Io in browsers
  2. -
  3. Modern Addons: Integration with contemporary libraries
  4. -
  5. Cloud Services: AWS, Azure, GCP client libraries
  6. -
  7. Machine Learning: Bindings to TensorFlow, PyTorch
  8. -
  9. Improved Tooling: Better IDE support, linters, formatters
  10. -
-

- Conclusion - - # - -

-

While Io’s ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need.

-

The key to working effectively with Io’s ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need.

-
- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/18-conclusion/index.html b/website/public/docs/18-conclusion/index.html deleted file mode 100644 index beefab8..0000000 --- a/website/public/docs/18-conclusion/index.html +++ /dev/null @@ -1,934 +0,0 @@ - - - - - - - - - - - - - - - -Conclusion | The Io Programming Language - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Conclusion

- - -
- - - - -
- - - -
- - - - - - - - - - -
-

Conclusion

- -
Chapter 18
- -
- - - - - -

We’ve reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we’ve explored a language that challenges conventional programming wisdom. This final chapter reflects on what we’ve learned, when to use Io, and what it teaches us about programming itself.

-

- What Makes Io Special - - # - -

-

After eighteen chapters, we can distill Io’s essence to a few key principles:

-

- Radical Simplicity - - # - -

-

Io achieves remarkable expressiveness with minimal concepts:

-
    -
  • Everything is an object
  • -
  • All computation is message passing
  • -
  • Objects clone objects (no classes)
  • -
  • Code is data (messages are objects)
  • -
-

Compare Io’s ~10,000 lines of C to Python’s ~500,000 or Java’s millions. This isn’t just about code size—it’s about conceptual simplicity. You can understand all of Io, not just use it.

-

- Uniformity - - # - -

-

Where other languages have special cases, Io has objects:

-
// Numbers? Objects.
-5 squared := method(self * self)
-
-// Booleans? Objects.
-true celebrate := method("Yes!" println)
-
-// Control structures? Objects receiving messages.
-if := method(condition, trueBlock, falseBlock, ...)
-
-// Operators? Messages.
-Number + := method(n, ...)
-
-// Even nil? An object.
-nil comfort := method("It's okay to be nothing" println)
-
-

This uniformity isn’t just elegant—it’s powerful. When everything follows the same rules, there’s less to remember and more you can do.

-

- Openness - - # - -

-

Most languages protect you from yourself. Io trusts you completely:

-
// Modify fundamental types
-String shout := method(self upper .. "!!!")
-
-// Change how the language works
-Object if := method(...)  // Redefine conditionals
-
-// Inspect everything
-anyObject slotNames  // See all slots
-anyMethod code       // See implementation
-
-

This openness enables profound metaprogramming but requires responsibility.

-

- When to Use Io - - # - -

-

Io excels in specific contexts:

-

- Rapid Prototyping - - # - -

-

When you need to explore ideas quickly:

-
// From idea to working code in minutes
-Api := Object clone
-Api route := method(path, handler, ...)
-Api get("/users", block(...))
-Api start(8080)
-
-

- Domain-Specific Languages - - # - -

-

When you need expressive, domain-appropriate interfaces:

-
recipe "Pasta" serves(4) {
-    boil water in("large pot")
-    add pasta after("water boils")
-    cook for(8) minutes
-    drain
-    serve with("marinara sauce")
-}
-
-

- Learning and Teaching - - # - -

-

When you want to understand programming concepts deeply:

-
    -
  • How objects really work
  • -
  • What message passing means
  • -
  • How languages are implemented
  • -
  • Why certain design choices matter
  • -
-

- Embedded Scripting - - # - -

-

When you need a lightweight, embeddable language:

-
    -
  • Game scripting
  • -
  • Application automation
  • -
  • Configuration languages
  • -
  • Plugin systems
  • -
-

- When Not to Use Io - - # - -

-

Io has limitations to consider:

-

- Performance-Critical Systems - - # - -

-
// Io: Elegant but slower
-numbers map(x, x * x) select(x, x > 100)
-
-// C: Verbose but fast
-for(int i = 0; i < n; i++) {
-    squared[i] = numbers[i] * numbers[i];
-    if(squared[i] > 100) ...
-}
-
-

Message passing has overhead. For number crunching, system programming, or real-time systems, choose C, Rust, or C++.

-

- Large Team Projects - - # - -

-

Io lacks:

-
    -
  • Static type checking
  • -
  • Comprehensive IDE support
  • -
  • Large ecosystem of libraries
  • -
  • Extensive documentation
  • -
  • Big community for support
  • -
-

For enterprise applications with many developers, Java, C#, or TypeScript offer better tooling and guardrails.

-

- Production Web Services - - # - -

-

While you can build web services in Io, you probably shouldn’t for production:

-
    -
  • Limited web frameworks
  • -
  • No battle-tested libraries
  • -
  • Small community for security issues
  • -
  • Few deployment options
  • -
-

Use Python, Ruby, JavaScript, or Go instead.

-

- Lessons for Other Languages - - # - -

-

Even if you never use Io professionally, it teaches valuable lessons:

-

- Question Everything - - # - -

-

Why do we need classes? Io shows prototypes work fine. -Why special syntax for control flow? Io uses methods. -Why distinguish data and code? Io treats both as messages.

-

These aren’t necessarily better—but questioning assumptions makes you a better programmer.

-

- Simplicity Has Power - - # - -

-

Io shows how much you can achieve with few concepts. This influences how you design:

-
    -
  • APIs with consistent interfaces
  • -
  • Systems with uniform principles
  • -
  • Code that does one thing well
  • -
-

- Metaprogramming Isn’t Magic - - # - -

-

In Io, metaprogramming is just programming:

-
// Not magic, just objects
-method := block(x, x * 2)
-method code println       // x *(2)
-method setCode("x + 2")  // Changed!
-
-

This demystifies metaprogramming in any language.

-

- Everything Has Trade-offs - - # - -

-

Io’s choices have consequences:

-
    -
  • Simplicity vs Performance
  • -
  • Flexibility vs Safety
  • -
  • Power vs Complexity
  • -
  • Expressiveness vs Familiarity
  • -
-

Understanding these trade-offs helps you choose the right tool for each job.

-

- Io’s Influence - - # - -

-

Despite its small community, Io has influenced programming:

-

- JavaScript’s Prototype Pattern - - # - -

-
// JavaScript embracing prototypes (pre-ES6)
-var animal = {
-    speak: function() { console.log("..."); }
-};
-
-var dog = Object.create(animal);
-dog.bark = function() { console.log("Woof!"); };
-
-

- Ruby’s Method Missing - - # - -

-
class DynamicObject
-  def method_missing(name, *args)
-    if name.to_s.start_with?("get_")
-      # Handle dynamically
-    end
-  end
-end
-
-

- Minimalist Language Design - - # - -

-

Languages like Lua and Factor share Io’s minimalist philosophy, proving that small can be powerful.

-

- The Future of Io - - # - -

-

Io may never become mainstream, and that’s okay. Its value isn’t in market share but in:

-

- Educational Impact - - # - -

-

Io remains excellent for teaching:

-
    -
  • Prototype-based OOP
  • -
  • Message passing
  • -
  • Language implementation
  • -
  • Metaprogramming concepts
  • -
-

- Research Platform - - # - -

-

Io’s simplicity makes it ideal for experimenting with:

-
    -
  • New concurrency models
  • -
  • Novel object systems
  • -
  • DSL techniques
  • -
  • Language features
  • -
-

- Inspiration - - # - -

-

Future language designers study Io to understand:

-
    -
  • How simple a language can be
  • -
  • Alternative object models
  • -
  • The power of uniformity
  • -
  • Trade-offs in language design
  • -
-

- Personal Reflection - - # - -

-

Learning Io changes how you think about programming. You realize that many “fundamental” concepts are just choices. Classes aren’t necessary. Syntax isn’t sacred. Types aren’t mandatory. These aren’t revelations that everything should be like Io—rather, they free you to think more broadly about problems and solutions.

-

When you return to your daily programming language—be it Python, JavaScript, Java, or something else—you bring new perspectives:

-
    -
  • You see the prototype pattern hiding in JavaScript’s classes
  • -
  • You recognize message passing in Ruby’s method calls
  • -
  • You understand metaprogramming isn’t mysterious
  • -
  • You appreciate both the safety of types and the freedom of their absence
  • -
-

- A Final Example - - # - -

-

Let’s end with a small program that captures Io’s spirit:

-
// The Io Philosophy in Code
-Philosophy := Object clone
-
-Philosophy simplicity := "Everything is an object"
-Philosophy uniformity := "Everything is a message"
-Philosophy openness := "Everything is modifiable"
-
-Philosophy embrace := method(concept,
-    ("Embracing " .. concept .. "...") println
-    self setSlot(concept, true)
-    self
-)
-
-Philosophy question := method(assumption,
-    ("Why must " .. assumption .. "?") println
-    ("Perhaps there's another way...") println
-)
-
-Philosophy learn := method(
-    lessons := list(
-        "Simplicity enables understanding",
-        "Uniformity reduces cognitive load",
-        "Openness enables exploration",
-        "Constraints inspire creativity",
-        "Every choice has consequences"
-    )
-    
-    lessons foreach(lesson,
-        ("  • " .. lesson) println
-        wait(0.5)  // Pause to reflect
-    )
-)
-
-// The journey
-journey := Philosophy clone
-
-journey embrace("simplicity") \
-        embrace("uniformity") \
-        embrace("openness")
-
-journey question("languages be complex")
-journey question("we have classes")
-journey question("syntax be fixed")
-
-"Lessons learned:" println
-journey learn
-
-"Thank you for exploring Io." println
-"May it inspire your programming journey." println
-
-

- Parting Thoughts - - # - -

-

Io isn’t trying to replace your favorite language. It’s not competing for market dominance. It’s not the solution to all programming problems.

-

What Io offers is perspective—a radically different view of what programming can be. It shows that our familiar concepts aren’t immutable laws but design choices. It demonstrates that simplicity and power aren’t opposites. It proves that small languages can have big ideas.

-

Whether you use Io for a weekend experiment, a personal project, or just intellectual exploration, it will change how you think about programming. You’ll question more, assume less, and see possibilities where you once saw constraints.

-

That’s the real gift of Io: not the language itself, but the mindset it instills. A mindset that questions, explores, and imagines. A mindset that sees programming not as applying fixed rules but as creatively solving problems with the tools at hand—or creating new tools when needed.

-

- Thank You - - # - -

-

Thank you for joining me on this exploration of Io. I hope you’ve found it as enlightening to read as I found it to write. The language may be small, but the ideas are vast.

-

Now go forth and experiment. Clone some objects. Send some messages. Build something unusual. Question something fundamental. And remember: in Io, as in programming, as in life—everything is possible when you embrace simplicity, seek uniformity, and remain open to new ideas.

-

Happy coding, and may your messages always find their slots.

-
-

End of Book

-

- Appendices - - # - -

-

For continued learning:

-
    -
  • Appendix A: Io Language Reference
  • -
  • Appendix B: Standard Library Documentation
  • -
  • Appendix C: Building Io from Source
  • -
  • Appendix D: Creating C Addons
  • -
  • Appendix E: Io Resources and Community
  • -
-

Visit https://iolanguage.org for more information.

-

“Simplicity is the ultimate sophistication.” — Leonardo da Vinci

- - -
- -
-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/index.html b/website/public/docs/index.html deleted file mode 100644 index bad819a..0000000 --- a/website/public/docs/index.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - - - - - - - - -Chapters | The Io Programming Language - - - - - - - - - - - - - - - -
-
- - -
-
- -
- - - - -
-
- -
- - -

Chapters

- - -
- - - - -
- - - -

- The Io Programming Language - - # - -

-

Navigate through the complete book below.

-
- - - -
- -
- - - - - -
- - - - - - - - - - - - - - - - - -
- - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - diff --git a/website/public/docs/index.xml b/website/public/docs/index.xml deleted file mode 100644 index 71e36c5..0000000 --- a/website/public/docs/index.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - Chapters on The Io Programming Language - https://example.org/docs/ - Recent content in Chapters on The Io Programming Language - Hugo - en-us - - - Why Io? - https://example.org/docs/00-preface/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/00-preface/ - <h1 id="preface-why-io"> Preface: Why Io? <a class="anchor" href="#preface-why-io">#</a> </h1> <p>In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer.</p> <h2 id="the-value-of-alternative-paradigms"> The Value of Alternative Paradigms <a class="anchor" href="#the-value-of-alternative-paradigms">#</a> </h2> <p>Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you&rsquo;re writing Java, C#, Python, or Ruby, you&rsquo;re likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought.</p> - - - Introduction - https://example.org/docs/01-introduction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/01-introduction/ - <h1 id="chapter-1-introduction---the-philosophy-of-io"> Chapter 1: Introduction - The Philosophy of Io <a class="anchor" href="#chapter-1-introduction---the-philosophy-of-io">#</a> </h1> <blockquote class='book-hint '> <p>&ldquo;The limits of my language mean the limits of my world.&rdquo;<br> — Ludwig Wittgenstein</p> </blockquote><p>Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity.</p> - - - Getting Started - https://example.org/docs/02-getting-started/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/02-getting-started/ - <h1 id="chapter-2-getting-started-with-io"> Chapter 2: Getting Started with Io <a class="anchor" href="#chapter-2-getting-started-with-io">#</a> </h1> <p>The best way to understand Io is to use it. In this chapter, we&rsquo;ll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you&rsquo;ll have a feel for Io&rsquo;s syntax and flow.</p> <h2 id="installing-io"> Installing Io <a class="anchor" href="#installing-io">#</a> </h2> <h3 id="macos"> macOS <a class="anchor" href="#macos">#</a> </h3> <p>If you&rsquo;re on macOS with Homebrew, installation is simple:</p> <pre><code class="language-bash">brew install io </code></pre> <h3 id="linux"> Linux <a class="anchor" href="#linux">#</a> </h3> <p>On most Linux distributions, you&rsquo;ll need to build from source:</p> - - - Everything is an Object - https://example.org/docs/03-everything-is-an-object/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/03-everything-is-an-object/ - <h1 id="chapter-3-everything-is-an-object"> Chapter 3: Everything is an Object <a class="anchor" href="#chapter-3-everything-is-an-object">#</a> </h1> <p>&ldquo;Everything is an object&rdquo; is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like <code>int</code> and <code>boolean</code> break the rule). But what does it really mean? And how thoroughly does Io embrace this principle?</p> <p>In this chapter, we&rsquo;ll explore how Io takes &ldquo;everything is an object&rdquo; to its logical extreme, and what this means for how you write and think about programs.</p> - - - Prototypes, Not Classes - https://example.org/docs/04-prototypes-not-classes/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/04-prototypes-not-classes/ - <h1 id="chapter-4-prototypes-not-classes"> Chapter 4: Prototypes, Not Classes <a class="anchor" href="#chapter-4-prototypes-not-classes">#</a> </h1> <p>Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There&rsquo;s a fundamental distinction between the template (class) and the things created from it (instances).</p> <p>Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs.</p> - - - Messages and Slots - https://example.org/docs/05-messages-and-slots/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/05-messages-and-slots/ - <h1 id="chapter-5-messages-and-slots"> Chapter 5: Messages and Slots <a class="anchor" href="#chapter-5-messages-and-slots">#</a> </h1> <p>At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth.</p> <h2 id="the-anatomy-of-a-message"> The Anatomy of a Message <a class="anchor" href="#the-anatomy-of-a-message">#</a> </h2> <p>When you write this in Io:</p> <pre><code class="language-io">person setName(&quot;Alice&quot;) </code></pre> <p>What actually happens? Let&rsquo;s break it down:</p> - - - Cloning and Inheritance - https://example.org/docs/06-cloning-and-inheritance/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/06-cloning-and-inheritance/ - <h1 id="chapter-6-cloning-and-inheritance"> Chapter 6: Cloning and Inheritance <a class="anchor" href="#chapter-6-cloning-and-inheritance">#</a> </h1> <p>In class-based languages, inheritance is a relationship between classes. In Io&rsquo;s prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively.</p> <h2 id="the-mechanics-of-cloning"> The Mechanics of Cloning <a class="anchor" href="#the-mechanics-of-cloning">#</a> </h2> <p>When you clone an object in Io, you don&rsquo;t copy all its data. Instead, you create a new, empty object with a reference to the original:</p> - - - Control Flow - https://example.org/docs/07-control-flow/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/07-control-flow/ - <h1 id="chapter-7-control-flow"> Chapter 7: Control Flow <a class="anchor" href="#chapter-7-control-flow">#</a> </h1> <p>In most programming languages, control flow structures like <code>if</code>, <code>while</code>, and <code>for</code> are built-in syntax with special rules. In Io, they&rsquo;re just methods that receive messages. This chapter explores how Io&rsquo;s message-passing philosophy extends to control flow, and how you can create your own control structures.</p> <h2 id="everything-is-a-message"> Everything Is a Message <a class="anchor" href="#everything-is-a-message">#</a> </h2> <p>Let&rsquo;s start with a simple comparison. In C or Java:</p> <pre><code class="language-c">if (x &gt; 5) { printf(&quot;Big\n&quot;); } else { printf(&quot;Small\n&quot;); } </code></pre> <p>This is special syntax that the compiler understands. But in Io:</p> - - - Collections - https://example.org/docs/08-collections/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/08-collections/ - <h1 id="chapter-8-collections"> Chapter 8: Collections <a class="anchor" href="#chapter-8-collections">#</a> </h1> <p>Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types.</p> <h2 id="lists-ordered-collections"> Lists: Ordered Collections <a class="anchor" href="#lists-ordered-collections">#</a> </h2> <p>Lists in Io are dynamic arrays that can hold any type of object:</p> <pre><code class="language-io">// Creating lists empty := list() numbers := list(1, 2, 3, 4, 5) mixed := list(&quot;hello&quot;, 42, true, Object clone) // Lists are objects numbers type println // List // Basic operations numbers size println // 5 numbers isEmpty println // false numbers first println // 1 numbers last println // 5 numbers at(2) println // 3 (zero-indexed) </code></pre> <h3 id="list-manipulation"> List Manipulation <a class="anchor" href="#list-manipulation">#</a> </h3> <pre><code class="language-io">fruits := list(&quot;apple&quot;, &quot;banana&quot;) // Adding elements fruits append(&quot;orange&quot;) fruits prepend(&quot;grape&quot;) fruits println // list(grape, apple, banana, orange) // Insert at position fruits atInsert(2, &quot;mango&quot;) fruits println // list(grape, apple, mango, banana, orange) // Removing elements fruits remove(&quot;mango&quot;) fruits removeAt(0) fruits pop // Removes and returns last element fruits println // list(apple, banana) // Multiple operations fruits appendSeq(list(&quot;kiwi&quot;, &quot;peach&quot;)) fruits println // list(apple, banana, kiwi, peach) </code></pre> <h3 id="list-iteration"> List Iteration <a class="anchor" href="#list-iteration">#</a> </h3> <pre><code class="language-io">numbers := list(1, 2, 3, 4, 5) // Basic iteration numbers foreach(n, n println ) // With index numbers foreach(i, n, (i .. &quot;: &quot; .. n) println ) // Reverse iteration numbers reverseForEach(n, n println ) </code></pre> <h3 id="functional-operations"> Functional Operations <a class="anchor" href="#functional-operations">#</a> </h3> <pre><code class="language-io">numbers := list(1, 2, 3, 4, 5) // Map: transform each element squared := numbers map(x, x * x) squared println // list(1, 4, 9, 16, 25) // Select: filter elements evens := numbers select(x, x % 2 == 0) evens println // list(2, 4) // Reject: inverse of select odds := numbers reject(x, x % 2 == 0) odds println // list(1, 3, 5) // Detect: find first match firstEven := numbers detect(x, x % 2 == 0) firstEven println // 2 // Reduce: aggregate sum := numbers reduce(+) sum println // 15 // Custom reduce product := numbers reduce(a, b, a * b) product println // 120 // Any/all predicates numbers contains(3) println // true numbers containsAll(list(2, 4)) println // true numbers containsAny(list(10, 3)) println // true </code></pre> <h3 id="list-slicing-and-manipulation"> List Slicing and Manipulation <a class="anchor" href="#list-slicing-and-manipulation">#</a> </h3> <pre><code class="language-io">letters := list(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;) // Slicing letters slice(1, 3) println // list(b, c, d) letters slice(2) println // list(c, d, e) // Copying copy := letters copy copy atPut(0, &quot;z&quot;) letters println // list(a, b, c, d, e) - unchanged copy println // list(z, b, c, d, e) // Sorting numbers := list(3, 1, 4, 1, 5, 9) numbers sort println // list(1, 1, 3, 4, 5, 9) // Custom sort people := list( Object clone do(name := &quot;Alice&quot;; age := 30), Object clone do(name := &quot;Bob&quot;; age := 25), Object clone do(name := &quot;Charlie&quot;; age := 35) ) people sortBy(block(p, p age)) foreach(p, (p name .. &quot;: &quot; .. p age) println ) // Bob: 25 // Alice: 30 // Charlie: 35 </code></pre> <h2 id="maps-key-value-stores"> Maps: Key-Value Stores <a class="anchor" href="#maps-key-value-stores">#</a> </h2> <p>Maps (also called dictionaries or hash tables) store key-value pairs:</p> - - - Blocks and Closures - https://example.org/docs/09-blocks-and-closures/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/09-blocks-and-closures/ - <h1 id="chapter-9-blocks-and-closures"> Chapter 9: Blocks and Closures <a class="anchor" href="#chapter-9-blocks-and-closures">#</a> </h1> <p>Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io.</p> <h2 id="understanding-blocks-and-methods"> Understanding Blocks and Methods <a class="anchor" href="#understanding-blocks-and-methods">#</a> </h2> <p>In Io, <code>block</code> and <code>method</code> are similar but have a crucial difference:</p> <pre><code class="language-io">// Block - creates its own scope blk := block(x, x * 2) blk call(5) println // 10 // Method - shares scope with receiver obj := Object clone obj value := 10 obj meth := method(x, x * value) // Can access 'value' obj blk := block(x, x * value) // Error when called - no 'value' in block scope obj meth(5) println // 50 // obj blk call(5) // Exception: value not found </code></pre> <p>The key difference:</p> - - - Exceptions - https://example.org/docs/10-exceptions/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/10-exceptions/ - <h1 id="chapter-10-exceptions"> Chapter 10: Exceptions <a class="anchor" href="#chapter-10-exceptions">#</a> </h1> <p>Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types.</p> <h2 id="basic-exception-handling"> Basic Exception Handling <a class="anchor" href="#basic-exception-handling">#</a> </h2> <p>Io uses <code>try</code>, <code>catch</code>, and <code>raise</code> for exception handling:</p> <pre><code class="language-io">// Basic try-catch try( 10 / 0 // Division by zero ) catch(Exception, e, (&quot;Error: &quot; .. e message) println ) // Error: divide by zero // Multiple catch blocks try( someRiskyOperation() ) catch(TypeError, e, &quot;Type error occurred&quot; println ) catch(IOException, e, &quot;IO error occurred&quot; println ) catch(Exception, e, &quot;Some other error occurred&quot; println ) </code></pre> <p>Compare with other languages:</p> - - - Metaprogramming - https://example.org/docs/11-metaprogramming/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/11-metaprogramming/ - <h1 id="chapter-11-metaprogramming"> Chapter 11: Metaprogramming <a class="anchor" href="#chapter-11-metaprogramming">#</a> </h1> <p>Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io&rsquo;s powerful metaprogramming capabilities.</p> <h2 id="messages-as-data"> Messages as Data <a class="anchor" href="#messages-as-data">#</a> </h2> <p>In Io, code is data. Messages are objects you can create, inspect, and manipulate:</p> <pre><code class="language-io">// Create a message from code msg := message(2 + 3 * 4) // Inspect its structure msg println // 2 +(3 *(4)) msg name println // + msg arguments println // list(Message_0x...) msg arguments at(0) println // 3 *(4) // Evaluate it result := msg doInContext(Lobby) result println // 14 // Modify it msg setName(&quot;*&quot;) msg doInContext(Lobby) println // 6 (now it's 2 * 3 * 4) </code></pre> <p>Compare this to Lisp&rsquo;s code-as-data philosophy:</p> - - - Concurrency - https://example.org/docs/12-concurrency/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/12-concurrency/ - <h1 id="chapter-12-concurrency"> Chapter 12: Concurrency <a class="anchor" href="#chapter-12-concurrency">#</a> </h1> <p>Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io.</p> <h2 id="coroutines-cooperative-multitasking"> Coroutines: Cooperative Multitasking <a class="anchor" href="#coroutines-cooperative-multitasking">#</a> </h2> <p>Coroutines are the foundation of Io&rsquo;s concurrency model. They&rsquo;re lightweight threads that yield control cooperatively:</p> <pre><code class="language-io">// Create a coroutine coro := coroutine( 5 repeat(i, (&quot;Coroutine: &quot; .. i) println yield // Give control back ) ) // Run it 5 repeat( &quot;Main&quot; println coro resume // Resume the coroutine ) // Output interleaves Main and Coroutine messages </code></pre> <p>Compare with threads in other languages:</p> - - - Domain-Specific Languages - https://example.org/docs/13-domain-specific-languages/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/13-domain-specific-languages/ - <h1 id="chapter-13-domain-specific-languages"> Chapter 13: Domain-Specific Languages <a class="anchor" href="#chapter-13-domain-specific-languages">#</a> </h1> <p>Io&rsquo;s minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains.</p> <h2 id="why-io-excels-at-dsls"> Why Io Excels at DSLs <a class="anchor" href="#why-io-excels-at-dsls">#</a> </h2> <p>Several features make Io particularly suitable for DSLs:</p> <ol> <li><strong>Minimal syntax</strong> - Less language machinery to work around</li> <li><strong>Optional parentheses</strong> - Clean, readable DSL code</li> <li><strong>Message chains</strong> - Natural expression of domain concepts</li> <li><strong>Runtime flexibility</strong> - Modify behavior on the fly</li> <li><strong>Homoiconicity</strong> - Code as manipulable data</li> </ol> <p>Compare a hypothetical DSL in Io vs Ruby:</p> - - - C Integration - https://example.org/docs/14-c-integration/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/14-c-integration/ - <h1 id="chapter-14-c-integration"> Chapter 14: C Integration <a class="anchor" href="#chapter-14-c-integration">#</a> </h1> <p>Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C.</p> <h2 id="understanding-ios-c-architecture"> Understanding Io&rsquo;s C Architecture <a class="anchor" href="#understanding-ios-c-architecture">#</a> </h2> <p>Io&rsquo;s core is a small C library (around 10,000 lines) that implements:</p> <ul> <li>The object model (IoObject)</li> <li>The message passing system</li> <li>Basic types (Number, String, List, etc.)</li> <li>The VM and garbage collector</li> </ul> <p>Everything else is built on top of this foundation, either in C addons or pure Io.</p> - - - Real-World Patterns - https://example.org/docs/15-real-world-patterns/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/15-real-world-patterns/ - <h1 id="chapter-15-real-world-patterns"> Chapter 15: Real-World Patterns <a class="anchor" href="#chapter-15-real-world-patterns">#</a> </h1> <p>After exploring Io&rsquo;s features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We&rsquo;ll see how Io&rsquo;s unique features enable elegant solutions to common programming challenges.</p> <h2 id="model-view-controller-mvc"> Model-View-Controller (MVC) <a class="anchor" href="#model-view-controller-mvc">#</a> </h2> <p>Implementing MVC in Io leverages prototypes and message passing:</p> <pre><code class="language-io">// Model Model := Object clone Model init := method( self observers := list() self data := Map clone self ) Model set := method(key, value, oldValue := data at(key) if(oldValue != value, data atPut(key, value) notifyObservers(key, oldValue, value) ) self ) Model get := method(key, data at(key) ) Model observe := method(observer, observers append(observer) self ) Model notifyObservers := method(key, oldValue, newValue, observers foreach(observer, if(observer hasSlot(&quot;modelChanged&quot;), observer modelChanged(self, key, oldValue, newValue) ) ) ) // View View := Object clone View init := method(model, self model := model model observe(self) self elements := Map clone self ) View modelChanged := method(model, key, oldValue, newValue, render ) View render := method( // Override in subclasses ) // Controller Controller := Object clone Controller init := method(model, view, self model := model self view := view self ) Controller handleInput := method(input, // Process input and update model ) // Example: Todo MVC TodoModel := Model clone TodoModel init := method( resend self set(&quot;todos&quot;, list()) self ) TodoModel addTodo := method(text, todos := get(&quot;todos&quot;) copy todos append(Map with(&quot;text&quot;, text, &quot;done&quot;, false)) set(&quot;todos&quot;, todos) ) TodoModel toggleTodo := method(index, todos := get(&quot;todos&quot;) copy todo := todos at(index) todo atPut(&quot;done&quot;, todo at(&quot;done&quot;) not) set(&quot;todos&quot;, todos) ) TodoView := View clone TodoView render := method( &quot;=== Todo List ===&quot; println model get(&quot;todos&quot;) foreach(i, todo, status := if(todo at(&quot;done&quot;), &quot;[✓]&quot;, &quot;[ ]&quot;) (i .. &quot;. &quot; .. status .. &quot; &quot; .. todo at(&quot;text&quot;)) println ) &quot;================&quot; println ) TodoController := Controller clone TodoController processCommand := method(cmd, parts := cmd split(&quot; &quot;) action := parts at(0) if(action == &quot;add&quot;, text := parts slice(1) join(&quot; &quot;) model addTodo(text) ) if(action == &quot;toggle&quot;, index := parts at(1) asNumber model toggleTodo(index) ) if(action == &quot;quit&quot;, System exit ) ) // Usage app := Object clone app model := TodoModel clone init app view := TodoView clone init(app model) app controller := TodoController clone init(app model, app view) app view render // Simulate commands app controller processCommand(&quot;add Buy groceries&quot;) app controller processCommand(&quot;add Write documentation&quot;) app controller processCommand(&quot;toggle 0&quot;) </code></pre> <h2 id="repository-pattern"> Repository Pattern <a class="anchor" href="#repository-pattern">#</a> </h2> <p>Abstracting data access:</p> - - - Case Studies - https://example.org/docs/16-case-studies/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/16-case-studies/ - <h1 id="chapter-16-case-studies"> Chapter 16: Case Studies <a class="anchor" href="#chapter-16-case-studies">#</a> </h1> <p>This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io&rsquo;s features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language.</p> <h2 id="case-study-1-web-server"> Case Study 1: Web Server <a class="anchor" href="#case-study-1-web-server">#</a> </h2> <p>Building a simple but functional HTTP server demonstrates Io&rsquo;s networking, concurrency, and string handling:</p> <pre><code class="language-io">// HTTP Server Implementation HttpServer := Object clone HttpServer init := method(port, self port := port self routes := Map clone self middlewares := list() self ) HttpRequest := Object clone HttpRequest parse := method(rawData, lines := rawData split(&quot;\r\n&quot;) if(lines size == 0, return nil) // Parse request line requestLine := lines at(0) split(&quot; &quot;) self method := requestLine at(0) self path := requestLine at(1) self version := requestLine at(2) // Parse headers self headers := Map clone self body := &quot;&quot; bodyStart := false lines slice(1) foreach(line, if(bodyStart, body = body .. line, if(line size == 0, bodyStart = true, parts := line split(&quot;: &quot;) if(parts size == 2, headers atPut(parts at(0), parts at(1)) ) ) ) ) // Parse query parameters self params := Map clone if(path containsSeq(&quot;?&quot;), parts := path split(&quot;?&quot;) self path = parts at(0) queryString := parts at(1) queryString split(&quot;&amp;&quot;) foreach(param, kv := param split(&quot;=&quot;) if(kv size == 2, params atPut(kv at(0), kv at(1) urlDecode) ) ) ) self ) HttpResponse := Object clone HttpResponse init := method( self status := 200 self headers := Map clone self body := &quot;&quot; headers atPut(&quot;Content-Type&quot;, &quot;text/html&quot;) headers atPut(&quot;Server&quot;, &quot;Io-Server/1.0&quot;) self ) HttpResponse setStatus := method(code, status = code self ) HttpResponse setHeader := method(key, value, headers atPut(key, value) self ) HttpResponse write := method(content, body = body .. content self ) HttpResponse json := method(data, setHeader(&quot;Content-Type&quot;, &quot;application/json&quot;) write(data asJson) self ) HttpResponse build := method( statusText := Map with( 200, &quot;OK&quot;, 404, &quot;Not Found&quot;, 500, &quot;Internal Server Error&quot; ) at(status, &quot;Unknown&quot;) result := &quot;HTTP/1.1 &quot; .. status .. &quot; &quot; .. statusText .. &quot;\r\n&quot; headers atPut(&quot;Content-Length&quot;, body size asString) headers foreach(key, value, result = result .. key .. &quot;: &quot; .. value .. &quot;\r\n&quot; ) result .. &quot;\r\n&quot; .. body ) // Middleware support HttpServer use := method(middleware, middlewares append(middleware) self ) // Routing HttpServer route := method(method, path, handler, key := method .. &quot;:&quot; .. path routes atPut(key, handler) self ) HttpServer get := method(path, handler, route(&quot;GET&quot;, path, handler) ) HttpServer post := method(path, handler, route(&quot;POST&quot;, path, handler) ) // Request handling HttpServer handleConnection := method(socket, rawData := socket readUntilSeq(&quot;\r\n\r\n&quot;) request := HttpRequest parse(rawData) if(request isNil, socket close return ) response := HttpResponse clone init // Run middlewares middlewares foreach(middleware, middleware call(request, response) ) // Find route key := request method .. &quot;:&quot; .. request path handler := routes at(key) if(handler, e := try( handler call(request, response) ) catch(Exception, e, response setStatus(500) write(&quot;Internal Server Error: &quot; .. e message) ) , // Try pattern matching for dynamic routes handled := false routes foreach(routeKey, routeHandler, parts := routeKey split(&quot;:&quot;) routeMethod := parts at(0) routePath := parts at(1) if(routeMethod == request method and matchPath(routePath, request path), routeHandler call(request, response) handled = true break ) ) if(handled not, response setStatus(404) write(&quot;Not Found&quot;) ) ) socket write(response build) socket close ) HttpServer matchPath := method(pattern, path, // Simple pattern matching (e.g., /users/:id) if(pattern containsSeq(&quot;:&quot;), patternParts := pattern split(&quot;/&quot;) pathParts := path split(&quot;/&quot;) if(patternParts size != pathParts size, return false) patternParts foreach(i, part, if(part beginsWithSeq(&quot;:&quot;) not, if(part != pathParts at(i), return false) ) ) true , pattern == path ) ) HttpServer start := method( server := Socket clone server setHost(&quot;127.0.0.1&quot;) server setPort(port) server bind server listen (&quot;Server listening on port &quot; .. port) println loop( client := server accept @handleConnection(client) // Handle async ) ) // Example application app := HttpServer clone init(8080) // Middleware for logging app use(block(request, response, (&quot;[&quot; .. Date now .. &quot;] &quot; .. request method .. &quot; &quot; .. request path) println )) // Static content app get(&quot;/&quot;, block(request, response, response write(&quot;&lt;h1&gt;Welcome to Io Web Server&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;A simple server built with Io&lt;/p&gt;&quot;) )) // JSON API app get(&quot;/api/info&quot;, block(request, response, info := Map with( &quot;server&quot;, &quot;Io-Server&quot;, &quot;version&quot;, &quot;1.0&quot;, &quot;time&quot;, Date now asString ) response json(info) )) // Dynamic routes app get(&quot;/users/:id&quot;, block(request, response, // Extract ID from path id := request path split(&quot;/&quot;) at(2) response write(&quot;&lt;h1&gt;User Profile&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;User ID: &quot; .. id .. &quot;&lt;/p&gt;&quot;) )) // Form handling app post(&quot;/submit&quot;, block(request, response, // Parse form data from body response write(&quot;&lt;h1&gt;Form Submitted&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;Data: &quot; .. request body .. &quot;&lt;/p&gt;&quot;) )) // Start server app start </code></pre> <h2 id="case-study-2-database-orm"> Case Study 2: Database ORM <a class="anchor" href="#case-study-2-database-orm">#</a> </h2> <p>A simple object-relational mapper showcasing metaprogramming and DSL capabilities:</p> - - - Ecosystem and Libraries - https://example.org/docs/17-ecosystem-and-libraries/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/17-ecosystem-and-libraries/ - <h1 id="chapter-17-ecosystem-and-libraries"> Chapter 17: Ecosystem and Libraries <a class="anchor" href="#chapter-17-ecosystem-and-libraries">#</a> </h1> <p>While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem.</p> <h2 id="core-libraries"> Core Libraries <a class="anchor" href="#core-libraries">#</a> </h2> <p>Io comes with several built-in libraries that extend its capabilities:</p> <h3 id="file-io-and-system"> File I/O and System <a class="anchor" href="#file-io-and-system">#</a> </h3> <pre><code class="language-io">// File operations file := File with(&quot;data.txt&quot;) // Reading if(file exists, contents := file contents lines := file readLines // Read with encoding file setEncoding(&quot;UTF-8&quot;) text := file contents ) // Writing file openForWriting file write(&quot;Hello, World!\n&quot;) file write(&quot;Line 2\n&quot;) file close // Appending file openForAppending file write(&quot;Additional line\n&quot;) file close // File information file size println file lastModified println file isDirectory println // Directory operations dir := Directory with(&quot;./src&quot;) dir files foreach(file, file name println ) dir directories foreach(subdir, subdir path println ) // Recursive directory walking dir recursiveFilesOfType(&quot;io&quot;) foreach(ioFile, ioFile path println ) // System operations System system(&quot;ls -la&quot;) // Execute shell command System getEnvironmentVariable(&quot;HOME&quot;) println System setEnvironmentVariable(&quot;MY_VAR&quot;, &quot;value&quot;) System exit(0) </code></pre> <h3 id="networking"> Networking <a class="anchor" href="#networking">#</a> </h3> <pre><code class="language-io">// HTTP Client url := URL with(&quot;https://api.example.com/data&quot;) url fetch println // Simple GET request // With headers url setHeader(&quot;Authorization&quot;, &quot;Bearer token&quot;) url setHeader(&quot;Content-Type&quot;, &quot;application/json&quot;) response := url fetch // POST request url setMethod(&quot;POST&quot;) url setBody(&quot;{\&quot;key\&quot;: \&quot;value\&quot;}&quot;) response := url fetch // Socket programming // Server server := Socket clone server setHost(&quot;127.0.0.1&quot;) server setPort(8080) server bind server listen loop( client := server accept @( data := client readUntilSeq(&quot;\n&quot;) client write(&quot;Echo: &quot; .. data) client close ) ) // Client client := Socket clone client setHost(&quot;127.0.0.1&quot;) client setPort(8080) client connect client write(&quot;Hello, server!\n&quot;) response := client readUntilSeq(&quot;\n&quot;) response println client close </code></pre> <h3 id="date-and-time"> Date and Time <a class="anchor" href="#date-and-time">#</a> </h3> <pre><code class="language-io">// Current date/time now := Date now now println // Date components now year println now month println now day println now hour println now minute println now second println // Date arithmetic tomorrow := now + Duration days(1) nextWeek := now + Duration weeks(1) hourAgo := now - Duration hours(1) // Formatting now asString(&quot;%Y-%m-%d %H:%M:%S&quot;) println now asString(&quot;%B %d, %Y&quot;) println // Parsing date := Date fromString(&quot;2024-01-15&quot;, &quot;%Y-%m-%d&quot;) // Duration duration := Duration clone duration setDays(2) setHours(3) setMinutes(30) duration asSeconds println // Timing code start := Date now // ... code to time ... elapsed := Date now - start (&quot;Elapsed: &quot; .. elapsed) println </code></pre> <h3 id="regular-expressions"> Regular Expressions <a class="anchor" href="#regular-expressions">#</a> </h3> <pre><code class="language-io">// Basic matching text := &quot;The year 2024 has 365 days&quot; text matchesRegex(&quot;\\d+&quot;) println // true // Finding matches match := text findRegex(&quot;\\d+&quot;) match start println // Starting position match end println // Ending position match string println // Matched string // All matches matches := text allMatchesOfRegex(&quot;\\d+&quot;) matches foreach(m, m string println // 2024, 365 ) // Replacement result := text replaceFirstRegex(&quot;\\d+&quot;, &quot;N&quot;) result println // The year N has 365 days result := text replaceAllRegex(&quot;\\d+&quot;, &quot;N&quot;) result println // The year N has N days // Capture groups email := &quot;user@example.com&quot; pattern := &quot;(\\w+)@([\\w.]+)&quot; if(match := email matchesOfRegex(pattern), match at(1) println // user match at(2) println // example.com ) // Compiling regex for reuse regex := Regex with(&quot;\\b\\w{5}\\b&quot;) // 5-letter words regex matches(&quot;hello&quot;) println // true regex matches(&quot;hi&quot;) println // false </code></pre> <h3 id="json"> JSON <a class="anchor" href="#json">#</a> </h3> <pre><code class="language-io">// Parsing JSON jsonString := &quot;&quot;&quot; { &quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 30, &quot;interests&quot;: [&quot;coding&quot;, &quot;music&quot;], &quot;address&quot;: { &quot;city&quot;: &quot;New York&quot;, &quot;zip&quot;: &quot;10001&quot; } } &quot;&quot;&quot; data := jsonString parseJson data at(&quot;name&quot;) println // Alice data at(&quot;interests&quot;) at(0) println // coding data at(&quot;address&quot;) at(&quot;city&quot;) println // New York // Creating JSON person := Map with( &quot;name&quot;, &quot;Bob&quot;, &quot;age&quot;, 25, &quot;active&quot;, true, &quot;tags&quot;, list(&quot;developer&quot;, &quot;gamer&quot;) ) json := person asJson json println // {&quot;name&quot;:&quot;Bob&quot;,&quot;age&quot;:25,&quot;active&quot;:true,&quot;tags&quot;:[&quot;developer&quot;,&quot;gamer&quot;]} // Pretty printing json := person asJson(true) // Pretty format </code></pre> <h3 id="xml"> XML <a class="anchor" href="#xml">#</a> </h3> <pre><code class="language-io">// Parsing XML xmlString := &quot;&quot;&quot; &lt;root&gt; &lt;person id=&quot;1&quot;&gt; &lt;name&gt;Alice&lt;/name&gt; &lt;age&gt;30&lt;/age&gt; &lt;/person&gt; &lt;person id=&quot;2&quot;&gt; &lt;name&gt;Bob&lt;/name&gt; &lt;age&gt;25&lt;/age&gt; &lt;/person&gt; &lt;/root&gt; &quot;&quot;&quot; doc := SGML parseString(xmlString) root := doc root // Navigate XML people := root elementsWithName(&quot;person&quot;) people foreach(person, id := person attributeAt(&quot;id&quot;) name := person elementWithName(&quot;name&quot;) text age := person elementWithName(&quot;age&quot;) text (id .. &quot;: &quot; .. name .. &quot; (&quot; .. age .. &quot;)&quot;) println ) // Build XML doc := SGML clone root := doc addElement(&quot;catalog&quot;) book := root addElement(&quot;book&quot;) book setAttribute(&quot;isbn&quot;, &quot;123456&quot;) book addElement(&quot;title&quot;) setText(&quot;Io Programming&quot;) book addElement(&quot;author&quot;) setText(&quot;Jane Doe&quot;) book addElement(&quot;price&quot;) setText(&quot;29.99&quot;) doc asString println </code></pre> <h2 id="addon-system"> Addon System <a class="anchor" href="#addon-system">#</a> </h2> <p>Io&rsquo;s addon system allows loading C-based extensions:</p> - - - Conclusion - https://example.org/docs/18-conclusion/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/18-conclusion/ - <h1 id="chapter-18-conclusion---the-io-way"> Chapter 18: Conclusion - The Io Way <a class="anchor" href="#chapter-18-conclusion---the-io-way">#</a> </h1> <p>We&rsquo;ve reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we&rsquo;ve explored a language that challenges conventional programming wisdom. This final chapter reflects on what we&rsquo;ve learned, when to use Io, and what it teaches us about programming itself.</p> <h2 id="what-makes-io-special"> What Makes Io Special <a class="anchor" href="#what-makes-io-special">#</a> </h2> <p>After eighteen chapters, we can distill Io&rsquo;s essence to a few key principles:</p> - - - diff --git a/website/public/en.search-data.min.59ef9ccb13662077f47dd91e556e81b00922b0bce70308fc7a1024b6f60e1e8c.json b/website/public/en.search-data.min.59ef9ccb13662077f47dd91e556e81b00922b0bce70308fc7a1024b6f60e1e8c.json deleted file mode 100644 index ea337d0..0000000 --- a/website/public/en.search-data.min.59ef9ccb13662077f47dd91e556e81b00922b0bce70308fc7a1024b6f60e1e8c.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":0,"href":"/docs/","title":"Chapters","section":"The Io Programming Language","content":" The Io Programming Language # Navigate through the complete book below.\n"},{"id":1,"href":"/docs/00-preface/","title":"Why Io?","section":"Chapters","content":" Preface: Why Io? # In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer.\nThe Value of Alternative Paradigms # Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you\u0026rsquo;re writing Java, C#, Python, or Ruby, you\u0026rsquo;re likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought.\nIo offers something different: a pure prototype-based object system where these familiar distinctions dissolve. There are no classes, only objects. There is no separation between data and behavior. Everything—including control structures and operators—is accomplished through message passing between objects.\nConsider this simple comparison. In Python, you might write:\nclass Dog: def __init__(self, name): self.name = name def bark(self): return f\u0026quot;{self.name} says woof!\u0026quot; fido = Dog(\u0026quot;Fido\u0026quot;) print(fido.bark()) In Io, the same concept looks like this:\nDog := Object clone Dog bark := method(name .. \u0026quot; says woof!\u0026quot;) fido := Dog clone fido name := \u0026quot;Fido\u0026quot; fido bark println At first glance, this might seem like a minor syntactic difference. But look closer: there\u0026rsquo;s no class definition, no constructor, no special initialization syntax. Dog is just an object that we\u0026rsquo;ve cloned from the base Object. fido is just a clone of Dog. The simplicity is profound.\nWhat You\u0026rsquo;ll Gain # 1. A Deeper Understanding of JavaScript # If you\u0026rsquo;ve ever been puzzled by JavaScript\u0026rsquo;s prototype chain, or wondered why typeof null === \u0026quot;object\u0026quot;, studying Io will illuminate these mysteries. JavaScript\u0026rsquo;s object model is essentially prototype-based (though complicated by the later addition of class syntax), and Io presents these same concepts in a much purer form.\n2. Freedom from Artificial Boundaries # In most languages, there\u0026rsquo;s a rigid distinction between what the language provides and what you can build. You can\u0026rsquo;t change how if statements work. You can\u0026rsquo;t modify how method calls are resolved. You can\u0026rsquo;t alter fundamental objects.\nIn Io, these boundaries don\u0026rsquo;t exist. The if statement is just a message sent to an object. Method resolution is customizable. Even basic types like Number and String can be modified at runtime. This isn\u0026rsquo;t just academically interesting—it enables patterns of expression impossible in more rigid languages.\n3. Appreciation for Message Passing # While many languages claim to support \u0026ldquo;message passing,\u0026rdquo; few take it as seriously as Io. When everything is truly a message—including operators, control flow, and assignment—you begin to see the elegant simplicity possible in language design. This perspective will change how you think about method calls and object interaction in any language.\n4. Metaprogramming Without Magic # Languages like Ruby pride themselves on metaprogramming capabilities, but often these features feel like special cases—magic methods, decorators, metaclasses. In Io, metaprogramming isn\u0026rsquo;t a special feature; it\u0026rsquo;s the natural consequence of a simple, consistent object model. When you can inspect and modify any object at runtime, including the objects that define the language itself, metaprogramming becomes straightforward rather than mystical.\nWho Should Read This Book # This book assumes you\u0026rsquo;re already a programmer. You should be comfortable with:\nBasic programming concepts (variables, functions, loops, conditions) Object-oriented programming in at least one language Using a command line and text editor The idea that different languages encourage different ways of thinking You don\u0026rsquo;t need to be an expert. In fact, if you\u0026rsquo;ve only worked in one or two mainstream languages, you might find Io\u0026rsquo;s different perspective especially valuable. Sometimes, those deeply entrenched in certain paradigms have the most difficulty seeing alternatives.\nWhat Makes Io Special # Steve Dekorte created Io in 2002 with several goals:\nSimplicity - A minimal syntax with maximum expressiveness Flexibility - Everything modifiable at runtime Uniformity - One consistent model for everything Power - Advanced features like coroutines and actors built-in The result is a language that fits in roughly 10,000 lines of C code, yet provides capabilities that mainstream languages achieve only through complex implementations or external libraries.\nA Language for Learning # I won\u0026rsquo;t pretend that Io is likely to become your primary development language. Its community is small, its libraries limited, and its performance, while respectable, isn\u0026rsquo;t competitive with systems languages or JIT-compiled platforms.\nBut Io excels as a language for learning. Its simple, consistent design makes it easy to understand completely. You can hold the entire language in your head. There are no special cases to remember, no historical baggage to work around. When you understand Io\u0026rsquo;s seven basic concepts, you understand the entire language.\nHow to Approach This Book # As you read, I encourage you to:\nRun every example. Io\u0026rsquo;s REPL starts instantly and makes experimentation effortless.\nModify the examples. What happens if you change this? What if you clone from a different object? What if you override this method?\nCompare with languages you know. When you see an Io pattern, think about how you\u0026rsquo;d accomplish the same thing in Python, JavaScript, or Java. What\u0026rsquo;s easier? What\u0026rsquo;s harder? What\u0026rsquo;s impossible?\nEmbrace the discomfort. Some Io concepts will feel alien at first. That\u0026rsquo;s good—it means you\u0026rsquo;re learning something genuinely new.\nA Personal Note # I\u0026rsquo;ve been programming for [X] years and have worked in dozens of languages. Most taught me new syntax or libraries. Io taught me new ways to think. It challenged assumptions I didn\u0026rsquo;t know I had. It showed me that many \u0026ldquo;fundamental\u0026rdquo; concepts in programming are actually just design choices, and different choices lead to different possibilities.\nWhether you spend a weekend or a month with Io, I believe you\u0026rsquo;ll emerge a better programmer. Not because you\u0026rsquo;ll use Io in production (though you might), but because you\u0026rsquo;ll have a broader perspective on what programming languages can be.\nLet\u0026rsquo;s begin.\n"},{"id":2,"href":"/examples/","title":"Code Examples","section":"The Io Programming Language","content":" Code Examples # All code examples from the book are available for download and experimentation. Each example is a standalone .io file that you can run directly with the Io interpreter.\nRunning Examples # To run any example, use the Io interpreter:\nio hello.io Examples by Chapter # Part I: Foundations # Chapter 2: Getting Started hello.io - Your first Io program todo-list.io - A simple todo list application Part II: Core Concepts # Chapter 4: Prototypes, Not Classes prototypes.io - Working with prototypes Part III: Language Features # Chapter 9: Blocks and Closures closures.io - Understanding closures in Io Part IV: Advanced Topics # Chapter 11: Metaprogramming\nmetaprogramming.io - Runtime code manipulation Chapter 12: Concurrency\nconcurrency.io - Actors and coroutines Chapter 13: Domain-Specific Languages\nhtml-dsl.io - Building an HTML DSL Download All Examples # You can browse all examples or clone the repository to get all examples at once:\ngit clone https://github.com/yourusername/io-book-examples.git Contributing # Found an issue with an example? Want to contribute your own? Please submit a pull request or open an issue on GitHub.\n"},{"id":3,"href":"/docs/01-introduction/","title":"Introduction","section":"Chapters","content":" Chapter 1: Introduction - The Philosophy of Io # \u0026ldquo;The limits of my language mean the limits of my world.\u0026rdquo;\n— Ludwig Wittgenstein\nEvery programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity.\nIo believes in radical simplicity through uniform message passing.\nThe Birth of Io # Steve Dekorte created Io in 2002, during an interesting period in programming language history. Java had conquered the enterprise. Python and Ruby were gaining traction as \u0026ldquo;scripting\u0026rdquo; languages. JavaScript was still dismissed as a toy for web browsers. The mainstream programming world had largely settled on class-based object-orientation as the \u0026ldquo;right\u0026rdquo; way to organize programs.\nBut Dekorte was inspired by older, more radical ideas:\nSmalltalk (1972): Everything is an object, computation happens through message passing Self (1986): Objects without classes, prototype-based inheritance Lisp (1958): Code as data, minimal syntax, powerful macros Lua (1993): Simplicity, embeddability, tables as the universal data structure NewtonScript (1993): Prototype-based inheritance in a practical system Here\u0026rsquo;s how Dekorte himself described his motivation:\n\u0026ldquo;I wanted a language that was small, simple, and consistent. Something you could understand completely. Most languages accumulate features over time, becoming more complex. I wanted to go the opposite direction—to see how much you could accomplish with how little.\u0026rdquo;\nThe Seven Pillars of Io # Io rests on seven fundamental concepts. Master these, and you\u0026rsquo;ve mastered the language:\n1. Everything is an Object # In Java or C++, primitives like integers and booleans aren\u0026rsquo;t objects—they\u0026rsquo;re special cases with different rules. In Io, everything is an object:\n3 type println // Number \u0026quot;hello\u0026quot; type println // Sequence true type println // true method() type println // Block Even true and false are objects. Even methods are objects. This uniformity eliminates countless special cases.\n2. Objects are Collections of Slots # An object in Io is essentially a collection of named slots. Each slot can hold any value—data, methods, other objects:\nperson := Object clone person name := \u0026quot;Alice\u0026quot; // data slot person age := 30 // data slot person greet := method(\u0026quot;Hello!\u0026quot;) // method slot person friend := Object clone // object slot Compare this to JavaScript, which has a similar model but complicated by functions, prototypes, constructors, and (now) classes. Io keeps it simple: objects have slots, period.\n3. Computation is Message Passing # This is perhaps Io\u0026rsquo;s most radical idea. In most languages, computation involves various mechanisms:\nFunction calls: sqrt(16) Method invocations: list.append(5) Operators: x + y Control structures: if (x \u0026gt; 0) { ... } Assignment: x = 5 In Io, all of these are just messages sent to objects:\nsqrt(16) // send message \u0026quot;sqrt\u0026quot; with argument 16 to current object list append(5) // send message \u0026quot;append\u0026quot; with argument 5 to list x + y // send message \u0026quot;+\u0026quot; with argument y to x if(x \u0026gt; 0, ...) // send message \u0026quot;if\u0026quot; with arguments to current object x = 5 // send message \u0026quot;setSlot\u0026quot; to current object This uniformity has profound implications we\u0026rsquo;ll explore throughout this book.\n4. Objects Inherit from Prototypes # Rather than defining classes as templates for objects, Io uses prototypes—objects that serve as templates for other objects:\nAnimal := Object clone Animal move := method(\u0026quot;Moving...\u0026quot; println) Dog := Animal clone Dog bark := method(\u0026quot;Woof!\u0026quot; println) fido := Dog clone fido move // \u0026quot;Moving...\u0026quot; (inherited from Animal) fido bark // \u0026quot;Woof!\u0026quot; (inherited from Dog) There\u0026rsquo;s no distinction between \u0026ldquo;class\u0026rdquo; and \u0026ldquo;instance\u0026rdquo;—just objects cloning other objects.\n5. Differential Inheritance # When you clone an object in Io, the new object doesn\u0026rsquo;t copy all the slots from its prototype. Instead, it maintains a reference to its prototype and only stores its differences:\nproto := Object clone proto x := 10 proto y := 20 child := proto clone child y = 30 // Only stores the difference child x println // 10 (from proto) child y println // 30 (from child) This is memory efficient and enables powerful runtime modifications.\n6. Everything is Modifiable at Runtime # In Io, nothing is sacred. You can modify any object at any time, including built-in types:\nNumber double := method(self * 2) 5 double println // 10 // Even more radical - redefine addition! Number + := method(n, self * n) 3 + 4 println // 12 (now multiplication!) This flexibility enables patterns impossible in more restrictive languages.\n7. Homoiconicity Through Messages # Like Lisp, Io code is represented as data structures that can be manipulated by the program itself. But where Lisp uses lists, Io uses messages:\ncode := message(1 + 2) code println // 1 +(2) code name println // + code arguments println // list(2) This enables powerful metaprogramming without special syntax.\nComparing Philosophies # To understand Io\u0026rsquo;s philosophy, let\u0026rsquo;s contrast it with mainstream languages:\nJava: Protection Through Types # public class BankAccount { private double balance; // Protected from direct access public void deposit(double amount) { if (amount \u0026gt; 0) { balance += amount; } } } Java believes in protection—private fields, type checking, compile-time verification. The compiler prevents mistakes.\nPython: Practicality and Conventions # class BankAccount: def __init__(self): self._balance = 0 # Convention: _ means \u0026quot;private\u0026quot; def deposit(self, amount): if amount \u0026gt; 0: self._balance += amount Python believes in \u0026ldquo;we\u0026rsquo;re all consenting adults.\u0026rdquo; Protection through convention, not enforcement.\nIo: Radical Flexibility # BankAccount := Object clone BankAccount balance := 0 BankAccount deposit := method(amount, if(amount \u0026gt; 0, balance = balance + amount) ) Io believes in complete openness. Any object can be modified by any code at any time. Power with responsibility.\nThe Cost of Simplicity # Io\u0026rsquo;s radical simplicity comes with trade-offs:\nPerformance: Without static typing or compile-time optimization, Io can\u0026rsquo;t match the speed of C++ or even JIT-compiled languages like Java. Message passing has overhead.\nTool Support: IDEs can\u0026rsquo;t provide the same level of assistance without static types and fixed class definitions. Refactoring tools are limited.\nError Detection: Many errors that would be caught at compile-time in other languages only surface at runtime in Io.\nLearning Curve: Paradoxically, Io\u0026rsquo;s simplicity can make it harder to learn. With fewer built-in concepts, you have to build more from primitives.\nThe Power of Simplicity # But simplicity also brings power:\nUnderstandability: You can understand the entire language. No edge cases, no historical baggage, no features that interact in surprising ways.\nFlexibility: Patterns that require language extensions or complex frameworks in other languages are trivial in Io.\nExpressiveness: With everything built from the same primitives, you can create abstractions that feel native to the language.\nExploration: Io is a playground for ideas that would be difficult to explore in more complex languages.\nA Living Language # Despite its small community, Io continues to evolve and inspire. Its ideas have influenced:\nJavaScript frameworks that embrace prototype-based patterns Ruby libraries that use method_missing for DSLs Newer languages like Factor and Ioke More importantly, Io continues to teach programmers that our familiar concepts—classes, types, compilation—are choices, not requirements.\nWhat\u0026rsquo;s Next # In the following chapters, we\u0026rsquo;ll explore Io systematically:\nFirst, we\u0026rsquo;ll get Io running and write our first programs Then, we\u0026rsquo;ll dive deep into the object model We\u0026rsquo;ll explore message passing and method resolution We\u0026rsquo;ll see how control structures emerge from simple primitives We\u0026rsquo;ll build increasingly sophisticated abstractions Finally, we\u0026rsquo;ll tackle advanced topics like concurrency and metaprogramming Along the way, we\u0026rsquo;ll constantly compare Io with languages you know, helping you see familiar concepts in a new light.\nReady to challenge everything you know about objects? Let\u0026rsquo;s begin.\n"},{"id":4,"href":"/docs/02-getting-started/","title":"Getting Started","section":"Chapters","content":" Chapter 2: Getting Started with Io # The best way to understand Io is to use it. In this chapter, we\u0026rsquo;ll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you\u0026rsquo;ll have a feel for Io\u0026rsquo;s syntax and flow.\nInstalling Io # macOS # If you\u0026rsquo;re on macOS with Homebrew, installation is simple:\nbrew install io Linux # On most Linux distributions, you\u0026rsquo;ll need to build from source:\ngit clone https://github.com/IoLanguage/io.git cd io mkdir build cd build cmake .. make sudo make install Windows # Windows users should use WSL (Windows Subsystem for Linux) and follow the Linux instructions, or use Docker:\ndocker run -it --rm stevedekorte/io Verifying Installation # Once installed, verify Io is working:\n$ io --version Io Programming Language, v. 20170906 $ io Io\u0026gt; \u0026quot;Hello, World!\u0026quot; println Hello, World! ==\u0026gt; Hello, World! Io\u0026gt; ^C The REPL: Your Io Playground # Io\u0026rsquo;s REPL is where you\u0026rsquo;ll spend most of your learning time. Unlike compiled languages where you write, compile, and run, Io lets you experiment immediately.\nStart the REPL by typing io:\n$ io Io\u0026gt; The prompt Io\u0026gt; indicates Io is ready for input. Let\u0026rsquo;s explore:\nIo\u0026gt; 2 + 2 ==\u0026gt; 4 Io\u0026gt; \u0026quot;Hello\u0026quot; .. \u0026quot; \u0026quot; .. \u0026quot;World\u0026quot; ==\u0026gt; Hello World Io\u0026gt; 10 \u0026gt; 5 ==\u0026gt; true Notice the ==\u0026gt; prefix? That shows the return value of your expression. Everything in Io returns a value.\nREPL Tips # Multi-line input: The REPL detects incomplete expressions: Io\u0026gt; if(true, ... \u0026quot;yes\u0026quot; println, ... \u0026quot;no\u0026quot; println ... ) yes ==\u0026gt; yes Previous result: Use _ to reference the last result: Io\u0026gt; 100 * 2 ==\u0026gt; 200 Io\u0026gt; _ + 50 ==\u0026gt; 250 Getting help: The REPL has built-in documentation: Io\u0026gt; Lobby slotNames ==\u0026gt; list(Protos, _, exit, forward, set_) Io\u0026gt; Number slotNames sort ==\u0026gt; list(%, *, +, -, /, \u0026lt;, \u0026lt;=, ==, \u0026gt;, \u0026gt;=, abs, acos, asin, atan, between, ceil, cos, ...) Your First Io Program # Let\u0026rsquo;s write the traditional \u0026ldquo;Hello, World!\u0026rdquo; program. Create a file called hello.io:\n\u0026quot;Hello, World!\u0026quot; println Run it:\n$ io hello.io Hello, World! That\u0026rsquo;s it. No class definitions, no main function, no boilerplate. Compare with Java:\npublic class Hello { public static void main(String[] args) { System.out.println(\u0026quot;Hello, World!\u0026quot;); } } Or even Python:\nif __name__ == \u0026quot;__main__\u0026quot;: print(\u0026quot;Hello, World!\u0026quot;) Io just runs your code.\nUnderstanding Basic Syntax # Io\u0026rsquo;s syntax is minimal. Let\u0026rsquo;s explore the basics:\nMessages and Receivers # In Io, everything is about sending messages to objects:\n\u0026quot;hello\u0026quot; size // Send 'size' message to \u0026quot;hello\u0026quot; ==\u0026gt; 5 \u0026quot;hello\u0026quot; at(0) // Send 'at' message with argument 0 ==\u0026gt; h \u0026quot;hello\u0026quot; upper // Send 'upper' message ==\u0026gt; HELLO Compare with method calls in Python:\n\u0026quot;hello\u0026quot;.upper() # Python \u0026quot;hello\u0026quot; upper // Io - parentheses optional for no arguments Arguments # Messages can have arguments, passed in parentheses:\n\u0026quot;hello\u0026quot; at(1) // One argument ==\u0026gt; e \u0026quot;hello\u0026quot; slice(1, 3) // Two arguments ==\u0026gt; el List append(1, 2, 3) // Multiple arguments ==\u0026gt; list(1, 2, 3) Operators are Messages # This is crucial: operators in Io are just messages with special precedence:\n2 + 3 // Send message \u0026quot;+\u0026quot; to 2 with argument 3 2 +(3) // Exactly the same thing 2 send(\u0026quot;+\u0026quot;, 3) // Still the same thing! This uniformity means you can redefine operators:\nNumber + := method(n, self - n) // Redefine + to subtract! 5 + 3 ==\u0026gt; 2 (Don\u0026rsquo;t actually do this in real code!)\nVariables and Assignment # In Io, variables are just slots on objects. By default, you\u0026rsquo;re working with the Lobby object:\nx := 10 // Create slot 'x' on Lobby with value 10 x println // Print it ==\u0026gt; 10 x = 20 // Update existing slot x println ==\u0026gt; 20 y = 30 // Error! Slot doesn't exist // Exception: Slot y not found Note the distinction:\n:= creates a new slot = updates an existing slot This prevents accidental variable creation from typos:\ncounter := 0 countr = 1 // Error - probably a typo! Compare with JavaScript\u0026rsquo;s similar issue:\nlet counter = 0; countr = 1; // Creates global variable - probably a bug! Control Flow # Io\u0026rsquo;s control structures are methods, not special syntax:\nIf Statements # if(10 \u0026gt; 5, \u0026quot;Yes\u0026quot; println, \u0026quot;No\u0026quot; println ) // Prints: Yes Compare with Python:\nif 10 \u0026gt; 5: print(\u0026quot;Yes\u0026quot;) else: print(\u0026quot;No\u0026quot;) Since if is a method, you can even look at its implementation:\nIo\u0026gt; if ==\u0026gt; method(...) Loops # // While loop i := 0 while(i \u0026lt; 5, i println i = i + 1 ) // For loop for(i, 0, 4, i println ) // Times loop 5 times(i, i println ) Creating Objects # Let\u0026rsquo;s create our first custom object:\nPerson := Object clone Person name := \u0026quot;Unknown\u0026quot; Person greet := method( (\u0026quot;Hello, I'm \u0026quot; .. name) println ) alice := Person clone alice name = \u0026quot;Alice\u0026quot; alice greet // Prints: Hello, I'm Alice Compare with Python:\nclass Person: def __init__(self): self.name = \u0026quot;Unknown\u0026quot; def greet(self): print(f\u0026quot;Hello, I'm {self.name}\u0026quot;) alice = Person() alice.name = \u0026quot;Alice\u0026quot; alice.greet() The key difference: Io has no class definition. Person is just an object we\u0026rsquo;re using as a prototype.\nMethods # Methods in Io are created with the method function:\nCalculator := Object clone Calculator add := method(a, b, a + b) Calculator multiply := method(a, b, a * b) calc := Calculator clone calc add(5, 3) println // 8 calc multiply(4, 7) println // 28 Methods have access to self (the receiver):\nCounter := Object clone Counter count := 0 Counter increment := method( count = count + 1 self // Return self for chaining ) c := Counter clone c increment increment increment c count println // 3 Lists and Iteration # Lists are fundamental in Io:\nnumbers := list(1, 2, 3, 4, 5) // Iteration numbers foreach(n, n println ) // Map squared := numbers map(n, n * n) squared println // list(1, 4, 9, 16, 25) // Select (filter) evens := numbers select(n, n % 2 == 0) evens println // list(2, 4) // Reduce sum := numbers reduce(+) sum println // 15 Compare with Python:\nnumbers = [1, 2, 3, 4, 5] # Iteration for n in numbers: print(n) # Map squared = [n * n for n in numbers] # Filter evens = [n for n in numbers if n % 2 == 0] # Reduce from functools import reduce sum = reduce(lambda a, b: a + b, numbers) Working with Files # Reading and writing files is straightforward:\n// Write to file file := File with(\u0026quot;test.txt\u0026quot;) file openForWriting file write(\u0026quot;Hello, file!\u0026quot;) file close // Read from file file := File with(\u0026quot;test.txt\u0026quot;) file openForReading contents := file contents contents println file close // Or more concisely File with(\u0026quot;test.txt\u0026quot;) contents println A More Complete Example # Let\u0026rsquo;s build something more substantial—a simple to-do list:\n// todo.io - A simple to-do list manager TodoList := Object clone TodoList items := list() TodoList add := method(task, items append(task) self ) TodoList show := method( if(items size == 0, \u0026quot;No tasks!\u0026quot; println, items foreach(i, task, (\u0026quot; \u0026quot; .. (i + 1) .. \u0026quot;. \u0026quot; .. task) println ) ) self ) TodoList complete := method(index, if(index \u0026gt; 0 and index \u0026lt;= items size, task := items at(index - 1) items removeAt(index - 1) (\u0026quot;Completed: \u0026quot; .. task) println, \u0026quot;Invalid task number\u0026quot; println ) self ) TodoList save := method(filename, File with(filename) openForWriting write(items asJson) close \u0026quot;Saved!\u0026quot; println self ) TodoList load := method(filename, if(File with(filename) exists, items = Yajl parseJson(File with(filename) contents) \u0026quot;Loaded!\u0026quot; println, \u0026quot;File not found\u0026quot; println ) self ) // Usage todo := TodoList clone todo add(\u0026quot;Learn Io\u0026quot;) add(\u0026quot;Build something cool\u0026quot;) add(\u0026quot;Share with friends\u0026quot;) todo show // 1. Learn Io // 2. Build something cool // 3. Share with friends todo complete(1) // Completed: Learn Io todo show // 1. Build something cool // 2. Share with friends Key Takeaways # Having written your first Io programs, you\u0026rsquo;ve probably noticed:\nMinimal syntax: No keywords for defining classes, functions, or variables. Everything uses the same message-passing syntax.\nImmediate feedback: The REPL makes experimentation effortless.\nUniform model: Whether you\u0026rsquo;re doing arithmetic, defining methods, or creating objects, it\u0026rsquo;s all message passing.\nFlexibility: You can modify anything, even built-in types and operators.\nSimplicity: Programs are often shorter than their equivalents in other languages.\nExercises # Try these exercises to solidify your understanding:\nNumber methods: Add a squared method to Number that returns the square of a number. Test it with 5 squared.\nString reversal: Create a method on Sequence (Io\u0026rsquo;s string type) called reverse that returns the reversed string.\nBank account: Create a BankAccount object with balance, deposit, and withdraw methods. Include protection against negative balances.\nFizzBuzz: Implement FizzBuzz in Io (print numbers 1-100, but \u0026ldquo;Fizz\u0026rdquo; for multiples of 3, \u0026ldquo;Buzz\u0026rdquo; for multiples of 5, \u0026ldquo;FizzBuzz\u0026rdquo; for both).\nMethod chaining: Create a StringBuilder object that allows chaining: StringBuilder clone add(\u0026quot;Hello\u0026quot;) add(\u0026quot; \u0026quot;) add(\u0026quot;World\u0026quot;) toString\nWhat\u0026rsquo;s Different? # If you\u0026rsquo;re coming from mainstream languages, here\u0026rsquo;s what might feel strange:\nNo compile step: Your code runs immediately No type declarations: Everything is dynamically typed No class keyword: Objects are created by cloning Operators aren\u0026rsquo;t special: They\u0026rsquo;re just messages Everything returns a value: Even assignments and control structures These differences aren\u0026rsquo;t arbitrary—they all flow from Io\u0026rsquo;s core principle of uniform message passing.\nMoving Forward # You now have enough Io knowledge to explore the deeper concepts. You can:\nCreate and manipulate objects Define methods Use control structures Work with collections Read and write files In the next chapter, we\u0026rsquo;ll dive deep into Io\u0026rsquo;s object model and understand what \u0026ldquo;everything is an object\u0026rdquo; really means.\n"},{"id":5,"href":"/docs/03-everything-is-an-object/","title":"Everything is an Object","section":"Chapters","content":" Chapter 3: Everything is an Object # \u0026ldquo;Everything is an object\u0026rdquo; is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like int and boolean break the rule). But what does it really mean? And how thoroughly does Io embrace this principle?\nIn this chapter, we\u0026rsquo;ll explore how Io takes \u0026ldquo;everything is an object\u0026rdquo; to its logical extreme, and what this means for how you write and think about programs.\nWhat Is an Object? # Before we dive into Io\u0026rsquo;s object model, let\u0026rsquo;s establish what we mean by \u0026ldquo;object.\u0026rdquo; In most object-oriented languages, an object is:\nA bundle of state (data/attributes/fields) A set of behaviors (methods/functions) An identity (distinct from other objects) In Java, you might have:\nclass Dog { String name; // state int age; // state void bark() { // behavior System.out.println(\u0026quot;Woof!\u0026quot;); } } Dog fido = new Dog(); // identity (fido is distinct from other Dogs) But Java immediately breaks its own rules:\nint x = 5; // Not an object! x.toString(); // Error: int cannot be dereferenced Integer y = 5; // Now it's an object (boxed) y.toString(); // \u0026quot;5\u0026quot; Let\u0026rsquo;s see how Io handles this.\nNumbers are Objects # In Io, numbers aren\u0026rsquo;t primitives—they\u0026rsquo;re full objects:\n5 type println // Number 5 slotNames println // list(%, *, +, -, /, \u0026lt;, ...) // Numbers have methods 5 abs println // 5 -5 abs println // 5 5 sqrt println // 2.236... 5 sin println // -0.958... // You can add methods to numbers! Number double := method(self * 2) 5 double println // 10 // You can even inspect a number's prototype chain 5 proto println // Number_0x... 5 proto proto println // Object_0x... Compare this to Python, which claims everything is an object:\nx = 5 print(type(x)) # \u0026lt;class 'int'\u0026gt; print(dir(x)) # ['__abs__', '__add__', ...] # But you can't add methods to numbers x.double = lambda: x * 2 # AttributeError! Python\u0026rsquo;s numbers are objects, but they\u0026rsquo;re immutable objects with a fixed set of methods. Io\u0026rsquo;s numbers are fully modifiable objects.\nStrings are Objects (and Mutable!) # text := \u0026quot;hello\u0026quot; text type println // Sequence // Strings have methods text size println // 5 text upper println // HELLO text reverse println // olleh // But here's where it gets interesting - strings are MUTABLE text atPut(0, 72) // ASCII for 'H' text println // Hello // You can add methods to strings Sequence shout := method(self upper .. \u0026quot;!!!\u0026quot;) \u0026quot;hello\u0026quot; shout println // HELLO!!! This mutability might shock programmers from languages where strings are immutable:\n# Python - strings are immutable text = \u0026quot;hello\u0026quot; text[0] = 'H' # TypeError: 'str' object does not support item assignment # Java - strings are immutable String text = \u0026quot;hello\u0026quot;; text.charAt(0) = 'H'; // Error: cannot assign a value Booleans are Objects # Even true and false are objects:\ntrue type println // true false type println // false // They have methods true and(false) println // false true or(false) println // true true not println // false // The actual objects true println // true true proto println // Object_0x... // You can even add methods to booleans! true celebrate := method(\u0026quot;Yay!\u0026quot; println) (5 \u0026gt; 3) celebrate // Yay! This is different from most languages where booleans are either primitives or special immutable objects.\nnil is an Object # Even nothingness is an object in Io:\nnil type println // Object nil slotNames println // list(type, ...) // nil has methods! nil isNil println // true nil not println // true // You can add methods to nil nil greet := method(\u0026quot;Hello from nothing!\u0026quot; println) x := nil x greet // Hello from nothing! Compare with JavaScript\u0026rsquo;s confusing null:\ntypeof null // \u0026quot;object\u0026quot; (but it's not really) null.toString() // TypeError: Cannot read property 'toString' of null Methods are Objects # This is where things get really interesting. Methods themselves are objects:\nadd := method(a, b, a + b) add type println // Block // Methods have methods! add argumentNames println // list(a, b) add code println // a +(b) // You can modify methods add code println // a +(b) add setCode(block(a, b, a * b)) // Change implementation! add(3, 4) println // 12 (now multiplies!) // You can create methods from strings code := \u0026quot;a + b + 100\u0026quot; newMethod := block(a, b) setCode(code) newMethod call(5, 10) println // 115 This is far more powerful than most languages\u0026rsquo; function objects:\n# Python def add(a, b): return a + b print(type(add)) # \u0026lt;class 'function'\u0026gt; print(add.__code__) # \u0026lt;code object...\u0026gt; # But you can't easily modify the function's code at runtime Control Structures are Objects (Messages) # This might be the most mind-bending: if, while, and for aren\u0026rsquo;t syntax—they\u0026rsquo;re methods:\n// 'if' is a method on Object if type println // nil (it's a method) // You can see its implementation Object getSlot(\u0026quot;if\u0026quot;) println // method(...) // You can even redefine it! Object if := method(condition, trueBlock, falseBlock, \u0026quot;Making a decision...\u0026quot; println if(condition, trueBlock call, falseBlock call) ) if(true, \u0026quot;yes\u0026quot; println, \u0026quot;no\u0026quot; println) // Prints: Making a decision... // Prints: yes Let\u0026rsquo;s create our own control structure:\nObject unless := method(condition, block, if(condition not, block call) ) unless(5 \u0026gt; 10, \u0026quot;Math still works!\u0026quot; println ) // Prints: Math still works! Try doing that in Java or C++!\nOperators are Objects (Messages) # Operators aren\u0026rsquo;t special syntax—they\u0026rsquo;re messages:\n// These are equivalent 2 + 3 2 +(3) 2 send(\u0026quot;+\u0026quot;, 3) // You can redefine operators Number + := method(n, \u0026quot;Adding #{self} and #{n}\u0026quot; interpolate println self + n // Would cause infinite recursion! ) // Let's be more careful Number plusWithLogging := Number getSlot(\u0026quot;+\u0026quot;) Number + := method(n, \u0026quot;Adding #{self} and #{n}\u0026quot; interpolate println self plusWithLogging(n) ) 2 + 3 // Prints: Adding 2 and 3 // Returns: 5 You can even create new operators:\nOperatorTable addOperator(\u0026quot;**\u0026quot;, 3) // Right-associative, precedence 3 Number ** := method(n, self pow(n)) 2 ** 3 println // 8 2 ** 3 ** 2 println // 512 (right-associative: 2 ** (3 ** 2)) Lists are Objects # nums := list(1, 2, 3) nums type println // List // Lists have many methods nums size println // 3 nums first println // 1 nums last println // 3 nums reverse println // list(3, 2, 1) // Lists are mutable nums append(4) nums println // list(1, 2, 3, 4) // You can add custom methods to lists List sum := method( self reduce(+) ) list(1, 2, 3, 4, 5) sum println // 15 Even the Lobby is an Object # The global namespace in Io is an object called Lobby:\nLobby type println // Object Lobby slotNames println // list(all your global variables) // When you create a \u0026quot;global\u0026quot; variable, you're adding a slot to Lobby x := 10 Lobby hasSlot(\u0026quot;x\u0026quot;) println // true Lobby x println // 10 // You can manipulate the global namespace as an object Lobby removeSlot(\u0026quot;x\u0026quot;) x println // Exception: Slot x not found This is radically different from languages with special global scope rules.\nMessages Themselves are Objects # When you send a message, that message is an object:\nmsg := message(2 + 3) msg type println // Message msg name println // + msg arguments println // list(Message_0x...) msg arguments first code println // 3 // You can evaluate messages msg doInContext(Lobby) println // 5 // You can build messages programmatically msg := Message clone setName(\u0026quot;+\u0026quot;) setArguments(list(Message clone setName(\u0026quot;3\u0026quot;))) 2 doMessage(msg) println // 5 This is the foundation of Io\u0026rsquo;s metaprogramming capabilities.\nThe Object Hierarchy # Let\u0026rsquo;s explore how all these objects relate:\n// Everything ultimately inherits from Object 5 proto proto == Object println // true \u0026quot;hi\u0026quot; proto proto == Object println // true true proto == Object println // true list() proto proto == Object println // true // You can walk the prototype chain obj := 5 while(obj, obj type println obj = obj proto ) // Prints: // Number // Object Practical Implications # What does it mean that everything is truly an object?\n1. Uniform Interface # You can treat everything uniformly:\nthings := list(5, \u0026quot;hello\u0026quot;, true, nil, method(x, x * 2), list(1, 2)) things foreach(thing, (\u0026quot;Type: \u0026quot; .. thing type) println ) // Type: Number // Type: Sequence // Type: true // Type: Object // Type: Block // Type: List 2. No Special Cases # You don\u0026rsquo;t need to remember different rules for different types:\n// Everything can receive messages 5 println \u0026quot;hello\u0026quot; println true println nil println list(1,2,3) println // Everything can be inspected 5 slotNames \u0026quot;hello\u0026quot; slotNames true slotNames nil slotNames 3. Extensibility # You can extend anything:\n// Add methods to numbers for DSL Number days := method( Duration clone setDays(self) ) Number hours := method( Duration clone setHours(self) ) // Now you can write deadline := Date now + 3 days + 4 hours 4. Debugging Power # Since everything is an object, you can inspect everything:\nObject debugMethod := method(name, m := self getSlot(name) (\u0026quot;Method \u0026quot; .. name .. \u0026quot;:\u0026quot;) println (\u0026quot; Arguments: \u0026quot; .. m argumentNames) println (\u0026quot; Code: \u0026quot; .. m code) println ) List debugMethod(\u0026quot;append\u0026quot;) // Method append: // Arguments: list(...) // Code: ... Comparison with Other Languages # Ruby: \u0026ldquo;Everything is an object\u0026rdquo; (mostly) # 5.class # Integer \u0026quot;hello\u0026quot;.class # String true.class # TrueClass nil.class # NilClass # But... if.class # SyntaxError! 'if' isn't an object Python: \u0026ldquo;Everything is an object\u0026rdquo; (sort of) # type(5) # \u0026lt;class 'int'\u0026gt; type(\u0026quot;hello\u0026quot;) # \u0026lt;class 'str'\u0026gt; type(True) # \u0026lt;class 'bool'\u0026gt; type(None) # \u0026lt;class 'NoneType'\u0026gt; # But... type(if) # SyntaxError! 'if' isn't an object type(+) # SyntaxError! '+' isn't an object JavaScript: \u0026ldquo;Everything is an object\u0026rdquo; (except when it\u0026rsquo;s not) # typeof 5 // \u0026quot;number\u0026quot; (primitive) typeof \u0026quot;hello\u0026quot; // \u0026quot;string\u0026quot; (primitive) typeof true // \u0026quot;boolean\u0026quot; (primitive) typeof {} // \u0026quot;object\u0026quot; // Autoboxing happens sometimes (5).toString() // \u0026quot;5\u0026quot; (temporarily boxed) 5.x = 10 // Silently fails! Io: Everything IS an object (no exceptions) # 5 type // Number (object) \u0026quot;hello\u0026quot; type // Sequence (object) true type // true (object) if type // nil (it's a method, which is an object) + type // nil (it's a method, which is an object) Exercises # Object Inspector: Write a method inspect that can be called on any object and prints:\nIts type Its slot names Its prototype chain Custom Boolean: Create your own boolean system with objects Yes and No that have methods and, or, and not.\nOperator Overloading: Define a Vector object with x and y slots, then overload the + operator to add vectors.\nControl Structure: Create a repeat(n, block) control structure that executes a block n times.\nMessage Logger: Modify the Object prototype to log every message sent to any object (hint: override forward).\nPhilosophical Implications # Io\u0026rsquo;s radical \u0026ldquo;everything is an object\u0026rdquo; approach has profound implications:\nSimplicity through uniformity: One concept (objects) explains everything Power through openness: Nothing is sealed or special Learning through exploration: You can inspect and understand everything Danger through freedom: You can break everything This last point is important. With great power comes great responsibility. Io trusts you completely. You can redefine addition, break the if statement, or delete critical system objects. This isn\u0026rsquo;t a bug—it\u0026rsquo;s a philosophy.\nConclusion # In Io, \u0026ldquo;everything is an object\u0026rdquo; isn\u0026rsquo;t marketing—it\u0026rsquo;s a fundamental truth that shapes every aspect of the language. Numbers, strings, booleans, nil, methods, operators, control structures, and even messages themselves are all objects with slots that can be inspected, modified, and extended.\nThis uniformity eliminates special cases, enables powerful metaprogramming, and provides a conceptually simple (if initially mind-bending) programming model. Once you internalize that everything is just objects sending messages to other objects, Io\u0026rsquo;s entire design clicks into place.\nNext, we\u0026rsquo;ll explore how objects relate to each other through Io\u0026rsquo;s prototype-based inheritance system—a world without classes.\n"},{"id":6,"href":"/docs/04-prototypes-not-classes/","title":"Prototypes, Not Classes","section":"Chapters","content":" Chapter 4: Prototypes, Not Classes # Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There\u0026rsquo;s a fundamental distinction between the template (class) and the things created from it (instances).\nIo takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs.\nThe Class-Based World # Let\u0026rsquo;s start with what you probably know. In a class-based language like Java:\n// Define a class (template) class Animal { String name; void speak() { System.out.println(\u0026quot;Some sound\u0026quot;); } } // Define a subclass class Dog extends Animal { void speak() { System.out.println(\u0026quot;Woof!\u0026quot;); } } // Create instances Dog fido = new Dog(); Dog rover = new Dog(); The key points:\nAnimal and Dog are classes (templates) fido and rover are instances (objects) Classes and instances are fundamentally different things Inheritance happens between classes The Prototype-Based World # In Io, there are no classes:\n// Create an object to serve as a prototype Animal := Object clone Animal speak := method(\u0026quot;Some sound\u0026quot; println) // Create another object using Animal as a prototype Dog := Animal clone Dog speak := method(\u0026quot;Woof!\u0026quot; println) // Create more objects using Dog as a prototype fido := Dog clone rover := Dog clone The key differences:\nAnimal, Dog, fido, and rover are all objects No fundamental distinction between \u0026ldquo;classes\u0026rdquo; and \u0026ldquo;instances\u0026rdquo; Objects are created by cloning other objects Any object can serve as a prototype for other objects Understanding Cloning # When you clone an object in Io, you don\u0026rsquo;t copy all its slots. Instead, you create a new, empty object that maintains a reference to its prototype:\nAnimal := Object clone Animal name := \u0026quot;Generic Animal\u0026quot; Animal speak := method(name println) dog := Animal clone // dog doesn't have its own 'name' slot dog hasLocalSlot(\u0026quot;name\u0026quot;) println // false // But it can access 'name' through its prototype dog name println // \u0026quot;Generic Animal\u0026quot; // Now give dog its own name dog name = \u0026quot;Fido\u0026quot; dog hasLocalSlot(\u0026quot;name\u0026quot;) println // true dog name println // \u0026quot;Fido\u0026quot; // Animal's name is unchanged Animal name println // \u0026quot;Generic Animal\u0026quot; This is called differential inheritance—objects only store their differences from their prototypes.\nThe Prototype Chain # When you send a message to an object, Io looks for a matching slot:\nFirst in the object itself Then in its prototype Then in the prototype\u0026rsquo;s prototype And so on until it reaches Object // Create a chain of prototypes Organism := Object clone Organism live := method(\u0026quot;Living...\u0026quot; println) Animal := Organism clone Animal move := method(\u0026quot;Moving...\u0026quot; println) Dog := Animal clone Dog bark := method(\u0026quot;Woof!\u0026quot; println) fido := Dog clone fido name := \u0026quot;Fido\u0026quot; // fido can access methods from anywhere in the chain fido live // \u0026quot;Living...\u0026quot; (from Organism) fido move // \u0026quot;Moving...\u0026quot; (from Animal) fido bark // \u0026quot;Woof!\u0026quot; (from Dog) // You can inspect the chain fido proto == Dog println // true fido proto proto == Animal println // true fido proto proto proto == Organism println // true Dynamic Prototype Modification # Since prototypes are just objects, you can modify them at runtime, and all objects using that prototype see the changes:\nDog := Object clone fido := Dog clone rover := Dog clone // Add a method to Dog Dog bark := method(\u0026quot;Woof!\u0026quot; println) // Both fido and rover can now bark fido bark // \u0026quot;Woof!\u0026quot; rover bark // \u0026quot;Woof!\u0026quot; // Modify the method Dog bark = method(\u0026quot;WOOF! WOOF!\u0026quot; println) // The change affects all dogs fido bark // \u0026quot;WOOF! WOOF!\u0026quot; rover bark // \u0026quot;WOOF! WOOF!\u0026quot; Try doing that with classes in Java! You\u0026rsquo;d need complex reflection APIs, and even then, you couldn\u0026rsquo;t modify existing instances.\nMultiple Prototypes # Io supports multiple inheritance through its Protos list:\n// Create two prototypes Flyable := Object clone Flyable fly := method(\u0026quot;Flying...\u0026quot; println) Swimmable := Object clone Swimmable swim := method(\u0026quot;Swimming...\u0026quot; println) // Create an object with multiple prototypes Duck := Object clone Duck appendProto(Flyable) Duck appendProto(Swimmable) mallard := Duck clone mallard fly // \u0026quot;Flying...\u0026quot; mallard swim // \u0026quot;Swimming...\u0026quot; // Inspect the prototype list Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) The search order for slots is depth-first through the Protos list.\nComparing Approaches: Class vs Prototype # Let\u0026rsquo;s implement the same concept in both paradigms to see the differences.\nClass-Based (Python) # class Shape: def __init__(self): self.x = 0 self.y = 0 def move(self, dx, dy): self.x += dx self.y += dy class Circle(Shape): def __init__(self, radius): super().__init__() self.radius = radius def area(self): return 3.14159 * self.radius ** 2 # Usage circle = Circle(5) circle.move(10, 20) print(circle.area()) # Can't easily create a one-off variation # Would need to define a new class Prototype-Based (Io) # Shape := Object clone Shape x := 0 Shape y := 0 Shape move := method(dx, dy, x = x + dx y = y + dy ) Circle := Shape clone Circle radius := 0 Circle area := method( 3.14159 * radius * radius ) // Usage circle := Circle clone circle radius = 5 circle move(10, 20) circle area println // Easy to create one-off variations specialCircle := Circle clone specialCircle area = method( \u0026quot;Special area: \u0026quot; print resend // Call the original method ) specialCircle area // \u0026quot;Special area: 78.53975\u0026quot; The Power of Prototypes # 1. Objects as Classes # In Io, objects can act as classes when needed:\n// Person acts like a class Person := Object clone Person init := method( self name := \u0026quot;Unknown\u0026quot; self age := 0 self ) Person create := method(n, a, clone init name = n age = a ) // Usage feels class-like alice := Person create(\u0026quot;Alice\u0026quot;, 30) bob := Person create(\u0026quot;Bob\u0026quot;, 25) 2. One-Off Objects # You can create unique objects without defining a \u0026ldquo;class\u0026rdquo;:\n// Create a unique object with no \u0026quot;class\u0026quot; singleton := Object clone singleton data := Map clone singleton store := method(key, value, data atPut(key, value) ) singleton retrieve := method(key, data at(key) ) // Use it directly singleton store(\u0026quot;user\u0026quot;, \u0026quot;Alice\u0026quot;) singleton retrieve(\u0026quot;user\u0026quot;) println // \u0026quot;Alice\u0026quot; 3. Runtime Class Modification # You can fundamentally change what a \u0026ldquo;class\u0026rdquo; does:\nNumber := Object clone Number value := 0 Number + := method(n, result := Number clone result value = self value + n value result ) // Create numbers five := Number clone value = 5 three := Number clone value = 3 // Now change how Number works Number + = method(n, result := Number clone result value = self value * n value // Multiply instead! result ) // Existing numbers use the new behavior eight := five + three eight value println // 15 (multiplication!) Delegation vs Inheritance # Prototype-based languages use delegation rather than inheritance. When an object doesn\u0026rsquo;t have a slot, it delegates to its prototype:\nAccount := Object clone Account balance := 0 Account deposit := method(amount, balance = balance + amount self ) savings := Account clone savings deposit(100) // Let's trace what happens: // 1. savings receives 'deposit' message // 2. savings doesn't have 'deposit' slot // 3. savings delegates to Account // 4. Account's deposit method runs // 5. But 'self' is still savings // 6. So savings's balance is updated savings balance println // 100 Account balance println // 0 (unchanged) This is subtly different from class-based inheritance where methods are copied or looked up in a class hierarchy.\nPractical Patterns # The Constructor Pattern # While Io doesn\u0026rsquo;t have constructors, you can create them:\nPerson := Object clone Person init := method(name, age, self name := name self age := age self ) Person new := method(name, age, self clone init(name, age) ) // Usage alice := Person new(\u0026quot;Alice\u0026quot;, 30) The Mixin Pattern # Use prototypes as mixins for shared behavior:\n// Define mixins Timestamped := Object clone Timestamped createdAt := Date now Timestamped age := method( Date now - createdAt ) Serializable := Object clone Serializable toJson := method( // Implementation ) // Use mixins Document := Object clone Document appendProto(Timestamped) Document appendProto(Serializable) doc := Document clone doc age println doc toJson The Factory Pattern # Objects can create other objects with specific configurations:\nShapeFactory := Object clone ShapeFactory circle := method(radius, c := Object clone c radius := radius c area := method(3.14159 * radius * radius) c ) ShapeFactory rectangle := method(width, height, r := Object clone r width := width r height := height r area := method(width * height) r ) // Usage myCircle := ShapeFactory circle(5) myRect := ShapeFactory rectangle(10, 20) JavaScript: A Familiar Prototype System # If you know JavaScript, you\u0026rsquo;ve already used prototype-based programming:\n// JavaScript (before ES6 classes) function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(\u0026quot;Some sound\u0026quot;); }; function Dog(name) { Animal.call(this, name); } Dog.prototype = Object.create(Animal.prototype); Dog.prototype.bark = function() { console.log(\u0026quot;Woof!\u0026quot;); }; But JavaScript complicated things with constructor functions and later added class syntax as sugar. Io keeps prototypes pure and simple.\nCommon Misconceptions # \u0026ldquo;No Classes Means No Structure\u0026rdquo; # False. You can create well-structured programs with prototypes:\n// Define clear prototype hierarchies Vehicle := Object clone Vehicle speed := 0 Car := Vehicle clone Car wheels := 4 ElectricCar := Car clone ElectricCar batteryLevel := 100 // The structure is clear and maintainable \u0026ldquo;Prototypes Are Just Classes With Different Syntax\u0026rdquo; # False. Prototypes are more flexible:\n// Start with a prototype Dog := Object clone Dog bark := method(\u0026quot;Woof!\u0026quot; println) fido := Dog clone // Later, change fido's prototype! Cat := Object clone Cat meow := method(\u0026quot;Meow!\u0026quot; println) fido protos = list(Cat) fido meow // \u0026quot;Meow!\u0026quot; - fido is now a cat! You can\u0026rsquo;t change an object\u0026rsquo;s class at runtime in most class-based languages.\n\u0026ldquo;Multiple Inheritance Is Always Confusing\u0026rdquo; # Io\u0026rsquo;s prototype lists make multiple inheritance explicit and controllable:\nA := Object clone A foo := method(\u0026quot;A's foo\u0026quot; println) B := Object clone B foo := method(\u0026quot;B's foo\u0026quot; println) C := Object clone C appendProto(A) C appendProto(B) C foo // \u0026quot;A's foo\u0026quot; (A comes first in the list) // Reorder to change priority C protos = list(B, A) C foo // \u0026quot;B's foo\u0026quot; (B now comes first) Exercises # Prototype Chain Explorer: Write a method that prints an object\u0026rsquo;s complete prototype chain with indentation showing the hierarchy.\nClass Emulator: Create a Class object that provides new, extends, and other class-like conveniences while using prototypes underneath.\nMultiple Inheritance Diamond: Create a diamond inheritance pattern (D inherits from B and C, which both inherit from A) and explore how Io resolves method conflicts.\nDynamic Reclassing: Write a become method that changes an object\u0026rsquo;s prototype chain to make it \u0026ldquo;become\u0026rdquo; an instance of a different prototype.\nPrototype Versioning: Implement a system where objects can \u0026ldquo;lock\u0026rdquo; to a specific version of their prototype, unaffected by later prototype modifications.\nReal-World Implications # Prototype-based programming shines in certain scenarios:\nRapid Prototyping: Create and modify objects on the fly without defining classes Dynamic Systems: Systems where object behavior needs to change at runtime DSLs: Domain-specific languages where objects morph based on context Learning: Understanding prototypes deepens your understanding of JavaScript Simplicity: No distinction between classes and objects means fewer concepts Conclusion # Prototype-based programming isn\u0026rsquo;t just \u0026ldquo;classes with different syntax\u0026rdquo;—it\u0026rsquo;s a fundamentally different way of thinking about objects and inheritance. Instead of rigid templates (classes) and instances, you have a fluid world where any object can serve as a template for others, where inheritance is delegation, and where the structure of your program can change at runtime.\nThis flexibility can be overwhelming at first, especially if you\u0026rsquo;re used to the safety of static classes. But it can also be liberating. You\u0026rsquo;re not constrained by decisions made at compile time. You can experiment, evolve, and adapt your objects as your understanding of the problem grows.\nIn the next chapter, we\u0026rsquo;ll dive deeper into how objects communicate through Io\u0026rsquo;s message passing system—the heartbeat of the language.\n"},{"id":7,"href":"/docs/05-messages-and-slots/","title":"Messages and Slots","section":"Chapters","content":" Chapter 5: Messages and Slots # At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth.\nThe Anatomy of a Message # When you write this in Io:\nperson setName(\u0026quot;Alice\u0026quot;) What actually happens? Let\u0026rsquo;s break it down:\nperson is the receiver - the object receiving the message setName is the message name (or selector) \u0026quot;Alice\u0026quot; is the argument to the message The entire expression is a message send But here\u0026rsquo;s where it gets interesting. Messages are objects too:\n// Create a message object msg := message(person setName(\u0026quot;Alice\u0026quot;)) // Inspect it msg name println // setName msg arguments println // list(Message_0x...) msg arguments first code println // \u0026quot;Alice\u0026quot; // Execute it msg doInContext(Lobby) // Actually calls person setName(\u0026quot;Alice\u0026quot;) Slots: The Object\u0026rsquo;s Memory # Slots are named storage locations in objects. They can hold any value:\nobj := Object clone // Create slots with different values obj number := 42 // Number obj text := \u0026quot;hello\u0026quot; // String obj method := method(x, x * 2) // Method obj child := Object clone // Another object obj flag := true // Boolean // List all slots obj slotNames println // list(number, text, method, child, flag) // Check for slots obj hasSlot(\u0026quot;number\u0026quot;) println // true obj hasSlot(\u0026quot;missing\u0026quot;) println // false // Get slot values obj getSlot(\u0026quot;number\u0026quot;) println // 42 obj getSlot(\u0026quot;method\u0026quot;) println // method(x, ...) The Message Resolution Algorithm # When an object receives a message, Io follows a specific algorithm to find the corresponding slot:\nAnimal := Object clone Animal speak := method(\u0026quot;generic sound\u0026quot; println) Dog := Animal clone Dog speak := method(\u0026quot;woof\u0026quot; println) Dog wagTail := method(\u0026quot;wagging...\u0026quot; println) rover := Dog clone rover name := \u0026quot;Rover\u0026quot; // When rover receives 'speak': rover speak // 1. Look for 'speak' in rover - not found // 2. Look for 'speak' in rover's proto (Dog) - found! // 3. Execute Dog's speak method with rover as self // When rover receives 'name': rover name // 1. Look for 'name' in rover - found! // 2. Return the value // Visual representation: /* Object ↑ Animal (speak: \u0026quot;generic sound\u0026quot;) ↑ Dog (speak: \u0026quot;woof\u0026quot;, wagTail) ↑ rover (name: \u0026quot;Rover\u0026quot;) */ Creating and Modifying Slots # Io distinguishes between creating new slots and updating existing ones:\nobj := Object clone // Create a new slot with := obj x := 10 obj hasSlot(\u0026quot;x\u0026quot;) println // true // Update existing slot with = obj x = 20 obj x println // 20 // Trying to update non-existent slot fails obj y = 30 // Exception: Slot y not found // But you can use setSlot to create or update obj setSlot(\u0026quot;y\u0026quot;, 30) // Creates if doesn't exist obj y println // 30 // Remove slots obj removeSlot(\u0026quot;y\u0026quot;) obj hasSlot(\u0026quot;y\u0026quot;) println // false This distinction helps catch typos:\ncounter := 0 countr = 1 // Error! Probably meant 'counter' Methods Are Just Slots # In Io, methods aren\u0026rsquo;t special—they\u0026rsquo;re just slots that hold executable blocks:\nCalculator := Object clone // Method is just a slot containing a method object Calculator add := method(a, b, a + b) // You can manipulate methods like any other value addMethod := Calculator getSlot(\u0026quot;add\u0026quot;) addMethod type println // Block // You can copy methods between objects ScientificCalc := Object clone ScientificCalc addition := Calculator getSlot(\u0026quot;add\u0026quot;) ScientificCalc addition(5, 3) println // 8 // You can even store methods in variables operation := method(x, x * 2) Calculator double := operation Calculator double(21) println // 42 The \u0026lsquo;self\u0026rsquo; and \u0026lsquo;sender\u0026rsquo; Context # Every method has access to special variables:\nPrinter := Object clone Printer name := \u0026quot;HP\u0026quot; Printer print := method(doc, (\u0026quot;Printer: \u0026quot; .. self name) println // self = receiver (\u0026quot;Sender: \u0026quot; .. sender type) println // sender = who sent the message (\u0026quot;Document: \u0026quot; .. doc) println ) Computer := Object clone Computer sendJob := method( Printer print(\u0026quot;report.pdf\u0026quot;) ) Computer sendJob // Printer: HP // Sender: Computer // Document: report.pdf Message Forwarding # When an object doesn\u0026rsquo;t have a slot for a received message, it calls forward:\nProxy := Object clone Proxy target := nil Proxy forward := method( (\u0026quot;Forwarding \u0026quot; .. call message name .. \u0026quot; to target\u0026quot;) println call evalArgAt(0) // This would forward to target ) p := Proxy clone p doSomething(\u0026quot;arg\u0026quot;) // Forwarding doSomething to target This enables powerful patterns like delegation and method missing:\n// Ruby-style method_missing DynamicObject := Object clone DynamicObject forward := method( methodName := call message name if(methodName beginsWithSeq(\u0026quot;get\u0026quot;), # Handle getters property := methodName afterSeq(\u0026quot;get\u0026quot;) lowercase self getSlot(property), # Handle setters if(methodName beginsWithSeq(\u0026quot;set\u0026quot;), property := methodName afterSeq(\u0026quot;set\u0026quot;) lowercase value := call evalArgAt(0) self setSlot(property, value) ) ) ) obj := DynamicObject clone obj setName(\u0026quot;Alice\u0026quot;) // Creates 'name' slot obj getName println // \u0026quot;Alice\u0026quot; Lazy Evaluation with Messages # Messages don\u0026rsquo;t evaluate immediately—they\u0026rsquo;re data structures you can manipulate:\n// Messages as data expr := message(2 + 3 * 4) expr println // 2 +(3 *(4)) // Evaluate when ready result := expr doInContext(Lobby) result println // 14 // Modify messages before evaluation expr := message(x + y) context := Object clone context x := 10 context y := 20 expr doInContext(context) println // 30 This enables macro-like capabilities:\n// Create a timing macro Object time := method( code := call argAt(0) // Get the message, not its value start := Date now result := code doInContext(call sender) elapsed := Date now - start (\u0026quot;Elapsed: \u0026quot; .. elapsed) println result ) // Use it time( sum := 0 for(i, 1, 1000000, sum = sum + i) sum ) // Elapsed: 0.234 // Returns: 500000500000 Call Introspection # The call object provides detailed information about the current method invocation:\nObject debug := method( \u0026quot;=== Call Debug ===\u0026quot; println (\u0026quot;Sender: \u0026quot; .. call sender type) println (\u0026quot;Target: \u0026quot; .. call target type) println (\u0026quot;Message: \u0026quot; .. call message name) println (\u0026quot;Args: \u0026quot; .. call message arguments) println (\u0026quot;Activated: \u0026quot; .. call activated type) println \u0026quot;================\u0026quot; println ) TestObject := Object clone TestObject test := method( debug ) TestObject test // === Call Debug === // Sender: Lobby // Target: TestObject // Message: debug // Args: list() // Activated: Block // ================ Operator Messages # Operators are messages with special precedence rules:\n// These are equivalent 2 + 3 * 4 2 +(3 *(4)) // You can see the precedence OperatorTable println // You can add custom operators OperatorTable addOperator(\u0026quot;@@\u0026quot;, 5) Number @@ := method(n, self pow(n) + n pow(self) ) 2 @@ 3 println // 17 (2^3 + 3^2 = 8 + 9) // Operators are just messages 5 send(\u0026quot;+\u0026quot;, 3) println // 8 \u0026quot;hello\u0026quot; send(\u0026quot;at\u0026quot;, 1) println // e Assignment Messages # Even assignment is message passing:\n// These are equivalent x := 10 setSlot(\u0026quot;x\u0026quot;, 10) // And these x = 20 updateSlot(\u0026quot;x\u0026quot;, 20) // You can override assignment behavior Object setSlot := method(name, value, (\u0026quot;Setting \u0026quot; .. name .. \u0026quot; to \u0026quot; .. value) println resend // Call original setSlot ) y := 42 // Setting y to 42 Method Activation vs. Value Access # Io distinguishes between activatable and non-activatable values:\nobj := Object clone // Methods are activatable - they run when accessed obj greet := method(\u0026quot;Hello!\u0026quot; println) obj greet // Prints \u0026quot;Hello!\u0026quot; // Other values are just returned obj name := \u0026quot;Alice\u0026quot; obj name // Returns \u0026quot;Alice\u0026quot; // You can get a method without activating it m := obj getSlot(\u0026quot;greet\u0026quot;) m println // method(...) // And activate it later m call // Prints \u0026quot;Hello!\u0026quot; // Check if something is activatable obj getSlot(\u0026quot;greet\u0026quot;) isActivatable println // true obj getSlot(\u0026quot;name\u0026quot;) isActivatable println // false Building a Message-Based DSL # Let\u0026rsquo;s build a simple HTML DSL using messages:\nHTML := Object clone HTML forward := method( tagName := call message name args := call message arguments // Build opening tag result := \u0026quot;\u0026lt;\u0026quot; .. tagName // Handle attributes (first arg if it's a Map) if(args size \u0026gt; 0 and args at(0) name == \u0026quot;curlyBrackets\u0026quot;, attrs := call evalArgAt(0) attrs foreach(key, value, result = result .. \u0026quot; \u0026quot; .. key .. \u0026quot;=\\\u0026quot;\u0026quot; .. value .. \u0026quot;\\\u0026quot;\u0026quot; ) args removeFirst ) result = result .. \u0026quot;\u0026gt;\u0026quot; // Handle content args foreach(arg, content := call sender doMessage(arg) if(content, result = result .. content) ) // Closing tag result = result .. \u0026quot;\u0026lt;/\u0026quot; .. tagName .. \u0026quot;\u0026gt;\u0026quot; result ) // Usage html := HTML clone page := html div({ \u0026quot;class\u0026quot;: \u0026quot;container\u0026quot; }, html h1(\u0026quot;Welcome\u0026quot;), html p(\u0026quot;This is a paragraph\u0026quot;), html ul( html li(\u0026quot;Item 1\u0026quot;), html li(\u0026quot;Item 2\u0026quot;) ) ) page println // \u0026lt;div class=\u0026quot;container\u0026quot;\u0026gt;\u0026lt;h1\u0026gt;Welcome\u0026lt;/h1\u0026gt;\u0026lt;p\u0026gt;This is a paragraph\u0026lt;/p\u0026gt;\u0026lt;ul\u0026gt;\u0026lt;li\u0026gt;Item 1\u0026lt;/li\u0026gt;\u0026lt;li\u0026gt;Item 2\u0026lt;/li\u0026gt;\u0026lt;/ul\u0026gt;\u0026lt;/div\u0026gt; Performance Considerations # Message passing has overhead compared to direct function calls:\n// Traditional method call obj := Object clone obj directMethod := method(x, x * 2) // Message construction and sending msg := Message clone setName(\u0026quot;directMethod\u0026quot;) setArguments(list(Message clone setName(\u0026quot;5\u0026quot;))) // Benchmark time( 100000 times(obj directMethod(5)) ) time( 100000 times(obj doMessage(msg)) ) // Direct calls are faster, but message objects enable metaprogramming Common Patterns # Property Access Pattern # Person := Object clone Person init := method( self name := nil self age := nil self ) // Generate getters/setters with messages Person addAccessors := method(slotName, // Getter self setSlot(slotName, method(self getSlot(\u0026quot;_\u0026quot; .. slotName)) ) // Setter self setSlot(\u0026quot;set\u0026quot; .. slotName asCapitalized, method(value, self setSlot(\u0026quot;_\u0026quot; .. slotName, value)) ) ) Person addAccessors(\u0026quot;name\u0026quot;) Person addAccessors(\u0026quot;age\u0026quot;) p := Person clone p setName(\u0026quot;Alice\u0026quot;) p name println // \u0026quot;Alice\u0026quot; Chain of Responsibility # Handler := Object clone Handler next := nil Handler handle := method(request, if(self canHandle(request), self process(request), if(next, next handle(request)) ) ) AuthHandler := Handler clone AuthHandler canHandle := method(request, request hasSlot(\u0026quot;needsAuth\u0026quot;) ) AuthHandler process := method(request, \u0026quot;Authenticating...\u0026quot; println ) LogHandler := Handler clone LogHandler canHandle := method(request, true) LogHandler process := method(request, (\u0026quot;Logging: \u0026quot; .. request type) println ) // Build chain auth := AuthHandler clone log := LogHandler clone auth next := log // Process requests request := Object clone request type := \u0026quot;GET\u0026quot; request needsAuth := true auth handle(request) // Authenticating... // Logging: GET Debugging Messages # Understanding message flow is crucial for debugging:\nObject trace := method( self setSlot(\u0026quot;forward\u0026quot;, method( (\u0026quot;Missing: \u0026quot; .. call message name) println (\u0026quot;Arguments: \u0026quot; .. call message arguments) println (\u0026quot;Sender: \u0026quot; .. sender type) println ) ) self ) buggy := Object clone trace buggy doSomethingWrong(1, 2, 3) // Missing: doSomethingWrong // Arguments: list(1, 2, 3) // Sender: Lobby Exercises # Message Logger: Create a wrapper that logs all messages sent to an object, including arguments and return values.\nLazy Properties: Implement properties that are only computed when first accessed, then cached.\nMessage Queue: Build an object that queues messages and executes them later in order.\nMethod Decorators: Create a system for wrapping methods with before/after behavior using messages.\nMessage Router: Build a router that directs messages to different handlers based on patterns.\nAdvanced Message Techniques # Message Rewriting # Rewriter := Object clone Rewriter forward := method( msg := call message // Rewrite add to multiply if(msg name == \u0026quot;add\u0026quot;, msg setName(\u0026quot;multiply\u0026quot;) ) // Continue with modified message resend ) calc := Rewriter clone calc multiply := method(a, b, a * b) calc add(3, 4) println // 12 (rewritten to multiply!) Conditional Message Sending # Object sendIf := method(condition, messageName, if(condition, self doMessage(Message clone setName(messageName)) ) ) Object sendUnless := method(condition, messageName, if(condition not, self doMessage(Message clone setName(messageName)) ) ) obj := Object clone obj greet := method(\u0026quot;Hello!\u0026quot; println) obj sendIf(true, \u0026quot;greet\u0026quot;) // Hello! obj sendUnless(false, \u0026quot;greet\u0026quot;) // Hello! Conclusion # Messages and slots form the foundation of Io\u0026rsquo;s object model. Every computation—from simple arithmetic to complex method calls—is accomplished through message passing. Objects store their state and behavior in slots, and respond to messages by looking up the corresponding slots.\nThis uniform model provides incredible flexibility. You can intercept messages, forward them, rewrite them, or queue them. You can introspect the entire message-passing process. You can build DSLs that feel native to the language. And you can debug by tracing the flow of messages through your system.\nUnderstanding messages and slots deeply is essential to mastering Io. They\u0026rsquo;re not just an implementation detail—they\u0026rsquo;re the conceptual core that makes Io\u0026rsquo;s radical simplicity possible.\n"},{"id":8,"href":"/docs/06-cloning-and-inheritance/","title":"Cloning and Inheritance","section":"Chapters","content":" Chapter 6: Cloning and Inheritance # In class-based languages, inheritance is a relationship between classes. In Io\u0026rsquo;s prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively.\nThe Mechanics of Cloning # When you clone an object in Io, you don\u0026rsquo;t copy all its data. Instead, you create a new, empty object with a reference to the original:\n// Create a prototype Animal := Object clone Animal species := \u0026quot;Unknown\u0026quot; Animal age := 0 Animal describe := method( (\u0026quot;A \u0026quot; .. age .. \u0026quot; year old \u0026quot; .. species) println ) // Clone it cat := Animal clone // cat is empty but linked to Animal cat slotNames println // list() - no local slots! cat species println // \u0026quot;Unknown\u0026quot; - from Animal cat age println // 0 - from Animal // The link is through 'proto' cat proto == Animal println // true This is fundamentally different from copying:\n// If cloning was copying (it's not!), it would work like: catCopy := Object clone catCopy species := Animal species // Copy each slot catCopy age := Animal age catCopy describe := Animal describe // But cloning actually creates a link: catClone := Animal clone // Empty object linked to Animal Differential Inheritance in Action # Objects only store their differences from their prototypes:\nVehicle := Object clone Vehicle speed := 60 Vehicle color := \u0026quot;white\u0026quot; Vehicle drive := method( (\u0026quot;Driving at \u0026quot; .. speed .. \u0026quot; mph\u0026quot;) println ) car := Vehicle clone car color = \u0026quot;red\u0026quot; // Override color car model := \u0026quot;Sedan\u0026quot; // Add new slot // Inspect what's stored where car slotNames println // list(color, model) - only differences! Vehicle slotNames println // list(speed, color, drive) // But car can access everything car speed println // 60 - from Vehicle car color println // \u0026quot;red\u0026quot; - from car (overrides Vehicle) car model println // \u0026quot;Sedan\u0026quot; - from car car drive // \u0026quot;Driving at 60 mph\u0026quot; Memory efficiency comparison:\n// Creating 1000 cars cars := list() 1000 times(i, car := Vehicle clone car id := i cars append(car) ) // Each car only stores its 'id' slot // All share Vehicle's methods and default values // In a copying system, each would duplicate everything The Prototype Chain # Objects can have chains of prototypes:\nOrganism := Object clone Organism alive := true Organism metabolize := method(\u0026quot;Converting energy...\u0026quot; println) Animal := Organism clone Animal mobile := true Animal move := method(\u0026quot;Moving...\u0026quot; println) Mammal := Animal clone Mammal warmBlooded := true Mammal nurse := method(\u0026quot;Nursing young...\u0026quot; println) Dog := Mammal clone Dog loyal := true Dog bark := method(\u0026quot;Woof!\u0026quot; println) fido := Dog clone fido name := \u0026quot;Fido\u0026quot; // fido can access methods from the entire chain fido metabolize // From Organism fido move // From Animal fido nurse // From Mammal fido bark // From Dog // Trace the chain obj := fido while(obj != Object, obj type println obj = obj proto ) // Dog // Mammal // Animal // Organism // Object Method Resolution Order # When you send a message, Io searches up the prototype chain:\nA := Object clone A foo := method(\u0026quot;A's foo\u0026quot; println) A bar := method(\u0026quot;A's bar\u0026quot; println) B := A clone B foo := method(\u0026quot;B's foo\u0026quot; println) // Override C := B clone C bar := method(\u0026quot;C's bar\u0026quot; println) // Override different method obj := C clone obj foo // \u0026quot;B's foo\u0026quot; - found in B (C doesn't have it) obj bar // \u0026quot;C's bar\u0026quot; - found in C obj baz // Exception - not found anywhere You can visualize the search:\nObject findSlot := method(slotName, obj := self while(obj, if(obj hasLocalSlot(slotName), (\u0026quot;Found '\u0026quot; .. slotName .. \u0026quot;' in \u0026quot; .. obj type) println return obj getSlot(slotName) ) obj = obj proto ) \u0026quot;Not found\u0026quot; println ) obj findSlot(\u0026quot;foo\u0026quot;) // Found 'foo' in B obj findSlot(\u0026quot;bar\u0026quot;) // Found 'bar' in C Multiple Inheritance # Io supports multiple inheritance through the protos list:\n// Define capabilities Flyable := Object clone Flyable altitude := 0 Flyable fly := method(height, altitude = height (\u0026quot;Flying at \u0026quot; .. altitude .. \u0026quot; feet\u0026quot;) println ) Swimmable := Object clone Swimmable depth := 0 Swimmable swim := method(d, depth = d (\u0026quot;Swimming at \u0026quot; .. depth .. \u0026quot; feet deep\u0026quot;) println ) // Single inheritance Bird := Flyable clone Bird chirp := method(\u0026quot;Chirp!\u0026quot; println) // Multiple inheritance Duck := Object clone Duck appendProto(Flyable) Duck appendProto(Swimmable) Duck quack := method(\u0026quot;Quack!\u0026quot; println) mallard := Duck clone mallard fly(100) // Flying at 100 feet mallard swim(5) // Swimming at 5 feet deep mallard quack // Quack! // Check the prototype list Duck protos println // list(Object_0x..., Flyable_0x..., Swimmable_0x...) Diamond Problem Resolution # The diamond problem occurs when multiple inheritance paths lead to the same ancestor:\n// Diamond structure Grandparent := Object clone Grandparent value := \u0026quot;from grandparent\u0026quot; Grandparent method1 := method(\u0026quot;Grandparent method1\u0026quot; println) Parent1 := Grandparent clone Parent1 method1 := method(\u0026quot;Parent1 method1\u0026quot; println) Parent1 method2 := method(\u0026quot;Parent1 method2\u0026quot; println) Parent2 := Grandparent clone Parent2 method1 := method(\u0026quot;Parent2 method1\u0026quot; println) Parent2 method3 := method(\u0026quot;Parent2 method3\u0026quot; println) Child := Object clone Child appendProto(Parent1) Child appendProto(Parent2) // Resolution order matters Child method1 // \u0026quot;Parent1 method1\u0026quot; - Parent1 comes first // Reorder to change priority Child protos := list(Parent2, Parent1) Child method1 // \u0026quot;Parent2 method1\u0026quot; - Parent2 now comes first Shallow vs Deep Cloning # By default, cloning is shallow—slot values are shared:\nOriginal := Object clone Original data := list(1, 2, 3) Original info := Map clone atPut(\u0026quot;key\u0026quot;, \u0026quot;value\u0026quot;) Shallow := Original clone // Modifying mutable objects affects both Shallow data append(4) Original data println // list(1, 2, 3, 4) - changed! // Need deep cloning for independence Object deepClone := method( new := self clone self slotNames foreach(name, value := self getSlot(name) if(value hasSlot(\u0026quot;clone\u0026quot;), new setSlot(name, value clone) ) ) new ) Deep := Original deepClone Deep data append(5) Original data println // list(1, 2, 3, 4) - unchanged Deep data println // list(1, 2, 3, 4, 5) init Methods and Constructors # While Io doesn\u0026rsquo;t have constructors, you can create initialization patterns:\nPerson := Object clone Person init := method( self name := \u0026quot;Unknown\u0026quot; self age := 0 self contacts := list() // Important: new list for each instance self // Return self for chaining ) // Override clone to call init Person clone := method( resend init ) // Now each person gets their own contacts list alice := Person clone alice name = \u0026quot;Alice\u0026quot; alice contacts append(\u0026quot;Bob\u0026quot;) bob := Person clone bob name = \u0026quot;Bob\u0026quot; bob contacts append(\u0026quot;Charlie\u0026quot;) alice contacts println // list(\u0026quot;Bob\u0026quot;) - independent! bob contacts println // list(\u0026quot;Charlie\u0026quot;) Factory Methods # Create specialized cloning methods:\nAnimal := Object clone Animal species := \u0026quot;Unknown\u0026quot; Animal sound := \u0026quot;...\u0026quot; Animal withSpecies := method(s, new := self clone new species = s new ) Animal dog := method( self clone species = \u0026quot;Dog\u0026quot; sound = \u0026quot;Woof\u0026quot; ) Animal cat := method( self clone species = \u0026quot;Cat\u0026quot; sound = \u0026quot;Meow\u0026quot; ) // Usage myDog := Animal dog myCat := Animal cat genericAnimal := Animal withSpecies(\u0026quot;Elephant\u0026quot;) Prototype Switching # Unlike class-based languages, you can change an object\u0026rsquo;s prototype at runtime:\n// Start with one prototype Bird := Object clone Bird fly := method(\u0026quot;Flying...\u0026quot; println) Fish := Object clone Fish swim := method(\u0026quot;Swimming...\u0026quot; println) creature := Bird clone creature fly // \u0026quot;Flying...\u0026quot; // Change its prototype! creature protos = list(Fish) creature swim // \u0026quot;Swimming...\u0026quot; creature fly // Exception - no longer a Bird! // Or add capabilities creature appendProto(Bird) creature fly // \u0026quot;Flying...\u0026quot; - now it can do both creature swim // \u0026quot;Swimming...\u0026quot; Mixins and Traits # Use prototypes as mixins for composable behavior:\n// Define mixins Comparable := Object clone Comparable \u0026lt; := method(other, self compare(other) \u0026lt; 0) Comparable \u0026gt; := method(other, self compare(other) \u0026gt; 0) Comparable == := method(other, self compare(other) == 0) Comparable \u0026lt;= := method(other, self compare(other) \u0026lt;= 0) Comparable \u0026gt;= := method(other, self compare(other) \u0026gt;= 0) Enumerable := Object clone Enumerable select := method(block, result := list() self foreach(item, if(block call(item), result append(item)) ) result ) Enumerable map := method(block, result := list() self foreach(item, result append(block call(item)) ) result ) // Use mixins SortedList := List clone SortedList appendProto(Comparable) SortedList appendProto(Enumerable) SortedList compare := method(other, self size compare(other size) ) list1 := SortedList clone append(1, 2, 3) list2 := SortedList clone append(4, 5) (list1 \u0026gt; list2) println // true (3 \u0026gt; 2) Clone Hooks # Customize cloning behavior:\nCounted := Object clone Counted instances := 0 Counted clone := method( Counted instances = Counted instances + 1 new := resend new id := Counted instances new ) // Each clone gets a unique ID obj1 := Counted clone obj2 := Counted clone obj3 := Counted clone obj1 id println // 1 obj2 id println // 2 obj3 id println // 3 Counted instances println // 3 Inheritance Patterns # Classical Inheritance Pattern # Emulate class-based inheritance:\n// Base \u0026quot;class\u0026quot; Class := Object clone Class new := method( instance := self clone instance init instance ) // Define a \u0026quot;class\u0026quot; Rectangle := Class clone Rectangle init := method( self width := 0 self height := 0 ) Rectangle area := method(width * height) // Inheritance Square := Rectangle clone Square init := method( resend // Call parent init self side := 0 ) Square setSide := method(s, side = s width = s height = s ) // Usage rect := Rectangle new rect width = 10 rect height = 20 rect area println // 200 square := Square new square setSide(5) square area println // 25 Delegation Pattern # Delegator := Object clone Delegator delegate := nil Delegator forward := method( if(delegate, delegate doMessage(call message, call sender) , Exception raise(\u0026quot;No delegate set\u0026quot;) ) ) Logger := Object clone Logger log := method(msg, (\u0026quot;[LOG] \u0026quot; .. msg) println) obj := Delegator clone obj delegate = Logger obj log(\u0026quot;Hello\u0026quot;) // [LOG] Hello Testing Inheritance # Check inheritance relationships:\nObject isKindOf := method(proto, obj := self while(obj, if(obj == proto, return true) if(obj protos, obj protos foreach(p, if(p isKindOf(proto), return true) ) ) obj = obj proto ) false ) Animal := Object clone Dog := Animal clone fido := Dog clone fido isKindOf(Dog) println // true fido isKindOf(Animal) println // true fido isKindOf(Object) println // true fido isKindOf(Number) println // false Performance Considerations # Prototype chains affect performance:\n// Deep chain - slower lookup A := Object clone B := A clone C := B clone D := C clone E := D clone obj := E clone obj method := method(\u0026quot;Found!\u0026quot;) // Shallow chain - faster lookup Flat := Object clone Flat method := method(\u0026quot;Found!\u0026quot;) obj2 := Flat clone // Benchmark time(100000 times(obj method)) // Slower time(100000 times(obj2 method)) // Faster Common Pitfalls # Shared Mutable State # // WRONG - shares list between instances BadTemplate := Object clone BadTemplate items := list() obj1 := BadTemplate clone obj2 := BadTemplate clone obj1 items append(1) obj2 items println // list(1) - Oops! Shared! // RIGHT - create new list for each instance GoodTemplate := Object clone GoodTemplate init := method( self items := list() self ) GoodTemplate clone := method(resend init) Circular Prototypes # // Don't do this! A := Object clone B := Object clone A appendProto(B) B appendProto(A) // Circular! // A foo // Infinite loop! Exercises # Instance Counter: Create a prototype that tracks how many objects have been cloned from it, directly or indirectly.\nPrototype Inspector: Write a method that visualizes an object\u0026rsquo;s complete prototype hierarchy as a tree.\nDeep Clone: Implement a robust deep cloning method that handles circular references.\nMultiple Inheritance Resolver: Create a system that detects and reports conflicts in multiple inheritance.\nClass Emulator: Build a complete class-based OOP system on top of Io\u0026rsquo;s prototypes, including abstract classes and interfaces.\nReal-World Example: Game Entity System # // Base entity Entity := Object clone Entity init := method( self x := 0 self y := 0 self health := 100 self ) Entity clone := method(resend init) Entity takeDamage := method(amount, health = health - amount if(health \u0026lt;= 0, self die) ) Entity die := method(\u0026quot;Entity died\u0026quot; println) // Moveable capability Moveable := Object clone Moveable speed := 1 Moveable moveTo := method(newX, newY, x = newX y = newY ) // Attacker capability Attacker := Object clone Attacker damage := 10 Attacker attack := method(target, target takeDamage(damage) ) // Compose entities Player := Entity clone Player appendProto(Moveable) Player appendProto(Attacker) Player speed = 5 Player damage = 20 Enemy := Entity clone Enemy appendProto(Moveable) Enemy appendProto(Attacker) Enemy speed = 3 Enemy damage = 15 // Static entity Turret := Entity clone Turret appendProto(Attacker) Turret damage = 25 // Usage player := Player clone enemy := Enemy clone turret := Turret clone player moveTo(10, 10) player attack(enemy) turret attack(player) Conclusion # Cloning and inheritance in Io demonstrate how complex behavior can emerge from simple mechanisms. Instead of classes, instances, and inheritance hierarchies defined at compile time, you have objects cloning objects, maintaining prototype links, and delegating message handling up the chain.\nThis flexibility enables patterns impossible in class-based languages: changing inheritance at runtime, mixing in capabilities dynamically, and treating \u0026ldquo;classes\u0026rdquo; as first-class objects that can be modified like any other. The trade-off is that you must be more careful about shared state and initialization, but the power and expressiveness gained often make it worthwhile.\nUnderstanding cloning and inheritance deeply is essential for effective Io programming. These mechanisms aren\u0026rsquo;t just how you create objects—they\u0026rsquo;re how you structure entire programs.\n"},{"id":9,"href":"/docs/07-control-flow/","title":"Control Flow","section":"Chapters","content":" Chapter 7: Control Flow # In most programming languages, control flow structures like if, while, and for are built-in syntax with special rules. In Io, they\u0026rsquo;re just methods that receive messages. This chapter explores how Io\u0026rsquo;s message-passing philosophy extends to control flow, and how you can create your own control structures.\nEverything Is a Message # Let\u0026rsquo;s start with a simple comparison. In C or Java:\nif (x \u0026gt; 5) { printf(\u0026quot;Big\\n\u0026quot;); } else { printf(\u0026quot;Small\\n\u0026quot;); } This is special syntax that the compiler understands. But in Io:\nif(x \u0026gt; 5, \u0026quot;Big\u0026quot; println, \u0026quot;Small\u0026quot; println ) The if is just a method call! You can even see its implementation:\nif println // method(...) // You could redefine it (don't actually do this!) Object if := method(condition, trueBlock, falseBlock, \u0026quot;Making a decision!\u0026quot; println resend // Call original if ) The if Method # The if method takes two or three arguments:\n// Two arguments: if-then if(temperature \u0026gt; 30, \u0026quot;It's hot!\u0026quot; println ) // Three arguments: if-then-else if(temperature \u0026gt; 30, \u0026quot;It's hot!\u0026quot; println, \u0026quot;It's nice!\u0026quot; println ) // if returns the value of the executed block result := if(5 \u0026gt; 3, \u0026quot;yes\u0026quot;, \u0026quot;no\u0026quot;) result println // \u0026quot;yes\u0026quot; // Nested if category := if(score \u0026gt; 90, \u0026quot;A\u0026quot;, if(score \u0026gt; 80, \u0026quot;B\u0026quot;, if(score \u0026gt; 70, \u0026quot;C\u0026quot;, \u0026quot;F\u0026quot;) ) ) Understanding Blocks # The key to Io\u0026rsquo;s control flow is that code blocks are objects that aren\u0026rsquo;t evaluated immediately:\n// This prints immediately \u0026quot;Hello\u0026quot; println // This creates a block object but doesn't execute it block := method(\u0026quot;Hello\u0026quot; println) // Execute it later block call // Now it prints \u0026quot;Hello\u0026quot; // Blocks in if if(true, \u0026quot;This is a block\u0026quot; println // Not executed until if decides to ) This lazy evaluation is crucial. If both branches of an if were evaluated immediately, both would execute!\n// In a hypothetical eager language: eagerIf := method(condition, trueValue, falseValue, if(condition, trueValue, falseValue) ) x := 5 eagerIf(x \u0026gt; 3, \u0026quot;Greater\u0026quot; println, // This executes immediately \u0026quot;Lesser\u0026quot; println // This also executes immediately! ) // Would print both! // But Io's if receives unevaluated blocks if(x \u0026gt; 3, \u0026quot;Greater\u0026quot; println, // Only this executes \u0026quot;Lesser\u0026quot; println // This never executes ) The while Loop # The while method repeatedly evaluates its condition and body:\ni := 0 while(i \u0026lt; 5, i println i = i + 1 ) // Prints 0, 1, 2, 3, 4 // while returns nil by default result := while(false, \u0026quot;Never runs\u0026quot;) result println // nil // Infinite loops while(true, input := File standardInput readLine if(input == \u0026quot;quit\u0026quot;, break) (\u0026quot;You said: \u0026quot; .. input) println ) The for Loop # The for method provides a counting loop:\n// Basic for loop for(i, 1, 5, i println ) // Prints 1, 2, 3, 4, 5 // With step for(i, 0, 10, 2, i println ) // Prints 0, 2, 4, 6, 8, 10 // Backward for(i, 5, 1, i println ) // Prints 5, 4, 3, 2, 1 // for can return values sum := 0 for(i, 1, 100, sum = sum + i ) sum println // 5050 The loop Method # Io provides a loop method for infinite loops:\ncount := 0 loop( count = count + 1 if(count \u0026gt; 10, break) count println ) // Equivalent to while(true, ...) break and continue # These work like in other languages, but they\u0026rsquo;re methods too:\n// break exits the loop for(i, 1, 10, if(i == 5, break) i println ) // Prints 1, 2, 3, 4 // continue skips to next iteration for(i, 1, 10, if(i % 2 == 0, continue) i println ) // Prints 1, 3, 5, 7, 9 // break can return a value result := for(i, 1, 100, if(i * i \u0026gt; 50, break(i)) ) result println // 8 (first i where i*i \u0026gt; 50) The repeat Method # A simpler counting mechanism:\n5 repeat(\u0026quot;Hello\u0026quot; println) // Prints \u0026quot;Hello\u0026quot; 5 times // repeat with index 5 repeat(i, (\u0026quot;Count: \u0026quot; .. i) println ) // Count: 0 // Count: 1 // Count: 2 // Count: 3 // Count: 4 Creating Custom Control Structures # Since control structures are just methods, you can create your own:\n// unless: opposite of if Object unless := method(condition, falseBlock, if(condition not, falseBlock call) ) unless(5 \u0026gt; 10, \u0026quot;5 is not greater than 10\u0026quot; println ) // until: opposite of while Object until := method(condition, body, while(condition not, body) ) x := 0 until(x \u0026gt; 5, x println x = x + 1 ) // times: repeat n times with cleaner syntax Number times := method(body, for(i, 1, self, body) ) 3 times(\u0026quot;Hello\u0026quot; println) The elseif Pattern # Io uses elseif for chained conditionals:\nscore := 85 if(score \u0026gt;= 90) then( \u0026quot;A\u0026quot; println ) elseif(score \u0026gt;= 80) then( \u0026quot;B\u0026quot; println ) elseif(score \u0026gt;= 70) then( \u0026quot;C\u0026quot; println ) else( \u0026quot;F\u0026quot; println ) // Prints \u0026quot;B\u0026quot; // This is actually a chain of methods // if returns a special object when false // that object has elseif and else methods Switch-like Behavior # Io doesn\u0026rsquo;t have a switch statement, but you can build one:\nObject switch := method(value, self switchValue := value self ) Object case := method(testValue, action, if(switchValue == testValue, action call self switchMatched := true ) self ) Object default := method(action, if(hasSlot(\u0026quot;switchMatched\u0026quot;) not, action call ) self ) // Usage day := \u0026quot;Tuesday\u0026quot; switch(day) case(\u0026quot;Monday\u0026quot;, \u0026quot;Start of the week\u0026quot; println ) case(\u0026quot;Tuesday\u0026quot;, \u0026quot;Second day\u0026quot; println ) case(\u0026quot;Friday\u0026quot;, \u0026quot;TGIF!\u0026quot; println ) default( \u0026quot;Regular day\u0026quot; println ) // Prints \u0026quot;Second day\u0026quot; Pattern Matching # Build more sophisticated matching:\nObject match := method( self matchValue := call evalArgAt(0) self matchContext := call sender self ) Object when := method(pattern, action, if(hasSlot(\u0026quot;matchFound\u0026quot;) not, matched := false // Check different pattern types if(pattern type == \u0026quot;Block\u0026quot;, matched = pattern call(matchValue), matched = (pattern == matchValue) ) if(matched, self matchResult := action call(matchValue) self matchFound := true ) ) self ) Object otherwise := method(action, if(hasSlot(\u0026quot;matchFound\u0026quot;) not, self matchResult := action call(matchValue) ) matchResult ) // Usage result := match(x) when( block(v, v \u0026lt; 0), method(v, \u0026quot;negative\u0026quot;) ) when( 0, method(v, \u0026quot;zero\u0026quot;) ) when( block(v, v \u0026gt; 0), method(v, \u0026quot;positive\u0026quot;) ) otherwise( method(v, \u0026quot;unknown\u0026quot;) ) Iterating Over Collections # Collections have their own iteration methods:\n// List iteration list(1, 2, 3) foreach(item, item println ) // With index list(\u0026quot;a\u0026quot;, \u0026quot;b\u0026quot;, \u0026quot;c\u0026quot;) foreach(i, item, (i .. \u0026quot;: \u0026quot; .. item) println ) // 0: a // 1: b // 2: c // Map iteration map := Map clone map atPut(\u0026quot;name\u0026quot;, \u0026quot;Alice\u0026quot;) map atPut(\u0026quot;age\u0026quot;, 30) map foreach(key, value, (key .. \u0026quot; = \u0026quot; .. value) println ) // name = Alice // age = 30 Functional Control Flow # Io supports functional programming patterns:\n// map: transform each element squares := list(1, 2, 3, 4) map(x, x * x) squares println // list(1, 4, 9, 16) // select: filter elements evens := list(1, 2, 3, 4, 5, 6) select(x, x % 2 == 0) evens println // list(2, 4, 6) // detect: find first matching element first_big := list(1, 3, 5, 7, 9) detect(x, x \u0026gt; 5) first_big println // 7 // reduce: aggregate elements sum := list(1, 2, 3, 4, 5) reduce(+) sum println // 15 product := list(1, 2, 3, 4) reduce(a, b, a * b) product println // 24 Lazy Evaluation Control # Create control structures with lazy evaluation:\nObject lazyIf := method( condition := call argAt(0) trueBlock := call argAt(1) falseBlock := call argAt(2) if(condition doInContext(call sender), trueBlock doInContext(call sender), if(falseBlock, falseBlock doInContext(call sender) ) ) ) // Both condition and blocks are lazy x := 5 lazyIf(x \u0026gt; 3 and computeExpensive(), \u0026quot;True branch\u0026quot; println, \u0026quot;False branch\u0026quot; println ) Exception Handling as Control Flow # Io\u0026rsquo;s try is also a control flow method:\ntry( // Code that might fail riskyOperation() ) catch(Exception, \u0026quot;An error occurred\u0026quot; println ) // try-catch-finally pattern result := try( file := File with(\u0026quot;data.txt\u0026quot;) openForReading file contents ) catch(Exception, e, (\u0026quot;Error: \u0026quot; .. e message) println nil ) finally( if(file, file close) ) Performance Considerations # Since control structures are methods, they have overhead:\n// Method-based loop (slower) i := 0 while(i \u0026lt; 1000000, i = i + 1 ) // But you can't really avoid it in Io // The language is optimized for expressiveness over speed Advanced: Coroutine-based Control # Io\u0026rsquo;s coroutines enable advanced control flow:\n// Generator pattern Generator := Object clone Generator init := method( self coro := Coroutine currentCoroutine self ) Generator yield := method(value, coro pause(value) ) Generator fibonacci := method( a := 0 b := 1 loop( yield(a) temp := a + b a = b b = temp ) ) // Usage gen := Generator clone fib := gen @fibonacci // @ runs in new coroutine 10 repeat( fib resume println ) // 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 Common Patterns # Early Return Pattern # Object findFirst := method(list, condition, list foreach(item, if(condition call(item), return item ) ) nil ) result := findFirst(list(1, 2, 3, 4, 5), block(x, x \u0026gt; 3) ) result println // 4 Guard Clause Pattern # processData := method(data, if(data isNil, return \u0026quot;No data\u0026quot;) if(data size == 0, return \u0026quot;Empty data\u0026quot;) if(data size \u0026gt; 1000, return \u0026quot;Too much data\u0026quot;) // Process data \u0026quot;Processed\u0026quot; return ) Loop with State # Object loopWithState := method(initial, condition, update, body, state := initial while(condition call(state), body call(state) state = update call(state) ) state ) // Sum squares until sum \u0026gt; 100 result := loopWithState( list(0, 1), // [sum, n] block(state, state at(0) \u0026lt;= 100), block(state, list(state at(0) + state at(1) squared, state at(1) + 1)), block(state, (\u0026quot;n=\u0026quot; .. state at(1) .. \u0026quot; sum=\u0026quot; .. state at(0)) println) ) Debugging Control Flow # Object trace := method(label, (label .. \u0026quot; - evaluating\u0026quot;) println self ) Object debugIf := method(condition, trueBlock, falseBlock, \u0026quot;Evaluating condition...\u0026quot; println result := condition (\u0026quot;Condition is: \u0026quot; .. result) println if(result, \u0026quot;Taking true branch\u0026quot; println trueBlock, \u0026quot;Taking false branch\u0026quot; println falseBlock ) ) x := 5 debugIf(x trace(\u0026quot;x\u0026quot;) \u0026gt; trace(\u0026quot;3\u0026quot;) 3, \u0026quot;Greater\u0026quot; println, \u0026quot;Lesser\u0026quot; println ) Exercises # do-while Loop: Implement a doWhile method that executes the body at least once.\nfor-each with Break: Create a forEachBreakable that allows breaking with a return value.\nRetry Logic: Build a retry control structure that retries an operation n times on failure.\nParallel If: Create a parallelIf that evaluates both branches concurrently and returns the first to complete.\nState Machine: Implement a state machine DSL using custom control structures.\nReal-World Example: Retry with Backoff # Object retryWithBackoff := method(maxAttempts, baseDelay, operation, attempt := 1 lastError := nil while(attempt \u0026lt;= maxAttempts, try( return operation call(attempt) ) catch(Exception, e, lastError = e if(attempt \u0026lt; maxAttempts, delay := baseDelay * (2 pow(attempt - 1)) (\u0026quot;Attempt \u0026quot; .. attempt .. \u0026quot; failed, waiting \u0026quot; .. delay .. \u0026quot;ms\u0026quot;) println System sleep(delay / 1000) ) ) attempt = attempt + 1 ) Exception raise(\u0026quot;Failed after \u0026quot; .. maxAttempts .. \u0026quot; attempts: \u0026quot; .. lastError message) ) // Usage result := retryWithBackoff(3, 100, block(attempt, (\u0026quot;Trying attempt \u0026quot; .. attempt) println if(Random value \u0026lt; 0.7, Exception raise(\u0026quot;Random failure\u0026quot;), \u0026quot;Success!\u0026quot; ) ) ) Conclusion # Io\u0026rsquo;s approach to control flow—implementing everything as methods rather than special syntax—is both radical and elegant. It demonstrates the power of Io\u0026rsquo;s uniform message-passing model: when everything is a message, even fundamental programming constructs become malleable and extensible.\nThis flexibility allows you to:\nCreate domain-specific control structures Implement new programming paradigms Debug and trace control flow Understand exactly how your program executes The cost is performance and perhaps initial unfamiliarity. But the benefit is a deep understanding of control flow and the ability to shape the language to your needs rather than being constrained by built-in constructs.\n"},{"id":10,"href":"/docs/08-collections/","title":"Collections","section":"Chapters","content":" Chapter 8: Collections # Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types.\nLists: Ordered Collections # Lists in Io are dynamic arrays that can hold any type of object:\n// Creating lists empty := list() numbers := list(1, 2, 3, 4, 5) mixed := list(\u0026quot;hello\u0026quot;, 42, true, Object clone) // Lists are objects numbers type println // List // Basic operations numbers size println // 5 numbers isEmpty println // false numbers first println // 1 numbers last println // 5 numbers at(2) println // 3 (zero-indexed) List Manipulation # fruits := list(\u0026quot;apple\u0026quot;, \u0026quot;banana\u0026quot;) // Adding elements fruits append(\u0026quot;orange\u0026quot;) fruits prepend(\u0026quot;grape\u0026quot;) fruits println // list(grape, apple, banana, orange) // Insert at position fruits atInsert(2, \u0026quot;mango\u0026quot;) fruits println // list(grape, apple, mango, banana, orange) // Removing elements fruits remove(\u0026quot;mango\u0026quot;) fruits removeAt(0) fruits pop // Removes and returns last element fruits println // list(apple, banana) // Multiple operations fruits appendSeq(list(\u0026quot;kiwi\u0026quot;, \u0026quot;peach\u0026quot;)) fruits println // list(apple, banana, kiwi, peach) List Iteration # numbers := list(1, 2, 3, 4, 5) // Basic iteration numbers foreach(n, n println ) // With index numbers foreach(i, n, (i .. \u0026quot;: \u0026quot; .. n) println ) // Reverse iteration numbers reverseForEach(n, n println ) Functional Operations # numbers := list(1, 2, 3, 4, 5) // Map: transform each element squared := numbers map(x, x * x) squared println // list(1, 4, 9, 16, 25) // Select: filter elements evens := numbers select(x, x % 2 == 0) evens println // list(2, 4) // Reject: inverse of select odds := numbers reject(x, x % 2 == 0) odds println // list(1, 3, 5) // Detect: find first match firstEven := numbers detect(x, x % 2 == 0) firstEven println // 2 // Reduce: aggregate sum := numbers reduce(+) sum println // 15 // Custom reduce product := numbers reduce(a, b, a * b) product println // 120 // Any/all predicates numbers contains(3) println // true numbers containsAll(list(2, 4)) println // true numbers containsAny(list(10, 3)) println // true List Slicing and Manipulation # letters := list(\u0026quot;a\u0026quot;, \u0026quot;b\u0026quot;, \u0026quot;c\u0026quot;, \u0026quot;d\u0026quot;, \u0026quot;e\u0026quot;) // Slicing letters slice(1, 3) println // list(b, c, d) letters slice(2) println // list(c, d, e) // Copying copy := letters copy copy atPut(0, \u0026quot;z\u0026quot;) letters println // list(a, b, c, d, e) - unchanged copy println // list(z, b, c, d, e) // Sorting numbers := list(3, 1, 4, 1, 5, 9) numbers sort println // list(1, 1, 3, 4, 5, 9) // Custom sort people := list( Object clone do(name := \u0026quot;Alice\u0026quot;; age := 30), Object clone do(name := \u0026quot;Bob\u0026quot;; age := 25), Object clone do(name := \u0026quot;Charlie\u0026quot;; age := 35) ) people sortBy(block(p, p age)) foreach(p, (p name .. \u0026quot;: \u0026quot; .. p age) println ) // Bob: 25 // Alice: 30 // Charlie: 35 Maps: Key-Value Stores # Maps (also called dictionaries or hash tables) store key-value pairs:\n// Creating maps empty := Map clone person := Map clone atPut(\u0026quot;name\u0026quot;, \u0026quot;Alice\u0026quot;) atPut(\u0026quot;age\u0026quot;, 30) // Alternative creation person := Map with( \u0026quot;name\u0026quot;, \u0026quot;Alice\u0026quot;, \u0026quot;age\u0026quot;, 30, \u0026quot;city\u0026quot;, \u0026quot;New York\u0026quot; ) // Accessing values person at(\u0026quot;name\u0026quot;) println // Alice person at(\u0026quot;missing\u0026quot;) println // nil person at(\u0026quot;missing\u0026quot;, \u0026quot;default\u0026quot;) println // default // Setting values person atPut(\u0026quot;age\u0026quot;, 31) person atPut(\u0026quot;email\u0026quot;, \u0026quot;alice@example.com\u0026quot;) // Checking keys person hasKey(\u0026quot;name\u0026quot;) println // true person hasKey(\u0026quot;phone\u0026quot;) println // false Map Operations # map := Map with(\u0026quot;a\u0026quot;, 1, \u0026quot;b\u0026quot;, 2, \u0026quot;c\u0026quot;, 3) // Get all keys and values map keys println // list(a, b, c) map values println // list(1, 2, 3) // Size and emptiness map size println // 3 map isEmpty println // false // Removing entries map removeAt(\u0026quot;b\u0026quot;) map println // Map_0x...: a=1, c=3 // Iteration map foreach(key, value, (key .. \u0026quot; =\u0026gt; \u0026quot; .. value) println ) // Merging maps other := Map with(\u0026quot;c\u0026quot;, 30, \u0026quot;d\u0026quot;, 4) map merge(other) map println // a=1, c=30, d=4 (note c was overwritten) Maps as Objects # Maps can act like objects with dynamic properties:\n// Create object-like map obj := Map clone obj atPut(\u0026quot;greet\u0026quot;, method(name, (\u0026quot;Hello, \u0026quot; .. name .. \u0026quot;!\u0026quot;) println )) obj atPut(\u0026quot;x\u0026quot;, 10) obj atPut(\u0026quot;y\u0026quot;, 20) // Use like object (sort of) obj at(\u0026quot;greet\u0026quot;) call(\u0026quot;World\u0026quot;) // Hello, World! obj at(\u0026quot;x\u0026quot;) println // 10 Sequences: String Handling # Sequences are Io\u0026rsquo;s strings, but they\u0026rsquo;re mutable and act like byte arrays:\ntext := \u0026quot;Hello, World!\u0026quot; // Basic operations text size println // 13 text at(0) println // 72 (ASCII 'H') text at(0) asCharacter println // H // Slicing text slice(0, 5) println // Hello text slice(7) println // World! // Searching text findSeq(\u0026quot;World\u0026quot;) println // 7 (index) text containsSeq(\u0026quot;Hello\u0026quot;) println // true text beginsWithSeq(\u0026quot;Hello\u0026quot;) println // true text endsWithSeq(\u0026quot;!\u0026quot;) println // true String Manipulation # text := \u0026quot; Hello, World! \u0026quot; // Trimming text strip println // \u0026quot;Hello, World!\u0026quot; text lstrip println // \u0026quot;Hello, World! \u0026quot; text rstrip println // \u0026quot; Hello, World!\u0026quot; // Case conversion \u0026quot;hello\u0026quot; upper println // HELLO \u0026quot;WORLD\u0026quot; lower println // world \u0026quot;hello world\u0026quot; asCapitalized println // Hello world // Replacement \u0026quot;hello world\u0026quot; replaceSeq(\u0026quot;world\u0026quot;, \u0026quot;Io\u0026quot;) println // hello Io \u0026quot;abcabc\u0026quot; replaceFirstSeq(\u0026quot;a\u0026quot;, \u0026quot;X\u0026quot;) println // Xbcabc // Splitting and joining words := \u0026quot;apple,banana,orange\u0026quot; split(\u0026quot;,\u0026quot;) words println // list(apple, banana, orange) words join(\u0026quot;-\u0026quot;) println // apple-banana-orange String Building # // Inefficient string concatenation result := \u0026quot;\u0026quot; for(i, 1, 1000, result = result .. i .. \u0026quot;, \u0026quot; ) // Better: use a list parts := list() for(i, 1, 1000, parts append(i) ) result := parts join(\u0026quot;, \u0026quot;) // Or use Sequence's mutable nature seq := Sequence clone for(i, 1, 100, seq appendSeq(i asString) appendSeq(\u0026quot;, \u0026quot;) ) Regular Expressions # Io has built-in regex support:\ntext := \u0026quot;The year 2024 has 365 days\u0026quot; // Find matches text findRegex(\u0026quot;\\\\d+\u0026quot;) println // MatchResult... text allMatchesOfRegex(\u0026quot;\\\\d+\u0026quot;) foreach(match, match println // 2024, 365 ) // Replace with regex text replaceAllRegex(\u0026quot;\\\\d+\u0026quot;, \u0026quot;N\u0026quot;) println // The year N has N days // Capture groups email := \u0026quot;user@example.com\u0026quot; match := email matchesOfRegex(\u0026quot;(\\\\w+)@(\\\\w+\\\\.\\\\w+)\u0026quot;) if(match, match at(1) println // user match at(2) println // example.com ) Creating Custom Collections # Stack Implementation # Stack := List clone Stack push := method(item, self append(item) ) Stack pop := method( if(size \u0026gt; 0, removeAt(size - 1), nil ) ) Stack peek := method( if(size \u0026gt; 0, at(size - 1), nil ) ) // Usage stack := Stack clone stack push(1) push(2) push(3) stack pop println // 3 stack peek println // 2 stack pop println // 2 stack pop println // 1 Queue Implementation # Queue := Object clone Queue init := method( self items := list() self ) Queue enqueue := method(item, items append(item) self ) Queue dequeue := method( if(items size \u0026gt; 0, items removeAt(0), nil ) ) Queue isEmpty := method(items isEmpty) Queue size := method(items size) // Usage queue := Queue clone init queue enqueue(\u0026quot;a\u0026quot;) enqueue(\u0026quot;b\u0026quot;) enqueue(\u0026quot;c\u0026quot;) queue dequeue println // a queue dequeue println // b queue size println // 1 Set Implementation # Set := Object clone Set init := method( self items := Map clone self ) Set add := method(item, items atPut(item asString, item) self ) Set remove := method(item, items removeAt(item asString) self ) Set contains := method(item, items hasKey(item asString) ) Set union := method(other, result := Set clone init items foreach(k, v, result add(v)) other items foreach(k, v, result add(v)) result ) Set intersection := method(other, result := Set clone init items foreach(k, v, if(other contains(v), result add(v)) ) result ) // Usage set1 := Set clone init add(1) add(2) add(3) set2 := Set clone init add(2) add(3) add(4) set1 contains(2) println // true union := set1 union(set2) intersection := set1 intersection(set2) Advanced Collection Patterns # Lazy Evaluation # LazyList := Object clone LazyList init := method(generator, self generator := generator self cache := list() self ) LazyList at := method(index, while(cache size \u0026lt;= index, cache append(generator call(cache size)) ) cache at(index) ) LazyList take := method(n, result := list() for(i, 0, n - 1, result append(self at(i)) ) result ) // Infinite fibonacci sequence fibGen := LazyList clone init(block(n, if(n \u0026lt; 2, n, self at(n - 1) + self at(n - 2)) )) fibGen take(10) println // list(0, 1, 1, 2, 3, 5, 8, 13, 21, 34) Collection Pipeline # // Method chaining for data processing data := list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) result := data select(x, x % 2 == 0) \\ map(x, x * x) \\ select(x, x \u0026gt; 10) \\ reduce(+) result println // 120 (16 + 36 + 64) // Custom pipeline List pipeline := method( Pipeline clone setList(self) ) Pipeline := Object clone Pipeline setList := method(list, self list := list self ) Pipeline where := method(predicate, self list = list select(predicate) self ) Pipeline transform := method(mapper, self list = list map(mapper) self ) Pipeline aggregate := method(reducer, list reduce(reducer) ) // Usage numbers := list(1, 2, 3, 4, 5) total := numbers pipeline \\ where(x, x % 2 == 0) \\ transform(x, x * x) \\ aggregate(+) total println // 20 (4 + 16) Nested Collections # // Matrix as list of lists matrix := list( list(1, 2, 3), list(4, 5, 6), list(7, 8, 9) ) // Access element matrix at(1) at(2) println // 6 // Transpose transpose := method(matrix, rows := matrix size cols := matrix at(0) size result := list() for(c, 0, cols - 1, col := list() for(r, 0, rows - 1, col append(matrix at(r) at(c)) ) result append(col) ) result ) transpose(matrix) println // list(list(1, 4, 7), list(2, 5, 8), list(3, 6, 9)) Performance Considerations # // List operations performance list := List clone // O(1) operations list append(item) // Constant time list at(index) // Constant time list size // Constant time // O(n) operations list indexOf(item) // Linear search list contains(item) // Linear search list remove(item) // Linear search + shift // Map operations are generally O(1) map := Map clone map atPut(key, value) // Constant average map at(key) // Constant average map removeAt(key) // Constant average // Choose the right collection for your needs Collection Serialization # // JSON serialization list := list(1, 2, 3, Map with(\u0026quot;name\u0026quot;, \u0026quot;Alice\u0026quot;)) json := list asJson json println // [1,2,3,{\u0026quot;name\u0026quot;:\u0026quot;Alice\u0026quot;}] // Deserialize restored := json parseJson restored println // Custom serialization Collection := Object clone Collection serialize := method( result := list() self foreach(item, if(item hasSlot(\u0026quot;serialize\u0026quot;), result append(item serialize), result append(item asString) ) ) result join(\u0026quot;|\u0026quot;) ) Common Pitfalls # Shared References # // PROBLEM: Shared reference original := list(1, 2, 3) copy := original // Not a copy! copy append(4) original println // list(1, 2, 3, 4) - modified! // SOLUTION: Use copy original := list(1, 2, 3) copy := original copy copy append(4) original println // list(1, 2, 3) - unchanged Iterator Invalidation # // PROBLEM: Modifying while iterating list := list(1, 2, 3, 4, 5) list foreach(item, if(item % 2 == 0, list remove(item) // Dangerous! ) ) // SOLUTION: Use select/reject or iterate on copy list := list(1, 2, 3, 4, 5) list = list reject(item, item % 2 == 0) Exercises # Circular Buffer: Implement a fixed-size circular buffer that overwrites old elements.\nMultiMap: Create a map that can store multiple values per key.\nSorted List: Implement a list that maintains sorted order on insertion.\nTree Structure: Build a tree collection with parent-child relationships.\nGraph: Implement a graph data structure with nodes and edges.\nReal-World Example: Todo List with Tags # TodoItem := Object clone TodoItem init := method(description, self description := description self tags := Set clone init self completed := false self ) TodoList := Object clone TodoList init := method( self items := list() self ) TodoList add := method(description, item := TodoItem clone init(description) items append(item) item ) TodoList taggedWith := method(tag, items select(item, item tags contains(tag)) ) TodoList pending := method( items select(item, item completed not) ) TodoList complete := method(description, item := items detect(i, i description == description) if(item, item completed = true) self ) // Usage todos := TodoList clone init todos add(\u0026quot;Write documentation\u0026quot;) tags add(\u0026quot;work\u0026quot;) add(\u0026quot;writing\u0026quot;) todos add(\u0026quot;Fix bugs\u0026quot;) tags add(\u0026quot;work\u0026quot;) add(\u0026quot;urgent\u0026quot;) todos add(\u0026quot;Buy groceries\u0026quot;) tags add(\u0026quot;personal\u0026quot;) todos taggedWith(\u0026quot;urgent\u0026quot;) foreach(item, item description println ) // Fix bugs todos complete(\u0026quot;Buy groceries\u0026quot;) todos pending foreach(item, item description println ) // Write documentation // Fix bugs Conclusion # Io\u0026rsquo;s collections—List, Map, and Sequence—provide a solid foundation for data manipulation. They\u0026rsquo;re all objects, following Io\u0026rsquo;s uniform object model, and support functional programming patterns like map, select, and reduce.\nThe real power comes from Io\u0026rsquo;s flexibility: you can add methods to existing collection types, create custom collections that integrate seamlessly, and build sophisticated data structures using simple object composition. Understanding collections deeply is essential for effective Io programming, as they form the backbone of most data processing tasks.\n"},{"id":11,"href":"/docs/09-blocks-and-closures/","title":"Blocks and Closures","section":"Chapters","content":" Chapter 9: Blocks and Closures # Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io.\nUnderstanding Blocks and Methods # In Io, block and method are similar but have a crucial difference:\n// Block - creates its own scope blk := block(x, x * 2) blk call(5) println // 10 // Method - shares scope with receiver obj := Object clone obj value := 10 obj meth := method(x, x * value) // Can access 'value' obj blk := block(x, x * value) // Error when called - no 'value' in block scope obj meth(5) println // 50 // obj blk call(5) // Exception: value not found The key difference:\nMethods have access to self and the receiver\u0026rsquo;s slots Blocks create their own scope and don\u0026rsquo;t have automatic access to self Creating and Calling Blocks # // Simple block double := block(x, x * 2) double call(5) println // 10 // Multi-argument block add := block(a, b, a + b) add call(3, 4) println // 7 // No-argument block greet := block(\u0026quot;Hello!\u0026quot; println) greet call // Hello! // Blocks are objects double type println // Block double proto println // Block_0x... Blocks as Closures # Blocks capture variables from their creation context:\nmakeCounter := method( count := 0 block( count = count + 1 count ) ) counter1 := makeCounter() counter2 := makeCounter() counter1 call println // 1 counter1 call println // 2 counter2 call println // 1 (independent) counter1 call println // 3 This is different from many languages where you need special syntax for closures:\n// JavaScript function makeCounter() { let count = 0; return function() { count++; return count; }; } In Io, all blocks are closures automatically.\nThe Scope Chain # Understanding scope is crucial for blocks:\nx := \u0026quot;global\u0026quot; outer := method( x := \u0026quot;outer\u0026quot; inner := block( x println // What prints? ) inner ) myBlock := outer() myBlock call // \u0026quot;outer\u0026quot; - captured from creation context x = \u0026quot;changed global\u0026quot; myBlock call // Still \u0026quot;outer\u0026quot; - closure captures variables, not global Methods and self # Methods have access to self (the receiver):\nCalculator := Object clone Calculator value := 0 Calculator add := method(n, self value = self value + n // Explicit self value // Implicit self ) Calculator addBlock := block(n, // No automatic self here! // Would need to pass it explicitly ) calc := Calculator clone calc add(5) println // 5 calc add(3) println // 8 Block Arguments and Defaults # // Variable arguments sumAll := block( args := call message arguments total := 0 args foreach(arg, total = total + call sender doMessage(arg) ) total ) sumAll call(1, 2, 3, 4, 5) println // 15 // Default arguments (manual) greetWithDefault := block(name, if(name isNil, name = \u0026quot;World\u0026quot;) (\u0026quot;Hello, \u0026quot; .. name .. \u0026quot;!\u0026quot;) println ) greetWithDefault call(\u0026quot;Alice\u0026quot;) // Hello, Alice! greetWithDefault call() // Hello, World! Higher-Order Functions # Blocks enable functional programming patterns:\n// Functions returning functions makeMultiplier := method(factor, block(x, x * factor) ) double := makeMultiplier(2) triple := makeMultiplier(3) double call(5) println // 10 triple call(5) println // 15 // Functions taking functions twice := method(f, x, f call(f call(x)) ) twice(block(n, n + 1), 5) println // 7 // Composition compose := method(f, g, block(x, f call(g call(x))) ) addOne := block(x, x + 1) double := block(x, x * 2) doubleThenAddOne := compose(addOne, double) doubleThenAddOne call(5) println // 11 Partial Application and Currying # // Partial application add := block(a, b, a + b) addFive := block(x, add call(5, x)) addFive call(3) println // 8 // Currying curry := method(f, block(a, block(b, f call(a, b) ) ) ) curriedAdd := curry(add) add5 := curriedAdd call(5) add5 call(3) println // 8 // More practical example formatString := block(template, value, template interpolate(value) ) curriedFormat := curry(formatString) errorFormatter := curriedFormat call(\u0026quot;Error: #{value}\u0026quot;) successFormatter := curriedFormat call(\u0026quot;Success: #{value}\u0026quot;) errorFormatter call(\u0026quot;File not found\u0026quot;) println // Error: File not found successFormatter call(\u0026quot;Operation complete\u0026quot;) println // Success: Operation complete Lazy Evaluation with Blocks # Blocks don\u0026rsquo;t evaluate until called, enabling lazy patterns:\n// Lazy if (already built-in, but here's how it works) lazyIf := method(condition, trueBlock, falseBlock, if(condition, trueBlock call, falseBlock call ) ) x := 5 lazyIf(x \u0026gt; 3, block(\u0026quot;Greater\u0026quot; println), block(\u0026quot;Lesser\u0026quot; println) ) // Lazy infinite sequences naturals := method(start, block( n := start block( current := n n = n + 1 current ) ) call ) seq := naturals(1) 5 repeat(seq call println) // 1, 2, 3, 4, 5 Memoization # Use closures to cache expensive computations:\nmemoize := method(f, cache := Map clone block( args := call message arguments key := args asString if(cache hasKey(key), cache at(key), result := f call(args) cache atPut(key, result) result ) ) ) // Expensive fibonacci fib := block(n, if(n \u0026lt; 2, n, fib call(n - 1) + fib call(n - 2)) ) // Memoized version fastFib := memoize(fib) // Much faster on repeated calls time(fib call(30)) println time(fastFib call(30)) println Block Introspection # Blocks are objects you can inspect:\nmyBlock := block(x, y, x + y * 2) // Inspect structure myBlock argumentNames println // list(x, y) myBlock code println // x +(y *(2)) // Modify blocks myBlock setArgumentNames(list(\u0026quot;a\u0026quot;, \u0026quot;b\u0026quot;)) myBlock argumentNames println // list(a, b) // Create blocks programmatically code := \u0026quot;a + b\u0026quot; args := list(\u0026quot;a\u0026quot;, \u0026quot;b\u0026quot;) dynamicBlock := Block clone setArgumentNames(args) setCode(code) dynamicBlock call(3, 4) println // 7 Blocks in Data Structures # // Table of operations operations := Map with( \u0026quot;+\u0026quot;, block(a, b, a + b), \u0026quot;-\u0026quot;, block(a, b, a - b), \u0026quot;*\u0026quot;, block(a, b, a * b), \u0026quot;/\u0026quot;, block(a, b, a / b) ) calculate := method(op, a, b, operations at(op) call(a, b) ) calculate(\u0026quot;+\u0026quot;, 5, 3) println // 8 calculate(\u0026quot;*\u0026quot;, 4, 7) println // 28 // Event handlers EventEmitter := Object clone EventEmitter init := method( self events := Map clone self ) EventEmitter on := method(event, handler, if(events hasKey(event) not, events atPut(event, list()) ) events at(event) append(handler) self ) EventEmitter emit := method(event, data, if(events hasKey(event), events at(event) foreach(handler, handler call(data) ) ) self ) // Usage emitter := EventEmitter clone init emitter on(\u0026quot;click\u0026quot;, block(data, (\u0026quot;Clicked at: \u0026quot; .. data) println )) emitter on(\u0026quot;click\u0026quot;, block(data, (\u0026quot;Another handler: \u0026quot; .. data) println )) emitter emit(\u0026quot;click\u0026quot;, \u0026quot;x=10, y=20\u0026quot;) // Clicked at: x=10, y=20 // Another handler: x=10, y=20 Control Flow with Blocks # Create custom control structures:\n// Retry logic retry := method(times, block, attempts := 0 loop( attempts = attempts + 1 e := try(result := block call) if(e isNil, return result) if(attempts \u0026gt;= times, Exception raise(e)) (\u0026quot;Attempt \u0026quot; .. attempts .. \u0026quot; failed, retrying...\u0026quot;) println ) ) // Usage result := retry(3, block( if(Random value \u0026lt; 0.7, Exception raise(\u0026quot;Random failure\u0026quot;), \u0026quot;Success!\u0026quot; ) )) // While with condition block whileTrue := method(conditionBlock, bodyBlock, while(conditionBlock call, bodyBlock call) ) i := 0 whileTrue( block(i \u0026lt; 5), block( i println i = i + 1 ) ) Performance Considerations # // Method vs Block performance obj := Object clone obj value := 10 obj method1 := method(x, x + value) obj block1 := block(x, x + 10) // Methods are slightly faster for object operations time(100000 repeat(obj method1(5))) time(100000 repeat(obj block1 call(5))) // But blocks are better for functional patterns numbers := list(1, 2, 3, 4, 5) time(numbers map(x, x * 2)) // Using block syntax Advanced Patterns # Continuation-Style Programming # // Continuation passing style factorial := method(n, continuation, if(n \u0026lt;= 1, continuation call(1), factorial(n - 1, block(result, continuation call(n * result) )) ) ) factorial(5, block(result, result println)) // 120 Monadic Patterns # // Maybe monad Maybe := Object clone Maybe Nothing := Maybe clone Maybe Just := method(value, m := Maybe clone m value := value m isNothing := false m ) Maybe Nothing isNothing := true Maybe bind := method(f, if(isNothing, Maybe Nothing, f call(value)) ) Maybe map := method(f, if(isNothing, Maybe Nothing, Maybe Just(f call(value)) ) ) // Usage result := Maybe Just(5) \\ map(block(x, x * 2)) \\ bind(block(x, if(x \u0026gt; 5, Maybe Just(x), Maybe Nothing) )) \\ map(block(x, x + 1)) if(result isNothing not, result value println // 11 ) Transducers # // Composable transformations mapping := method(f, method(reducer, block(acc, item, reducer call(acc, f call(item)) ) ) ) filtering := method(pred, method(reducer, block(acc, item, if(pred call(item), reducer call(acc, item), acc ) ) ) ) // Compose transducers transduce := method(xform, reducer, init, coll, xreducer := xform call(reducer) coll foreach(item, init = xreducer call(init, item) ) init ) // Usage xform := filtering(block(x, x % 2 == 0)) call( mapping(block(x, x * 2)) ) result := transduce(xform, block(acc, x, acc + x), 0, list(1, 2, 3, 4, 5, 6) ) result println // 24 (2*2 + 4*2 + 6*2) Common Pitfalls # Variable Capture # // PROBLEM: Loop variable capture handlers := list() for(i, 1, 3, handlers append(block(i println)) ) handlers foreach(h, h call) // All print 3! // SOLUTION: Create new scope handlers := list() for(i, 1, 3, handlers append( method(n, block(n println)) call(i) ) ) handlers foreach(h, h call) // 1, 2, 3 Memory Leaks with Closures # // PROBLEM: Closure keeps large object alive makeClosure := method( hugeData := List clone 10000 repeat(hugeData append(Random value)) block(x, x * 2) // Doesn't use hugeData but keeps it alive! ) // SOLUTION: Be explicit about captured variables makeClosure := method( hugeData := List clone 10000 repeat(hugeData append(Random value)) processedValue := hugeData size // Extract what you need hugeData = nil // Release reference block(x, x * processedValue) ) Exercises # Promise Implementation: Create a Promise/Future system using blocks for async operations.\nStream Processing: Build a lazy stream processor with map, filter, and reduce.\nFunction Decorator: Implement decorators for logging, timing, and caching.\nParser Combinators: Create a simple parser combinator library using blocks.\nReactive System: Build a simple FRP (Functional Reactive Programming) system.\nReal-World Example: Pipeline Builder # Pipeline := Object clone Pipeline init := method( self steps := list() self ) Pipeline add := method(step, steps append(step) self ) Pipeline map := method(f, self add(block(data, data map(f) )) ) Pipeline filter := method(pred, self add(block(data, data select(pred) )) ) Pipeline tap := method(f, self add(block(data, f call(data) data )) ) Pipeline run := method(input, result := input steps foreach(step, result = step call(result) ) result ) // Usage pipeline := Pipeline clone init \\ filter(block(x, x % 2 == 0)) \\ map(block(x, x * x)) \\ tap(block(data, (\u0026quot;After squaring: \u0026quot; .. data) println)) \\ filter(block(x, x \u0026gt; 10)) \\ map(block(x, x asString)) result := pipeline run(list(1, 2, 3, 4, 5, 6)) // After squaring: list(4, 16, 36) result println // list(\u0026quot;16\u0026quot;, \u0026quot;36\u0026quot;) Conclusion # Blocks and closures are fundamental to Io\u0026rsquo;s expressiveness. They\u0026rsquo;re not just anonymous functions—they\u0026rsquo;re first-class objects that capture context, enable functional programming, and allow you to extend the language with new control structures.\nThe distinction between blocks (isolated scope) and methods (shared scope with receiver) provides flexibility in how you structure code. Closures emerge naturally from Io\u0026rsquo;s scope rules, making complex patterns like memoization, continuations, and higher-order functions straightforward to implement.\nUnderstanding blocks deeply unlocks Io\u0026rsquo;s full potential, enabling you to write code that\u0026rsquo;s both powerful and elegant.\n"},{"id":12,"href":"/docs/10-exceptions/","title":"Exceptions","section":"Chapters","content":" Chapter 10: Exceptions # Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types.\nBasic Exception Handling # Io uses try, catch, and raise for exception handling:\n// Basic try-catch try( 10 / 0 // Division by zero ) catch(Exception, e, (\u0026quot;Error: \u0026quot; .. e message) println ) // Error: divide by zero // Multiple catch blocks try( someRiskyOperation() ) catch(TypeError, e, \u0026quot;Type error occurred\u0026quot; println ) catch(IOException, e, \u0026quot;IO error occurred\u0026quot; println ) catch(Exception, e, \u0026quot;Some other error occurred\u0026quot; println ) Compare with other languages:\n# Python try: result = 10 / 0 except ZeroDivisionError as e: print(f\u0026quot;Error: {e}\u0026quot;) // Java try { int result = 10 / 0; } catch (ArithmeticException e) { System.out.println(\u0026quot;Error: \u0026quot; + e.getMessage()); } Raising Exceptions # // Raise a simple exception Exception raise(\u0026quot;Something went wrong\u0026quot;) // Raise with more information e := Exception clone e setMessage(\u0026quot;File not found\u0026quot;) e raise // Conditional raising validateAge := method(age, if(age \u0026lt; 0, Exception raise(\u0026quot;Age cannot be negative\u0026quot;)) if(age \u0026gt; 150, Exception raise(\u0026quot;Age seems unrealistic\u0026quot;)) age ) try( validateAge(-5) ) catch(Exception, e, e message println // Age cannot be negative ) Exception Objects # Exceptions are just objects:\n// Examine exception structure e := Exception clone e type println // Exception e proto println // Object_0x... // Exception slots e setMessage(\u0026quot;Test error\u0026quot;) e message println // Test error // Stack trace try( Exception raise(\u0026quot;Test\u0026quot;) ) catch(Exception, e, e showStack // Prints full stack trace e coroutine println // The coroutine where error occurred ) Creating Custom Exceptions # // Define custom exception types ValidationError := Exception clone ValidationError type := \u0026quot;ValidationError\u0026quot; NetworkError := Exception clone NetworkError type := \u0026quot;NetworkError\u0026quot; NetworkError code := nil NetworkError setCode := method(c, self code = c; self) // Use custom exceptions validateEmail := method(email, if(email containsSeq(\u0026quot;@\u0026quot;) not, ValidationError clone setMessage(\u0026quot;Invalid email format\u0026quot;) raise ) email ) fetchData := method(url, // Simulate network error if(Random value \u0026lt; 0.3, NetworkError clone setMessage(\u0026quot;Connection timeout\u0026quot;) setCode(408) raise ) \u0026quot;data\u0026quot; ) // Handle specific exception types try( validateEmail(\u0026quot;badEmail\u0026quot;) ) catch(ValidationError, e, (\u0026quot;Validation failed: \u0026quot; .. e message) println ) catch(Exception, e, (\u0026quot;Unexpected error: \u0026quot; .. e message) println ) The finally Block # // Ensure cleanup with finally file := nil try( file = File with(\u0026quot;data.txt\u0026quot;) openForReading contents := file contents processData(contents) ) catch(Exception, e, (\u0026quot;Error reading file: \u0026quot; .. e message) println ) finally( if(file, file close) \u0026quot;Cleanup complete\u0026quot; println ) // finally always executes result := try( \u0026quot;Success\u0026quot; println 42 ) catch(Exception, e, \u0026quot;Error\u0026quot; println 0 ) finally( \u0026quot;Always runs\u0026quot; println ) // Prints: Success, Always runs result println // 42 Return Values and Exceptions # // try returns a value result := try( 10 / 2 ) catch(Exception, e, 0 // Default value on error ) result println // 5 // With error result := try( 10 / 0 ) catch(Exception, e, 0 // Default value on error ) result println // 0 // Pattern: Result or default safeDiv := method(a, b, try(a / b) catch(Exception, 0) ) safeDiv(10, 2) println // 5 safeDiv(10, 0) println // 0 Exception Propagation # Exceptions bubble up through the call stack:\nlevel3 := method( Exception raise(\u0026quot;Error at level 3\u0026quot;) ) level2 := method( \u0026quot;Level 2 start\u0026quot; println level3() \u0026quot;Level 2 end\u0026quot; println // Never reached ) level1 := method( \u0026quot;Level 1 start\u0026quot; println level2() \u0026quot;Level 1 end\u0026quot; println // Never reached ) try( level1() ) catch(Exception, e, (\u0026quot;Caught at top level: \u0026quot; .. e message) println ) // Level 1 start // Level 2 start // Caught at top level: Error at level 3 Rethrowing Exceptions # processFile := method(filename, try( file := File with(filename) openForReading // Process file ) catch(Exception, e, (\u0026quot;Failed to process \u0026quot; .. filename) println e raise // Rethrow the original exception ) ) try( processFile(\u0026quot;nonexistent.txt\u0026quot;) ) catch(Exception, e, \u0026quot;Caught rethrown exception\u0026quot; println ) Error Recovery Patterns # Retry Pattern # retryOperation := method(operation, maxAttempts, attempts := 0 lastError := nil while(attempts \u0026lt; maxAttempts, attempts = attempts + 1 e := try( return operation call(attempts) ) if(e, lastError = e (\u0026quot;Attempt \u0026quot; .. attempts .. \u0026quot; failed: \u0026quot; .. e message) println if(attempts \u0026lt; maxAttempts, wait(0.5)) ) ) Exception raise(\u0026quot;All \u0026quot; .. maxAttempts .. \u0026quot; attempts failed. Last error: \u0026quot; .. lastError message) ) // Usage result := retryOperation( block(attempt, if(Random value \u0026lt; 0.7, Exception raise(\u0026quot;Random failure\u0026quot;), \u0026quot;Success on attempt \u0026quot; .. attempt ) ), 3 ) Circuit Breaker # CircuitBreaker := Object clone CircuitBreaker init := method(threshold, timeout, self failureCount := 0 self threshold := threshold self timeout := timeout self state := \u0026quot;closed\u0026quot; // closed, open, half-open self lastFailureTime := nil self ) CircuitBreaker call := method(operation, if(state == \u0026quot;open\u0026quot;, if(Date now - lastFailureTime \u0026gt; timeout, state = \u0026quot;half-open\u0026quot; \u0026quot;Circuit breaker entering half-open state\u0026quot; println, Exception raise(\u0026quot;Circuit breaker is open\u0026quot;) ) ) e := try( result := operation call if(state == \u0026quot;half-open\u0026quot;, state = \u0026quot;closed\u0026quot; failureCount = 0 \u0026quot;Circuit breaker closed\u0026quot; println ) return result ) if(e, failureCount = failureCount + 1 lastFailureTime = Date now if(failureCount \u0026gt;= threshold, state = \u0026quot;open\u0026quot; \u0026quot;Circuit breaker opened\u0026quot; println ) e raise ) ) // Usage breaker := CircuitBreaker clone init(3, 5) unreliableService := block( if(Random value \u0026lt; 0.8, Exception raise(\u0026quot;Service unavailable\u0026quot;), \u0026quot;Service response\u0026quot; ) ) 5 repeat( try( breaker call(unreliableService) println ) catch(Exception, e, (\u0026quot;Failed: \u0026quot; .. e message) println ) wait(1) ) Assertion and Validation # // Simple assertion assert := method(condition, message, if(condition not, Exception raise(message ifNilEval(\u0026quot;Assertion failed\u0026quot;)) ) ) assert(5 \u0026gt; 3, \u0026quot;Math is broken\u0026quot;) // assert(3 \u0026gt; 5, \u0026quot;This will fail\u0026quot;) // Validation framework Validator := Object clone Validator rules := list() Validator addRule := method(rule, message, rules append(list(rule, message)) self ) Validator validate := method(value, errors := list() rules foreach(rule, if(rule at(0) call(value) not, errors append(rule at(1)) ) ) if(errors size \u0026gt; 0, ValidationError clone setMessage(errors join(\u0026quot;, \u0026quot;)) raise ) value ) // Usage ageValidator := Validator clone \\ addRule(block(v, v isKindOf(Number)), \u0026quot;Must be a number\u0026quot;) \\ addRule(block(v, v \u0026gt;= 0), \u0026quot;Must be non-negative\u0026quot;) \\ addRule(block(v, v \u0026lt;= 150), \u0026quot;Must be realistic\u0026quot;) try( ageValidator validate(25) println // 25 ageValidator validate(-5) // Throws ) catch(ValidationError, e, e message println // Must be non-negative ) Exception Context and Debugging # // Enhanced exception with context ContextualException := Exception clone ContextualException context := Map clone ContextualException addContext := method(key, value, context atPut(key, value) self ) ContextualException describe := method( result := message .. \u0026quot;\\nContext:\\n\u0026quot; context foreach(key, value, result = result .. \u0026quot; \u0026quot; .. key .. \u0026quot;: \u0026quot; .. value .. \u0026quot;\\n\u0026quot; ) result ) // Usage processUser := method(userData, if(userData at(\u0026quot;age\u0026quot;) \u0026lt; 18, ContextualException clone \\ setMessage(\u0026quot;User too young\u0026quot;) \\ addContext(\u0026quot;userId\u0026quot;, userData at(\u0026quot;id\u0026quot;)) \\ addContext(\u0026quot;age\u0026quot;, userData at(\u0026quot;age\u0026quot;)) \\ addContext(\u0026quot;timestamp\u0026quot;, Date now) \\ raise ) ) try( processUser(Map with(\u0026quot;id\u0026quot;, 123, \u0026quot;age\u0026quot;, 16)) ) catch(ContextualException, e, e describe println ) Resource Management # // RAII-style resource management withResource := method(resourceCreator, resourceUser, resource := nil try( resource = resourceCreator call resourceUser call(resource) ) finally( if(resource and resource hasSlot(\u0026quot;close\u0026quot;), resource close ) ) ) // Usage withResource( block(File with(\u0026quot;test.txt\u0026quot;) openForReading), block(file, file contents println ) ) // Database connection example withConnection := method(dbUrl, operation, conn := nil try( conn = Database connect(dbUrl) conn beginTransaction result := operation call(conn) conn commit result ) catch(Exception, e, if(conn, conn rollback) e raise ) finally( if(conn, conn close) ) ) Global Exception Handling # // Install global exception handler System handleException := method(e, logFile := File with(\u0026quot;errors.log\u0026quot;) openForAppending logFile write(Date now asString .. \u0026quot; - \u0026quot; .. e message .. \u0026quot;\\n\u0026quot;) logFile close // Original behavior e showStack System exit(1) ) // Uncaught exceptions now get logged // Exception raise(\u0026quot;Uncaught error\u0026quot;) Testing with Exceptions # // Test framework with exception support Test := Object clone Test assertRaises := method(exceptionType, block, raised := false try( block call ) catch(Exception, e, if(e type == exceptionType type, raised = true, Exception raise(\u0026quot;Wrong exception type: expected \u0026quot; .. exceptionType type .. \u0026quot;, got \u0026quot; .. e type) ) ) if(raised not, Exception raise(\u0026quot;Expected exception \u0026quot; .. exceptionType type .. \u0026quot; was not raised\u0026quot;) ) ) // Usage Test assertRaises(ValidationError, block( validateEmail(\u0026quot;invalid\u0026quot;) )) \u0026quot;Test passed\u0026quot; println Performance Considerations # // Exceptions have overhead benchmark := method(name, iterations, block, start := Date now iterations repeat(block) elapsed := Date now - start (name .. \u0026quot;: \u0026quot; .. elapsed) println ) // Without exceptions benchmark(\u0026quot;No exceptions\u0026quot;, 100000, block( if(Random value \u0026lt; 0.1, nil, \u0026quot;success\u0026quot;) )) // With exceptions benchmark(\u0026quot;With exceptions\u0026quot;, 100000, block( try( if(Random value \u0026lt; 0.1, Exception raise(\u0026quot;error\u0026quot;)) \u0026quot;success\u0026quot; ) catch(Exception, nil) )) // Exceptions are slower - use for exceptional cases, not control flow Common Pitfalls # Catching Too Broadly # // BAD: Catches everything, hiding bugs try( complexOperation() ) catch(Exception, e, // Silently ignore all errors ) // GOOD: Catch specific exceptions try( complexOperation() ) catch(NetworkError, e, handleNetworkError(e) ) catch(ValidationError, e, handleValidationError(e) ) Resource Leaks # // BAD: File not closed on error file := File with(\u0026quot;data.txt\u0026quot;) openForReading processFile(file) // If this throws, file never closes file close // GOOD: Use finally file := nil try( file = File with(\u0026quot;data.txt\u0026quot;) openForReading processFile(file) ) finally( if(file, file close) ) Exercises # Result Type: Implement a Result type that can be either Ok(value) or Error(error), similar to Rust.\nRetry with Exponential Backoff: Create a retry mechanism with exponential backoff and jitter.\nException Logger: Build a logging system that captures and categorizes exceptions.\nValidation Chain: Create a validation system that accumulates all errors instead of failing on first.\nAsync Exception Handling: Implement exception handling for coroutine-based async operations.\nReal-World Example: HTTP Client with Error Handling # HttpClient := Object clone HttpClient timeoutMs := 5000 HttpClient maxRetries := 3 HttpError := Exception clone HttpError statusCode := nil HttpClient get := method(url, retryCount := 0 loop( try( response := self doRequest(url) if(response statusCode \u0026gt;= 200 and response statusCode \u0026lt; 300, return response body ) if(response statusCode \u0026gt;= 400 and response statusCode \u0026lt; 500, // Client error - don't retry HttpError clone \\ setMessage(\u0026quot;HTTP \u0026quot; .. response statusCode) \\ setSlot(\u0026quot;statusCode\u0026quot;, response statusCode) \\ raise ) // Server error - might retry if(response statusCode \u0026gt;= 500, error := HttpError clone \\ setMessage(\u0026quot;Server error: \u0026quot; .. response statusCode) \\ setSlot(\u0026quot;statusCode\u0026quot;, response statusCode) if(retryCount \u0026lt; maxRetries, retryCount = retryCount + 1 delay := (2 pow(retryCount)) * 100 (\u0026quot;Retry \u0026quot; .. retryCount .. \u0026quot; after \u0026quot; .. delay .. \u0026quot;ms\u0026quot;) println wait(delay / 1000) continue, error raise ) ) ) catch(NetworkError, e, if(retryCount \u0026lt; maxRetries, retryCount = retryCount + 1 (\u0026quot;Network error, retry \u0026quot; .. retryCount) println wait(1) continue, e raise ) ) ) ) // Usage with comprehensive error handling fetchUserData := method(userId, try( data := HttpClient get(\u0026quot;https://api.example.com/users/\u0026quot; .. userId) JSON parse(data) ) catch(HttpError, e, if(e statusCode == 404, nil, // User not found if(e statusCode == 401, Exception raise(\u0026quot;Authentication required\u0026quot;), Exception raise(\u0026quot;HTTP error: \u0026quot; .. e statusCode) ) ) ) catch(NetworkError, e, Exception raise(\u0026quot;Network unavailable\u0026quot;) ) catch(Exception, e, Exception raise(\u0026quot;Unexpected error: \u0026quot; .. e message) ) ) Conclusion # Io\u0026rsquo;s exception system demonstrates the language\u0026rsquo;s consistency: exceptions are objects, throwing is a message, and catching is a method. This uniformity makes the system easy to understand while remaining powerful enough for sophisticated error handling.\nThe key to effective exception handling in Io is understanding when to use exceptions (for exceptional circumstances) versus return values (for expected conditions), and ensuring proper resource cleanup with finally blocks. Custom exception types and contextual information make debugging easier, while patterns like retry logic and circuit breakers add robustness to applications.\n"},{"id":13,"href":"/docs/11-metaprogramming/","title":"Metaprogramming","section":"Chapters","content":" Chapter 11: Metaprogramming # Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io\u0026rsquo;s powerful metaprogramming capabilities.\nMessages as Data # In Io, code is data. Messages are objects you can create, inspect, and manipulate:\n// Create a message from code msg := message(2 + 3 * 4) // Inspect its structure msg println // 2 +(3 *(4)) msg name println // + msg arguments println // list(Message_0x...) msg arguments at(0) println // 3 *(4) // Evaluate it result := msg doInContext(Lobby) result println // 14 // Modify it msg setName(\u0026quot;*\u0026quot;) msg doInContext(Lobby) println // 6 (now it's 2 * 3 * 4) Compare this to Lisp\u0026rsquo;s code-as-data philosophy:\n; Lisp (defparameter code '(+ 2 (* 3 4))) (eval code) ; 14 But Io uses messages instead of lists, which feels more natural for object-oriented code.\nBuilding Messages Programmatically # // Build a message from scratch msg := Message clone msg setName(\u0026quot;println\u0026quot;) msg setArguments(list(Message clone setName(\u0026quot;\\\u0026quot;Hello, World!\\\u0026quot;\u0026quot;))) // Execute it Lobby doMessage(msg) // Hello, World! // Build more complex messages createAdder := method(n, msg := Message clone setName(\u0026quot;+\u0026quot;) msg setArguments(list(Message clone setName(n asString))) msg ) adder5 := createAdder(5) 7 doMessage(adder5) println // 12 Method Introspection # Methods are objects you can examine and modify:\nobj := Object clone obj greet := method(name, \u0026quot;Hello, \u0026quot; .. name .. \u0026quot;!\u0026quot;) // Get the method object m := obj getSlot(\u0026quot;greet\u0026quot;) m type println // Block m argumentNames println // list(name) m code println // \u0026quot;Hello, \u0026quot; ..(name) ..(\u0026quot;!\u0026quot;) // Modify method implementation obj greet = method(name, \u0026quot;Goodbye, \u0026quot; .. name .. \u0026quot;!\u0026quot;) obj greet(\u0026quot;World\u0026quot;) println // Goodbye, World! // Copy methods between objects other := Object clone other sayHi := obj getSlot(\u0026quot;greet\u0026quot;) other sayHi(\u0026quot;Io\u0026quot;) println // Goodbye, Io! The call Object # The call object provides runtime context information:\nObject introspect := method( \u0026quot;=== Call Introspection ===\u0026quot; println (\u0026quot;Sender: \u0026quot; .. call sender type) println (\u0026quot;Target: \u0026quot; .. call target type) println (\u0026quot;Message: \u0026quot; .. call message) println (\u0026quot;Arguments: \u0026quot; .. call message arguments) println (\u0026quot;Activated: \u0026quot; .. call activated) println \u0026quot;========================\u0026quot; println ) TestObj := Object clone TestObj test := method(a, b, introspect a + b ) TestObj test(5, 3) // === Call Introspection === // Sender: Lobby // Target: TestObj // Message: introspect // Arguments: list() // Activated: method(...) // ======================== Dynamic Method Creation # Create methods at runtime:\n// Create getters and setters dynamically Object addProperty := method(name, defaultValue, // Create storage slot self setSlot(\u0026quot;_\u0026quot; .. name, defaultValue) // Create getter self setSlot(name, method(self getSlot(\u0026quot;_\u0026quot; .. call message name)) ) // Create setter self setSlot(\u0026quot;set\u0026quot; .. name asCapitalized, method(value, self setSlot(\u0026quot;_\u0026quot; .. call message name beforeSeq(\u0026quot;set\u0026quot;) asLowercase, value) self // For chaining ) ) ) Person := Object clone Person addProperty(\u0026quot;name\u0026quot;, \u0026quot;Unknown\u0026quot;) Person addProperty(\u0026quot;age\u0026quot;, 0) p := Person clone p setName(\u0026quot;Alice\u0026quot;) setAge(30) p name println // Alice p age println // 30 Method Missing Pattern # Intercept undefined method calls:\nDynamicObject := Object clone DynamicObject forward := method( messageName := call message name args := call message arguments (\u0026quot;Intercepted: \u0026quot; .. messageName) println (\u0026quot;Arguments: \u0026quot; .. args) println // Handle dynamically if(messageName beginsWithSeq(\u0026quot;get\u0026quot;), property := messageName afterSeq(\u0026quot;get\u0026quot;) asLowercase return self getSlot(property) ) if(messageName beginsWithSeq(\u0026quot;set\u0026quot;), property := messageName afterSeq(\u0026quot;set\u0026quot;) asLowercase value := call evalArgAt(0) return self setSlot(property, value) ) Exception raise(\u0026quot;Unknown method: \u0026quot; .. messageName) ) obj := DynamicObject clone obj setName(\u0026quot;Bob\u0026quot;) // Intercepted: setName obj getName println // Bob Code Generation # Generate code as strings and evaluate:\n// Generate a class-like structure generateClass := method(className, properties, code := className .. \u0026quot; := Object clone\\n\u0026quot; // Generate init method code = code .. className .. \u0026quot; init := method(\\n\u0026quot; properties foreach(prop, code = code .. \u0026quot; self \u0026quot; .. prop .. \u0026quot; := nil\\n\u0026quot; ) code = code .. \u0026quot; self\\n)\\n\u0026quot; // Generate property accessors properties foreach(prop, // Getter code = code .. className .. \u0026quot; \u0026quot; .. prop .. \u0026quot; := method(_\u0026quot; .. prop .. \u0026quot;)\\n\u0026quot; // Setter code = code .. className .. \u0026quot; set\u0026quot; .. prop asCapitalized .. \u0026quot; := method(v, _\u0026quot; .. prop .. \u0026quot; = v; self)\\n\u0026quot; ) code doString // Evaluate the generated code Lobby getSlot(className) // Return the created object ) // Use the generator Car := generateClass(\u0026quot;Car\u0026quot;, list(\u0026quot;make\u0026quot;, \u0026quot;model\u0026quot;, \u0026quot;year\u0026quot;)) myCar := Car clone init myCar setMake(\u0026quot;Toyota\u0026quot;) setModel(\u0026quot;Camry\u0026quot;) setYear(2020) myCar make println // Toyota Aspect-Oriented Programming # Implement cross-cutting concerns:\n// Method wrapping for logging Object addLogging := method(methodName, original := self getSlot(methodName) self setSlot(methodName, method( (\u0026quot;Calling \u0026quot; .. methodName .. \u0026quot; with args: \u0026quot; .. call message arguments) println result := nil e := try(result = original doMessage(call message, call sender)) if(e, (\u0026quot;Error in \u0026quot; .. methodName .. \u0026quot;: \u0026quot; .. e message) println e raise, (\u0026quot;Returned: \u0026quot; .. result) println result ) )) ) Calculator := Object clone Calculator add := method(a, b, a + b) Calculator divide := method(a, b, a / b) Calculator addLogging(\u0026quot;add\u0026quot;) Calculator addLogging(\u0026quot;divide\u0026quot;) Calculator add(5, 3) // Calling add with args: list(5, 3) // Returned: 8 Calculator divide(10, 0) // Calling divide with args: list(10, 0) // Error in divide: divide by zero Macro System # Io\u0026rsquo;s macros transform code before evaluation:\n// Define a macro Object unless := macro(condition, action, // Macros receive unevaluated arguments as messages // Transform to if(condition not, action) message(if) setArguments( list( message(not) setTarget(condition), action ) ) ) // Use the macro x := 5 unless(x \u0026gt; 10, \u0026quot;x is not greater than 10\u0026quot; println) // x is not greater than 10 // Timing macro Object time := macro(code, // Generate timing code message(do) setArguments(list( message(start := Date now), code, message(elapsed := Date now - start), message((\u0026quot;Elapsed: \u0026quot; .. elapsed) println), message(result) )) ) // Use it time( sum := 0 for(i, 1, 1000000, sum = sum + i) sum ) // Elapsed: 0.234 Self-Modifying Code # Objects can modify their own methods:\nCounter := Object clone Counter count := 0 Counter increment := method( count = count + 1 // Self-modify after 5 calls if(count \u0026gt;= 5, self increment = method( Exception raise(\u0026quot;Counter limit reached\u0026quot;) ) ) count ) c := Counter clone 5 repeat(i, c increment println) // 1, 2, 3, 4, 5 c increment // Exception: Counter limit reached Reflection API # Io provides comprehensive reflection capabilities:\n// Object introspection utilities Object describe := method( (\u0026quot;Type: \u0026quot; .. self type) println \u0026quot;Local Slots:\u0026quot; println self slotNames sort foreach(name, value := self getSlot(name) (\u0026quot; \u0026quot; .. name .. \u0026quot; = \u0026quot; .. value type) println ) \u0026quot;Proto chain:\u0026quot; println proto := self proto while(proto and proto != Object, (\u0026quot; -\u0026gt; \u0026quot; .. proto type) println proto = proto proto ) ) // Usage person := Object clone person name := \u0026quot;Alice\u0026quot; person age := 30 person greet := method(\u0026quot;Hello!\u0026quot;) person describe // Type: Object // Local Slots: // age = Number // greet = Block // name = Sequence // Proto chain: // -\u0026gt; Object DSL Creation with Metaprogramming # Build domain-specific languages:\n// SQL-like DSL Table := Object clone Table columns := list() Table rows := list() Table select := method( query := SelectQuery clone query table := self query ) SelectQuery := Object clone SelectQuery conditions := list() SelectQuery where := method( // Parse conditions from arguments args := call message arguments args foreach(arg, conditions append(arg) ) self ) SelectQuery execute := method( table rows select(row, result := true conditions foreach(cond, result = result and cond doInContext(row) ) result ) ) // Usage users := Table clone users columns = list(\u0026quot;name\u0026quot;, \u0026quot;age\u0026quot;, \u0026quot;city\u0026quot;) users rows = list( Object clone do(name := \u0026quot;Alice\u0026quot;; age := 30; city := \u0026quot;NYC\u0026quot;), Object clone do(name := \u0026quot;Bob\u0026quot;; age := 25; city := \u0026quot;LA\u0026quot;), Object clone do(name := \u0026quot;Charlie\u0026quot;; age := 35; city := \u0026quot;NYC\u0026quot;) ) results := users select where(age \u0026gt; 25, city == \u0026quot;NYC\u0026quot;) execute results foreach(r, (r name .. \u0026quot;: \u0026quot; .. r age) println) // Alice: 30 // Charlie: 35 Performance Profiling # Use metaprogramming for profiling:\nProfiler := Object clone Profiler stats := Map clone Object profile := method(methodName, original := self getSlot(methodName) self setSlot(methodName, method( start := Date now result := original doMessage(call message, call sender) elapsed := Date now - start key := self type .. \u0026quot;::\u0026quot; .. methodName if(Profiler stats hasKey(key) not, Profiler stats atPut(key, list(0, 0)) ) stats := Profiler stats at(key) stats atPut(0, stats at(0) + 1) // Count stats atPut(1, stats at(1) + elapsed) // Total time result )) ) Profiler report := method( \u0026quot;=== Profiling Report ===\u0026quot; println stats foreach(key, data, avg := data at(1) / data at(0) (key .. \u0026quot;: \u0026quot; .. data at(0) .. \u0026quot; calls, \u0026quot; .. data at(1) .. \u0026quot;s total, \u0026quot; .. avg .. \u0026quot;s avg\u0026quot;) println ) ) // Usage Math := Object clone Math factorial := method(n, if(n \u0026lt;= 1, 1, n * factorial(n - 1)) ) Math profile(\u0026quot;factorial\u0026quot;) 10 repeat(Math factorial(20)) Profiler report Compile-Time Computation # Use macros for compile-time optimization:\n// Macro that pre-computes constant expressions Object precompute := macro(expr, // If expression contains only literals, evaluate now result := nil e := try(result = expr doInContext(Object clone)) if(e isNil, // Successfully evaluated - return literal Message clone setName(result asString), // Contains variables - return original expr ) ) // Usage x := 10 y := precompute(5 * 6 + 7) // Computed at parse time z := precompute(x * 2) // Can't precompute, has variable y println // 37 (was precomputed) Method Combination # Implement method combination patterns:\n// Before/After/Around methods Object addBefore := method(methodName, beforeBlock, original := self getSlot(methodName) self setSlot(methodName, method( beforeBlock doMessage(call message, call sender) original doMessage(call message, call sender) )) ) Object addAfter := method(methodName, afterBlock, original := self getSlot(methodName) self setSlot(methodName, method( result := original doMessage(call message, call sender) afterBlock call(result) result )) ) Object addAround := method(methodName, aroundBlock, original := self getSlot(methodName) self setSlot(methodName, method( aroundBlock call(original, call message, call sender) )) ) // Usage BankAccount := Object clone BankAccount balance := 100 BankAccount withdraw := method(amount, balance = balance - amount) BankAccount addBefore(\u0026quot;withdraw\u0026quot;, method(amount, (\u0026quot;Withdrawing \u0026quot; .. amount) println )) BankAccount addAfter(\u0026quot;withdraw\u0026quot;, method(result, (\u0026quot;New balance: \u0026quot; .. balance) println )) BankAccount addAround(\u0026quot;withdraw\u0026quot;, method(original, msg, sender, amount := msg argAt(0) doInContext(sender) if(amount \u0026gt; balance, Exception raise(\u0026quot;Insufficient funds\u0026quot;), original doMessage(msg, sender) ) )) account := BankAccount clone account withdraw(50) // Withdrawing 50 // New balance: 50 Common Pitfalls # Evaluation Context # // PROBLEM: Wrong context makeMethod := method(code, method doString(code) // code evaluates in method's context ) obj := Object clone obj value := 10 obj badMethod := makeMethod(\u0026quot;value * 2\u0026quot;) // obj badMethod // Error: value not found // SOLUTION: Use message objects makeMethod := method(code, method(code doInContext(self)) ) Performance Impact # // Metaprogramming has runtime cost directCall := method(x, x * 2) dynamicCall := method(x, msg := Message clone setName(\u0026quot;*\u0026quot;) setArguments(list(Message clone setName(\u0026quot;2\u0026quot;))) x doMessage(msg) ) // directCall is much faster than dynamicCall Exercises # Memoization Decorator: Create a decorator that automatically memoizes any method.\nContract System: Implement Design by Contract with pre/post conditions.\nMock Object Generator: Build a system that generates mock objects for testing.\nDependency Injection: Create a DI container using metaprogramming.\nORM: Build a simple object-relational mapper that generates methods from table schemas.\nReal-World Example: ActiveRecord Pattern # // Simple ActiveRecord implementation ActiveRecord := Object clone ActiveRecord tableName := nil ActiveRecord connection := nil // Database connection ActiveRecord findById := method(id, sql := \u0026quot;SELECT * FROM \u0026quot; .. tableName .. \u0026quot; WHERE id = \u0026quot; .. id row := connection execute(sql) first if(row, obj := self clone row foreach(column, value, obj setSlot(column, value) ) obj ) ) ActiveRecord save := method( if(hasSlot(\u0026quot;id\u0026quot;), // Update sql := \u0026quot;UPDATE \u0026quot; .. tableName .. \u0026quot; SET \u0026quot; updates := list() slotNames foreach(name, if(name != \u0026quot;id\u0026quot;, updates append(name .. \u0026quot; = '\u0026quot; .. getSlot(name) .. \u0026quot;'\u0026quot;) ) ) sql = sql .. updates join(\u0026quot;, \u0026quot;) .. \u0026quot; WHERE id = \u0026quot; .. id , // Insert sql := \u0026quot;INSERT INTO \u0026quot; .. tableName columns := list() values := list() slotNames foreach(name, columns append(name) values append(\u0026quot;'\u0026quot; .. getSlot(name) .. \u0026quot;'\u0026quot;) ) sql = sql .. \u0026quot; (\u0026quot; .. columns join(\u0026quot;, \u0026quot;) .. \u0026quot;) VALUES (\u0026quot; .. values join(\u0026quot;, \u0026quot;) .. \u0026quot;)\u0026quot; ) connection execute(sql) self ) // Generate model from table generateModel := method(name, table, columns, model := ActiveRecord clone model type := name model tableName = table // Add properties columns foreach(column, model setSlot(column, nil) ) // Add validations model validate := method( // Generated validation code true ) // Store in Lobby Lobby setSlot(name, model) model ) // Usage User := generateModel(\u0026quot;User\u0026quot;, \u0026quot;users\u0026quot;, list(\u0026quot;id\u0026quot;, \u0026quot;name\u0026quot;, \u0026quot;email\u0026quot;, \u0026quot;age\u0026quot;)) user := User clone user name = \u0026quot;Alice\u0026quot; user email = \u0026quot;alice@example.com\u0026quot; user age = 30 // user save foundUser := User findById(1) Conclusion # Metaprogramming in Io isn\u0026rsquo;t a special feature—it\u0026rsquo;s a natural consequence of the language\u0026rsquo;s design. When everything is an object, including code itself, manipulation becomes straightforward. Messages as first-class objects, comprehensive reflection, and runtime modification enable powerful patterns that would require complex machinery in other languages.\nThe key to effective metaprogramming in Io is understanding that you\u0026rsquo;re not working with special metaprogramming constructs, but simply manipulating objects that happen to represent code. This uniformity makes metaprogramming accessible and powerful, though it requires careful consideration of evaluation contexts and performance implications.\n"},{"id":14,"href":"/docs/12-concurrency/","title":"Concurrency","section":"Chapters","content":" Chapter 12: Concurrency # Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io.\nCoroutines: Cooperative Multitasking # Coroutines are the foundation of Io\u0026rsquo;s concurrency model. They\u0026rsquo;re lightweight threads that yield control cooperatively:\n// Create a coroutine coro := coroutine( 5 repeat(i, (\u0026quot;Coroutine: \u0026quot; .. i) println yield // Give control back ) ) // Run it 5 repeat( \u0026quot;Main\u0026quot; println coro resume // Resume the coroutine ) // Output interleaves Main and Coroutine messages Compare with threads in other languages:\n# Python with threads (preemptive) import threading def worker(): for i in range(5): print(f\u0026quot;Thread: {i}\u0026quot;) # No explicit yield needed # Python with async (cooperative) async def worker(): for i in range(5): print(f\u0026quot;Coroutine: {i}\u0026quot;) await asyncio.sleep(0) # Explicit yield Creating and Managing Coroutines # // Basic coroutine creation coro := Coroutine clone coro setRunMessage(message( \u0026quot;Running in coroutine\u0026quot; println self // Return value )) coro resume println // \u0026quot;Running in coroutine\u0026quot;, then returns self // Using @ for async execution future := obj @method(arg) // Runs method in new coroutine result := future resolve // Wait for result // Coroutine with arguments producer := coroutine( 10 repeat(i, yield(i * i) // Yield a value ) ) 5 repeat( producer resume println // 0, 1, 4, 9, 16 ) Actors: Message-Passing Concurrency # Actors are objects that process messages asynchronously in their own coroutine:\n// Create an actor Counter := Object clone Counter count := 0 Counter increment := method( count = count + 1 count ) // Make it an actor counter := Counter clone counterActor := counter @ // @ makes it an actor // Send messages asynchronously future1 := counterActor increment future2 := counterActor increment future3 := counterActor increment // Get results future1 resolve println // 1 future2 resolve println // 2 future3 resolve println // 3 This is similar to Erlang\u0026rsquo;s actor model:\n% Erlang counter(Count) -\u0026gt; receive {increment, From} -\u0026gt; From ! Count + 1, counter(Count + 1) end. Futures and Promises # Futures represent values that will be available later:\n// Create a future manually future := Future clone // In another coroutine, fulfill it @( wait(1) // Simulate work future setResult(42) ) // Wait for result \u0026quot;Waiting...\u0026quot; println result := future resolve (\u0026quot;Got result: \u0026quot; .. result) println // Got result: 42 // Futures from async calls slowOperation := method(n, wait(n) n * 2 ) f := self @slowOperation(2) \u0026quot;Doing other work...\u0026quot; println result := f resolve result println // 4 Channels for Communication # Implement Go-style channels:\nChannel := Object clone Channel init := method( self queue := list() self waiters := list() self ) Channel send := method(value, if(waiters size \u0026gt; 0, waiter := waiters removeFirst waiter resume(value), queue append(value) ) ) Channel receive := method( if(queue size \u0026gt; 0, queue removeFirst, waiters append(Coroutine currentCoroutine) Coroutine currentCoroutine pause ) ) // Usage ch := Channel clone init // Producer @( 5 repeat(i, ch send(i * i) wait(0.1) ) ) // Consumer @( 5 repeat( value := ch receive (\u0026quot;Received: \u0026quot; .. value) println ) ) wait(1) // Let them run Synchronization Primitives # Mutex (Mutual Exclusion) # Mutex := Object clone Mutex locked := false Mutex waitQueue := list() Mutex lock := method( while(locked, waitQueue append(Coroutine currentCoroutine) Coroutine currentCoroutine pause ) locked = true ) Mutex unlock := method( locked = false if(waitQueue size \u0026gt; 0, waiter := waitQueue removeFirst waiter resume ) ) Mutex synchronize := method(block, lock e := try(result := block call) unlock if(e, e raise, result) ) // Usage sharedCounter := 0 mutex := Mutex clone 10 repeat( @( mutex synchronize( temp := sharedCounter yield // Simulate race condition sharedCounter = temp + 1 ) ) ) wait(0.5) sharedCounter println // 10 (without mutex would be unpredictable) Semaphore # Semaphore := Object clone Semaphore init := method(permits, self permits := permits self waitQueue := list() self ) Semaphore acquire := method( while(permits \u0026lt;= 0, waitQueue append(Coroutine currentCoroutine) Coroutine currentCoroutine pause ) permits = permits - 1 ) Semaphore release := method( permits = permits + 1 if(waitQueue size \u0026gt; 0, waiter := waitQueue removeFirst waiter resume ) ) // Usage: Limit concurrent connections connectionPool := Semaphore clone init(3) 10 repeat(i, @( connectionPool acquire (\u0026quot;Connection \u0026quot; .. i .. \u0026quot; started\u0026quot;) println wait(Random value) (\u0026quot;Connection \u0026quot; .. i .. \u0026quot; finished\u0026quot;) println connectionPool release ) ) wait(3) Concurrent Collections # // Thread-safe list ConcurrentList := List clone ConcurrentList mutex := Mutex clone ConcurrentList append := method(item, mutex synchronize(resend(item)) ) ConcurrentList at := method(index, mutex synchronize(resend(index)) ) ConcurrentList size := method( mutex synchronize(resend) ) // Usage list := ConcurrentList clone 10 repeat(i, @(list append(i)) ) wait(0.1) list size println // 10 Worker Pool Pattern # WorkerPool := Object clone WorkerPool init := method(workerCount, self workers := list() self taskQueue := Channel clone init self results := Channel clone init workerCount repeat( worker := @( loop( task := taskQueue receive if(task isNil, break) // Poison pill result := task call results send(result) ) ) workers append(worker) ) self ) WorkerPool submit := method(task, taskQueue send(task) ) WorkerPool shutdown := method( workers size repeat(taskQueue send(nil)) ) WorkerPool getResult := method( results receive ) // Usage pool := WorkerPool clone init(4) // Submit tasks 10 repeat(i, pool submit(block( wait(Random value * 0.1) i * i )) ) // Collect results results := list() 10 repeat( results append(pool getResult) ) pool shutdown results println Async/Await Pattern # // Implement async/await style Object async := method( future := Future clone @( e := try(result := call activated doMessage(call message, call sender)) if(e, future setException(e), future setResult(result) ) ) future ) Object await := method(future, future resolve ) // Usage fetchData := async method(url, wait(1) // Simulate network delay \u0026quot;Data from \u0026quot; .. url ) processData := async method( data1 := await(fetchData(\u0026quot;api/users\u0026quot;)) data2 := await(fetchData(\u0026quot;api/posts\u0026quot;)) data1 .. \u0026quot; + \u0026quot; .. data2 ) result := await(processData) result println // Data from api/users + Data from api/posts Parallel Map # List parallelMap := method(block, futures := self map(item, self @(block call(item)) ) futures map(resolve) ) // Usage numbers := list(1, 2, 3, 4, 5) // Sequential map time( sequential := numbers map(n, wait(0.1) n * n ) ) // Parallel map time( parallel := numbers parallelMap(n, wait(0.1) n * n ) ) sequential println // list(1, 4, 9, 16, 25) parallel println // list(1, 4, 9, 16, 25) but faster Deadlock Detection # DeadlockDetector := Object clone DeadlockDetector init := method( self resources := Map clone self waitGraph := Map clone self ) DeadlockDetector requestResource := method(coroutine, resource, // Add to wait graph if(resources hasKey(resource), owner := resources at(resource) if(owner != coroutine, waitGraph atPut(coroutine, resource) // Check for cycle if(hasCycle(coroutine), Exception raise(\u0026quot;Deadlock detected!\u0026quot;) ) ) ) ) DeadlockDetector hasCycle := method(start, // Simplified cycle detection visited := list() current := start while(waitGraph hasKey(current), if(visited contains(current), return true) visited append(current) resource := waitGraph at(current) if(resources hasKey(resource), current = resources at(resource) , break ) ) false ) Event Loop # EventLoop := Object clone EventLoop init := method( self events := list() self running := true self ) EventLoop schedule := method(delay, block, events append(list(Date now + delay, block)) events sortInPlaceBy(block(e, e at(0))) ) EventLoop run := method( while(running and events size \u0026gt; 0, now := Date now while(events size \u0026gt; 0 and events first at(0) \u0026lt;= now, event := events removeFirst event at(1) @call ) if(events size \u0026gt; 0, wait((events first at(0) - now) max(0)) ) ) ) EventLoop stop := method(running = false) // Usage loop := EventLoop clone init loop schedule(0.1, block(\u0026quot;First\u0026quot; println)) loop schedule(0.2, block(\u0026quot;Second\u0026quot; println)) loop schedule(0.15, block(\u0026quot;Between\u0026quot; println)) loop run Common Patterns # Producer-Consumer # Buffer := Object clone Buffer init := method(capacity, self items := list() self capacity := capacity self notFull := Semaphore clone init(capacity) self notEmpty := Semaphore clone init(0) self mutex := Mutex clone self ) Buffer put := method(item, notFull acquire mutex synchronize(items append(item)) notEmpty release ) Buffer get := method( notEmpty acquire item := mutex synchronize(items removeFirst) notFull release item ) // Usage buffer := Buffer clone init(5) // Producer @( 10 repeat(i, (\u0026quot;Producing \u0026quot; .. i) println buffer put(i) wait(Random value * 0.1) ) ) // Consumer @( 10 repeat( item := buffer get (\u0026quot;Consumed \u0026quot; .. item) println wait(Random value * 0.2) ) ) wait(3) Fork-Join # Object forkJoin := method(tasks, futures := tasks map(task, @(task call) ) futures map(resolve) ) // Parallel quicksort quicksort := method(list, if(list size \u0026lt;= 1, return list) pivot := list at(list size / 2) results := forkJoin(list( block(list select(x, x \u0026lt; pivot) quicksort), block(list select(x, x == pivot)), block(list select(x, x \u0026gt; pivot) quicksort) )) results at(0) appendSeq(results at(1)) appendSeq(results at(2)) ) sorted := quicksort(list(3, 1, 4, 1, 5, 9, 2, 6)) sorted println // list(1, 1, 2, 3, 4, 5, 6, 9) Performance Considerations # // Coroutines are lightweight time( coroutines := list() 1000 repeat(i, coroutines append(@(i * i)) ) coroutines map(resolve) ) // But context switching has overhead benchmarkConcurrency := method(taskCount, taskWork, // Sequential seqTime := time( taskCount repeat(i, taskWork call(i)) ) // Concurrent concTime := time( futures := list() taskCount repeat(i, futures append(@(taskWork call(i))) ) futures map(resolve) ) (\u0026quot;Sequential: \u0026quot; .. seqTime) println (\u0026quot;Concurrent: \u0026quot; .. concTime) println (\u0026quot;Speedup: \u0026quot; .. (seqTime / concTime)) println ) // Light work - concurrency overhead dominates benchmarkConcurrency(100, block(i, i * i)) // Heavy work - concurrency helps benchmarkConcurrency(10, block(i, sum := 0 10000 repeat(j, sum = sum + j) sum )) Exercises # Rate Limiter: Implement a rate limiter that allows N operations per second.\nParallel Reduce: Create a parallel version of reduce that divides work among workers.\nActor Supervisor: Build a supervisor that restarts failed actors.\nCSP Channels: Implement Communicating Sequential Processes with select statement.\nSTM: Implement Software Transactional Memory for conflict-free concurrent updates.\nReal-World Example: Web Scraper # WebScraper := Object clone WebScraper init := method(maxConcurrent, self semaphore := Semaphore clone init(maxConcurrent) self visited := ConcurrentSet clone init self results := ConcurrentList clone self ) WebScraper scrape := method(urls, futures := list() urls foreach(url, if(visited contains(url) not, visited add(url) future := @( semaphore acquire e := try( (\u0026quot;Scraping \u0026quot; .. url) println // Simulate HTTP request wait(Random value) content := \u0026quot;Content from \u0026quot; .. url results append(Map with(\u0026quot;url\u0026quot;, url, \u0026quot;content\u0026quot;, content)) // Find more URLs (simplified) if(Random value \u0026lt; 0.3, newUrl := url .. \u0026quot;/\u0026quot; .. Random value round self scrape(list(newUrl)) ) ) semaphore release if(e, (\u0026quot;Error scraping \u0026quot; .. url .. \u0026quot;: \u0026quot; .. e message) println) ) futures append(future) ) ) futures map(resolve) self ) // Usage scraper := WebScraper clone init(3) scraper scrape(list( \u0026quot;https://example.com\u0026quot;, \u0026quot;https://example.org\u0026quot;, \u0026quot;https://example.net\u0026quot; )) wait(2) (\u0026quot;Scraped \u0026quot; .. scraper results size .. \u0026quot; pages\u0026quot;) println Conclusion # Io\u0026rsquo;s concurrency model, built on coroutines, actors, and futures, provides powerful abstractions for concurrent programming. The cooperative nature of coroutines gives you fine control over scheduling, while actors provide isolation and message-passing safety. Futures enable asynchronous programming patterns familiar from other languages.\nThe beauty of Io\u0026rsquo;s approach is that these concurrency primitives are implemented using the same object model as everything else. Coroutines are objects, messages can be sent asynchronously with @, and synchronization primitives can be built from basic objects and messages. This consistency makes concurrent programming in Io both powerful and comprehensible.\n"},{"id":15,"href":"/docs/13-domain-specific-languages/","title":"Domain-Specific Languages","section":"Chapters","content":" Chapter 13: Domain-Specific Languages # Io\u0026rsquo;s minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains.\nWhy Io Excels at DSLs # Several features make Io particularly suitable for DSLs:\nMinimal syntax - Less language machinery to work around Optional parentheses - Clean, readable DSL code Message chains - Natural expression of domain concepts Runtime flexibility - Modify behavior on the fly Homoiconicity - Code as manipulable data Compare a hypothetical DSL in Io vs Ruby:\n// Io DSL - clean, minimal recipe \u0026quot;Chocolate Cake\u0026quot; makes(8) servings { ingredient \u0026quot;flour\u0026quot; amount(2) cups ingredient \u0026quot;sugar\u0026quot; amount(1.5) cups step \u0026quot;Mix dry ingredients\u0026quot; step \u0026quot;Add wet ingredients\u0026quot; bake at(350) degrees for(30) minutes } # Ruby DSL - more syntax artifacts recipe \u0026quot;Chocolate Cake\u0026quot; do makes 8.servings ingredient \u0026quot;flour\u0026quot;, amount: 2.cups ingredient \u0026quot;sugar\u0026quot;, amount: 1.5.cups step \u0026quot;Mix dry ingredients\u0026quot; step \u0026quot;Add wet ingredients\u0026quot; bake at: 350.degrees, for: 30.minutes end Building Your First DSL # Let\u0026rsquo;s create a simple configuration DSL:\n// Define the DSL Config := Object clone Config settings := Map clone Config set := method(key, value, settings atPut(key asString, value) self // For chaining ) Config get := method(key, settings at(key asString) ) Config section := method(name, sec := Config clone settings atPut(name asString, sec) sec ) // Use the DSL config := Config clone config set(\u0026quot;host\u0026quot;, \u0026quot;localhost\u0026quot;) \\ set(\u0026quot;port\u0026quot;, 8080) \\ section(\u0026quot;database\u0026quot;) \\ set(\u0026quot;driver\u0026quot;, \u0026quot;postgresql\u0026quot;) \\ set(\u0026quot;name\u0026quot;, \u0026quot;myapp\u0026quot;) config get(\u0026quot;host\u0026quot;) println // localhost config get(\u0026quot;database\u0026quot;) get(\u0026quot;driver\u0026quot;) println // postgresql HTML Builder DSL # A more complex example - generating HTML:\nHTML := Object clone // Handle any tag name via forward HTML forward := method( tagName := call message name attributes := Map clone children := list() // Process arguments call message arguments foreach(arg, argValue := call sender doMessage(arg) if(argValue type == \u0026quot;Map\u0026quot;, // It's attributes attributes = argValue , // It's content or children if(argValue type == \u0026quot;Sequence\u0026quot;, children append(argValue), if(argValue type == \u0026quot;List\u0026quot;, children appendSeq(argValue), children append(argValue asString) ) ) ) ) // Build HTML result := \u0026quot;\u0026lt;\u0026quot; .. tagName attributes foreach(key, value, result = result .. \u0026quot; \u0026quot; .. key .. \u0026quot;=\\\u0026quot;\u0026quot; .. value .. \u0026quot;\\\u0026quot;\u0026quot; ) if(children size == 0, result = result .. \u0026quot; /\u0026gt;\u0026quot;, result = result .. \u0026quot;\u0026gt;\u0026quot; children foreach(child, result = result .. child) result = result .. \u0026quot;\u0026lt;/\u0026quot; .. tagName .. \u0026quot;\u0026gt;\u0026quot; ) result ) // Helper for attributes Object attrs := method( args := call message arguments map := Map clone args foreach(arg, pair := arg name split(\u0026quot;:\u0026quot;) if(pair size == 2, map atPut(pair at(0), call sender doMessage(arg arguments at(0))) ) ) map ) // Usage html := HTML clone page := html div(attrs(class: \u0026quot;container\u0026quot;, id: \u0026quot;main\u0026quot;), html h1(\u0026quot;Welcome to My Site\u0026quot;), html p(attrs(class: \u0026quot;intro\u0026quot;), \u0026quot;This is a paragraph with \u0026quot;, html strong(\u0026quot;bold text\u0026quot;), \u0026quot; in it.\u0026quot; ), html ul( html li(\u0026quot;First item\u0026quot;), html li(\u0026quot;Second item\u0026quot;), html li(\u0026quot;Third item\u0026quot;) ) ) page println // \u0026lt;div class=\u0026quot;container\u0026quot; id=\u0026quot;main\u0026quot;\u0026gt;\u0026lt;h1\u0026gt;Welcome to My Site\u0026lt;/h1\u0026gt;... SQL Query Builder # Query := Object clone Query init := method( self selections := list(\u0026quot;*\u0026quot;) self tables := list() self conditions := list() self joins := list() self ) Query select := method( self selections = call message arguments map(arg, call sender doMessage(arg) asString ) self ) Query from := method(table, tables append(table) self ) Query where := method( condition := call argAt(0) conditions append(condition code asString) self ) Query join := method(table, on, joins append(\u0026quot;JOIN \u0026quot; .. table .. \u0026quot; ON \u0026quot; .. on code asString) self ) Query toSQL := method( sql := \u0026quot;SELECT \u0026quot; .. selections join(\u0026quot;, \u0026quot;) sql = sql .. \u0026quot; FROM \u0026quot; .. tables join(\u0026quot;, \u0026quot;) if(joins size \u0026gt; 0, sql = sql .. \u0026quot; \u0026quot; .. joins join(\u0026quot; \u0026quot;) ) if(conditions size \u0026gt; 0, sql = sql .. \u0026quot; WHERE \u0026quot; .. conditions join(\u0026quot; AND \u0026quot;) ) sql ) // Usage query := Query clone init sql := query select(\u0026quot;name\u0026quot;, \u0026quot;age\u0026quot;, \u0026quot;email\u0026quot;) \\ from(\u0026quot;users\u0026quot;) \\ join(\u0026quot;profiles\u0026quot;, users.id == profiles.user_id) \\ where(age \u0026gt; 18) \\ where(status == \u0026quot;active\u0026quot;) \\ toSQL sql println // SELECT name, age, email FROM users JOIN profiles ON users.id == profiles.user_id WHERE age \u0026gt; 18 AND status == \u0026quot;active\u0026quot; Unit Testing DSL # TestSuite := Object clone TestSuite tests := list() TestSuite currentTest := nil TestSuite describe := method(description, suite := TestSuite clone suite description := description suite tests = list() # Execute the test definition block call evalArgAt(1) suite ) TestSuite it := method(testName, test := Object clone test name := testName test block := call argAt(1) tests append(test) ) TestSuite before := method( self beforeBlock := call argAt(0) ) TestSuite after := method( self afterBlock := call argAt(0) ) TestSuite run := method( (\u0026quot;\\n\u0026quot; .. description) println (\u0026quot;=\u0026quot; repeated(description size)) println passed := 0 failed := 0 tests foreach(test, if(hasSlot(\u0026quot;beforeBlock\u0026quot;), beforeBlock doInContext(self)) e := try( test block doInContext(self) (\u0026quot;✓ \u0026quot; .. test name) println passed = passed + 1 ) catch(Exception, e, (\u0026quot;✗ \u0026quot; .. test name) println (\u0026quot; \u0026quot; .. e message) println failed = failed + 1 ) if(hasSlot(\u0026quot;afterBlock\u0026quot;), afterBlock doInContext(self)) ) (\u0026quot;\\nPassed: \u0026quot; .. passed .. \u0026quot;, Failed: \u0026quot; .. failed) println ) // Assertion helpers Object expect := method(actual, Expectation clone setActual(actual) ) Expectation := Object clone Expectation setActual := method(value, self actual := value self ) Expectation toBe := method(expected, if(actual != expected, Exception raise(\u0026quot;Expected \u0026quot; .. expected .. \u0026quot; but got \u0026quot; .. actual) ) ) Expectation toEqual := method(expected, if(actual != expected, Exception raise(\u0026quot;Expected \u0026quot; .. expected .. \u0026quot; but got \u0026quot; .. actual) ) ) Expectation toContain := method(item, if(actual contains(item) not, Exception raise(\u0026quot;Expected \u0026quot; .. actual .. \u0026quot; to contain \u0026quot; .. item) ) ) // Usage MathTests := describe(\u0026quot;Math operations\u0026quot;, before( self calculator := Object clone calculator add := method(a, b, a + b) calculator multiply := method(a, b, a * b) ) it(\u0026quot;should add numbers correctly\u0026quot;, expect(calculator add(2, 3)) toBe(5) expect(calculator add(-1, 1)) toBe(0) ) it(\u0026quot;should multiply numbers correctly\u0026quot;, expect(calculator multiply(3, 4)) toBe(12) expect(calculator multiply(0, 5)) toBe(0) ) it(\u0026quot;should handle edge cases\u0026quot;, expect(calculator add(0, 0)) toBe(0) ) ) MathTests run State Machine DSL # StateMachine := Object clone StateMachine states := Map clone StateMachine currentState := nil StateMachine initialState := nil StateMachine state := method(name, s := State clone s name := name s machine := self states atPut(name, s) if(initialState isNil, initialState = s) s ) State := Object clone State transitions := Map clone State on := method(event, targetState, transitions atPut(event, targetState) self ) State enter := method( self enterBlock := call argAt(0) self ) State exit := method( self exitBlock := call argAt(0) self ) StateMachine start := method( currentState = initialState if(currentState hasSlot(\u0026quot;enterBlock\u0026quot;), currentState enterBlock call ) ) StateMachine trigger := method(event, if(currentState transitions hasKey(event), nextStateName := currentState transitions at(event) nextState := states at(nextStateName) if(currentState hasSlot(\u0026quot;exitBlock\u0026quot;), currentState exitBlock call ) (\u0026quot;Transitioning from \u0026quot; .. currentState name .. \u0026quot; to \u0026quot; .. nextStateName) println currentState = nextState if(currentState hasSlot(\u0026quot;enterBlock\u0026quot;), currentState enterBlock call ) , (\u0026quot;No transition for event '\u0026quot; .. event .. \u0026quot;' from state '\u0026quot; .. currentState name .. \u0026quot;'\u0026quot;) println ) ) // Usage door := StateMachine clone door state(\u0026quot;closed\u0026quot;) \\ on(\u0026quot;open\u0026quot;, \u0026quot;opened\u0026quot;) \\ on(\u0026quot;lock\u0026quot;, \u0026quot;locked\u0026quot;) \\ enter(block(\u0026quot;Door is now closed\u0026quot; println)) door state(\u0026quot;opened\u0026quot;) \\ on(\u0026quot;close\u0026quot;, \u0026quot;closed\u0026quot;) \\ enter(block(\u0026quot;Door is now open\u0026quot; println)) door state(\u0026quot;locked\u0026quot;) \\ on(\u0026quot;unlock\u0026quot;, \u0026quot;closed\u0026quot;) \\ enter(block(\u0026quot;Door is now locked\u0026quot; println)) door start door trigger(\u0026quot;open\u0026quot;) // Transitioning from closed to opened door trigger(\u0026quot;close\u0026quot;) // Transitioning from opened to closed door trigger(\u0026quot;lock\u0026quot;) // Transitioning from closed to locked door trigger(\u0026quot;open\u0026quot;) // No transition for event 'open' from state 'locked' Routing DSL (Web Framework Style) # Router := Object clone Router routes := list() Router get := method(path, addRoute(\u0026quot;GET\u0026quot;, path, call argAt(1)) ) Router post := method(path, addRoute(\u0026quot;POST\u0026quot;, path, call argAt(1)) ) Router put := method(path, addRoute(\u0026quot;PUT\u0026quot;, path, call argAt(1)) ) Router delete := method(path, addRoute(\u0026quot;DELETE\u0026quot;, path, call argAt(1)) ) Router addRoute := method(method, path, handler, routes append(Map with( \u0026quot;method\u0026quot;, method, \u0026quot;path\u0026quot;, path, \u0026quot;pattern\u0026quot;, pathToRegex(path), \u0026quot;handler\u0026quot;, handler )) self ) Router pathToRegex := method(path, // Convert :param to regex groups pattern := path pattern = pattern replaceAllRegex(\u0026quot;:([^/]+)\u0026quot;, \u0026quot;([^/]+)\u0026quot;) \u0026quot;^\u0026quot; .. pattern .. \u0026quot;$\u0026quot; ) Router handle := method(method, path, routes foreach(route, if(route at(\u0026quot;method\u0026quot;) == method, match := path matchesRegex(route at(\u0026quot;pattern\u0026quot;)) if(match, params := extractParams(route at(\u0026quot;path\u0026quot;), path, match) return route at(\u0026quot;handler\u0026quot;) call(params) ) ) ) Map with(\u0026quot;status\u0026quot;, 404, \u0026quot;body\u0026quot;, \u0026quot;Not Found\u0026quot;) ) Router extractParams := method(pattern, path, match, params := Map clone // Extract named parameters names := pattern allMatchesOfRegex(\u0026quot;:([^/]+)\u0026quot;) map(m, m at(1)) names foreach(i, name, params atPut(name, match at(i + 1)) ) params ) // Usage app := Router clone app get(\u0026quot;/\u0026quot;, block(params, Map with(\u0026quot;status\u0026quot;, 200, \u0026quot;body\u0026quot;, \u0026quot;Welcome to the home page\u0026quot;) )) app get(\u0026quot;/users/:id\u0026quot;, block(params, Map with(\u0026quot;status\u0026quot;, 200, \u0026quot;body\u0026quot;, \u0026quot;User \u0026quot; .. params at(\u0026quot;id\u0026quot;)) )) app post(\u0026quot;/users\u0026quot;, block(params, Map with(\u0026quot;status\u0026quot;, 201, \u0026quot;body\u0026quot;, \u0026quot;User created\u0026quot;) )) // Simulate requests app handle(\u0026quot;GET\u0026quot;, \u0026quot;/\u0026quot;) at(\u0026quot;body\u0026quot;) println // Welcome to the home page app handle(\u0026quot;GET\u0026quot;, \u0026quot;/users/123\u0026quot;) at(\u0026quot;body\u0026quot;) println // User 123 app handle(\u0026quot;POST\u0026quot;, \u0026quot;/users\u0026quot;) at(\u0026quot;body\u0026quot;) println // User created app handle(\u0026quot;GET\u0026quot;, \u0026quot;/unknown\u0026quot;) at(\u0026quot;body\u0026quot;) println // Not Found Data Validation DSL # Validator := Object clone Validator field := method(name, f := Field clone f name := name f rules := list() self currentField := f f ) Field := Object clone Field required := method( rules append(block(value, if(value isNil or value == \u0026quot;\u0026quot;, Exception raise(name .. \u0026quot; is required\u0026quot;), true ) )) self ) Field minLength := method(min, rules append(block(value, if(value size \u0026lt; min, Exception raise(name .. \u0026quot; must be at least \u0026quot; .. min .. \u0026quot; characters\u0026quot;), true ) )) self ) Field maxLength := method(max, rules append(block(value, if(value size \u0026gt; max, Exception raise(name .. \u0026quot; must be at most \u0026quot; .. max .. \u0026quot; characters\u0026quot;), true ) )) self ) Field matches := method(regex, rules append(block(value, if(value matchesRegex(regex) not, Exception raise(name .. \u0026quot; has invalid format\u0026quot;), true ) )) self ) Field validate := method(value, rules foreach(rule, rule call(value) ) true ) // Usage userValidator := Validator clone username := userValidator field(\u0026quot;username\u0026quot;) \\ required \\ minLength(3) \\ maxLength(20) \\ matches(\u0026quot;^[a-zA-Z0-9_]+$\u0026quot;) email := userValidator field(\u0026quot;email\u0026quot;) \\ required \\ matches(\u0026quot;^[^@]+@[^@]+\\\\.[^@]+$\u0026quot;) // Test validation try( username validate(\u0026quot;ab\u0026quot;) ) catch(Exception, e, e message println // username must be at least 3 characters ) try( email validate(\u0026quot;not-an-email\u0026quot;) ) catch(Exception, e, e message println // email has invalid format ) username validate(\u0026quot;valid_user123\u0026quot;) println // true email validate(\u0026quot;user@example.com\u0026quot;) println // true DSL Best Practices # 1. Natural Language Flow # // Good - reads naturally recipe needs(2) cups of(\u0026quot;flour\u0026quot;) order shipping priority within(3) days // Bad - programmer-centric recipe setAmount(2) setUnit(\u0026quot;cups\u0026quot;) setIngredient(\u0026quot;flour\u0026quot;) order setShipping(\u0026quot;priority\u0026quot;) setDeliveryDays(3) 2. Method Chaining # // Enable fluent interfaces Object withChaining := method( call message arguments foreach(arg, slotName := arg name self setSlot(slotName, call evalArgAt(0)) ) self // Always return self ) Person := Object clone Person configure := method( withChaining( name(n, self name := n), age(a, self age := a), email(e, self email := e) ) ) person := Person clone configure \\ name(\u0026quot;Alice\u0026quot;) \\ age(30) \\ email(\u0026quot;alice@example.com\u0026quot;) 3. Context Management # DSLContext := Object clone DSLContext stack := list() DSLContext push := method(obj, stack append(obj) ) DSLContext pop := method( stack pop ) DSLContext current := method( stack last ) DSLContext with := method(obj, block, push(obj) e := try(result := block call) pop if(e, e raise, result) ) // Usage in DSL Form := Object clone Form fields := list() Form field := method(name, f := Field clone f name := name DSLContext with(f, call evalArgAt(1) ) fields append(f) ) Field label := method(text, DSLContext current label := text ) Exercises # CSS DSL: Create a DSL for generating CSS with nested rules and variables.\nGraph Description Language: Build a DSL for describing graphs and their relationships.\nBuild System DSL: Implement a make/rake-like build system DSL.\nBDD Testing DSL: Create a Behavior-Driven Development testing framework.\nConfiguration Management: Build a DSL for system configuration management.\nReal-World Example: Migration DSL # Migration := Object clone Migration changes := list() Migration createTable := method(name, table := TableDefinition clone table name := name table columns := list() call evalArgAt(1) changes append(Map with( \u0026quot;type\u0026quot;, \u0026quot;createTable\u0026quot;, \u0026quot;table\u0026quot;, table )) self ) Migration dropTable := method(name, changes append(Map with( \u0026quot;type\u0026quot;, \u0026quot;dropTable\u0026quot;, \u0026quot;name\u0026quot;, name )) self ) TableDefinition := Object clone TableDefinition column := method(name, type, columns append(Map with( \u0026quot;name\u0026quot;, name, \u0026quot;type\u0026quot;, type, \u0026quot;constraints\u0026quot;, list() )) self ) TableDefinition primaryKey := method(col, columns last at(\u0026quot;constraints\u0026quot;) append(\u0026quot;PRIMARY KEY\u0026quot;) self ) TableDefinition notNull := method( columns last at(\u0026quot;constraints\u0026quot;) append(\u0026quot;NOT NULL\u0026quot;) self ) TableDefinition unique := method( columns last at(\u0026quot;constraints\u0026quot;) append(\u0026quot;UNIQUE\u0026quot;) self ) Migration toSQL := method( sql := list() changes foreach(change, if(change at(\u0026quot;type\u0026quot;) == \u0026quot;createTable\u0026quot;, table := change at(\u0026quot;table\u0026quot;) stmt := \u0026quot;CREATE TABLE \u0026quot; .. table name .. \u0026quot; (\\n\u0026quot; cols := table columns map(col, \u0026quot; \u0026quot; .. col at(\u0026quot;name\u0026quot;) .. \u0026quot; \u0026quot; .. col at(\u0026quot;type\u0026quot;) .. if(col at(\u0026quot;constraints\u0026quot;) size \u0026gt; 0, \u0026quot; \u0026quot; .. col at(\u0026quot;constraints\u0026quot;) join(\u0026quot; \u0026quot;), \u0026quot;\u0026quot; ) ) stmt = stmt .. cols join(\u0026quot;,\\n\u0026quot;) .. \u0026quot;\\n);\u0026quot; sql append(stmt) ) if(change at(\u0026quot;type\u0026quot;) == \u0026quot;dropTable\u0026quot;, sql append(\u0026quot;DROP TABLE \u0026quot; .. change at(\u0026quot;name\u0026quot;) .. \u0026quot;;\u0026quot;) ) ) sql join(\u0026quot;\\n\\n\u0026quot;) ) // Usage migration := Migration clone migration createTable(\u0026quot;users\u0026quot;, column(\u0026quot;id\u0026quot;, \u0026quot;INTEGER\u0026quot;) primaryKey, column(\u0026quot;username\u0026quot;, \u0026quot;VARCHAR(50)\u0026quot;) notNull unique, column(\u0026quot;email\u0026quot;, \u0026quot;VARCHAR(100)\u0026quot;) notNull unique, column(\u0026quot;created_at\u0026quot;, \u0026quot;TIMESTAMP\u0026quot;) notNull ) migration createTable(\u0026quot;posts\u0026quot;, column(\u0026quot;id\u0026quot;, \u0026quot;INTEGER\u0026quot;) primaryKey, column(\u0026quot;user_id\u0026quot;, \u0026quot;INTEGER\u0026quot;) notNull, column(\u0026quot;title\u0026quot;, \u0026quot;VARCHAR(200)\u0026quot;) notNull, column(\u0026quot;content\u0026quot;, \u0026quot;TEXT\u0026quot;), column(\u0026quot;published_at\u0026quot;, \u0026quot;TIMESTAMP\u0026quot;) ) migration toSQL println Conclusion # Domain-Specific Languages in Io demonstrate the language\u0026rsquo;s expressive power. By leveraging message passing, optional parentheses, method chaining, and metaprogramming, you can create DSLs that feel natural to domain experts while remaining fully integrated with the host language.\nThe key to successful DSLs in Io is understanding that you\u0026rsquo;re not fighting against language syntax—you\u0026rsquo;re working with it. Messages become domain commands, objects become domain concepts, and the minimal syntax stays out of your way. This makes Io ideal for creating internal DSLs that are both powerful and readable.\n"},{"id":16,"href":"/docs/14-c-integration/","title":"C Integration","section":"Chapters","content":" Chapter 14: C Integration # Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C.\nUnderstanding Io\u0026rsquo;s C Architecture # Io\u0026rsquo;s core is a small C library (around 10,000 lines) that implements:\nThe object model (IoObject) The message passing system Basic types (Number, String, List, etc.) The VM and garbage collector Everything else is built on top of this foundation, either in C addons or pure Io.\nCreating a Simple C Addon # Let\u0026rsquo;s create a basic C addon that adds a method to calculate factorials:\n// factorial.c #include \u0026quot;IoState.h\u0026quot; #include \u0026quot;IoObject.h\u0026quot; #include \u0026quot;IoNumber.h\u0026quot; IoObject *IoObject_factorial(IoObject *self, IoObject *locals, IoMessage *m) { // Get the number from the receiver double n = IoNumber_asDouble(self); if (n \u0026lt; 0) { IoState_error_(IOSTATE, m, \u0026quot;factorial of negative number\u0026quot;); return IONIL(self); } double result = 1; for (int i = 2; i \u0026lt;= n; i++) { result *= i; } return IoNumber_newWithDouble_(IOSTATE, result); } // Initialize the addon void IoFactorial_init(IoState *state) { IoObject *self = IoState_lobby(state); // Add method to Number prototype IoObject *number = IoState_protoWithName_(state, \u0026quot;Number\u0026quot;); IoObject_addMethod_(number, IOSYMBOL(\u0026quot;factorial\u0026quot;), IoObject_factorial); } To compile and use:\n# Compile as shared library gcc -shared -fPIC -o factorial.so factorial.c -lIo # In Io DynLib load(\u0026quot;./factorial.so\u0026quot;) 5 factorial println // 120 Working with Io Objects in C # // Creating Io objects from C IoObject *IoAddon_createObject(IoObject *self, IoObject *locals, IoMessage *m) { IoState *state = IOSTATE; // Create different types IoObject *num = IoNumber_newWithDouble_(state, 42.0); IoObject *str = IoSeq_newWithCString_(state, \u0026quot;Hello from C\u0026quot;); IoObject *list = IoList_new(state); // Add items to list IoList_append_(list, num); IoList_append_(list, str); // Create a new object with slots IoObject *obj = IoObject_new(state); IoObject_setSlot_to_(obj, IOSYMBOL(\u0026quot;x\u0026quot;), num); IoObject_setSlot_to_(obj, IOSYMBOL(\u0026quot;message\u0026quot;), str); IoObject_setSlot_to_(obj, IOSYMBOL(\u0026quot;items\u0026quot;), list); return obj; } // Accessing Io objects from C IoObject *IoAddon_processObject(IoObject *self, IoObject *locals, IoMessage *m) { // Get the first argument IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, 0); // Check type if (ISSEQ(arg)) { char *cstr = IoSeq_asCString(arg); printf(\u0026quot;String argument: %s\\n\u0026quot;, cstr); } else if (ISNUMBER(arg)) { double num = IoNumber_asDouble(arg); printf(\u0026quot;Number argument: %f\\n\u0026quot;, num); } else if (ISLIST(arg)) { size_t size = IoList_size(arg); printf(\u0026quot;List with %zu items\\n\u0026quot;, size); } return self; } Creating Custom Types # // customtype.c - Define a Point type #include \u0026quot;IoState.h\u0026quot; #include \u0026quot;IoObject.h\u0026quot; #include \u0026quot;IoNumber.h\u0026quot; // Define the type structure typedef struct { IoObject obj; // Must be first double x; double y; } IoPoint; // Type tag IoTag *IoPoint_tag(void) { static IoTag *tag = NULL; if (!tag) { tag = IoTag_newWithName_(\u0026quot;Point\u0026quot;); } return tag; } // Constructor IoPoint *IoPoint_new(IoState *state, double x, double y) { IoPoint *self = IoObject_new(state); IoObject_tag_(self, IoPoint_tag()); self-\u0026gt;x = x; self-\u0026gt;y = y; return self; } // Methods IoObject *IoPoint_x(IoPoint *self, IoObject *locals, IoMessage *m) { return IoNumber_newWithDouble_(IOSTATE, self-\u0026gt;x); } IoObject *IoPoint_y(IoPoint *self, IoObject *locals, IoMessage *m) { return IoNumber_newWithDouble_(IOSTATE, self-\u0026gt;y); } IoObject *IoPoint_distance(IoPoint *self, IoObject *locals, IoMessage *m) { IoPoint *other = IoMessage_locals_valueArgAt_(m, locals, 0); if (IoObject_tag(other) != IoPoint_tag()) { IoState_error_(IOSTATE, m, \u0026quot;argument must be a Point\u0026quot;); return IONIL(self); } double dx = self-\u0026gt;x - other-\u0026gt;x; double dy = self-\u0026gt;y - other-\u0026gt;y; double distance = sqrt(dx*dx + dy*dy); return IoNumber_newWithDouble_(IOSTATE, distance); } // Initialize the type void IoPoint_init(IoState *state) { IoObject *self = IoState_lobby(state); // Create prototype IoPoint *proto = IoPoint_new(state, 0, 0); IoState_registerProtoWithName_(state, proto, \u0026quot;Point\u0026quot;); // Add methods IoObject_addMethod_(proto, IOSYMBOL(\u0026quot;x\u0026quot;), IoPoint_x); IoObject_addMethod_(proto, IOSYMBOL(\u0026quot;y\u0026quot;), IoPoint_y); IoObject_addMethod_(proto, IOSYMBOL(\u0026quot;distance\u0026quot;), IoPoint_distance); } Calling Io from C # // Evaluate Io code from C IoObject *result = IoState_doString_(state, \u0026quot;1 + 2 * 3\u0026quot;); double value = IoNumber_asDouble(result); printf(\u0026quot;Result: %f\\n\u0026quot;, value); // 7.0 // Call Io methods from C IoObject *obj = IoState_doString_(state, \u0026quot;Object clone\u0026quot;); IoObject *method = IoObject_getSlot_(obj, IOSYMBOL(\u0026quot;type\u0026quot;)); IoObject *result = IoObject_activate(method, obj, locals, m, NULL); char *type = IoSeq_asCString(result); printf(\u0026quot;Type: %s\\n\u0026quot;, type); // Object // Send messages IoMessage *msg = IoMessage_newWithName_(state, IOSYMBOL(\u0026quot;println\u0026quot;)); IoMessage_setCachedResult_(msg, NULL); IoObject *result = IoObject_perform(obj, locals, msg); Memory Management # Io uses a garbage collector, but when interfacing with C, you need to be careful:\n// Protecting objects from GC IoObject *IoAddon_keepAlive(IoObject *self, IoObject *locals, IoMessage *m) { IoState *state = IOSTATE; // Create object that needs to survive GC IoObject *important = IoObject_new(state); // Add reference from a persistent object IoObject_setSlot_to_(IoState_lobby(state), IOSYMBOL(\u0026quot;_keepAlive\u0026quot;), important); // Or use IoState_retain/release IoState_retain_(state, important); // Do work... // Release when done IoState_release_(state, important); return important; } // Managing C memory typedef struct { IoObject obj; void *cdata; } IoCWrapper; void IoCWrapper_free(IoCWrapper *self) { if (self-\u0026gt;cdata) { free(self-\u0026gt;cdata); self-\u0026gt;cdata = NULL; } } // Set up finalizer IoTag *tag = IoTag_newWithName_(\u0026quot;CWrapper\u0026quot;); IoTag_freeFunc_(tag, (IoTagFreeFunc *)IoCWrapper_free); Wrapping C Libraries # Example: Wrapping a simple math library:\n// mathlib_wrapper.c #include \u0026lt;math.h\u0026gt; #include \u0026quot;IoState.h\u0026quot; #include \u0026quot;IoObject.h\u0026quot; #include \u0026quot;IoNumber.h\u0026quot; #include \u0026quot;IoList.h\u0026quot; // Wrap sin function IoObject *IoMath_sin(IoObject *self, IoObject *locals, IoMessage *m) { double x = IoMessage_locals_doubleArgAt_(m, locals, 0); return IoNumber_newWithDouble_(IOSTATE, sin(x)); } // Wrap complex function IoObject *IoMath_stats(IoObject *self, IoObject *locals, IoMessage *m) { IoList *list = IoMessage_locals_listArgAt_(m, locals, 0); size_t count = IoList_size(list); if (count == 0) { return IoList_new(IOSTATE); } double sum = 0, min = INFINITY, max = -INFINITY; for (size_t i = 0; i \u0026lt; count; i++) { IoObject *item = IoList_at_(list, i); double value = IoNumber_asDouble(item); sum += value; if (value \u0026lt; min) min = value; if (value \u0026gt; max) max = value; } double mean = sum / count; // Return statistics as list IoList *result = IoList_new(IOSTATE); IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, mean)); IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, min)); IoList_append_(result, IoNumber_newWithDouble_(IOSTATE, max)); return result; } void IoMathLib_init(IoState *state) { IoObject *math = IoObject_new(state); IoState_registerProtoWithName_(state, math, \u0026quot;Math\u0026quot;); IoObject_addMethod_(math, IOSYMBOL(\u0026quot;sin\u0026quot;), IoMath_sin); IoObject_addMethod_(math, IOSYMBOL(\u0026quot;stats\u0026quot;), IoMath_stats); } Usage in Io:\nDynLib load(\u0026quot;./mathlib.so\u0026quot;) Math sin(3.14159 / 2) println // 1.0 stats := Math stats(list(1, 2, 3, 4, 5)) \u0026quot;Mean: \u0026quot; .. stats at(0) println // Mean: 3 \u0026quot;Min: \u0026quot; .. stats at(1) println // Min: 1 \u0026quot;Max: \u0026quot; .. stats at(2) println // Max: 5 Embedding Io in C Applications # // embed_io.c - Embedding Io in a C application #include \u0026lt;stdio.h\u0026gt; #include \u0026quot;IoState.h\u0026quot; #include \u0026quot;IoObject.h\u0026quot; #include \u0026quot;IoSeq.h\u0026quot; // Custom function exposed to Io IoObject *App_log(IoObject *self, IoObject *locals, IoMessage *m) { char *msg = IoMessage_locals_cStringArgAt_(m, locals, 0); printf(\u0026quot;[APP LOG] %s\\n\u0026quot;, msg); return self; } int main(int argc, char *argv[]) { // Initialize Io IoState *state = IoState_new(); IoState_init(state); // Add custom functions IoObject *lobby = IoState_lobby(state); IoObject *app = IoObject_new(state); IoState_registerProtoWithName_(state, app, \u0026quot;App\u0026quot;); IoObject_addMethod_(app, IOSYMBOL(\u0026quot;log\u0026quot;), App_log); // Load and run Io script IoState_doFile_(state, \u0026quot;script.io\u0026quot;); // Interact with Io objects IoObject *result = IoState_doString_(state, \u0026quot;x := 10; y := 20; x + y\u0026quot;); printf(\u0026quot;Result from Io: %f\\n\u0026quot;, IoNumber_asDouble(result)); // Clean up IoState_free(state); return 0; } The Io script (script.io):\nApp log(\u0026quot;Hello from Io!\u0026quot;) // Define functions for C to call calculate := method(a, b, App log(\u0026quot;Calculating in Io\u0026quot;) a * b + 100 ) Performance Optimization # // Optimized array operations IoObject *IoArray_sum(IoObject *self, IoObject *locals, IoMessage *m) { // Get underlying C array for performance UArray *array = IoSeq_rawUArray(self); size_t size = UArray_size(array); uint8_t *data = UArray_bytes(array); int itemSize = UArray_itemSize(array); double sum = 0; // Fast path for different types if (itemSize == sizeof(double)) { double *doubles = (double *)data; for (size_t i = 0; i \u0026lt; size; i++) { sum += doubles[i]; } } else if (itemSize == sizeof(float)) { float *floats = (float *)data; for (size_t i = 0; i \u0026lt; size; i++) { sum += floats[i]; } } return IoNumber_newWithDouble_(IOSTATE, sum); } // Batch operations IoObject *IoMatrix_multiply(IoObject *self, IoObject *locals, IoMessage *m) { IoObject *other = IoMessage_locals_valueArgAt_(m, locals, 0); // Get dimensions int rows1 = IoMessage_locals_intArgAt_(m, locals, 1); int cols1 = IoMessage_locals_intArgAt_(m, locals, 2); int cols2 = IoMessage_locals_intArgAt_(m, locals, 3); // Get raw data pointers double *data1 = (double *)IoSeq_rawBytes(self); double *data2 = (double *)IoSeq_rawBytes(other); // Allocate result IoSeq *result = IoSeq_newWithData_length_(IOSTATE, NULL, rows1 * cols2 * sizeof(double)); double *resultData = (double *)IoSeq_rawBytes(result); // Optimized matrix multiplication for (int i = 0; i \u0026lt; rows1; i++) { for (int j = 0; j \u0026lt; cols2; j++) { double sum = 0; for (int k = 0; k \u0026lt; cols1; k++) { sum += data1[i * cols1 + k] * data2[k * cols2 + j]; } resultData[i * cols2 + j] = sum; } } return result; } Debugging C Addons # // Debug helpers #define IO_DEBUG 1 #ifdef IO_DEBUG #define DEBUG_PRINT(fmt, ...) \\ fprintf(stderr, \u0026quot;DEBUG: \u0026quot; fmt \u0026quot;\\n\u0026quot;, ##__VA_ARGS__) #else #define DEBUG_PRINT(fmt, ...) #endif IoObject *IoDebug_function(IoObject *self, IoObject *locals, IoMessage *m) { DEBUG_PRINT(\u0026quot;Function called with %d arguments\u0026quot;, IoMessage_argCount(m)); // Print argument types for (int i = 0; i \u0026lt; IoMessage_argCount(m); i++) { IoObject *arg = IoMessage_locals_valueArgAt_(m, locals, i); DEBUG_PRINT(\u0026quot; Arg %d: %s\u0026quot;, i, IoObject_name(arg)); } // Check for memory issues IoState *state = IOSTATE; IoState_check(state); return self; } Common Integration Patterns # Callback Pattern # // Store Io blocks as callbacks typedef struct { IoObject obj; IoObject *callback; } IoCallbackWrapper; IoObject *IoWrapper_setCallback(IoCallbackWrapper *self, IoObject *locals, IoMessage *m) { IoObject *block = IoMessage_locals_valueArgAt_(m, locals, 0); // Retain the block IoState_retain_(IOSTATE, block); if (self-\u0026gt;callback) { IoState_release_(IOSTATE, self-\u0026gt;callback); } self-\u0026gt;callback = block; return self; } // Call the Io callback from C void triggerCallback(IoCallbackWrapper *wrapper, double value) { if (wrapper-\u0026gt;callback) { IoObject *arg = IoNumber_newWithDouble_(IOSTATE, value); IoObject_perform(wrapper-\u0026gt;callback, wrapper, IoMessage_newWithName_label_(IOSTATE, IOSYMBOL(\u0026quot;call\u0026quot;), arg)); } } Event System # // Event emitter in C typedef struct { IoObject obj; IoMap *handlers; // Event name -\u0026gt; List of handlers } IoEventEmitter; IoObject *IoEventEmitter_on(IoEventEmitter *self, IoObject *locals, IoMessage *m) { IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); IoObject *handler = IoMessage_locals_valueArgAt_(m, locals, 1); IoList *handlers = IoMap_at_(self-\u0026gt;handlers, event); if (!handlers) { handlers = IoList_new(IOSTATE); IoMap_atPut_(self-\u0026gt;handlers, event, handlers); } IoList_append_(handlers, handler); return self; } IoObject *IoEventEmitter_emit(IoEventEmitter *self, IoObject *locals, IoMessage *m) { IoSeq *event = IoMessage_locals_seqArgAt_(m, locals, 0); IoList *handlers = IoMap_at_(self-\u0026gt;handlers, event); if (handlers) { size_t count = IoList_size(handlers); for (size_t i = 0; i \u0026lt; count; i++) { IoObject *handler = IoList_at_(handlers, i); // Pass remaining arguments to handler IoMessage *msg = IoMessage_newWithName_(IOSTATE, IOSYMBOL(\u0026quot;call\u0026quot;)); for (int j = 1; j \u0026lt; IoMessage_argCount(m); j++) { IoMessage_addArg_(msg, IoMessage_argAt_(m, j)); } IoObject_perform(handler, locals, msg); } } return self; } Build System Integration # Makefile for Io addon:\n# Makefile for Io addon CC = gcc CFLAGS = -shared -fPIC -Wall -O2 INCLUDES = -I$(IO_HOME)/include LIBS = -L$(IO_HOME)/lib -lIo ADDON = myaddon.so SOURCES = myaddon.c utils.c OBJECTS = $(SOURCES:.c=.o) all: $(ADDON) $(ADDON): $(OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LIBS) %.o: %.c $(CC) $(CFLAGS) $(INCLUDES) -c $\u0026lt; -o $@ clean: rm -f $(OBJECTS) $(ADDON) install: $(ADDON) cp $(ADDON) $(IO_HOME)/addons/ test: $(ADDON) io test_addon.io Exercises # SQLite Wrapper: Create a complete SQLite wrapper for Io.\nGraphics Library: Wrap SDL or Cairo for graphics programming.\nNetwork Addon: Implement high-performance networking primitives.\nCrypto Library: Wrap OpenSSL for cryptographic operations.\nScientific Computing: Create bindings for BLAS/LAPACK.\nConclusion # C integration is one of Io\u0026rsquo;s strongest features. The ability to seamlessly extend Io with C libraries, create high-performance addons, and embed Io in C applications makes it practical for real-world applications. The clean C API and simple object model make integration straightforward, while the garbage collector handles most memory management concerns.\nWhether you\u0026rsquo;re optimizing hot paths, wrapping existing libraries, or embedding a scripting language in your application, Io\u0026rsquo;s C integration provides the tools you need while maintaining the simplicity and elegance of the language.\n"},{"id":17,"href":"/docs/15-real-world-patterns/","title":"Real-World Patterns","section":"Chapters","content":" Chapter 15: Real-World Patterns # After exploring Io\u0026rsquo;s features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We\u0026rsquo;ll see how Io\u0026rsquo;s unique features enable elegant solutions to common programming challenges.\nModel-View-Controller (MVC) # Implementing MVC in Io leverages prototypes and message passing:\n// Model Model := Object clone Model init := method( self observers := list() self data := Map clone self ) Model set := method(key, value, oldValue := data at(key) if(oldValue != value, data atPut(key, value) notifyObservers(key, oldValue, value) ) self ) Model get := method(key, data at(key) ) Model observe := method(observer, observers append(observer) self ) Model notifyObservers := method(key, oldValue, newValue, observers foreach(observer, if(observer hasSlot(\u0026quot;modelChanged\u0026quot;), observer modelChanged(self, key, oldValue, newValue) ) ) ) // View View := Object clone View init := method(model, self model := model model observe(self) self elements := Map clone self ) View modelChanged := method(model, key, oldValue, newValue, render ) View render := method( // Override in subclasses ) // Controller Controller := Object clone Controller init := method(model, view, self model := model self view := view self ) Controller handleInput := method(input, // Process input and update model ) // Example: Todo MVC TodoModel := Model clone TodoModel init := method( resend self set(\u0026quot;todos\u0026quot;, list()) self ) TodoModel addTodo := method(text, todos := get(\u0026quot;todos\u0026quot;) copy todos append(Map with(\u0026quot;text\u0026quot;, text, \u0026quot;done\u0026quot;, false)) set(\u0026quot;todos\u0026quot;, todos) ) TodoModel toggleTodo := method(index, todos := get(\u0026quot;todos\u0026quot;) copy todo := todos at(index) todo atPut(\u0026quot;done\u0026quot;, todo at(\u0026quot;done\u0026quot;) not) set(\u0026quot;todos\u0026quot;, todos) ) TodoView := View clone TodoView render := method( \u0026quot;=== Todo List ===\u0026quot; println model get(\u0026quot;todos\u0026quot;) foreach(i, todo, status := if(todo at(\u0026quot;done\u0026quot;), \u0026quot;[✓]\u0026quot;, \u0026quot;[ ]\u0026quot;) (i .. \u0026quot;. \u0026quot; .. status .. \u0026quot; \u0026quot; .. todo at(\u0026quot;text\u0026quot;)) println ) \u0026quot;================\u0026quot; println ) TodoController := Controller clone TodoController processCommand := method(cmd, parts := cmd split(\u0026quot; \u0026quot;) action := parts at(0) if(action == \u0026quot;add\u0026quot;, text := parts slice(1) join(\u0026quot; \u0026quot;) model addTodo(text) ) if(action == \u0026quot;toggle\u0026quot;, index := parts at(1) asNumber model toggleTodo(index) ) if(action == \u0026quot;quit\u0026quot;, System exit ) ) // Usage app := Object clone app model := TodoModel clone init app view := TodoView clone init(app model) app controller := TodoController clone init(app model, app view) app view render // Simulate commands app controller processCommand(\u0026quot;add Buy groceries\u0026quot;) app controller processCommand(\u0026quot;add Write documentation\u0026quot;) app controller processCommand(\u0026quot;toggle 0\u0026quot;) Repository Pattern # Abstracting data access:\n// Base Repository Repository := Object clone Repository init := method( self storage := list() self nextId := 1 self ) Repository save := method(entity, if(entity hasSlot(\u0026quot;id\u0026quot;) not or entity id isNil, entity id := nextId nextId = nextId + 1 storage append(entity) , // Update existing index := storage detectIndex(e, e id == entity id) if(index, storage atPut(index, entity)) ) entity ) Repository findById := method(id, storage detect(e, e id == id) ) Repository findAll := method( storage copy ) Repository delete := method(entity, storage remove(entity) ) Repository where := method(predicate, storage select(predicate) ) // Specialized repository with persistence FileRepository := Repository clone FileRepository filename := \u0026quot;data.json\u0026quot; FileRepository init := method( resend load self ) FileRepository load := method( if(File with(filename) exists, data := File with(filename) contents parseJson storage = data map(item, entityFromMap(item)) nextId = storage map(e, e id) max + 1 ) ) FileRepository save := method(entity, resend(entity) persist entity ) FileRepository persist := method( data := storage map(e, e asMap) File with(filename) openForWriting write(data asJson) close ) // Entity User := Object clone User init := method(name, email, self id := nil self name := name self email := email self createdAt := Date now self ) User asMap := method( Map with( \u0026quot;id\u0026quot;, id, \u0026quot;name\u0026quot;, name, \u0026quot;email\u0026quot;, email, \u0026quot;createdAt\u0026quot;, createdAt asString ) ) // Usage userRepo := FileRepository clone init user1 := User clone init(\u0026quot;Alice\u0026quot;, \u0026quot;alice@example.com\u0026quot;) user2 := User clone init(\u0026quot;Bob\u0026quot;, \u0026quot;bob@example.com\u0026quot;) userRepo save(user1) userRepo save(user2) found := userRepo findById(1) active := userRepo where(u, u createdAt \u0026gt; Date now - Duration days(30)) Observer Pattern # Native implementation using Io\u0026rsquo;s message passing:\nObservable := Object clone Observable init := method( self observers := Map clone self ) Observable on := method(event, observer, methodName, if(observers hasKey(event) not, observers atPut(event, list()) ) observers at(event) append(list(observer, methodName)) self ) Observable off := method(event, observer, if(observers hasKey(event), observers at(event) := observers at(event) reject(pair, pair at(0) == observer ) ) self ) Observable emit := method(event, args := call message arguments slice(1) if(observers hasKey(event), observers at(event) foreach(pair, observer := pair at(0) methodName := pair at(1) msg := Message clone setName(methodName) args foreach(arg, msg appendArg(arg)) observer doMessage(msg) ) ) self ) // Example: Stock price monitor Stock := Observable clone Stock init := method(symbol, price, resend self symbol := symbol self price := price self ) Stock setPrice := method(newPrice, oldPrice := price price = newPrice change := ((newPrice - oldPrice) / oldPrice * 100) round emit(\u0026quot;priceChanged\u0026quot;, symbol, oldPrice, newPrice, change) if(change abs \u0026gt; 5, emit(\u0026quot;largeMoveDetected\u0026quot;, symbol, change) ) ) StockAlert := Object clone StockAlert onPriceChange := method(symbol, oldPrice, newPrice, change, (\u0026quot;Price alert: \u0026quot; .. symbol .. \u0026quot; moved from $\u0026quot; .. oldPrice .. \u0026quot; to $\u0026quot; .. newPrice .. \u0026quot; (\u0026quot; .. change .. \u0026quot;%)\u0026quot;) println ) StockAlert onLargeMove := method(symbol, change, (\u0026quot;⚠️ Large move detected: \u0026quot; .. symbol .. \u0026quot; changed \u0026quot; .. change .. \u0026quot;%\u0026quot;) println ) // Usage apple := Stock clone init(\u0026quot;AAPL\u0026quot;, 150.00) alert := StockAlert clone apple on(\u0026quot;priceChanged\u0026quot;, alert, \u0026quot;onPriceChange\u0026quot;) apple on(\u0026quot;largeMoveDetected\u0026quot;, alert, \u0026quot;onLargeMove\u0026quot;) apple setPrice(155.00) // Normal change apple setPrice(165.00) // Large move triggers both alerts Dependency Injection # Using Io\u0026rsquo;s dynamic nature for DI:\n// DI Container Container := Object clone Container init := method( self services := Map clone self singletons := Map clone self ) Container register := method(name, factory, services atPut(name, factory) self ) Container singleton := method(name, factory, services atPut(name, factory) singletons atPut(name, nil) self ) Container get := method(name, if(services hasKey(name) not, Exception raise(\u0026quot;Service '\u0026quot; .. name .. \u0026quot;' not registered\u0026quot;) ) // Check if singleton if(singletons hasKey(name), if(singletons at(name) isNil, singletons atPut(name, services at(name) call(self)) ) return singletons at(name) ) // Regular service services at(name) call(self) ) // Services Logger := Object clone Logger init := method(output, self output := output self ) Logger log := method(message, output write(\u0026quot;[\u0026quot; .. Date now .. \u0026quot;] \u0026quot; .. message .. \u0026quot;\\n\u0026quot;) ) Database := Object clone Database init := method(connectionString, logger, self connectionString := connectionString self logger := logger logger log(\u0026quot;Database initialized: \u0026quot; .. connectionString) self ) UserService := Object clone UserService init := method(database, logger, self database := database self logger := logger self ) UserService createUser := method(name, logger log(\u0026quot;Creating user: \u0026quot; .. name) // database operations... Map with(\u0026quot;id\u0026quot;, 1, \u0026quot;name\u0026quot;, name) ) // Configure container container := Container clone init container singleton(\u0026quot;logger\u0026quot;, block(c, Logger clone init(File standardOutput) )) container singleton(\u0026quot;database\u0026quot;, block(c, Database clone init(\u0026quot;postgres://localhost/myapp\u0026quot;, c get(\u0026quot;logger\u0026quot;)) )) container register(\u0026quot;userService\u0026quot;, block(c, UserService clone init(c get(\u0026quot;database\u0026quot;), c get(\u0026quot;logger\u0026quot;)) )) // Usage service := container get(\u0026quot;userService\u0026quot;) service createUser(\u0026quot;Alice\u0026quot;) // Different instance each time service1 := container get(\u0026quot;userService\u0026quot;) service2 := container get(\u0026quot;userService\u0026quot;) (service1 == service2) println // false // Same logger instance logger1 := container get(\u0026quot;logger\u0026quot;) logger2 := container get(\u0026quot;logger\u0026quot;) (logger1 == logger2) println // true Strategy Pattern # Leveraging blocks and dynamic dispatch:\n// Sorting strategies SortStrategy := Object clone BubbleSort := SortStrategy clone BubbleSort execute := method(list, result := list copy n := result size for(i, 0, n - 2, for(j, 0, n - i - 2, if(result at(j) \u0026gt; result at(j + 1), temp := result at(j) result atPut(j, result at(j + 1)) result atPut(j + 1, temp) ) ) ) result ) QuickSort := SortStrategy clone QuickSort execute := method(list, if(list size \u0026lt;= 1, return list) pivot := list at(list size / 2) less := list select(x, x \u0026lt; pivot) equal := list select(x, x == pivot) greater := list select(x, x \u0026gt; pivot) execute(less) appendSeq(equal) appendSeq(execute(greater)) ) // Context DataProcessor := Object clone DataProcessor init := method( self strategy := QuickSort self ) DataProcessor setStrategy := method(s, strategy = s self ) DataProcessor process := method(data, \u0026quot;Processing data...\u0026quot; println strategy execute(data) ) // Usage with different strategies processor := DataProcessor clone init data := list(3, 1, 4, 1, 5, 9, 2, 6) processor setStrategy(BubbleSort) process(data) println processor setStrategy(QuickSort) process(data) println // Dynamic strategy selection selectStrategy := method(dataSize, if(dataSize \u0026lt; 10, BubbleSort, QuickSort) ) processor setStrategy(selectStrategy(data size)) Chain of Responsibility # Building processing pipelines:\nHandler := Object clone Handler init := method( self next := nil self ) Handler setNext := method(handler, next = handler handler ) Handler handle := method(request, if(canHandle(request), process(request), if(next, next handle(request), nil) ) ) // Concrete handlers AuthenticationHandler := Handler clone AuthenticationHandler canHandle := method(request, request at(\u0026quot;requiresAuth\u0026quot;) ) AuthenticationHandler process := method(request, if(request at(\u0026quot;token\u0026quot;) == \u0026quot;valid-token\u0026quot;, \u0026quot;Authentication successful\u0026quot; println request atPut(\u0026quot;authenticated\u0026quot;, true) if(next, next handle(request), request) , Exception raise(\u0026quot;Authentication failed\u0026quot;) ) ) LoggingHandler := Handler clone LoggingHandler canHandle := method(request, true) LoggingHandler process := method(request, (\u0026quot;Logging request: \u0026quot; .. request at(\u0026quot;path\u0026quot;)) println if(next, next handle(request), request) ) RateLimitHandler := Handler clone RateLimitHandler init := method( resend self requests := Map clone self limit := 10 self window := 60 // seconds self ) RateLimitHandler canHandle := method(request, request hasKey(\u0026quot;clientId\u0026quot;) ) RateLimitHandler process := method(request, clientId := request at(\u0026quot;clientId\u0026quot;) now := Date now if(requests hasKey(clientId) not, requests atPut(clientId, list()) ) // Clean old requests clientRequests := requests at(clientId) select(time, now - time \u0026lt; window ) if(clientRequests size \u0026gt;= limit, Exception raise(\u0026quot;Rate limit exceeded\u0026quot;), clientRequests append(now) requests atPut(clientId, clientRequests) if(next, next handle(request), request) ) ) // Build chain chain := LoggingHandler clone \\ setNext(RateLimitHandler clone \\ setNext(AuthenticationHandler clone)) // Process requests request := Map with( \u0026quot;path\u0026quot;, \u0026quot;/api/users\u0026quot;, \u0026quot;clientId\u0026quot;, \u0026quot;client-123\u0026quot;, \u0026quot;requiresAuth\u0026quot;, true, \u0026quot;token\u0026quot;, \u0026quot;valid-token\u0026quot; ) result := chain handle(request) Plugin Architecture # Dynamic loading and extension:\nPluginManager := Object clone PluginManager init := method( self plugins := Map clone self hooks := Map clone self ) PluginManager registerHook := method(name, if(hooks hasKey(name) not, hooks atPut(name, list()) ) self ) PluginManager loadPlugin := method(path, plugin := doFile(path) if(plugin hasSlot(\u0026quot;name\u0026quot;) not, Exception raise(\u0026quot;Plugin must have a name\u0026quot;) ) plugins atPut(plugin name, plugin) if(plugin hasSlot(\u0026quot;init\u0026quot;), plugin init(self) ) (\u0026quot;Plugin loaded: \u0026quot; .. plugin name) println self ) PluginManager hook := method(name, args := call message arguments slice(1) results := list() if(hooks hasKey(name), hooks at(name) foreach(handler, result := handler doMessage(Message clone setName(\u0026quot;call\u0026quot;) setArguments(args)) results append(result) ) ) results ) PluginManager addHook := method(hookName, handler, if(hooks hasKey(hookName) not, registerHook(hookName) ) hooks at(hookName) append(handler) self ) // Example plugin MarkdownPlugin := Object clone MarkdownPlugin name := \u0026quot;markdown\u0026quot; MarkdownPlugin init := method(manager, manager addHook(\u0026quot;processText\u0026quot;, block(text, // Simple markdown processing text replaceAllRegex(\u0026quot;\\\\*\\\\*(.*?)\\\\*\\\\*\u0026quot;, \u0026quot;\u0026lt;strong\u0026gt;$1\u0026lt;/strong\u0026gt;\u0026quot;) \\ replaceAllRegex(\u0026quot;\\\\*(.*?)\\\\*\u0026quot;, \u0026quot;\u0026lt;em\u0026gt;$1\u0026lt;/em\u0026gt;\u0026quot;) )) manager addHook(\u0026quot;getFormats\u0026quot;, block( list(\u0026quot;markdown\u0026quot;, \u0026quot;md\u0026quot;) )) ) // Usage manager := PluginManager clone init manager registerHook(\u0026quot;processText\u0026quot;) manager registerHook(\u0026quot;getFormats\u0026quot;) // Load plugins manager loadPlugin(\u0026quot;markdown_plugin.io\u0026quot;) // Use hooks text := \u0026quot;This is **bold** and this is *italic*\u0026quot; processed := manager hook(\u0026quot;processText\u0026quot;, text) processed foreach(result, result println) formats := manager hook(\u0026quot;getFormats\u0026quot;) \u0026quot;Supported formats: \u0026quot; print formats flatten unique println Event Sourcing # Implementing event-driven architecture:\n// Event Event := Object clone Event init := method(type, data, self type := type self data := data self timestamp := Date now self id := Random uuid self ) // Event Store EventStore := Object clone EventStore init := method( self events := list() self snapshots := Map clone self ) EventStore append := method(event, events append(event) self ) EventStore getEvents := method(afterId, if(afterId isNil, return events ) startIndex := events detectIndex(e, e id == afterId) if(startIndex, events slice(startIndex + 1), list() ) ) // Aggregate Aggregate := Object clone Aggregate init := method(id, self id := id self version := 0 self uncommittedEvents := list() self ) Aggregate applyEvent := method(event, // Override in subclasses ) Aggregate raiseEvent := method(event, applyEvent(event) uncommittedEvents append(event) version = version + 1 ) Aggregate markEventsAsCommitted := method( uncommittedEvents = list() ) Aggregate loadFromHistory := method(events, events foreach(event, applyEvent(event) version = version + 1 ) ) // Example: Bank Account aggregate BankAccount := Aggregate clone BankAccount init := method(id, resend(id) self balance := 0 self ) BankAccount deposit := method(amount, if(amount \u0026lt;= 0, Exception raise(\u0026quot;Amount must be positive\u0026quot;) ) raiseEvent(Event clone init(\u0026quot;MoneyDeposited\u0026quot;, Map with(\u0026quot;accountId\u0026quot;, id, \u0026quot;amount\u0026quot;, amount))) ) BankAccount withdraw := method(amount, if(amount \u0026lt;= 0, Exception raise(\u0026quot;Amount must be positive\u0026quot;) ) if(amount \u0026gt; balance, Exception raise(\u0026quot;Insufficient funds\u0026quot;) ) raiseEvent(Event clone init(\u0026quot;MoneyWithdrawn\u0026quot;, Map with(\u0026quot;accountId\u0026quot;, id, \u0026quot;amount\u0026quot;, amount))) ) BankAccount applyEvent := method(event, if(event type == \u0026quot;MoneyDeposited\u0026quot;, balance = balance + event data at(\u0026quot;amount\u0026quot;) ) if(event type == \u0026quot;MoneyWithdrawn\u0026quot;, balance = balance - event data at(\u0026quot;amount\u0026quot;) ) ) // Repository using event sourcing AccountRepository := Object clone AccountRepository init := method(eventStore, self eventStore := eventStore self ) AccountRepository save := method(account, account uncommittedEvents foreach(event, eventStore append(event) ) account markEventsAsCommitted ) AccountRepository getById := method(id, events := eventStore getEvents select(e, e data at(\u0026quot;accountId\u0026quot;) == id ) account := BankAccount clone init(id) account loadFromHistory(events) account ) // Usage store := EventStore clone init repo := AccountRepository clone init(store) account := BankAccount clone init(\u0026quot;acc-123\u0026quot;) account deposit(100) account withdraw(30) account deposit(50) repo save(account) account balance println // 120 // Rebuild from events rebuilt := repo getById(\u0026quot;acc-123\u0026quot;) rebuilt balance println // 120 Caching Strategy # Multi-level caching with different policies:\nCache := Object clone Cache init := method(maxSize, ttl, self maxSize := maxSize self ttl := ttl // Time to live in seconds self entries := Map clone self accessOrder := list() self ) Cache get := method(key, if(entries hasKey(key), entry := entries at(key) // Check TTL if(Date now - entry at(\u0026quot;time\u0026quot;) \u0026gt; ttl, entries removeAt(key) accessOrder remove(key) return nil ) // Update access order (LRU) accessOrder remove(key) accessOrder append(key) entry at(\u0026quot;value\u0026quot;) , nil ) ) Cache put := method(key, value, // Evict if necessary while(entries size \u0026gt;= maxSize, evictKey := accessOrder removeFirst entries removeAt(evictKey) (\u0026quot;Cache evicted: \u0026quot; .. evictKey) println ) entries atPut(key, Map with( \u0026quot;value\u0026quot;, value, \u0026quot;time\u0026quot;, Date now )) accessOrder append(key) value ) Cache getOrCompute := method(key, computeBlock, value := get(key) if(value isNil, value = computeBlock call put(key, value) ) value ) // Multi-level cache MultiLevelCache := Object clone MultiLevelCache init := method( self l1 := Cache clone init(10, 60) // Small, fast, 1 minute TTL self l2 := Cache clone init(100, 600) // Larger, 10 minute TTL self ) MultiLevelCache get := method(key, // Check L1 value := l1 get(key) if(value, return value) // Check L2 value = l2 get(key) if(value, l1 put(key, value) // Promote to L1 return value ) nil ) MultiLevelCache put := method(key, value, l1 put(key, value) l2 put(key, value) value ) // Usage with expensive computation fibonacci := Object clone fibonacci cache := MultiLevelCache clone init fibonacci compute := method(n, if(n \u0026lt;= 1, return n) cache get(n) ifNil( (\u0026quot;Computing fib(\u0026quot; .. n .. \u0026quot;)\u0026quot;) println result := compute(n - 1) + compute(n - 2) cache put(n, result) result ) ) fibonacci compute(10) println // Computes fibonacci compute(10) println // From cache Conclusion # These patterns demonstrate how Io\u0026rsquo;s features—prototype-based inheritance, message passing, blocks, and metaprogramming—combine to create elegant solutions to real-world problems. The language\u0026rsquo;s flexibility allows patterns to be implemented more directly than in many mainstream languages, often with less boilerplate and more expressive code.\nThe key insight is that Io\u0026rsquo;s uniform object model means patterns aren\u0026rsquo;t special constructs but natural expressions of the language\u0026rsquo;s core concepts. This makes it easy to adapt patterns to specific needs or create entirely new architectural approaches.\n"},{"id":18,"href":"/docs/16-case-studies/","title":"Case Studies","section":"Chapters","content":" Chapter 16: Case Studies # This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io\u0026rsquo;s features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language.\nCase Study 1: Web Server # Building a simple but functional HTTP server demonstrates Io\u0026rsquo;s networking, concurrency, and string handling:\n// HTTP Server Implementation HttpServer := Object clone HttpServer init := method(port, self port := port self routes := Map clone self middlewares := list() self ) HttpRequest := Object clone HttpRequest parse := method(rawData, lines := rawData split(\u0026quot;\\r\\n\u0026quot;) if(lines size == 0, return nil) // Parse request line requestLine := lines at(0) split(\u0026quot; \u0026quot;) self method := requestLine at(0) self path := requestLine at(1) self version := requestLine at(2) // Parse headers self headers := Map clone self body := \u0026quot;\u0026quot; bodyStart := false lines slice(1) foreach(line, if(bodyStart, body = body .. line, if(line size == 0, bodyStart = true, parts := line split(\u0026quot;: \u0026quot;) if(parts size == 2, headers atPut(parts at(0), parts at(1)) ) ) ) ) // Parse query parameters self params := Map clone if(path containsSeq(\u0026quot;?\u0026quot;), parts := path split(\u0026quot;?\u0026quot;) self path = parts at(0) queryString := parts at(1) queryString split(\u0026quot;\u0026amp;\u0026quot;) foreach(param, kv := param split(\u0026quot;=\u0026quot;) if(kv size == 2, params atPut(kv at(0), kv at(1) urlDecode) ) ) ) self ) HttpResponse := Object clone HttpResponse init := method( self status := 200 self headers := Map clone self body := \u0026quot;\u0026quot; headers atPut(\u0026quot;Content-Type\u0026quot;, \u0026quot;text/html\u0026quot;) headers atPut(\u0026quot;Server\u0026quot;, \u0026quot;Io-Server/1.0\u0026quot;) self ) HttpResponse setStatus := method(code, status = code self ) HttpResponse setHeader := method(key, value, headers atPut(key, value) self ) HttpResponse write := method(content, body = body .. content self ) HttpResponse json := method(data, setHeader(\u0026quot;Content-Type\u0026quot;, \u0026quot;application/json\u0026quot;) write(data asJson) self ) HttpResponse build := method( statusText := Map with( 200, \u0026quot;OK\u0026quot;, 404, \u0026quot;Not Found\u0026quot;, 500, \u0026quot;Internal Server Error\u0026quot; ) at(status, \u0026quot;Unknown\u0026quot;) result := \u0026quot;HTTP/1.1 \u0026quot; .. status .. \u0026quot; \u0026quot; .. statusText .. \u0026quot;\\r\\n\u0026quot; headers atPut(\u0026quot;Content-Length\u0026quot;, body size asString) headers foreach(key, value, result = result .. key .. \u0026quot;: \u0026quot; .. value .. \u0026quot;\\r\\n\u0026quot; ) result .. \u0026quot;\\r\\n\u0026quot; .. body ) // Middleware support HttpServer use := method(middleware, middlewares append(middleware) self ) // Routing HttpServer route := method(method, path, handler, key := method .. \u0026quot;:\u0026quot; .. path routes atPut(key, handler) self ) HttpServer get := method(path, handler, route(\u0026quot;GET\u0026quot;, path, handler) ) HttpServer post := method(path, handler, route(\u0026quot;POST\u0026quot;, path, handler) ) // Request handling HttpServer handleConnection := method(socket, rawData := socket readUntilSeq(\u0026quot;\\r\\n\\r\\n\u0026quot;) request := HttpRequest parse(rawData) if(request isNil, socket close return ) response := HttpResponse clone init // Run middlewares middlewares foreach(middleware, middleware call(request, response) ) // Find route key := request method .. \u0026quot;:\u0026quot; .. request path handler := routes at(key) if(handler, e := try( handler call(request, response) ) catch(Exception, e, response setStatus(500) write(\u0026quot;Internal Server Error: \u0026quot; .. e message) ) , // Try pattern matching for dynamic routes handled := false routes foreach(routeKey, routeHandler, parts := routeKey split(\u0026quot;:\u0026quot;) routeMethod := parts at(0) routePath := parts at(1) if(routeMethod == request method and matchPath(routePath, request path), routeHandler call(request, response) handled = true break ) ) if(handled not, response setStatus(404) write(\u0026quot;Not Found\u0026quot;) ) ) socket write(response build) socket close ) HttpServer matchPath := method(pattern, path, // Simple pattern matching (e.g., /users/:id) if(pattern containsSeq(\u0026quot;:\u0026quot;), patternParts := pattern split(\u0026quot;/\u0026quot;) pathParts := path split(\u0026quot;/\u0026quot;) if(patternParts size != pathParts size, return false) patternParts foreach(i, part, if(part beginsWithSeq(\u0026quot;:\u0026quot;) not, if(part != pathParts at(i), return false) ) ) true , pattern == path ) ) HttpServer start := method( server := Socket clone server setHost(\u0026quot;127.0.0.1\u0026quot;) server setPort(port) server bind server listen (\u0026quot;Server listening on port \u0026quot; .. port) println loop( client := server accept @handleConnection(client) // Handle async ) ) // Example application app := HttpServer clone init(8080) // Middleware for logging app use(block(request, response, (\u0026quot;[\u0026quot; .. Date now .. \u0026quot;] \u0026quot; .. request method .. \u0026quot; \u0026quot; .. request path) println )) // Static content app get(\u0026quot;/\u0026quot;, block(request, response, response write(\u0026quot;\u0026lt;h1\u0026gt;Welcome to Io Web Server\u0026lt;/h1\u0026gt;\u0026quot;) response write(\u0026quot;\u0026lt;p\u0026gt;A simple server built with Io\u0026lt;/p\u0026gt;\u0026quot;) )) // JSON API app get(\u0026quot;/api/info\u0026quot;, block(request, response, info := Map with( \u0026quot;server\u0026quot;, \u0026quot;Io-Server\u0026quot;, \u0026quot;version\u0026quot;, \u0026quot;1.0\u0026quot;, \u0026quot;time\u0026quot;, Date now asString ) response json(info) )) // Dynamic routes app get(\u0026quot;/users/:id\u0026quot;, block(request, response, // Extract ID from path id := request path split(\u0026quot;/\u0026quot;) at(2) response write(\u0026quot;\u0026lt;h1\u0026gt;User Profile\u0026lt;/h1\u0026gt;\u0026quot;) response write(\u0026quot;\u0026lt;p\u0026gt;User ID: \u0026quot; .. id .. \u0026quot;\u0026lt;/p\u0026gt;\u0026quot;) )) // Form handling app post(\u0026quot;/submit\u0026quot;, block(request, response, // Parse form data from body response write(\u0026quot;\u0026lt;h1\u0026gt;Form Submitted\u0026lt;/h1\u0026gt;\u0026quot;) response write(\u0026quot;\u0026lt;p\u0026gt;Data: \u0026quot; .. request body .. \u0026quot;\u0026lt;/p\u0026gt;\u0026quot;) )) // Start server app start Case Study 2: Database ORM # A simple object-relational mapper showcasing metaprogramming and DSL capabilities:\n// ORM Implementation ORM := Object clone // Database connection (simplified) Database := Object clone Database connections := Map clone Database connect := method(name, config, conn := Connection clone init(config) connections atPut(name, conn) conn ) Connection := Object clone Connection init := method(config, self config := config self tables := Map clone self ) Connection execute := method(sql, (\u0026quot;[SQL] \u0026quot; .. sql) println // Simulate results list() ) // Model base class Model := Object clone Model tableName := nil Model fields := Map clone Model connection := nil Model field := method(name, type, fields atPut(name, Map with(\u0026quot;type\u0026quot;, type, \u0026quot;name\u0026quot;, name)) // Generate getter self setSlot(name, method( self getSlot(\u0026quot;_\u0026quot; .. name) )) // Generate setter self setSlot(\u0026quot;set\u0026quot; .. name asCapitalized, method(value, self setSlot(\u0026quot;_\u0026quot; .. name, value) self )) self ) Model belongsTo := method(name, targetModel, fields atPut(name .. \u0026quot;_id\u0026quot;, Map with(\u0026quot;type\u0026quot;, \u0026quot;INTEGER\u0026quot;, \u0026quot;name\u0026quot;, name .. \u0026quot;_id\u0026quot;)) self setSlot(name, method( targetModel findById(self getSlot(\u0026quot;_\u0026quot; .. name .. \u0026quot;_id\u0026quot;)) )) self ) Model hasMany := method(name, targetModel, foreignKey, self setSlot(name, method( targetModel where(foreignKey .. \u0026quot; = \u0026quot; .. self id) )) self ) Model createTable := method( sql := \u0026quot;CREATE TABLE IF NOT EXISTS \u0026quot; .. tableName .. \u0026quot; (\\n\u0026quot; sql = sql .. \u0026quot; id INTEGER PRIMARY KEY AUTOINCREMENT,\\n\u0026quot; fieldDefs := fields map(name, field, \u0026quot; \u0026quot; .. name .. \u0026quot; \u0026quot; .. field at(\u0026quot;type\u0026quot;) ) sql = sql .. fieldDefs join(\u0026quot;,\\n\u0026quot;) .. \u0026quot;\\n);\u0026quot; connection execute(sql) self ) Model dropTable := method( connection execute(\u0026quot;DROP TABLE IF EXISTS \u0026quot; .. tableName) self ) Model init := method( fields foreach(name, field, self setSlot(\u0026quot;_\u0026quot; .. name, nil) ) self setSlot(\u0026quot;_id\u0026quot;, nil) self ) Model save := method( if(_id, update, insert ) ) Model insert := method( columns := list() values := list() fields foreach(name, field, value := self getSlot(\u0026quot;_\u0026quot; .. name) if(value isNil not, columns append(name) values append(\u0026quot;'\u0026quot; .. value asString .. \u0026quot;'\u0026quot;) ) ) sql := \u0026quot;INSERT INTO \u0026quot; .. tableName .. \u0026quot; (\u0026quot; .. columns join(\u0026quot;, \u0026quot;) .. \u0026quot;) VALUES (\u0026quot; .. values join(\u0026quot;, \u0026quot;) .. \u0026quot;)\u0026quot; connection execute(sql) self _id := connection lastInsertId // Simulated self ) Model update := method( updates := list() fields foreach(name, field, value := self getSlot(\u0026quot;_\u0026quot; .. name) if(value isNil not, updates append(name .. \u0026quot; = '\u0026quot; .. value asString .. \u0026quot;'\u0026quot;) ) ) sql := \u0026quot;UPDATE \u0026quot; .. tableName .. \u0026quot; SET \u0026quot; .. updates join(\u0026quot;, \u0026quot;) .. \u0026quot; WHERE id = \u0026quot; .. _id connection execute(sql) self ) Model delete := method( if(_id, connection execute(\u0026quot;DELETE FROM \u0026quot; .. tableName .. \u0026quot; WHERE id = \u0026quot; .. _id) self _id := nil ) self ) // Class methods Model all := method( sql := \u0026quot;SELECT * FROM \u0026quot; .. tableName rows := connection execute(sql) rows map(row, fromRow(row)) ) Model findById := method(id, sql := \u0026quot;SELECT * FROM \u0026quot; .. tableName .. \u0026quot; WHERE id = \u0026quot; .. id rows := connection execute(sql) if(rows size \u0026gt; 0, fromRow(rows first), nil ) ) Model where := method(condition, sql := \u0026quot;SELECT * FROM \u0026quot; .. tableName .. \u0026quot; WHERE \u0026quot; .. condition rows := connection execute(sql) rows map(row, fromRow(row)) ) Model fromRow := method(row, instance := self clone init instance _id := row at(\u0026quot;id\u0026quot;) fields foreach(name, field, instance setSlot(\u0026quot;_\u0026quot; .. name, row at(name)) ) instance ) // Query builder QueryBuilder := Object clone QueryBuilder init := method(model, self model := model self selections := list(\u0026quot;*\u0026quot;) self conditions := list() self orderBy := nil self limitValue := nil self ) QueryBuilder select := method( self selections = call message arguments map(arg, call sender doMessage(arg) asString ) self ) QueryBuilder where := method(condition, conditions append(condition) self ) QueryBuilder order := method(column, direction, orderBy = column .. \u0026quot; \u0026quot; .. if(direction, direction, \u0026quot;ASC\u0026quot;) self ) QueryBuilder limit := method(n, limitValue = n self ) QueryBuilder build := method( sql := \u0026quot;SELECT \u0026quot; .. selections join(\u0026quot;, \u0026quot;) .. \u0026quot; FROM \u0026quot; .. model tableName if(conditions size \u0026gt; 0, sql = sql .. \u0026quot; WHERE \u0026quot; .. conditions join(\u0026quot; AND \u0026quot;) ) if(orderBy, sql = sql .. \u0026quot; ORDER BY \u0026quot; .. orderBy ) if(limitValue, sql = sql .. \u0026quot; LIMIT \u0026quot; .. limitValue ) sql ) QueryBuilder execute := method( sql := build rows := model connection execute(sql) rows map(row, model fromRow(row)) ) // Define models User := Model clone User tableName = \u0026quot;users\u0026quot; User connection = Database connect(\u0026quot;main\u0026quot;, Map with(\u0026quot;file\u0026quot;, \u0026quot;app.db\u0026quot;)) User field(\u0026quot;name\u0026quot;, \u0026quot;VARCHAR(100)\u0026quot;) \\ field(\u0026quot;email\u0026quot;, \u0026quot;VARCHAR(100)\u0026quot;) \\ field(\u0026quot;age\u0026quot;, \u0026quot;INTEGER\u0026quot;) \\ field(\u0026quot;created_at\u0026quot;, \u0026quot;DATETIME\u0026quot;) User hasMany(\u0026quot;posts\u0026quot;, Post, \u0026quot;user_id\u0026quot;) Post := Model clone Post tableName = \u0026quot;posts\u0026quot; Post connection = User connection Post field(\u0026quot;title\u0026quot;, \u0026quot;VARCHAR(200)\u0026quot;) \\ field(\u0026quot;content\u0026quot;, \u0026quot;TEXT\u0026quot;) \\ field(\u0026quot;published\u0026quot;, \u0026quot;BOOLEAN\u0026quot;) \\ field(\u0026quot;user_id\u0026quot;, \u0026quot;INTEGER\u0026quot;) Post belongsTo(\u0026quot;user\u0026quot;, User) // Validations User validate := method( errors := list() if(_name isNil or _name size == 0, errors append(\u0026quot;Name is required\u0026quot;) ) if(_email isNil or _email containsSeq(\u0026quot;@\u0026quot;) not, errors append(\u0026quot;Invalid email\u0026quot;) ) if(_age and (_age \u0026lt; 0 or _age \u0026gt; 150), errors append(\u0026quot;Invalid age\u0026quot;) ) if(errors size \u0026gt; 0, Exception raise(errors join(\u0026quot;, \u0026quot;)) ) true ) User beforeSave := method( validate _created_at := Date now ) // Usage example User createTable Post createTable user := User clone init user setName(\u0026quot;Alice\u0026quot;) setEmail(\u0026quot;alice@example.com\u0026quot;) setAge(30) user save post := Post clone init post setTitle(\u0026quot;First Post\u0026quot;) \\ setContent(\u0026quot;Hello, World!\u0026quot;) \\ setPublished(true) \\ setUserId(user id) post save // Query examples allUsers := User all youngUsers := User where(\u0026quot;age \u0026lt; 25\u0026quot;) userPosts := user posts // Query builder query := QueryBuilder clone init(User) results := query select(\u0026quot;name\u0026quot;, \u0026quot;email\u0026quot;) \\ where(\u0026quot;age \u0026gt; 21\u0026quot;) \\ order(\u0026quot;name\u0026quot;) \\ limit(10) \\ execute Case Study 3: Game Engine # A simple 2D game engine demonstrating real-time systems and graphics:\n// Game Engine Core GameEngine := Object clone GameEngine init := method(width, height, self width := width self height := height self entities := list() self systems := list() self running := true self fps := 60 self frameTime := 1.0 / fps self ) // Entity Component System Entity := Object clone Entity init := method( self id := Random uuid self components := Map clone self active := true self ) Entity addComponent := method(name, component, components atPut(name, component) component entity := self self ) Entity getComponent := method(name, components at(name) ) Entity hasComponent := method(name, components hasKey(name) ) // Components Component := Object clone PositionComponent := Component clone PositionComponent init := method(x, y, self x := x self y := y self ) VelocityComponent := Component clone VelocityComponent init := method(dx, dy, self dx := dx self dy := dy self ) SpriteComponent := Component clone SpriteComponent init := method(image, width, height, self image := image self width := width self height := height self ) ColliderComponent := Component clone ColliderComponent init := method(width, height, self width := width self height := height self ) HealthComponent := Component clone HealthComponent init := method(maxHealth, self maxHealth := maxHealth self currentHealth := maxHealth self ) // Systems System := Object clone System init := method( self requiredComponents := list() self ) System process := method(entity, deltaTime, // Override in subclasses ) System canProcess := method(entity, requiredComponents all(comp, entity hasComponent(comp) ) ) MovementSystem := System clone MovementSystem requiredComponents = list(\u0026quot;position\u0026quot;, \u0026quot;velocity\u0026quot;) MovementSystem process := method(entity, deltaTime, pos := entity getComponent(\u0026quot;position\u0026quot;) vel := entity getComponent(\u0026quot;velocity\u0026quot;) pos x = pos x + vel dx * deltaTime pos y = pos y + vel dy * deltaTime ) CollisionSystem := System clone CollisionSystem requiredComponents = list(\u0026quot;position\u0026quot;, \u0026quot;collider\u0026quot;) CollisionSystem init := method( resend self collisions := list() self ) CollisionSystem update := method(entities, deltaTime, collisions = list() // Check all pairs entities foreach(i, e1, if(canProcess(e1), entities slice(i + 1) foreach(e2, if(canProcess(e2) and checkCollision(e1, e2), collisions append(list(e1, e2)) onCollision(e1, e2) ) ) ) ) ) CollisionSystem checkCollision := method(e1, e2, p1 := e1 getComponent(\u0026quot;position\u0026quot;) c1 := e1 getComponent(\u0026quot;collider\u0026quot;) p2 := e2 getComponent(\u0026quot;position\u0026quot;) c2 := e2 getComponent(\u0026quot;collider\u0026quot;) // AABB collision p1 x \u0026lt; p2 x + c2 width and p1 x + c1 width \u0026gt; p2 x and p1 y \u0026lt; p2 y + c2 height and p1 y + c1 height \u0026gt; p2 y ) CollisionSystem onCollision := method(e1, e2, (\u0026quot;Collision between \u0026quot; .. e1 id .. \u0026quot; and \u0026quot; .. e2 id) println ) // Rendering (simulated) RenderSystem := System clone RenderSystem requiredComponents = list(\u0026quot;position\u0026quot;, \u0026quot;sprite\u0026quot;) RenderSystem init := method( resend self screen := list() self ) RenderSystem render := method(entities, // Clear screen screen = list() entities foreach(entity, if(canProcess(entity), pos := entity getComponent(\u0026quot;position\u0026quot;) sprite := entity getComponent(\u0026quot;sprite\u0026quot;) screen append(Map with( \u0026quot;x\u0026quot;, pos x, \u0026quot;y\u0026quot;, pos y, \u0026quot;image\u0026quot;, sprite image )) ) ) // Draw screen (simulated) drawScreen ) RenderSystem drawScreen := method( \u0026quot;Frame:\u0026quot; println screen foreach(item, (\u0026quot; [\u0026quot; .. item at(\u0026quot;image\u0026quot;) .. \u0026quot;] at (\u0026quot; .. item at(\u0026quot;x\u0026quot;) round .. \u0026quot;, \u0026quot; .. item at(\u0026quot;y\u0026quot;) round .. \u0026quot;)\u0026quot;) println ) ) // Input handling InputManager := Object clone InputManager init := method( self keys := Map clone self mouseX := 0 self mouseY := 0 self ) InputManager isKeyPressed := method(key, keys at(key, false) ) InputManager setKey := method(key, pressed, keys atPut(key, pressed) ) // Game states GameState := Object clone GameState enter := method() GameState exit := method() GameState update := method(deltaTime) GameState render := method() MenuState := GameState clone MenuState enter := method( \u0026quot;Entering menu\u0026quot; println self selectedOption := 0 self options := list(\u0026quot;Start Game\u0026quot;, \u0026quot;Options\u0026quot;, \u0026quot;Quit\u0026quot;) ) MenuState update := method(deltaTime, // Handle menu input if(InputManager isKeyPressed(\u0026quot;up\u0026quot;), selectedOption = (selectedOption - 1) max(0) ) if(InputManager isKeyPressed(\u0026quot;down\u0026quot;), selectedOption = (selectedOption + 1) min(options size - 1) ) if(InputManager isKeyPressed(\u0026quot;enter\u0026quot;), handleSelection ) ) MenuState handleSelection := method( option := options at(selectedOption) if(option == \u0026quot;Start Game\u0026quot;, GameEngine setState(PlayState) ) if(option == \u0026quot;Quit\u0026quot;, GameEngine stop ) ) PlayState := GameState clone PlayState enter := method( \u0026quot;Starting game\u0026quot; println createLevel ) PlayState createLevel := method( // Create player player := Entity clone init player addComponent(\u0026quot;position\u0026quot;, PositionComponent clone init(100, 100)) player addComponent(\u0026quot;velocity\u0026quot;, VelocityComponent clone init(0, 0)) player addComponent(\u0026quot;sprite\u0026quot;, SpriteComponent clone init(\u0026quot;player\u0026quot;, 32, 32)) player addComponent(\u0026quot;collider\u0026quot;, ColliderComponent clone init(32, 32)) player addComponent(\u0026quot;health\u0026quot;, HealthComponent clone init(100)) GameEngine addEntity(player) // Create enemies 3 repeat(i, enemy := Entity clone init enemy addComponent(\u0026quot;position\u0026quot;, PositionComponent clone init(200 + i * 50, 200)) enemy addComponent(\u0026quot;velocity\u0026quot;, VelocityComponent clone init(Random value * 20 - 10, Random value * 20 - 10)) enemy addComponent(\u0026quot;sprite\u0026quot;, SpriteComponent clone init(\u0026quot;enemy\u0026quot;, 24, 24)) enemy addComponent(\u0026quot;collider\u0026quot;, ColliderComponent clone init(24, 24)) GameEngine addEntity(enemy) ) ) PlayState update := method(deltaTime, // Handle player input player := GameEngine entities first if(player, vel := player getComponent(\u0026quot;velocity\u0026quot;) vel dx = 0 vel dy = 0 if(InputManager isKeyPressed(\u0026quot;left\u0026quot;), vel dx = -100) if(InputManager isKeyPressed(\u0026quot;right\u0026quot;), vel dx = 100) if(InputManager isKeyPressed(\u0026quot;up\u0026quot;), vel dy = -100) if(InputManager isKeyPressed(\u0026quot;down\u0026quot;), vel dy = 100) ) ) // Main game engine methods GameEngine addEntity := method(entity, entities append(entity) entity ) GameEngine removeEntity := method(entity, entities remove(entity) ) GameEngine addSystem := method(system, systems append(system) system ) GameEngine setState := method(state, if(hasSlot(\u0026quot;currentState\u0026quot;) and currentState, currentState exit ) currentState := state currentState enter ) GameEngine update := method(deltaTime, // Update current state if(currentState, currentState update(deltaTime) ) // Update systems systems foreach(system, if(system hasSlot(\u0026quot;update\u0026quot;), system update(entities, deltaTime), entities foreach(entity, if(system canProcess(entity), system process(entity, deltaTime) ) ) ) ) // Remove inactive entities entities = entities select(e, e active) ) GameEngine render := method( if(currentState, currentState render ) renderSystem render(entities) ) GameEngine run := method( lastTime := Date now while(running, currentTime := Date now deltaTime := currentTime - lastTime if(deltaTime \u0026gt;= frameTime, update(deltaTime) render lastTime = currentTime ) // Small delay to prevent CPU spinning wait(0.001) ) ) GameEngine stop := method( running = false ) // Initialize and run game game := GameEngine clone init(800, 600) // Add systems game addSystem(MovementSystem clone) game addSystem(CollisionSystem clone init) game renderSystem := RenderSystem clone init // Set initial state game setState(MenuState) // Simulate some gameplay \u0026quot;=== Game Engine Demo ===\u0026quot; println MenuState handleSelection // Start game // Run a few frames 5 repeat(i, (\u0026quot;Frame \u0026quot; .. i) println game update(game frameTime) game render wait(0.1) ) Case Study 4: Build System # A build system similar to Make or Rake:\n// Build System BuildSystem := Object clone BuildSystem init := method( self tasks := Map clone self dependencies := Map clone self executed := list() self config := Map clone self ) Task := Object clone Task init := method(name, deps, action, self name := name self dependencies := if(deps, deps, list()) self action := action self outputs := list() self inputs := list() self ) Task execute := method(context, (\u0026quot;Executing task: \u0026quot; .. name) println if(action, action call(context) ) ) Task upToDate := method( if(outputs size == 0 or inputs size == 0, return false ) outputTime := outputs map(f, File with(f) lastModified) min inputTime := inputs map(f, File with(f) lastModified) max outputTime \u0026gt; inputTime ) // DSL for defining tasks BuildSystem task := method(name, t := Task clone init(name, list(), nil) tasks atPut(name, t) self currentTask := t call evalArgAt(0) t ) BuildSystem desc := method(description, if(currentTask, currentTask description := description ) ) BuildSystem depends := method( deps := call message arguments map(arg, call sender doMessage(arg) asString ) if(currentTask, currentTask dependencies = deps ) ) BuildSystem action := method( if(currentTask, currentTask action = call argAt(0) ) ) BuildSystem file := method(output, inputs, name := output t := Task clone init(name, list(), nil) t outputs = list(output) t inputs = if(inputs type == \u0026quot;List\u0026quot;, inputs, list(inputs)) tasks atPut(name, t) self currentTask := t call evalArgAt(2) t ) // Running tasks BuildSystem run := method(taskName, executed = list() executeTask(taskName) ) BuildSystem executeTask := method(taskName, if(executed contains(taskName), return ) task := tasks at(taskName) if(task isNil, Exception raise(\u0026quot;Task not found: \u0026quot; .. taskName) ) // Check if up to date if(task upToDate, (\u0026quot;Task \u0026quot; .. taskName .. \u0026quot; is up to date\u0026quot;) println return ) // Execute dependencies first task dependencies foreach(dep, executeTask(dep) ) // Execute the task task execute(self) executed append(taskName) ) // Utilities BuildSystem sh := method(command, (\u0026quot;$ \u0026quot; .. command) println System system(command) ) BuildSystem glob := method(pattern, Directory with(\u0026quot;.\u0026quot;) files select(f, f name matchesRegex(pattern) ) map(name) ) BuildSystem mkdir := method(path, Directory with(path) create ) BuildSystem cp := method(src, dest, File with(src) copyTo(dest) ) BuildSystem rm := method(path, File with(path) remove ) // Configuration BuildSystem configure := method( call message arguments foreach(arg, key := arg name value := call sender doMessage(arg arguments at(0)) config atPut(key, value) ) self ) // Example Buildfile build := BuildSystem clone init build configure( compiler: \u0026quot;gcc\u0026quot;, flags: \u0026quot;-Wall -O2\u0026quot;, srcDir: \u0026quot;src\u0026quot;, buildDir: \u0026quot;build\u0026quot; ) build task(\u0026quot;clean\u0026quot;, desc(\u0026quot;Remove all build artifacts\u0026quot;) action( rm(config at(\u0026quot;buildDir\u0026quot;)) \u0026quot;Cleaned\u0026quot; println ) ) build task(\u0026quot;init\u0026quot;, desc(\u0026quot;Initialize build directory\u0026quot;) action( mkdir(config at(\u0026quot;buildDir\u0026quot;)) ) ) build task(\u0026quot;compile\u0026quot;, desc(\u0026quot;Compile C sources\u0026quot;) depends(\u0026quot;init\u0026quot;) action( sources := glob(\u0026quot;src/*.c\u0026quot;) sources foreach(src, obj := src replaceSeq(\u0026quot;.c\u0026quot;, \u0026quot;.o\u0026quot;) replaceSeq(\u0026quot;src/\u0026quot;, \u0026quot;build/\u0026quot;) sh(config at(\u0026quot;compiler\u0026quot;) .. \u0026quot; \u0026quot; .. config at(\u0026quot;flags\u0026quot;) .. \u0026quot; -c \u0026quot; .. src .. \u0026quot; -o \u0026quot; .. obj) ) ) ) build task(\u0026quot;link\u0026quot;, desc(\u0026quot;Link object files\u0026quot;) depends(\u0026quot;compile\u0026quot;) action( objects := glob(\u0026quot;build/*.o\u0026quot;) join(\u0026quot; \u0026quot;) sh(config at(\u0026quot;compiler\u0026quot;) .. \u0026quot; \u0026quot; .. objects .. \u0026quot; -o build/app\u0026quot;) ) ) build task(\u0026quot;test\u0026quot;, desc(\u0026quot;Run tests\u0026quot;) depends(\u0026quot;link\u0026quot;) action( sh(\u0026quot;./build/app --test\u0026quot;) ) ) build task(\u0026quot;default\u0026quot;, depends(\u0026quot;link\u0026quot;) ) // File tasks for individual files build file(\u0026quot;build/main.o\u0026quot;, list(\u0026quot;src/main.c\u0026quot;), action( sh(config at(\u0026quot;compiler\u0026quot;) .. \u0026quot; \u0026quot; .. config at(\u0026quot;flags\u0026quot;) .. \u0026quot; -c src/main.c -o build/main.o\u0026quot;) ) ) // Run build build run(\u0026quot;default\u0026quot;) Lessons Learned # These case studies demonstrate several key insights about building real applications in Io:\nStrengths # Rapid Prototyping: Io\u0026rsquo;s minimal syntax and dynamic nature make it excellent for quickly building working prototypes.\nDSL Creation: The HTTP server\u0026rsquo;s routing, ORM\u0026rsquo;s query builder, and build system all show how naturally DSLs emerge in Io.\nFlexibility: The ability to modify anything at runtime made it easy to add features like middleware, validations, and hooks.\nConcurrency: The @ operator and coroutines made async request handling in the web server trivial.\nChallenges # Performance: For the game engine, Io\u0026rsquo;s interpreted nature and message passing overhead would limit frame rates in a real game.\nType Safety: The ORM would benefit from type checking that Io doesn\u0026rsquo;t provide, leading to potential runtime errors.\nTooling: Lack of IDE support makes maintaining larger codebases challenging.\nLibraries: Many features had to be built from scratch due to limited ecosystem.\nBest Practices # Use Prototypes Effectively: Define clear prototype hierarchies (Model -\u0026gt; User, Component -\u0026gt; PositionComponent).\nLeverage Message Passing: The game engine\u0026rsquo;s entity-component system naturally maps to message passing.\nBuild Abstractions: Each case study built higher-level abstractions (Repository, Task, System) on Io\u0026rsquo;s primitives.\nEmbrace DSLs: Don\u0026rsquo;t fight the language—use its strengths to create domain-appropriate interfaces.\nConclusion # These case studies show that Io is capable of building real applications, though with trade-offs. Its strengths in metaprogramming, DSL creation, and rapid prototyping make it excellent for certain domains, while performance-critical or large-scale applications might be better served by other languages. The key is understanding these trade-offs and using Io where its unique capabilities provide the most value.\n"},{"id":19,"href":"/docs/17-ecosystem-and-libraries/","title":"Ecosystem and Libraries","section":"Chapters","content":" Chapter 17: Ecosystem and Libraries # While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem.\nCore Libraries # Io comes with several built-in libraries that extend its capabilities:\nFile I/O and System # // File operations file := File with(\u0026quot;data.txt\u0026quot;) // Reading if(file exists, contents := file contents lines := file readLines // Read with encoding file setEncoding(\u0026quot;UTF-8\u0026quot;) text := file contents ) // Writing file openForWriting file write(\u0026quot;Hello, World!\\n\u0026quot;) file write(\u0026quot;Line 2\\n\u0026quot;) file close // Appending file openForAppending file write(\u0026quot;Additional line\\n\u0026quot;) file close // File information file size println file lastModified println file isDirectory println // Directory operations dir := Directory with(\u0026quot;./src\u0026quot;) dir files foreach(file, file name println ) dir directories foreach(subdir, subdir path println ) // Recursive directory walking dir recursiveFilesOfType(\u0026quot;io\u0026quot;) foreach(ioFile, ioFile path println ) // System operations System system(\u0026quot;ls -la\u0026quot;) // Execute shell command System getEnvironmentVariable(\u0026quot;HOME\u0026quot;) println System setEnvironmentVariable(\u0026quot;MY_VAR\u0026quot;, \u0026quot;value\u0026quot;) System exit(0) Networking # // HTTP Client url := URL with(\u0026quot;https://api.example.com/data\u0026quot;) url fetch println // Simple GET request // With headers url setHeader(\u0026quot;Authorization\u0026quot;, \u0026quot;Bearer token\u0026quot;) url setHeader(\u0026quot;Content-Type\u0026quot;, \u0026quot;application/json\u0026quot;) response := url fetch // POST request url setMethod(\u0026quot;POST\u0026quot;) url setBody(\u0026quot;{\\\u0026quot;key\\\u0026quot;: \\\u0026quot;value\\\u0026quot;}\u0026quot;) response := url fetch // Socket programming // Server server := Socket clone server setHost(\u0026quot;127.0.0.1\u0026quot;) server setPort(8080) server bind server listen loop( client := server accept @( data := client readUntilSeq(\u0026quot;\\n\u0026quot;) client write(\u0026quot;Echo: \u0026quot; .. data) client close ) ) // Client client := Socket clone client setHost(\u0026quot;127.0.0.1\u0026quot;) client setPort(8080) client connect client write(\u0026quot;Hello, server!\\n\u0026quot;) response := client readUntilSeq(\u0026quot;\\n\u0026quot;) response println client close Date and Time # // Current date/time now := Date now now println // Date components now year println now month println now day println now hour println now minute println now second println // Date arithmetic tomorrow := now + Duration days(1) nextWeek := now + Duration weeks(1) hourAgo := now - Duration hours(1) // Formatting now asString(\u0026quot;%Y-%m-%d %H:%M:%S\u0026quot;) println now asString(\u0026quot;%B %d, %Y\u0026quot;) println // Parsing date := Date fromString(\u0026quot;2024-01-15\u0026quot;, \u0026quot;%Y-%m-%d\u0026quot;) // Duration duration := Duration clone duration setDays(2) setHours(3) setMinutes(30) duration asSeconds println // Timing code start := Date now // ... code to time ... elapsed := Date now - start (\u0026quot;Elapsed: \u0026quot; .. elapsed) println Regular Expressions # // Basic matching text := \u0026quot;The year 2024 has 365 days\u0026quot; text matchesRegex(\u0026quot;\\\\d+\u0026quot;) println // true // Finding matches match := text findRegex(\u0026quot;\\\\d+\u0026quot;) match start println // Starting position match end println // Ending position match string println // Matched string // All matches matches := text allMatchesOfRegex(\u0026quot;\\\\d+\u0026quot;) matches foreach(m, m string println // 2024, 365 ) // Replacement result := text replaceFirstRegex(\u0026quot;\\\\d+\u0026quot;, \u0026quot;N\u0026quot;) result println // The year N has 365 days result := text replaceAllRegex(\u0026quot;\\\\d+\u0026quot;, \u0026quot;N\u0026quot;) result println // The year N has N days // Capture groups email := \u0026quot;user@example.com\u0026quot; pattern := \u0026quot;(\\\\w+)@([\\\\w.]+)\u0026quot; if(match := email matchesOfRegex(pattern), match at(1) println // user match at(2) println // example.com ) // Compiling regex for reuse regex := Regex with(\u0026quot;\\\\b\\\\w{5}\\\\b\u0026quot;) // 5-letter words regex matches(\u0026quot;hello\u0026quot;) println // true regex matches(\u0026quot;hi\u0026quot;) println // false JSON # // Parsing JSON jsonString := \u0026quot;\u0026quot;\u0026quot; { \u0026quot;name\u0026quot;: \u0026quot;Alice\u0026quot;, \u0026quot;age\u0026quot;: 30, \u0026quot;interests\u0026quot;: [\u0026quot;coding\u0026quot;, \u0026quot;music\u0026quot;], \u0026quot;address\u0026quot;: { \u0026quot;city\u0026quot;: \u0026quot;New York\u0026quot;, \u0026quot;zip\u0026quot;: \u0026quot;10001\u0026quot; } } \u0026quot;\u0026quot;\u0026quot; data := jsonString parseJson data at(\u0026quot;name\u0026quot;) println // Alice data at(\u0026quot;interests\u0026quot;) at(0) println // coding data at(\u0026quot;address\u0026quot;) at(\u0026quot;city\u0026quot;) println // New York // Creating JSON person := Map with( \u0026quot;name\u0026quot;, \u0026quot;Bob\u0026quot;, \u0026quot;age\u0026quot;, 25, \u0026quot;active\u0026quot;, true, \u0026quot;tags\u0026quot;, list(\u0026quot;developer\u0026quot;, \u0026quot;gamer\u0026quot;) ) json := person asJson json println // {\u0026quot;name\u0026quot;:\u0026quot;Bob\u0026quot;,\u0026quot;age\u0026quot;:25,\u0026quot;active\u0026quot;:true,\u0026quot;tags\u0026quot;:[\u0026quot;developer\u0026quot;,\u0026quot;gamer\u0026quot;]} // Pretty printing json := person asJson(true) // Pretty format XML # // Parsing XML xmlString := \u0026quot;\u0026quot;\u0026quot; \u0026lt;root\u0026gt; \u0026lt;person id=\u0026quot;1\u0026quot;\u0026gt; \u0026lt;name\u0026gt;Alice\u0026lt;/name\u0026gt; \u0026lt;age\u0026gt;30\u0026lt;/age\u0026gt; \u0026lt;/person\u0026gt; \u0026lt;person id=\u0026quot;2\u0026quot;\u0026gt; \u0026lt;name\u0026gt;Bob\u0026lt;/name\u0026gt; \u0026lt;age\u0026gt;25\u0026lt;/age\u0026gt; \u0026lt;/person\u0026gt; \u0026lt;/root\u0026gt; \u0026quot;\u0026quot;\u0026quot; doc := SGML parseString(xmlString) root := doc root // Navigate XML people := root elementsWithName(\u0026quot;person\u0026quot;) people foreach(person, id := person attributeAt(\u0026quot;id\u0026quot;) name := person elementWithName(\u0026quot;name\u0026quot;) text age := person elementWithName(\u0026quot;age\u0026quot;) text (id .. \u0026quot;: \u0026quot; .. name .. \u0026quot; (\u0026quot; .. age .. \u0026quot;)\u0026quot;) println ) // Build XML doc := SGML clone root := doc addElement(\u0026quot;catalog\u0026quot;) book := root addElement(\u0026quot;book\u0026quot;) book setAttribute(\u0026quot;isbn\u0026quot;, \u0026quot;123456\u0026quot;) book addElement(\u0026quot;title\u0026quot;) setText(\u0026quot;Io Programming\u0026quot;) book addElement(\u0026quot;author\u0026quot;) setText(\u0026quot;Jane Doe\u0026quot;) book addElement(\u0026quot;price\u0026quot;) setText(\u0026quot;29.99\u0026quot;) doc asString println Addon System # Io\u0026rsquo;s addon system allows loading C-based extensions:\n// Loading addons Addon load(\u0026quot;Socket\u0026quot;) // Network programming Addon load(\u0026quot;Random\u0026quot;) // Random number generation Addon load(\u0026quot;Regex\u0026quot;) // Regular expressions Addon load(\u0026quot;SQLite\u0026quot;) // Database access // Check available addons Addon availableAddons foreach(name, name println ) // Addon information addon := Addon named(\u0026quot;Socket\u0026quot;) addon path println addon dependencies println Database Libraries # SQLite # // SQLite integration db := SQLite clone db open(\u0026quot;app.db\u0026quot;) // Create table db exec(\u0026quot;\u0026quot;\u0026quot; CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) \u0026quot;\u0026quot;\u0026quot;) // Insert data stmt := db prepare(\u0026quot;INSERT INTO users (name, email) VALUES (?, ?)\u0026quot;) stmt bind(1, \u0026quot;Alice\u0026quot;) stmt bind(2, \u0026quot;alice@example.com\u0026quot;) stmt step stmt reset // Query data results := db exec(\u0026quot;SELECT * FROM users WHERE name LIKE 'A%'\u0026quot;) results foreach(row, (\u0026quot;ID: \u0026quot; .. row at(\u0026quot;id\u0026quot;) .. \u0026quot;, Name: \u0026quot; .. row at(\u0026quot;name\u0026quot;)) println ) // Prepared statements with results stmt := db prepare(\u0026quot;SELECT * FROM users WHERE id = ?\u0026quot;) stmt bind(1, 1) while(stmt step == SQLite ROW, name := stmt columnText(1) email := stmt columnText(2) (name .. \u0026quot; - \u0026quot; .. email) println ) stmt finalize db close // Transactions db begin try( db exec(\u0026quot;INSERT INTO users ...\u0026quot;) db exec(\u0026quot;UPDATE users ...\u0026quot;) db commit ) catch(Exception, e, db rollback e raise ) Graphics and GUI # OpenGL # // OpenGL addon (if available) Addon load(\u0026quot;OpenGL\u0026quot;) // Basic window setup window := GLApp clone window width := 800 window height := 600 window title := \u0026quot;Io OpenGL\u0026quot; window draw := method( glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glBegin(GL_TRIANGLES) glColor3f(1, 0, 0) glVertex2f(-0.5, -0.5) glColor3f(0, 1, 0) glVertex2f(0.5, -0.5) glColor3f(0, 0, 1) glVertex2f(0, 0.5) glEnd swapBuffers ) window run Image Processing # // Image addon Addon load(\u0026quot;Image\u0026quot;) // Load and manipulate images img := Image clone img open(\u0026quot;photo.jpg\u0026quot;) // Get information img width println img height println img componentCount println // Color channels // Basic operations img resize(800, 600) img crop(100, 100, 400, 300) img flip(\u0026quot;horizontal\u0026quot;) img rotate(90) // Filters img blur(5) img sharpen img adjustBrightness(1.2) img adjustContrast(1.5) img grayscale // Save img save(\u0026quot;modified.png\u0026quot;) // Create new image canvas := Image clone canvas allocate(500, 500, 3) // RGB canvas fill(Color with(0.5, 0.5, 1.0)) // Light blue // Draw on image canvas drawLine(0, 0, 500, 500, Color red) canvas drawCircle(250, 250, 100, Color green) canvas drawRectangle(100, 100, 300, 200, Color blue) canvas save(\u0026quot;drawing.png\u0026quot;) Cryptography # // Crypto addon Addon load(\u0026quot;MD5\u0026quot;) Addon load(\u0026quot;SHA1\u0026quot;) // Hashing text := \u0026quot;Hello, World!\u0026quot; md5 := MD5 clone md5 appendSeq(text) md5 hexDigest println // MD5 hash sha := SHA1 clone sha appendSeq(text) sha hexDigest println // SHA1 hash // File hashing file := File with(\u0026quot;document.pdf\u0026quot;) hash := MD5 hashFile(file path) hash println // HMAC (if available) key := \u0026quot;secret-key\u0026quot; message := \u0026quot;Important message\u0026quot; hmac := HMAC sha256(key, message) hmac println Third-Party Libraries # Package Management # While Io doesn\u0026rsquo;t have a centralized package manager like npm or pip, libraries can be managed through:\n// Simple package loader PackageLoader := Object clone PackageLoader paths := list( \u0026quot;~/.io/packages\u0026quot;, \u0026quot;/usr/local/io/packages\u0026quot;, \u0026quot;./packages\u0026quot; ) PackageLoader load := method(name, paths foreach(path, packageFile := Path with(path, name, \u0026quot;init.io\u0026quot;) if(File with(packageFile) exists, doFile(packageFile) return true ) ) Exception raise(\u0026quot;Package not found: \u0026quot; .. name) ) // Usage PackageLoader load(\u0026quot;web-framework\u0026quot;) PackageLoader load(\u0026quot;test-framework\u0026quot;) Creating Libraries # Structure for an Io library:\n// mylib/init.io - Entry point MyLib := Object clone MyLib version := \u0026quot;1.0.0\u0026quot; // Load components doRelativeFile(\u0026quot;core.io\u0026quot;) doRelativeFile(\u0026quot;utils.io\u0026quot;) doRelativeFile(\u0026quot;extensions.io\u0026quot;) // Export public API MyLib // mylib/core.io MyLib Core := Object clone MyLib Core process := method(data, // Core functionality ) // mylib/utils.io MyLib Utils := Object clone MyLib Utils helper := method( // Utility functions ) // mylib/extensions.io // Extend built-in types List customMethod := method( // Extended functionality ) Testing Frameworks # Simple testing framework example:\n// SimpleTest framework Test := Object clone Test suites := list() Test describe := method(name, block, suite := TestSuite clone suite name := name suite tests := list() suite it := method(desc, testBlock, tests append(list(desc, testBlock)) ) block call(suite) suites append(suite) ) Test run := method( totalTests := 0 passedTests := 0 suites foreach(suite, (\u0026quot;\\n\u0026quot; .. suite name) println (\u0026quot;=\u0026quot; repeated(suite name size)) println suite tests foreach(test, desc := test at(0) block := test at(1) totalTests = totalTests + 1 e := try( block call (\u0026quot; ✓ \u0026quot; .. desc) println passedTests = passedTests + 1 ) catch(Exception, e, (\u0026quot; ✗ \u0026quot; .. desc) println (\u0026quot; \u0026quot; .. e message) println ) ) ) (\u0026quot;\\n\u0026quot; .. passedTests .. \u0026quot;/\u0026quot; .. totalTests .. \u0026quot; tests passed\u0026quot;) println ) // Usage Test describe(\u0026quot;Array operations\u0026quot;, suite, suite it(\u0026quot;should append elements\u0026quot;, arr := list(1, 2) arr append(3) assert(arr size == 3) ) suite it(\u0026quot;should remove elements\u0026quot;, arr := list(1, 2, 3) arr remove(2) assert(arr contains(2) not) ) ) Test run Documentation Tools # Generating Documentation # // Simple documentation generator DocGen := Object clone DocGen init := method( self docs := Map clone self ) DocGen document := method(obj, name, info := Map clone info atPut(\u0026quot;name\u0026quot;, name) info atPut(\u0026quot;type\u0026quot;, obj type) info atPut(\u0026quot;slots\u0026quot;, obj slotNames sort) // Extract method signatures methods := Map clone obj slotNames foreach(slotName, slot := obj getSlot(slotName) if(slot type == \u0026quot;Block\u0026quot;, methods atPut(slotName, slot argumentNames) ) ) info atPut(\u0026quot;methods\u0026quot;, methods) docs atPut(name, info) self ) DocGen generateMarkdown := method( md := \u0026quot;# API Documentation\\n\\n\u0026quot; docs foreach(name, info, md = md .. \u0026quot;## \u0026quot; .. name .. \u0026quot;\\n\\n\u0026quot; md = md .. \u0026quot;**Type**: \u0026quot; .. info at(\u0026quot;type\u0026quot;) .. \u0026quot;\\n\\n\u0026quot; methods := info at(\u0026quot;methods\u0026quot;) if(methods size \u0026gt; 0, md = md .. \u0026quot;### Methods\\n\\n\u0026quot; methods foreach(method, args, md = md .. \u0026quot;- `\u0026quot; .. method .. \u0026quot;(\u0026quot; .. args join(\u0026quot;, \u0026quot;) .. \u0026quot;)`\\n\u0026quot; ) md = md .. \u0026quot;\\n\u0026quot; ) ) md ) // Usage docGen := DocGen clone init docGen document(MyClass, \u0026quot;MyClass\u0026quot;) docGen document(MyUtils, \u0026quot;MyUtils\u0026quot;) File with(\u0026quot;API.md\u0026quot;) openForWriting write(docGen generateMarkdown) close Development Tools # REPL Enhancements # // Enhanced REPL REPL := Object clone REPL history := list() REPL commands := Map clone REPL registerCommand := method(name, block, commands atPut(name, block) ) REPL run := method( loop( \u0026quot;io\u0026gt; \u0026quot; print input := File standardInput readLine if(input beginsWithSeq(\u0026quot;:\u0026quot;), // Handle commands cmd := input afterSeq(\u0026quot;:\u0026quot;) if(commands hasKey(cmd), commands at(cmd) call, (\u0026quot;Unknown command: \u0026quot; .. cmd) println ), // Evaluate Io code history append(input) e := try( result := doString(input) (\u0026quot;==\u0026gt; \u0026quot; .. result) println ) catch(Exception, e, (\u0026quot;Error: \u0026quot; .. e message) println ) ) ) ) // Register commands REPL registerCommand(\u0026quot;help\u0026quot;, block( \u0026quot;Available commands:\u0026quot; println commands keys foreach(cmd, (\u0026quot; :\u0026quot; .. cmd) println ) )) REPL registerCommand(\u0026quot;history\u0026quot;, block( history foreach(i, line, (i .. \u0026quot;: \u0026quot; .. line) println ) )) REPL registerCommand(\u0026quot;clear\u0026quot;, block( System system(\u0026quot;clear\u0026quot;) )) REPL registerCommand(\u0026quot;quit\u0026quot;, block( System exit )) // Run enhanced REPL REPL run Debugging Tools # // Simple debugger Debugger := Object clone Debugger breakpoints := list() Debugger stepping := false Object debug := method( Debugger enter(self, call) ) Debugger enter := method(context, callObj, \u0026quot;=== Debugger ===\u0026quot; println (\u0026quot;Context: \u0026quot; .. context type) println (\u0026quot;Location: \u0026quot; .. callObj message) println loop( \u0026quot;\u0026gt; \u0026quot; print cmd := File standardInput readLine split(\u0026quot; \u0026quot;) if(cmd at(0) == \u0026quot;inspect\u0026quot;, target := cmd at(1) if(target, obj := context doString(target) obj slotNames foreach(slot, (\u0026quot; \u0026quot; .. slot .. \u0026quot;: \u0026quot; .. obj getSlot(slot) type) println ) ) ) if(cmd at(0) == \u0026quot;eval\u0026quot;, code := cmd slice(1) join(\u0026quot; \u0026quot;) result := context doString(code) result println ) if(cmd at(0) == \u0026quot;continue\u0026quot;, break ) if(cmd at(0) == \u0026quot;help\u0026quot;, \u0026quot;Commands: inspect \u0026lt;obj\u0026gt;, eval \u0026lt;code\u0026gt;, continue, help\u0026quot; println ) ) ) Community Resources # Finding Libraries # Common sources for Io libraries:\nGitHub: Search for \u0026ldquo;io-language\u0026rdquo; or \u0026ldquo;iolanguage\u0026rdquo; topics Official Repository: https://github.com/IoLanguage/io Community Addons: Various developers maintain addon collections Contributing # Creating an addon for the community:\n// addon.io - Addon metadata Addon := Object clone Addon name := \u0026quot;MyAddon\u0026quot; Addon version := \u0026quot;1.0.0\u0026quot; Addon author := \u0026quot;Your Name\u0026quot; Addon description := \u0026quot;Description of what your addon does\u0026quot; Addon license := \u0026quot;MIT\u0026quot; Addon dependencies := list(\u0026quot;OtherAddon\u0026quot;) Addon install := method( // Installation logic \u0026quot;Installing \u0026quot; .. name .. \u0026quot; v\u0026quot; .. version println // Copy files // Compile C extensions if needed // Register with Io ) Addon uninstall := method( // Cleanup logic ) // Make addon discoverable Addon register Performance Libraries # Profiling # // Simple profiler Profiler := Object clone Profiler data := Map clone Object profile := method(name, start := Date now result := call evalArgAt(0) elapsed := Date now - start if(Profiler data hasKey(name) not, Profiler data atPut(name, list(0, 0)) ) stats := Profiler data at(name) stats atPut(0, stats at(0) + 1) // Count stats atPut(1, stats at(1) + elapsed) // Total time result ) Profiler report := method( \u0026quot;=== Profile Report ===\u0026quot; println data foreach(name, stats, count := stats at(0) total := stats at(1) avg := total / count (name .. \u0026quot;: \u0026quot; .. count .. \u0026quot; calls, \u0026quot; .. total .. \u0026quot;s total, \u0026quot; .. avg .. \u0026quot;s average\u0026quot;) println ) ) // Usage profile(\u0026quot;database\u0026quot;, // Expensive operation wait(0.1) ) Profiler report Future of Io Libraries # The Io ecosystem continues to evolve with:\nWebAssembly Support: Potential for running Io in browsers Modern Addons: Integration with contemporary libraries Cloud Services: AWS, Azure, GCP client libraries Machine Learning: Bindings to TensorFlow, PyTorch Improved Tooling: Better IDE support, linters, formatters Conclusion # While Io\u0026rsquo;s ecosystem is smaller than mainstream languages, it provides essential functionality and excellent extensibility through its addon system. The simplicity of creating libraries, combined with seamless C integration, means that missing functionality can often be added quickly. The community, though small, is knowledgeable and helpful, making it easy to find or create the tools you need.\nThe key to working effectively with Io\u0026rsquo;s ecosystem is understanding that it favors simplicity and extensibility over having every possible library pre-built. This philosophy encourages developers to understand their tools deeply and create exactly what they need.\n"},{"id":20,"href":"/docs/18-conclusion/","title":"Conclusion","section":"Chapters","content":" Chapter 18: Conclusion - The Io Way # We\u0026rsquo;ve reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we\u0026rsquo;ve explored a language that challenges conventional programming wisdom. This final chapter reflects on what we\u0026rsquo;ve learned, when to use Io, and what it teaches us about programming itself.\nWhat Makes Io Special # After eighteen chapters, we can distill Io\u0026rsquo;s essence to a few key principles:\nRadical Simplicity # Io achieves remarkable expressiveness with minimal concepts:\nEverything is an object All computation is message passing Objects clone objects (no classes) Code is data (messages are objects) Compare Io\u0026rsquo;s ~10,000 lines of C to Python\u0026rsquo;s ~500,000 or Java\u0026rsquo;s millions. This isn\u0026rsquo;t just about code size—it\u0026rsquo;s about conceptual simplicity. You can understand all of Io, not just use it.\nUniformity # Where other languages have special cases, Io has objects:\n// Numbers? Objects. 5 squared := method(self * self) // Booleans? Objects. true celebrate := method(\u0026quot;Yes!\u0026quot; println) // Control structures? Objects receiving messages. if := method(condition, trueBlock, falseBlock, ...) // Operators? Messages. Number + := method(n, ...) // Even nil? An object. nil comfort := method(\u0026quot;It's okay to be nothing\u0026quot; println) This uniformity isn\u0026rsquo;t just elegant—it\u0026rsquo;s powerful. When everything follows the same rules, there\u0026rsquo;s less to remember and more you can do.\nOpenness # Most languages protect you from yourself. Io trusts you completely:\n// Modify fundamental types String shout := method(self upper .. \u0026quot;!!!\u0026quot;) // Change how the language works Object if := method(...) // Redefine conditionals // Inspect everything anyObject slotNames // See all slots anyMethod code // See implementation This openness enables profound metaprogramming but requires responsibility.\nWhen to Use Io # Io excels in specific contexts:\nRapid Prototyping # When you need to explore ideas quickly:\n// From idea to working code in minutes Api := Object clone Api route := method(path, handler, ...) Api get(\u0026quot;/users\u0026quot;, block(...)) Api start(8080) Domain-Specific Languages # When you need expressive, domain-appropriate interfaces:\nrecipe \u0026quot;Pasta\u0026quot; serves(4) { boil water in(\u0026quot;large pot\u0026quot;) add pasta after(\u0026quot;water boils\u0026quot;) cook for(8) minutes drain serve with(\u0026quot;marinara sauce\u0026quot;) } Learning and Teaching # When you want to understand programming concepts deeply:\nHow objects really work What message passing means How languages are implemented Why certain design choices matter Embedded Scripting # When you need a lightweight, embeddable language:\nGame scripting Application automation Configuration languages Plugin systems When Not to Use Io # Io has limitations to consider:\nPerformance-Critical Systems # // Io: Elegant but slower numbers map(x, x * x) select(x, x \u0026gt; 100) // C: Verbose but fast for(int i = 0; i \u0026lt; n; i++) { squared[i] = numbers[i] * numbers[i]; if(squared[i] \u0026gt; 100) ... } Message passing has overhead. For number crunching, system programming, or real-time systems, choose C, Rust, or C++.\nLarge Team Projects # Io lacks:\nStatic type checking Comprehensive IDE support Large ecosystem of libraries Extensive documentation Big community for support For enterprise applications with many developers, Java, C#, or TypeScript offer better tooling and guardrails.\nProduction Web Services # While you can build web services in Io, you probably shouldn\u0026rsquo;t for production:\nLimited web frameworks No battle-tested libraries Small community for security issues Few deployment options Use Python, Ruby, JavaScript, or Go instead.\nLessons for Other Languages # Even if you never use Io professionally, it teaches valuable lessons:\nQuestion Everything # Why do we need classes? Io shows prototypes work fine. Why special syntax for control flow? Io uses methods. Why distinguish data and code? Io treats both as messages.\nThese aren\u0026rsquo;t necessarily better—but questioning assumptions makes you a better programmer.\nSimplicity Has Power # Io shows how much you can achieve with few concepts. This influences how you design:\nAPIs with consistent interfaces Systems with uniform principles Code that does one thing well Metaprogramming Isn\u0026rsquo;t Magic # In Io, metaprogramming is just programming:\n// Not magic, just objects method := block(x, x * 2) method code println // x *(2) method setCode(\u0026quot;x + 2\u0026quot;) // Changed! This demystifies metaprogramming in any language.\nEverything Has Trade-offs # Io\u0026rsquo;s choices have consequences:\nSimplicity vs Performance Flexibility vs Safety Power vs Complexity Expressiveness vs Familiarity Understanding these trade-offs helps you choose the right tool for each job.\nIo\u0026rsquo;s Influence # Despite its small community, Io has influenced programming:\nJavaScript\u0026rsquo;s Prototype Pattern # // JavaScript embracing prototypes (pre-ES6) var animal = { speak: function() { console.log(\u0026quot;...\u0026quot;); } }; var dog = Object.create(animal); dog.bark = function() { console.log(\u0026quot;Woof!\u0026quot;); }; Ruby\u0026rsquo;s Method Missing # class DynamicObject def method_missing(name, *args) if name.to_s.start_with?(\u0026quot;get_\u0026quot;) # Handle dynamically end end end Minimalist Language Design # Languages like Lua and Factor share Io\u0026rsquo;s minimalist philosophy, proving that small can be powerful.\nThe Future of Io # Io may never become mainstream, and that\u0026rsquo;s okay. Its value isn\u0026rsquo;t in market share but in:\nEducational Impact # Io remains excellent for teaching:\nPrototype-based OOP Message passing Language implementation Metaprogramming concepts Research Platform # Io\u0026rsquo;s simplicity makes it ideal for experimenting with:\nNew concurrency models Novel object systems DSL techniques Language features Inspiration # Future language designers study Io to understand:\nHow simple a language can be Alternative object models The power of uniformity Trade-offs in language design Personal Reflection # Learning Io changes how you think about programming. You realize that many \u0026ldquo;fundamental\u0026rdquo; concepts are just choices. Classes aren\u0026rsquo;t necessary. Syntax isn\u0026rsquo;t sacred. Types aren\u0026rsquo;t mandatory. These aren\u0026rsquo;t revelations that everything should be like Io—rather, they free you to think more broadly about problems and solutions.\nWhen you return to your daily programming language—be it Python, JavaScript, Java, or something else—you bring new perspectives:\nYou see the prototype pattern hiding in JavaScript\u0026rsquo;s classes You recognize message passing in Ruby\u0026rsquo;s method calls You understand metaprogramming isn\u0026rsquo;t mysterious You appreciate both the safety of types and the freedom of their absence A Final Example # Let\u0026rsquo;s end with a small program that captures Io\u0026rsquo;s spirit:\n// The Io Philosophy in Code Philosophy := Object clone Philosophy simplicity := \u0026quot;Everything is an object\u0026quot; Philosophy uniformity := \u0026quot;Everything is a message\u0026quot; Philosophy openness := \u0026quot;Everything is modifiable\u0026quot; Philosophy embrace := method(concept, (\u0026quot;Embracing \u0026quot; .. concept .. \u0026quot;...\u0026quot;) println self setSlot(concept, true) self ) Philosophy question := method(assumption, (\u0026quot;Why must \u0026quot; .. assumption .. \u0026quot;?\u0026quot;) println (\u0026quot;Perhaps there's another way...\u0026quot;) println ) Philosophy learn := method( lessons := list( \u0026quot;Simplicity enables understanding\u0026quot;, \u0026quot;Uniformity reduces cognitive load\u0026quot;, \u0026quot;Openness enables exploration\u0026quot;, \u0026quot;Constraints inspire creativity\u0026quot;, \u0026quot;Every choice has consequences\u0026quot; ) lessons foreach(lesson, (\u0026quot; • \u0026quot; .. lesson) println wait(0.5) // Pause to reflect ) ) // The journey journey := Philosophy clone journey embrace(\u0026quot;simplicity\u0026quot;) \\ embrace(\u0026quot;uniformity\u0026quot;) \\ embrace(\u0026quot;openness\u0026quot;) journey question(\u0026quot;languages be complex\u0026quot;) journey question(\u0026quot;we have classes\u0026quot;) journey question(\u0026quot;syntax be fixed\u0026quot;) \u0026quot;Lessons learned:\u0026quot; println journey learn \u0026quot;Thank you for exploring Io.\u0026quot; println \u0026quot;May it inspire your programming journey.\u0026quot; println Parting Thoughts # Io isn\u0026rsquo;t trying to replace your favorite language. It\u0026rsquo;s not competing for market dominance. It\u0026rsquo;s not the solution to all programming problems.\nWhat Io offers is perspective—a radically different view of what programming can be. It shows that our familiar concepts aren\u0026rsquo;t immutable laws but design choices. It demonstrates that simplicity and power aren\u0026rsquo;t opposites. It proves that small languages can have big ideas.\nWhether you use Io for a weekend experiment, a personal project, or just intellectual exploration, it will change how you think about programming. You\u0026rsquo;ll question more, assume less, and see possibilities where you once saw constraints.\nThat\u0026rsquo;s the real gift of Io: not the language itself, but the mindset it instills. A mindset that questions, explores, and imagines. A mindset that sees programming not as applying fixed rules but as creatively solving problems with the tools at hand—or creating new tools when needed.\nThank You # Thank you for joining me on this exploration of Io. I hope you\u0026rsquo;ve found it as enlightening to read as I found it to write. The language may be small, but the ideas are vast.\nNow go forth and experiment. Clone some objects. Send some messages. Build something unusual. Question something fundamental. And remember: in Io, as in programming, as in life—everything is possible when you embrace simplicity, seek uniformity, and remain open to new ideas.\nHappy coding, and may your messages always find their slots.\nEnd of Book\nAppendices # For continued learning:\nAppendix A: Io Language Reference Appendix B: Standard Library Documentation Appendix C: Building Io from Source Appendix D: Creating C Addons Appendix E: Io Resources and Community Visit https://iolanguage.org for more information.\n\u0026ldquo;Simplicity is the ultimate sophistication.\u0026rdquo; — Leonardo da Vinci\n"}] \ No newline at end of file diff --git a/website/public/en.search.min.20734475dc55187083547d768bab4ab01cefdbd4f93d7659611364d02969e74c.js b/website/public/en.search.min.20734475dc55187083547d768bab4ab01cefdbd4f93d7659611364d02969e74c.js deleted file mode 100644 index de29809..0000000 --- a/website/public/en.search.min.20734475dc55187083547d768bab4ab01cefdbd4f93d7659611364d02969e74c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(function(){const o="/en.search-data.min.59ef9ccb13662077f47dd91e556e81b00922b0bce70308fc7a1024b6f60e1e8c.json",i=Object.assign({cache:!0},{includeScore:!0,useExtendedSearch:!0,fieldNormWeight:1.5,threshold:.2,ignoreLocation:!0,keys:[{name:"title",weight:.7},{name:"content",weight:.3}]}),e=document.querySelector("#book-search-input"),t=document.querySelector("#book-search-results");if(!e)return;e.addEventListener("focus",n),e.addEventListener("keyup",s),document.addEventListener("keypress",a);function a(t){if(t.target.value!==0[0])return;if(e===document.activeElement)return;const n=String.fromCharCode(t.charCode);if(!r(n))return;e.focus(),t.preventDefault()}function r(t){const n=e.getAttribute("data-hotkeys")||"";return n.indexOf(t)>=0}function n(){e.removeEventListener("focus",n),e.required=!0,fetch(o).then(e=>e.json()).then(e=>{window.bookSearchIndex=new Fuse(e,i)}).then(()=>e.required=!1).then(s)}function s(){for(;t.firstChild;)t.removeChild(t.firstChild);if(!e.value)return;const n=window.bookSearchIndex.search(e.value).slice(0,10);n.forEach(function(e){const n=c("
  • "),s=n.querySelector("a"),o=n.querySelector("small");s.href=e.item.href,s.textContent=e.item.title,o.textContent=e.item.section,t.appendChild(n)})}function c(e){const t=document.createElement("div");return t.innerHTML=e,t.firstChild}})() \ No newline at end of file diff --git a/website/public/examples/README.md b/website/public/examples/README.md deleted file mode 100644 index 195ab35..0000000 --- a/website/public/examples/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Code Examples - -This directory contains runnable code examples from the book, organized by chapter. - -## Running Examples - -To run any example: - -```bash -io examples/chapter-02/hello.io -``` - -## Organization - -- `chapter-02/` - Getting Started examples -- `chapter-03/` - Everything is an Object examples -- `chapter-04/` - Prototypes examples -- `chapter-05/` - Messages and Slots examples -- `chapter-07/` - Control Flow examples -- `chapter-08/` - Collections examples -- `chapter-09/` - Blocks and Closures examples -- `chapter-11/` - Metaprogramming examples -- `chapter-12/` - Concurrency examples -- `chapter-13/` - DSL examples -- `chapter-15/` - Pattern examples -- `chapter-16/` - Case study code - -Each directory contains standalone examples that demonstrate the concepts from that chapter. \ No newline at end of file diff --git a/website/public/examples/chapter-02/hello.io b/website/public/examples/chapter-02/hello.io deleted file mode 100644 index a75d814..0000000 --- a/website/public/examples/chapter-02/hello.io +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env io -# Basic Hello World -"Hello, World!" println \ No newline at end of file diff --git a/website/public/examples/chapter-02/todo-list.io b/website/public/examples/chapter-02/todo-list.io deleted file mode 100644 index 14da2f4..0000000 --- a/website/public/examples/chapter-02/todo-list.io +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env io -# Simple To-Do List Manager from Chapter 2 - -TodoList := Object clone -TodoList items := list() - -TodoList add := method(task, - items append(task) - self -) - -TodoList show := method( - if(items size == 0, - "No tasks!" println, - items foreach(i, task, - (" " .. (i + 1) .. ". " .. task) println - ) - ) - self -) - -TodoList complete := method(index, - if(index > 0 and index <= items size, - task := items at(index - 1) - items removeAt(index - 1) - ("Completed: " .. task) println, - "Invalid task number" println - ) - self -) - -# Usage -todo := TodoList clone -todo add("Learn Io") add("Build something cool") add("Share with friends") - -"=== My Todo List ===" println -todo show - -todo complete(1) - -"=== Updated List ===" println -todo show \ No newline at end of file diff --git a/website/public/examples/chapter-04/prototypes.io b/website/public/examples/chapter-04/prototypes.io deleted file mode 100644 index bb6e9a1..0000000 --- a/website/public/examples/chapter-04/prototypes.io +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env io -# Prototype-based inheritance examples from Chapter 4 - -# Create a prototype chain -Animal := Object clone -Animal species := "Unknown" -Animal speak := method("Some sound" println) - -Dog := Animal clone -Dog species = "Canis familiaris" -Dog speak := method("Woof!" println) -Dog wagTail := method("*wagging tail*" println) - -fido := Dog clone -fido name := "Fido" - -# Demonstrate inheritance -"=== Prototype Chain Demo ===" println -("fido's name: " .. fido name) println -("fido's species: " .. fido species) println -"fido speaks: " print -fido speak -"fido wags: " print -fido wagTail - -# Show the prototype chain -"\n=== Prototype Chain ===" println -obj := fido -while(obj != Object, - (" " .. obj type) println - obj = obj proto -) - -# Dynamic prototype modification -"\n=== Dynamic Modification ===" println -"Adding 'fetch' method to Dog prototype..." println -Dog fetch := method("*fetching ball*" println) - -"Now fido can fetch:" print -fido fetch # Works even though fido was created before we added fetch! \ No newline at end of file diff --git a/website/public/examples/chapter-09/closures.io b/website/public/examples/chapter-09/closures.io deleted file mode 100644 index cca279d..0000000 --- a/website/public/examples/chapter-09/closures.io +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env io -# Closure examples from Chapter 9 - -# Counter using closures -makeCounter := method(start, - count := start - block( - count = count + 1 - count - ) -) - -"\n=== Counter Example ===" println -counter1 := makeCounter(0) -counter2 := makeCounter(100) - -"Counter1: " print -3 repeat(counter1 call print; " " print) -"" println - -"Counter2: " print -3 repeat(counter2 call print; " " print) -"" println - -# Function composition -"\n=== Function Composition ===" println -compose := method(f, g, - block(x, f call(g call(x))) -) - -double := block(x, x * 2) -addFive := block(x, x + 5) -doubleThenAddFive := compose(addFive, double) - -("10 doubled then plus 5 = " .. doubleThenAddFive call(10)) println - -# Partial application -"\n=== Partial Application ===" println -add := block(a, b, a + b) -addTen := block(x, add call(10, x)) - -("15 + 10 = " .. addTen call(15)) println - -# Memoization -"\n=== Memoization ===" println -memoize := method(f, - cache := Map clone - block(n, - if(cache hasKey(n asString), - "Cache hit!" println - cache at(n asString), - "Computing..." println - result := f call(n) - cache atPut(n asString, result) - result - ) - ) -) - -slowSquare := block(n, - wait(0.1) # Simulate expensive computation - n * n -) - -fastSquare := memoize(slowSquare) - -"First call to fastSquare(5):" println -fastSquare call(5) println - -"Second call to fastSquare(5):" println -fastSquare call(5) println \ No newline at end of file diff --git a/website/public/examples/chapter-11/metaprogramming.io b/website/public/examples/chapter-11/metaprogramming.io deleted file mode 100644 index aedc0fe..0000000 --- a/website/public/examples/chapter-11/metaprogramming.io +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env io -# Metaprogramming examples from Chapter 11 - -"\n=== Dynamic Method Creation ===" println - -# Create getters and setters dynamically -Object addProperty := method(name, defaultValue, - # Create storage slot - self setSlot("_" .. name, defaultValue) - - # Create getter - self setSlot(name, - method(self getSlot("_" .. call message name)) - ) - - # Create setter - self setSlot("set" .. name asCapitalized, - method(value, - propName := call message name afterSeq("set") asLowercase - self setSlot("_" .. propName, value) - self - ) - ) -) - -Person := Object clone -Person addProperty("name", "Unknown") -Person addProperty("age", 0) - -john := Person clone -john setName("John") setAge(25) -("Name: " .. john name) println -("Age: " .. john age) println - -"\n=== Method Missing Pattern ===" println - -DynamicObject := Object clone -DynamicObject forward := method( - messageName := call message name - args := call message arguments - - ("Intercepted unknown method: " .. messageName) println - - if(messageName beginsWithSeq("get"), - property := messageName afterSeq("get") asLowercase - return self getSlot(property) - ) - - if(messageName beginsWithSeq("set"), - property := messageName afterSeq("set") asLowercase - value := call evalArgAt(0) - return self setSlot(property, value) - ) - - "Method not handled" println -) - -obj := DynamicObject clone -obj setColor("blue") -obj setSize(42) -("Color: " .. obj getColor) println -("Size: " .. obj getSize) println - -"\n=== Message Inspection ===" println - -# Build and inspect messages -msg := message(2 + 3 * 4) -("Message: " .. msg) println -("Message name: " .. msg name) println -("Message arguments: " .. msg arguments) println - -# Evaluate message -result := msg doInContext(Lobby) -("Result: " .. result) println - -# Modify message -msg setName("*") -newResult := msg doInContext(Lobby) -("Modified result (now multiplication): " .. newResult) println - -"\n=== Self-Modifying Code ===" println - -Counter := Object clone -Counter count := 0 -Counter increment := method( - count = count + 1 - ("Count: " .. count) println - - # Self-modify after 3 calls - if(count >= 3, - "Limit reached! Disabling increment..." println - self increment = method( - "Counter is disabled!" println - ) - ) - count -) - -c := Counter clone -5 repeat(c increment) \ No newline at end of file diff --git a/website/public/examples/chapter-12/concurrency.io b/website/public/examples/chapter-12/concurrency.io deleted file mode 100644 index 347a16e..0000000 --- a/website/public/examples/chapter-12/concurrency.io +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env io -# Concurrency examples from Chapter 12 - -"\n=== Coroutine Example ===" println - -# Simple coroutine -coro := coroutine( - 3 repeat(i, - ("Coroutine says: " .. i) println - yield # Give control back - ) - "Coroutine done!" -) - -3 repeat(i, - ("Main says: " .. i) println - result := coro resume - if(result, result println) -) - -"\n=== Producer-Consumer Pattern ===" println - -# Channel implementation -Channel := Object clone -Channel init := method( - self queue := list() - self -) - -Channel send := method(value, - queue append(value) -) - -Channel receive := method( - while(queue size == 0, yield) - queue removeFirst -) - -ch := Channel clone init - -# Producer coroutine -producer := coroutine( - 5 repeat(i, - value := i * i - ("Producer: sending " .. value) println - ch send(value) - yield - ) -) - -# Consumer coroutine -consumer := coroutine( - 5 repeat( - value := ch receive - ("Consumer: received " .. value) println - yield - ) -) - -# Run them -10 repeat( - producer resume - consumer resume -) - -"\n=== Futures Example ===" println - -# Simulate async operation -slowOperation := method(n, - "Starting slow operation..." println - wait(0.5) # Simulate work - n * 2 -) - -# Run async with @ -"Launching async operation..." println -future := self @slowOperation(21) - -"Doing other work while waiting..." println -3 repeat(i, - ("Working... " .. i) println - wait(0.1) -) - -"Getting result..." println -result := future resolve -("Result: " .. result) println - -"\n=== Parallel Map ===" println - -# Add parallel map to List -List parallelMap := method(block, - futures := self map(item, - self @(block call(item)) - ) - futures map(resolve) -) - -# Compare sequential vs parallel -numbers := list(1, 2, 3, 4, 5) - -"Sequential map:" println -start := Date now -sequential := numbers map(n, - wait(0.1) # Simulate work - n * n -) -("Time: " .. (Date now - start) .. " seconds") println -("Result: " .. sequential) println - -"Parallel map:" println -start := Date now -parallel := numbers parallelMap(n, - wait(0.1) # Simulate work - n * n -) -("Time: " .. (Date now - start) .. " seconds") println -("Result: " .. parallel) println \ No newline at end of file diff --git a/website/public/examples/chapter-13/html-dsl.io b/website/public/examples/chapter-13/html-dsl.io deleted file mode 100644 index 0392998..0000000 --- a/website/public/examples/chapter-13/html-dsl.io +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env io -# HTML DSL example from Chapter 13 - -HTML := Object clone - -# Handle any tag name via forward -HTML forward := method( - tagName := call message name - attributes := Map clone - children := list() - - # Process arguments - call message arguments foreach(arg, - argValue := call sender doMessage(arg) - - if(argValue type == "Map", - attributes = argValue, - if(argValue type == "Sequence", - children append(argValue), - if(argValue type == "List", - children appendSeq(argValue), - children append(argValue asString) - ) - ) - ) - ) - - # Build HTML - result := "<" .. tagName - attributes foreach(key, value, - result = result .. " " .. key .. "=\"" .. value .. "\"" - ) - - if(children size == 0, - result = result .. " />", - result = result .. ">" - children foreach(child, result = result .. child) - result = result .. "" - ) - - result -) - -# Helper for attributes -Object attrs := method( - map := Map clone - call message arguments foreach(arg, - key := arg name - value := call sender doMessage(arg arguments at(0)) - map atPut(key, value) - ) - map -) - -# Usage example -"\n=== HTML DSL Demo ===" println - -html := HTML clone - -page := html html( - html head( - html title("My Io Website"), - html meta(attrs(charset: "UTF-8")) - ), - html body(attrs(class: "container"), - html h1("Welcome to Io!"), - html p(attrs(class: "intro"), - "This is a paragraph with ", - html strong("bold text"), - " and ", - html em("italic text"), - "." - ), - html ul(attrs(id: "features"), - html li("Prototype-based OOP"), - html li("Everything is an object"), - html li("Powerful metaprogramming") - ), - html footer( - html p("© 2024 - Built with Io") - ) - ) -) - -# Output the generated HTML -page println \ No newline at end of file diff --git a/website/public/examples/index.html b/website/public/examples/index.html deleted file mode 100644 index df9adb8..0000000 --- a/website/public/examples/index.html +++ /dev/null @@ -1,643 +0,0 @@ - - - - - - - - - - - - - - -Code Examples | The Io Programming Language - - - - - - - - - - - - - - -
    -
    - - -
    -
    - -
    - - - - -
    -
    - -
    - - -

    Code Examples

    - - -
    - - - - -
    - - - -
    - - - - - - - - -
    -

    Code Examples

    - -
    - - - - - -

    All code examples from the book are available for download and experimentation. Each example is a standalone .io file that you can run directly with the Io interpreter.

    -

    - Running Examples - - # - -

    -

    To run any example, use the Io interpreter:

    -
    io hello.io
    -
    -

    - Examples by Chapter - - # - -

    -

    - Part I: Foundations - - # - -

    -
      -
    • Chapter 2: Getting Started - -
    • -
    -

    - Part II: Core Concepts - - # - -

    -
      -
    • Chapter 4: Prototypes, Not Classes - -
    • -
    -

    - Part III: Language Features - - # - -

    -
      -
    • Chapter 9: Blocks and Closures - -
    • -
    -

    - Part IV: Advanced Topics - - # - -

    -
      -
    • -

      Chapter 11: Metaprogramming

      - -
    • -
    • -

      Chapter 12: Concurrency

      - -
    • -
    • -

      Chapter 13: Domain-Specific Languages

      - -
    • -
    -

    - Download All Examples - - # - -

    -

    You can browse all examples or clone the repository to get all examples at once:

    -
    git clone https://github.com/yourusername/io-book-examples.git
    -
    -

    - Contributing - - # - -

    -

    Found an issue with an example? Want to contribute your own? Please submit a pull request or open an issue on GitHub.

    - - -
    - -
    -
    - - - -
    - -
    - - - - - -
    - - - - - - - - - - - - - - - - - -
    - - - - - -
    - - - - -
    - - - - - - - - - - - - - - - - - - - diff --git a/website/public/favicon.png b/website/public/favicon.png deleted file mode 100644 index 8f8dbb0..0000000 Binary files a/website/public/favicon.png and /dev/null differ diff --git a/website/public/favicon.svg b/website/public/favicon.svg deleted file mode 100644 index 3d645a6..0000000 --- a/website/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/fonts/GeistMono.zip b/website/public/fonts/GeistMono.zip deleted file mode 100644 index 8537307..0000000 --- a/website/public/fonts/GeistMono.zip +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/website/public/fonts/GeistMonoVF.woff2 b/website/public/fonts/GeistMonoVF.woff2 deleted file mode 100644 index d6a1335..0000000 --- a/website/public/fonts/GeistMonoVF.woff2 +++ /dev/null @@ -1 +0,0 @@ -Couldn't find the requested file /dist/fonts/geist-mono/GeistMonoVF.woff2 in geist. \ No newline at end of file diff --git a/website/public/fonts/geist-mono.zip b/website/public/fonts/geist-mono.zip deleted file mode 100644 index 8537307..0000000 --- a/website/public/fonts/geist-mono.zip +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/website/public/fonts/roboto-mono-v30-normal-latin-400.woff2 b/website/public/fonts/roboto-mono-v30-normal-latin-400.woff2 deleted file mode 100644 index 6008f02..0000000 Binary files a/website/public/fonts/roboto-mono-v30-normal-latin-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-mono-v30-normal-latin-700.woff2 b/website/public/fonts/roboto-mono-v30-normal-latin-700.woff2 deleted file mode 100644 index 10e1335..0000000 Binary files a/website/public/fonts/roboto-mono-v30-normal-latin-700.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-mono-v30-normal-latin-ext-400.woff2 b/website/public/fonts/roboto-mono-v30-normal-latin-ext-400.woff2 deleted file mode 100644 index 08e21fa..0000000 Binary files a/website/public/fonts/roboto-mono-v30-normal-latin-ext-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-mono-v30-normal-latin-ext-700.woff2 b/website/public/fonts/roboto-mono-v30-normal-latin-ext-700.woff2 deleted file mode 100644 index a346810..0000000 Binary files a/website/public/fonts/roboto-mono-v30-normal-latin-ext-700.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-latin-400.woff2 b/website/public/fonts/roboto-v47-normal-latin-400.woff2 deleted file mode 100644 index 5a5fad1..0000000 Binary files a/website/public/fonts/roboto-v47-normal-latin-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-latin-700.woff2 b/website/public/fonts/roboto-v47-normal-latin-700.woff2 deleted file mode 100644 index 330b943..0000000 Binary files a/website/public/fonts/roboto-v47-normal-latin-700.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-latin-ext-400.woff2 b/website/public/fonts/roboto-v47-normal-latin-ext-400.woff2 deleted file mode 100644 index 47e69cf..0000000 Binary files a/website/public/fonts/roboto-v47-normal-latin-ext-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-latin-ext-700.woff2 b/website/public/fonts/roboto-v47-normal-latin-ext-700.woff2 deleted file mode 100644 index fb71ad1..0000000 Binary files a/website/public/fonts/roboto-v47-normal-latin-ext-700.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-math-400.woff2 b/website/public/fonts/roboto-v47-normal-math-400.woff2 deleted file mode 100644 index 15e1583..0000000 Binary files a/website/public/fonts/roboto-v47-normal-math-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-math-700.woff2 b/website/public/fonts/roboto-v47-normal-math-700.woff2 deleted file mode 100644 index 913eff3..0000000 Binary files a/website/public/fonts/roboto-v47-normal-math-700.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-symbols-400.woff2 b/website/public/fonts/roboto-v47-normal-symbols-400.woff2 deleted file mode 100644 index f9c26fa..0000000 Binary files a/website/public/fonts/roboto-v47-normal-symbols-400.woff2 and /dev/null differ diff --git a/website/public/fonts/roboto-v47-normal-symbols-700.woff2 b/website/public/fonts/roboto-v47-normal-symbols-700.woff2 deleted file mode 100644 index 409e934..0000000 Binary files a/website/public/fonts/roboto-v47-normal-symbols-700.woff2 and /dev/null differ diff --git a/website/public/fuse.min.js b/website/public/fuse.min.js deleted file mode 100644 index 0d509f3..0000000 --- a/website/public/fuse.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Fuse.js v7.1.0 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2025 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ -var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,u=t.fieldNormWeight,o=void 0===u?O.fieldNormWeight:u;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var u=1/Math.pow(i,.5*e),o=parseFloat(Math.round(u*r)/r);return n.set(i,o),o},clear:function(){n.clear()}}}(o,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return u(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,A(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();A(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,u=n.fieldNormWeight,o=void 0===u?O.fieldNormWeight:u,c=new I({getFn:i,fieldNormWeight:o});return c.setKeys(e.map(w)),c.setSources(t),c.create(),c}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,u=void 0===i?0:i,o=t.expectedLocation,c=void 0===o?0:o,a=t.distance,s=void 0===a?O.distance:a,h=t.ignoreLocation,l=void 0===h?O.ignoreLocation:h,f=r/e.length;if(l)return f;var d=Math.abs(c-u);return s?f+d/s:d?1:f}var N=32;function P(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,u=void 0===i?O.location:i,o=r.distance,c=void 0===o?O.distance:o,a=r.threshold,s=void 0===a?O.threshold:a,h=r.findAllMatches,l=void 0===h?O.findAllMatches:h,f=r.minMatchCharLength,d=void 0===f?O.minMatchCharLength:f,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>N)throw new Error("Pattern length exceeds max of ".concat(N,"."));for(var A,m=t.length,C=e.length,k=Math.max(0,Math.min(u,C)),E=s,F=k,M=d>1||g,b=M?Array(C):[];(A=e.indexOf(t,F))>-1;){var D=R(t,{currentLocation:A,expectedLocation:k,distance:c,ignoreLocation:p});if(E=Math.min(D,E),F=A+m,M)for(var B=0;B=$;z-=1){var T=z-1,K=n[e.charAt(T)];if(M&&(b[T]=+!!K),W[z]=(W[z+1]<<1|1)&K,_&&(W[z]|=(x[z+1]|x[z])<<1|1|x[z+1]),W[z]&L&&(w=R(t,{errors:_,currentLocation:T,expectedLocation:k,distance:c,ignoreLocation:p}))<=E){if(E=w,(F=T)<=k)break;$=Math.max(1,2*k-F)}}if(R(t,{errors:_+1,currentLocation:k,expectedLocation:k,distance:c,ignoreLocation:p})>E)break;x=W}var q={isMatch:F>=0,score:Math.max(.001,w)};if(M){var J=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,u=0,o=e.length;u=t&&n.push([r,i]),r=-1)}return e[u-1]&&u-r>=t&&n.push([r,u-1]),n}(b,d);J.length?g&&(q.indices=J):q.isMatch=!1}return q}function W(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},u=i.location,o=void 0===u?O.location:u,c=i.threshold,a=void 0===c?O.threshold:c,s=i.distance,h=void 0===s?O.distance:s,l=i.includeMatches,f=void 0===l?O.includeMatches:l,d=i.findAllMatches,v=void 0===d?O.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,A=void 0===p?O.isCaseSensitive:p,m=i.ignoreDiacritics,C=void 0===m?O.ignoreDiacritics:m,k=i.ignoreLocation,E=void 0===k?O.ignoreLocation:k;if(r(this,e),this.options={location:o,threshold:a,distance:h,includeMatches:f,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:A,ignoreDiacritics:C,ignoreLocation:E},t=A?t:t.toLowerCase(),t=C?z(t):t,this.pattern=t,this.chunks=[],this.pattern.length){var F=function(e,t){n.chunks.push({pattern:e,alphabet:W(e),startIndex:t})},M=this.pattern.length;if(M>N){for(var b=0,D=M%N,B=M-D;b1&&void 0!==arguments[1]?arguments[1]:{},o=u.location,c=void 0===o?O.location:o,a=u.threshold,s=void 0===a?O.threshold:a,h=u.distance,l=void 0===h?O.distance:h,f=u.includeMatches,d=void 0===f?O.includeMatches:f,v=u.findAllMatches,g=void 0===v?O.findAllMatches:v,y=u.minMatchCharLength,p=void 0===y?O.minMatchCharLength:y,A=u.isCaseSensitive,m=void 0===A?O.isCaseSensitive:A,C=u.ignoreDiacritics,k=void 0===C?O.ignoreDiacritics:C,E=u.ignoreLocation,F=void 0===E?O.ignoreLocation:E;return r(this,n),(i=t.call(this,e))._bitapSearch=new T(e,{location:c,threshold:s,distance:l,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:m,ignoreDiacritics:k,ignoreLocation:F}),i}return u(n,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),n}(K),Y=function(e){c(n,e);var t=l(n);function n(e){return r(this,n),t.call(this,e)}return u(n,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var u=!!r.length;return{isMatch:u,score:u?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),n}(K),Z=[J,Y,V,G,Q,H,U,X],ee=Z.length,te=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,ne=new Set([X.type,Y.type]),re=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=n.isCaseSensitive,u=void 0===i?O.isCaseSensitive:i,o=n.ignoreDiacritics,c=void 0===o?O.ignoreDiacritics:o,a=n.includeMatches,s=void 0===a?O.includeMatches:a,h=n.minMatchCharLength,l=void 0===h?O.minMatchCharLength:h,f=n.ignoreLocation,d=void 0===f?O.ignoreLocation:f,v=n.findAllMatches,g=void 0===v?O.findAllMatches:v,y=n.location,p=void 0===y?O.location:y,A=n.threshold,m=void 0===A?O.threshold:A,C=n.distance,k=void 0===C?O.distance:C;r(this,e),this.query=null,this.options={isCaseSensitive:u,ignoreDiacritics:c,includeMatches:s,minMatchCharLength:l,findAllMatches:g,ignoreLocation:d,location:p,threshold:m,distance:k},t=u?t:t.toLowerCase(),t=c?z(t):t,this.pattern=t,this.query=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(te).filter((function(e){return e&&!!e.trim()})),r=[],i=0,u=n.length;i2&&void 0!==arguments[2]?arguments[2]:{}).auto,r=void 0===n||n;return he(e)||(e=le(e)),function e(n){var i=Object.keys(n),u=function(e){return!!e[ae]}(n);if(!u&&i.length>1&&!he(n))return e(le(n));if(function(e){return!g(e)&&k(e)&&!he(e)}(n)){var o=u?n[ae]:i[0],c=u?n[se]:n[o];if(!A(c))throw new Error(function(e){return"Invalid value for key ".concat(e)}(o));var a={keyId:L(o),pattern:c};return r&&(a.searcher=ue(c,t)),a}var s={children:[],operator:i[0]};return i.forEach((function(t){var r=n[t];g(r)&&r.forEach((function(t){s.children.push(e(t))}))})),s}(e)}function de(e,t){var n=e.matches;t.matches=[],E(n)&&n.forEach((function(e){if(E(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function ve(e,t){t.score=e.score}var ge=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=arguments.length>2?arguments[2]:void 0;r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch,this._keyStore=new x(this.options.keys),this.setCollection(n,u)}return u(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof I))throw new Error("Incorrect 'index' type");this._myIndex=t||$(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){E(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,u=r.includeScore,o=r.shouldSort,c=r.sortFn,a=r.ignoreFieldNorm,s=A(e)?A(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,u=e.score,o=n?n.weight:null;t*=Math.pow(0===u&&o?Number.EPSILON:u,(o||1)*(r?1:i))})),e.score=t}))}(s,{ignoreFieldNorm:a}),o&&s.sort(c),m(n)&&n>-1&&(s=s.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,u=n.includeScore,o=void 0===u?O.includeScore:u,c=[];return i&&c.push(de),o&&c.push(ve),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(s,this._docs,{includeMatches:i,includeScore:u})}},{key:"_searchStringList",value:function(e){var t=ue(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,u=e.n;if(E(n)){var o=t.searchIn(n),c=o.isMatch,a=o.score,s=o.indices;c&&r.push({item:n,idx:i,matches:[{score:a,value:n,norm:u,indices:s}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=fe(e,this.options),r=function e(n,r,i){if(!n.children){var u=n.keyId,o=n.searcher,c=t._findMatches({key:t._keyStore.get(u),value:t._myIndex.getValueForItemAtKeyId(r,u),searcher:o});return c&&c.length?[{idx:i,item:r,matches:c}]:[]}for(var a=[],s=0,h=n.children.length;s1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,u=void 0===i?O.fieldNormWeight:i,o=e.keys,c=e.records,a=new I({getFn:r,fieldNormWeight:u});return a.setKeys(o),a.setIndexRecords(c),a},ge.config=O,function(){ie.push.apply(ie,arguments)}(re),ge},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t(); \ No newline at end of file diff --git a/website/public/index.html b/website/public/index.html deleted file mode 100644 index 4d4dce4..0000000 --- a/website/public/index.html +++ /dev/null @@ -1,499 +0,0 @@ - - - - - - - - - - - - - - - -The Io Programming Language | The Io Programming Language - - - - - - - - - - - - - - - -
    -
    - - -
    -
    - -
    - - - - -
    -
    - -
    - - -

    The Io Programming Language

    - - -
    - - - - -
    - - - -

    Welcome to this comprehensive guide to the Io programming language—a journey into prototype-based programming that will challenge and expand your understanding of object-oriented design.

    -

    - Why Io? - - # - -

    -

    In a world dominated by class-based languages, Io offers a refreshingly different perspective. Everything is an object. Everything is a message. And everything can be changed at runtime.

    -

    - What You’ll Learn - - # - -

    -

    Through detailed comparisons with JavaScript, Python, Ruby, and Java, you’ll discover:

    -
      -
    • How prototype-based inheritance creates more flexible designs
    • -
    • Why message passing is more powerful than method calls
    • -
    • How to think in objects without classes
    • -
    • The elegance of homoiconic languages
    • -
    -

    - Start Your Journey - - # - -

    -

    Begin with the Preface to understand Io’s philosophy, or jump directly to Getting Started to write your first Io program.

    -
    -

    “Io’s purpose is to refocus attention on expressiveness by exploring higher level dynamic programming features with greater levels of runtime flexibility.”
    -— Steve Dekorte, Creator of Io

    -
    - - - -
    - -
    - - - - - -
    - - - - - - - - - - - - - - - - - -
    - - - - - -
    - - - - -
    - - - - - - - - - - - - - - - - - - - diff --git a/website/public/index.xml b/website/public/index.xml deleted file mode 100644 index 33ce226..0000000 --- a/website/public/index.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - - The Io Programming Language - https://example.org/ - Recent content on The Io Programming Language - Hugo - en-us - - - Why Io? - https://example.org/docs/00-preface/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/00-preface/ - <h1 id="preface-why-io"> Preface: Why Io? <a class="anchor" href="#preface-why-io">#</a> </h1> <p>In a world dominated by class-based object-oriented languages, why should you spend time learning Io, a prototype-based language with a relatively small community? This is a fair question, and one that deserves an honest answer.</p> <h2 id="the-value-of-alternative-paradigms"> The Value of Alternative Paradigms <a class="anchor" href="#the-value-of-alternative-paradigms">#</a> </h2> <p>Most programmers today work in languages that share remarkably similar conceptual foundations. Whether you&rsquo;re writing Java, C#, Python, or Ruby, you&rsquo;re likely thinking in terms of classes, instances, inheritance hierarchies, and static method definitions. These concepts have served us well, but they represent just one way of organizing computational thought.</p> - - - Code Examples - https://example.org/examples/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/examples/ - <h1 id="code-examples"> Code Examples <a class="anchor" href="#code-examples">#</a> </h1> <p>All code examples from the book are available for download and experimentation. Each example is a standalone <code>.io</code> file that you can run directly with the Io interpreter.</p> <h2 id="running-examples"> Running Examples <a class="anchor" href="#running-examples">#</a> </h2> <p>To run any example, use the Io interpreter:</p> <pre><code class="language-bash">io hello.io </code></pre> <h2 id="examples-by-chapter"> Examples by Chapter <a class="anchor" href="#examples-by-chapter">#</a> </h2> <h3 id="part-i-foundations"> Part I: Foundations <a class="anchor" href="#part-i-foundations">#</a> </h3> <ul> <li><strong>Chapter 2: Getting Started</strong> <ul> <li><a href="https://example.org/examples/chapter-02/hello.io"><code>hello.io</code></a> - Your first Io program</li> <li><a href="https://example.org/examples/chapter-02/todo-list.io"><code>todo-list.io</code></a> - A simple todo list application</li> </ul> </li> </ul> <h3 id="part-ii-core-concepts"> Part II: Core Concepts <a class="anchor" href="#part-ii-core-concepts">#</a> </h3> <ul> <li><strong>Chapter 4: Prototypes, Not Classes</strong> <ul> <li><a href="https://example.org/examples/chapter-04/prototypes.io"><code>prototypes.io</code></a> - Working with prototypes</li> </ul> </li> </ul> <h3 id="part-iii-language-features"> Part III: Language Features <a class="anchor" href="#part-iii-language-features">#</a> </h3> <ul> <li><strong>Chapter 9: Blocks and Closures</strong> <ul> <li><a href="https://example.org/examples/chapter-09/closures.io"><code>closures.io</code></a> - Understanding closures in Io</li> </ul> </li> </ul> <h3 id="part-iv-advanced-topics"> Part IV: Advanced Topics <a class="anchor" href="#part-iv-advanced-topics">#</a> </h3> <ul> <li> <p><strong>Chapter 11: Metaprogramming</strong></p> - - - Introduction - https://example.org/docs/01-introduction/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/01-introduction/ - <h1 id="chapter-1-introduction---the-philosophy-of-io"> Chapter 1: Introduction - The Philosophy of Io <a class="anchor" href="#chapter-1-introduction---the-philosophy-of-io">#</a> </h1> <blockquote class='book-hint '> <p>&ldquo;The limits of my language mean the limits of my world.&rdquo;<br> — Ludwig Wittgenstein</p> </blockquote><p>Every programming language embodies a philosophy—a set of beliefs about how programs should be structured, how complexity should be managed, and what concepts are fundamental versus incidental. Java believes in protective encapsulation and type safety. Lisp believes in code as data. Haskell believes in mathematical purity.</p> - - - Getting Started - https://example.org/docs/02-getting-started/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/02-getting-started/ - <h1 id="chapter-2-getting-started-with-io"> Chapter 2: Getting Started with Io <a class="anchor" href="#chapter-2-getting-started-with-io">#</a> </h1> <p>The best way to understand Io is to use it. In this chapter, we&rsquo;ll install Io, explore its REPL (Read-Eval-Print Loop), and write our first programs. By the end, you&rsquo;ll have a feel for Io&rsquo;s syntax and flow.</p> <h2 id="installing-io"> Installing Io <a class="anchor" href="#installing-io">#</a> </h2> <h3 id="macos"> macOS <a class="anchor" href="#macos">#</a> </h3> <p>If you&rsquo;re on macOS with Homebrew, installation is simple:</p> <pre><code class="language-bash">brew install io </code></pre> <h3 id="linux"> Linux <a class="anchor" href="#linux">#</a> </h3> <p>On most Linux distributions, you&rsquo;ll need to build from source:</p> - - - Everything is an Object - https://example.org/docs/03-everything-is-an-object/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/03-everything-is-an-object/ - <h1 id="chapter-3-everything-is-an-object"> Chapter 3: Everything is an Object <a class="anchor" href="#chapter-3-everything-is-an-object">#</a> </h1> <p>&ldquo;Everything is an object&rdquo; is a claim made by many languages. Ruby says it. Smalltalk says it. Even Java claims it (though primitives like <code>int</code> and <code>boolean</code> break the rule). But what does it really mean? And how thoroughly does Io embrace this principle?</p> <p>In this chapter, we&rsquo;ll explore how Io takes &ldquo;everything is an object&rdquo; to its logical extreme, and what this means for how you write and think about programs.</p> - - - Prototypes, Not Classes - https://example.org/docs/04-prototypes-not-classes/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/04-prototypes-not-classes/ - <h1 id="chapter-4-prototypes-not-classes"> Chapter 4: Prototypes, Not Classes <a class="anchor" href="#chapter-4-prototypes-not-classes">#</a> </h1> <p>Most object-oriented languages use classes as templates or blueprints for creating objects. You define a class, then instantiate objects from it. There&rsquo;s a fundamental distinction between the template (class) and the things created from it (instances).</p> <p>Io takes a different approach: prototype-based inheritance. There are no classes, only objects. New objects are created by cloning existing objects, and objects can serve as prototypes for other objects. This might seem like a small change, but it fundamentally alters how you think about and structure programs.</p> - - - Messages and Slots - https://example.org/docs/05-messages-and-slots/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/05-messages-and-slots/ - <h1 id="chapter-5-messages-and-slots"> Chapter 5: Messages and Slots <a class="anchor" href="#chapter-5-messages-and-slots">#</a> </h1> <p>At the heart of Io lies a simple but powerful idea: all computation happens through message passing. Objects communicate by sending messages to each other, and objects respond to messages by looking up slots. This chapter explores this fundamental mechanism in depth.</p> <h2 id="the-anatomy-of-a-message"> The Anatomy of a Message <a class="anchor" href="#the-anatomy-of-a-message">#</a> </h2> <p>When you write this in Io:</p> <pre><code class="language-io">person setName(&quot;Alice&quot;) </code></pre> <p>What actually happens? Let&rsquo;s break it down:</p> - - - Cloning and Inheritance - https://example.org/docs/06-cloning-and-inheritance/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/06-cloning-and-inheritance/ - <h1 id="chapter-6-cloning-and-inheritance"> Chapter 6: Cloning and Inheritance <a class="anchor" href="#chapter-6-cloning-and-inheritance">#</a> </h1> <p>In class-based languages, inheritance is a relationship between classes. In Io&rsquo;s prototype-based world, inheritance emerges from the simpler mechanism of cloning. When you clone an object, the new object maintains a link to its prototype, creating an inheritance chain. This chapter explores how cloning works, how inheritance emerges from it, and how to use these mechanisms effectively.</p> <h2 id="the-mechanics-of-cloning"> The Mechanics of Cloning <a class="anchor" href="#the-mechanics-of-cloning">#</a> </h2> <p>When you clone an object in Io, you don&rsquo;t copy all its data. Instead, you create a new, empty object with a reference to the original:</p> - - - Control Flow - https://example.org/docs/07-control-flow/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/07-control-flow/ - <h1 id="chapter-7-control-flow"> Chapter 7: Control Flow <a class="anchor" href="#chapter-7-control-flow">#</a> </h1> <p>In most programming languages, control flow structures like <code>if</code>, <code>while</code>, and <code>for</code> are built-in syntax with special rules. In Io, they&rsquo;re just methods that receive messages. This chapter explores how Io&rsquo;s message-passing philosophy extends to control flow, and how you can create your own control structures.</p> <h2 id="everything-is-a-message"> Everything Is a Message <a class="anchor" href="#everything-is-a-message">#</a> </h2> <p>Let&rsquo;s start with a simple comparison. In C or Java:</p> <pre><code class="language-c">if (x &gt; 5) { printf(&quot;Big\n&quot;); } else { printf(&quot;Small\n&quot;); } </code></pre> <p>This is special syntax that the compiler understands. But in Io:</p> - - - Collections - https://example.org/docs/08-collections/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/08-collections/ - <h1 id="chapter-8-collections"> Chapter 8: Collections <a class="anchor" href="#chapter-8-collections">#</a> </h1> <p>Collections are fundamental to any programming language. Io provides three main collection types: List (ordered, indexed), Map (key-value pairs), and Sequence (strings). This chapter explores these collections, their methods, and how to create custom collection types.</p> <h2 id="lists-ordered-collections"> Lists: Ordered Collections <a class="anchor" href="#lists-ordered-collections">#</a> </h2> <p>Lists in Io are dynamic arrays that can hold any type of object:</p> <pre><code class="language-io">// Creating lists empty := list() numbers := list(1, 2, 3, 4, 5) mixed := list(&quot;hello&quot;, 42, true, Object clone) // Lists are objects numbers type println // List // Basic operations numbers size println // 5 numbers isEmpty println // false numbers first println // 1 numbers last println // 5 numbers at(2) println // 3 (zero-indexed) </code></pre> <h3 id="list-manipulation"> List Manipulation <a class="anchor" href="#list-manipulation">#</a> </h3> <pre><code class="language-io">fruits := list(&quot;apple&quot;, &quot;banana&quot;) // Adding elements fruits append(&quot;orange&quot;) fruits prepend(&quot;grape&quot;) fruits println // list(grape, apple, banana, orange) // Insert at position fruits atInsert(2, &quot;mango&quot;) fruits println // list(grape, apple, mango, banana, orange) // Removing elements fruits remove(&quot;mango&quot;) fruits removeAt(0) fruits pop // Removes and returns last element fruits println // list(apple, banana) // Multiple operations fruits appendSeq(list(&quot;kiwi&quot;, &quot;peach&quot;)) fruits println // list(apple, banana, kiwi, peach) </code></pre> <h3 id="list-iteration"> List Iteration <a class="anchor" href="#list-iteration">#</a> </h3> <pre><code class="language-io">numbers := list(1, 2, 3, 4, 5) // Basic iteration numbers foreach(n, n println ) // With index numbers foreach(i, n, (i .. &quot;: &quot; .. n) println ) // Reverse iteration numbers reverseForEach(n, n println ) </code></pre> <h3 id="functional-operations"> Functional Operations <a class="anchor" href="#functional-operations">#</a> </h3> <pre><code class="language-io">numbers := list(1, 2, 3, 4, 5) // Map: transform each element squared := numbers map(x, x * x) squared println // list(1, 4, 9, 16, 25) // Select: filter elements evens := numbers select(x, x % 2 == 0) evens println // list(2, 4) // Reject: inverse of select odds := numbers reject(x, x % 2 == 0) odds println // list(1, 3, 5) // Detect: find first match firstEven := numbers detect(x, x % 2 == 0) firstEven println // 2 // Reduce: aggregate sum := numbers reduce(+) sum println // 15 // Custom reduce product := numbers reduce(a, b, a * b) product println // 120 // Any/all predicates numbers contains(3) println // true numbers containsAll(list(2, 4)) println // true numbers containsAny(list(10, 3)) println // true </code></pre> <h3 id="list-slicing-and-manipulation"> List Slicing and Manipulation <a class="anchor" href="#list-slicing-and-manipulation">#</a> </h3> <pre><code class="language-io">letters := list(&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;, &quot;e&quot;) // Slicing letters slice(1, 3) println // list(b, c, d) letters slice(2) println // list(c, d, e) // Copying copy := letters copy copy atPut(0, &quot;z&quot;) letters println // list(a, b, c, d, e) - unchanged copy println // list(z, b, c, d, e) // Sorting numbers := list(3, 1, 4, 1, 5, 9) numbers sort println // list(1, 1, 3, 4, 5, 9) // Custom sort people := list( Object clone do(name := &quot;Alice&quot;; age := 30), Object clone do(name := &quot;Bob&quot;; age := 25), Object clone do(name := &quot;Charlie&quot;; age := 35) ) people sortBy(block(p, p age)) foreach(p, (p name .. &quot;: &quot; .. p age) println ) // Bob: 25 // Alice: 30 // Charlie: 35 </code></pre> <h2 id="maps-key-value-stores"> Maps: Key-Value Stores <a class="anchor" href="#maps-key-value-stores">#</a> </h2> <p>Maps (also called dictionaries or hash tables) store key-value pairs:</p> - - - Blocks and Closures - https://example.org/docs/09-blocks-and-closures/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/09-blocks-and-closures/ - <h1 id="chapter-9-blocks-and-closures"> Chapter 9: Blocks and Closures <a class="anchor" href="#chapter-9-blocks-and-closures">#</a> </h1> <p>Blocks in Io are first-class objects representing unevaluated code. They capture their creation context, making them closures. This chapter explores blocks, methods, closures, and how they enable functional programming patterns in Io.</p> <h2 id="understanding-blocks-and-methods"> Understanding Blocks and Methods <a class="anchor" href="#understanding-blocks-and-methods">#</a> </h2> <p>In Io, <code>block</code> and <code>method</code> are similar but have a crucial difference:</p> <pre><code class="language-io">// Block - creates its own scope blk := block(x, x * 2) blk call(5) println // 10 // Method - shares scope with receiver obj := Object clone obj value := 10 obj meth := method(x, x * value) // Can access 'value' obj blk := block(x, x * value) // Error when called - no 'value' in block scope obj meth(5) println // 50 // obj blk call(5) // Exception: value not found </code></pre> <p>The key difference:</p> - - - Exceptions - https://example.org/docs/10-exceptions/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/10-exceptions/ - <h1 id="chapter-10-exceptions"> Chapter 10: Exceptions <a class="anchor" href="#chapter-10-exceptions">#</a> </h1> <p>Error handling is crucial for robust programs. Io provides an exception system that, like everything else in the language, is built on objects and messages. This chapter explores how exceptions work, how to handle errors gracefully, and how to create custom exception types.</p> <h2 id="basic-exception-handling"> Basic Exception Handling <a class="anchor" href="#basic-exception-handling">#</a> </h2> <p>Io uses <code>try</code>, <code>catch</code>, and <code>raise</code> for exception handling:</p> <pre><code class="language-io">// Basic try-catch try( 10 / 0 // Division by zero ) catch(Exception, e, (&quot;Error: &quot; .. e message) println ) // Error: divide by zero // Multiple catch blocks try( someRiskyOperation() ) catch(TypeError, e, &quot;Type error occurred&quot; println ) catch(IOException, e, &quot;IO error occurred&quot; println ) catch(Exception, e, &quot;Some other error occurred&quot; println ) </code></pre> <p>Compare with other languages:</p> - - - Metaprogramming - https://example.org/docs/11-metaprogramming/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/11-metaprogramming/ - <h1 id="chapter-11-metaprogramming"> Chapter 11: Metaprogramming <a class="anchor" href="#chapter-11-metaprogramming">#</a> </h1> <p>Metaprogramming—writing code that manipulates code—is where Io truly shines. Since everything in Io is an object, including messages and methods, you can inspect, modify, and generate code at runtime. This chapter explores Io&rsquo;s powerful metaprogramming capabilities.</p> <h2 id="messages-as-data"> Messages as Data <a class="anchor" href="#messages-as-data">#</a> </h2> <p>In Io, code is data. Messages are objects you can create, inspect, and manipulate:</p> <pre><code class="language-io">// Create a message from code msg := message(2 + 3 * 4) // Inspect its structure msg println // 2 +(3 *(4)) msg name println // + msg arguments println // list(Message_0x...) msg arguments at(0) println // 3 *(4) // Evaluate it result := msg doInContext(Lobby) result println // 14 // Modify it msg setName(&quot;*&quot;) msg doInContext(Lobby) println // 6 (now it's 2 * 3 * 4) </code></pre> <p>Compare this to Lisp&rsquo;s code-as-data philosophy:</p> - - - Concurrency - https://example.org/docs/12-concurrency/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/12-concurrency/ - <h1 id="chapter-12-concurrency"> Chapter 12: Concurrency <a class="anchor" href="#chapter-12-concurrency">#</a> </h1> <p>Io provides powerful concurrency primitives: coroutines for cooperative multitasking, actors for message-passing concurrency, and futures for asynchronous computation. This chapter explores these mechanisms and how they enable concurrent and parallel programming in Io.</p> <h2 id="coroutines-cooperative-multitasking"> Coroutines: Cooperative Multitasking <a class="anchor" href="#coroutines-cooperative-multitasking">#</a> </h2> <p>Coroutines are the foundation of Io&rsquo;s concurrency model. They&rsquo;re lightweight threads that yield control cooperatively:</p> <pre><code class="language-io">// Create a coroutine coro := coroutine( 5 repeat(i, (&quot;Coroutine: &quot; .. i) println yield // Give control back ) ) // Run it 5 repeat( &quot;Main&quot; println coro resume // Resume the coroutine ) // Output interleaves Main and Coroutine messages </code></pre> <p>Compare with threads in other languages:</p> - - - Domain-Specific Languages - https://example.org/docs/13-domain-specific-languages/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/13-domain-specific-languages/ - <h1 id="chapter-13-domain-specific-languages"> Chapter 13: Domain-Specific Languages <a class="anchor" href="#chapter-13-domain-specific-languages">#</a> </h1> <p>Io&rsquo;s minimal syntax, message-passing model, and metaprogramming capabilities make it ideal for creating Domain-Specific Languages (DSLs). This chapter explores how to build expressive DSLs that feel native to their problem domains.</p> <h2 id="why-io-excels-at-dsls"> Why Io Excels at DSLs <a class="anchor" href="#why-io-excels-at-dsls">#</a> </h2> <p>Several features make Io particularly suitable for DSLs:</p> <ol> <li><strong>Minimal syntax</strong> - Less language machinery to work around</li> <li><strong>Optional parentheses</strong> - Clean, readable DSL code</li> <li><strong>Message chains</strong> - Natural expression of domain concepts</li> <li><strong>Runtime flexibility</strong> - Modify behavior on the fly</li> <li><strong>Homoiconicity</strong> - Code as manipulable data</li> </ol> <p>Compare a hypothetical DSL in Io vs Ruby:</p> - - - C Integration - https://example.org/docs/14-c-integration/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/14-c-integration/ - <h1 id="chapter-14-c-integration"> Chapter 14: C Integration <a class="anchor" href="#chapter-14-c-integration">#</a> </h1> <p>Io is implemented in C and provides excellent C integration capabilities. You can extend Io with C libraries, create high-performance addons, and embed Io in C applications. This chapter explores the bidirectional relationship between Io and C.</p> <h2 id="understanding-ios-c-architecture"> Understanding Io&rsquo;s C Architecture <a class="anchor" href="#understanding-ios-c-architecture">#</a> </h2> <p>Io&rsquo;s core is a small C library (around 10,000 lines) that implements:</p> <ul> <li>The object model (IoObject)</li> <li>The message passing system</li> <li>Basic types (Number, String, List, etc.)</li> <li>The VM and garbage collector</li> </ul> <p>Everything else is built on top of this foundation, either in C addons or pure Io.</p> - - - Real-World Patterns - https://example.org/docs/15-real-world-patterns/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/15-real-world-patterns/ - <h1 id="chapter-15-real-world-patterns"> Chapter 15: Real-World Patterns <a class="anchor" href="#chapter-15-real-world-patterns">#</a> </h1> <p>After exploring Io&rsquo;s features in isolation, this chapter brings everything together by examining patterns and architectures for building real applications. We&rsquo;ll see how Io&rsquo;s unique features enable elegant solutions to common programming challenges.</p> <h2 id="model-view-controller-mvc"> Model-View-Controller (MVC) <a class="anchor" href="#model-view-controller-mvc">#</a> </h2> <p>Implementing MVC in Io leverages prototypes and message passing:</p> <pre><code class="language-io">// Model Model := Object clone Model init := method( self observers := list() self data := Map clone self ) Model set := method(key, value, oldValue := data at(key) if(oldValue != value, data atPut(key, value) notifyObservers(key, oldValue, value) ) self ) Model get := method(key, data at(key) ) Model observe := method(observer, observers append(observer) self ) Model notifyObservers := method(key, oldValue, newValue, observers foreach(observer, if(observer hasSlot(&quot;modelChanged&quot;), observer modelChanged(self, key, oldValue, newValue) ) ) ) // View View := Object clone View init := method(model, self model := model model observe(self) self elements := Map clone self ) View modelChanged := method(model, key, oldValue, newValue, render ) View render := method( // Override in subclasses ) // Controller Controller := Object clone Controller init := method(model, view, self model := model self view := view self ) Controller handleInput := method(input, // Process input and update model ) // Example: Todo MVC TodoModel := Model clone TodoModel init := method( resend self set(&quot;todos&quot;, list()) self ) TodoModel addTodo := method(text, todos := get(&quot;todos&quot;) copy todos append(Map with(&quot;text&quot;, text, &quot;done&quot;, false)) set(&quot;todos&quot;, todos) ) TodoModel toggleTodo := method(index, todos := get(&quot;todos&quot;) copy todo := todos at(index) todo atPut(&quot;done&quot;, todo at(&quot;done&quot;) not) set(&quot;todos&quot;, todos) ) TodoView := View clone TodoView render := method( &quot;=== Todo List ===&quot; println model get(&quot;todos&quot;) foreach(i, todo, status := if(todo at(&quot;done&quot;), &quot;[✓]&quot;, &quot;[ ]&quot;) (i .. &quot;. &quot; .. status .. &quot; &quot; .. todo at(&quot;text&quot;)) println ) &quot;================&quot; println ) TodoController := Controller clone TodoController processCommand := method(cmd, parts := cmd split(&quot; &quot;) action := parts at(0) if(action == &quot;add&quot;, text := parts slice(1) join(&quot; &quot;) model addTodo(text) ) if(action == &quot;toggle&quot;, index := parts at(1) asNumber model toggleTodo(index) ) if(action == &quot;quit&quot;, System exit ) ) // Usage app := Object clone app model := TodoModel clone init app view := TodoView clone init(app model) app controller := TodoController clone init(app model, app view) app view render // Simulate commands app controller processCommand(&quot;add Buy groceries&quot;) app controller processCommand(&quot;add Write documentation&quot;) app controller processCommand(&quot;toggle 0&quot;) </code></pre> <h2 id="repository-pattern"> Repository Pattern <a class="anchor" href="#repository-pattern">#</a> </h2> <p>Abstracting data access:</p> - - - Case Studies - https://example.org/docs/16-case-studies/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/16-case-studies/ - <h1 id="chapter-16-case-studies"> Chapter 16: Case Studies <a class="anchor" href="#chapter-16-case-studies">#</a> </h1> <p>This chapter presents complete, real-world applications built in Io. Each case study demonstrates how Io&rsquo;s features work together to solve practical problems, showing both the elegance and challenges of building substantial systems in the language.</p> <h2 id="case-study-1-web-server"> Case Study 1: Web Server <a class="anchor" href="#case-study-1-web-server">#</a> </h2> <p>Building a simple but functional HTTP server demonstrates Io&rsquo;s networking, concurrency, and string handling:</p> <pre><code class="language-io">// HTTP Server Implementation HttpServer := Object clone HttpServer init := method(port, self port := port self routes := Map clone self middlewares := list() self ) HttpRequest := Object clone HttpRequest parse := method(rawData, lines := rawData split(&quot;\r\n&quot;) if(lines size == 0, return nil) // Parse request line requestLine := lines at(0) split(&quot; &quot;) self method := requestLine at(0) self path := requestLine at(1) self version := requestLine at(2) // Parse headers self headers := Map clone self body := &quot;&quot; bodyStart := false lines slice(1) foreach(line, if(bodyStart, body = body .. line, if(line size == 0, bodyStart = true, parts := line split(&quot;: &quot;) if(parts size == 2, headers atPut(parts at(0), parts at(1)) ) ) ) ) // Parse query parameters self params := Map clone if(path containsSeq(&quot;?&quot;), parts := path split(&quot;?&quot;) self path = parts at(0) queryString := parts at(1) queryString split(&quot;&amp;&quot;) foreach(param, kv := param split(&quot;=&quot;) if(kv size == 2, params atPut(kv at(0), kv at(1) urlDecode) ) ) ) self ) HttpResponse := Object clone HttpResponse init := method( self status := 200 self headers := Map clone self body := &quot;&quot; headers atPut(&quot;Content-Type&quot;, &quot;text/html&quot;) headers atPut(&quot;Server&quot;, &quot;Io-Server/1.0&quot;) self ) HttpResponse setStatus := method(code, status = code self ) HttpResponse setHeader := method(key, value, headers atPut(key, value) self ) HttpResponse write := method(content, body = body .. content self ) HttpResponse json := method(data, setHeader(&quot;Content-Type&quot;, &quot;application/json&quot;) write(data asJson) self ) HttpResponse build := method( statusText := Map with( 200, &quot;OK&quot;, 404, &quot;Not Found&quot;, 500, &quot;Internal Server Error&quot; ) at(status, &quot;Unknown&quot;) result := &quot;HTTP/1.1 &quot; .. status .. &quot; &quot; .. statusText .. &quot;\r\n&quot; headers atPut(&quot;Content-Length&quot;, body size asString) headers foreach(key, value, result = result .. key .. &quot;: &quot; .. value .. &quot;\r\n&quot; ) result .. &quot;\r\n&quot; .. body ) // Middleware support HttpServer use := method(middleware, middlewares append(middleware) self ) // Routing HttpServer route := method(method, path, handler, key := method .. &quot;:&quot; .. path routes atPut(key, handler) self ) HttpServer get := method(path, handler, route(&quot;GET&quot;, path, handler) ) HttpServer post := method(path, handler, route(&quot;POST&quot;, path, handler) ) // Request handling HttpServer handleConnection := method(socket, rawData := socket readUntilSeq(&quot;\r\n\r\n&quot;) request := HttpRequest parse(rawData) if(request isNil, socket close return ) response := HttpResponse clone init // Run middlewares middlewares foreach(middleware, middleware call(request, response) ) // Find route key := request method .. &quot;:&quot; .. request path handler := routes at(key) if(handler, e := try( handler call(request, response) ) catch(Exception, e, response setStatus(500) write(&quot;Internal Server Error: &quot; .. e message) ) , // Try pattern matching for dynamic routes handled := false routes foreach(routeKey, routeHandler, parts := routeKey split(&quot;:&quot;) routeMethod := parts at(0) routePath := parts at(1) if(routeMethod == request method and matchPath(routePath, request path), routeHandler call(request, response) handled = true break ) ) if(handled not, response setStatus(404) write(&quot;Not Found&quot;) ) ) socket write(response build) socket close ) HttpServer matchPath := method(pattern, path, // Simple pattern matching (e.g., /users/:id) if(pattern containsSeq(&quot;:&quot;), patternParts := pattern split(&quot;/&quot;) pathParts := path split(&quot;/&quot;) if(patternParts size != pathParts size, return false) patternParts foreach(i, part, if(part beginsWithSeq(&quot;:&quot;) not, if(part != pathParts at(i), return false) ) ) true , pattern == path ) ) HttpServer start := method( server := Socket clone server setHost(&quot;127.0.0.1&quot;) server setPort(port) server bind server listen (&quot;Server listening on port &quot; .. port) println loop( client := server accept @handleConnection(client) // Handle async ) ) // Example application app := HttpServer clone init(8080) // Middleware for logging app use(block(request, response, (&quot;[&quot; .. Date now .. &quot;] &quot; .. request method .. &quot; &quot; .. request path) println )) // Static content app get(&quot;/&quot;, block(request, response, response write(&quot;&lt;h1&gt;Welcome to Io Web Server&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;A simple server built with Io&lt;/p&gt;&quot;) )) // JSON API app get(&quot;/api/info&quot;, block(request, response, info := Map with( &quot;server&quot;, &quot;Io-Server&quot;, &quot;version&quot;, &quot;1.0&quot;, &quot;time&quot;, Date now asString ) response json(info) )) // Dynamic routes app get(&quot;/users/:id&quot;, block(request, response, // Extract ID from path id := request path split(&quot;/&quot;) at(2) response write(&quot;&lt;h1&gt;User Profile&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;User ID: &quot; .. id .. &quot;&lt;/p&gt;&quot;) )) // Form handling app post(&quot;/submit&quot;, block(request, response, // Parse form data from body response write(&quot;&lt;h1&gt;Form Submitted&lt;/h1&gt;&quot;) response write(&quot;&lt;p&gt;Data: &quot; .. request body .. &quot;&lt;/p&gt;&quot;) )) // Start server app start </code></pre> <h2 id="case-study-2-database-orm"> Case Study 2: Database ORM <a class="anchor" href="#case-study-2-database-orm">#</a> </h2> <p>A simple object-relational mapper showcasing metaprogramming and DSL capabilities:</p> - - - Ecosystem and Libraries - https://example.org/docs/17-ecosystem-and-libraries/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/17-ecosystem-and-libraries/ - <h1 id="chapter-17-ecosystem-and-libraries"> Chapter 17: Ecosystem and Libraries <a class="anchor" href="#chapter-17-ecosystem-and-libraries">#</a> </h1> <p>While Io has a smaller ecosystem compared to mainstream languages, it offers a thoughtfully curated set of libraries and tools. This chapter explores the available resources, how to use them effectively, and how to contribute to the Io ecosystem.</p> <h2 id="core-libraries"> Core Libraries <a class="anchor" href="#core-libraries">#</a> </h2> <p>Io comes with several built-in libraries that extend its capabilities:</p> <h3 id="file-io-and-system"> File I/O and System <a class="anchor" href="#file-io-and-system">#</a> </h3> <pre><code class="language-io">// File operations file := File with(&quot;data.txt&quot;) // Reading if(file exists, contents := file contents lines := file readLines // Read with encoding file setEncoding(&quot;UTF-8&quot;) text := file contents ) // Writing file openForWriting file write(&quot;Hello, World!\n&quot;) file write(&quot;Line 2\n&quot;) file close // Appending file openForAppending file write(&quot;Additional line\n&quot;) file close // File information file size println file lastModified println file isDirectory println // Directory operations dir := Directory with(&quot;./src&quot;) dir files foreach(file, file name println ) dir directories foreach(subdir, subdir path println ) // Recursive directory walking dir recursiveFilesOfType(&quot;io&quot;) foreach(ioFile, ioFile path println ) // System operations System system(&quot;ls -la&quot;) // Execute shell command System getEnvironmentVariable(&quot;HOME&quot;) println System setEnvironmentVariable(&quot;MY_VAR&quot;, &quot;value&quot;) System exit(0) </code></pre> <h3 id="networking"> Networking <a class="anchor" href="#networking">#</a> </h3> <pre><code class="language-io">// HTTP Client url := URL with(&quot;https://api.example.com/data&quot;) url fetch println // Simple GET request // With headers url setHeader(&quot;Authorization&quot;, &quot;Bearer token&quot;) url setHeader(&quot;Content-Type&quot;, &quot;application/json&quot;) response := url fetch // POST request url setMethod(&quot;POST&quot;) url setBody(&quot;{\&quot;key\&quot;: \&quot;value\&quot;}&quot;) response := url fetch // Socket programming // Server server := Socket clone server setHost(&quot;127.0.0.1&quot;) server setPort(8080) server bind server listen loop( client := server accept @( data := client readUntilSeq(&quot;\n&quot;) client write(&quot;Echo: &quot; .. data) client close ) ) // Client client := Socket clone client setHost(&quot;127.0.0.1&quot;) client setPort(8080) client connect client write(&quot;Hello, server!\n&quot;) response := client readUntilSeq(&quot;\n&quot;) response println client close </code></pre> <h3 id="date-and-time"> Date and Time <a class="anchor" href="#date-and-time">#</a> </h3> <pre><code class="language-io">// Current date/time now := Date now now println // Date components now year println now month println now day println now hour println now minute println now second println // Date arithmetic tomorrow := now + Duration days(1) nextWeek := now + Duration weeks(1) hourAgo := now - Duration hours(1) // Formatting now asString(&quot;%Y-%m-%d %H:%M:%S&quot;) println now asString(&quot;%B %d, %Y&quot;) println // Parsing date := Date fromString(&quot;2024-01-15&quot;, &quot;%Y-%m-%d&quot;) // Duration duration := Duration clone duration setDays(2) setHours(3) setMinutes(30) duration asSeconds println // Timing code start := Date now // ... code to time ... elapsed := Date now - start (&quot;Elapsed: &quot; .. elapsed) println </code></pre> <h3 id="regular-expressions"> Regular Expressions <a class="anchor" href="#regular-expressions">#</a> </h3> <pre><code class="language-io">// Basic matching text := &quot;The year 2024 has 365 days&quot; text matchesRegex(&quot;\\d+&quot;) println // true // Finding matches match := text findRegex(&quot;\\d+&quot;) match start println // Starting position match end println // Ending position match string println // Matched string // All matches matches := text allMatchesOfRegex(&quot;\\d+&quot;) matches foreach(m, m string println // 2024, 365 ) // Replacement result := text replaceFirstRegex(&quot;\\d+&quot;, &quot;N&quot;) result println // The year N has 365 days result := text replaceAllRegex(&quot;\\d+&quot;, &quot;N&quot;) result println // The year N has N days // Capture groups email := &quot;user@example.com&quot; pattern := &quot;(\\w+)@([\\w.]+)&quot; if(match := email matchesOfRegex(pattern), match at(1) println // user match at(2) println // example.com ) // Compiling regex for reuse regex := Regex with(&quot;\\b\\w{5}\\b&quot;) // 5-letter words regex matches(&quot;hello&quot;) println // true regex matches(&quot;hi&quot;) println // false </code></pre> <h3 id="json"> JSON <a class="anchor" href="#json">#</a> </h3> <pre><code class="language-io">// Parsing JSON jsonString := &quot;&quot;&quot; { &quot;name&quot;: &quot;Alice&quot;, &quot;age&quot;: 30, &quot;interests&quot;: [&quot;coding&quot;, &quot;music&quot;], &quot;address&quot;: { &quot;city&quot;: &quot;New York&quot;, &quot;zip&quot;: &quot;10001&quot; } } &quot;&quot;&quot; data := jsonString parseJson data at(&quot;name&quot;) println // Alice data at(&quot;interests&quot;) at(0) println // coding data at(&quot;address&quot;) at(&quot;city&quot;) println // New York // Creating JSON person := Map with( &quot;name&quot;, &quot;Bob&quot;, &quot;age&quot;, 25, &quot;active&quot;, true, &quot;tags&quot;, list(&quot;developer&quot;, &quot;gamer&quot;) ) json := person asJson json println // {&quot;name&quot;:&quot;Bob&quot;,&quot;age&quot;:25,&quot;active&quot;:true,&quot;tags&quot;:[&quot;developer&quot;,&quot;gamer&quot;]} // Pretty printing json := person asJson(true) // Pretty format </code></pre> <h3 id="xml"> XML <a class="anchor" href="#xml">#</a> </h3> <pre><code class="language-io">// Parsing XML xmlString := &quot;&quot;&quot; &lt;root&gt; &lt;person id=&quot;1&quot;&gt; &lt;name&gt;Alice&lt;/name&gt; &lt;age&gt;30&lt;/age&gt; &lt;/person&gt; &lt;person id=&quot;2&quot;&gt; &lt;name&gt;Bob&lt;/name&gt; &lt;age&gt;25&lt;/age&gt; &lt;/person&gt; &lt;/root&gt; &quot;&quot;&quot; doc := SGML parseString(xmlString) root := doc root // Navigate XML people := root elementsWithName(&quot;person&quot;) people foreach(person, id := person attributeAt(&quot;id&quot;) name := person elementWithName(&quot;name&quot;) text age := person elementWithName(&quot;age&quot;) text (id .. &quot;: &quot; .. name .. &quot; (&quot; .. age .. &quot;)&quot;) println ) // Build XML doc := SGML clone root := doc addElement(&quot;catalog&quot;) book := root addElement(&quot;book&quot;) book setAttribute(&quot;isbn&quot;, &quot;123456&quot;) book addElement(&quot;title&quot;) setText(&quot;Io Programming&quot;) book addElement(&quot;author&quot;) setText(&quot;Jane Doe&quot;) book addElement(&quot;price&quot;) setText(&quot;29.99&quot;) doc asString println </code></pre> <h2 id="addon-system"> Addon System <a class="anchor" href="#addon-system">#</a> </h2> <p>Io&rsquo;s addon system allows loading C-based extensions:</p> - - - Conclusion - https://example.org/docs/18-conclusion/ - Mon, 01 Jan 0001 00:00:00 +0000 - https://example.org/docs/18-conclusion/ - <h1 id="chapter-18-conclusion---the-io-way"> Chapter 18: Conclusion - The Io Way <a class="anchor" href="#chapter-18-conclusion---the-io-way">#</a> </h1> <p>We&rsquo;ve reached the end of our journey through the Io programming language. From its minimal syntax to its powerful metaprogramming capabilities, from prototype-based objects to concurrent actors, we&rsquo;ve explored a language that challenges conventional programming wisdom. This final chapter reflects on what we&rsquo;ve learned, when to use Io, and what it teaches us about programming itself.</p> <h2 id="what-makes-io-special"> What Makes Io Special <a class="anchor" href="#what-makes-io-special">#</a> </h2> <p>After eighteen chapters, we can distill Io&rsquo;s essence to a few key principles:</p> - - - diff --git a/website/public/katex/auto-render.min.js b/website/public/katex/auto-render.min.js deleted file mode 100644 index 32a7dd8..0000000 --- a/website/public/katex/auto-render.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};r.d(o,{default:function(){return p}});var i=r(757),a=r.n(i);const l=function(e,t,n){let r=n,o=0;const i=e.length;for(;re.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const o=t.findIndex((t=>e.startsWith(t.left)));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;const i=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};const c=function(e,t){const n=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)return null;const r=document.createDocumentFragment();for(let e=0;e-1===e.indexOf(" "+t+" ")))&&f(r,t)}}};var p=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};return o=o.default}()})); \ No newline at end of file diff --git a/website/public/katex/fonts/KaTeX_AMS-Regular.ttf b/website/public/katex/fonts/KaTeX_AMS-Regular.ttf deleted file mode 100644 index c6f9a5e..0000000 Binary files a/website/public/katex/fonts/KaTeX_AMS-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_AMS-Regular.woff b/website/public/katex/fonts/KaTeX_AMS-Regular.woff deleted file mode 100644 index b804d7b..0000000 Binary files a/website/public/katex/fonts/KaTeX_AMS-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_AMS-Regular.woff2 b/website/public/katex/fonts/KaTeX_AMS-Regular.woff2 deleted file mode 100644 index 0acaaff..0000000 Binary files a/website/public/katex/fonts/KaTeX_AMS-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.ttf b/website/public/katex/fonts/KaTeX_Caligraphic-Bold.ttf deleted file mode 100644 index 9ff4a5e..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff b/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff deleted file mode 100644 index 9759710..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2 b/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2 deleted file mode 100644 index f390922..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Bold.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.ttf b/website/public/katex/fonts/KaTeX_Caligraphic-Regular.ttf deleted file mode 100644 index f522294..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff b/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff deleted file mode 100644 index 9bdd534..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2 b/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2 deleted file mode 100644 index 75344a1..0000000 Binary files a/website/public/katex/fonts/KaTeX_Caligraphic-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Bold.ttf b/website/public/katex/fonts/KaTeX_Fraktur-Bold.ttf deleted file mode 100644 index 4e98259..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Bold.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff b/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff deleted file mode 100644 index e7730f6..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff2 b/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff2 deleted file mode 100644 index 395f28b..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Bold.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Regular.ttf b/website/public/katex/fonts/KaTeX_Fraktur-Regular.ttf deleted file mode 100644 index b8461b2..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff b/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff deleted file mode 100644 index acab069..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff2 b/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff2 deleted file mode 100644 index 735f694..0000000 Binary files a/website/public/katex/fonts/KaTeX_Fraktur-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Bold.ttf b/website/public/katex/fonts/KaTeX_Main-Bold.ttf deleted file mode 100644 index 4060e62..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Bold.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Bold.woff b/website/public/katex/fonts/KaTeX_Main-Bold.woff deleted file mode 100644 index f38136a..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Bold.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Bold.woff2 b/website/public/katex/fonts/KaTeX_Main-Bold.woff2 deleted file mode 100644 index ab2ad21..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Bold.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-BoldItalic.ttf b/website/public/katex/fonts/KaTeX_Main-BoldItalic.ttf deleted file mode 100644 index dc00797..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-BoldItalic.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff b/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff deleted file mode 100644 index 67807b0..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff2 b/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff2 deleted file mode 100644 index 5931794..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-BoldItalic.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Italic.ttf b/website/public/katex/fonts/KaTeX_Main-Italic.ttf deleted file mode 100644 index 0e9b0f3..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Italic.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Italic.woff b/website/public/katex/fonts/KaTeX_Main-Italic.woff deleted file mode 100644 index 6f43b59..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Italic.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Italic.woff2 b/website/public/katex/fonts/KaTeX_Main-Italic.woff2 deleted file mode 100644 index b50920e..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Italic.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Regular.ttf b/website/public/katex/fonts/KaTeX_Main-Regular.ttf deleted file mode 100644 index dd45e1e..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Regular.woff b/website/public/katex/fonts/KaTeX_Main-Regular.woff deleted file mode 100644 index 21f5812..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Main-Regular.woff2 b/website/public/katex/fonts/KaTeX_Main-Regular.woff2 deleted file mode 100644 index eb24a7b..0000000 Binary files a/website/public/katex/fonts/KaTeX_Main-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-BoldItalic.ttf b/website/public/katex/fonts/KaTeX_Math-BoldItalic.ttf deleted file mode 100644 index 728ce7a..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-BoldItalic.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff b/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff deleted file mode 100644 index 0ae390d..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff2 b/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff2 deleted file mode 100644 index 2965702..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-BoldItalic.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-Italic.ttf b/website/public/katex/fonts/KaTeX_Math-Italic.ttf deleted file mode 100644 index 70d559b..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-Italic.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-Italic.woff b/website/public/katex/fonts/KaTeX_Math-Italic.woff deleted file mode 100644 index eb5159d..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-Italic.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Math-Italic.woff2 b/website/public/katex/fonts/KaTeX_Math-Italic.woff2 deleted file mode 100644 index 215c143..0000000 Binary files a/website/public/katex/fonts/KaTeX_Math-Italic.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Bold.ttf b/website/public/katex/fonts/KaTeX_SansSerif-Bold.ttf deleted file mode 100644 index 2f65a8a..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Bold.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff b/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff deleted file mode 100644 index 8d47c02..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff2 b/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff2 deleted file mode 100644 index cfaa3bd..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Bold.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Italic.ttf b/website/public/katex/fonts/KaTeX_SansSerif-Italic.ttf deleted file mode 100644 index d5850df..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Italic.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff b/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff deleted file mode 100644 index 7e02df9..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff2 b/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff2 deleted file mode 100644 index 349c06d..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Italic.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Regular.ttf b/website/public/katex/fonts/KaTeX_SansSerif-Regular.ttf deleted file mode 100644 index 537279f..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff b/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff deleted file mode 100644 index 31b8482..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff2 b/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff2 deleted file mode 100644 index a90eea8..0000000 Binary files a/website/public/katex/fonts/KaTeX_SansSerif-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Script-Regular.ttf b/website/public/katex/fonts/KaTeX_Script-Regular.ttf deleted file mode 100644 index fd679bf..0000000 Binary files a/website/public/katex/fonts/KaTeX_Script-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Script-Regular.woff b/website/public/katex/fonts/KaTeX_Script-Regular.woff deleted file mode 100644 index 0e7da82..0000000 Binary files a/website/public/katex/fonts/KaTeX_Script-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Script-Regular.woff2 b/website/public/katex/fonts/KaTeX_Script-Regular.woff2 deleted file mode 100644 index b3048fc..0000000 Binary files a/website/public/katex/fonts/KaTeX_Script-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size1-Regular.ttf b/website/public/katex/fonts/KaTeX_Size1-Regular.ttf deleted file mode 100644 index 871fd7d..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size1-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size1-Regular.woff b/website/public/katex/fonts/KaTeX_Size1-Regular.woff deleted file mode 100644 index 7f292d9..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size1-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size1-Regular.woff2 b/website/public/katex/fonts/KaTeX_Size1-Regular.woff2 deleted file mode 100644 index c5a8462..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size1-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size2-Regular.ttf b/website/public/katex/fonts/KaTeX_Size2-Regular.ttf deleted file mode 100644 index 7a212ca..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size2-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size2-Regular.woff b/website/public/katex/fonts/KaTeX_Size2-Regular.woff deleted file mode 100644 index d241d9b..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size2-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size2-Regular.woff2 b/website/public/katex/fonts/KaTeX_Size2-Regular.woff2 deleted file mode 100644 index e1bccfe..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size2-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size3-Regular.ttf b/website/public/katex/fonts/KaTeX_Size3-Regular.ttf deleted file mode 100644 index 00bff34..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size3-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size3-Regular.woff b/website/public/katex/fonts/KaTeX_Size3-Regular.woff deleted file mode 100644 index e6e9b65..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size3-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size3-Regular.woff2 b/website/public/katex/fonts/KaTeX_Size3-Regular.woff2 deleted file mode 100644 index 249a286..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size3-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size4-Regular.ttf b/website/public/katex/fonts/KaTeX_Size4-Regular.ttf deleted file mode 100644 index 74f0892..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size4-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size4-Regular.woff b/website/public/katex/fonts/KaTeX_Size4-Regular.woff deleted file mode 100644 index e1ec545..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size4-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Size4-Regular.woff2 b/website/public/katex/fonts/KaTeX_Size4-Regular.woff2 deleted file mode 100644 index 680c130..0000000 Binary files a/website/public/katex/fonts/KaTeX_Size4-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Typewriter-Regular.ttf b/website/public/katex/fonts/KaTeX_Typewriter-Regular.ttf deleted file mode 100644 index c83252c..0000000 Binary files a/website/public/katex/fonts/KaTeX_Typewriter-Regular.ttf and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff b/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff deleted file mode 100644 index 2432419..0000000 Binary files a/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff and /dev/null differ diff --git a/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff2 b/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff2 deleted file mode 100644 index 771f1af..0000000 Binary files a/website/public/katex/fonts/KaTeX_Typewriter-Regular.woff2 and /dev/null differ diff --git a/website/public/katex/katex.min.css b/website/public/katex/katex.min.css deleted file mode 100644 index 2947730..0000000 --- a/website/public/katex/katex.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.22"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathboldfrak,.katex .textboldfrak{font-family:KaTeX_Fraktur;font-weight:700}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .mathsfit,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.2777777778em;margin-right:-.5555555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.1666666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.6666666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.4566666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.1466666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.7142857143em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.8571428571em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.1428571429em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.2857142857em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.4285714286em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.7142857143em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.0571428571em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.4685714286em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.9628571429em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.5542857143em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.7777777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.8888888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.1111111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.3333333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.3044444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.7644444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.5833333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.6666666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.7283333333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.0733333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.4166666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.4861111111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.5555555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.4402777778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.7277777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.2893518519em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.3472222222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.4050925926em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462962963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.5208333333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.6944444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.8333333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.2002314815em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.4398148148em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.2410800386em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.2892960463em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512054em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.3857280617em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.4339440694em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.4821600771em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.5785920926em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.6943105111em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.8331726133em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.1996142719em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.2009646302em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.2411575563em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.2813504823em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.3215434084em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.3617363344em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.4019292605em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.4823151125em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778135em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.6945337621em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.8336012862em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} \ No newline at end of file diff --git a/website/public/katex/katex.min.js b/website/public/katex/katex.min.js deleted file mode 100644 index f59062a..0000000 --- a/website/public/katex/katex.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Wn}});class r{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;let n,o,s="KaTeX parse error: "+e;const i=t&&t.loc;if(i&&i.start<=i.end){const e=i.lexer.input;n=i.start,o=i.end,n===e.length?s+=" at end of input: ":s+=" at position "+(n+1)+": ";const t=e.slice(n,o).replace(/[^]/g,"$&\u0332");let r,a;r=n>15?"\u2026"+e.slice(n-15,n):e.slice(0,n),a=o+15":">","<":"<",'"':""","'":"'"},i=/[&><"']/g;const a=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?a(e.body[0]):e:"font"===e.type?a(e.body):e};var l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(i,(e=>s[e]))},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:a,isCharacterBox:function(e){const t=a(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){const t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}};const h={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function c(e){if(e.default)return e.default;const t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class m{constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(const t in h)if(h.hasOwnProperty(t)){const r=h[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:c(r)}}reportNonstrict(e,t,r){let o=this.strict;if("function"==typeof o&&(o=o(e,t,r)),o&&"ignore"!==o){if(!0===o||"error"===o)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===o?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+o+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){let n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))}isTrusted(e){if(e.url&&!e.protocol){const t=l.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}class p{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return u[d[this.id]]}sub(){return u[g[this.id]]}fracNum(){return u[f[this.id]]}fracDen(){return u[b[this.id]]}cramp(){return u[y[this.id]]}text(){return u[x[this.id]]}isTight(){return this.size>=2}}const u=[new p(0,0,!1),new p(1,0,!0),new p(2,1,!1),new p(3,1,!0),new p(4,2,!1),new p(5,2,!0),new p(6,3,!1),new p(7,3,!0)],d=[4,5,4,5,6,7,6,7],g=[5,5,5,5,7,7,7,7],f=[2,3,4,5,6,7,6,7],b=[3,3,5,5,7,7,7,7],y=[1,1,3,3,5,5,7,7],x=[0,1,2,3,2,3,2,3];var w={DISPLAY:u[0],TEXT:u[2],SCRIPT:u[4],SCRIPTSCRIPT:u[6]};const v=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];const k=[];function S(e){for(let t=0;t=k[t]&&e<=k[t+1])return!0;return!1}v.forEach((e=>e.blocks.forEach((e=>k.push(...e)))));const M=80,z={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class A{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createDocumentFragment();for(let t=0;te.toText())).join("")}}var T={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}};const B={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},C={"\xc5":"A","\xd0":"D","\xde":"o","\xe5":"a","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function N(e,t,r){if(!T[t])throw new Error("Font metrics not found for font: "+t+".");let n=e.charCodeAt(0),o=T[t][n];if(!o&&e[0]in C&&(n=C[e[0]].charCodeAt(0),o=T[t][n]),o||"text"!==r||S(n)&&(o=T[t][77]),o)return{depth:o[0],height:o[1],italic:o[2],skew:o[3],width:o[4]}}const q={};const I=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],R=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],H=function(e,t){return t.size<2?e:I[e-1][t.size-1]};class O{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||O.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=R[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){const t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(const r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new O(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:H(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:R[e-1]})}havingBaseStyle(e){e=e||this.style.text();const t=H(O.BASESIZE,e);return this.size===t&&this.textSize===O.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){let e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==O.BASESIZE?["sizing","reset-size"+this.size,"size"+O.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){let t;if(t=e>=5?0:e>=3?1:2,!q[t]){const e=q[t]={cssEmPerMu:B.quad[t]/18};for(const r in B)B.hasOwnProperty(r)&&(e[r]=B[r][t])}return q[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}O.BASESIZE=6;var E=O;const L={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},D={ex:!0,em:!0,mu:!0},V=function(e){return"string"!=typeof e&&(e=e.unit),e in L||e in D||"ex"===e},P=function(e,t){let r;if(e.unit in L)r=L[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{let o;if(o=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=o.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=o.fontMetrics().quad}o!==t&&(r*=o.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},F=function(e){return+e.toFixed(4)+"em"},G=function(e){return e.filter((e=>e)).join(" ")},U=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");const e=t.getColor();e&&(this.style.color=e)}},Y=function(e){const t=document.createElement(e);t.className=G(this.classes);for(const e in this.style)this.style.hasOwnProperty(e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)this.attributes.hasOwnProperty(e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e/=\x00-\x1f]/,W=function(e){let t="<"+e;this.classes.length&&(t+=' class="'+l.escape(G(this.classes))+'"');let r="";for(const e in this.style)this.style.hasOwnProperty(e)&&(r+=l.hyphenate(e)+":"+this.style[e]+";");r&&(t+=' style="'+l.escape(r)+'"');for(const e in this.attributes)if(this.attributes.hasOwnProperty(e)){if(X.test(e))throw new n("Invalid attribute name '"+e+"'");t+=" "+e+'="'+l.escape(this.attributes[e])+'"'}t+=">";for(let e=0;e",t};class _{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,e,r,n),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"span")}toMarkup(){return W.call(this,"span")}}class j{constructor(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,U.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return l.contains(this.classes,e)}toNode(){return Y.call(this,"a")}toMarkup(){return W.call(this,"a")}}class ${constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=''+l.escape(this.alt)+'=n[0]&&e<=n[1])return r.name}}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=Z[this.text])}hasClass(e){return l.contains(this.classes,e)}toNode(){const e=document.createTextNode(this.text);let t=null;this.italic>0&&(t=document.createElement("span"),t.style.marginRight=F(this.italic)),this.classes.length>0&&(t=t||document.createElement("span"),t.className=G(this.classes));for(const e in this.style)this.style.hasOwnProperty(e)&&(t=t||document.createElement("span"),t.style[e]=this.style[e]);return t?(t.appendChild(e),t):e}toMarkup(){let e=!1,t="0&&(r+="margin-right:"+this.italic+"em;");for(const e in this.style)this.style.hasOwnProperty(e)&&(r+=l.hyphenate(e)+":"+this.style[e]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');const n=l.escape(this.text);return e?(t+=">",t+=n,t+="",t):n}}class J{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(let t=0;t':''}}class ee{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){const e=document.createElementNS("http://www.w3.org/2000/svg","line");for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){let e="","\\gt",!0),ie(ae,he,xe,"\u2208","\\in",!0),ie(ae,he,xe,"\ue020","\\@not"),ie(ae,he,xe,"\u2282","\\subset",!0),ie(ae,he,xe,"\u2283","\\supset",!0),ie(ae,he,xe,"\u2286","\\subseteq",!0),ie(ae,he,xe,"\u2287","\\supseteq",!0),ie(ae,ce,xe,"\u2288","\\nsubseteq",!0),ie(ae,ce,xe,"\u2289","\\nsupseteq",!0),ie(ae,he,xe,"\u22a8","\\models"),ie(ae,he,xe,"\u2190","\\leftarrow",!0),ie(ae,he,xe,"\u2264","\\le"),ie(ae,he,xe,"\u2264","\\leq",!0),ie(ae,he,xe,"<","\\lt",!0),ie(ae,he,xe,"\u2192","\\rightarrow",!0),ie(ae,he,xe,"\u2192","\\to"),ie(ae,ce,xe,"\u2271","\\ngeq",!0),ie(ae,ce,xe,"\u2270","\\nleq",!0),ie(ae,he,we,"\xa0","\\ "),ie(ae,he,we,"\xa0","\\space"),ie(ae,he,we,"\xa0","\\nobreakspace"),ie(le,he,we,"\xa0","\\ "),ie(le,he,we,"\xa0"," "),ie(le,he,we,"\xa0","\\space"),ie(le,he,we,"\xa0","\\nobreakspace"),ie(ae,he,we,null,"\\nobreak"),ie(ae,he,we,null,"\\allowbreak"),ie(ae,he,ye,",",","),ie(ae,he,ye,";",";"),ie(ae,ce,pe,"\u22bc","\\barwedge",!0),ie(ae,ce,pe,"\u22bb","\\veebar",!0),ie(ae,he,pe,"\u2299","\\odot",!0),ie(ae,he,pe,"\u2295","\\oplus",!0),ie(ae,he,pe,"\u2297","\\otimes",!0),ie(ae,he,ve,"\u2202","\\partial",!0),ie(ae,he,pe,"\u2298","\\oslash",!0),ie(ae,ce,pe,"\u229a","\\circledcirc",!0),ie(ae,ce,pe,"\u22a1","\\boxdot",!0),ie(ae,he,pe,"\u25b3","\\bigtriangleup"),ie(ae,he,pe,"\u25bd","\\bigtriangledown"),ie(ae,he,pe,"\u2020","\\dagger"),ie(ae,he,pe,"\u22c4","\\diamond"),ie(ae,he,pe,"\u22c6","\\star"),ie(ae,he,pe,"\u25c3","\\triangleleft"),ie(ae,he,pe,"\u25b9","\\triangleright"),ie(ae,he,be,"{","\\{"),ie(le,he,ve,"{","\\{"),ie(le,he,ve,"{","\\textbraceleft"),ie(ae,he,ue,"}","\\}"),ie(le,he,ve,"}","\\}"),ie(le,he,ve,"}","\\textbraceright"),ie(ae,he,be,"{","\\lbrace"),ie(ae,he,ue,"}","\\rbrace"),ie(ae,he,be,"[","\\lbrack",!0),ie(le,he,ve,"[","\\lbrack",!0),ie(ae,he,ue,"]","\\rbrack",!0),ie(le,he,ve,"]","\\rbrack",!0),ie(ae,he,be,"(","\\lparen",!0),ie(ae,he,ue,")","\\rparen",!0),ie(le,he,ve,"<","\\textless",!0),ie(le,he,ve,">","\\textgreater",!0),ie(ae,he,be,"\u230a","\\lfloor",!0),ie(ae,he,ue,"\u230b","\\rfloor",!0),ie(ae,he,be,"\u2308","\\lceil",!0),ie(ae,he,ue,"\u2309","\\rceil",!0),ie(ae,he,ve,"\\","\\backslash"),ie(ae,he,ve,"\u2223","|"),ie(ae,he,ve,"\u2223","\\vert"),ie(le,he,ve,"|","\\textbar",!0),ie(ae,he,ve,"\u2225","\\|"),ie(ae,he,ve,"\u2225","\\Vert"),ie(le,he,ve,"\u2225","\\textbardbl"),ie(le,he,ve,"~","\\textasciitilde"),ie(le,he,ve,"\\","\\textbackslash"),ie(le,he,ve,"^","\\textasciicircum"),ie(ae,he,xe,"\u2191","\\uparrow",!0),ie(ae,he,xe,"\u21d1","\\Uparrow",!0),ie(ae,he,xe,"\u2193","\\downarrow",!0),ie(ae,he,xe,"\u21d3","\\Downarrow",!0),ie(ae,he,xe,"\u2195","\\updownarrow",!0),ie(ae,he,xe,"\u21d5","\\Updownarrow",!0),ie(ae,he,fe,"\u2210","\\coprod"),ie(ae,he,fe,"\u22c1","\\bigvee"),ie(ae,he,fe,"\u22c0","\\bigwedge"),ie(ae,he,fe,"\u2a04","\\biguplus"),ie(ae,he,fe,"\u22c2","\\bigcap"),ie(ae,he,fe,"\u22c3","\\bigcup"),ie(ae,he,fe,"\u222b","\\int"),ie(ae,he,fe,"\u222b","\\intop"),ie(ae,he,fe,"\u222c","\\iint"),ie(ae,he,fe,"\u222d","\\iiint"),ie(ae,he,fe,"\u220f","\\prod"),ie(ae,he,fe,"\u2211","\\sum"),ie(ae,he,fe,"\u2a02","\\bigotimes"),ie(ae,he,fe,"\u2a01","\\bigoplus"),ie(ae,he,fe,"\u2a00","\\bigodot"),ie(ae,he,fe,"\u222e","\\oint"),ie(ae,he,fe,"\u222f","\\oiint"),ie(ae,he,fe,"\u2230","\\oiiint"),ie(ae,he,fe,"\u2a06","\\bigsqcup"),ie(ae,he,fe,"\u222b","\\smallint"),ie(le,he,de,"\u2026","\\textellipsis"),ie(ae,he,de,"\u2026","\\mathellipsis"),ie(le,he,de,"\u2026","\\ldots",!0),ie(ae,he,de,"\u2026","\\ldots",!0),ie(ae,he,de,"\u22ef","\\@cdots",!0),ie(ae,he,de,"\u22f1","\\ddots",!0),ie(ae,he,ve,"\u22ee","\\varvdots"),ie(le,he,ve,"\u22ee","\\varvdots"),ie(ae,he,me,"\u02ca","\\acute"),ie(ae,he,me,"\u02cb","\\grave"),ie(ae,he,me,"\xa8","\\ddot"),ie(ae,he,me,"~","\\tilde"),ie(ae,he,me,"\u02c9","\\bar"),ie(ae,he,me,"\u02d8","\\breve"),ie(ae,he,me,"\u02c7","\\check"),ie(ae,he,me,"^","\\hat"),ie(ae,he,me,"\u20d7","\\vec"),ie(ae,he,me,"\u02d9","\\dot"),ie(ae,he,me,"\u02da","\\mathring"),ie(ae,he,ge,"\ue131","\\@imath"),ie(ae,he,ge,"\ue237","\\@jmath"),ie(ae,he,ve,"\u0131","\u0131"),ie(ae,he,ve,"\u0237","\u0237"),ie(le,he,ve,"\u0131","\\i",!0),ie(le,he,ve,"\u0237","\\j",!0),ie(le,he,ve,"\xdf","\\ss",!0),ie(le,he,ve,"\xe6","\\ae",!0),ie(le,he,ve,"\u0153","\\oe",!0),ie(le,he,ve,"\xf8","\\o",!0),ie(le,he,ve,"\xc6","\\AE",!0),ie(le,he,ve,"\u0152","\\OE",!0),ie(le,he,ve,"\xd8","\\O",!0),ie(le,he,me,"\u02ca","\\'"),ie(le,he,me,"\u02cb","\\`"),ie(le,he,me,"\u02c6","\\^"),ie(le,he,me,"\u02dc","\\~"),ie(le,he,me,"\u02c9","\\="),ie(le,he,me,"\u02d8","\\u"),ie(le,he,me,"\u02d9","\\."),ie(le,he,me,"\xb8","\\c"),ie(le,he,me,"\u02da","\\r"),ie(le,he,me,"\u02c7","\\v"),ie(le,he,me,"\xa8",'\\"'),ie(le,he,me,"\u02dd","\\H"),ie(le,he,me,"\u25ef","\\textcircled");const ke={"--":!0,"---":!0,"``":!0,"''":!0};ie(le,he,ve,"\u2013","--",!0),ie(le,he,ve,"\u2013","\\textendash"),ie(le,he,ve,"\u2014","---",!0),ie(le,he,ve,"\u2014","\\textemdash"),ie(le,he,ve,"\u2018","`",!0),ie(le,he,ve,"\u2018","\\textquoteleft"),ie(le,he,ve,"\u2019","'",!0),ie(le,he,ve,"\u2019","\\textquoteright"),ie(le,he,ve,"\u201c","``",!0),ie(le,he,ve,"\u201c","\\textquotedblleft"),ie(le,he,ve,"\u201d","''",!0),ie(le,he,ve,"\u201d","\\textquotedblright"),ie(ae,he,ve,"\xb0","\\degree",!0),ie(le,he,ve,"\xb0","\\degree"),ie(le,he,ve,"\xb0","\\textdegree",!0),ie(ae,he,ve,"\xa3","\\pounds"),ie(ae,he,ve,"\xa3","\\mathsterling",!0),ie(le,he,ve,"\xa3","\\pounds"),ie(le,he,ve,"\xa3","\\textsterling",!0),ie(ae,ce,ve,"\u2720","\\maltese"),ie(le,ce,ve,"\u2720","\\maltese");const Se='0123456789/@."';for(let e=0;e<14;e++){const t=Se.charAt(e);ie(ae,he,ve,t,t)}const Me='0123456789!@*()-=+";:?/.,';for(let e=0;e<25;e++){const t=Me.charAt(e);ie(le,he,ve,t,t)}const ze="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";for(let e=0;e<52;e++){const t=ze.charAt(e);ie(ae,he,ge,t,t),ie(le,he,ve,t,t)}ie(ae,ce,ve,"C","\u2102"),ie(le,ce,ve,"C","\u2102"),ie(ae,ce,ve,"H","\u210d"),ie(le,ce,ve,"H","\u210d"),ie(ae,ce,ve,"N","\u2115"),ie(le,ce,ve,"N","\u2115"),ie(ae,ce,ve,"P","\u2119"),ie(le,ce,ve,"P","\u2119"),ie(ae,ce,ve,"Q","\u211a"),ie(le,ce,ve,"Q","\u211a"),ie(ae,ce,ve,"R","\u211d"),ie(le,ce,ve,"R","\u211d"),ie(ae,ce,ve,"Z","\u2124"),ie(le,ce,ve,"Z","\u2124"),ie(ae,he,ge,"h","\u210e"),ie(le,he,ge,"h","\u210e");let Ae="";for(let e=0;e<52;e++){const t=ze.charAt(e);Ae=String.fromCharCode(55349,56320+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56372+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56424+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56580+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56684+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56736+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56788+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56840+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56944+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),e<26&&(Ae=String.fromCharCode(55349,56632+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,56476+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae))}Ae=String.fromCharCode(55349,56668),ie(ae,he,ge,"k",Ae),ie(le,he,ve,"k",Ae);for(let e=0;e<10;e++){const t=e.toString();Ae=String.fromCharCode(55349,57294+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,57314+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,57324+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae),Ae=String.fromCharCode(55349,57334+e),ie(ae,he,ge,t,Ae),ie(le,he,ve,t,Ae)}const Te="\xd0\xde\xfe";for(let e=0;e<3;e++){const t=Te.charAt(e);ie(ae,he,ge,t,t),ie(le,he,ve,t,t)}const Be=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Ce=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],Ne=function(e,t,r){return se[r][e]&&se[r][e].replace&&(e=se[r][e].replace),{value:e,metrics:N(e,t,r)}},qe=function(e,t,r,n,o){const s=Ne(e,t,r),i=s.metrics;let a;if(e=s.value,i){let t=i.italic;("text"===r||n&&"mathit"===n.font)&&(t=0),a=new K(e,i.height,i.depth,t,i.skew,i.width,o)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+e+"' in style '"+t+"' and mode '"+r+"'"),a=new K(e,0,0,0,0,0,o);if(n){a.maxFontSize=n.sizeMultiplier,n.style.isTight()&&a.classes.push("mtight");const e=n.getColor();e&&(a.style.color=e)}return a},Ie=(e,t)=>{if(G(e.classes)!==G(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){const t=e.classes[0];if("mbin"===t||"mord"===t)return!1}for(const r in e.style)if(e.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;for(const r in t.style)if(t.style.hasOwnProperty(r)&&e.style[r]!==t.style[r])return!1;return!0},Re=function(e){let t=0,r=0,n=0;for(let o=0;ot&&(t=s.height),s.depth>r&&(r=s.depth),s.maxFontSize>n&&(n=s.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},He=function(e,t,r,n){const o=new _(e,t,r,n);return Re(o),o},Oe=(e,t,r,n)=>new _(e,t,r,n),Ee=function(e){const t=new A(e);return Re(t),t},Le=function(e,t,r){let n,o="";switch(e){case"amsrm":o="AMS";break;case"textrm":o="Main";break;case"textsf":o="SansSerif";break;case"texttt":o="Typewriter";break;default:o=e}return n="textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular",o+"-"+n},De={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ve={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]};var Pe={fontMap:De,makeSymbol:qe,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&Ne(e,"Main-Bold",t).metrics?qe(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===se[t][e].font?qe(e,"Main-Regular",t,r,n):qe(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:He,makeSvgSpan:Oe,makeLineSpan:function(e,t,r){const n=He([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=F(n.height),n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){const o=new j(e,t,r,n);return Re(o),o},makeFragment:Ee,wrapFragment:function(e,t){return e instanceof A?He([],[e],t):e},makeVList:function(e,t){const{children:r,depth:n}=function(e){if("individualShift"===e.positionType){const t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth;let o=n;for(let e=1;e0)return qe(s,h,o,t,i.concat(c));if(l){let e,n;if("boldsymbol"===l){const t=function(e,t,r,n,o){return"textord"!==o&&Ne(e,"Math-BoldItalic",t).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(s,o,0,0,r);e=t.fontName,n=[t.fontClass]}else a?(e=De[l].fontName,n=[l]):(e=Le(l,t.fontWeight,t.fontShape),n=[l,t.fontWeight,t.fontShape]);if(Ne(s,e,o).metrics)return qe(s,e,o,t,i.concat(n));if(ke.hasOwnProperty(s)&&"Typewriter"===e.slice(0,10)){const r=[];for(let a=0;a{const r=He(["mspace"],[],t),n=P(e,t);return r.style.marginRight=F(n),r},staticSvg:function(e,t){const[r,n,o]=Ve[e],s=new Q(r),i=new J([s],{width:F(n),height:F(o),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+1e3*o,preserveAspectRatio:"xMinYMin"}),a=Oe(["overlay"],[i],t);return a.height=o,a.style.height=F(o),a.style.width=F(n),a},svgData:Ve,tryCombineChars:e=>{for(let t=0;t{const r=t.classes[0],n=e.classes[0];"mbin"===r&&l.contains(tt,n)?t.classes[0]="mord":"mbin"===n&&l.contains(et,r)&&(e.classes[0]="mord")}),{node:i},a,h),st(o,((e,t)=>{const r=lt(t),n=lt(e),o=r&&n?e.hasClass("mtight")?Xe[r][n]:Ye[r][n]:null;if(o)return Pe.makeGlue(o,s)}),{node:i},a,h),o},st=function(e,t,r,n,o){n&&e.push(n);let s=0;for(;sr=>{e.splice(t+1,0,r),s++})(s)}n&&e.pop()},it=function(e){return e instanceof A||e instanceof j||e instanceof _&&e.hasClass("enclosing")?e:null},at=function(e,t){const r=it(e);if(r){const e=r.children;if(e.length){if("right"===t)return at(e[e.length-1],"right");if("left"===t)return at(e[0],"left")}}return e},lt=function(e,t){return e?(t&&(e=at(e,t)),nt[e.classes[0]]||null):null},ht=function(e,t){const r=["nulldelimiter"].concat(e.baseSizingClasses());return Qe(t.concat(r))},ct=function(e,t,r){if(!e)return Qe();if(_e[e.type]){let n=_e[e.type](e,t);if(r&&t.size!==r.size){n=Qe(t.sizingClasses(r),[n],t);const e=t.sizeMultiplier/r.sizeMultiplier;n.height*=e,n.depth*=e}return n}throw new n("Got group of unknown type: '"+e.type+"'")};function mt(e,t){const r=Qe(["base"],e,t),n=Qe(["strut"]);return n.style.height=F(r.height+r.depth),r.depth&&(n.style.verticalAlign=F(-r.depth)),r.children.unshift(n),r}function pt(e,t){let r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);const n=ot(e,t,"root");let o;2===n.length&&n[1].hasClass("tag")&&(o=n.pop());const s=[];let i,a=[];for(let e=0;e0&&(s.push(mt(a,t)),a=[]),s.push(n[e]));a.length>0&&s.push(mt(a,t)),r?(i=mt(ot(r,t,!0)),i.classes=["tag"],s.push(i)):o&&s.push(o);const l=Qe(["katex-html"],s);if(l.setAttribute("aria-hidden","true"),i){const e=i.children[0];e.style.height=F(l.height+l.depth),l.depth&&(e.style.verticalAlign=F(-l.depth))}return l}function ut(e){return new A(e)}class dt{constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){const e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(const t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=G(this.classes));for(let t=0;t0&&(e+=' class ="'+l.escape(G(this.classes))+'"'),e+=">";for(let t=0;t",e}toText(){return this.children.map((e=>e.toText())).join("")}}class gt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return l.escape(this.toText())}toText(){return this.text}}var ft={MathNode:dt,TextNode:gt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}toNode(){if(this.character)return document.createTextNode(this.character);{const e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",F(this.width)),e}}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},newDocumentFragment:ut};const bt=function(e,t,r){return!se[t][e]||!se[t][e].replace||55349===e.charCodeAt(0)||ke.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=se[t][e].replace),new ft.TextNode(e)},yt=function(e){return 1===e.length?e[0]:new ft.MathNode("mrow",e)},xt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";const r=t.font;if(!r||"mathnormal"===r)return null;const n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathsfit"===r)return"sans-serif-italic";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";let o=e.text;if(l.contains(["\\imath","\\jmath"],o))return null;se[n][o]&&se[n][o].replace&&(o=se[n][o].replace);return N(o,Pe.fontMap[r].fontName,n)?Pe.fontMap[r].variant:null};function wt(e){if(!e)return!1;if("mi"===e.type&&1===e.children.length){const t=e.children[0];return t instanceof gt&&"."===t.text}if("mo"===e.type&&1===e.children.length&&"true"===e.getAttribute("separator")&&"0em"===e.getAttribute("lspace")&&"0em"===e.getAttribute("rspace")){const t=e.children[0];return t instanceof gt&&","===t.text}return!1}const vt=function(e,t,r){if(1===e.length){const n=St(e[0],t);return r&&n instanceof dt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}const n=[];let o;for(let r=0;r=1&&("mn"===o.type||wt(o))){const e=s.children[0];e instanceof dt&&"mn"===e.type&&(e.children=[...o.children,...e.children],n.pop())}else if("mi"===o.type&&1===o.children.length){const e=o.children[0];if(e instanceof gt&&"\u0338"===e.text&&("mo"===s.type||"mi"===s.type||"mn"===s.type)){const e=s.children[0];e instanceof gt&&e.text.length>0&&(e.text=e.text.slice(0,1)+"\u0338"+e.text.slice(1),n.pop())}}}n.push(s),o=s}return n},kt=function(e,t,r){return yt(vt(e,t,r))},St=function(e,t){if(!e)return new ft.MathNode("mrow");if(je[e.type]){return je[e.type](e,t)}throw new n("Got group of unknown type: '"+e.type+"'")};function Mt(e,t,r,n,o){const s=vt(e,r);let i;i=1===s.length&&s[0]instanceof dt&&l.contains(["mrow","mtable"],s[0].type)?s[0]:new ft.MathNode("mrow",s);const a=new ft.MathNode("annotation",[new ft.TextNode(t)]);a.setAttribute("encoding","application/x-tex");const h=new ft.MathNode("semantics",[i,a]),c=new ft.MathNode("math",[h]);c.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&c.setAttribute("display","block");const m=o?"katex":"katex-mathml";return Pe.makeSpan([m],[c])}const zt=function(e){return new E({style:e.displayMode?w.DISPLAY:w.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},At=function(e,t){if(t.displayMode){const r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Pe.makeSpan(r,[e])}return e},Tt=function(e,t,r){const n=zt(r);let o;if("mathml"===r.output)return Mt(e,t,n,r.displayMode,!0);if("html"===r.output){const t=pt(e,n);o=Pe.makeSpan(["katex"],[t])}else{const s=Mt(e,t,n,r.displayMode,!1),i=pt(e,n);o=Pe.makeSpan(["katex"],[s,i])}return At(o,r)};const Bt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Ct={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]};var Nt=function(e,t,r,n,o){let s;const i=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(s=Pe.makeSpan(["stretchy",t],[],o),"fbox"===t){const e=o.color&&o.getColor();e&&(s.style.borderColor=e)}}else{const e=[];/^[bx]cancel$/.test(t)&&e.push(new ee({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&e.push(new ee({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));const r=new J(e,{width:"100%",height:F(i)});s=Pe.makeSvgSpan([],[r],o)}return s.height=i,s.style.height=F(i),s},qt=function(e){const t=new ft.MathNode("mo",[new ft.TextNode(Bt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},It=function(e,t){const{span:r,minWidth:n,height:o}=function(){let r=4e5;const n=e.label.slice(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){const s="ordgroup"===(o=e.base).type?o.body.length:1;let i,a,l;if(s>5)"widehat"===n||"widecheck"===n?(i=420,r=2364,l=.42,a=n+"4"):(i=312,r=2340,l=.34,a="tilde4");else{const e=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][e],i=[0,239,300,360,420][e],l=[0,.24,.3,.3,.36,.42][e],a=n+e):(r=[0,600,1033,2339,2340][e],i=[0,260,286,306,312][e],l=[0,.26,.286,.3,.306,.34][e],a="tilde"+e)}const h=new Q(a),c=new J([h],{width:"100%",height:F(l),viewBox:"0 0 "+r+" "+i,preserveAspectRatio:"none"});return{span:Pe.makeSvgSpan([],[c],t),minWidth:0,height:l}}{const e=[],o=Ct[n],[s,i,a]=o,l=a/1e3,h=s.length;let c,m;if(1===h){c=["hide-tail"],m=[o[3]]}else if(2===h)c=["halfarrow-left","halfarrow-right"],m=["xMinYMin","xMaxYMin"];else{if(3!==h)throw new Error("Correct katexImagesData or update code here to support\n "+h+" children.");c=["brace-left","brace-center","brace-right"],m=["xMinYMin","xMidYMin","xMaxYMin"]}for(let n=0;n0&&(r.style.minWidth=F(n)),r};function Rt(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Ht(e){const t=Ot(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Ot(e){return e&&("atom"===e.type||ne.hasOwnProperty(e.type))?e:null}const Et=(e,t)=>{let r,n,o;e&&"supsub"===e.type?(n=Rt(e.base,"accent"),r=n.base,e.base=r,o=function(e){if(e instanceof _)return e;throw new Error("Expected span but got "+String(e)+".")}(ct(e,t)),e.base=n):(n=Rt(e,"accent"),r=n.base);const s=ct(r,t.havingCrampedStyle());let i=0;if(n.isShifty&&l.isCharacterBox(r)){const e=l.getBaseElem(r);i=te(ct(e,t.havingCrampedStyle())).skew}const a="\\c"===n.label;let h,c=a?s.height+s.depth:Math.min(s.height,t.fontMetrics().xHeight);if(n.isStretchy)h=It(n,t),h=Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:i>0?{width:"calc(100% - "+F(2*i)+")",marginLeft:F(2*i)}:void 0}]},t);else{let e,r;"\\vec"===n.label?(e=Pe.staticSvg("vec",t),r=Pe.svgData.vec[1]):(e=Pe.makeOrd({mode:n.mode,text:n.label},t,"textord"),e=te(e),e.italic=0,r=e.width,a&&(c+=e.depth)),h=Pe.makeSpan(["accent-body"],[e]);const o="\\textcircled"===n.label;o&&(h.classes.push("accent-full"),c=s.height);let l=i;o||(l-=r/2),h.style.left=F(l),"\\textcircled"===n.label&&(h.style.top=".2em"),h=Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:-c},{type:"elem",elem:h}]},t)}const m=Pe.makeSpan(["mord","accent"],[h],t);return o?(o.children[0]=m,o.height=Math.max(m.height,o.height),o.classes[0]="mord",o):m},Lt=(e,t)=>{const r=e.isStretchy?qt(e.label):new ft.MathNode("mo",[bt(e.label,e.mode)]),n=new ft.MathNode("mover",[St(e.base,t),r]);return n.setAttribute("accent","true"),n},Dt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((e=>"\\"+e)).join("|"));$e({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{const r=Ke(t[0]),n=!Dt.test(e.funcName),o=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:o,base:r}},htmlBuilder:Et,mathmlBuilder:Lt}),$e({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{const r=t[0];let n=e.parser.mode;return"math"===n&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Et,mathmlBuilder:Lt}),$e({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:o}},htmlBuilder:(e,t)=>{const r=ct(e.base,t),n=It(e,t),o="\\utilde"===e.label?.12:0,s=Pe.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:o},{type:"elem",elem:r}]},t);return Pe.makeSpan(["mord","accentunder"],[s],t)},mathmlBuilder:(e,t)=>{const r=qt(e.label),n=new ft.MathNode("munder",[St(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});const Vt=e=>{const t=new ft.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};$e({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n,funcName:o}=e;return{type:"xArrow",mode:n.mode,label:o,body:t[0],below:r[0]}},htmlBuilder(e,t){const r=t.style;let n=t.havingStyle(r.sup());const o=Pe.wrapFragment(ct(e.body,n,t),t),s="\\x"===e.label.slice(0,2)?"x":"cd";let i;o.classes.push(s+"-arrow-pad"),e.below&&(n=t.havingStyle(r.sub()),i=Pe.wrapFragment(ct(e.below,n,t),t),i.classes.push(s+"-arrow-pad"));const a=It(e,t),l=-t.fontMetrics().axisHeight+.5*a.height;let h,c=-t.fontMetrics().axisHeight-.5*a.height-.111;if((o.depth>.25||"\\xleftequilibrium"===e.label)&&(c-=o.depth),i){const e=-t.fontMetrics().axisHeight+i.height+.5*a.height+.111;h=Pe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l},{type:"elem",elem:i,shift:e}]},t)}else h=Pe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:c},{type:"elem",elem:a,shift:l}]},t);return h.children[0].children[0].children[1].classes.push("svg-align"),Pe.makeSpan(["mrel","x-arrow"],[h],t)},mathmlBuilder(e,t){const r=qt(e.label);let n;if(r.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){const o=Vt(St(e.body,t));if(e.below){const s=Vt(St(e.below,t));n=new ft.MathNode("munderover",[r,s,o])}else n=new ft.MathNode("mover",[r,o])}else if(e.below){const o=Vt(St(e.below,t));n=new ft.MathNode("munder",[r,o])}else n=Vt(),n=new ft.MathNode("mover",[r,n]);return n}});const Pt=Pe.makeSpan;function Ft(e,t){const r=ot(e.body,t,!0);return Pt([e.mclass],r,t)}function Gt(e,t){let r;const n=vt(e.body,t);return"minner"===e.mclass?r=new ft.MathNode("mpadded",n):"mord"===e.mclass?e.isCharacterBox?(r=n[0],r.type="mi"):r=new ft.MathNode("mi",n):(e.isCharacterBox?(r=n[0],r.type="mo"):r=new ft.MathNode("mo",n),"mbin"===e.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}$e({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:Je(o),isCharacterBox:l.isCharacterBox(o)}},htmlBuilder:Ft,mathmlBuilder:Gt});const Ut=e=>{const t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};$e({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){let{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:Ut(t[0]),body:Je(t[1]),isCharacterBox:l.isCharacterBox(t[1])}}}),$e({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){let{parser:r,funcName:n}=e;const o=t[1],s=t[0];let i;i="\\stackrel"!==n?Ut(o):"mrel";const a={type:"op",mode:o.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:Je(o)},h={type:"supsub",mode:s.mode,base:a,sup:"\\underset"===n?null:s,sub:"\\underset"===n?s:null};return{type:"mclass",mode:r.mode,mclass:i,body:[h],isCharacterBox:l.isCharacterBox(h)}},htmlBuilder:Ft,mathmlBuilder:Gt}),$e({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:Ut(t[0]),body:Je(t[0])}},htmlBuilder(e,t){const r=ot(e.body,t,!0),n=Pe.makeSpan([e.mclass],r,t);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(e,t){const r=vt(e.body,t),n=new ft.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});const Yt={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},Xt=e=>"textord"===e.type&&"@"===e.text;function Wt(e,t,r){const n=Yt[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":{const e={type:"atom",text:n,mode:"math",family:"rel"},o={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[e],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[o],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{const e={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[e],[])}default:return{type:"textord",text:" ",mode:"math"}}}$e({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder(e,t){const r=t.havingStyle(t.style.sup()),n=Pe.wrapFragment(ct(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=F(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(e,t){let r=new ft.MathNode("mrow",[St(e.label,t)]);return r=new ft.MathNode("mpadded",[r]),r.setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new ft.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),$e({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){let{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){const r=Pe.wrapFragment(ct(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(e,t){return new ft.MathNode("mrow",[St(e.fragment,t)])}}),$e({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;const o=Rt(t[0],"ordgroup").body;let s="";for(let e=0;e=1114111)throw new n("\\@char with invalid code point "+s);return a<=65535?i=String.fromCharCode(a):(a-=65536,i=String.fromCharCode(55296+(a>>10),56320+(1023&a))),{type:"textord",mode:r.mode,text:i}}});const _t=(e,t)=>{const r=ot(e.body,t.withColor(e.color),!1);return Pe.makeFragment(r)},jt=(e,t)=>{const r=vt(e.body,t.withColor(e.color)),n=new ft.MathNode("mstyle",r);return n.setAttribute("mathcolor",e.color),n};$e({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){let{parser:r}=e;const n=Rt(t[0],"color-token").color,o=t[1];return{type:"color",mode:r.mode,color:n,body:Je(o)}},htmlBuilder:_t,mathmlBuilder:jt}),$e({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){let{parser:r,breakOnTokenText:n}=e;const o=Rt(t[0],"color-token").color;r.gullet.macros.set("\\current@color",o);const s=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:o,body:s}},htmlBuilder:_t,mathmlBuilder:jt}),$e({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){let{parser:n}=e;const o="["===n.gullet.future().text?n.parseSizeGroup(!0):null,s=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:s,size:o&&Rt(o,"size").value}},htmlBuilder(e,t){const r=Pe.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=F(P(e.size,t)))),r},mathmlBuilder(e,t){const r=new ft.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",F(P(e.size,t)))),r}});const $t={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Zt=e=>{const t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new n("Expected a control sequence",e);return t},Kt=(e,t,r,n)=>{let o=e.gullet.macros.get(r.text);null==o&&(r.noexpand=!0,o={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,o,n)};$e({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){let{parser:t,funcName:r}=e;t.consumeSpaces();const o=t.fetch();if($t[o.text])return"\\global"!==r&&"\\\\globallong"!==r||(o.text=$t[o.text]),Rt(t.parseFunction(),"internal");throw new n("Invalid token after macro prefix",o)}}),$e({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e,o=t.gullet.popToken();const s=o.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(s))throw new n("Expected a control sequence",o);let i,a=0;const l=[[]];for(;"{"!==t.gullet.future().text;)if(o=t.gullet.popToken(),"#"===o.text){if("{"===t.gullet.future().text){i=t.gullet.future(),l[a].push("{");break}if(o=t.gullet.popToken(),!/^[1-9]$/.test(o.text))throw new n('Invalid argument number "'+o.text+'"');if(parseInt(o.text)!==a+1)throw new n('Argument number "'+o.text+'" out of order');a++,l.push([])}else{if("EOF"===o.text)throw new n("Expected a macro definition");l[a].push(o.text)}let{tokens:h}=t.gullet.consumeArg();return i&&h.unshift(i),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h),h.reverse()),t.gullet.macros.set(s,{tokens:h,numArgs:a,delimiters:l},r===$t[r]),{type:"internal",mode:t.mode}}}),$e({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=Zt(t.gullet.popToken());t.gullet.consumeSpaces();const o=(e=>{let t=e.gullet.popToken();return"="===t.text&&(t=e.gullet.popToken()," "===t.text&&(t=e.gullet.popToken())),t})(t);return Kt(t,n,o,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),$e({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){let{parser:t,funcName:r}=e;const n=Zt(t.gullet.popToken()),o=t.gullet.popToken(),s=t.gullet.popToken();return Kt(t,n,s,"\\\\globalfuture"===r),t.gullet.pushToken(s),t.gullet.pushToken(o),{type:"internal",mode:t.mode}}});const Jt=function(e,t,r){const n=N(se.math[e]&&se.math[e].replace||e,t,r);if(!n)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return n},Qt=function(e,t,r,n){const o=r.havingBaseStyle(t),s=Pe.makeSpan(n.concat(o.sizingClasses(r)),[e],r),i=o.sizeMultiplier/r.sizeMultiplier;return s.height*=i,s.depth*=i,s.maxFontSize=o.sizeMultiplier,s},er=function(e,t,r){const n=t.havingBaseStyle(r),o=(1-t.sizeMultiplier/n.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=F(o),e.height-=o,e.depth+=o},tr=function(e,t,r,n,o,s){const i=function(e,t,r,n){return Pe.makeSymbol(e,"Size"+t+"-Regular",r,n)}(e,t,o,n),a=Qt(Pe.makeSpan(["delimsizing","size"+t],[i],n),w.TEXT,n,s);return r&&er(a,n,w.TEXT),a},rr=function(e,t,r){let n;n="Size1-Regular"===t?"delim-size1":"delim-size4";return{type:"elem",elem:Pe.makeSpan(["delimsizinginner",n],[Pe.makeSpan([],[Pe.makeSymbol(e,t,r)])])}},nr=function(e,t,r){const n=T["Size4-Regular"][e.charCodeAt(0)]?T["Size4-Regular"][e.charCodeAt(0)][4]:T["Size1-Regular"][e.charCodeAt(0)][4],o=new Q("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),s=new J([o],{width:F(n),height:F(t),style:"width:"+F(n),viewBox:"0 0 "+1e3*n+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),i=Pe.makeSvgSpan([],[s],r);return i.height=t,i.style.height=F(t),i.style.width=F(n),{type:"elem",elem:i}},or={type:"kern",size:-.008},sr=["|","\\lvert","\\rvert","\\vert"],ir=["\\|","\\lVert","\\rVert","\\Vert"],ar=function(e,t,r,n,o,s){let i,a,h,c,m="",p=0;i=h=c=e,a=null;let u="Size1-Regular";"\\uparrow"===e?h=c="\u23d0":"\\Uparrow"===e?h=c="\u2016":"\\downarrow"===e?i=h="\u23d0":"\\Downarrow"===e?i=h="\u2016":"\\updownarrow"===e?(i="\\uparrow",h="\u23d0",c="\\downarrow"):"\\Updownarrow"===e?(i="\\Uparrow",h="\u2016",c="\\Downarrow"):l.contains(sr,e)?(h="\u2223",m="vert",p=333):l.contains(ir,e)?(h="\u2225",m="doublevert",p=556):"["===e||"\\lbrack"===e?(i="\u23a1",h="\u23a2",c="\u23a3",u="Size4-Regular",m="lbrack",p=667):"]"===e||"\\rbrack"===e?(i="\u23a4",h="\u23a5",c="\u23a6",u="Size4-Regular",m="rbrack",p=667):"\\lfloor"===e||"\u230a"===e?(h=i="\u23a2",c="\u23a3",u="Size4-Regular",m="lfloor",p=667):"\\lceil"===e||"\u2308"===e?(i="\u23a1",h=c="\u23a2",u="Size4-Regular",m="lceil",p=667):"\\rfloor"===e||"\u230b"===e?(h=i="\u23a5",c="\u23a6",u="Size4-Regular",m="rfloor",p=667):"\\rceil"===e||"\u2309"===e?(i="\u23a4",h=c="\u23a5",u="Size4-Regular",m="rceil",p=667):"("===e||"\\lparen"===e?(i="\u239b",h="\u239c",c="\u239d",u="Size4-Regular",m="lparen",p=875):")"===e||"\\rparen"===e?(i="\u239e",h="\u239f",c="\u23a0",u="Size4-Regular",m="rparen",p=875):"\\{"===e||"\\lbrace"===e?(i="\u23a7",a="\u23a8",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(i="\u23ab",a="\u23ac",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(i="\u23a7",c="\u23a9",h="\u23aa",u="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(i="\u23ab",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(i="\u23a7",c="\u23ad",h="\u23aa",u="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(i="\u23ab",c="\u23a9",h="\u23aa",u="Size4-Regular");const d=Jt(i,u,o),g=d.height+d.depth,f=Jt(h,u,o),b=f.height+f.depth,y=Jt(c,u,o),x=y.height+y.depth;let v=0,k=1;if(null!==a){const e=Jt(a,u,o);v=e.height+e.depth,k=2}const S=g+x+v,M=S+Math.max(0,Math.ceil((t-S)/(k*b)))*k*b;let z=n.fontMetrics().axisHeight;r&&(z*=n.sizeMultiplier);const A=M/2-z,T=[];if(m.length>0){const e=M-g-x,t=Math.round(1e3*M),r=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}}(m,Math.round(1e3*e)),o=new Q(m,r),s=(p/1e3).toFixed(3)+"em",i=(t/1e3).toFixed(3)+"em",a=new J([o],{width:s,height:i,viewBox:"0 0 "+p+" "+t}),l=Pe.makeSvgSpan([],[a],n);l.height=t/1e3,l.style.width=s,l.style.height=i,T.push({type:"elem",elem:l})}else{if(T.push(rr(c,u,o)),T.push(or),null===a){const e=M-g-x+.016;T.push(nr(h,e,n))}else{const e=(M-g-x-v)/2+.016;T.push(nr(h,e,n)),T.push(or),T.push(rr(a,u,o)),T.push(or),T.push(nr(h,e,n))}T.push(or),T.push(rr(i,u,o))}const B=n.havingBaseStyle(w.TEXT),C=Pe.makeVList({positionType:"bottom",positionData:A,children:T},B);return Qt(Pe.makeSpan(["delimsizing","mult"],[C],B),w.TEXT,n,s)},lr=.08,hr=function(e,t,r,n,o){const s=function(e,t,r){t*=1e3;let n="";switch(e){case"sqrtMain":n=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize1":n=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize2":n=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize3":n=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,M);break;case"sqrtSize4":n=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,M);break;case"sqrtTall":n=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,M,r)}return n}(e,n,r),i=new Q(e,s),a=new J([i],{width:"400em",height:F(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Pe.makeSvgSpan(["hide-tail"],[a],o)},cr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],mr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],pr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],ur=[0,1.2,1.8,2.4,3],dr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],gr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"stack"}],fr=[{type:"small",style:w.SCRIPTSCRIPT},{type:"small",style:w.SCRIPT},{type:"small",style:w.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],br=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},yr=function(e,t,r,n){for(let o=Math.min(2,3-n.style.size);ot)return r[o]}return r[r.length-1]},xr=function(e,t,r,n,o,s){let i;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),i=l.contains(pr,e)?dr:l.contains(cr,e)?fr:gr;const a=yr(e,t,i,n);return"small"===a.type?function(e,t,r,n,o,s){const i=Pe.makeSymbol(e,"Main-Regular",o,n),a=Qt(i,t,n,s);return r&&er(a,n,t),a}(e,a.style,r,n,o,s):"large"===a.type?tr(e,a.size,r,n,o,s):ar(e,t,r,n,o,s)};var wr={sqrtImage:function(e,t){const r=t.havingBaseSizing(),n=yr("\\surd",e*r.sizeMultiplier,fr,r);let o=r.sizeMultiplier;const s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness);let i,a,l=0,h=0,c=0;return"small"===n.type?(c=1e3+1e3*s+80,e<1?o=1:e<1.4&&(o=.7),l=(1+s+lr)/o,h=(1+s)/o,i=hr("sqrtMain",l,c,s,t),i.style.minWidth="0.853em",a=.833/o):"large"===n.type?(c=1080*ur[n.size],h=(ur[n.size]+s)/o,l=(ur[n.size]+s+lr)/o,i=hr("sqrtSize"+n.size,l,c,s,t),i.style.minWidth="1.02em",a=1/o):(l=e+s+lr,h=e+s,c=Math.floor(1e3*e+s)+80,i=hr("sqrtTall",l,c,s,t),i.style.minWidth="0.742em",a=1.056),i.height=h,i.style.height=F(l),{span:i,advanceWidth:a,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,o,s){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(cr,e)||l.contains(pr,e))return tr(e,t,!1,r,o,s);if(l.contains(mr,e))return ar(e,ur[t],!1,r,o,s);throw new n("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:ur,customSizedDelim:xr,leftRightDelim:function(e,t,r,n,o,s){const i=n.fontMetrics().axisHeight*n.sizeMultiplier,a=5/n.fontMetrics().ptPerEm,l=Math.max(t-i,r+i),h=Math.max(l/500*901,2*l-a);return xr(e,h,!0,n,o,s)}};const vr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},kr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Sr(e,t){const r=Ot(e);if(r&&l.contains(kr,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function Mr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}$e({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{const r=Sr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:vr[e.funcName].size,mclass:vr[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>"."===e.delim?Pe.makeSpan([e.mclass]):wr.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{const t=[];"."!==e.delim&&t.push(bt(e.delim,e.mode));const r=new ft.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");const n=F(wr.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r}}),$e({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Sr(t[0],e).text,color:r}}}),$e({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=Sr(t[0],e),n=e.parser;++n.leftrightDepth;const o=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);const s=Rt(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:o,left:r.text,right:s.delim,rightColor:s.color}},htmlBuilder:(e,t)=>{Mr(e);const r=ot(e.body,t,!0,["mopen","mclose"]);let n,o,s=0,i=0,a=!1;for(let e=0;e{Mr(e);const r=vt(e.body,t);if("."!==e.left){const t=new ft.MathNode("mo",[bt(e.left,e.mode)]);t.setAttribute("fence","true"),r.unshift(t)}if("."!==e.right){const t=new ft.MathNode("mo",[bt(e.right,e.mode)]);t.setAttribute("fence","true"),e.rightColor&&t.setAttribute("mathcolor",e.rightColor),r.push(t)}return yt(r)}}),$e({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{const r=Sr(t[0],e);if(!e.parser.leftrightDepth)throw new n("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{let r;if("."===e.delim)r=ht(t,[]);else{r=wr.sizedDelim(e.delim,1,t,e.mode,[]);const n={delim:e.delim,options:t};r.isMiddle=n}return r},mathmlBuilder:(e,t)=>{const r="\\vert"===e.delim||"|"===e.delim?bt("|","text"):bt(e.delim,e.mode),n=new ft.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});const zr=(e,t)=>{const r=Pe.wrapFragment(ct(e.body,t),t),n=e.label.slice(1);let o,s=t.sizeMultiplier,i=0;const a=l.isCharacterBox(e.body);if("sout"===n)o=Pe.makeSpan(["stretchy","sout"]),o.height=t.fontMetrics().defaultRuleThickness/s,i=-.5*t.fontMetrics().xHeight;else if("phase"===n){const e=P({number:.6,unit:"pt"},t),n=P({number:.35,unit:"ex"},t);s/=t.havingBaseSizing().sizeMultiplier;const a=r.height+r.depth+e+n;r.style.paddingLeft=F(a/2+e);const l=Math.floor(1e3*a*s),c="M400000 "+(h=l)+" H0 L"+h/2+" 0 l65 45 L145 "+(h-80)+" H400000z",m=new J([new Q("phase",c)],{width:"400em",height:F(l/1e3),viewBox:"0 0 400000 "+l,preserveAspectRatio:"xMinYMin slice"});o=Pe.makeSvgSpan(["hide-tail"],[m],t),o.style.height=F(a),i=r.depth+e+n}else{/cancel/.test(n)?a||r.classes.push("cancel-pad"):"angl"===n?r.classes.push("anglpad"):r.classes.push("boxpad");let s=0,l=0,h=0;/box/.test(n)?(h=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),s=t.fontMetrics().fboxsep+("colorbox"===n?0:h),l=s):"angl"===n?(h=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness),s=4*h,l=Math.max(0,.25-r.depth)):(s=a?.2:0,l=s),o=Nt(r,n,s,l,t),/fbox|boxed|fcolorbox/.test(n)?(o.style.borderStyle="solid",o.style.borderWidth=F(h)):"angl"===n&&.049!==h&&(o.style.borderTopWidth=F(h),o.style.borderRightWidth=F(h)),i=r.depth+l,e.backgroundColor&&(o.style.backgroundColor=e.backgroundColor,e.borderColor&&(o.style.borderColor=e.borderColor))}var h;let c;if(e.backgroundColor)c=Pe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:i},{type:"elem",elem:r,shift:0}]},t);else{const e=/cancel|phase/.test(n)?["svg-align"]:[];c=Pe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:o,shift:i,wrapperClasses:e}]},t)}return/cancel/.test(n)&&(c.height=r.height,c.depth=r.depth),/cancel/.test(n)&&!a?Pe.makeSpan(["mord","cancel-lap"],[c],t):Pe.makeSpan(["mord"],[c],t)},Ar=(e,t)=>{let r=0;const n=new ft.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[St(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){const r=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+r+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};$e({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=Rt(t[0],"color-token").color,i=t[1];return{type:"enclose",mode:n.mode,label:o,backgroundColor:s,body:i}},htmlBuilder:zr,mathmlBuilder:Ar}),$e({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(e,t,r){let{parser:n,funcName:o}=e;const s=Rt(t[0],"color-token").color,i=Rt(t[1],"color-token").color,a=t[2];return{type:"enclose",mode:n.mode,label:o,backgroundColor:i,borderColor:s,body:a}},htmlBuilder:zr,mathmlBuilder:Ar}),$e({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}}),$e({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"enclose",mode:r.mode,label:n,body:o}},htmlBuilder:zr,mathmlBuilder:Ar}),$e({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});const Tr={};function Br(e){let{type:t,names:r,props:n,handler:o,htmlBuilder:s,mathmlBuilder:i}=e;const a={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:o};for(let e=0;e{if(!e.parser.settings.displayMode)throw new n("{"+e.envName+"} can be used only in display mode.")};function Or(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function Er(e,t,r){let{hskipBeforeAndAfter:o,addJot:s,cols:i,arraystretch:a,colSeparationType:l,autoTag:h,singleRow:c,emptySingleRow:m,maxNumCols:p,leqno:u}=t;if(e.gullet.beginGroup(),c||e.gullet.macros.set("\\cr","\\\\\\relax"),!a){const t=e.gullet.expandMacroAsText("\\arraystretch");if(null==t)a=1;else if(a=parseFloat(t),!a||a<0)throw new n("Invalid \\arraystretch: "+t)}e.gullet.beginGroup();let d=[];const g=[d],f=[],b=[],y=null!=h?[]:void 0;function x(){h&&e.gullet.macros.set("\\@eqnsw","1",!0)}function w(){y&&(e.gullet.macros.get("\\df@tag")?(y.push(e.subparse([new Ir("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):y.push(Boolean(h)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(x(),b.push(Rr(e));;){let t=e.parseExpression(!1,c?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),t={type:"ordgroup",mode:e.mode,body:t},r&&(t={type:"styling",mode:e.mode,style:r,body:[t]}),d.push(t);const o=e.fetch().text;if("&"===o){if(p&&d.length===p){if(c||l)throw new n("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===o){w(),1===d.length&&"styling"===t.type&&0===t.body[0].body.length&&(g.length>1||!m)&&g.pop(),b.length0&&(x+=.25),c.push({pos:x,isDashed:e[t]})}for(v(i[0]),r=0;r0&&(p+=y,le)))for(r=0;r=a)continue;(o>0||e.hskipBeforeAndAfter)&&(i=l.deflt(c.pregap,u),0!==i&&(z=Pe.makeSpan(["arraycolsep"],[]),z.style.width=F(i),M.push(z)));let d=[];for(r=0;r0){const e=Pe.makeLineSpan("hline",t,m),r=Pe.makeLineSpan("hdashline",t,m),n=[{type:"elem",elem:h,shift:0}];for(;c.length>0;){const t=c.pop(),o=t.pos-k;t.isDashed?n.push({type:"elem",elem:r,shift:o}):n.push({type:"elem",elem:e,shift:o})}h=Pe.makeVList({positionType:"individualShift",children:n},t)}if(0===T.length)return Pe.makeSpan(["mord"],[h],t);{let e=Pe.makeVList({positionType:"individualShift",children:T},t);return e=Pe.makeSpan(["tag"],[e],t),Pe.makeFragment([h,e])}},Vr={c:"center ",l:"left ",r:"right "},Pr=function(e,t){const r=[],n=new ft.MathNode("mtd",[],["mtr-glue"]),o=new ft.MathNode("mtd",[],["mml-eqn-num"]);for(let s=0;s0){const t=e.cols;let r="",n=!1,o=0,i=t.length;"separator"===t[0].type&&(a+="top ",o=1),"separator"===t[t.length-1].type&&(a+="bottom ",i-=1);for(let e=o;e0?"left ":"",a+=c[c.length-1].length>0?"right ":"";for(let e=1;e-1?"alignat":"align",s="split"===e.envName,i=Er(e.parser,{cols:r,addJot:!0,autoTag:s?void 0:Or(e.envName),emptySingleRow:!0,colSeparationType:o,maxNumCols:s?2:void 0,leqno:e.parser.settings.leqno},"display");let a,l=0;const h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){let e="";for(let r=0;r0&&c&&(n=1),r[e]={type:"align",align:t,pregap:n,postgap:0}}return i.colSeparationType=c?"align":"alignat",i};Br({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){const r=(Ot(t[0])?[t[0]]:Rt(t[0],"ordgroup").body).map((function(e){const t=Ht(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),o={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Er(e.parser,o,Lr(e.envName))},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){const t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")];let r="c";const o={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){const t=e.parser;if(t.consumeSpaces(),"["===t.fetch().text){if(t.consume(),t.consumeSpaces(),r=t.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",t.nextToken);t.consume(),t.consumeSpaces(),t.expect("]"),t.consume(),o.cols=[{type:"align",align:r}]}}const s=Er(e.parser,o,Lr(e.envName)),i=Math.max(0,...s.body.map((e=>e.length)));return s.cols=new Array(i).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[s],left:t[0],right:t[1],rightColor:void 0}:s},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){const t=Er(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){const r=(Ot(t[0])?[t[0]]:Rt(t[0],"ordgroup").body).map((function(e){const t=Ht(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");let o={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if(o=Er(e.parser,o,"script"),o.body.length>0&&o.body[0].length>1)throw new n("{subarray} can contain only one column");return o},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){const t=Er(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Lr(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Fr,htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){l.contains(["gather","gather*"],e.envName)&&Hr(e);const t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Or(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Er(e.parser,t,"display")},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Fr,htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){Hr(e);const t={autoTag:Or(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Er(e.parser,t,"display")},htmlBuilder:Dr,mathmlBuilder:Pr}),Br({type:"array",names:["CD"],props:{numArgs:0},handler(e){return Hr(e),function(e){const t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();const r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}let r=[];const o=[r];for(let a=0;a-1);else{if(!("<>AV".indexOf(o)>-1))throw new n('Expected one of "<>AV=|." after @',l[t]);for(let e=0;e<2;e++){let r=!0;for(let h=t+1;h{const r=e.font,n=t.withFont(r);return ct(e.body,n)},Yr=(e,t)=>{const r=e.font,n=t.withFont(r);return St(e.body,n)},Xr={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};$e({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=Ke(t[0]);let s=n;return s in Xr&&(s=Xr[s]),{type:"font",mode:r.mode,font:s.slice(1),body:o}},htmlBuilder:Ur,mathmlBuilder:Yr}),$e({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{let{parser:r}=e;const n=t[0],o=l.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:Ut(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:o}}}),$e({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n,breakOnTokenText:o}=e;const{mode:s}=r,i=r.parseExpression(!0,o);return{type:"font",mode:s,font:"math"+n.slice(1),body:{type:"ordgroup",mode:r.mode,body:i}}},htmlBuilder:Ur,mathmlBuilder:Yr});const Wr=(e,t)=>{let r=t;return"display"===e?r=r.id>=w.SCRIPT.id?r.text():w.DISPLAY:"text"===e&&r.size===w.DISPLAY.size?r=w.TEXT:"script"===e?r=w.SCRIPT:"scriptscript"===e&&(r=w.SCRIPTSCRIPT),r},_r=(e,t)=>{const r=Wr(e.size,t.style),n=r.fracNum(),o=r.fracDen();let s;s=t.havingStyle(n);const i=ct(e.numer,s,t);if(e.continued){const e=8.5/t.fontMetrics().ptPerEm,r=3.5/t.fontMetrics().ptPerEm;i.height=i.height0?3*c:7*c,u=t.fontMetrics().denom1):(h>0?(m=t.fontMetrics().num2,p=c):(m=t.fontMetrics().num3,p=3*c),u=t.fontMetrics().denom2),l){const e=t.fontMetrics().axisHeight;m-i.depth-(e+.5*h){let r=new ft.MathNode("mfrac",[St(e.numer,t),St(e.denom,t)]);if(e.hasBarLine){if(e.barSize){const n=P(e.barSize,t);r.setAttribute("linethickness",F(n))}}else r.setAttribute("linethickness","0px");const n=Wr(e.size,t.style);if(n.size!==t.style.size){r=new ft.MathNode("mstyle",[r]);const e=n.size===w.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",e),r.setAttribute("scriptlevel","0")}if(null!=e.leftDelim||null!=e.rightDelim){const t=[];if(null!=e.leftDelim){const r=new ft.MathNode("mo",[new ft.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(r),null!=e.rightDelim){const r=new ft.MathNode("mo",[new ft.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}return yt(t)}return r};$e({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];let i,a=null,l=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":i=!0;break;case"\\\\atopfrac":i=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":i=!1,a="(",l=")";break;case"\\\\bracefrac":i=!1,a="\\{",l="\\}";break;case"\\\\brackfrac":i=!1,a="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:r.mode,continued:!1,numer:o,denom:s,hasBarLine:i,leftDelim:a,rightDelim:l,size:h,barSize:null}},htmlBuilder:_r,mathmlBuilder:jr}),$e({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=t[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:o,denom:s,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),$e({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){let t,{parser:r,funcName:n,token:o}=e;switch(n){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:o}}});const $r=["display","text","script","scriptscript"],Zr=function(e){let t=null;return e.length>0&&(t=e,t="."===t?null:t),t};$e({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){let{parser:r}=e;const n=t[4],o=t[5],s=Ke(t[0]),i="atom"===s.type&&"open"===s.family?Zr(s.text):null,a=Ke(t[1]),l="atom"===a.type&&"close"===a.family?Zr(a.text):null,h=Rt(t[2],"size");let c,m=null;h.isBlank?c=!0:(m=h.value,c=m.number>0);let p="auto",u=t[3];if("ordgroup"===u.type){if(u.body.length>0){const e=Rt(u.body[0],"textord");p=$r[Number(e.text)]}}else u=Rt(u,"textord"),p=$r[Number(u.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:o,continued:!1,hasBarLine:c,barSize:m,leftDelim:i,rightDelim:l,size:p}},htmlBuilder:_r,mathmlBuilder:jr}),$e({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){let{parser:r,funcName:n,token:o}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Rt(t[0],"size").value,token:o}}}),$e({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0],s=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Rt(t[1],"infix").size),i=t[2],a=s.number>0;return{type:"genfrac",mode:r.mode,numer:o,denom:i,continued:!1,hasBarLine:a,barSize:s,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:_r,mathmlBuilder:jr});const Kr=(e,t)=>{const r=t.style;let n,o;"supsub"===e.type?(n=e.sup?ct(e.sup,t.havingStyle(r.sup()),t):ct(e.sub,t.havingStyle(r.sub()),t),o=Rt(e.base,"horizBrace")):o=Rt(e,"horizBrace");const s=ct(o.base,t.havingBaseStyle(w.DISPLAY)),i=It(o,t);let a;if(o.isOver?(a=Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:i}]},t),a.children[0].children[0].children[1].classes.push("svg-align")):(a=Pe.makeVList({positionType:"bottom",positionData:s.depth+.1+i.height,children:[{type:"elem",elem:i},{type:"kern",size:.1},{type:"elem",elem:s}]},t),a.children[0].children[0].children[0].classes.push("svg-align")),n){const e=Pe.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t);a=o.isOver?Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:e},{type:"kern",size:.2},{type:"elem",elem:n}]},t):Pe.makeVList({positionType:"bottom",positionData:e.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:e}]},t)}return Pe.makeSpan(["mord",o.isOver?"mover":"munder"],[a],t)};$e({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){let{parser:r,funcName:n}=e;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:Kr,mathmlBuilder:(e,t)=>{const r=qt(e.label);return new ft.MathNode(e.isOver?"mover":"munder",[St(e.base,t),r])}}),$e({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[1],o=Rt(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:o})?{type:"href",mode:r.mode,href:o,body:Je(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{const r=ot(e.body,t,!1);return Pe.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{let r=kt(e.body,t);return r instanceof dt||(r=new dt("mrow",[r])),r.setAttribute("href",e.href),r}}),$e({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=Rt(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");const o=[];for(let e=0;e{let{parser:r,funcName:o,token:s}=e;const i=Rt(t[0],"raw").string,a=t[1];let l;r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");const h={};switch(o){case"\\htmlClass":h.class=i,l={command:"\\htmlClass",class:i};break;case"\\htmlId":h.id=i,l={command:"\\htmlId",id:i};break;case"\\htmlStyle":h.style=i,l={command:"\\htmlStyle",style:i};break;case"\\htmlData":{const e=i.split(",");for(let t=0;t{const r=ot(e.body,t,!1),n=["enclosing"];e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/));const o=Pe.makeSpan(n,r,t);for(const t in e.attributes)"class"!==t&&e.attributes.hasOwnProperty(t)&&o.setAttribute(t,e.attributes[t]);return o},mathmlBuilder:(e,t)=>kt(e.body,t)}),$e({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:Je(t[0]),mathml:Je(t[1])}},htmlBuilder:(e,t)=>{const r=ot(e.html,t,!1);return Pe.makeFragment(r)},mathmlBuilder:(e,t)=>kt(e.mathml,t)});const Jr=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};{const t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new n("Invalid size: '"+e+"' in \\includegraphics");const r={number:+(t[1]+t[2]),unit:t[3]};if(!V(r))throw new n("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r}};$e({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{let{parser:o}=e,s={number:0,unit:"em"},i={number:.9,unit:"em"},a={number:0,unit:"em"},l="";if(r[0]){const e=Rt(r[0],"raw").string.split(",");for(let t=0;t{const r=P(e.height,t);let n=0;e.totalheight.number>0&&(n=P(e.totalheight,t)-r);let o=0;e.width.number>0&&(o=P(e.width,t));const s={height:F(r+n)};o>0&&(s.width=F(o)),n>0&&(s.verticalAlign=F(-n));const i=new $(e.src,e.alt,s);return i.height=r,i.depth=n,i},mathmlBuilder:(e,t)=>{const r=new ft.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);const n=P(e.height,t);let o=0;if(e.totalheight.number>0&&(o=P(e.totalheight,t)-n,r.setAttribute("valign",F(-o))),r.setAttribute("height",F(n+o)),e.width.number>0){const n=P(e.width,t);r.setAttribute("width",F(n))}return r.setAttribute("src",e.src),r}}),$e({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=Rt(t[0],"size");if(r.settings.strict){const e="m"===n[1],t="mu"===o.value.unit;e?(t||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+o.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):t&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:o.value}},htmlBuilder(e,t){return Pe.makeGlue(e.dimension,t)},mathmlBuilder(e,t){const r=P(e.dimension,t);return new ft.SpaceNode(r)}}),$e({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r,funcName:n}=e;const o=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:o}},htmlBuilder:(e,t)=>{let r;"clap"===e.alignment?(r=Pe.makeSpan([],[ct(e.body,t)]),r=Pe.makeSpan(["inner"],[r],t)):r=Pe.makeSpan(["inner"],[ct(e.body,t)]);const n=Pe.makeSpan(["fix"],[]);let o=Pe.makeSpan([e.alignment],[r,n],t);const s=Pe.makeSpan(["strut"]);return s.style.height=F(o.height+o.depth),o.depth&&(s.style.verticalAlign=F(-o.depth)),o.children.unshift(s),o=Pe.makeSpan(["thinbox"],[o],t),Pe.makeSpan(["mord","vbox"],[o],t)},mathmlBuilder:(e,t)=>{const r=new ft.MathNode("mpadded",[St(e.body,t)]);if("rlap"!==e.alignment){const t="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",t+"width")}return r.setAttribute("width","0px"),r}}),$e({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){let{funcName:r,parser:n}=e;const o=n.mode;n.switchMode("math");const s="\\("===r?"\\)":"$",i=n.parseExpression(!1,s);return n.expect(s),n.switchMode(o),{type:"styling",mode:n.mode,style:"text",body:i}}}),$e({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new n("Mismatched "+e.funcName)}});const Qr=(e,t)=>{switch(t.style.size){case w.DISPLAY.size:return e.display;case w.TEXT.size:return e.text;case w.SCRIPT.size:return e.script;case w.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};$e({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{let{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:Je(t[0]),text:Je(t[1]),script:Je(t[2]),scriptscript:Je(t[3])}},htmlBuilder:(e,t)=>{const r=Qr(e,t),n=ot(r,t,!1);return Pe.makeFragment(n)},mathmlBuilder:(e,t)=>{const r=Qr(e,t);return kt(r,t)}});const en=(e,t,r,n,o,s,i)=>{e=Pe.makeSpan([],[e]);const a=r&&l.isCharacterBox(r);let h,c,m;if(t){const e=ct(t,n.havingStyle(o.sup()),n);c={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-e.depth)}}if(r){const e=ct(r,n.havingStyle(o.sub()),n);h={elem:e,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-e.height)}}if(c&&h){const t=n.fontMetrics().bigOpSpacing5+h.elem.height+h.elem.depth+h.kern+e.depth+i;m=Pe.makeVList({positionType:"bottom",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(h){const t=e.height-i;m=Pe.makeVList({positionType:"top",positionData:t,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:h.elem,marginLeft:F(-s)},{type:"kern",size:h.kern},{type:"elem",elem:e}]},n)}else{if(!c)return e;{const t=e.depth+i;m=Pe.makeVList({positionType:"bottom",positionData:t,children:[{type:"elem",elem:e},{type:"kern",size:c.kern},{type:"elem",elem:c.elem,marginLeft:F(s)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}}const p=[m];if(h&&0!==s&&!a){const e=Pe.makeSpan(["mspace"],[],n);e.style.marginRight=F(s),p.unshift(e)}return Pe.makeSpan(["mop","op-limits"],p,n)},tn=["\\smallint"],rn=(e,t)=>{let r,n,o,s=!1;"supsub"===e.type?(r=e.sup,n=e.sub,o=Rt(e.base,"op"),s=!0):o=Rt(e,"op");const i=t.style;let a,h=!1;if(i.size===w.DISPLAY.size&&o.symbol&&!l.contains(tn,o.name)&&(h=!0),o.symbol){const e=h?"Size2-Regular":"Size1-Regular";let r="";if("\\oiint"!==o.name&&"\\oiiint"!==o.name||(r=o.name.slice(1),o.name="oiint"===r?"\\iint":"\\iiint"),a=Pe.makeSymbol(o.name,e,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),r.length>0){const e=a.italic,n=Pe.staticSvg(r+"Size"+(h?"2":"1"),t);a=Pe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:n,shift:h?.08:0}]},t),o.name="\\"+r,a.classes.unshift("mop"),a.italic=e}}else if(o.body){const e=ot(o.body,t,!0);1===e.length&&e[0]instanceof K?(a=e[0],a.classes[0]="mop"):a=Pe.makeSpan(["mop"],e,t)}else{const e=[];for(let r=1;r{let r;if(e.symbol)r=new dt("mo",[bt(e.name,e.mode)]),l.contains(tn,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new dt("mo",vt(e.body,t));else{r=new dt("mi",[new gt(e.name.slice(1))]);const t=new dt("mo",[bt("\u2061","text")]);r=e.parentIsSupSub?new dt("mrow",[r,t]):ut([r,t])}return r},on={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};$e({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:(e,t)=>{let{parser:r,funcName:n}=e,o=n;return 1===o.length&&(o=on[o]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:o}},htmlBuilder:rn,mathmlBuilder:nn}),$e({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:Je(n)}},htmlBuilder:rn,mathmlBuilder:nn});const sn={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};$e({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:rn,mathmlBuilder:nn}),$e({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:rn,mathmlBuilder:nn}),$e({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler(e){let{parser:t,funcName:r}=e,n=r;return 1===n.length&&(n=sn[n]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:rn,mathmlBuilder:nn});const an=(e,t)=>{let r,n,o,s,i=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,o=Rt(e.base,"operatorname"),i=!0):o=Rt(e,"operatorname"),o.body.length>0){const e=o.body.map((e=>{const t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),r=ot(e,t.withFont("mathrm"),!0);for(let e=0;e{let{parser:r,funcName:n}=e;const o=t[0];return{type:"operatorname",mode:r.mode,body:Je(o),alwaysHandleSupSub:"\\operatornamewithlimits"===n,limits:!1,parentIsSupSub:!1}},htmlBuilder:an,mathmlBuilder:(e,t)=>{let r=vt(e.body,t.withFont("mathrm")),n=!0;for(let e=0;ee.toText())).join("");r=[new ft.TextNode(e)]}const o=new ft.MathNode("mi",r);o.setAttribute("mathvariant","normal");const s=new ft.MathNode("mo",[bt("\u2061","text")]);return e.parentIsSupSub?new ft.MathNode("mrow",[o,s]):ft.newDocumentFragment([o,s])}}),Nr("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),Ze({type:"ordgroup",htmlBuilder(e,t){return e.semisimple?Pe.makeFragment(ot(e.body,t,!1)):Pe.makeSpan(["mord"],ot(e.body,t,!0),t)},mathmlBuilder(e,t){return kt(e.body,t,!0)}}),$e({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){let{parser:r}=e;const n=t[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(e,t){const r=ct(e.body,t.havingCrampedStyle()),n=Pe.makeLineSpan("overline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*o},{type:"elem",elem:n},{type:"kern",size:o}]},t);return Pe.makeSpan(["mord","overline"],[s],t)},mathmlBuilder(e,t){const r=new ft.MathNode("mo",[new ft.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new ft.MathNode("mover",[St(e.body,t),r]);return n.setAttribute("accent","true"),n}}),$e({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"phantom",mode:r.mode,body:Je(n)}},htmlBuilder:(e,t)=>{const r=ot(e.body,t.withPhantom(),!1);return Pe.makeFragment(r)},mathmlBuilder:(e,t)=>{const r=vt(e.body,t);return new ft.MathNode("mphantom",r)}}),$e({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"hphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{let r=Pe.makeSpan([],[ct(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(let e=0;e{const r=vt(Je(e.body),t),n=new ft.MathNode("mphantom",r),o=new ft.MathNode("mpadded",[n]);return o.setAttribute("height","0px"),o.setAttribute("depth","0px"),o}}),$e({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{let{parser:r}=e;const n=t[0];return{type:"vphantom",mode:r.mode,body:n}},htmlBuilder:(e,t)=>{const r=Pe.makeSpan(["inner"],[ct(e.body,t.withPhantom())]),n=Pe.makeSpan(["fix"],[]);return Pe.makeSpan(["mord","rlap"],[r,n],t)},mathmlBuilder:(e,t)=>{const r=vt(Je(e.body),t),n=new ft.MathNode("mphantom",r),o=new ft.MathNode("mpadded",[n]);return o.setAttribute("width","0px"),o}}),$e({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){let{parser:r}=e;const n=Rt(t[0],"size").value,o=t[1];return{type:"raisebox",mode:r.mode,dy:n,body:o}},htmlBuilder(e,t){const r=ct(e.body,t),n=P(e.dy,t);return Pe.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){const r=new ft.MathNode("mpadded",[St(e.body,t)]),n=e.dy.number+e.dy.unit;return r.setAttribute("voffset",n),r}}),$e({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(e){let{parser:t}=e;return{type:"internal",mode:t.mode}}}),$e({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){let{parser:n}=e;const o=r[0],s=Rt(t[0],"size"),i=Rt(t[1],"size");return{type:"rule",mode:n.mode,shift:o&&Rt(o,"size").value,width:s.value,height:i.value}},htmlBuilder(e,t){const r=Pe.makeSpan(["mord","rule"],[],t),n=P(e.width,t),o=P(e.height,t),s=e.shift?P(e.shift,t):0;return r.style.borderRightWidth=F(n),r.style.borderTopWidth=F(o),r.style.bottom=F(s),r.width=n,r.height=o+s,r.depth=-s,r.maxFontSize=1.125*o*t.sizeMultiplier,r},mathmlBuilder(e,t){const r=P(e.width,t),n=P(e.height,t),o=e.shift?P(e.shift,t):0,s=t.color&&t.getColor()||"black",i=new ft.MathNode("mspace");i.setAttribute("mathbackground",s),i.setAttribute("width",F(r)),i.setAttribute("height",F(n));const a=new ft.MathNode("mpadded",[i]);return o>=0?a.setAttribute("height",F(o)):(a.setAttribute("height",F(o)),a.setAttribute("depth",F(-o))),a.setAttribute("voffset",F(o)),a}});const hn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];$e({type:"sizing",names:hn,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!1,r);return{type:"sizing",mode:o.mode,size:hn.indexOf(n)+1,body:s}},htmlBuilder:(e,t)=>{const r=t.havingSize(e.size);return ln(e.body,r,t)},mathmlBuilder:(e,t)=>{const r=t.havingSize(e.size),n=vt(e.body,r),o=new ft.MathNode("mstyle",n);return o.setAttribute("mathsize",F(r.sizeMultiplier)),o}}),$e({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{let{parser:n}=e,o=!1,s=!1;const i=r[0]&&Rt(r[0],"ordgroup");if(i){let e="";for(let t=0;t{const r=Pe.makeSpan([],[ct(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(let e=0;e{const r=new ft.MathNode("mpadded",[St(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),$e({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){let{parser:n}=e;const o=r[0],s=t[0];return{type:"sqrt",mode:n.mode,body:s,index:o}},htmlBuilder(e,t){let r=ct(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=Pe.wrapFragment(r,t);const n=t.fontMetrics().defaultRuleThickness;let o=n;t.style.idr.height+r.depth+s&&(s=(s+c-r.height-r.depth)/2);const m=a.height-r.height-s-l;r.style.paddingLeft=F(h);const p=Pe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+m)},{type:"elem",elem:a},{type:"kern",size:l}]},t);if(e.index){const r=t.havingStyle(w.SCRIPTSCRIPT),n=ct(e.index,r,t),o=.6*(p.height-p.depth),s=Pe.makeVList({positionType:"shift",positionData:-o,children:[{type:"elem",elem:n}]},t),i=Pe.makeSpan(["root"],[s]);return Pe.makeSpan(["mord","sqrt"],[i,p],t)}return Pe.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){const{body:r,index:n}=e;return n?new ft.MathNode("mroot",[St(r,t),St(n,t)]):new ft.MathNode("msqrt",[St(r,t)])}});const cn={display:w.DISPLAY,text:w.TEXT,script:w.SCRIPT,scriptscript:w.SCRIPTSCRIPT};$e({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){let{breakOnTokenText:r,funcName:n,parser:o}=e;const s=o.parseExpression(!0,r),i=n.slice(1,n.length-5);return{type:"styling",mode:o.mode,style:i,body:s}},htmlBuilder(e,t){const r=cn[e.style],n=t.havingStyle(r).withFont("");return ln(e.body,n,t)},mathmlBuilder(e,t){const r=cn[e.style],n=t.havingStyle(r),o=vt(e.body,n),s=new ft.MathNode("mstyle",o),i={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return s.setAttribute("scriptlevel",i[0]),s.setAttribute("displaystyle",i[1]),s}});Ze({type:"supsub",htmlBuilder(e,t){const r=function(e,t){const r=e.base;if(r)return"op"===r.type?r.limits&&(t.style.size===w.DISPLAY.size||r.alwaysHandleSupSub)?rn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===w.DISPLAY.size||r.limits)?an:null:"accent"===r.type?l.isCharacterBox(r.base)?Et:null:"horizBrace"===r.type&&!e.sub===r.isOver?Kr:null;return null}(e,t);if(r)return r(e,t);const{base:n,sup:o,sub:s}=e,i=ct(n,t);let a,h;const c=t.fontMetrics();let m=0,p=0;const u=n&&l.isCharacterBox(n);if(o){const e=t.havingStyle(t.style.sup());a=ct(o,e,t),u||(m=i.height-e.fontMetrics().supDrop*e.sizeMultiplier/t.sizeMultiplier)}if(s){const e=t.havingStyle(t.style.sub());h=ct(s,e,t),u||(p=i.depth+e.fontMetrics().subDrop*e.sizeMultiplier/t.sizeMultiplier)}let d;d=t.style===w.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;const g=t.sizeMultiplier,f=F(.5/c.ptPerEm/g);let b,y=null;if(h){const t=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(i instanceof K||t)&&(y=F(-i.italic))}if(a&&h){m=Math.max(m,d,a.depth+.25*c.xHeight),p=Math.max(p,c.sub2);const e=4*c.defaultRuleThickness;if(m-a.depth-(h.height-p)0&&(m+=t,p-=t)}const r=[{type:"elem",elem:h,shift:p,marginRight:f,marginLeft:y},{type:"elem",elem:a,shift:-m,marginRight:f}];b=Pe.makeVList({positionType:"individualShift",children:r},t)}else if(h){p=Math.max(p,c.sub1,h.height-.8*c.xHeight);const e=[{type:"elem",elem:h,marginLeft:y,marginRight:f}];b=Pe.makeVList({positionType:"shift",positionData:p,children:e},t)}else{if(!a)throw new Error("supsub must have either sup or sub.");m=Math.max(m,d,a.depth+.25*c.xHeight),b=Pe.makeVList({positionType:"shift",positionData:-m,children:[{type:"elem",elem:a,marginRight:f}]},t)}const x=lt(i,"right")||"mord";return Pe.makeSpan([x],[i,Pe.makeSpan(["msupsub"],[b])],t)},mathmlBuilder(e,t){let r,n,o=!1;e.base&&"horizBrace"===e.base.type&&(n=!!e.sup,n===e.base.isOver&&(o=!0,r=e.base.isOver)),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);const s=[St(e.base,t)];let i;if(e.sub&&s.push(St(e.sub,t)),e.sup&&s.push(St(e.sup,t)),o)i=r?"mover":"munder";else if(e.sub)if(e.sup){const r=e.base;i=r&&"op"===r.type&&r.limits&&t.style===w.DISPLAY||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(t.style===w.DISPLAY||r.limits)?"munderover":"msubsup"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"munder":"msub"}else{const r=e.base;i=r&&"op"===r.type&&r.limits&&(t.style===w.DISPLAY||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.style===w.DISPLAY)?"mover":"msup"}return new ft.MathNode(i,s)}}),Ze({type:"atom",htmlBuilder(e,t){return Pe.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder(e,t){const r=new ft.MathNode("mo",[bt(e.text,e.mode)]);if("bin"===e.family){const n=xt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});const mn={mi:"italic",mn:"normal",mtext:"normal"};Ze({type:"mathord",htmlBuilder(e,t){return Pe.makeOrd(e,t,"mathord")},mathmlBuilder(e,t){const r=new ft.MathNode("mi",[bt(e.text,e.mode,t)]),n=xt(e,t)||"italic";return n!==mn[r.type]&&r.setAttribute("mathvariant",n),r}}),Ze({type:"textord",htmlBuilder(e,t){return Pe.makeOrd(e,t,"textord")},mathmlBuilder(e,t){const r=bt(e.text,e.mode,t),n=xt(e,t)||"normal";let o;return o="text"===e.mode?new ft.MathNode("mtext",[r]):/[0-9]/.test(e.text)?new ft.MathNode("mn",[r]):"\\prime"===e.text?new ft.MathNode("mo",[r]):new ft.MathNode("mi",[r]),n!==mn[o.type]&&o.setAttribute("mathvariant",n),o}});const pn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},un={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};Ze({type:"spacing",htmlBuilder(e,t){if(un.hasOwnProperty(e.text)){const r=un[e.text].className||"";if("text"===e.mode){const n=Pe.makeOrd(e,t,"textord");return n.classes.push(r),n}return Pe.makeSpan(["mspace",r],[Pe.mathsym(e.text,e.mode,t)],t)}if(pn.hasOwnProperty(e.text))return Pe.makeSpan(["mspace",pn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder(e,t){let r;if(!un.hasOwnProperty(e.text)){if(pn.hasOwnProperty(e.text))return new ft.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return r=new ft.MathNode("mtext",[new ft.TextNode("\xa0")]),r}});const dn=()=>{const e=new ft.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};Ze({type:"tag",mathmlBuilder(e,t){const r=new ft.MathNode("mtable",[new ft.MathNode("mtr",[dn(),new ft.MathNode("mtd",[kt(e.body,t)]),dn(),new ft.MathNode("mtd",[kt(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});const gn={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},fn={"\\textbf":"textbf","\\textmd":"textmd"},bn={"\\textit":"textit","\\textup":"textup"},yn=(e,t)=>{const r=e.font;return r?gn[r]?t.withTextFontFamily(gn[r]):fn[r]?t.withTextFontWeight(fn[r]):"\\emph"===r?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(bn[r]):t};$e({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){let{parser:r,funcName:n}=e;const o=t[0];return{type:"text",mode:r.mode,body:Je(o),font:n}},htmlBuilder(e,t){const r=yn(e,t),n=ot(e.body,r,!0);return Pe.makeSpan(["mord","text"],n,r)},mathmlBuilder(e,t){const r=yn(e,t);return kt(e.body,r)}}),$e({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){let{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ct(e.body,t),n=Pe.makeLineSpan("underline-line",t),o=t.fontMetrics().defaultRuleThickness,s=Pe.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:o},{type:"elem",elem:n},{type:"kern",size:3*o},{type:"elem",elem:r}]},t);return Pe.makeSpan(["mord","underline"],[s],t)},mathmlBuilder(e,t){const r=new ft.MathNode("mo",[new ft.TextNode("\u203e")]);r.setAttribute("stretchy","true");const n=new ft.MathNode("munder",[St(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),$e({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){let{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){const r=ct(e.body,t),n=t.fontMetrics().axisHeight,o=.5*(r.height-n-(r.depth+n));return Pe.makeVList({positionType:"shift",positionData:o,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){return new ft.MathNode("mpadded",[St(e.body,t)],["vcenter"])}}),$e({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){const r=xn(e),n=[],o=t.havingStyle(t.style.text());for(let t=0;te.body.replace(/ /g,e.star?"\u2423":"\xa0");var wn=We;const vn="[ \r\n\t]",kn="(\\\\[a-zA-Z@]+)"+vn+"*",Sn="[\u0300-\u036f]",Mn=new RegExp(Sn+"+$"),zn="("+vn+"+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+Sn+"*|[\ud800-\udbff][\udc00-\udfff]"+Sn+"*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|"+kn+"|\\\\[^\ud800-\udfff])";class An{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(zn,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new Ir("EOF",new qr(this,t,t));const r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new n("Unexpected character: '"+e[t]+"'",new Ir(e[t],new qr(this,t,t+1)));const o=r[6]||r[3]||(r[2]?"\\ ":" ");if(14===this.catcodes[o]){const t=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===t?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=t+1,this.lex()}return new Ir(o,new qr(this,t,this.tokenRegex.lastIndex))}}class Tn{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new n("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");const e=this.undefStack.pop();for(const t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,r){if(void 0===r&&(r=!1),r){for(let t=0;t0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{const t=this.undefStack[this.undefStack.length-1];t&&!t.hasOwnProperty(e)&&(t[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t}}var Bn=Cr;Nr("\\noexpand",(function(e){const t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Nr("\\expandafter",(function(e){const t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Nr("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Nr("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Nr("\\@ifnextchar",(function(e){const t=e.consumeArgs(3);e.consumeSpaces();const r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Nr("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Nr("\\TextOrMath",(function(e){const t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));const Cn={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Nr("\\char",(function(e){let t,r=e.popToken(),o="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if(r=e.popToken(),"\\"===r.text[0])o=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new n("\\char` missing argument");o=r.text.charCodeAt(0)}else t=10;if(t){if(o=Cn[r.text],null==o||o>=t)throw new n("Invalid base-"+t+" digit "+r.text);let s;for(;null!=(s=Cn[e.future().text])&&s{let s=e.consumeArg().tokens;if(1!==s.length)throw new n("\\newcommand's first argument must be a macro name");const i=s[0].text,a=e.isDefined(i);if(a&&!t)throw new n("\\newcommand{"+i+"} attempting to redefine "+i+"; use \\renewcommand");if(!a&&!r)throw new n("\\renewcommand{"+i+"} when command "+i+" does not yet exist; use \\newcommand");let l=0;if(s=e.consumeArg().tokens,1===s.length&&"["===s[0].text){let t="",r=e.expandNextToken();for(;"]"!==r.text&&"EOF"!==r.text;)t+=r.text,r=e.expandNextToken();if(!t.match(/^\s*[0-9]+\s*$/))throw new n("Invalid number of arguments: "+t);l=parseInt(t),s=e.consumeArg().tokens}return a&&o||e.macros.set(i,{tokens:s,numArgs:l}),""};Nr("\\newcommand",(e=>Nn(e,!1,!0,!1))),Nr("\\renewcommand",(e=>Nn(e,!0,!1,!1))),Nr("\\providecommand",(e=>Nn(e,!0,!0,!0))),Nr("\\message",(e=>{const t=e.consumeArgs(1)[0];return console.log(t.reverse().map((e=>e.text)).join("")),""})),Nr("\\errmessage",(e=>{const t=e.consumeArgs(1)[0];return console.error(t.reverse().map((e=>e.text)).join("")),""})),Nr("\\show",(e=>{const t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),wn[r],se.math[r],se.text[r]),""})),Nr("\\bgroup","{"),Nr("\\egroup","}"),Nr("~","\\nobreakspace"),Nr("\\lq","`"),Nr("\\rq","'"),Nr("\\aa","\\r a"),Nr("\\AA","\\r A"),Nr("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),Nr("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Nr("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),Nr("\u212c","\\mathscr{B}"),Nr("\u2130","\\mathscr{E}"),Nr("\u2131","\\mathscr{F}"),Nr("\u210b","\\mathscr{H}"),Nr("\u2110","\\mathscr{I}"),Nr("\u2112","\\mathscr{L}"),Nr("\u2133","\\mathscr{M}"),Nr("\u211b","\\mathscr{R}"),Nr("\u212d","\\mathfrak{C}"),Nr("\u210c","\\mathfrak{H}"),Nr("\u2128","\\mathfrak{Z}"),Nr("\\Bbbk","\\Bbb{k}"),Nr("\xb7","\\cdotp"),Nr("\\llap","\\mathllap{\\textrm{#1}}"),Nr("\\rlap","\\mathrlap{\\textrm{#1}}"),Nr("\\clap","\\mathclap{\\textrm{#1}}"),Nr("\\mathstrut","\\vphantom{(}"),Nr("\\underbar","\\underline{\\text{#1}}"),Nr("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Nr("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),Nr("\\ne","\\neq"),Nr("\u2260","\\neq"),Nr("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),Nr("\u2209","\\notin"),Nr("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),Nr("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),Nr("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),Nr("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),Nr("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),Nr("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),Nr("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),Nr("\u27c2","\\perp"),Nr("\u203c","\\mathclose{!\\mkern-0.8mu!}"),Nr("\u220c","\\notni"),Nr("\u231c","\\ulcorner"),Nr("\u231d","\\urcorner"),Nr("\u231e","\\llcorner"),Nr("\u231f","\\lrcorner"),Nr("\xa9","\\copyright"),Nr("\xae","\\textregistered"),Nr("\ufe0f","\\textregistered"),Nr("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Nr("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Nr("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Nr("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Nr("\\vdots","{\\varvdots\\rule{0pt}{15pt}}"),Nr("\u22ee","\\vdots"),Nr("\\varGamma","\\mathit{\\Gamma}"),Nr("\\varDelta","\\mathit{\\Delta}"),Nr("\\varTheta","\\mathit{\\Theta}"),Nr("\\varLambda","\\mathit{\\Lambda}"),Nr("\\varXi","\\mathit{\\Xi}"),Nr("\\varPi","\\mathit{\\Pi}"),Nr("\\varSigma","\\mathit{\\Sigma}"),Nr("\\varUpsilon","\\mathit{\\Upsilon}"),Nr("\\varPhi","\\mathit{\\Phi}"),Nr("\\varPsi","\\mathit{\\Psi}"),Nr("\\varOmega","\\mathit{\\Omega}"),Nr("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Nr("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Nr("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Nr("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Nr("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Nr("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),Nr("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}"),Nr("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");const qn={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Nr("\\dots",(function(e){let t="\\dotso";const r=e.expandAfterFuture().text;return r in qn?t=qn[r]:("\\not"===r.slice(0,4)||r in se.math&&l.contains(["bin","rel"],se.math[r].group))&&(t="\\dotsb"),t}));const In={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Nr("\\dotso",(function(e){return e.future().text in In?"\\ldots\\,":"\\ldots"})),Nr("\\dotsc",(function(e){const t=e.future().text;return t in In&&","!==t?"\\ldots\\,":"\\ldots"})),Nr("\\cdots",(function(e){return e.future().text in In?"\\@cdots\\,":"\\@cdots"})),Nr("\\dotsb","\\cdots"),Nr("\\dotsm","\\cdots"),Nr("\\dotsi","\\!\\cdots"),Nr("\\dotsx","\\ldots\\,"),Nr("\\DOTSI","\\relax"),Nr("\\DOTSB","\\relax"),Nr("\\DOTSX","\\relax"),Nr("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Nr("\\,","\\tmspace+{3mu}{.1667em}"),Nr("\\thinspace","\\,"),Nr("\\>","\\mskip{4mu}"),Nr("\\:","\\tmspace+{4mu}{.2222em}"),Nr("\\medspace","\\:"),Nr("\\;","\\tmspace+{5mu}{.2777em}"),Nr("\\thickspace","\\;"),Nr("\\!","\\tmspace-{3mu}{.1667em}"),Nr("\\negthinspace","\\!"),Nr("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Nr("\\negthickspace","\\tmspace-{5mu}{.277em}"),Nr("\\enspace","\\kern.5em "),Nr("\\enskip","\\hskip.5em\\relax"),Nr("\\quad","\\hskip1em\\relax"),Nr("\\qquad","\\hskip2em\\relax"),Nr("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Nr("\\tag@paren","\\tag@literal{({#1})}"),Nr("\\tag@literal",(e=>{if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Nr("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Nr("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Nr("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Nr("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Nr("\\newline","\\\\\\relax"),Nr("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");const Rn=F(T["Main-Regular"]["T".charCodeAt(0)][1]-.7*T["Main-Regular"]["A".charCodeAt(0)][1]);Nr("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Rn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Nr("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Rn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Nr("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Nr("\\@hspace","\\hskip #1\\relax"),Nr("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Nr("\\ordinarycolon",":"),Nr("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Nr("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Nr("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Nr("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Nr("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Nr("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Nr("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Nr("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Nr("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Nr("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Nr("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Nr("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Nr("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Nr("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Nr("\u2237","\\dblcolon"),Nr("\u2239","\\eqcolon"),Nr("\u2254","\\coloneqq"),Nr("\u2255","\\eqqcolon"),Nr("\u2a74","\\Coloneqq"),Nr("\\ratio","\\vcentcolon"),Nr("\\coloncolon","\\dblcolon"),Nr("\\colonequals","\\coloneqq"),Nr("\\coloncolonequals","\\Coloneqq"),Nr("\\equalscolon","\\eqqcolon"),Nr("\\equalscoloncolon","\\Eqqcolon"),Nr("\\colonminus","\\coloneq"),Nr("\\coloncolonminus","\\Coloneq"),Nr("\\minuscolon","\\eqcolon"),Nr("\\minuscoloncolon","\\Eqcolon"),Nr("\\coloncolonapprox","\\Colonapprox"),Nr("\\coloncolonsim","\\Colonsim"),Nr("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Nr("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Nr("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Nr("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Nr("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Nr("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Nr("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Nr("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Nr("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Nr("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Nr("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Nr("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Nr("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Nr("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Nr("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Nr("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Nr("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Nr("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Nr("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Nr("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Nr("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Nr("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Nr("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Nr("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Nr("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Nr("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Nr("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Nr("\\imath","\\html@mathml{\\@imath}{\u0131}"),Nr("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Nr("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Nr("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Nr("\u27e6","\\llbracket"),Nr("\u27e7","\\rrbracket"),Nr("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Nr("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Nr("\u2983","\\lBrace"),Nr("\u2984","\\rBrace"),Nr("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Nr("\u29b5","\\minuso"),Nr("\\darr","\\downarrow"),Nr("\\dArr","\\Downarrow"),Nr("\\Darr","\\Downarrow"),Nr("\\lang","\\langle"),Nr("\\rang","\\rangle"),Nr("\\uarr","\\uparrow"),Nr("\\uArr","\\Uparrow"),Nr("\\Uarr","\\Uparrow"),Nr("\\N","\\mathbb{N}"),Nr("\\R","\\mathbb{R}"),Nr("\\Z","\\mathbb{Z}"),Nr("\\alef","\\aleph"),Nr("\\alefsym","\\aleph"),Nr("\\Alpha","\\mathrm{A}"),Nr("\\Beta","\\mathrm{B}"),Nr("\\bull","\\bullet"),Nr("\\Chi","\\mathrm{X}"),Nr("\\clubs","\\clubsuit"),Nr("\\cnums","\\mathbb{C}"),Nr("\\Complex","\\mathbb{C}"),Nr("\\Dagger","\\ddagger"),Nr("\\diamonds","\\diamondsuit"),Nr("\\empty","\\emptyset"),Nr("\\Epsilon","\\mathrm{E}"),Nr("\\Eta","\\mathrm{H}"),Nr("\\exist","\\exists"),Nr("\\harr","\\leftrightarrow"),Nr("\\hArr","\\Leftrightarrow"),Nr("\\Harr","\\Leftrightarrow"),Nr("\\hearts","\\heartsuit"),Nr("\\image","\\Im"),Nr("\\infin","\\infty"),Nr("\\Iota","\\mathrm{I}"),Nr("\\isin","\\in"),Nr("\\Kappa","\\mathrm{K}"),Nr("\\larr","\\leftarrow"),Nr("\\lArr","\\Leftarrow"),Nr("\\Larr","\\Leftarrow"),Nr("\\lrarr","\\leftrightarrow"),Nr("\\lrArr","\\Leftrightarrow"),Nr("\\Lrarr","\\Leftrightarrow"),Nr("\\Mu","\\mathrm{M}"),Nr("\\natnums","\\mathbb{N}"),Nr("\\Nu","\\mathrm{N}"),Nr("\\Omicron","\\mathrm{O}"),Nr("\\plusmn","\\pm"),Nr("\\rarr","\\rightarrow"),Nr("\\rArr","\\Rightarrow"),Nr("\\Rarr","\\Rightarrow"),Nr("\\real","\\Re"),Nr("\\reals","\\mathbb{R}"),Nr("\\Reals","\\mathbb{R}"),Nr("\\Rho","\\mathrm{P}"),Nr("\\sdot","\\cdot"),Nr("\\sect","\\S"),Nr("\\spades","\\spadesuit"),Nr("\\sub","\\subset"),Nr("\\sube","\\subseteq"),Nr("\\supe","\\supseteq"),Nr("\\Tau","\\mathrm{T}"),Nr("\\thetasym","\\vartheta"),Nr("\\weierp","\\wp"),Nr("\\Zeta","\\mathrm{Z}"),Nr("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Nr("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Nr("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Nr("\\bra","\\mathinner{\\langle{#1}|}"),Nr("\\ket","\\mathinner{|{#1}\\rangle}"),Nr("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Nr("\\Bra","\\left\\langle#1\\right|"),Nr("\\Ket","\\left|#1\\right\\rangle");const Hn=e=>t=>{const r=t.consumeArg().tokens,n=t.consumeArg().tokens,o=t.consumeArg().tokens,s=t.consumeArg().tokens,i=t.macros.get("|"),a=t.macros.get("\\|");t.macros.beginGroup();const l=t=>r=>{e&&(r.macros.set("|",i),o.length&&r.macros.set("\\|",a));let s=t;if(!t&&o.length){"|"===r.future().text&&(r.popToken(),s=!0)}return{tokens:s?o:n,numArgs:0}};t.macros.set("|",l(!1)),o.length&&t.macros.set("\\|",l(!0));const h=t.consumeArg().tokens,c=t.expandTokens([...s,...h,...r]);return t.macros.endGroup(),{tokens:c.reverse(),numArgs:0}};Nr("\\bra@ket",Hn(!1)),Nr("\\bra@set",Hn(!0)),Nr("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Nr("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Nr("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Nr("\\angln","{\\angl n}"),Nr("\\blue","\\textcolor{##6495ed}{#1}"),Nr("\\orange","\\textcolor{##ffa500}{#1}"),Nr("\\pink","\\textcolor{##ff00af}{#1}"),Nr("\\red","\\textcolor{##df0030}{#1}"),Nr("\\green","\\textcolor{##28ae7b}{#1}"),Nr("\\gray","\\textcolor{gray}{#1}"),Nr("\\purple","\\textcolor{##9d38bd}{#1}"),Nr("\\blueA","\\textcolor{##ccfaff}{#1}"),Nr("\\blueB","\\textcolor{##80f6ff}{#1}"),Nr("\\blueC","\\textcolor{##63d9ea}{#1}"),Nr("\\blueD","\\textcolor{##11accd}{#1}"),Nr("\\blueE","\\textcolor{##0c7f99}{#1}"),Nr("\\tealA","\\textcolor{##94fff5}{#1}"),Nr("\\tealB","\\textcolor{##26edd5}{#1}"),Nr("\\tealC","\\textcolor{##01d1c1}{#1}"),Nr("\\tealD","\\textcolor{##01a995}{#1}"),Nr("\\tealE","\\textcolor{##208170}{#1}"),Nr("\\greenA","\\textcolor{##b6ffb0}{#1}"),Nr("\\greenB","\\textcolor{##8af281}{#1}"),Nr("\\greenC","\\textcolor{##74cf70}{#1}"),Nr("\\greenD","\\textcolor{##1fab54}{#1}"),Nr("\\greenE","\\textcolor{##0d923f}{#1}"),Nr("\\goldA","\\textcolor{##ffd0a9}{#1}"),Nr("\\goldB","\\textcolor{##ffbb71}{#1}"),Nr("\\goldC","\\textcolor{##ff9c39}{#1}"),Nr("\\goldD","\\textcolor{##e07d10}{#1}"),Nr("\\goldE","\\textcolor{##a75a05}{#1}"),Nr("\\redA","\\textcolor{##fca9a9}{#1}"),Nr("\\redB","\\textcolor{##ff8482}{#1}"),Nr("\\redC","\\textcolor{##f9685d}{#1}"),Nr("\\redD","\\textcolor{##e84d39}{#1}"),Nr("\\redE","\\textcolor{##bc2612}{#1}"),Nr("\\maroonA","\\textcolor{##ffbde0}{#1}"),Nr("\\maroonB","\\textcolor{##ff92c6}{#1}"),Nr("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Nr("\\maroonD","\\textcolor{##ca337c}{#1}"),Nr("\\maroonE","\\textcolor{##9e034e}{#1}"),Nr("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Nr("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Nr("\\purpleC","\\textcolor{##aa87ff}{#1}"),Nr("\\purpleD","\\textcolor{##7854ab}{#1}"),Nr("\\purpleE","\\textcolor{##543b78}{#1}"),Nr("\\mintA","\\textcolor{##f5f9e8}{#1}"),Nr("\\mintB","\\textcolor{##edf2df}{#1}"),Nr("\\mintC","\\textcolor{##e0e5cc}{#1}"),Nr("\\grayA","\\textcolor{##f6f7f7}{#1}"),Nr("\\grayB","\\textcolor{##f0f1f2}{#1}"),Nr("\\grayC","\\textcolor{##e3e5e6}{#1}"),Nr("\\grayD","\\textcolor{##d6d8da}{#1}"),Nr("\\grayE","\\textcolor{##babec2}{#1}"),Nr("\\grayF","\\textcolor{##888d93}{#1}"),Nr("\\grayG","\\textcolor{##626569}{#1}"),Nr("\\grayH","\\textcolor{##3b3e40}{#1}"),Nr("\\grayI","\\textcolor{##21242c}{#1}"),Nr("\\kaBlue","\\textcolor{##314453}{#1}"),Nr("\\kaGreen","\\textcolor{##71B307}{#1}");const On={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class En{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Tn(Bn,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new An(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:n,end:r}=this.consumeArg(["]"]))}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new Ir("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(e){const t=[],r=e&&e.length>0;r||this.consumeSpaces();const o=this.future();let s,i=0,a=0;do{if(s=this.popToken(),t.push(s),"{"===s.text)++i;else if("}"===s.text){if(--i,-1===i)throw new n("Extra }",s)}else if("EOF"===s.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[a]:"}")+"'",s);if(e&&r)if((0===i||1===i&&"{"===e[a])&&s.text===e[a]){if(++a,a===e.length){t.splice(-a,a);break}}else a=0}while(0!==i||r);return"{"===o.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:o,end:s}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");const r=t[0];for(let e=0;ethis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){const t=this.popToken(),r=t.text,o=t.noexpand?null:this._getExpansion(r);if(null==o||e&&o.unexpandable){if(e&&null==o&&"\\"===r[0]&&!this.isDefined(r))throw new n("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);let s=o.tokens;const i=this.consumeArgs(o.numArgs,o.delimiters);if(o.numArgs){s=s.slice();for(let e=s.length-1;e>=0;--e){let t=s[e];if("#"===t.text){if(0===e)throw new n("Incomplete placeholder at end of macro body",t);if(t=s[--e],"#"===t.text)s.splice(e+1,1);else{if(!/^[1-9]$/.test(t.text))throw new n("Not a valid argument number",t);s.splice(e,2,...i[+t.text-1])}}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){const e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new Ir(e)]):void 0}expandTokens(e){const t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return this.countExpansion(t.length),t}expandMacroAsText(e){const t=this.expandMacro(e);return t?t.map((e=>e.text)).join(""):t}_getExpansion(e){const t=this.macros.get(e);if(null==t)return t;if(1===e.length){const t=this.lexer.catcodes[e];if(null!=t&&13!==t)return}const r="function"==typeof t?t(this):t;if("string"==typeof r){let e=0;if(-1!==r.indexOf("#")){const t=r.replace(/##/g,"");for(;-1!==t.indexOf("#"+(e+1));)++e}const t=new An(r,this.settings),n=[];let o=t.lex();for(;"EOF"!==o.text;)n.push(o),o=t.lex();n.reverse();return{tokens:n,numArgs:e}}return r}isDefined(e){return this.macros.has(e)||wn.hasOwnProperty(e)||se.math.hasOwnProperty(e)||se.text.hasOwnProperty(e)||On.hasOwnProperty(e)}isExpandable(e){const t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:wn.hasOwnProperty(e)&&!wn[e].primitive}}const Ln=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,Dn=Object.freeze({"\u208a":"+","\u208b":"-","\u208c":"=","\u208d":"(","\u208e":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1d62":"i","\u2c7c":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209a":"p","\u1d63":"r","\u209b":"s","\u209c":"t","\u1d64":"u","\u1d65":"v","\u2093":"x","\u1d66":"\u03b2","\u1d67":"\u03b3","\u1d68":"\u03c1","\u1d69":"\u03d5","\u1d6a":"\u03c7","\u207a":"+","\u207b":"-","\u207c":"=","\u207d":"(","\u207e":")","\u2070":"0","\xb9":"1","\xb2":"2","\xb3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1d2c":"A","\u1d2e":"B","\u1d30":"D","\u1d31":"E","\u1d33":"G","\u1d34":"H","\u1d35":"I","\u1d36":"J","\u1d37":"K","\u1d38":"L","\u1d39":"M","\u1d3a":"N","\u1d3c":"O","\u1d3e":"P","\u1d3f":"R","\u1d40":"T","\u1d41":"U","\u2c7d":"V","\u1d42":"W","\u1d43":"a","\u1d47":"b","\u1d9c":"c","\u1d48":"d","\u1d49":"e","\u1da0":"f","\u1d4d":"g","\u02b0":"h","\u2071":"i","\u02b2":"j","\u1d4f":"k","\u02e1":"l","\u1d50":"m","\u207f":"n","\u1d52":"o","\u1d56":"p","\u02b3":"r","\u02e2":"s","\u1d57":"t","\u1d58":"u","\u1d5b":"v","\u02b7":"w","\u02e3":"x","\u02b8":"y","\u1dbb":"z","\u1d5d":"\u03b2","\u1d5e":"\u03b3","\u1d5f":"\u03b4","\u1d60":"\u03d5","\u1d61":"\u03c7","\u1dbf":"\u03b8"}),Vn={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Pn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"};class Fn{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new En(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{const e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){const t=this.nextToken;this.consume(),this.gullet.pushToken(new Ir("}")),this.gullet.pushTokens(e);const r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t){const r=[];for(;;){"math"===this.mode&&this.consumeSpaces();const n=this.fetch();if(-1!==Fn.endOfExpression.indexOf(n.text))break;if(t&&n.text===t)break;if(e&&wn[n.text]&&wn[n.text].infix)break;const o=this.parseAtom(t);if(!o)break;"internal"!==o.type&&r.push(o)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){let t,r=-1;for(let o=0;o=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);const r=se[this.mode][t].group,n=qr.range(e);let s;if(re.hasOwnProperty(r)){const e=r;s={type:"atom",mode:this.mode,family:e,loc:n,text:t}}else s={type:r,mode:this.mode,loc:n,text:t};o=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(S(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),o={type:"textord",mode:"text",loc:qr.range(e),text:t}}if(this.consume(),r)for(let t=0;t{var abe=Object.create;var _y=Object.defineProperty;var sbe=Object.getOwnPropertyDescriptor;var obe=Object.getOwnPropertyNames;var lbe=Object.getPrototypeOf,cbe=Object.prototype.hasOwnProperty;var o=(t,e)=>_y(t,"name",{value:e,configurable:!0});var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var Pi=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ur=(t,e)=>{for(var r in e)_y(t,r,{get:e[r],enumerable:!0})},V4=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of obe(e))!cbe.call(t,i)&&i!==r&&_y(t,i,{get:()=>e[i],enumerable:!(n=sbe(e,i))||n.enumerable});return t},Cr=(t,e,r)=>(V4(t,e,"default"),r&&V4(r,e,"default")),Aa=(t,e,r)=>(r=t!=null?abe(lbe(t)):{},V4(e||!t||!t.__esModule?_y(r,"default",{value:t,enumerable:!0}):r,t)),ube=t=>V4(_y({},"__esModule",{value:!0}),t);var U4=Pi((HC,WC)=>{"use strict";(function(t,e){typeof HC=="object"&&typeof WC<"u"?WC.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(HC,function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(k){var L=["th","st","nd","rd"],A=k%100;return"["+k+(L[(A-20)%10]||L[A]||L[0])+"]"},"ordinal")},x=o(function(k,L,A){var I=String(k);return!I||I.length>=L?k:""+Array(L+1-I.length).join(A)+k},"m"),b={s:x,z:o(function(k){var L=-k.utcOffset(),A=Math.abs(L),I=Math.floor(A/60),M=A%60;return(L<=0?"+":"-")+x(I,2,"0")+":"+x(M,2,"0")},"z"),m:o(function k(L,A){if(L.date()1)return k(B[0])}else{var F=L.name;S[F]=L,M=F}return!I&&M&&(T=M),M||!I&&T},"t"),C=o(function(k,L){if(E(k))return k.clone();var A=typeof L=="object"?L:{};return A.date=k,A.args=arguments,new O(A)},"O"),D=b;D.l=_,D.i=E,D.w=function(k,L){return C(k,{locale:L.$L,utc:L.$u,x:L.$x,$offset:L.$offset})};var O=function(){function k(A){this.$L=_(A.locale,null,!0),this.parse(A),this.$x=this.$x||A.x||{},this[w]=!0}o(k,"M");var L=k.prototype;return L.parse=function(A){this.$d=function(I){var M=I.date,P=I.utc;if(M===null)return new Date(NaN);if(D.u(M))return new Date;if(M instanceof Date)return new Date(M);if(typeof M=="string"&&!/Z$/i.test(M)){var B=M.match(g);if(B){var F=B[2]-1||0,z=(B[7]||"0").substring(0,3);return P?new Date(Date.UTC(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,z)):new Date(B[1],F,B[3]||1,B[4]||0,B[5]||0,B[6]||0,z)}}return new Date(M)}(A),this.init()},L.init=function(){var A=this.$d;this.$y=A.getFullYear(),this.$M=A.getMonth(),this.$D=A.getDate(),this.$W=A.getDay(),this.$H=A.getHours(),this.$m=A.getMinutes(),this.$s=A.getSeconds(),this.$ms=A.getMilliseconds()},L.$utils=function(){return D},L.isValid=function(){return this.$d.toString()!==m},L.isSame=function(A,I){var M=C(A);return this.startOf(I)<=M&&M<=this.endOf(I)},L.isAfter=function(A,I){return C(A){"use strict";f$=Aa(U4(),1),iu={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},X={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},Dy=o(function(t="fatal"){let e=iu.fatal;typeof t=="string"?t.toLowerCase()in iu&&(e=iu[t]):typeof t=="number"&&(e=t),X.trace=()=>{},X.debug=()=>{},X.info=()=>{},X.warn=()=>{},X.error=()=>{},X.fatal=()=>{},e<=iu.fatal&&(X.fatal=console.error?console.error.bind(console,ko("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",ko("FATAL"))),e<=iu.error&&(X.error=console.error?console.error.bind(console,ko("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",ko("ERROR"))),e<=iu.warn&&(X.warn=console.warn?console.warn.bind(console,ko("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",ko("WARN"))),e<=iu.info&&(X.info=console.info?console.info.bind(console,ko("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",ko("INFO"))),e<=iu.debug&&(X.debug=console.debug?console.debug.bind(console,ko("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",ko("DEBUG"))),e<=iu.trace&&(X.trace=console.debug?console.debug.bind(console,ko("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",ko("TRACE")))},"setLogLevel"),ko=o(t=>`%c${(0,f$.default)().format("ss.SSS")} : ${t} : `,"format")});var hbe,u0,qC,d$,H4=N(()=>{"use strict";hbe=Object.freeze({left:0,top:0,width:16,height:16}),u0=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),qC=Object.freeze({...hbe,...u0}),d$=Object.freeze({...qC,body:"",hidden:!1})});var fbe,p$,m$=N(()=>{"use strict";H4();fbe=Object.freeze({width:null,height:null}),p$=Object.freeze({...fbe,...u0})});var YC,W4,g$=N(()=>{"use strict";YC=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!W4(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!W4(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!W4(l,r)?null:l}return null},"stringToIcon"),W4=o((t,e)=>t?!!((e&&t.prefix===""||t.prefix)&&t.name):!1,"validateIconName")});function y$(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var v$=N(()=>{"use strict";o(y$,"mergeIconTransformations")});function XC(t,e){let r=y$(t,e);for(let n in d$)n in u0?n in t&&!(n in r)&&(r[n]=u0[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var x$=N(()=>{"use strict";H4();v$();o(XC,"mergeIconData")});function b$(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var T$=N(()=>{"use strict";o(b$,"getIconsTree")});function w$(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=XC(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),XC(t,a)}function jC(t,e){if(t.icons[e])return w$(t,e,[]);let r=b$(t,[e])[e];return r?w$(t,e,r):null}var k$=N(()=>{"use strict";x$();T$();o(w$,"internalGetIconData");o(jC,"getIconData")});function KC(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(dbe);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=pbe.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var dbe,pbe,E$=N(()=>{"use strict";dbe=/(-?[0-9.]*[0-9]+[0-9.]*)/g,pbe=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(KC,"calculateSize")});function mbe(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf("",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function gbe(t,e){return t?""+t+""+e:e}function S$(t,e,r){let n=mbe(t);return gbe(n.defs,e+n.content+r)}var C$=N(()=>{"use strict";o(mbe,"splitSVGDefs");o(gbe,"mergeDefsAndContent");o(S$,"wrapSVGContent")});function QC(t,e){let r={...qC,...t},n={...p$,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,T=y.rotate;x?b?T+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let S;switch(T<0&&(T-=Math.floor(T/4)*4),T=T%4,T){case 1:S=i.height/2+i.top,v.unshift("rotate(90 "+S.toString()+" "+S.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:S=i.width/2+i.left,v.unshift("rotate(-90 "+S.toString()+" "+S.toString()+")");break}T%2===1&&(i.left!==i.top&&(S=i.left,i.left=i.top,i.top=S),i.width!==i.height&&(S=i.width,i.width=i.height,i.height=S)),v.length&&(a=S$(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=KC(d,u/h)):(f=s==="auto"?u:s,d=l===null?KC(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{ybe(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var ybe,A$=N(()=>{"use strict";H4();m$();E$();C$();ybe=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(QC,"iconToSVG")});function ZC(t,e=xbe){let r=[],n;for(;n=vbe.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(bbe++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var vbe,xbe,bbe,_$=N(()=>{"use strict";vbe=/\sid="(\S+)"/g,xbe="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),bbe=0;o(ZC,"replaceIDs")});function JC(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"+t+""}var D$=N(()=>{"use strict";o(JC,"iconToHTML")});var R$=Pi((Iat,L$)=>{"use strict";var h0=1e3,f0=h0*60,d0=f0*60,ed=d0*24,Tbe=ed*7,wbe=ed*365.25;L$.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return kbe(t);if(r==="number"&&isFinite(t))return e.long?Sbe(t):Ebe(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function kbe(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*wbe;case"weeks":case"week":case"w":return r*Tbe;case"days":case"day":case"d":return r*ed;case"hours":case"hour":case"hrs":case"hr":case"h":return r*d0;case"minutes":case"minute":case"mins":case"min":case"m":return r*f0;case"seconds":case"second":case"secs":case"sec":case"s":return r*h0;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}o(kbe,"parse");function Ebe(t){var e=Math.abs(t);return e>=ed?Math.round(t/ed)+"d":e>=d0?Math.round(t/d0)+"h":e>=f0?Math.round(t/f0)+"m":e>=h0?Math.round(t/h0)+"s":t+"ms"}o(Ebe,"fmtShort");function Sbe(t){var e=Math.abs(t);return e>=ed?q4(t,e,ed,"day"):e>=d0?q4(t,e,d0,"hour"):e>=f0?q4(t,e,f0,"minute"):e>=h0?q4(t,e,h0,"second"):t+" ms"}o(Sbe,"fmtLong");function q4(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}o(q4,"plural")});var M$=Pi((Pat,N$)=>{"use strict";function Cbe(t){r.debug=r,r.default=r,r.coerce=u,r.disable=s,r.enable=i,r.enabled=l,r.humanize=R$(),r.destroy=h,Object.keys(t).forEach(f=>{r[f]=t[f]}),r.names=[],r.skips=[],r.formatters={};function e(f){let d=0;for(let p=0;p{if(E==="%%")return"%";S++;let C=r.formatters[_];if(typeof C=="function"){let D=v[S];E=C.call(x,D),v.splice(S,1),S--}return E}),r.formatArgs.call(x,v),(x.log||r.log).apply(x,v)}return o(y,"debug"),y.namespace=f,y.useColors=r.useColors(),y.color=r.selectColor(f),y.extend=n,y.destroy=r.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:o(()=>p!==null?p:(m!==r.namespaces&&(m=r.namespaces,g=r.enabled(f)),g),"get"),set:o(v=>{p=v},"set")}),typeof r.init=="function"&&r.init(y),y}o(r,"createDebug");function n(f,d){let p=r(this.namespace+(typeof d>"u"?":":d)+f);return p.log=this.log,p}o(n,"extend");function i(f){r.save(f),r.namespaces=f,r.names=[],r.skips=[];let d=(typeof f=="string"?f:"").trim().replace(" ",",").split(",").filter(Boolean);for(let p of d)p[0]==="-"?r.skips.push(p.slice(1)):r.names.push(p)}o(i,"enable");function a(f,d){let p=0,m=0,g=-1,y=0;for(;p"-"+d)].join(",");return r.enable(""),f}o(s,"disable");function l(f){for(let d of r.skips)if(a(f,d))return!1;for(let d of r.names)if(a(f,d))return!0;return!1}o(l,"enabled");function u(f){return f instanceof Error?f.stack||f.message:f}o(u,"coerce");function h(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return o(h,"destroy"),r.enable(r.load()),r}o(Cbe,"setup");N$.exports=Cbe});var I$=Pi((js,Y4)=>{"use strict";js.formatArgs=_be;js.save=Dbe;js.load=Lbe;js.useColors=Abe;js.storage=Rbe();js.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();js.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function Abe(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}o(Abe,"useColors");function _be(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+Y4.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,n=0;t[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(r++,i==="%c"&&(n=r))}),t.splice(n,0,e)}o(_be,"formatArgs");js.log=console.debug||console.log||(()=>{});function Dbe(t){try{t?js.storage.setItem("debug",t):js.storage.removeItem("debug")}catch{}}o(Dbe,"save");function Lbe(){let t;try{t=js.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}o(Lbe,"load");function Rbe(){try{return localStorage}catch{}}o(Rbe,"localstorage");Y4.exports=M$()(js);var{formatters:Nbe}=Y4.exports;Nbe.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var zat,O$=N(()=>{"use strict";g$();k$();A$();_$();D$();zat=Aa(I$(),1)});var t7,e7,P$,X4,B$,F$,Es,jl=N(()=>{"use strict";yt();O$();t7={body:'?',height:80,width:80},e7=new Map,P$=new Map,X4=o(t=>{for(let e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(X.debug("Registering icon pack:",e.name),"loader"in e)P$.set(e.name,e.loader);else if("icons"in e)e7.set(e.name,e.icons);else throw X.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.')}},"registerIconPacks"),B$=o(async(t,e)=>{let r=YC(t,!0,e!==void 0);if(!r)throw new Error(`Invalid icon name: ${t}`);let n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let i=e7.get(n);if(!i){let s=P$.get(n);if(!s)throw new Error(`Icon set not found: ${r.prefix}`);try{i={...await s(),prefix:n},e7.set(n,i)}catch(l){throw X.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}let a=jC(i,r.name);if(!a)throw new Error(`Icon not found: ${t}`);return a},"getRegisteredIconData"),F$=o(async t=>{try{return await B$(t),!0}catch{return!1}},"isIconAvailable"),Es=o(async(t,e,r)=>{let n;try{n=await B$(t,e?.fallbackPrefix)}catch(s){X.error(s),n=t7}let i=QC(n,e);return JC(ZC(i.body),{...i.attributes,...r})},"getIconSVG")});function j4(t){for(var e=[],r=1;r{"use strict";o(j4,"dedent")});var K4,td,$$,Q4=N(()=>{"use strict";K4=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,td=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,$$=/\s*%%.*\n/gm});var p0,n7=N(()=>{"use strict";p0=class extends Error{static{o(this,"UnknownDiagramError")}constructor(e){super(e),this.name="UnknownDiagramError"}}});var au,m0,Ly,i7,z$,rd=N(()=>{"use strict";yt();Q4();n7();au={},m0=o(function(t,e){t=t.replace(K4,"").replace(td,"").replace($$,` -`);for(let[r,{detector:n}]of Object.entries(au))if(n(t,e))return r;throw new p0(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),Ly=o((...t)=>{for(let{id:e,detector:r,loader:n}of t)i7(e,r,n)},"registerLazyLoadedDiagrams"),i7=o((t,e,r)=>{au[t]&&X.warn(`Detector with key ${t} already exists. Overwriting.`),au[t]={detector:e,loader:r},X.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),z$=o(t=>au[t].loader,"getDiagramLoader")});var Ry,G$,a7=N(()=>{"use strict";Ry=function(){var t=o(function(ze,Le,Ie,xe){for(Ie=Ie||{},xe=ze.length;xe--;Ie[ze[xe]]=Le);return Ie},"o"),e=[1,24],r=[1,25],n=[1,26],i=[1,27],a=[1,28],s=[1,63],l=[1,64],u=[1,65],h=[1,66],f=[1,67],d=[1,68],p=[1,69],m=[1,29],g=[1,30],y=[1,31],v=[1,32],x=[1,33],b=[1,34],T=[1,35],S=[1,36],w=[1,37],E=[1,38],_=[1,39],C=[1,40],D=[1,41],O=[1,42],R=[1,43],k=[1,44],L=[1,45],A=[1,46],I=[1,47],M=[1,48],P=[1,50],B=[1,51],F=[1,52],z=[1,53],$=[1,54],U=[1,55],K=[1,56],ee=[1,57],Y=[1,58],ce=[1,59],Z=[1,60],ue=[14,42],Q=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],j=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ne=[1,82],te=[1,83],he=[1,84],le=[1,85],J=[12,14,42],Se=[12,14,33,42],se=[12,14,33,42,76,77,79,80],ae=[12,33],Oe=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],ye={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:o(function(Le,Ie,xe,q,de,ie,oe){var V=ie.length-1;switch(de){case 3:q.setDirection("TB");break;case 4:q.setDirection("BT");break;case 5:q.setDirection("RL");break;case 6:q.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:q.setC4Type(ie[V-3]);break;case 19:q.setTitle(ie[V].substring(6)),this.$=ie[V].substring(6);break;case 20:q.setAccDescription(ie[V].substring(15)),this.$=ie[V].substring(15);break;case 21:this.$=ie[V].trim(),q.setTitle(this.$);break;case 22:case 23:this.$=ie[V].trim(),q.setAccDescription(this.$);break;case 28:ie[V].splice(2,0,"ENTERPRISE"),q.addPersonOrSystemBoundary(...ie[V]),this.$=ie[V];break;case 29:ie[V].splice(2,0,"SYSTEM"),q.addPersonOrSystemBoundary(...ie[V]),this.$=ie[V];break;case 30:q.addPersonOrSystemBoundary(...ie[V]),this.$=ie[V];break;case 31:ie[V].splice(2,0,"CONTAINER"),q.addContainerBoundary(...ie[V]),this.$=ie[V];break;case 32:q.addDeploymentNode("node",...ie[V]),this.$=ie[V];break;case 33:q.addDeploymentNode("nodeL",...ie[V]),this.$=ie[V];break;case 34:q.addDeploymentNode("nodeR",...ie[V]),this.$=ie[V];break;case 35:q.popBoundaryParseStack();break;case 39:q.addPersonOrSystem("person",...ie[V]),this.$=ie[V];break;case 40:q.addPersonOrSystem("external_person",...ie[V]),this.$=ie[V];break;case 41:q.addPersonOrSystem("system",...ie[V]),this.$=ie[V];break;case 42:q.addPersonOrSystem("system_db",...ie[V]),this.$=ie[V];break;case 43:q.addPersonOrSystem("system_queue",...ie[V]),this.$=ie[V];break;case 44:q.addPersonOrSystem("external_system",...ie[V]),this.$=ie[V];break;case 45:q.addPersonOrSystem("external_system_db",...ie[V]),this.$=ie[V];break;case 46:q.addPersonOrSystem("external_system_queue",...ie[V]),this.$=ie[V];break;case 47:q.addContainer("container",...ie[V]),this.$=ie[V];break;case 48:q.addContainer("container_db",...ie[V]),this.$=ie[V];break;case 49:q.addContainer("container_queue",...ie[V]),this.$=ie[V];break;case 50:q.addContainer("external_container",...ie[V]),this.$=ie[V];break;case 51:q.addContainer("external_container_db",...ie[V]),this.$=ie[V];break;case 52:q.addContainer("external_container_queue",...ie[V]),this.$=ie[V];break;case 53:q.addComponent("component",...ie[V]),this.$=ie[V];break;case 54:q.addComponent("component_db",...ie[V]),this.$=ie[V];break;case 55:q.addComponent("component_queue",...ie[V]),this.$=ie[V];break;case 56:q.addComponent("external_component",...ie[V]),this.$=ie[V];break;case 57:q.addComponent("external_component_db",...ie[V]),this.$=ie[V];break;case 58:q.addComponent("external_component_queue",...ie[V]),this.$=ie[V];break;case 60:q.addRel("rel",...ie[V]),this.$=ie[V];break;case 61:q.addRel("birel",...ie[V]),this.$=ie[V];break;case 62:q.addRel("rel_u",...ie[V]),this.$=ie[V];break;case 63:q.addRel("rel_d",...ie[V]),this.$=ie[V];break;case 64:q.addRel("rel_l",...ie[V]),this.$=ie[V];break;case 65:q.addRel("rel_r",...ie[V]),this.$=ie[V];break;case 66:q.addRel("rel_b",...ie[V]),this.$=ie[V];break;case 67:ie[V].splice(0,1),q.addRel("rel",...ie[V]),this.$=ie[V];break;case 68:q.updateElStyle("update_el_style",...ie[V]),this.$=ie[V];break;case 69:q.updateRelStyle("update_rel_style",...ie[V]),this.$=ie[V];break;case 70:q.updateLayoutConfig("update_layout_config",...ie[V]),this.$=ie[V];break;case 71:this.$=[ie[V]];break;case 72:ie[V].unshift(ie[V-1]),this.$=ie[V];break;case 73:case 75:this.$=ie[V].trim();break;case 74:let Te={};Te[ie[V-1].trim()]=ie[V].trim(),this.$=Te;break;case 76:this.$="";break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{13:70,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{13:71,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{13:72,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{13:73,19:20,20:21,21:22,22:e,23:r,24:n,26:i,28:a,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{14:[1,74]},t(ue,[2,13],{43:23,29:49,30:61,32:62,20:75,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z}),t(ue,[2,14]),t(Q,[2,16],{12:[1,76]}),t(ue,[2,36],{12:[1,77]}),t(j,[2,19]),t(j,[2,20]),{25:[1,78]},{27:[1,79]},t(j,[2,23]),{35:80,75:81,76:ne,77:te,79:he,80:le},{35:86,75:81,76:ne,77:te,79:he,80:le},{35:87,75:81,76:ne,77:te,79:he,80:le},{35:88,75:81,76:ne,77:te,79:he,80:le},{35:89,75:81,76:ne,77:te,79:he,80:le},{35:90,75:81,76:ne,77:te,79:he,80:le},{35:91,75:81,76:ne,77:te,79:he,80:le},{35:92,75:81,76:ne,77:te,79:he,80:le},{35:93,75:81,76:ne,77:te,79:he,80:le},{35:94,75:81,76:ne,77:te,79:he,80:le},{35:95,75:81,76:ne,77:te,79:he,80:le},{35:96,75:81,76:ne,77:te,79:he,80:le},{35:97,75:81,76:ne,77:te,79:he,80:le},{35:98,75:81,76:ne,77:te,79:he,80:le},{35:99,75:81,76:ne,77:te,79:he,80:le},{35:100,75:81,76:ne,77:te,79:he,80:le},{35:101,75:81,76:ne,77:te,79:he,80:le},{35:102,75:81,76:ne,77:te,79:he,80:le},{35:103,75:81,76:ne,77:te,79:he,80:le},{35:104,75:81,76:ne,77:te,79:he,80:le},t(J,[2,59]),{35:105,75:81,76:ne,77:te,79:he,80:le},{35:106,75:81,76:ne,77:te,79:he,80:le},{35:107,75:81,76:ne,77:te,79:he,80:le},{35:108,75:81,76:ne,77:te,79:he,80:le},{35:109,75:81,76:ne,77:te,79:he,80:le},{35:110,75:81,76:ne,77:te,79:he,80:le},{35:111,75:81,76:ne,77:te,79:he,80:le},{35:112,75:81,76:ne,77:te,79:he,80:le},{35:113,75:81,76:ne,77:te,79:he,80:le},{35:114,75:81,76:ne,77:te,79:he,80:le},{35:115,75:81,76:ne,77:te,79:he,80:le},{20:116,29:49,30:61,32:62,34:s,36:l,37:u,38:h,39:f,40:d,41:p,43:23,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z},{12:[1,118],33:[1,117]},{35:119,75:81,76:ne,77:te,79:he,80:le},{35:120,75:81,76:ne,77:te,79:he,80:le},{35:121,75:81,76:ne,77:te,79:he,80:le},{35:122,75:81,76:ne,77:te,79:he,80:le},{35:123,75:81,76:ne,77:te,79:he,80:le},{35:124,75:81,76:ne,77:te,79:he,80:le},{35:125,75:81,76:ne,77:te,79:he,80:le},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(ue,[2,15]),t(Q,[2,17],{21:22,19:130,22:e,23:r,24:n,26:i,28:a}),t(ue,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:r,24:n,26:i,28:a,34:s,36:l,37:u,38:h,39:f,40:d,41:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T,51:S,52:w,53:E,54:_,55:C,56:D,57:O,58:R,59:k,60:L,61:A,62:I,63:M,64:P,65:B,66:F,67:z,68:$,69:U,70:K,71:ee,72:Y,73:ce,74:Z}),t(j,[2,21]),t(j,[2,22]),t(J,[2,39]),t(Se,[2,71],{75:81,35:132,76:ne,77:te,79:he,80:le}),t(se,[2,73]),{78:[1,133]},t(se,[2,75]),t(se,[2,76]),t(J,[2,40]),t(J,[2,41]),t(J,[2,42]),t(J,[2,43]),t(J,[2,44]),t(J,[2,45]),t(J,[2,46]),t(J,[2,47]),t(J,[2,48]),t(J,[2,49]),t(J,[2,50]),t(J,[2,51]),t(J,[2,52]),t(J,[2,53]),t(J,[2,54]),t(J,[2,55]),t(J,[2,56]),t(J,[2,57]),t(J,[2,58]),t(J,[2,60]),t(J,[2,61]),t(J,[2,62]),t(J,[2,63]),t(J,[2,64]),t(J,[2,65]),t(J,[2,66]),t(J,[2,67]),t(J,[2,68]),t(J,[2,69]),t(J,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(ae,[2,28]),t(ae,[2,29]),t(ae,[2,30]),t(ae,[2,31]),t(ae,[2,32]),t(ae,[2,33]),t(ae,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t(Q,[2,18]),t(ue,[2,38]),t(Se,[2,72]),t(se,[2,74]),t(J,[2,24]),t(J,[2,35]),t(Oe,[2,25]),t(Oe,[2,26],{12:[1,138]}),t(Oe,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:o(function(Le,Ie){if(Ie.recoverable)this.trace(Le);else{var xe=new Error(Le);throw xe.hash=Ie,xe}},"parseError"),parse:o(function(Le){var Ie=this,xe=[0],q=[],de=[null],ie=[],oe=this.table,V="",Te=0,W=0,pe=0,ve=2,Pe=1,_e=ie.slice.call(arguments,1),be=Object.create(this.lexer),Ve={yy:{}};for(var De in this.yy)Object.prototype.hasOwnProperty.call(this.yy,De)&&(Ve.yy[De]=this.yy[De]);be.setInput(Le,Ve.yy),Ve.yy.lexer=be,Ve.yy.parser=this,typeof be.yylloc>"u"&&(be.yylloc={});var qe=be.yylloc;ie.push(qe);var at=be.options&&be.options.ranges;typeof Ve.yy.parseError=="function"?this.parseError=Ve.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Rt(nt){xe.length=xe.length-2*nt,de.length=de.length-nt,ie.length=ie.length-nt}o(Rt,"popStack");function st(){var nt;return nt=q.pop()||be.lex()||Pe,typeof nt!="number"&&(nt instanceof Array&&(q=nt,nt=q.pop()),nt=Ie.symbols_[nt]||nt),nt}o(st,"lex");for(var Ue,ct,We,ot,Yt,Tt,Mt={},bt,ut,St,ft;;){if(We=xe[xe.length-1],this.defaultActions[We]?ot=this.defaultActions[We]:((Ue===null||typeof Ue>"u")&&(Ue=st()),ot=oe[We]&&oe[We][Ue]),typeof ot>"u"||!ot.length||!ot[0]){var vt="";ft=[];for(bt in oe[We])this.terminals_[bt]&&bt>ve&&ft.push("'"+this.terminals_[bt]+"'");be.showPosition?vt="Parse error on line "+(Te+1)+`: -`+be.showPosition()+` -Expecting `+ft.join(", ")+", got '"+(this.terminals_[Ue]||Ue)+"'":vt="Parse error on line "+(Te+1)+": Unexpected "+(Ue==Pe?"end of input":"'"+(this.terminals_[Ue]||Ue)+"'"),this.parseError(vt,{text:be.match,token:this.terminals_[Ue]||Ue,line:be.yylineno,loc:qe,expected:ft})}if(ot[0]instanceof Array&&ot.length>1)throw new Error("Parse Error: multiple actions possible at state: "+We+", token: "+Ue);switch(ot[0]){case 1:xe.push(Ue),de.push(be.yytext),ie.push(be.yylloc),xe.push(ot[1]),Ue=null,ct?(Ue=ct,ct=null):(W=be.yyleng,V=be.yytext,Te=be.yylineno,qe=be.yylloc,pe>0&&pe--);break;case 2:if(ut=this.productions_[ot[1]][1],Mt.$=de[de.length-ut],Mt._$={first_line:ie[ie.length-(ut||1)].first_line,last_line:ie[ie.length-1].last_line,first_column:ie[ie.length-(ut||1)].first_column,last_column:ie[ie.length-1].last_column},at&&(Mt._$.range=[ie[ie.length-(ut||1)].range[0],ie[ie.length-1].range[1]]),Tt=this.performAction.apply(Mt,[V,W,Te,Ve.yy,ot[1],de,ie].concat(_e)),typeof Tt<"u")return Tt;ut&&(xe=xe.slice(0,-1*ut*2),de=de.slice(0,-1*ut),ie=ie.slice(0,-1*ut)),xe.push(this.productions_[ot[1]][0]),de.push(Mt.$),ie.push(Mt._$),St=oe[xe[xe.length-2]][xe[xe.length-1]],xe.push(St);break;case 3:return!0}}return!0},"parse")},Be=function(){var ze={EOF:1,parseError:o(function(Ie,xe){if(this.yy.parser)this.yy.parser.parseError(Ie,xe);else throw new Error(Ie)},"parseError"),setInput:o(function(Le,Ie){return this.yy=Ie||this.yy||{},this._input=Le,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var Le=this._input[0];this.yytext+=Le,this.yyleng++,this.offset++,this.match+=Le,this.matched+=Le;var Ie=Le.match(/(?:\r\n?|\n).*/g);return Ie?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),Le},"input"),unput:o(function(Le){var Ie=Le.length,xe=Le.split(/(?:\r\n?|\n)/g);this._input=Le+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-Ie),this.offset-=Ie;var q=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),xe.length-1&&(this.yylineno-=xe.length-1);var de=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:xe?(xe.length===q.length?this.yylloc.first_column:0)+q[q.length-xe.length].length-xe[0].length:this.yylloc.first_column-Ie},this.options.ranges&&(this.yylloc.range=[de[0],de[0]+this.yyleng-Ie]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(Le){this.unput(this.match.slice(Le))},"less"),pastInput:o(function(){var Le=this.matched.substr(0,this.matched.length-this.match.length);return(Le.length>20?"...":"")+Le.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var Le=this.match;return Le.length<20&&(Le+=this._input.substr(0,20-Le.length)),(Le.substr(0,20)+(Le.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var Le=this.pastInput(),Ie=new Array(Le.length+1).join("-");return Le+this.upcomingInput()+` -`+Ie+"^"},"showPosition"),test_match:o(function(Le,Ie){var xe,q,de;if(this.options.backtrack_lexer&&(de={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(de.yylloc.range=this.yylloc.range.slice(0))),q=Le[0].match(/(?:\r\n?|\n).*/g),q&&(this.yylineno+=q.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:q?q[q.length-1].length-q[q.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+Le[0].length},this.yytext+=Le[0],this.match+=Le[0],this.matches=Le,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(Le[0].length),this.matched+=Le[0],xe=this.performAction.call(this,this.yy,this,Ie,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),xe)return xe;if(this._backtrack){for(var ie in de)this[ie]=de[ie];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var Le,Ie,xe,q;this._more||(this.yytext="",this.match="");for(var de=this._currentRules(),ie=0;ieIe[0].length)){if(Ie=xe,q=ie,this.options.backtrack_lexer){if(Le=this.test_match(xe,de[ie]),Le!==!1)return Le;if(this._backtrack){Ie=!1;continue}else return!1}else if(!this.options.flex)break}return Ie?(Le=this.test_match(Ie,de[q]),Le!==!1?Le:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var Ie=this.next();return Ie||this.lex()},"lex"),begin:o(function(Ie){this.conditionStack.push(Ie)},"begin"),popState:o(function(){var Ie=this.conditionStack.length-1;return Ie>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(Ie){return Ie=this.conditionStack.length-1-Math.abs(Ie||0),Ie>=0?this.conditionStack[Ie]:"INITIAL"},"topState"),pushState:o(function(Ie){this.begin(Ie)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(Ie,xe,q,de){var ie=de;switch(q){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),26;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:break;case 14:c;break;case 15:return 12;case 16:break;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;break;case 23:return this.begin("person"),44;break;case 24:return this.begin("system_ext_queue"),51;break;case 25:return this.begin("system_ext_db"),50;break;case 26:return this.begin("system_ext"),49;break;case 27:return this.begin("system_queue"),48;break;case 28:return this.begin("system_db"),47;break;case 29:return this.begin("system"),46;break;case 30:return this.begin("boundary"),37;break;case 31:return this.begin("enterprise_boundary"),34;break;case 32:return this.begin("system_boundary"),36;break;case 33:return this.begin("container_ext_queue"),57;break;case 34:return this.begin("container_ext_db"),56;break;case 35:return this.begin("container_ext"),55;break;case 36:return this.begin("container_queue"),54;break;case 37:return this.begin("container_db"),53;break;case 38:return this.begin("container"),52;break;case 39:return this.begin("container_boundary"),38;break;case 40:return this.begin("component_ext_queue"),63;break;case 41:return this.begin("component_ext_db"),62;break;case 42:return this.begin("component_ext"),61;break;case 43:return this.begin("component_queue"),60;break;case 44:return this.begin("component_db"),59;break;case 45:return this.begin("component"),58;break;case 46:return this.begin("node"),39;break;case 47:return this.begin("node"),39;break;case 48:return this.begin("node_l"),40;break;case 49:return this.begin("node_r"),41;break;case 50:return this.begin("rel"),64;break;case 51:return this.begin("birel"),65;break;case 52:return this.begin("rel_u"),66;break;case 53:return this.begin("rel_u"),66;break;case 54:return this.begin("rel_d"),67;break;case 55:return this.begin("rel_d"),67;break;case 56:return this.begin("rel_l"),68;break;case 57:return this.begin("rel_l"),68;break;case 58:return this.begin("rel_r"),69;break;case 59:return this.begin("rel_r"),69;break;case 60:return this.begin("rel_b"),70;break;case 61:return this.begin("rel_index"),71;break;case 62:return this.begin("update_el_style"),72;break;case 63:return this.begin("update_rel_style"),73;break;case 64:return this.begin("update_layout_config"),74;break;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";break;case 67:this.begin("attribute");break;case 68:this.popState(),this.popState();break;case 69:return 80;case 70:break;case 71:return 80;case 72:this.begin("string");break;case 73:this.popState();break;case 74:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";break;case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 79:this.popState(),this.popState();break;case 80:return"STR";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}};return ze}();ye.lexer=Be;function He(){this.yy={}}return o(He,"Parser"),He.prototype=ye,ye.Parser=He,new He}();Ry.parser=Ry;G$=Ry});var s7,Un,g0=N(()=>{"use strict";s7=o((t,e,{depth:r=2,clobber:n=!1}={})=>{let i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(a=>s7(t,a,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(a=>{t.includes(a)||t.push(a)}),t):t===void 0||r<=0?t!=null&&typeof t=="object"&&typeof e=="object"?Object.assign(t,e):e:(e!==void 0&&typeof t=="object"&&typeof e=="object"&&Object.keys(e).forEach(a=>{typeof e[a]=="object"&&(t[a]===void 0||typeof t[a]=="object")?(t[a]===void 0&&(t[a]=Array.isArray(e[a])?[]:{}),t[a]=s7(t[a],e[a],{depth:r-1,clobber:n})):(n||typeof t[a]!="object"&&typeof e[a]!="object")&&(t[a]=e[a])}),t)},"assignWithDepth"),Un=s7});var Z4,V$,U$=N(()=>{"use strict";Z4={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:o(t=>t>=255?255:t<0?0:t,"r"),g:o(t=>t>=255?255:t<0?0:t,"g"),b:o(t=>t>=255?255:t<0?0:t,"b"),h:o(t=>t%360,"h"),s:o(t=>t>=100?100:t<0?0:t,"s"),l:o(t=>t>=100?100:t<0?0:t,"l"),a:o(t=>t>=1?1:t<0?0:t,"a")},toLinear:o(t=>{let e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},"toLinear"),hue2rgb:o((t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<.16666666666666666?t+(e-t)*6*r:r<.5?e:r<.6666666666666666?t+(e-t)*(.6666666666666666-r)*6:t),"hue2rgb"),hsl2rgb:o(({h:t,s:e,l:r},n)=>{if(!e)return r*2.55;t/=360,e/=100,r/=100;let i=r<.5?r*(1+e):r+e-r*e,a=2*r-i;switch(n){case"r":return Z4.hue2rgb(a,i,t+.3333333333333333)*255;case"g":return Z4.hue2rgb(a,i,t)*255;case"b":return Z4.hue2rgb(a,i,t-.3333333333333333)*255}},"hsl2rgb"),rgb2hsl:o(({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;let i=Math.max(t,e,r),a=Math.min(t,e,r),s=(i+a)/2;if(n==="l")return s*100;if(i===a)return 0;let l=i-a,u=s>.5?l/(2-i-a):l/(i+a);if(n==="s")return u*100;switch(i){case t:return((e-r)/l+(e{"use strict";Mbe={clamp:o((t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),"clamp"),round:o(t=>Math.round(t*1e10)/1e10,"round")},H$=Mbe});var Ibe,q$,Y$=N(()=>{"use strict";Ibe={dec2hex:o(t=>{let e=Math.round(t).toString(16);return e.length>1?e:`0${e}`},"dec2hex")},q$=Ibe});var Obe,jt,Kl=N(()=>{"use strict";U$();W$();Y$();Obe={channel:V$,lang:H$,unit:q$},jt=Obe});var su,Bi,Ny=N(()=>{"use strict";Kl();su={};for(let t=0;t<=255;t++)su[t]=jt.unit.dec2hex(t);Bi={ALL:0,RGB:1,HSL:2}});var o7,X$,j$=N(()=>{"use strict";Ny();o7=class{static{o(this,"Type")}constructor(){this.type=Bi.ALL}get(){return this.type}set(e){if(this.type&&this.type!==e)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=e}reset(){this.type=Bi.ALL}is(e){return this.type===e}},X$=o7});var l7,K$,Q$=N(()=>{"use strict";Kl();j$();Ny();l7=class{static{o(this,"Channels")}constructor(e,r){this.color=r,this.changed=!1,this.data=e,this.type=new X$}set(e,r){return this.color=r,this.changed=!1,this.data=e,this.type.type=Bi.ALL,this}_ensureHSL(){let e=this.data,{h:r,s:n,l:i}=e;r===void 0&&(e.h=jt.channel.rgb2hsl(e,"h")),n===void 0&&(e.s=jt.channel.rgb2hsl(e,"s")),i===void 0&&(e.l=jt.channel.rgb2hsl(e,"l"))}_ensureRGB(){let e=this.data,{r,g:n,b:i}=e;r===void 0&&(e.r=jt.channel.hsl2rgb(e,"r")),n===void 0&&(e.g=jt.channel.hsl2rgb(e,"g")),i===void 0&&(e.b=jt.channel.hsl2rgb(e,"b"))}get r(){let e=this.data,r=e.r;return!this.type.is(Bi.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"r"))}get g(){let e=this.data,r=e.g;return!this.type.is(Bi.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"g"))}get b(){let e=this.data,r=e.b;return!this.type.is(Bi.HSL)&&r!==void 0?r:(this._ensureHSL(),jt.channel.hsl2rgb(e,"b"))}get h(){let e=this.data,r=e.h;return!this.type.is(Bi.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"h"))}get s(){let e=this.data,r=e.s;return!this.type.is(Bi.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"s"))}get l(){let e=this.data,r=e.l;return!this.type.is(Bi.RGB)&&r!==void 0?r:(this._ensureRGB(),jt.channel.rgb2hsl(e,"l"))}get a(){return this.data.a}set r(e){this.type.set(Bi.RGB),this.changed=!0,this.data.r=e}set g(e){this.type.set(Bi.RGB),this.changed=!0,this.data.g=e}set b(e){this.type.set(Bi.RGB),this.changed=!0,this.data.b=e}set h(e){this.type.set(Bi.HSL),this.changed=!0,this.data.h=e}set s(e){this.type.set(Bi.HSL),this.changed=!0,this.data.s=e}set l(e){this.type.set(Bi.HSL),this.changed=!0,this.data.l=e}set a(e){this.changed=!0,this.data.a=e}},K$=l7});var Pbe,uh,My=N(()=>{"use strict";Q$();Pbe=new K$({r:0,g:0,b:0,a:0},"transparent"),uh=Pbe});var Z$,nd,c7=N(()=>{"use strict";My();Ny();Z$={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:o(t=>{if(t.charCodeAt(0)!==35)return;let e=t.match(Z$.re);if(!e)return;let r=e[1],n=parseInt(r,16),i=r.length,a=i%4===0,s=i>4,l=s?1:17,u=s?8:4,h=a?0:-1,f=s?255:15;return uh.set({r:(n>>u*(h+3)&f)*l,g:(n>>u*(h+2)&f)*l,b:(n>>u*(h+1)&f)*l,a:a?(n&f)*l/255:1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}${su[Math.round(i*255)]}`:`#${su[Math.round(e)]}${su[Math.round(r)]}${su[Math.round(n)]}`},"stringify")},nd=Z$});var J4,Iy,J$=N(()=>{"use strict";Kl();My();J4={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:o(t=>{let e=t.match(J4.hueRe);if(e){let[,r,n]=e;switch(n){case"grad":return jt.channel.clamp.h(parseFloat(r)*.9);case"rad":return jt.channel.clamp.h(parseFloat(r)*180/Math.PI);case"turn":return jt.channel.clamp.h(parseFloat(r)*360)}}return jt.channel.clamp.h(parseFloat(t))},"_hue2deg"),parse:o(t=>{let e=t.charCodeAt(0);if(e!==104&&e!==72)return;let r=t.match(J4.re);if(!r)return;let[,n,i,a,s,l]=r;return uh.set({h:J4._hue2deg(n),s:jt.channel.clamp.s(parseFloat(i)),l:jt.channel.clamp.l(parseFloat(a)),a:s?jt.channel.clamp.a(l?parseFloat(s)/100:parseFloat(s)):1},t)},"parse"),stringify:o(t=>{let{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${jt.lang.round(e)}, ${jt.lang.round(r)}%, ${jt.lang.round(n)}%, ${i})`:`hsl(${jt.lang.round(e)}, ${jt.lang.round(r)}%, ${jt.lang.round(n)}%)`},"stringify")},Iy=J4});var e3,u7,ez=N(()=>{"use strict";c7();e3={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:o(t=>{t=t.toLowerCase();let e=e3.colors[t];if(e)return nd.parse(e)},"parse"),stringify:o(t=>{let e=nd.stringify(t);for(let r in e3.colors)if(e3.colors[r]===e)return r},"stringify")},u7=e3});var tz,Oy,rz=N(()=>{"use strict";Kl();My();tz={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:o(t=>{let e=t.charCodeAt(0);if(e!==114&&e!==82)return;let r=t.match(tz.re);if(!r)return;let[,n,i,a,s,l,u,h,f]=r;return uh.set({r:jt.channel.clamp.r(i?parseFloat(n)*2.55:parseFloat(n)),g:jt.channel.clamp.g(s?parseFloat(a)*2.55:parseFloat(a)),b:jt.channel.clamp.b(u?parseFloat(l)*2.55:parseFloat(l)),a:h?jt.channel.clamp.a(f?parseFloat(h)/100:parseFloat(h)):1},t)},"parse"),stringify:o(t=>{let{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${jt.lang.round(e)}, ${jt.lang.round(r)}, ${jt.lang.round(n)}, ${jt.lang.round(i)})`:`rgb(${jt.lang.round(e)}, ${jt.lang.round(r)}, ${jt.lang.round(n)})`},"stringify")},Oy=tz});var Bbe,Fi,ou=N(()=>{"use strict";c7();J$();ez();rz();Ny();Bbe={format:{keyword:u7,hex:nd,rgb:Oy,rgba:Oy,hsl:Iy,hsla:Iy},parse:o(t=>{if(typeof t!="string")return t;let e=nd.parse(t)||Oy.parse(t)||Iy.parse(t)||u7.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},"parse"),stringify:o(t=>!t.changed&&t.color?t.color:t.type.is(Bi.HSL)||t.data.r===void 0?Iy.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?Oy.stringify(t):nd.stringify(t),"stringify")},Fi=Bbe});var Fbe,t3,h7=N(()=>{"use strict";Kl();ou();Fbe=o((t,e)=>{let r=Fi.parse(t);for(let n in e)r[n]=jt.channel.clamp[n](e[n]);return Fi.stringify(r)},"change"),t3=Fbe});var $be,Qa,f7=N(()=>{"use strict";Kl();My();ou();h7();$be=o((t,e,r=0,n=1)=>{if(typeof t!="number")return t3(t,{a:e});let i=uh.set({r:jt.channel.clamp.r(t),g:jt.channel.clamp.g(e),b:jt.channel.clamp.b(r),a:jt.channel.clamp.a(n)});return Fi.stringify(i)},"rgba"),Qa=$be});var zbe,id,nz=N(()=>{"use strict";Kl();ou();zbe=o((t,e)=>jt.lang.round(Fi.parse(t)[e]),"channel"),id=zbe});var Gbe,iz,az=N(()=>{"use strict";Kl();ou();Gbe=o(t=>{let{r:e,g:r,b:n}=Fi.parse(t),i=.2126*jt.channel.toLinear(e)+.7152*jt.channel.toLinear(r)+.0722*jt.channel.toLinear(n);return jt.lang.round(i)},"luminance"),iz=Gbe});var Vbe,sz,oz=N(()=>{"use strict";az();Vbe=o(t=>iz(t)>=.5,"isLight"),sz=Vbe});var Ube,la,lz=N(()=>{"use strict";oz();Ube=o(t=>!sz(t),"isDark"),la=Ube});var Hbe,r3,d7=N(()=>{"use strict";Kl();ou();Hbe=o((t,e,r)=>{let n=Fi.parse(t),i=n[e],a=jt.channel.clamp[e](i+r);return i!==a&&(n[e]=a),Fi.stringify(n)},"adjustChannel"),r3=Hbe});var Wbe,Lt,cz=N(()=>{"use strict";d7();Wbe=o((t,e)=>r3(t,"l",e),"lighten"),Lt=Wbe});var qbe,Ot,uz=N(()=>{"use strict";d7();qbe=o((t,e)=>r3(t,"l",-e),"darken"),Ot=qbe});var Ybe,Me,hz=N(()=>{"use strict";ou();h7();Ybe=o((t,e)=>{let r=Fi.parse(t),n={};for(let i in e)e[i]&&(n[i]=r[i]+e[i]);return t3(t,n)},"adjust"),Me=Ybe});var Xbe,fz,dz=N(()=>{"use strict";ou();f7();Xbe=o((t,e,r=50)=>{let{r:n,g:i,b:a,a:s}=Fi.parse(t),{r:l,g:u,b:h,a:f}=Fi.parse(e),d=r/100,p=d*2-1,m=s-f,y=((p*m===-1?p:(p+m)/(1+p*m))+1)/2,v=1-y,x=n*y+l*v,b=i*y+u*v,T=a*y+h*v,S=s*d+f*(1-d);return Qa(x,b,T,S)},"mix"),fz=Xbe});var jbe,wt,pz=N(()=>{"use strict";ou();dz();jbe=o((t,e=100)=>{let r=Fi.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,fz(r,t,e)},"invert"),wt=jbe});var mz=N(()=>{"use strict";f7();nz();lz();cz();uz();hz();pz()});var Ks=N(()=>{"use strict";mz()});var hh,fh,Py=N(()=>{"use strict";hh="#ffffff",fh="#f2f2f2"});var Si,y0=N(()=>{"use strict";Ks();Si=o((t,e)=>e?Me(t,{s:-40,l:10}):Me(t,{s:-40,l:-10}),"mkBorder")});var m7,gz,yz=N(()=>{"use strict";Ks();Py();y0();m7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||Me(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||Me(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||Si(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||Si(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||wt(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||wt(this.tertiaryColor),this.lineColor=this.lineColor||wt(this.background),this.arrowheadColor=this.arrowheadColor||wt(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?Ot(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||Ot(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||wt(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||Lt(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||Ot(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Ot(this.mainBkg,10)):(this.rowOdd=this.rowOdd||Lt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||Lt(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.darkMode)for(let r=0;r{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},gz=o(t=>{let e=new m7;return e.calculate(t),e},"getThemeVariables")});var g7,vz,xz=N(()=>{"use strict";Ks();y0();g7=class{static{o(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=Lt(this.primaryColor,16),this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=wt(this.background),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=Lt(wt("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=Qa(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=Ot("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=Ot(this.sectionBkgColor,10),this.taskBorderColor=Qa(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=Qa(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Lt(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||Ot(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=Lt(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=Lt(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=Lt(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=Me(this.primaryColor,{h:64}),this.fillType3=Me(this.secondaryColor,{h:64}),this.fillType4=Me(this.primaryColor,{h:-64}),this.fillType5=Me(this.secondaryColor,{h:-64}),this.fillType6=Me(this.primaryColor,{h:128}),this.fillType7=Me(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330});for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},vz=o(t=>{let e=new g7;return e.calculate(t),e},"getThemeVariables")});var y7,dh,By=N(()=>{"use strict";Ks();y0();Py();y7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=Me(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=Qa(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Ot(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Ot(this.tertiaryColor,40);for(let e=0;e{this[n]==="calculated"&&(this[n]=void 0)}),typeof e!="object"){this.updateColors();return}let r=Object.keys(e);r.forEach(n=>{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},dh=o(t=>{let e=new y7;return e.calculate(t),e},"getThemeVariables")});var v7,bz,Tz=N(()=>{"use strict";Ks();Py();y0();v7=class{static{o(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=Lt("#cde498",10),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.primaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=Ot(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||Me(this.primaryColor,{h:30}),this.cScale4=this.cScale4||Me(this.primaryColor,{h:60}),this.cScale5=this.cScale5||Me(this.primaryColor,{h:90}),this.cScale6=this.cScale6||Me(this.primaryColor,{h:120}),this.cScale7=this.cScale7||Me(this.primaryColor,{h:150}),this.cScale8=this.cScale8||Me(this.primaryColor,{h:210}),this.cScale9=this.cScale9||Me(this.primaryColor,{h:270}),this.cScale10=this.cScale10||Me(this.primaryColor,{h:300}),this.cScale11=this.cScale11||Me(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||Ot(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||Ot(this.tertiaryColor,40);for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},bz=o(t=>{let e=new v7;return e.calculate(t),e},"getThemeVariables")});var x7,wz,kz=N(()=>{"use strict";Ks();y0();Py();x7=class{static{o(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=Lt(this.contrast,55),this.background="#ffffff",this.tertiaryColor=Me(this.primaryColor,{h:-160}),this.primaryBorderColor=Si(this.primaryColor,this.darkMode),this.secondaryBorderColor=Si(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=Si(this.tertiaryColor,this.darkMode),this.primaryTextColor=wt(this.primaryColor),this.secondaryTextColor=wt(this.secondaryColor),this.tertiaryTextColor=wt(this.tertiaryColor),this.lineColor=wt(this.background),this.textColor=wt(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||Lt(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=Lt(this.contrast,55),this.border2=this.contrast,this.actorBorder=Lt(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let e=0;e{this[n]=e[n]}),this.updateColors(),r.forEach(n=>{this[n]=e[n]})}},wz=o(t=>{let e=new x7;return e.calculate(t),e},"getThemeVariables")});var Eo,n3=N(()=>{"use strict";yz();xz();By();Tz();kz();Eo={base:{getThemeVariables:gz},dark:{getThemeVariables:vz},default:{getThemeVariables:dh},forest:{getThemeVariables:bz},neutral:{getThemeVariables:wz}}});var ul,Ez=N(()=>{"use strict";ul={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1}});var Sz,Cz,Az,or,_a=N(()=>{"use strict";n3();Ez();Sz={...ul,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF"},themeCSS:void 0,themeVariables:Eo.default.getThemeVariables(),sequence:{...ul.sequence,messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:o(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:o(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...ul.gantt,tickInterval:void 0,useWidth:void 0},c4:{...ul.c4,useWidth:void 0,personFont:o(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...ul.flowchart,inheritDir:!1},external_personFont:o(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:o(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:o(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:o(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:o(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:o(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:o(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:o(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:o(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:o(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:o(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:o(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:o(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:o(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:o(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:o(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:o(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:o(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:o(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:o(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:o(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...ul.pie,useWidth:984},xyChart:{...ul.xyChart,useWidth:void 0},requirement:{...ul.requirement,useWidth:void 0},packet:{...ul.packet},radar:{...ul.radar},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","}},Cz=o((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:typeof t[n]=="object"&&t[n]!==null?[...r,e+n,...Cz(t[n],"")]:[...r,e+n],[]),"keyify"),Az=new Set(Cz(Sz,"")),or=Sz});var v0,Kbe,b7=N(()=>{"use strict";_a();yt();v0=o(t=>{if(X.debug("sanitizeDirective called with",t),!(typeof t!="object"||t==null)){if(Array.isArray(t)){t.forEach(e=>v0(e));return}for(let e of Object.keys(t)){if(X.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!Az.has(e)||t[e]==null){X.debug("sanitize deleting key: ",e),delete t[e];continue}if(typeof t[e]=="object"){X.debug("sanitizing object",e),v0(t[e]);continue}let r=["themeCSS","fontFamily","altFontFamily"];for(let n of r)e.includes(n)&&(X.debug("sanitizing css option",e),t[e]=Kbe(t[e]))}if(t.themeVariables)for(let e of Object.keys(t.themeVariables)){let r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}X.debug("After sanitization",t)}},"sanitizeDirective"),Kbe=o(t=>{let e=0,r=0;for(let n of t){if(e{"use strict";g0();yt();n3();_a();b7();ph=Object.freeze(or),Ss=Un({},ph),x0=[],Fy=Un({},ph),i3=o((t,e)=>{let r=Un({},t),n={};for(let i of e)Nz(i),n=Un(n,i);if(r=Un(r,n),n.theme&&n.theme in Eo){let i=Un({},Dz),a=Un(i.themeVariables||{},n.themeVariables);r.theme&&r.theme in Eo&&(r.themeVariables=Eo[r.theme].getThemeVariables(a))}return Fy=r,Iz(Fy),Fy},"updateCurrentConfig"),T7=o(t=>(Ss=Un({},ph),Ss=Un(Ss,t),t.theme&&Eo[t.theme]&&(Ss.themeVariables=Eo[t.theme].getThemeVariables(t.themeVariables)),i3(Ss,x0),Ss),"setSiteConfig"),Lz=o(t=>{Dz=Un({},t)},"saveConfigFromInitialize"),Rz=o(t=>(Ss=Un(Ss,t),i3(Ss,x0),Ss),"updateSiteConfig"),w7=o(()=>Un({},Ss),"getSiteConfig"),a3=o(t=>(Iz(t),Un(Fy,t),tr()),"setConfig"),tr=o(()=>Un({},Fy),"getConfig"),Nz=o(t=>{t&&(["secure",...Ss.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(X.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{typeof t[e]=="string"&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],typeof t[e]=="object"&&Nz(t[e])}))},"sanitize"),Mz=o(t=>{v0(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),x0.push(t),i3(Ss,x0)},"addDirective"),$y=o((t=Ss)=>{x0=[],i3(t,x0)},"reset"),Qbe={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},_z={},Zbe=o(t=>{_z[t]||(X.warn(Qbe[t]),_z[t]=!0)},"issueWarning"),Iz=o(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&&Zbe("LAZY_LOAD_DEPRECATED")},"checkConfig")});function es(t){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var r=arguments.length,n=new Array(r>1?r-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:l3;Oz&&Oz(t,null);let n=e.length;for(;n--;){let i=e[n];if(typeof i=="string"){let a=r(i);a!==i&&(Jbe(e)||(e[n]=a),i=a)}t[i]=!0}return t}function o4e(t){for(let e=0;e0&&arguments[0]!==void 0?arguments[0]:v4e(),e=o(Dt=>Xz(Dt),"DOMPurify");if(e.version="3.2.5",e.removed=[],!t||!t.document||t.document.nodeType!==Hy.document||!t.Element)return e.isSupported=!1,e;let{document:r}=t,n=r,i=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:u,NodeFilter:h,NamedNodeMap:f=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:d,DOMParser:p,trustedTypes:m}=t,g=u.prototype,y=Uy(g,"cloneNode"),v=Uy(g,"remove"),x=Uy(g,"nextSibling"),b=Uy(g,"childNodes"),T=Uy(g,"parentNode");if(typeof s=="function"){let Dt=r.createElement("template");Dt.content&&Dt.content.ownerDocument&&(r=Dt.content.ownerDocument)}let S,w="",{implementation:E,createNodeIterator:_,createDocumentFragment:C,getElementsByTagName:D}=r,{importNode:O}=n,R=Uz();e.isSupported=typeof Hz=="function"&&typeof T=="function"&&E&&E.createHTMLDocument!==void 0;let{MUSTACHE_EXPR:k,ERB_EXPR:L,TMPLIT_EXPR:A,DATA_ATTR:I,ARIA_ATTR:M,IS_SCRIPT_OR_DATA:P,ATTR_WHITESPACE:B,CUSTOM_ELEMENT:F}=Vz,{IS_ALLOWED_URI:z}=Vz,$=null,U=_r({},[...Fz,...E7,...S7,...C7,...$z]),K=null,ee=_r({},[...zz,...A7,...Gz,...o3]),Y=Object.seal(Wz(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ce=null,Z=null,ue=!0,Q=!0,j=!1,ne=!0,te=!1,he=!0,le=!1,J=!1,Se=!1,se=!1,ae=!1,Oe=!1,ye=!0,Be=!1,He="user-content-",ze=!0,Le=!1,Ie={},xe=null,q=_r({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),de=null,ie=_r({},["audio","video","img","source","image","track"]),oe=null,V=_r({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Te="http://www.w3.org/1998/Math/MathML",W="http://www.w3.org/2000/svg",pe="http://www.w3.org/1999/xhtml",ve=pe,Pe=!1,_e=null,be=_r({},[Te,W,pe],k7),Ve=_r({},["mi","mo","mn","ms","mtext"]),De=_r({},["annotation-xml"]),qe=_r({},["title","style","font","a","script"]),at=null,Rt=["application/xhtml+xml","text/html"],st="text/html",Ue=null,ct=null,We=r.createElement("form"),ot=o(function(Ce){return Ce instanceof RegExp||Ce instanceof Function},"isRegexOrFunction"),Yt=o(function(){let Ce=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ct&&ct===Ce)){if((!Ce||typeof Ce!="object")&&(Ce={}),Ce=ad(Ce),at=Rt.indexOf(Ce.PARSER_MEDIA_TYPE)===-1?st:Ce.PARSER_MEDIA_TYPE,Ue=at==="application/xhtml+xml"?k7:l3,$=hl(Ce,"ALLOWED_TAGS")?_r({},Ce.ALLOWED_TAGS,Ue):U,K=hl(Ce,"ALLOWED_ATTR")?_r({},Ce.ALLOWED_ATTR,Ue):ee,_e=hl(Ce,"ALLOWED_NAMESPACES")?_r({},Ce.ALLOWED_NAMESPACES,k7):be,oe=hl(Ce,"ADD_URI_SAFE_ATTR")?_r(ad(V),Ce.ADD_URI_SAFE_ATTR,Ue):V,de=hl(Ce,"ADD_DATA_URI_TAGS")?_r(ad(ie),Ce.ADD_DATA_URI_TAGS,Ue):ie,xe=hl(Ce,"FORBID_CONTENTS")?_r({},Ce.FORBID_CONTENTS,Ue):q,ce=hl(Ce,"FORBID_TAGS")?_r({},Ce.FORBID_TAGS,Ue):{},Z=hl(Ce,"FORBID_ATTR")?_r({},Ce.FORBID_ATTR,Ue):{},Ie=hl(Ce,"USE_PROFILES")?Ce.USE_PROFILES:!1,ue=Ce.ALLOW_ARIA_ATTR!==!1,Q=Ce.ALLOW_DATA_ATTR!==!1,j=Ce.ALLOW_UNKNOWN_PROTOCOLS||!1,ne=Ce.ALLOW_SELF_CLOSE_IN_ATTR!==!1,te=Ce.SAFE_FOR_TEMPLATES||!1,he=Ce.SAFE_FOR_XML!==!1,le=Ce.WHOLE_DOCUMENT||!1,se=Ce.RETURN_DOM||!1,ae=Ce.RETURN_DOM_FRAGMENT||!1,Oe=Ce.RETURN_TRUSTED_TYPE||!1,Se=Ce.FORCE_BODY||!1,ye=Ce.SANITIZE_DOM!==!1,Be=Ce.SANITIZE_NAMED_PROPS||!1,ze=Ce.KEEP_CONTENT!==!1,Le=Ce.IN_PLACE||!1,z=Ce.ALLOWED_URI_REGEXP||qz,ve=Ce.NAMESPACE||pe,Ve=Ce.MATHML_TEXT_INTEGRATION_POINTS||Ve,De=Ce.HTML_INTEGRATION_POINTS||De,Y=Ce.CUSTOM_ELEMENT_HANDLING||{},Ce.CUSTOM_ELEMENT_HANDLING&&ot(Ce.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Y.tagNameCheck=Ce.CUSTOM_ELEMENT_HANDLING.tagNameCheck),Ce.CUSTOM_ELEMENT_HANDLING&&ot(Ce.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Y.attributeNameCheck=Ce.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),Ce.CUSTOM_ELEMENT_HANDLING&&typeof Ce.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(Y.allowCustomizedBuiltInElements=Ce.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),te&&(Q=!1),ae&&(se=!0),Ie&&($=_r({},$z),K=[],Ie.html===!0&&(_r($,Fz),_r(K,zz)),Ie.svg===!0&&(_r($,E7),_r(K,A7),_r(K,o3)),Ie.svgFilters===!0&&(_r($,S7),_r(K,A7),_r(K,o3)),Ie.mathMl===!0&&(_r($,C7),_r(K,Gz),_r(K,o3))),Ce.ADD_TAGS&&($===U&&($=ad($)),_r($,Ce.ADD_TAGS,Ue)),Ce.ADD_ATTR&&(K===ee&&(K=ad(K)),_r(K,Ce.ADD_ATTR,Ue)),Ce.ADD_URI_SAFE_ATTR&&_r(oe,Ce.ADD_URI_SAFE_ATTR,Ue),Ce.FORBID_CONTENTS&&(xe===q&&(xe=ad(xe)),_r(xe,Ce.FORBID_CONTENTS,Ue)),ze&&($["#text"]=!0),le&&_r($,["html","head","body"]),$.table&&(_r($,["tbody"]),delete ce.tbody),Ce.TRUSTED_TYPES_POLICY){if(typeof Ce.TRUSTED_TYPES_POLICY.createHTML!="function")throw Vy('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof Ce.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Vy('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');S=Ce.TRUSTED_TYPES_POLICY,w=S.createHTML("")}else S===void 0&&(S=x4e(m,i)),S!==null&&typeof w=="string"&&(w=S.createHTML(""));Ja&&Ja(Ce),ct=Ce}},"_parseConfig"),Tt=_r({},[...E7,...S7,...l4e]),Mt=_r({},[...C7,...c4e]),bt=o(function(Ce){let tt=T(Ce);(!tt||!tt.tagName)&&(tt={namespaceURI:ve,tagName:"template"});let Ct=l3(Ce.tagName),gr=l3(tt.tagName);return _e[Ce.namespaceURI]?Ce.namespaceURI===W?tt.namespaceURI===pe?Ct==="svg":tt.namespaceURI===Te?Ct==="svg"&&(gr==="annotation-xml"||Ve[gr]):!!Tt[Ct]:Ce.namespaceURI===Te?tt.namespaceURI===pe?Ct==="math":tt.namespaceURI===W?Ct==="math"&&De[gr]:!!Mt[Ct]:Ce.namespaceURI===pe?tt.namespaceURI===W&&!De[gr]||tt.namespaceURI===Te&&!Ve[gr]?!1:!Mt[Ct]&&(qe[Ct]||!Tt[Ct]):!!(at==="application/xhtml+xml"&&_e[Ce.namespaceURI]):!1},"_checkValidNamespace"),ut=o(function(Ce){zy(e.removed,{element:Ce});try{T(Ce).removeChild(Ce)}catch{v(Ce)}},"_forceRemove"),St=o(function(Ce,tt){try{zy(e.removed,{attribute:tt.getAttributeNode(Ce),from:tt})}catch{zy(e.removed,{attribute:null,from:tt})}if(tt.removeAttribute(Ce),Ce==="is")if(se||ae)try{ut(tt)}catch{}else try{tt.setAttribute(Ce,"")}catch{}},"_removeAttribute"),ft=o(function(Ce){let tt=null,Ct=null;if(Se)Ce=""+Ce;else{let yn=Bz(Ce,/^[\r\n\t ]+/);Ct=yn&&yn[0]}at==="application/xhtml+xml"&&ve===pe&&(Ce=''+Ce+"");let gr=S?S.createHTML(Ce):Ce;if(ve===pe)try{tt=new p().parseFromString(gr,at)}catch{}if(!tt||!tt.documentElement){tt=E.createDocument(ve,"template",null);try{tt.documentElement.innerHTML=Pe?w:gr}catch{}}let rn=tt.body||tt.documentElement;return Ce&&Ct&&rn.insertBefore(r.createTextNode(Ct),rn.childNodes[0]||null),ve===pe?D.call(tt,le?"html":"body")[0]:le?tt.documentElement:rn},"_initDocument"),vt=o(function(Ce){return _.call(Ce.ownerDocument||Ce,Ce,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},"_createNodeIterator"),nt=o(function(Ce){return Ce instanceof d&&(typeof Ce.nodeName!="string"||typeof Ce.textContent!="string"||typeof Ce.removeChild!="function"||!(Ce.attributes instanceof f)||typeof Ce.removeAttribute!="function"||typeof Ce.setAttribute!="function"||typeof Ce.namespaceURI!="string"||typeof Ce.insertBefore!="function"||typeof Ce.hasChildNodes!="function")},"_isClobbered"),pn=o(function(Ce){return typeof l=="function"&&Ce instanceof l},"_isNode");function kt(Dt,Ce,tt){s3(Dt,Ct=>{Ct.call(e,Ce,tt,ct)})}o(kt,"_executeHooks");let On=o(function(Ce){let tt=null;if(kt(R.beforeSanitizeElements,Ce,null),nt(Ce))return ut(Ce),!0;let Ct=Ue(Ce.nodeName);if(kt(R.uponSanitizeElement,Ce,{tagName:Ct,allowedTags:$}),Ce.hasChildNodes()&&!pn(Ce.firstElementChild)&&Za(/<[/\w!]/g,Ce.innerHTML)&&Za(/<[/\w!]/g,Ce.textContent)||Ce.nodeType===Hy.progressingInstruction||he&&Ce.nodeType===Hy.comment&&Za(/<[/\w]/g,Ce.data))return ut(Ce),!0;if(!$[Ct]||ce[Ct]){if(!ce[Ct]&&Mr(Ct)&&(Y.tagNameCheck instanceof RegExp&&Za(Y.tagNameCheck,Ct)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Ct)))return!1;if(ze&&!xe[Ct]){let gr=T(Ce)||Ce.parentNode,rn=b(Ce)||Ce.childNodes;if(rn&&gr){let yn=rn.length;for(let Zr=yn-1;Zr>=0;--Zr){let Oi=y(rn[Zr],!0);Oi.__removalCount=(Ce.__removalCount||0)+1,gr.insertBefore(Oi,x(Ce))}}}return ut(Ce),!0}return Ce instanceof u&&!bt(Ce)||(Ct==="noscript"||Ct==="noembed"||Ct==="noframes")&&Za(/<\/no(script|embed|frames)/i,Ce.innerHTML)?(ut(Ce),!0):(te&&Ce.nodeType===Hy.text&&(tt=Ce.textContent,s3([k,L,A],gr=>{tt=Gy(tt,gr," ")}),Ce.textContent!==tt&&(zy(e.removed,{element:Ce.cloneNode()}),Ce.textContent=tt)),kt(R.afterSanitizeElements,Ce,null),!1)},"_sanitizeElements"),tn=o(function(Ce,tt,Ct){if(ye&&(tt==="id"||tt==="name")&&(Ct in r||Ct in We))return!1;if(!(Q&&!Z[tt]&&Za(I,tt))){if(!(ue&&Za(M,tt))){if(!K[tt]||Z[tt]){if(!(Mr(Ce)&&(Y.tagNameCheck instanceof RegExp&&Za(Y.tagNameCheck,Ce)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Ce))&&(Y.attributeNameCheck instanceof RegExp&&Za(Y.attributeNameCheck,tt)||Y.attributeNameCheck instanceof Function&&Y.attributeNameCheck(tt))||tt==="is"&&Y.allowCustomizedBuiltInElements&&(Y.tagNameCheck instanceof RegExp&&Za(Y.tagNameCheck,Ct)||Y.tagNameCheck instanceof Function&&Y.tagNameCheck(Ct))))return!1}else if(!oe[tt]){if(!Za(z,Gy(Ct,B,""))){if(!((tt==="src"||tt==="xlink:href"||tt==="href")&&Ce!=="script"&&i4e(Ct,"data:")===0&&de[Ce])){if(!(j&&!Za(P,Gy(Ct,B,"")))){if(Ct)return!1}}}}}}return!0},"_isValidAttribute"),Mr=o(function(Ce){return Ce!=="annotation-xml"&&Bz(Ce,F)},"_isBasicCustomElement"),Ir=o(function(Ce){kt(R.beforeSanitizeAttributes,Ce,null);let{attributes:tt}=Ce;if(!tt||nt(Ce))return;let Ct={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:K,forceKeepAttr:void 0},gr=tt.length;for(;gr--;){let rn=tt[gr],{name:yn,namespaceURI:Zr,value:Oi}=rn,ei=Ue(yn),Sn=yn==="value"?Oi:a4e(Oi);if(Ct.attrName=ei,Ct.attrValue=Sn,Ct.keepAttr=!0,Ct.forceKeepAttr=void 0,kt(R.uponSanitizeAttribute,Ce,Ct),Sn=Ct.attrValue,Be&&(ei==="id"||ei==="name")&&(St(yn,Ce),Sn=He+Sn),he&&Za(/((--!?|])>)|<\/(style|title)/i,Sn)){St(yn,Ce);continue}if(Ct.forceKeepAttr||(St(yn,Ce),!Ct.keepAttr))continue;if(!ne&&Za(/\/>/i,Sn)){St(yn,Ce);continue}te&&s3([k,L,A],et=>{Sn=Gy(Sn,et," ")});let Hr=Ue(Ce.nodeName);if(tn(Hr,ei,Sn)){if(S&&typeof m=="object"&&typeof m.getAttributeType=="function"&&!Zr)switch(m.getAttributeType(Hr,ei)){case"TrustedHTML":{Sn=S.createHTML(Sn);break}case"TrustedScriptURL":{Sn=S.createScriptURL(Sn);break}}try{Zr?Ce.setAttributeNS(Zr,yn,Sn):Ce.setAttribute(yn,Sn),nt(Ce)?ut(Ce):Pz(e.removed)}catch{}}}kt(R.afterSanitizeAttributes,Ce,null)},"_sanitizeAttributes"),Pn=o(function Dt(Ce){let tt=null,Ct=vt(Ce);for(kt(R.beforeSanitizeShadowDOM,Ce,null);tt=Ct.nextNode();)kt(R.uponSanitizeShadowNode,tt,null),On(tt),Ir(tt),tt.content instanceof a&&Dt(tt.content);kt(R.afterSanitizeShadowDOM,Ce,null)},"_sanitizeShadowDOM");return e.sanitize=function(Dt){let Ce=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},tt=null,Ct=null,gr=null,rn=null;if(Pe=!Dt,Pe&&(Dt=""),typeof Dt!="string"&&!pn(Dt))if(typeof Dt.toString=="function"){if(Dt=Dt.toString(),typeof Dt!="string")throw Vy("dirty is not a string, aborting")}else throw Vy("toString is not a function");if(!e.isSupported)return Dt;if(J||Yt(Ce),e.removed=[],typeof Dt=="string"&&(Le=!1),Le){if(Dt.nodeName){let Oi=Ue(Dt.nodeName);if(!$[Oi]||ce[Oi])throw Vy("root node is forbidden and cannot be sanitized in-place")}}else if(Dt instanceof l)tt=ft(""),Ct=tt.ownerDocument.importNode(Dt,!0),Ct.nodeType===Hy.element&&Ct.nodeName==="BODY"||Ct.nodeName==="HTML"?tt=Ct:tt.appendChild(Ct);else{if(!se&&!te&&!le&&Dt.indexOf("<")===-1)return S&&Oe?S.createHTML(Dt):Dt;if(tt=ft(Dt),!tt)return se?null:Oe?w:""}tt&&Se&&ut(tt.firstChild);let yn=vt(Le?Dt:tt);for(;gr=yn.nextNode();)On(gr),Ir(gr),gr.content instanceof a&&Pn(gr.content);if(Le)return Dt;if(se){if(ae)for(rn=C.call(tt.ownerDocument);tt.firstChild;)rn.appendChild(tt.firstChild);else rn=tt;return(K.shadowroot||K.shadowrootmode)&&(rn=O.call(n,rn,!0)),rn}let Zr=le?tt.outerHTML:tt.innerHTML;return le&&$["!doctype"]&&tt.ownerDocument&&tt.ownerDocument.doctype&&tt.ownerDocument.doctype.name&&Za(Yz,tt.ownerDocument.doctype.name)&&(Zr=" -`+Zr),te&&s3([k,L,A],Oi=>{Zr=Gy(Zr,Oi," ")}),S&&Oe?S.createHTML(Zr):Zr},e.setConfig=function(){let Dt=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Yt(Dt),J=!0},e.clearConfig=function(){ct=null,J=!1},e.isValidAttribute=function(Dt,Ce,tt){ct||Yt({});let Ct=Ue(Dt),gr=Ue(Ce);return tn(Ct,gr,tt)},e.addHook=function(Dt,Ce){typeof Ce=="function"&&zy(R[Dt],Ce)},e.removeHook=function(Dt,Ce){if(Ce!==void 0){let tt=r4e(R[Dt],Ce);return tt===-1?void 0:n4e(R[Dt],tt,1)[0]}return Pz(R[Dt])},e.removeHooks=function(Dt){R[Dt]=[]},e.removeAllHooks=function(){R=Uz()},e}var Hz,Oz,Jbe,e4e,t4e,Ja,So,Wz,_7,D7,s3,r4e,Pz,zy,n4e,l3,k7,Bz,Gy,i4e,a4e,hl,Za,Vy,Fz,E7,S7,l4e,C7,c4e,$z,zz,A7,Gz,o3,u4e,h4e,f4e,d4e,p4e,qz,m4e,g4e,Yz,y4e,Vz,Hy,v4e,x4e,Uz,mh,L7=N(()=>{"use strict";({entries:Hz,setPrototypeOf:Oz,isFrozen:Jbe,getPrototypeOf:e4e,getOwnPropertyDescriptor:t4e}=Object),{freeze:Ja,seal:So,create:Wz}=Object,{apply:_7,construct:D7}=typeof Reflect<"u"&&Reflect;Ja||(Ja=o(function(e){return e},"freeze"));So||(So=o(function(e){return e},"seal"));_7||(_7=o(function(e,r,n){return e.apply(r,n)},"apply"));D7||(D7=o(function(e,r){return new e(...r)},"construct"));s3=es(Array.prototype.forEach),r4e=es(Array.prototype.lastIndexOf),Pz=es(Array.prototype.pop),zy=es(Array.prototype.push),n4e=es(Array.prototype.splice),l3=es(String.prototype.toLowerCase),k7=es(String.prototype.toString),Bz=es(String.prototype.match),Gy=es(String.prototype.replace),i4e=es(String.prototype.indexOf),a4e=es(String.prototype.trim),hl=es(Object.prototype.hasOwnProperty),Za=es(RegExp.prototype.test),Vy=s4e(TypeError);o(es,"unapply");o(s4e,"unconstruct");o(_r,"addToSet");o(o4e,"cleanArray");o(ad,"clone");o(Uy,"lookupGetter");Fz=Ja(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),E7=Ja(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),S7=Ja(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),l4e=Ja(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),C7=Ja(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),c4e=Ja(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),$z=Ja(["#text"]),zz=Ja(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),A7=Ja(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Gz=Ja(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),o3=Ja(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),u4e=So(/\{\{[\w\W]*|[\w\W]*\}\}/gm),h4e=So(/<%[\w\W]*|[\w\W]*%>/gm),f4e=So(/\$\{[\w\W]*/gm),d4e=So(/^data-[\-\w.\u00B7-\uFFFF]+$/),p4e=So(/^aria-[\-\w]+$/),qz=So(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),m4e=So(/^(?:\w+script|data):/i),g4e=So(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Yz=So(/^html$/i),y4e=So(/^[a-z][.\w]*(-[.\w]+)+$/i),Vz=Object.freeze({__proto__:null,ARIA_ATTR:p4e,ATTR_WHITESPACE:g4e,CUSTOM_ELEMENT:y4e,DATA_ATTR:d4e,DOCTYPE_NAME:Yz,ERB_EXPR:h4e,IS_ALLOWED_URI:qz,IS_SCRIPT_OR_DATA:m4e,MUSTACHE_EXPR:u4e,TMPLIT_EXPR:f4e}),Hy={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},v4e=o(function(){return typeof window>"u"?null:window},"getGlobal"),x4e=o(function(e,r){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let n=null,i="data-tt-policy-suffix";r&&r.hasAttribute(i)&&(n=r.getAttribute(i));let a="dompurify"+(n?"#"+n:"");try{return e.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},"_createTrustedTypesPolicy"),Uz=o(function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},"_createHooksMap");o(Xz,"createDOMPurify");mh=Xz()});var CV={};ur(CV,{ParseError:()=>pt,SETTINGS_SCHEMA:()=>Xy,__defineFunction:()=>Nt,__defineMacro:()=>fe,__defineSymbol:()=>G,__domTree:()=>SV,__parse:()=>TV,__renderToDomTree:()=>O3,__renderToHTMLTree:()=>kV,__setFontMetrics:()=>_G,default:()=>u5e,render:()=>xA,renderToString:()=>bV,version:()=>EV});function C4e(t){return String(t).replace(S4e,e=>E4e[e])}function L4e(t){if(t.default)return t.default;var e=t.type,r=Array.isArray(e)?e[0]:e;if(typeof r!="string")return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}function B4e(t){for(var e=0;e=i[0]&&t<=i[1])return r.name}return null}function AG(t){for(var e=0;e=b3[e]&&t<=b3[e+1])return!0;return!1}function _G(t,e){Jl[t]=e}function nA(t,e,r){if(!Jl[e])throw new Error("Font metrics not found for font: "+e+".");var n=t.charCodeAt(0),i=Jl[e][n];if(!i&&t[0]in Kz&&(n=Kz[t[0]].charCodeAt(0),i=Jl[e][n]),!i&&r==="text"&&AG(n)&&(i=Jl[e][77]),i)return{depth:i[0],height:i[1],italic:i[2],skew:i[3],width:i[4]}}function X4e(t){var e;if(t>=5?e=0:t>=3?e=1:e=2,!R7[e]){var r=R7[e]={cssEmPerMu:c3.quad[e]/18};for(var n in c3)c3.hasOwnProperty(n)&&(r[n]=c3[n][e])}return R7[e]}function Jz(t){if(t instanceof As)return t;throw new Error("Expected symbolNode but got "+String(t)+".")}function J4e(t){if(t instanceof ld)return t;throw new Error("Expected span but got "+String(t)+".")}function G(t,e,r,n,i,a){An[t][i]={font:e,group:r,replace:n},a&&n&&(An[t][n]=An[t][i])}function Nt(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs,argTypes:n.argTypes,allowedInArgument:!!n.allowedInArgument,allowedInText:!!n.allowedInText,allowedInMath:n.allowedInMath===void 0?!0:n.allowedInMath,numOptionalArgs:n.numOptionalArgs||0,infix:!!n.infix,primitive:!!n.primitive,handler:i},u=0;u0&&(a.push(g3(s,e)),s=[]),a.push(n[l]));s.length>0&&a.push(g3(s,e));var h;r?(h=g3($i(r,e,!0)),h.classes=["tag"],a.push(h)):i&&a.push(i);var f=fu(["katex-html"],a);if(f.setAttribute("aria-hidden","true"),h){var d=h.children[0];d.style.height=Et(f.height+f.depth),f.depth&&(d.style.verticalAlign=Et(-f.depth))}return f}function zG(t){return new od(t)}function I7(t){if(!t)return!1;if(t.type==="mi"&&t.children.length===1){var e=t.children[0];return e instanceof Ao&&e.text==="."}else if(t.type==="mo"&&t.children.length===1&&t.getAttribute("separator")==="true"&&t.getAttribute("lspace")==="0em"&&t.getAttribute("rspace")==="0em"){var r=t.children[0];return r instanceof Ao&&r.text===","}else return!1}function iG(t,e,r,n,i){var a=_s(t,r),s;a.length===1&&a[0]instanceof ts&&Jt.contains(["mrow","mtable"],a[0].type)?s=a[0]:s=new dt.MathNode("mrow",a);var l=new dt.MathNode("annotation",[new dt.TextNode(e)]);l.setAttribute("encoding","application/x-tex");var u=new dt.MathNode("semantics",[s,l]),h=new dt.MathNode("math",[u]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&h.setAttribute("display","block");var f=i?"katex":"katex-mathml";return Fe.makeSpan([f],[h])}function xr(t,e){if(!t||t.type!==e)throw new Error("Expected node of type "+e+", but got "+(t?"node of type "+t.type:String(t)));return t}function oA(t){var e=R3(t);if(!e)throw new Error("Expected node of symbol group type, but got "+(t?"node of type "+t.type:String(t)));return e}function R3(t){return t&&(t.type==="atom"||t3e.hasOwnProperty(t.type))?t:null}function HG(t,e){var r=$i(t.body,e,!0);return R3e([t.mclass],r,e)}function WG(t,e){var r,n=_s(t.body,e);return t.mclass==="minner"?r=new dt.MathNode("mpadded",n):t.mclass==="mord"?t.isCharacterBox?(r=n[0],r.type="mi"):r=new dt.MathNode("mi",n):(t.isCharacterBox?(r=n[0],r.type="mo"):r=new dt.MathNode("mo",n),t.mclass==="mbin"?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):t.mclass==="mpunct"?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):t.mclass==="mopen"||t.mclass==="mclose"?(r.attributes.lspace="0em",r.attributes.rspace="0em"):t.mclass==="minner"&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}function I3e(t,e,r){var n=N3e[t];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[e[0]],[e[1]]);case"\\uparrow":case"\\downarrow":{var i=r.callFunction("\\\\cdleft",[e[0]],[]),a={type:"atom",text:n,mode:"math",family:"rel"},s=r.callFunction("\\Big",[a],[]),l=r.callFunction("\\\\cdright",[e[1]],[]),u={type:"ordgroup",mode:"math",body:[i,s,l]};return r.callFunction("\\\\cdparent",[u],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{var h={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[h],[])}default:return{type:"textord",text:" ",mode:"math"}}}function O3e(t){var e=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){e.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();var r=t.fetch().text;if(r==="&"||r==="\\\\")t.consume();else if(r==="\\end"){e[e.length-1].length===0&&e.pop();break}else throw new pt("Expected \\\\ or \\cr or \\end",t.nextToken)}for(var n=[],i=[n],a=0;a-1))if("<>AV".indexOf(h)>-1)for(var d=0;d<2;d++){for(var p=!0,m=u+1;mAV=|." after @',s[u]);var g=I3e(h,f,t),y={type:"styling",body:[g],mode:"math",style:"display"};n.push(y),l=aG()}a%2===0?n.push(l):n.shift(),n=[],i.push(n)}t.gullet.endGroup(),t.gullet.endGroup();var v=new Array(i[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25});return{type:"array",mode:"math",body:i,arraystretch:1,addJot:!0,rowGaps:[null],cols:v,colSeparationType:"CD",hLinesBeforeRow:new Array(i.length+1).fill([])}}function M3(t,e){var r=R3(t);if(r&&Jt.contains(X3e,r.text))return r;throw r?new pt("Invalid delimiter '"+r.text+"' after '"+e.funcName+"'",t):new pt("Invalid delimiter type '"+t.type+"'",t)}function lG(t){if(!t.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}function tc(t){for(var{type:e,names:r,props:n,handler:i,htmlBuilder:a,mathmlBuilder:s}=t,l={type:e,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:i},u=0;u1||!f)&&y.pop(),x.length{"use strict";Qs=class t{static{o(this,"SourceLocation")}constructor(e,r,n){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=r,this.end=n}static range(e,r){return r?!e||!e.loc||!r.loc||e.loc.lexer!==r.loc.lexer?null:new t(e.loc.lexer,e.loc.start,r.loc.end):e&&e.loc}},_o=class t{static{o(this,"Token")}constructor(e,r){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=r}range(e,r){return new t(r,Qs.range(this,e))}},pt=class t{static{o(this,"ParseError")}constructor(e,r){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var n="KaTeX parse error: "+e,i,a,s=r&&r.loc;if(s&&s.start<=s.end){var l=s.lexer.input;i=s.start,a=s.end,i===l.length?n+=" at end of input: ":n+=" at position "+(i+1)+": ";var u=l.slice(i,a).replace(/[^]/g,"$&\u0332"),h;i>15?h="\u2026"+l.slice(i-15,i):h=l.slice(0,i);var f;a+15":">","<":"<",'"':""","'":"'"},S4e=/[&><"']/g;o(C4e,"escape");CG=o(function t(e){return e.type==="ordgroup"||e.type==="color"?e.body.length===1?t(e.body[0]):e:e.type==="font"?t(e.body):e},"getBaseElem"),A4e=o(function(e){var r=CG(e);return r.type==="mathord"||r.type==="textord"||r.type==="atom"},"isCharacterBox"),_4e=o(function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e},"assert"),D4e=o(function(e){var r=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return r?r[2]!==":"||!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(r[1])?null:r[1].toLowerCase():"_relative"},"protocolFromUrl"),Jt={contains:b4e,deflt:T4e,escape:C4e,hyphenate:k4e,getBaseElem:CG,isCharacterBox:A4e,protocolFromUrl:D4e},Xy={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:o(t=>"#"+t,"cliProcessor")},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:o((t,e)=>(e.push(t),e),"cliProcessor")},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:o(t=>Math.max(0,t),"processor"),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:o(t=>Math.max(0,t),"processor"),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:o(t=>Math.max(0,t),"processor"),cli:"-e, --max-expand ",cliProcessor:o(t=>t==="Infinity"?1/0:parseInt(t),"cliProcessor")},globalGroup:{type:"boolean",cli:!1}};o(L4e,"getDefaultValue");Ky=class{static{o(this,"Settings")}constructor(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{};for(var r in Xy)if(Xy.hasOwnProperty(r)){var n=Xy[r];this[r]=e[r]!==void 0?n.processor?n.processor(e[r]):e[r]:L4e(n)}}reportNonstrict(e,r,n){var i=this.strict;if(typeof i=="function"&&(i=i(e,r,n)),!(!i||i==="ignore")){if(i===!0||i==="error")throw new pt("LaTeX-incompatible input and strict mode is set to 'error': "+(r+" ["+e+"]"),n);i==="warn"?typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")):typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]"))}}useStrictBehavior(e,r,n){var i=this.strict;if(typeof i=="function")try{i=i(e,r,n)}catch{i="error"}return!i||i==="ignore"?!1:i===!0||i==="error"?!0:i==="warn"?(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+(r+" ["+e+"]")),!1):(typeof console<"u"&&console.warn("LaTeX-incompatible input and strict mode is set to "+("unrecognized '"+i+"': "+r+" ["+e+"]")),!1)}isTrusted(e){if(e.url&&!e.protocol){var r=Jt.protocolFromUrl(e.url);if(r==null)return!1;e.protocol=r}var n=typeof this.trust=="function"?this.trust(e):this.trust;return!!n}},Ql=class{static{o(this,"Style")}constructor(e,r,n){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=r,this.cramped=n}sup(){return Zl[R4e[this.id]]}sub(){return Zl[N4e[this.id]]}fracNum(){return Zl[M4e[this.id]]}fracDen(){return Zl[I4e[this.id]]}cramp(){return Zl[O4e[this.id]]}text(){return Zl[P4e[this.id]]}isTight(){return this.size>=2}},rA=0,T3=1,w0=2,uu=3,Qy=4,Co=5,k0=6,rs=7,Zl=[new Ql(rA,0,!1),new Ql(T3,0,!0),new Ql(w0,1,!1),new Ql(uu,1,!0),new Ql(Qy,2,!1),new Ql(Co,2,!0),new Ql(k0,3,!1),new Ql(rs,3,!0)],R4e=[Qy,Co,Qy,Co,k0,rs,k0,rs],N4e=[Co,Co,Co,Co,rs,rs,rs,rs],M4e=[w0,uu,Qy,Co,k0,rs,k0,rs],I4e=[uu,uu,Co,Co,rs,rs,rs,rs],O4e=[T3,T3,uu,uu,Co,Co,rs,rs],P4e=[rA,T3,w0,uu,w0,uu,w0,uu],nr={DISPLAY:Zl[rA],TEXT:Zl[w0],SCRIPT:Zl[Qy],SCRIPTSCRIPT:Zl[k0]},H7=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];o(B4e,"scriptFromCodepoint");b3=[];H7.forEach(t=>t.blocks.forEach(e=>b3.push(...e)));o(AG,"supportedCodepoint");T0=80,F4e=o(function(e,r){return"M95,"+(622+e+r)+` -c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14 -c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54 -c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10 -s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429 -c69,-144,104.5,-217.7,106.5,-221 -l`+e/2.075+" -"+e+` -c5.3,-9.3,12,-14,20,-14 -H400000v`+(40+e)+`H845.2724 -s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7 -c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z -M`+(834+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtMain"),$4e=o(function(e,r){return"M263,"+(601+e+r)+`c0.7,0,18,39.7,52,119 -c34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120 -c340,-704.7,510.7,-1060.3,512,-1067 -l`+e/2.084+" -"+e+` -c4.7,-7.3,11,-11,19,-11 -H40000v`+(40+e)+`H1012.3 -s-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232 -c-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1 -s-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26 -c-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z -M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize1"),z4e=o(function(e,r){return"M983 "+(10+e+r)+` -l`+e/3.13+" -"+e+` -c4,-6.7,10,-10,18,-10 H400000v`+(40+e)+` -H1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7 -s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744 -c-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30 -c26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722 -c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5 -c53.7,-170.3,84.5,-266.8,92.5,-289.5z -M`+(1001+e)+" "+r+"h400000v"+(40+e)+"h-400000z"},"sqrtSize2"),G4e=o(function(e,r){return"M424,"+(2398+e+r)+` -c-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514 -c0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20 -s-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121 -s209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081 -l`+e/4.223+" -"+e+`c4,-6.7,10,-10,18,-10 H400000 -v`+(40+e)+`H1014.6 -s-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185 -c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2z M`+(1001+e)+" "+r+` -h400000v`+(40+e)+"h-400000z"},"sqrtSize3"),V4e=o(function(e,r){return"M473,"+(2713+e+r)+` -c339.3,-1799.3,509.3,-2700,510,-2702 l`+e/5.298+" -"+e+` -c3.3,-7.3,9.3,-11,18,-11 H400000v`+(40+e)+`H1017.7 -s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9 -c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200 -c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26 -s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104, -606zM`+(1001+e)+" "+r+"h400000v"+(40+e)+"H1017.7z"},"sqrtSize4"),U4e=o(function(e){var r=e/2;return"M400000 "+e+" H0 L"+r+" 0 l65 45 L145 "+(e-80)+" H400000z"},"phasePath"),H4e=o(function(e,r,n){var i=n-54-r-e;return"M702 "+(e+r)+"H400000"+(40+e)+` -H742v`+i+`l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1 -h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170 -c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667 -219 661 l218 661zM702 `+r+"H400000v"+(40+e)+"H742z"},"sqrtTall"),W4e=o(function(e,r,n){r=1e3*r;var i="";switch(e){case"sqrtMain":i=F4e(r,T0);break;case"sqrtSize1":i=$4e(r,T0);break;case"sqrtSize2":i=z4e(r,T0);break;case"sqrtSize3":i=G4e(r,T0);break;case"sqrtSize4":i=V4e(r,T0);break;case"sqrtTall":i=H4e(r,T0,n)}return i},"sqrtPath"),q4e=o(function(e,r){switch(e){case"\u239C":return"M291 0 H417 V"+r+" H291z M291 0 H417 V"+r+" H291z";case"\u2223":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z";case"\u2225":return"M145 0 H188 V"+r+" H145z M145 0 H188 V"+r+" H145z"+("M367 0 H410 V"+r+" H367z M367 0 H410 V"+r+" H367z");case"\u239F":return"M457 0 H583 V"+r+" H457z M457 0 H583 V"+r+" H457z";case"\u23A2":return"M319 0 H403 V"+r+" H319z M319 0 H403 V"+r+" H319z";case"\u23A5":return"M263 0 H347 V"+r+" H263z M263 0 H347 V"+r+" H263z";case"\u23AA":return"M384 0 H504 V"+r+" H384z M384 0 H504 V"+r+" H384z";case"\u23D0":return"M312 0 H355 V"+r+" H312z M312 0 H355 V"+r+" H312z";case"\u2016":return"M257 0 H300 V"+r+" H257z M257 0 H300 V"+r+" H257z"+("M478 0 H521 V"+r+" H478z M478 0 H521 V"+r+" H478z");default:return""}},"innerPath"),jz={doubleleftarrow:`M262 157 -l10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3 - 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28 - 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5 -c2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5 - 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87 --86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7 --2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z -m8 0v40h399730v-40zm0 194v40h399730v-40z`,doublerightarrow:`M399738 392l --10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5 - 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88 --33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68 --17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18 --13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782 -c-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3 --107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z`,leftarrow:`M400000 241H110l3-3c68.7-52.7 113.7-120 - 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8 --5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247 -c-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208 - 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3 - 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202 - l-3-3h399890zM100 241v40h399900v-40z`,leftbrace:`M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117 --45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7 - 5-6 9-10 13-.7 1-7.3 1-20 1H6z`,leftbraceunder:`M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13 - 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688 - 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7 --331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z`,leftgroup:`M400000 80 -H435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0 - 435 0h399565z`,leftgroupunder:`M400000 262 -H435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219 - 435 219h399565z`,leftharpoon:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3 --3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5 --18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7 --196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z`,leftharpoonplus:`M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5 - 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3 --4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7 --10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z -m0 0v40h400000v-40z`,leftharpoondown:`M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333 - 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5 - 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667 --152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z`,leftharpoondownplus:`M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12 - 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7 --2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0 -v40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z`,lefthook:`M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5 --83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3 --68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21 - 71.5 23h399859zM103 281v-40h399897v40z`,leftlinesegment:`M40 281 V428 H0 V94 H40 V241 H400000 v40z -M40 281 V428 H0 V94 H40 V241 H400000 v40z`,leftmapsto:`M40 281 V448H0V74H40V241H400000v40z -M40 281 V448H0V74H40V241H400000v40z`,leftToFrom:`M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23 --.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8 -c28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3 - 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z`,longequal:`M0 50 h400000 v40H0z m0 194h40000v40H0z -M0 50 h400000 v40H0z m0 194h40000v40H0z`,midbrace:`M200428 334 -c-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14 --53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7 - 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11 - 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z`,midbraceunder:`M199572 214 -c100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14 - 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3 - 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0 --5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z`,oiintSize1:`M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6 --320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z -m368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8 -60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z`,oiintSize2:`M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8 --451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z -m502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2 -c0 110 84 276 504 276s502.4-166 502.4-276z`,oiiintSize1:`M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6 --480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z -m525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0 -85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z`,oiiintSize2:`M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8 --707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z -m770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1 -c0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z`,rightarrow:`M0 241v40h399891c-47.3 35.3-84 78-110 128 --16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 - 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 - 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85 --40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 - 151.7 139 205zm0 0v40h399900v-40z`,rightbrace:`M400000 542l --6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5 -s-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1 -c124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z`,rightbraceunder:`M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3 - 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237 --174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z`,rightgroup:`M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0 - 3-1 3-3v-38c-76-158-257-219-435-219H0z`,rightgroupunder:`M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18 - 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z`,rightharpoon:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3 --3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2 --10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 - 69.2 92 94.5zm0 0v40h399900v-40z`,rightharpoonplus:`M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11 --18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7 - 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z -m0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z`,rightharpoondown:`M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8 - 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5 --7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95 --27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z`,rightharpoondownplus:`M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8 - 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 - 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3 --64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z -m0-194v40h400000v-40zm0 0v40h400000v-40z`,righthook:`M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3 - 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0 --13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21 - 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z`,rightlinesegment:`M399960 241 V94 h40 V428 h-40 V281 H0 v-40z -M399960 241 V94 h40 V428 h-40 V281 H0 v-40z`,rightToFrom:`M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23 - 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32 --52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142 --167z M100 147v40h399900v-40zM0 341v40h399900v-40z`,twoheadleftarrow:`M0 167c68 40 - 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69 --70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3 --40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19 --37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101 - 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z`,twoheadrightarrow:`M400000 167 -c-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3 - 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42 - 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333 --19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70 - 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z`,tilde1:`M200 55.538c-77 0-168 73.953-177 73.953-3 0-7 --2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0 - 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0 - 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128 --68.267.847-113-73.952-191-73.952z`,tilde2:`M344 55.266c-142 0-300.638 81.316-311.5 86.418 --8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9 - 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114 -c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751 - 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,tilde3:`M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457 --11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0 - 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697 - 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696 - -338 0-409-156.573-744-156.573z`,tilde4:`M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345 --11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409 - 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9 - 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409 - -175.236-744-175.236z`,vec:`M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5 -3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11 -10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63 --1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1 --7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59 -H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359 -c-16-25.333-24-45-24-59z`,widehat1:`M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22 -c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,widehat2:`M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat3:`M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widehat4:`M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10 --11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,widecheck1:`M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1, --5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,widecheck2:`M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck3:`M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,widecheck4:`M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10, --11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,baraboveleftarrow:`M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202 -c4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5 -c-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130 -s-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47 -121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6 -s2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11 -c0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z -M100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z`,rightarrowabovebar:`M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32 --27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 -13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39 --84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5 --119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5 --12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 -151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z`,baraboveshortleftharpoon:`M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17 -c2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21 -c-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40 -c-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z -M0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z`,rightharpoonaboveshortbar:`M0,241 l0,40c399126,0,399993,0,399993,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z`,shortbaraboveleftharpoon:`M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11 -c1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9, -1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7, --152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z -M93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z`,shortrightharpoonabovebar:`M53,241l0,40c398570,0,399437,0,399437,0 -c4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199, --231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6 -c-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z -M500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z`},Y4e=o(function(e,r){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v1759 h347 v-84 -H403z M403 1759 V0 H319 V1759 v`+r+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v1759 H0 v84 H347z -M347 1759 V0 H263 V1759 v`+r+" v1759 h84z";case"vert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+" v585 h43z";case"doublevert":return"M145 15 v585 v"+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v`+r+` v585 h43z -M367 15 v585 v`+r+` v585 c2.667,10,9.667,15,21,15 -c10,0,16.667,-5,20,-15 v-585 v`+-r+` v-585 c-2.667,-10,-9.667,-15,-21,-15 -c-10,0,-16.667,5,-20,15z M410 15 H367 v585 v`+r+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+r+` v1715 h263 v84 H319z -MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+r+` v1799 H0 v-84 H319z -MM319 602 V0 H403 V602 v`+r+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+r+` v602 h84z -M403 1759 V0 H319 V1759 v`+r+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+r+` v602 h84z -M347 1759 V0 h-84 V1759 v`+r+" v602 h84z";case"lparen":return`M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1 -c-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349, --36,557 l0,`+(r+84)+`c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210, -949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9 -c0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5, --544.7,-112.5,-882c-2,-104,-3,-167,-3,-189 -l0,-`+(r+92)+`c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3, --210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z`;case"rparen":return`M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3, -63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5 -c11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,`+(r+9)+` -c-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664 -c-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11 -c0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17 -c242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558 -l0,-`+(r+144)+`c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7, --470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z`;default:throw new Error("Unknown stretchy delimiter.")}},"tallDelim"),od=class{static{o(this,"DocumentFragment")}constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return Jt.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),r=0;rr.toText(),"toText");return this.children.map(e).join("")}},Jl={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},c3={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},Kz={\u00C5:"A",\u00D0:"D",\u00DE:"o",\u00E5:"a",\u00F0:"d",\u00FE:"o",\u0410:"A",\u0411:"B",\u0412:"B",\u0413:"F",\u0414:"A",\u0415:"E",\u0416:"K",\u0417:"3",\u0418:"N",\u0419:"N",\u041A:"K",\u041B:"N",\u041C:"M",\u041D:"H",\u041E:"O",\u041F:"N",\u0420:"P",\u0421:"C",\u0422:"T",\u0423:"y",\u0424:"O",\u0425:"X",\u0426:"U",\u0427:"h",\u0428:"W",\u0429:"W",\u042A:"B",\u042B:"X",\u042C:"B",\u042D:"3",\u042E:"X",\u042F:"R",\u0430:"a",\u0431:"b",\u0432:"a",\u0433:"r",\u0434:"y",\u0435:"e",\u0436:"m",\u0437:"e",\u0438:"n",\u0439:"n",\u043A:"n",\u043B:"n",\u043C:"m",\u043D:"n",\u043E:"o",\u043F:"n",\u0440:"p",\u0441:"c",\u0442:"o",\u0443:"y",\u0444:"b",\u0445:"x",\u0446:"n",\u0447:"n",\u0448:"w",\u0449:"w",\u044A:"a",\u044B:"m",\u044C:"a",\u044D:"e",\u044E:"m",\u044F:"r"};o(_G,"setFontMetrics");o(nA,"getCharacterMetrics");R7={};o(X4e,"getGlobalMetrics");j4e=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],Qz=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],Zz=o(function(e,r){return r.size<2?e:j4e[e-1][r.size-1]},"sizeAtStyle"),w3=class t{static{o(this,"Options")}constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||t.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=Qz[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var r={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return new t(r)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:Zz(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:Qz[e-1]})}havingBaseStyle(e){e=e||this.style.text();var r=Zz(t.BASESIZE,e);return this.size===r&&this.textSize===t.BASESIZE&&this.style===e?this:this.extend({style:e,size:r})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==t.BASESIZE?["sizing","reset-size"+this.size,"size"+t.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=X4e(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}};w3.BASESIZE=6;W7={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:803/800,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:803/800},K4e={ex:!0,em:!0,mu:!0},DG=o(function(e){return typeof e!="string"&&(e=e.unit),e in W7||e in K4e||e==="ex"},"validUnit"),ni=o(function(e,r){var n;if(e.unit in W7)n=W7[e.unit]/r.fontMetrics().ptPerEm/r.sizeMultiplier;else if(e.unit==="mu")n=r.fontMetrics().cssEmPerMu;else{var i;if(r.style.isTight()?i=r.havingStyle(r.style.text()):i=r,e.unit==="ex")n=i.fontMetrics().xHeight;else if(e.unit==="em")n=i.fontMetrics().quad;else throw new pt("Invalid unit: '"+e.unit+"'");i!==r&&(n*=i.sizeMultiplier/r.sizeMultiplier)}return Math.min(e.number*n,r.maxSize)},"calculateSize"),Et=o(function(e){return+e.toFixed(4)+"em"},"makeEm"),vh=o(function(e){return e.filter(r=>r).join(" ")},"createClass"),LG=o(function(e,r,n){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=n||{},r){r.style.isTight()&&this.classes.push("mtight");var i=r.getColor();i&&(this.style.color=i)}},"initNode"),RG=o(function(e){var r=document.createElement(e);r.className=vh(this.classes);for(var n in this.style)this.style.hasOwnProperty(n)&&(r.style[n]=this.style[n]);for(var i in this.attributes)this.attributes.hasOwnProperty(i)&&r.setAttribute(i,this.attributes[i]);for(var a=0;a/=\x00-\x1f]/,NG=o(function(e){var r="<"+e;this.classes.length&&(r+=' class="'+Jt.escape(vh(this.classes))+'"');var n="";for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=Jt.hyphenate(i)+":"+this.style[i]+";");n&&(r+=' style="'+Jt.escape(n)+'"');for(var a in this.attributes)if(this.attributes.hasOwnProperty(a)){if(Q4e.test(a))throw new pt("Invalid attribute name '"+a+"'");r+=" "+a+'="'+Jt.escape(this.attributes[a])+'"'}r+=">";for(var s=0;s",r},"toMarkup"),ld=class{static{o(this,"Span")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,LG.call(this,e,n,i),this.children=r||[]}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return RG.call(this,"span")}toMarkup(){return NG.call(this,"span")}},Zy=class{static{o(this,"Anchor")}constructor(e,r,n,i){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,LG.call(this,r,i),this.children=n||[],this.setAttribute("href",e)}setAttribute(e,r){this.attributes[e]=r}hasClass(e){return Jt.contains(this.classes,e)}toNode(){return RG.call(this,"a")}toMarkup(){return NG.call(this,"a")}},q7=class{static{o(this,"Img")}constructor(e,r,n){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=r,this.src=e,this.classes=["mord"],this.style=n}hasClass(e){return Jt.contains(this.classes,e)}toNode(){var e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(var r in this.style)this.style.hasOwnProperty(r)&&(e.style[r]=this.style[r]);return e}toMarkup(){var e=''+Jt.escape(this.alt)+'0&&(r=document.createElement("span"),r.style.marginRight=Et(this.italic)),this.classes.length>0&&(r=r||document.createElement("span"),r.className=vh(this.classes));for(var n in this.style)this.style.hasOwnProperty(n)&&(r=r||document.createElement("span"),r.style[n]=this.style[n]);return r?(r.appendChild(e),r):e}toMarkup(){var e=!1,r="0&&(n+="margin-right:"+this.italic+"em;");for(var i in this.style)this.style.hasOwnProperty(i)&&(n+=Jt.hyphenate(i)+":"+this.style[i]+";");n&&(e=!0,r+=' style="'+Jt.escape(n)+'"');var a=Jt.escape(this.text);return e?(r+=">",r+=a,r+="",r):a}},dl=class{static{o(this,"SvgNode")}constructor(e,r){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=r||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"svg");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);for(var i=0;i':''}},Jy=class{static{o(this,"LineNode")}constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e="http://www.w3.org/2000/svg",r=document.createElementNS(e,"line");for(var n in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,n)&&r.setAttribute(n,this.attributes[n]);return r}toMarkup(){var e="","\\gt",!0);G(H,re,Ee,"\u2208","\\in",!0);G(H,re,Ee,"\uE020","\\@not");G(H,re,Ee,"\u2282","\\subset",!0);G(H,re,Ee,"\u2283","\\supset",!0);G(H,re,Ee,"\u2286","\\subseteq",!0);G(H,re,Ee,"\u2287","\\supseteq",!0);G(H,ke,Ee,"\u2288","\\nsubseteq",!0);G(H,ke,Ee,"\u2289","\\nsupseteq",!0);G(H,re,Ee,"\u22A8","\\models");G(H,re,Ee,"\u2190","\\leftarrow",!0);G(H,re,Ee,"\u2264","\\le");G(H,re,Ee,"\u2264","\\leq",!0);G(H,re,Ee,"<","\\lt",!0);G(H,re,Ee,"\u2192","\\rightarrow",!0);G(H,re,Ee,"\u2192","\\to");G(H,ke,Ee,"\u2271","\\ngeq",!0);G(H,ke,Ee,"\u2270","\\nleq",!0);G(H,re,pu,"\xA0","\\ ");G(H,re,pu,"\xA0","\\space");G(H,re,pu,"\xA0","\\nobreakspace");G(it,re,pu,"\xA0","\\ ");G(it,re,pu,"\xA0"," ");G(it,re,pu,"\xA0","\\space");G(it,re,pu,"\xA0","\\nobreakspace");G(H,re,pu,null,"\\nobreak");G(H,re,pu,null,"\\allowbreak");G(H,re,D3,",",",");G(H,re,D3,";",";");G(H,ke,It,"\u22BC","\\barwedge",!0);G(H,ke,It,"\u22BB","\\veebar",!0);G(H,re,It,"\u2299","\\odot",!0);G(H,re,It,"\u2295","\\oplus",!0);G(H,re,It,"\u2297","\\otimes",!0);G(H,re,Re,"\u2202","\\partial",!0);G(H,re,It,"\u2298","\\oslash",!0);G(H,ke,It,"\u229A","\\circledcirc",!0);G(H,ke,It,"\u22A1","\\boxdot",!0);G(H,re,It,"\u25B3","\\bigtriangleup");G(H,re,It,"\u25BD","\\bigtriangledown");G(H,re,It,"\u2020","\\dagger");G(H,re,It,"\u22C4","\\diamond");G(H,re,It,"\u22C6","\\star");G(H,re,It,"\u25C3","\\triangleleft");G(H,re,It,"\u25B9","\\triangleright");G(H,re,Zs,"{","\\{");G(it,re,Re,"{","\\{");G(it,re,Re,"{","\\textbraceleft");G(H,re,ns,"}","\\}");G(it,re,Re,"}","\\}");G(it,re,Re,"}","\\textbraceright");G(H,re,Zs,"{","\\lbrace");G(H,re,ns,"}","\\rbrace");G(H,re,Zs,"[","\\lbrack",!0);G(it,re,Re,"[","\\lbrack",!0);G(H,re,ns,"]","\\rbrack",!0);G(it,re,Re,"]","\\rbrack",!0);G(H,re,Zs,"(","\\lparen",!0);G(H,re,ns,")","\\rparen",!0);G(it,re,Re,"<","\\textless",!0);G(it,re,Re,">","\\textgreater",!0);G(H,re,Zs,"\u230A","\\lfloor",!0);G(H,re,ns,"\u230B","\\rfloor",!0);G(H,re,Zs,"\u2308","\\lceil",!0);G(H,re,ns,"\u2309","\\rceil",!0);G(H,re,Re,"\\","\\backslash");G(H,re,Re,"\u2223","|");G(H,re,Re,"\u2223","\\vert");G(it,re,Re,"|","\\textbar",!0);G(H,re,Re,"\u2225","\\|");G(H,re,Re,"\u2225","\\Vert");G(it,re,Re,"\u2225","\\textbardbl");G(it,re,Re,"~","\\textasciitilde");G(it,re,Re,"\\","\\textbackslash");G(it,re,Re,"^","\\textasciicircum");G(H,re,Ee,"\u2191","\\uparrow",!0);G(H,re,Ee,"\u21D1","\\Uparrow",!0);G(H,re,Ee,"\u2193","\\downarrow",!0);G(H,re,Ee,"\u21D3","\\Downarrow",!0);G(H,re,Ee,"\u2195","\\updownarrow",!0);G(H,re,Ee,"\u21D5","\\Updownarrow",!0);G(H,re,Ci,"\u2210","\\coprod");G(H,re,Ci,"\u22C1","\\bigvee");G(H,re,Ci,"\u22C0","\\bigwedge");G(H,re,Ci,"\u2A04","\\biguplus");G(H,re,Ci,"\u22C2","\\bigcap");G(H,re,Ci,"\u22C3","\\bigcup");G(H,re,Ci,"\u222B","\\int");G(H,re,Ci,"\u222B","\\intop");G(H,re,Ci,"\u222C","\\iint");G(H,re,Ci,"\u222D","\\iiint");G(H,re,Ci,"\u220F","\\prod");G(H,re,Ci,"\u2211","\\sum");G(H,re,Ci,"\u2A02","\\bigotimes");G(H,re,Ci,"\u2A01","\\bigoplus");G(H,re,Ci,"\u2A00","\\bigodot");G(H,re,Ci,"\u222E","\\oint");G(H,re,Ci,"\u222F","\\oiint");G(H,re,Ci,"\u2230","\\oiiint");G(H,re,Ci,"\u2A06","\\bigsqcup");G(H,re,Ci,"\u222B","\\smallint");G(it,re,E0,"\u2026","\\textellipsis");G(H,re,E0,"\u2026","\\mathellipsis");G(it,re,E0,"\u2026","\\ldots",!0);G(H,re,E0,"\u2026","\\ldots",!0);G(H,re,E0,"\u22EF","\\@cdots",!0);G(H,re,E0,"\u22F1","\\ddots",!0);G(H,re,Re,"\u22EE","\\varvdots");G(it,re,Re,"\u22EE","\\varvdots");G(H,re,Hn,"\u02CA","\\acute");G(H,re,Hn,"\u02CB","\\grave");G(H,re,Hn,"\xA8","\\ddot");G(H,re,Hn,"~","\\tilde");G(H,re,Hn,"\u02C9","\\bar");G(H,re,Hn,"\u02D8","\\breve");G(H,re,Hn,"\u02C7","\\check");G(H,re,Hn,"^","\\hat");G(H,re,Hn,"\u20D7","\\vec");G(H,re,Hn,"\u02D9","\\dot");G(H,re,Hn,"\u02DA","\\mathring");G(H,re,rr,"\uE131","\\@imath");G(H,re,rr,"\uE237","\\@jmath");G(H,re,Re,"\u0131","\u0131");G(H,re,Re,"\u0237","\u0237");G(it,re,Re,"\u0131","\\i",!0);G(it,re,Re,"\u0237","\\j",!0);G(it,re,Re,"\xDF","\\ss",!0);G(it,re,Re,"\xE6","\\ae",!0);G(it,re,Re,"\u0153","\\oe",!0);G(it,re,Re,"\xF8","\\o",!0);G(it,re,Re,"\xC6","\\AE",!0);G(it,re,Re,"\u0152","\\OE",!0);G(it,re,Re,"\xD8","\\O",!0);G(it,re,Hn,"\u02CA","\\'");G(it,re,Hn,"\u02CB","\\`");G(it,re,Hn,"\u02C6","\\^");G(it,re,Hn,"\u02DC","\\~");G(it,re,Hn,"\u02C9","\\=");G(it,re,Hn,"\u02D8","\\u");G(it,re,Hn,"\u02D9","\\.");G(it,re,Hn,"\xB8","\\c");G(it,re,Hn,"\u02DA","\\r");G(it,re,Hn,"\u02C7","\\v");G(it,re,Hn,"\xA8",'\\"');G(it,re,Hn,"\u02DD","\\H");G(it,re,Hn,"\u25EF","\\textcircled");MG={"--":!0,"---":!0,"``":!0,"''":!0};G(it,re,Re,"\u2013","--",!0);G(it,re,Re,"\u2013","\\textendash");G(it,re,Re,"\u2014","---",!0);G(it,re,Re,"\u2014","\\textemdash");G(it,re,Re,"\u2018","`",!0);G(it,re,Re,"\u2018","\\textquoteleft");G(it,re,Re,"\u2019","'",!0);G(it,re,Re,"\u2019","\\textquoteright");G(it,re,Re,"\u201C","``",!0);G(it,re,Re,"\u201C","\\textquotedblleft");G(it,re,Re,"\u201D","''",!0);G(it,re,Re,"\u201D","\\textquotedblright");G(H,re,Re,"\xB0","\\degree",!0);G(it,re,Re,"\xB0","\\degree");G(it,re,Re,"\xB0","\\textdegree",!0);G(H,re,Re,"\xA3","\\pounds");G(H,re,Re,"\xA3","\\mathsterling",!0);G(it,re,Re,"\xA3","\\pounds");G(it,re,Re,"\xA3","\\textsterling",!0);G(H,ke,Re,"\u2720","\\maltese");G(it,ke,Re,"\u2720","\\maltese");eG='0123456789/@."';for(u3=0;u30)return fl(a,h,i,r,s.concat(f));if(u){var d,p;if(u==="boldsymbol"){var m=i3e(a,i,r,s,n);d=m.fontName,p=[m.fontClass]}else l?(d=PG[u].fontName,p=[u]):(d=m3(u,r.fontWeight,r.fontShape),p=[u,r.fontWeight,r.fontShape]);if(L3(a,d,i).metrics)return fl(a,d,i,r,s.concat(p));if(MG.hasOwnProperty(a)&&d.slice(0,10)==="Typewriter"){for(var g=[],y=0;y{if(vh(t.classes)!==vh(e.classes)||t.skew!==e.skew||t.maxFontSize!==e.maxFontSize)return!1;if(t.classes.length===1){var r=t.classes[0];if(r==="mbin"||r==="mord")return!1}for(var n in t.style)if(t.style.hasOwnProperty(n)&&t.style[n]!==e.style[n])return!1;for(var i in e.style)if(e.style.hasOwnProperty(i)&&t.style[i]!==e.style[i])return!1;return!0},"canCombine"),o3e=o(t=>{for(var e=0;er&&(r=s.height),s.depth>n&&(n=s.depth),s.maxFontSize>i&&(i=s.maxFontSize)}e.height=r,e.depth=n,e.maxFontSize=i},"sizeElementFromChildren"),Cs=o(function(e,r,n,i){var a=new ld(e,r,n,i);return iA(a),a},"makeSpan"),IG=o((t,e,r,n)=>new ld(t,e,r,n),"makeSvgSpan"),l3e=o(function(e,r,n){var i=Cs([e],[],r);return i.height=Math.max(n||r.fontMetrics().defaultRuleThickness,r.minRuleThickness),i.style.borderBottomWidth=Et(i.height),i.maxFontSize=1,i},"makeLineSpan"),c3e=o(function(e,r,n,i){var a=new Zy(e,r,n,i);return iA(a),a},"makeAnchor"),OG=o(function(e){var r=new od(e);return iA(r),r},"makeFragment"),u3e=o(function(e,r){return e instanceof od?Cs([],[e],r):e},"wrapFragment"),h3e=o(function(e){if(e.positionType==="individualShift"){for(var r=e.children,n=[r[0]],i=-r[0].shift-r[0].elem.depth,a=i,s=1;s{var r=Cs(["mspace"],[],e),n=ni(t,e);return r.style.marginRight=Et(n),r},"makeGlue"),m3=o(function(e,r,n){var i="";switch(e){case"amsrm":i="AMS";break;case"textrm":i="Main";break;case"textsf":i="SansSerif";break;case"texttt":i="Typewriter";break;default:i=e}var a;return r==="textbf"&&n==="textit"?a="BoldItalic":r==="textbf"?a="Bold":r==="textit"?a="Italic":a="Regular",i+"-"+a},"retrieveTextFontName"),PG={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},BG={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},p3e=o(function(e,r){var[n,i,a]=BG[e],s=new ec(n),l=new dl([s],{width:Et(i),height:Et(a),style:"width:"+Et(i),viewBox:"0 0 "+1e3*i+" "+1e3*a,preserveAspectRatio:"xMinYMin"}),u=IG(["overlay"],[l],r);return u.height=a,u.style.height=Et(a),u.style.width=Et(i),u},"staticSvg"),Fe={fontMap:PG,makeSymbol:fl,mathsym:n3e,makeSpan:Cs,makeSvgSpan:IG,makeLineSpan:l3e,makeAnchor:c3e,makeFragment:OG,wrapFragment:u3e,makeVList:f3e,makeOrd:a3e,makeGlue:d3e,staticSvg:p3e,svgData:BG,tryCombineChars:o3e},ri={number:3,unit:"mu"},sd={number:4,unit:"mu"},cu={number:5,unit:"mu"},m3e={mord:{mop:ri,mbin:sd,mrel:cu,minner:ri},mop:{mord:ri,mop:ri,mrel:cu,minner:ri},mbin:{mord:sd,mop:sd,mopen:sd,minner:sd},mrel:{mord:cu,mop:cu,mopen:cu,minner:cu},mopen:{},mclose:{mop:ri,mbin:sd,mrel:cu,minner:ri},mpunct:{mord:ri,mop:ri,mrel:cu,mopen:ri,mclose:ri,mpunct:ri,minner:ri},minner:{mord:ri,mop:ri,mbin:sd,mrel:cu,mopen:ri,mpunct:ri,minner:ri}},g3e={mord:{mop:ri},mop:{mord:ri,mop:ri},mbin:{},mrel:{},mopen:{},mclose:{mop:ri},mpunct:{},minner:{mop:ri}},FG={},E3={},S3={};o(Nt,"defineFunction");o(cd,"defineFunctionBuilders");C3=o(function(e){return e.type==="ordgroup"&&e.body.length===1?e.body[0]:e},"normalizeArgument"),gi=o(function(e){return e.type==="ordgroup"?e.body:[e]},"ordargument"),fu=Fe.makeSpan,y3e=["leftmost","mbin","mopen","mrel","mop","mpunct"],v3e=["rightmost","mrel","mclose","mpunct"],x3e={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT},b3e={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},$i=o(function(e,r,n,i){i===void 0&&(i=[null,null]);for(var a=[],s=0;s{var v=y.classes[0],x=g.classes[0];v==="mbin"&&Jt.contains(v3e,x)?y.classes[0]="mord":x==="mbin"&&Jt.contains(y3e,v)&&(g.classes[0]="mord")},{node:d},p,m),nG(a,(g,y)=>{var v=X7(y),x=X7(g),b=v&&x?g.hasClass("mtight")?g3e[v][x]:m3e[v][x]:null;if(b)return Fe.makeGlue(b,h)},{node:d},p,m),a},"buildExpression"),nG=o(function t(e,r,n,i,a){i&&e.push(i);for(var s=0;sp=>{e.splice(d+1,0,p),s++})(s)}i&&e.pop()},"traverseNonSpaceNodes"),$G=o(function(e){return e instanceof od||e instanceof Zy||e instanceof ld&&e.hasClass("enclosing")?e:null},"checkPartialGroup"),T3e=o(function t(e,r){var n=$G(e);if(n){var i=n.children;if(i.length){if(r==="right")return t(i[i.length-1],"right");if(r==="left")return t(i[0],"left")}}return e},"getOutermostNode"),X7=o(function(e,r){return e?(r&&(e=T3e(e,r)),b3e[e.classes[0]]||null):null},"getTypeOfDomTree"),ev=o(function(e,r){var n=["nulldelimiter"].concat(e.baseSizingClasses());return fu(r.concat(n))},"makeNullDelimiter"),$r=o(function(e,r,n){if(!e)return fu();if(E3[e.type]){var i=E3[e.type](e,r);if(n&&r.size!==n.size){i=fu(r.sizingClasses(n),[i],r);var a=r.sizeMultiplier/n.sizeMultiplier;i.height*=a,i.depth*=a}return i}else throw new pt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(g3,"buildHTMLUnbreakable");o(j7,"buildHTML");o(zG,"newDocumentFragment");ts=class{static{o(this,"MathNode")}constructor(e,r,n){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=r||[],this.classes=n||[]}setAttribute(e,r){this.attributes[e]=r}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var r in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,r)&&e.setAttribute(r,this.attributes[r]);this.classes.length>0&&(e.className=vh(this.classes));for(var n=0;n0&&(e+=' class ="'+Jt.escape(vh(this.classes))+'"'),e+=">";for(var n=0;n",e}toText(){return this.children.map(e=>e.toText()).join("")}},Ao=class{static{o(this,"TextNode")}constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return Jt.escape(this.toText())}toText(){return this.text}},K7=class{static{o(this,"SpaceNode")}constructor(e){this.width=void 0,this.character=void 0,this.width=e,e>=.05555&&e<=.05556?this.character="\u200A":e>=.1666&&e<=.1667?this.character="\u2009":e>=.2222&&e<=.2223?this.character="\u2005":e>=.2777&&e<=.2778?this.character="\u2005\u200A":e>=-.05556&&e<=-.05555?this.character="\u200A\u2063":e>=-.1667&&e<=-.1666?this.character="\u2009\u2063":e>=-.2223&&e<=-.2222?this.character="\u205F\u2063":e>=-.2778&&e<=-.2777?this.character="\u2005\u2063":this.character=null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",Et(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},dt={MathNode:ts,TextNode:Ao,SpaceNode:K7,newDocumentFragment:zG},Do=o(function(e,r,n){return An[r][e]&&An[r][e].replace&&e.charCodeAt(0)!==55349&&!(MG.hasOwnProperty(e)&&n&&(n.fontFamily&&n.fontFamily.slice(4,6)==="tt"||n.font&&n.font.slice(4,6)==="tt"))&&(e=An[r][e].replace),new dt.TextNode(e)},"makeText"),aA=o(function(e){return e.length===1?e[0]:new dt.MathNode("mrow",e)},"makeRow"),sA=o(function(e,r){if(r.fontFamily==="texttt")return"monospace";if(r.fontFamily==="textsf")return r.fontShape==="textit"&&r.fontWeight==="textbf"?"sans-serif-bold-italic":r.fontShape==="textit"?"sans-serif-italic":r.fontWeight==="textbf"?"bold-sans-serif":"sans-serif";if(r.fontShape==="textit"&&r.fontWeight==="textbf")return"bold-italic";if(r.fontShape==="textit")return"italic";if(r.fontWeight==="textbf")return"bold";var n=r.font;if(!n||n==="mathnormal")return null;var i=e.mode;if(n==="mathit")return"italic";if(n==="boldsymbol")return e.type==="textord"?"bold":"bold-italic";if(n==="mathbf")return"bold";if(n==="mathbb")return"double-struck";if(n==="mathsfit")return"sans-serif-italic";if(n==="mathfrak")return"fraktur";if(n==="mathscr"||n==="mathcal")return"script";if(n==="mathsf")return"sans-serif";if(n==="mathtt")return"monospace";var a=e.text;if(Jt.contains(["\\imath","\\jmath"],a))return null;An[i][a]&&An[i][a].replace&&(a=An[i][a].replace);var s=Fe.fontMap[n].fontName;return nA(a,s,i)?Fe.fontMap[n].variant:null},"getVariant");o(I7,"isNumberPunctuation");_s=o(function(e,r,n){if(e.length===1){var i=vn(e[0],r);return n&&i instanceof ts&&i.type==="mo"&&(i.setAttribute("lspace","0em"),i.setAttribute("rspace","0em")),[i]}for(var a=[],s,l=0;l=1&&(s.type==="mn"||I7(s))){var h=u.children[0];h instanceof ts&&h.type==="mn"&&(h.children=[...s.children,...h.children],a.pop())}else if(s.type==="mi"&&s.children.length===1){var f=s.children[0];if(f instanceof Ao&&f.text==="\u0338"&&(u.type==="mo"||u.type==="mi"||u.type==="mn")){var d=u.children[0];d instanceof Ao&&d.text.length>0&&(d.text=d.text.slice(0,1)+"\u0338"+d.text.slice(1),a.pop())}}}a.push(u),s=u}return a},"buildExpression"),xh=o(function(e,r,n){return aA(_s(e,r,n))},"buildExpressionRow"),vn=o(function(e,r){if(!e)return new dt.MathNode("mrow");if(S3[e.type]){var n=S3[e.type](e,r);return n}else throw new pt("Got group of unknown type: '"+e.type+"'")},"buildGroup");o(iG,"buildMathML");GG=o(function(e){return new w3({style:e.displayMode?nr.DISPLAY:nr.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},"optionsFromSettings"),VG=o(function(e,r){if(r.displayMode){var n=["katex-display"];r.leqno&&n.push("leqno"),r.fleqn&&n.push("fleqn"),e=Fe.makeSpan(n,[e])}return e},"displayWrap"),w3e=o(function(e,r,n){var i=GG(n),a;if(n.output==="mathml")return iG(e,r,i,n.displayMode,!0);if(n.output==="html"){var s=j7(e,i);a=Fe.makeSpan(["katex"],[s])}else{var l=iG(e,r,i,n.displayMode,!1),u=j7(e,i);a=Fe.makeSpan(["katex"],[l,u])}return VG(a,n)},"buildTree"),k3e=o(function(e,r,n){var i=GG(n),a=j7(e,i),s=Fe.makeSpan(["katex"],[a]);return VG(s,n)},"buildHTMLTree"),E3e={widehat:"^",widecheck:"\u02C7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23DF",overbrace:"\u23DE",overgroup:"\u23E0",undergroup:"\u23E1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21D2",xRightarrow:"\u21D2",overleftharpoon:"\u21BC",xleftharpoonup:"\u21BC",overrightharpoon:"\u21C0",xrightharpoonup:"\u21C0",xLeftarrow:"\u21D0",xLeftrightarrow:"\u21D4",xhookleftarrow:"\u21A9",xhookrightarrow:"\u21AA",xmapsto:"\u21A6",xrightharpoondown:"\u21C1",xleftharpoondown:"\u21BD",xrightleftharpoons:"\u21CC",xleftrightharpoons:"\u21CB",xtwoheadleftarrow:"\u219E",xtwoheadrightarrow:"\u21A0",xlongequal:"=",xtofrom:"\u21C4",xrightleftarrows:"\u21C4",xrightequilibrium:"\u21CC",xleftequilibrium:"\u21CB","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},S3e=o(function(e){var r=new dt.MathNode("mo",[new dt.TextNode(E3e[e.replace(/^\\/,"")])]);return r.setAttribute("stretchy","true"),r},"mathMLnode"),C3e={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},A3e=o(function(e){return e.type==="ordgroup"?e.body.length:1},"groupLength"),_3e=o(function(e,r){function n(){var l=4e5,u=e.label.slice(1);if(Jt.contains(["widehat","widecheck","widetilde","utilde"],u)){var h=e,f=A3e(h.base),d,p,m;if(f>5)u==="widehat"||u==="widecheck"?(d=420,l=2364,m=.42,p=u+"4"):(d=312,l=2340,m=.34,p="tilde4");else{var g=[1,1,2,2,3,3][f];u==="widehat"||u==="widecheck"?(l=[0,1062,2364,2364,2364][g],d=[0,239,300,360,420][g],m=[0,.24,.3,.3,.36,.42][g],p=u+g):(l=[0,600,1033,2339,2340][g],d=[0,260,286,306,312][g],m=[0,.26,.286,.3,.306,.34][g],p="tilde"+g)}var y=new ec(p),v=new dl([y],{width:"100%",height:Et(m),viewBox:"0 0 "+l+" "+d,preserveAspectRatio:"none"});return{span:Fe.makeSvgSpan([],[v],r),minWidth:0,height:m}}else{var x=[],b=C3e[u],[T,S,w]=b,E=w/1e3,_=T.length,C,D;if(_===1){var O=b[3];C=["hide-tail"],D=[O]}else if(_===2)C=["halfarrow-left","halfarrow-right"],D=["xMinYMin","xMaxYMin"];else if(_===3)C=["brace-left","brace-center","brace-right"],D=["xMinYMin","xMidYMin","xMaxYMin"];else throw new Error(`Correct katexImagesData or update code here to support - `+_+" children.");for(var R=0;R<_;R++){var k=new ec(T[R]),L=new dl([k],{width:"400em",height:Et(E),viewBox:"0 0 "+l+" "+w,preserveAspectRatio:D[R]+" slice"}),A=Fe.makeSvgSpan([C[R]],[L],r);if(_===1)return{span:A,minWidth:S,height:E};A.style.height=Et(E),x.push(A)}return{span:Fe.makeSpan(["stretchy"],x,r),minWidth:S,height:E}}}o(n,"buildSvgSpan_");var{span:i,minWidth:a,height:s}=n();return i.height=s,i.style.height=Et(s),a>0&&(i.style.minWidth=Et(a)),i},"svgSpan"),D3e=o(function(e,r,n,i,a){var s,l=e.height+e.depth+n+i;if(/fbox|color|angl/.test(r)){if(s=Fe.makeSpan(["stretchy",r],[],a),r==="fbox"){var u=a.color&&a.getColor();u&&(s.style.borderColor=u)}}else{var h=[];/^[bx]cancel$/.test(r)&&h.push(new Jy({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(r)&&h.push(new Jy({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var f=new dl(h,{width:"100%",height:Et(l)});s=Fe.makeSvgSpan([],[f],a)}return s.height=l,s.style.height=Et(l),s},"encloseSpan"),du={encloseSpan:D3e,mathMLnode:S3e,svgSpan:_3e};o(xr,"assertNodeType");o(oA,"assertSymbolNodeType");o(R3,"checkSymbolNodeType");lA=o((t,e)=>{var r,n,i;t&&t.type==="supsub"?(n=xr(t.base,"accent"),r=n.base,t.base=r,i=J4e($r(t,e)),t.base=n):(n=xr(t,"accent"),r=n.base);var a=$r(r,e.havingCrampedStyle()),s=n.isShifty&&Jt.isCharacterBox(r),l=0;if(s){var u=Jt.getBaseElem(r),h=$r(u,e.havingCrampedStyle());l=Jz(h).skew}var f=n.label==="\\c",d=f?a.height+a.depth:Math.min(a.height,e.fontMetrics().xHeight),p;if(n.isStretchy)p=du.svgSpan(n,e),p=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"elem",elem:p,wrapperClasses:["svg-align"],wrapperStyle:l>0?{width:"calc(100% - "+Et(2*l)+")",marginLeft:Et(2*l)}:void 0}]},e);else{var m,g;n.label==="\\vec"?(m=Fe.staticSvg("vec",e),g=Fe.svgData.vec[1]):(m=Fe.makeOrd({mode:n.mode,text:n.label},e,"textord"),m=Jz(m),m.italic=0,g=m.width,f&&(d+=m.depth)),p=Fe.makeSpan(["accent-body"],[m]);var y=n.label==="\\textcircled";y&&(p.classes.push("accent-full"),d=a.height);var v=l;y||(v-=g/2),p.style.left=Et(v),n.label==="\\textcircled"&&(p.style.top=".2em"),p=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:-d},{type:"elem",elem:p}]},e)}var x=Fe.makeSpan(["mord","accent"],[p],e);return i?(i.children[0]=x,i.height=Math.max(x.height,i.height),i.classes[0]="mord",i):x},"htmlBuilder$a"),UG=o((t,e)=>{var r=t.isStretchy?du.mathMLnode(t.label):new dt.MathNode("mo",[Do(t.label,t.mode)]),n=new dt.MathNode("mover",[vn(t.base,e),r]);return n.setAttribute("accent","true"),n},"mathmlBuilder$9"),L3e=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(t=>"\\"+t).join("|"));Nt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:o((t,e)=>{var r=C3(e[0]),n=!L3e.test(t.funcName),i=!n||t.funcName==="\\widehat"||t.funcName==="\\widetilde"||t.funcName==="\\widecheck";return{type:"accent",mode:t.parser.mode,label:t.funcName,isStretchy:n,isShifty:i,base:r}},"handler"),htmlBuilder:lA,mathmlBuilder:UG});Nt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:o((t,e)=>{var r=e[0],n=t.parser.mode;return n==="math"&&(t.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+t.funcName+" works only in text mode"),n="text"),{type:"accent",mode:n,label:t.funcName,isStretchy:!1,isShifty:!0,base:r}},"handler"),htmlBuilder:lA,mathmlBuilder:UG});Nt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"accentUnder",mode:r.mode,label:n,base:i}},"handler"),htmlBuilder:o((t,e)=>{var r=$r(t.base,e),n=du.svgSpan(t,e),i=t.label==="\\utilde"?.12:0,a=Fe.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:i},{type:"elem",elem:r}]},e);return Fe.makeSpan(["mord","accentunder"],[a],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=du.mathMLnode(t.label),n=new dt.MathNode("munder",[vn(t.base,e),r]);return n.setAttribute("accentunder","true"),n},"mathmlBuilder")});y3=o(t=>{var e=new dt.MathNode("mpadded",t?[t]:[]);return e.setAttribute("width","+0.6em"),e.setAttribute("lspace","0.3em"),e},"paddedNode");Nt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n,funcName:i}=t;return{type:"xArrow",mode:n.mode,label:i,body:e[0],below:r[0]}},htmlBuilder(t,e){var r=e.style,n=e.havingStyle(r.sup()),i=Fe.wrapFragment($r(t.body,n,e),e),a=t.label.slice(0,2)==="\\x"?"x":"cd";i.classes.push(a+"-arrow-pad");var s;t.below&&(n=e.havingStyle(r.sub()),s=Fe.wrapFragment($r(t.below,n,e),e),s.classes.push(a+"-arrow-pad"));var l=du.svgSpan(t,e),u=-e.fontMetrics().axisHeight+.5*l.height,h=-e.fontMetrics().axisHeight-.5*l.height-.111;(i.depth>.25||t.label==="\\xleftequilibrium")&&(h-=i.depth);var f;if(s){var d=-e.fontMetrics().axisHeight+s.height+.5*l.height+.111;f=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u},{type:"elem",elem:s,shift:d}]},e)}else f=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:h},{type:"elem",elem:l,shift:u}]},e);return f.children[0].children[0].children[1].classes.push("svg-align"),Fe.makeSpan(["mrel","x-arrow"],[f],e)},mathmlBuilder(t,e){var r=du.mathMLnode(t.label);r.setAttribute("minsize",t.label.charAt(0)==="x"?"1.75em":"3.0em");var n;if(t.body){var i=y3(vn(t.body,e));if(t.below){var a=y3(vn(t.below,e));n=new dt.MathNode("munderover",[r,a,i])}else n=new dt.MathNode("mover",[r,i])}else if(t.below){var s=y3(vn(t.below,e));n=new dt.MathNode("munder",[r,s])}else n=y3(),n=new dt.MathNode("mover",[r,n]);return n}});R3e=Fe.makeSpan;o(HG,"htmlBuilder$9");o(WG,"mathmlBuilder$8");Nt({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"mclass",mode:r.mode,mclass:"m"+n.slice(5),body:gi(i),isCharacterBox:Jt.isCharacterBox(i)}},htmlBuilder:HG,mathmlBuilder:WG});N3=o(t=>{var e=t.type==="ordgroup"&&t.body.length?t.body[0]:t;return e.type==="atom"&&(e.family==="bin"||e.family==="rel")?"m"+e.family:"mord"},"binrelClass");Nt({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(t,e){var{parser:r}=t;return{type:"mclass",mode:r.mode,mclass:N3(e[0]),body:gi(e[1]),isCharacterBox:Jt.isCharacterBox(e[1])}}});Nt({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(t,e){var{parser:r,funcName:n}=t,i=e[1],a=e[0],s;n!=="\\stackrel"?s=N3(i):s="mrel";var l={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:n!=="\\stackrel",body:gi(i)},u={type:"supsub",mode:a.mode,base:l,sup:n==="\\underset"?null:a,sub:n==="\\underset"?a:null};return{type:"mclass",mode:r.mode,mclass:s,body:[u],isCharacterBox:Jt.isCharacterBox(u)}},htmlBuilder:HG,mathmlBuilder:WG});Nt({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"pmb",mode:r.mode,mclass:N3(e[0]),body:gi(e[0])}},htmlBuilder(t,e){var r=$i(t.body,e,!0),n=Fe.makeSpan([t.mclass],r,e);return n.style.textShadow="0.02em 0.01em 0.04px",n},mathmlBuilder(t,e){var r=_s(t.body,e),n=new dt.MathNode("mstyle",r);return n.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),n}});N3e={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},aG=o(()=>({type:"styling",body:[],mode:"math",style:"display"}),"newCell"),sG=o(t=>t.type==="textord"&&t.text==="@","isStartOfArrow"),M3e=o((t,e)=>(t.type==="mathord"||t.type==="atom")&&t.text===e,"isLabelEnd");o(I3e,"cdArrow");o(O3e,"parseCD");Nt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:e[0]}},htmlBuilder(t,e){var r=e.havingStyle(e.style.sup()),n=Fe.wrapFragment($r(t.label,r,e),e);return n.classes.push("cd-label-"+t.side),n.style.bottom=Et(.8-n.depth),n.height=0,n.depth=0,n},mathmlBuilder(t,e){var r=new dt.MathNode("mrow",[vn(t.label,e)]);return r=new dt.MathNode("mpadded",[r]),r.setAttribute("width","0"),t.side==="left"&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new dt.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}});Nt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(t,e){var{parser:r}=t;return{type:"cdlabelparent",mode:r.mode,fragment:e[0]}},htmlBuilder(t,e){var r=Fe.wrapFragment($r(t.fragment,e),e);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder(t,e){return new dt.MathNode("mrow",[vn(t.fragment,e)])}});Nt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(t,e){for(var{parser:r}=t,n=xr(e[0],"ordgroup"),i=n.body,a="",s=0;s=1114111)throw new pt("\\@char with invalid code point "+a);return u<=65535?h=String.fromCharCode(u):(u-=65536,h=String.fromCharCode((u>>10)+55296,(u&1023)+56320)),{type:"textord",mode:r.mode,text:h}}});qG=o((t,e)=>{var r=$i(t.body,e.withColor(t.color),!1);return Fe.makeFragment(r)},"htmlBuilder$8"),YG=o((t,e)=>{var r=_s(t.body,e.withColor(t.color)),n=new dt.MathNode("mstyle",r);return n.setAttribute("mathcolor",t.color),n},"mathmlBuilder$7");Nt({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(t,e){var{parser:r}=t,n=xr(e[0],"color-token").color,i=e[1];return{type:"color",mode:r.mode,color:n,body:gi(i)}},htmlBuilder:qG,mathmlBuilder:YG});Nt({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(t,e){var{parser:r,breakOnTokenText:n}=t,i=xr(e[0],"color-token").color;r.gullet.macros.set("\\current@color",i);var a=r.parseExpression(!0,n);return{type:"color",mode:r.mode,color:i,body:a}},htmlBuilder:qG,mathmlBuilder:YG});Nt({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(t,e,r){var{parser:n}=t,i=n.gullet.future().text==="["?n.parseSizeGroup(!0):null,a=!n.settings.displayMode||!n.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:n.mode,newLine:a,size:i&&xr(i,"size").value}},htmlBuilder(t,e){var r=Fe.makeSpan(["mspace"],[],e);return t.newLine&&(r.classes.push("newline"),t.size&&(r.style.marginTop=Et(ni(t.size,e)))),r},mathmlBuilder(t,e){var r=new dt.MathNode("mspace");return t.newLine&&(r.setAttribute("linebreak","newline"),t.size&&r.setAttribute("height",Et(ni(t.size,e)))),r}});Q7={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},XG=o(t=>{var e=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(e))throw new pt("Expected a control sequence",t);return e},"checkControlSequence"),P3e=o(t=>{var e=t.gullet.popToken();return e.text==="="&&(e=t.gullet.popToken(),e.text===" "&&(e=t.gullet.popToken())),e},"getRHS"),jG=o((t,e,r,n)=>{var i=t.gullet.macros.get(r.text);i==null&&(r.noexpand=!0,i={tokens:[r],numArgs:0,unexpandable:!t.gullet.isExpandable(r.text)}),t.gullet.macros.set(e,i,n)},"letCommand");Nt({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(t){var{parser:e,funcName:r}=t;e.consumeSpaces();var n=e.fetch();if(Q7[n.text])return(r==="\\global"||r==="\\\\globallong")&&(n.text=Q7[n.text]),xr(e.parseFunction(),"internal");throw new pt("Invalid token after macro prefix",n)}});Nt({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=e.gullet.popToken(),i=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(i))throw new pt("Expected a control sequence",n);for(var a=0,s,l=[[]];e.gullet.future().text!=="{";)if(n=e.gullet.popToken(),n.text==="#"){if(e.gullet.future().text==="{"){s=e.gullet.future(),l[a].push("{");break}if(n=e.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new pt('Invalid argument number "'+n.text+'"');if(parseInt(n.text)!==a+1)throw new pt('Argument number "'+n.text+'" out of order');a++,l.push([])}else{if(n.text==="EOF")throw new pt("Expected a macro definition");l[a].push(n.text)}var{tokens:u}=e.gullet.consumeArg();return s&&u.unshift(s),(r==="\\edef"||r==="\\xdef")&&(u=e.gullet.expandTokens(u),u.reverse()),e.gullet.macros.set(i,{tokens:u,numArgs:a,delimiters:l},r===Q7[r]),{type:"internal",mode:e.mode}}});Nt({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=XG(e.gullet.popToken());e.gullet.consumeSpaces();var i=P3e(e);return jG(e,n,i,r==="\\\\globallet"),{type:"internal",mode:e.mode}}});Nt({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t){var{parser:e,funcName:r}=t,n=XG(e.gullet.popToken()),i=e.gullet.popToken(),a=e.gullet.popToken();return jG(e,n,a,r==="\\\\globalfuture"),e.gullet.pushToken(a),e.gullet.pushToken(i),{type:"internal",mode:e.mode}}});Yy=o(function(e,r,n){var i=An.math[e]&&An.math[e].replace,a=nA(i||e,r,n);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+r+".");return a},"getMetrics"),cA=o(function(e,r,n,i){var a=n.havingBaseStyle(r),s=Fe.makeSpan(i.concat(a.sizingClasses(n)),[e],n),l=a.sizeMultiplier/n.sizeMultiplier;return s.height*=l,s.depth*=l,s.maxFontSize=a.sizeMultiplier,s},"styleWrap"),KG=o(function(e,r,n){var i=r.havingBaseStyle(n),a=(1-r.sizeMultiplier/i.sizeMultiplier)*r.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=Et(a),e.height-=a,e.depth+=a},"centerSpan"),B3e=o(function(e,r,n,i,a,s){var l=Fe.makeSymbol(e,"Main-Regular",a,i),u=cA(l,r,i,s);return n&&KG(u,i,r),u},"makeSmallDelim"),F3e=o(function(e,r,n,i){return Fe.makeSymbol(e,"Size"+r+"-Regular",n,i)},"mathrmSize"),QG=o(function(e,r,n,i,a,s){var l=F3e(e,r,a,i),u=cA(Fe.makeSpan(["delimsizing","size"+r],[l],i),nr.TEXT,i,s);return n&&KG(u,i,nr.TEXT),u},"makeLargeDelim"),O7=o(function(e,r,n){var i;r==="Size1-Regular"?i="delim-size1":i="delim-size4";var a=Fe.makeSpan(["delimsizinginner",i],[Fe.makeSpan([],[Fe.makeSymbol(e,r,n)])]);return{type:"elem",elem:a}},"makeGlyphSpan"),P7=o(function(e,r,n){var i=Jl["Size4-Regular"][e.charCodeAt(0)]?Jl["Size4-Regular"][e.charCodeAt(0)][4]:Jl["Size1-Regular"][e.charCodeAt(0)][4],a=new ec("inner",q4e(e,Math.round(1e3*r))),s=new dl([a],{width:Et(i),height:Et(r),style:"width:"+Et(i),viewBox:"0 0 "+1e3*i+" "+Math.round(1e3*r),preserveAspectRatio:"xMinYMin"}),l=Fe.makeSvgSpan([],[s],n);return l.height=r,l.style.height=Et(r),l.style.width=Et(i),{type:"elem",elem:l}},"makeInner"),Z7=.008,v3={type:"kern",size:-1*Z7},$3e=["|","\\lvert","\\rvert","\\vert"],z3e=["\\|","\\lVert","\\rVert","\\Vert"],ZG=o(function(e,r,n,i,a,s){var l,u,h,f,d="",p=0;l=h=f=e,u=null;var m="Size1-Regular";e==="\\uparrow"?h=f="\u23D0":e==="\\Uparrow"?h=f="\u2016":e==="\\downarrow"?l=h="\u23D0":e==="\\Downarrow"?l=h="\u2016":e==="\\updownarrow"?(l="\\uparrow",h="\u23D0",f="\\downarrow"):e==="\\Updownarrow"?(l="\\Uparrow",h="\u2016",f="\\Downarrow"):Jt.contains($3e,e)?(h="\u2223",d="vert",p=333):Jt.contains(z3e,e)?(h="\u2225",d="doublevert",p=556):e==="["||e==="\\lbrack"?(l="\u23A1",h="\u23A2",f="\u23A3",m="Size4-Regular",d="lbrack",p=667):e==="]"||e==="\\rbrack"?(l="\u23A4",h="\u23A5",f="\u23A6",m="Size4-Regular",d="rbrack",p=667):e==="\\lfloor"||e==="\u230A"?(h=l="\u23A2",f="\u23A3",m="Size4-Regular",d="lfloor",p=667):e==="\\lceil"||e==="\u2308"?(l="\u23A1",h=f="\u23A2",m="Size4-Regular",d="lceil",p=667):e==="\\rfloor"||e==="\u230B"?(h=l="\u23A5",f="\u23A6",m="Size4-Regular",d="rfloor",p=667):e==="\\rceil"||e==="\u2309"?(l="\u23A4",h=f="\u23A5",m="Size4-Regular",d="rceil",p=667):e==="("||e==="\\lparen"?(l="\u239B",h="\u239C",f="\u239D",m="Size4-Regular",d="lparen",p=875):e===")"||e==="\\rparen"?(l="\u239E",h="\u239F",f="\u23A0",m="Size4-Regular",d="rparen",p=875):e==="\\{"||e==="\\lbrace"?(l="\u23A7",u="\u23A8",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\}"||e==="\\rbrace"?(l="\u23AB",u="\u23AC",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lgroup"||e==="\u27EE"?(l="\u23A7",f="\u23A9",h="\u23AA",m="Size4-Regular"):e==="\\rgroup"||e==="\u27EF"?(l="\u23AB",f="\u23AD",h="\u23AA",m="Size4-Regular"):e==="\\lmoustache"||e==="\u23B0"?(l="\u23A7",f="\u23AD",h="\u23AA",m="Size4-Regular"):(e==="\\rmoustache"||e==="\u23B1")&&(l="\u23AB",f="\u23A9",h="\u23AA",m="Size4-Regular");var g=Yy(l,m,a),y=g.height+g.depth,v=Yy(h,m,a),x=v.height+v.depth,b=Yy(f,m,a),T=b.height+b.depth,S=0,w=1;if(u!==null){var E=Yy(u,m,a);S=E.height+E.depth,w=2}var _=y+T+S,C=Math.max(0,Math.ceil((r-_)/(w*x))),D=_+C*w*x,O=i.fontMetrics().axisHeight;n&&(O*=i.sizeMultiplier);var R=D/2-O,k=[];if(d.length>0){var L=D-y-T,A=Math.round(D*1e3),I=Y4e(d,Math.round(L*1e3)),M=new ec(d,I),P=(p/1e3).toFixed(3)+"em",B=(A/1e3).toFixed(3)+"em",F=new dl([M],{width:P,height:B,viewBox:"0 0 "+p+" "+A}),z=Fe.makeSvgSpan([],[F],i);z.height=A/1e3,z.style.width=P,z.style.height=B,k.push({type:"elem",elem:z})}else{if(k.push(O7(f,m,a)),k.push(v3),u===null){var $=D-y-T+2*Z7;k.push(P7(h,$,i))}else{var U=(D-y-T-S)/2+2*Z7;k.push(P7(h,U,i)),k.push(v3),k.push(O7(u,m,a)),k.push(v3),k.push(P7(h,U,i))}k.push(v3),k.push(O7(l,m,a))}var K=i.havingBaseStyle(nr.TEXT),ee=Fe.makeVList({positionType:"bottom",positionData:R,children:k},K);return cA(Fe.makeSpan(["delimsizing","mult"],[ee],K),nr.TEXT,i,s)},"makeStackedDelim"),B7=80,F7=.08,$7=o(function(e,r,n,i,a){var s=W4e(e,i,n),l=new ec(e,s),u=new dl([l],{width:"400em",height:Et(r),viewBox:"0 0 400000 "+n,preserveAspectRatio:"xMinYMin slice"});return Fe.makeSvgSpan(["hide-tail"],[u],a)},"sqrtSvg"),G3e=o(function(e,r){var n=r.havingBaseSizing(),i=rV("\\surd",e*n.sizeMultiplier,tV,n),a=n.sizeMultiplier,s=Math.max(0,r.minRuleThickness-r.fontMetrics().sqrtRuleThickness),l,u=0,h=0,f=0,d;return i.type==="small"?(f=1e3+1e3*s+B7,e<1?a=1:e<1.4&&(a=.7),u=(1+s+F7)/a,h=(1+s)/a,l=$7("sqrtMain",u,f,s,r),l.style.minWidth="0.853em",d=.833/a):i.type==="large"?(f=(1e3+B7)*jy[i.size],h=(jy[i.size]+s)/a,u=(jy[i.size]+s+F7)/a,l=$7("sqrtSize"+i.size,u,f,s,r),l.style.minWidth="1.02em",d=1/a):(u=e+s+F7,h=e+s,f=Math.floor(1e3*e+s)+B7,l=$7("sqrtTall",u,f,s,r),l.style.minWidth="0.742em",d=1.056),l.height=h,l.style.height=Et(u),{span:l,advanceWidth:d,ruleWidth:(r.fontMetrics().sqrtRuleThickness+s)*a}},"makeSqrtImage"),JG=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","\\surd"],V3e=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1"],eV=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],jy=[0,1.2,1.8,2.4,3],U3e=o(function(e,r,n,i,a){if(e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle"),Jt.contains(JG,e)||Jt.contains(eV,e))return QG(e,r,!1,n,i,a);if(Jt.contains(V3e,e))return ZG(e,jy[r],!1,n,i,a);throw new pt("Illegal delimiter: '"+e+"'")},"makeSizedDelim"),H3e=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],W3e=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"stack"}],tV=[{type:"small",style:nr.SCRIPTSCRIPT},{type:"small",style:nr.SCRIPT},{type:"small",style:nr.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],q3e=o(function(e){if(e.type==="small")return"Main-Regular";if(e.type==="large")return"Size"+e.size+"-Regular";if(e.type==="stack")return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},"delimTypeToFont"),rV=o(function(e,r,n,i){for(var a=Math.min(2,3-i.style.size),s=a;sr)return n[s]}return n[n.length-1]},"traverseSequence"),nV=o(function(e,r,n,i,a,s){e==="<"||e==="\\lt"||e==="\u27E8"?e="\\langle":(e===">"||e==="\\gt"||e==="\u27E9")&&(e="\\rangle");var l;Jt.contains(eV,e)?l=H3e:Jt.contains(JG,e)?l=tV:l=W3e;var u=rV(e,r,l,i);return u.type==="small"?B3e(e,u.style,n,i,a,s):u.type==="large"?QG(e,u.size,n,i,a,s):ZG(e,r,n,i,a,s)},"makeCustomSizedDelim"),Y3e=o(function(e,r,n,i,a,s){var l=i.fontMetrics().axisHeight*i.sizeMultiplier,u=901,h=5/i.fontMetrics().ptPerEm,f=Math.max(r-l,n+l),d=Math.max(f/500*u,2*f-h);return nV(e,d,!0,i,a,s)},"makeLeftRightDelim"),hu={sqrtImage:G3e,sizedDelim:U3e,sizeToMaxHeight:jy,customSizedDelim:nV,leftRightDelim:Y3e},oG={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},X3e=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230A","\u230B","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27E8","\\rangle","\u27E9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27EE","\u27EF","\\lmoustache","\\rmoustache","\u23B0","\u23B1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];o(M3,"checkDelimiter");Nt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:o((t,e)=>{var r=M3(e[0],t);return{type:"delimsizing",mode:t.parser.mode,size:oG[t.funcName].size,mclass:oG[t.funcName].mclass,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>t.delim==="."?Fe.makeSpan([t.mclass]):hu.sizedDelim(t.delim,t.size,e,t.mode,[t.mclass]),"htmlBuilder"),mathmlBuilder:o(t=>{var e=[];t.delim!=="."&&e.push(Do(t.delim,t.mode));var r=new dt.MathNode("mo",e);t.mclass==="mopen"||t.mclass==="mclose"?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var n=Et(hu.sizeToMaxHeight[t.size]);return r.setAttribute("minsize",n),r.setAttribute("maxsize",n),r},"mathmlBuilder")});o(lG,"assertParsed");Nt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=t.parser.gullet.macros.get("\\current@color");if(r&&typeof r!="string")throw new pt("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:t.parser.mode,delim:M3(e[0],t).text,color:r}},"handler")});Nt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=M3(e[0],t),n=t.parser;++n.leftrightDepth;var i=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var a=xr(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:i,left:r.text,right:a.delim,rightColor:a.color}},"handler"),htmlBuilder:o((t,e)=>{lG(t);for(var r=$i(t.body,e,!0,["mopen","mclose"]),n=0,i=0,a=!1,s=0;s{lG(t);var r=_s(t.body,e);if(t.left!=="."){var n=new dt.MathNode("mo",[Do(t.left,t.mode)]);n.setAttribute("fence","true"),r.unshift(n)}if(t.right!=="."){var i=new dt.MathNode("mo",[Do(t.right,t.mode)]);i.setAttribute("fence","true"),t.rightColor&&i.setAttribute("mathcolor",t.rightColor),r.push(i)}return aA(r)},"mathmlBuilder")});Nt({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var r=M3(e[0],t);if(!t.parser.leftrightDepth)throw new pt("\\middle without preceding \\left",r);return{type:"middle",mode:t.parser.mode,delim:r.text}},"handler"),htmlBuilder:o((t,e)=>{var r;if(t.delim===".")r=ev(e,[]);else{r=hu.sizedDelim(t.delim,1,e,t.mode,[]);var n={delim:t.delim,options:e};r.isMiddle=n}return r},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=t.delim==="\\vert"||t.delim==="|"?Do("|","text"):Do(t.delim,t.mode),n=new dt.MathNode("mo",[r]);return n.setAttribute("fence","true"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n},"mathmlBuilder")});uA=o((t,e)=>{var r=Fe.wrapFragment($r(t.body,e),e),n=t.label.slice(1),i=e.sizeMultiplier,a,s=0,l=Jt.isCharacterBox(t.body);if(n==="sout")a=Fe.makeSpan(["stretchy","sout"]),a.height=e.fontMetrics().defaultRuleThickness/i,s=-.5*e.fontMetrics().xHeight;else if(n==="phase"){var u=ni({number:.6,unit:"pt"},e),h=ni({number:.35,unit:"ex"},e),f=e.havingBaseSizing();i=i/f.sizeMultiplier;var d=r.height+r.depth+u+h;r.style.paddingLeft=Et(d/2+u);var p=Math.floor(1e3*d*i),m=U4e(p),g=new dl([new ec("phase",m)],{width:"400em",height:Et(p/1e3),viewBox:"0 0 400000 "+p,preserveAspectRatio:"xMinYMin slice"});a=Fe.makeSvgSpan(["hide-tail"],[g],e),a.style.height=Et(d),s=r.depth+u+h}else{/cancel/.test(n)?l||r.classes.push("cancel-pad"):n==="angl"?r.classes.push("anglpad"):r.classes.push("boxpad");var y=0,v=0,x=0;/box/.test(n)?(x=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness),y=e.fontMetrics().fboxsep+(n==="colorbox"?0:x),v=y):n==="angl"?(x=Math.max(e.fontMetrics().defaultRuleThickness,e.minRuleThickness),y=4*x,v=Math.max(0,.25-r.depth)):(y=l?.2:0,v=y),a=du.encloseSpan(r,n,y,v,e),/fbox|boxed|fcolorbox/.test(n)?(a.style.borderStyle="solid",a.style.borderWidth=Et(x)):n==="angl"&&x!==.049&&(a.style.borderTopWidth=Et(x),a.style.borderRightWidth=Et(x)),s=r.depth+v,t.backgroundColor&&(a.style.backgroundColor=t.backgroundColor,t.borderColor&&(a.style.borderColor=t.borderColor))}var b;if(t.backgroundColor)b=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:s},{type:"elem",elem:r,shift:0}]},e);else{var T=/cancel|phase/.test(n)?["svg-align"]:[];b=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:0},{type:"elem",elem:a,shift:s,wrapperClasses:T}]},e)}return/cancel/.test(n)&&(b.height=r.height,b.depth=r.depth),/cancel/.test(n)&&!l?Fe.makeSpan(["mord","cancel-lap"],[b],e):Fe.makeSpan(["mord"],[b],e)},"htmlBuilder$7"),hA=o((t,e)=>{var r=0,n=new dt.MathNode(t.label.indexOf("colorbox")>-1?"mpadded":"menclose",[vn(t.body,e)]);switch(t.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=e.fontMetrics().fboxsep*e.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),t.label==="\\fcolorbox"){var i=Math.max(e.fontMetrics().fboxrule,e.minRuleThickness);n.setAttribute("style","border: "+i+"em solid "+String(t.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike");break}return t.backgroundColor&&n.setAttribute("mathbackground",t.backgroundColor),n},"mathmlBuilder$6");Nt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=xr(e[0],"color-token").color,s=e[1];return{type:"enclose",mode:n.mode,label:i,backgroundColor:a,body:s}},htmlBuilder:uA,mathmlBuilder:hA});Nt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(t,e,r){var{parser:n,funcName:i}=t,a=xr(e[0],"color-token").color,s=xr(e[1],"color-token").color,l=e[2];return{type:"enclose",mode:n.mode,label:i,backgroundColor:s,borderColor:a,body:l}},htmlBuilder:uA,mathmlBuilder:hA});Nt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\fbox",body:e[0]}}});Nt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"enclose",mode:r.mode,label:n,body:i}},htmlBuilder:uA,mathmlBuilder:hA});Nt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"enclose",mode:r.mode,label:"\\angl",body:e[0]}}});iV={};o(tc,"defineEnvironment");aV={};o(fe,"defineMacro");o(cG,"getHLines");I3=o(t=>{var e=t.parser.settings;if(!e.displayMode)throw new pt("{"+t.envName+"} can be used only in display mode.")},"validateAmsEnvironmentContext");o(fA,"getAutoTag");o(bh,"parseArray");o(dA,"dCellStyle");rc=o(function(e,r){var n,i,a=e.body.length,s=e.hLinesBeforeRow,l=0,u=new Array(a),h=[],f=Math.max(r.fontMetrics().arrayRuleWidth,r.minRuleThickness),d=1/r.fontMetrics().ptPerEm,p=5*d;if(e.colSeparationType&&e.colSeparationType==="small"){var m=r.havingStyle(nr.SCRIPT).sizeMultiplier;p=.2778*(m/r.sizeMultiplier)}var g=e.colSeparationType==="CD"?ni({number:3,unit:"ex"},r):12*d,y=3*d,v=e.arraystretch*g,x=.7*v,b=.3*v,T=0;function S(ae){for(var Oe=0;Oe0&&(T+=.25),h.push({pos:T,isDashed:ae[Oe]})}for(o(S,"setHLinePos"),S(s[0]),n=0;n0&&(R+=b,_ae))for(n=0;n=l)){var Z=void 0;(i>0||e.hskipBeforeAndAfter)&&(Z=Jt.deflt(U.pregap,p),Z!==0&&(I=Fe.makeSpan(["arraycolsep"],[]),I.style.width=Et(Z),A.push(I)));var ue=[];for(n=0;n0){for(var te=Fe.makeLineSpan("hline",r,f),he=Fe.makeLineSpan("hdashline",r,f),le=[{type:"elem",elem:u,shift:0}];h.length>0;){var J=h.pop(),Se=J.pos-k;J.isDashed?le.push({type:"elem",elem:he,shift:Se}):le.push({type:"elem",elem:te,shift:Se})}u=Fe.makeVList({positionType:"individualShift",children:le},r)}if(P.length===0)return Fe.makeSpan(["mord"],[u],r);var se=Fe.makeVList({positionType:"individualShift",children:P},r);return se=Fe.makeSpan(["tag"],[se],r),Fe.makeFragment([u,se])},"htmlBuilder"),j3e={c:"center ",l:"left ",r:"right "},nc=o(function(e,r){for(var n=[],i=new dt.MathNode("mtd",[],["mtr-glue"]),a=new dt.MathNode("mtd",[],["mml-eqn-num"]),s=0;s0){var g=e.cols,y="",v=!1,x=0,b=g.length;g[0].type==="separator"&&(p+="top ",x=1),g[g.length-1].type==="separator"&&(p+="bottom ",b-=1);for(var T=x;T0?"left ":"",p+=C[C.length-1].length>0?"right ":"";for(var D=1;D-1?"alignat":"align",a=e.envName==="split",s=bh(e.parser,{cols:n,addJot:!0,autoTag:a?void 0:fA(e.envName),emptySingleRow:!0,colSeparationType:i,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),l,u=0,h={type:"ordgroup",mode:e.mode,body:[]};if(r[0]&&r[0].type==="ordgroup"){for(var f="",d=0;d0&&m&&(v=1),n[g]={type:"align",align:y,pregap:v,postgap:0}}return s.colSeparationType=m?"align":"alignat",s},"alignedHandler");tc({type:"array",names:["array","darray"],props:{numArgs:1},handler(t,e){var r=R3(e[0]),n=r?[e[0]]:xr(e[0],"ordgroup").body,i=n.map(function(s){var l=oA(s),u=l.text;if("lcr".indexOf(u)!==-1)return{type:"align",align:u};if(u==="|")return{type:"separator",separator:"|"};if(u===":")return{type:"separator",separator:":"};throw new pt("Unknown column alignment: "+u,s)}),a={cols:i,hskipBeforeAndAfter:!0,maxNumCols:i.length};return bh(t.parser,a,dA(t.envName))},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(t){var e={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[t.envName.replace("*","")],r="c",n={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if(t.envName.charAt(t.envName.length-1)==="*"){var i=t.parser;if(i.consumeSpaces(),i.fetch().text==="["){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,"lcr".indexOf(r)===-1)throw new pt("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),n.cols=[{type:"align",align:r}]}}var a=bh(t.parser,n,dA(t.envName)),s=Math.max(0,...a.body.map(l=>l.length));return a.cols=new Array(s).fill({type:"align",align:r}),e?{type:"leftright",mode:t.mode,body:[a],left:e[0],right:e[1],rightColor:void 0}:a},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(t){var e={arraystretch:.5},r=bh(t.parser,e,"script");return r.colSeparationType="small",r},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["subarray"],props:{numArgs:1},handler(t,e){var r=R3(e[0]),n=r?[e[0]]:xr(e[0],"ordgroup").body,i=n.map(function(s){var l=oA(s),u=l.text;if("lc".indexOf(u)!==-1)return{type:"align",align:u};throw new pt("Unknown column alignment: "+u,s)});if(i.length>1)throw new pt("{subarray} can contain only one column");var a={cols:i,hskipBeforeAndAfter:!1,arraystretch:.5};if(a=bh(t.parser,a,"script"),a.body.length>0&&a.body[0].length>1)throw new pt("{subarray} can contain only one column");return a},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(t){var e={arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},r=bh(t.parser,e,dA(t.envName));return{type:"leftright",mode:t.mode,body:[r],left:t.envName.indexOf("r")>-1?".":"\\{",right:t.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:sV,htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(t){Jt.contains(["gather","gather*"],t.envName)&&I3(t);var e={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:fA(t.envName),emptySingleRow:!0,leqno:t.parser.settings.leqno};return bh(t.parser,e,"display")},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:sV,htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(t){I3(t);var e={autoTag:fA(t.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:t.parser.settings.leqno};return bh(t.parser,e,"display")},htmlBuilder:rc,mathmlBuilder:nc});tc({type:"array",names:["CD"],props:{numArgs:0},handler(t){return I3(t),O3e(t.parser)},htmlBuilder:rc,mathmlBuilder:nc});fe("\\nonumber","\\gdef\\@eqnsw{0}");fe("\\notag","\\nonumber");Nt({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(t,e){throw new pt(t.funcName+" valid only within array environment")}});uG=iV;Nt({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];if(i.type!=="ordgroup")throw new pt("Invalid environment name",i);for(var a="",s=0;s{var r=t.font,n=e.withFont(r);return $r(t.body,n)},"htmlBuilder$5"),lV=o((t,e)=>{var r=t.font,n=e.withFont(r);return vn(t.body,n)},"mathmlBuilder$4"),hG={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};Nt({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=C3(e[0]),a=n;return a in hG&&(a=hG[a]),{type:"font",mode:r.mode,font:a.slice(1),body:i}},"handler"),htmlBuilder:oV,mathmlBuilder:lV});Nt({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r}=t,n=e[0],i=Jt.isCharacterBox(n);return{type:"mclass",mode:r.mode,mclass:N3(n),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:n}],isCharacterBox:i}},"handler")});Nt({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n,breakOnTokenText:i}=t,{mode:a}=r,s=r.parseExpression(!0,i),l="math"+n.slice(1);return{type:"font",mode:a,font:l,body:{type:"ordgroup",mode:r.mode,body:s}}},"handler"),htmlBuilder:oV,mathmlBuilder:lV});cV=o((t,e)=>{var r=e;return t==="display"?r=r.id>=nr.SCRIPT.id?r.text():nr.DISPLAY:t==="text"&&r.size===nr.DISPLAY.size?r=nr.TEXT:t==="script"?r=nr.SCRIPT:t==="scriptscript"&&(r=nr.SCRIPTSCRIPT),r},"adjustStyle"),pA=o((t,e)=>{var r=cV(t.size,e.style),n=r.fracNum(),i=r.fracDen(),a;a=e.havingStyle(n);var s=$r(t.numer,a,e);if(t.continued){var l=8.5/e.fontMetrics().ptPerEm,u=3.5/e.fontMetrics().ptPerEm;s.height=s.height0?g=3*p:g=7*p,y=e.fontMetrics().denom1):(d>0?(m=e.fontMetrics().num2,g=p):(m=e.fontMetrics().num3,g=3*p),y=e.fontMetrics().denom2);var v;if(f){var b=e.fontMetrics().axisHeight;m-s.depth-(b+.5*d){var r=new dt.MathNode("mfrac",[vn(t.numer,e),vn(t.denom,e)]);if(!t.hasBarLine)r.setAttribute("linethickness","0px");else if(t.barSize){var n=ni(t.barSize,e);r.setAttribute("linethickness",Et(n))}var i=cV(t.size,e.style);if(i.size!==e.style.size){r=new dt.MathNode("mstyle",[r]);var a=i.size===nr.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",a),r.setAttribute("scriptlevel","0")}if(t.leftDelim!=null||t.rightDelim!=null){var s=[];if(t.leftDelim!=null){var l=new dt.MathNode("mo",[new dt.TextNode(t.leftDelim.replace("\\",""))]);l.setAttribute("fence","true"),s.push(l)}if(s.push(r),t.rightDelim!=null){var u=new dt.MathNode("mo",[new dt.TextNode(t.rightDelim.replace("\\",""))]);u.setAttribute("fence","true"),s.push(u)}return aA(s)}return r},"mathmlBuilder$3");Nt({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1],s,l=null,u=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":s=!1,l="(",u=")";break;case"\\\\bracefrac":s=!1,l="\\{",u="\\}";break;case"\\\\brackfrac":s=!1,l="[",u="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text";break}return{type:"genfrac",mode:r.mode,continued:!1,numer:i,denom:a,hasBarLine:s,leftDelim:l,rightDelim:u,size:h,barSize:null}},"handler"),htmlBuilder:pA,mathmlBuilder:mA});Nt({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=e[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:i,denom:a,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}},"handler")});Nt({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(t){var{parser:e,funcName:r,token:n}=t,i;switch(r){case"\\over":i="\\frac";break;case"\\choose":i="\\binom";break;case"\\atop":i="\\\\atopfrac";break;case"\\brace":i="\\\\bracefrac";break;case"\\brack":i="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:i,token:n}}});fG=["display","text","script","scriptscript"],dG=o(function(e){var r=null;return e.length>0&&(r=e,r=r==="."?null:r),r},"delimFromValue");Nt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(t,e){var{parser:r}=t,n=e[4],i=e[5],a=C3(e[0]),s=a.type==="atom"&&a.family==="open"?dG(a.text):null,l=C3(e[1]),u=l.type==="atom"&&l.family==="close"?dG(l.text):null,h=xr(e[2],"size"),f,d=null;h.isBlank?f=!0:(d=h.value,f=d.number>0);var p="auto",m=e[3];if(m.type==="ordgroup"){if(m.body.length>0){var g=xr(m.body[0],"textord");p=fG[Number(g.text)]}}else m=xr(m,"textord"),p=fG[Number(m.text)];return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:f,barSize:d,leftDelim:s,rightDelim:u,size:p}},htmlBuilder:pA,mathmlBuilder:mA});Nt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(t,e){var{parser:r,funcName:n,token:i}=t;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:xr(e[0],"size").value,token:i}}});Nt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0],a=_4e(xr(e[1],"infix").size),s=e[2],l=a.number>0;return{type:"genfrac",mode:r.mode,numer:i,denom:s,continued:!1,hasBarLine:l,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},"handler"),htmlBuilder:pA,mathmlBuilder:mA});uV=o((t,e)=>{var r=e.style,n,i;t.type==="supsub"?(n=t.sup?$r(t.sup,e.havingStyle(r.sup()),e):$r(t.sub,e.havingStyle(r.sub()),e),i=xr(t.base,"horizBrace")):i=xr(t,"horizBrace");var a=$r(i.base,e.havingBaseStyle(nr.DISPLAY)),s=du.svgSpan(i,e),l;if(i.isOver?(l=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:s}]},e),l.children[0].children[0].children[1].classes.push("svg-align")):(l=Fe.makeVList({positionType:"bottom",positionData:a.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:a}]},e),l.children[0].children[0].children[0].classes.push("svg-align")),n){var u=Fe.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e);i.isOver?l=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:u},{type:"kern",size:.2},{type:"elem",elem:n}]},e):l=Fe.makeVList({positionType:"bottom",positionData:u.depth+.2+n.height+n.depth,children:[{type:"elem",elem:n},{type:"kern",size:.2},{type:"elem",elem:u}]},e)}return Fe.makeSpan(["mord",i.isOver?"mover":"munder"],[l],e)},"htmlBuilder$3"),K3e=o((t,e)=>{var r=du.mathMLnode(t.label);return new dt.MathNode(t.isOver?"mover":"munder",[vn(t.base,e),r])},"mathmlBuilder$2");Nt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(t,e){var{parser:r,funcName:n}=t;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:e[0]}},htmlBuilder:uV,mathmlBuilder:K3e});Nt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[1],i=xr(e[0],"url").url;return r.settings.isTrusted({command:"\\href",url:i})?{type:"href",mode:r.mode,href:i,body:gi(n)}:r.formatUnsupportedCmd("\\href")},"handler"),htmlBuilder:o((t,e)=>{var r=$i(t.body,e,!1);return Fe.makeAnchor(t.href,[],r,e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=xh(t.body,e);return r instanceof ts||(r=new ts("mrow",[r])),r.setAttribute("href",t.href),r},"mathmlBuilder")});Nt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=xr(e[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var i=[],a=0;a{var{parser:r,funcName:n,token:i}=t,a=xr(e[0],"raw").string,s=e[1];r.settings.strict&&r.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var l,u={};switch(n){case"\\htmlClass":u.class=a,l={command:"\\htmlClass",class:a};break;case"\\htmlId":u.id=a,l={command:"\\htmlId",id:a};break;case"\\htmlStyle":u.style=a,l={command:"\\htmlStyle",style:a};break;case"\\htmlData":{for(var h=a.split(","),f=0;f{var r=$i(t.body,e,!1),n=["enclosing"];t.attributes.class&&n.push(...t.attributes.class.trim().split(/\s+/));var i=Fe.makeSpan(n,r,e);for(var a in t.attributes)a!=="class"&&t.attributes.hasOwnProperty(a)&&i.setAttribute(a,t.attributes[a]);return i},"htmlBuilder"),mathmlBuilder:o((t,e)=>xh(t.body,e),"mathmlBuilder")});Nt({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"htmlmathml",mode:r.mode,html:gi(e[0]),mathml:gi(e[1])}},"handler"),htmlBuilder:o((t,e)=>{var r=$i(t.html,e,!1);return Fe.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>xh(t.mathml,e),"mathmlBuilder")});z7=o(function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!r)throw new pt("Invalid size: '"+e+"' in \\includegraphics");var n={number:+(r[1]+r[2]),unit:r[3]};if(!DG(n))throw new pt("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n},"sizeData");Nt({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:o((t,e,r)=>{var{parser:n}=t,i={number:0,unit:"em"},a={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var u=xr(r[0],"raw").string,h=u.split(","),f=0;f{var r=ni(t.height,e),n=0;t.totalheight.number>0&&(n=ni(t.totalheight,e)-r);var i=0;t.width.number>0&&(i=ni(t.width,e));var a={height:Et(r+n)};i>0&&(a.width=Et(i)),n>0&&(a.verticalAlign=Et(-n));var s=new q7(t.src,t.alt,a);return s.height=r,s.depth=n,s},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new dt.MathNode("mglyph",[]);r.setAttribute("alt",t.alt);var n=ni(t.height,e),i=0;if(t.totalheight.number>0&&(i=ni(t.totalheight,e)-n,r.setAttribute("valign",Et(-i))),r.setAttribute("height",Et(n+i)),t.width.number>0){var a=ni(t.width,e);r.setAttribute("width",Et(a))}return r.setAttribute("src",t.src),r},"mathmlBuilder")});Nt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=xr(e[0],"size");if(r.settings.strict){var a=n[1]==="m",s=i.value.unit==="mu";a?(s||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, "+("not "+i.value.unit+" units")),r.mode!=="math"&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):s&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:i.value}},htmlBuilder(t,e){return Fe.makeGlue(t.dimension,e)},mathmlBuilder(t,e){var r=ni(t.dimension,e);return new dt.SpaceNode(r)}});Nt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:i}},"handler"),htmlBuilder:o((t,e)=>{var r;t.alignment==="clap"?(r=Fe.makeSpan([],[$r(t.body,e)]),r=Fe.makeSpan(["inner"],[r],e)):r=Fe.makeSpan(["inner"],[$r(t.body,e)]);var n=Fe.makeSpan(["fix"],[]),i=Fe.makeSpan([t.alignment],[r,n],e),a=Fe.makeSpan(["strut"]);return a.style.height=Et(i.height+i.depth),i.depth&&(a.style.verticalAlign=Et(-i.depth)),i.children.unshift(a),i=Fe.makeSpan(["thinbox"],[i],e),Fe.makeSpan(["mord","vbox"],[i],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=new dt.MathNode("mpadded",[vn(t.body,e)]);if(t.alignment!=="rlap"){var n=t.alignment==="llap"?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r},"mathmlBuilder")});Nt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){var{funcName:r,parser:n}=t,i=n.mode;n.switchMode("math");var a=r==="\\("?"\\)":"$",s=n.parseExpression(!1,a);return n.expect(a),n.switchMode(i),{type:"styling",mode:n.mode,style:"text",body:s}}});Nt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,e){throw new pt("Mismatched "+t.funcName)}});pG=o((t,e)=>{switch(e.style.size){case nr.DISPLAY.size:return t.display;case nr.TEXT.size:return t.text;case nr.SCRIPT.size:return t.script;case nr.SCRIPTSCRIPT.size:return t.scriptscript;default:return t.text}},"chooseMathStyle");Nt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:o((t,e)=>{var{parser:r}=t;return{type:"mathchoice",mode:r.mode,display:gi(e[0]),text:gi(e[1]),script:gi(e[2]),scriptscript:gi(e[3])}},"handler"),htmlBuilder:o((t,e)=>{var r=pG(t,e),n=$i(r,e,!1);return Fe.makeFragment(n)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=pG(t,e);return xh(r,e)},"mathmlBuilder")});hV=o((t,e,r,n,i,a,s)=>{t=Fe.makeSpan([],[t]);var l=r&&Jt.isCharacterBox(r),u,h;if(e){var f=$r(e,n.havingStyle(i.sup()),n);h={elem:f,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-f.depth)}}if(r){var d=$r(r,n.havingStyle(i.sub()),n);u={elem:d,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-d.height)}}var p;if(h&&u){var m=n.fontMetrics().bigOpSpacing5+u.elem.height+u.elem.depth+u.kern+t.depth+s;p=Fe.makeVList({positionType:"bottom",positionData:m,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:Et(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:Et(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(u){var g=t.height-s;p=Fe.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:u.elem,marginLeft:Et(-a)},{type:"kern",size:u.kern},{type:"elem",elem:t}]},n)}else if(h){var y=t.depth+s;p=Fe.makeVList({positionType:"bottom",positionData:y,children:[{type:"elem",elem:t},{type:"kern",size:h.kern},{type:"elem",elem:h.elem,marginLeft:Et(a)},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else return t;var v=[p];if(u&&a!==0&&!l){var x=Fe.makeSpan(["mspace"],[],n);x.style.marginRight=Et(a),v.unshift(x)}return Fe.makeSpan(["mop","op-limits"],v,n)},"assembleSupSub"),fV=["\\smallint"],S0=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=xr(t.base,"op"),i=!0):a=xr(t,"op");var s=e.style,l=!1;s.size===nr.DISPLAY.size&&a.symbol&&!Jt.contains(fV,a.name)&&(l=!0);var u;if(a.symbol){var h=l?"Size2-Regular":"Size1-Regular",f="";if((a.name==="\\oiint"||a.name==="\\oiiint")&&(f=a.name.slice(1),a.name=f==="oiint"?"\\iint":"\\iiint"),u=Fe.makeSymbol(a.name,h,"math",e,["mop","op-symbol",l?"large-op":"small-op"]),f.length>0){var d=u.italic,p=Fe.staticSvg(f+"Size"+(l?"2":"1"),e);u=Fe.makeVList({positionType:"individualShift",children:[{type:"elem",elem:u,shift:0},{type:"elem",elem:p,shift:l?.08:0}]},e),a.name="\\"+f,u.classes.unshift("mop"),u.italic=d}}else if(a.body){var m=$i(a.body,e,!0);m.length===1&&m[0]instanceof As?(u=m[0],u.classes[0]="mop"):u=Fe.makeSpan(["mop"],m,e)}else{for(var g=[],y=1;y{var r;if(t.symbol)r=new ts("mo",[Do(t.name,t.mode)]),Jt.contains(fV,t.name)&&r.setAttribute("largeop","false");else if(t.body)r=new ts("mo",_s(t.body,e));else{r=new ts("mi",[new Ao(t.name.slice(1))]);var n=new ts("mo",[Do("\u2061","text")]);t.parentIsSupSub?r=new ts("mrow",[r,n]):r=zG([r,n])}return r},"mathmlBuilder$1"),Q3e={"\u220F":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22C0":"\\bigwedge","\u22C1":"\\bigvee","\u22C2":"\\bigcap","\u22C3":"\\bigcup","\u2A00":"\\bigodot","\u2A01":"\\bigoplus","\u2A02":"\\bigotimes","\u2A04":"\\biguplus","\u2A06":"\\bigsqcup"};Nt({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220F","\u2210","\u2211","\u22C0","\u22C1","\u22C2","\u22C3","\u2A00","\u2A01","\u2A02","\u2A04","\u2A06"],props:{numArgs:0},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=n;return i.length===1&&(i=Q3e[i]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:i}},"handler"),htmlBuilder:S0,mathmlBuilder:tv});Nt({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:gi(n)}},"handler"),htmlBuilder:S0,mathmlBuilder:tv});Z3e={"\u222B":"\\int","\u222C":"\\iint","\u222D":"\\iiint","\u222E":"\\oint","\u222F":"\\oiint","\u2230":"\\oiiint"};Nt({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:S0,mathmlBuilder:tv});Nt({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:S0,mathmlBuilder:tv});Nt({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222B","\u222C","\u222D","\u222E","\u222F","\u2230"],props:{numArgs:0},handler(t){var{parser:e,funcName:r}=t,n=r;return n.length===1&&(n=Z3e[n]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:S0,mathmlBuilder:tv});dV=o((t,e)=>{var r,n,i=!1,a;t.type==="supsub"?(r=t.sup,n=t.sub,a=xr(t.base,"operatorname"),i=!0):a=xr(t,"operatorname");var s;if(a.body.length>0){for(var l=a.body.map(d=>{var p=d.text;return typeof p=="string"?{type:"textord",mode:d.mode,text:p}:d}),u=$i(l,e.withFont("mathrm"),!0),h=0;h{for(var r=_s(t.body,e.withFont("mathrm")),n=!0,i=0;if.toText()).join("");r=[new dt.TextNode(l)]}var u=new dt.MathNode("mi",r);u.setAttribute("mathvariant","normal");var h=new dt.MathNode("mo",[Do("\u2061","text")]);return t.parentIsSupSub?new dt.MathNode("mrow",[u,h]):dt.newDocumentFragment([u,h])},"mathmlBuilder");Nt({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:o((t,e)=>{var{parser:r,funcName:n}=t,i=e[0];return{type:"operatorname",mode:r.mode,body:gi(i),alwaysHandleSupSub:n==="\\operatornamewithlimits",limits:!1,parentIsSupSub:!1}},"handler"),htmlBuilder:dV,mathmlBuilder:J3e});fe("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@");cd({type:"ordgroup",htmlBuilder(t,e){return t.semisimple?Fe.makeFragment($i(t.body,e,!1)):Fe.makeSpan(["mord"],$i(t.body,e,!0),e)},mathmlBuilder(t,e){return xh(t.body,e,!0)}});Nt({type:"overline",names:["\\overline"],props:{numArgs:1},handler(t,e){var{parser:r}=t,n=e[0];return{type:"overline",mode:r.mode,body:n}},htmlBuilder(t,e){var r=$r(t.body,e.havingCrampedStyle()),n=Fe.makeLineSpan("overline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*i},{type:"elem",elem:n},{type:"kern",size:i}]},e);return Fe.makeSpan(["mord","overline"],[a],e)},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[new dt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new dt.MathNode("mover",[vn(t.body,e),r]);return n.setAttribute("accent","true"),n}});Nt({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"phantom",mode:r.mode,body:gi(n)}},"handler"),htmlBuilder:o((t,e)=>{var r=$i(t.body,e.withPhantom(),!1);return Fe.makeFragment(r)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=_s(t.body,e);return new dt.MathNode("mphantom",r)},"mathmlBuilder")});Nt({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"hphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Fe.makeSpan([],[$r(t.body,e.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var n=0;n{var r=_s(gi(t.body),e),n=new dt.MathNode("mphantom",r),i=new dt.MathNode("mpadded",[n]);return i.setAttribute("height","0px"),i.setAttribute("depth","0px"),i},"mathmlBuilder")});Nt({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:o((t,e)=>{var{parser:r}=t,n=e[0];return{type:"vphantom",mode:r.mode,body:n}},"handler"),htmlBuilder:o((t,e)=>{var r=Fe.makeSpan(["inner"],[$r(t.body,e.withPhantom())]),n=Fe.makeSpan(["fix"],[]);return Fe.makeSpan(["mord","rlap"],[r,n],e)},"htmlBuilder"),mathmlBuilder:o((t,e)=>{var r=_s(gi(t.body),e),n=new dt.MathNode("mphantom",r),i=new dt.MathNode("mpadded",[n]);return i.setAttribute("width","0px"),i},"mathmlBuilder")});Nt({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(t,e){var{parser:r}=t,n=xr(e[0],"size").value,i=e[1];return{type:"raisebox",mode:r.mode,dy:n,body:i}},htmlBuilder(t,e){var r=$r(t.body,e),n=ni(t.dy,e);return Fe.makeVList({positionType:"shift",positionData:-n,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){var r=new dt.MathNode("mpadded",[vn(t.body,e)]),n=t.dy.number+t.dy.unit;return r.setAttribute("voffset",n),r}});Nt({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(t){var{parser:e}=t;return{type:"internal",mode:e.mode}}});Nt({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(t,e,r){var{parser:n}=t,i=r[0],a=xr(e[0],"size"),s=xr(e[1],"size");return{type:"rule",mode:n.mode,shift:i&&xr(i,"size").value,width:a.value,height:s.value}},htmlBuilder(t,e){var r=Fe.makeSpan(["mord","rule"],[],e),n=ni(t.width,e),i=ni(t.height,e),a=t.shift?ni(t.shift,e):0;return r.style.borderRightWidth=Et(n),r.style.borderTopWidth=Et(i),r.style.bottom=Et(a),r.width=n,r.height=i+a,r.depth=-a,r.maxFontSize=i*1.125*e.sizeMultiplier,r},mathmlBuilder(t,e){var r=ni(t.width,e),n=ni(t.height,e),i=t.shift?ni(t.shift,e):0,a=e.color&&e.getColor()||"black",s=new dt.MathNode("mspace");s.setAttribute("mathbackground",a),s.setAttribute("width",Et(r)),s.setAttribute("height",Et(n));var l=new dt.MathNode("mpadded",[s]);return i>=0?l.setAttribute("height",Et(i)):(l.setAttribute("height",Et(i)),l.setAttribute("depth",Et(-i))),l.setAttribute("voffset",Et(i)),l}});o(pV,"sizingGroup");mG=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],e5e=o((t,e)=>{var r=e.havingSize(t.size);return pV(t.body,r,e)},"htmlBuilder");Nt({type:"sizing",names:mG,props:{numArgs:0,allowedInText:!0},handler:o((t,e)=>{var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!1,r);return{type:"sizing",mode:i.mode,size:mG.indexOf(n)+1,body:a}},"handler"),htmlBuilder:e5e,mathmlBuilder:o((t,e)=>{var r=e.havingSize(t.size),n=_s(t.body,r),i=new dt.MathNode("mstyle",n);return i.setAttribute("mathsize",Et(r.sizeMultiplier)),i},"mathmlBuilder")});Nt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:o((t,e,r)=>{var{parser:n}=t,i=!1,a=!1,s=r[0]&&xr(r[0],"ordgroup");if(s)for(var l="",u=0;u{var r=Fe.makeSpan([],[$r(t.body,e)]);if(!t.smashHeight&&!t.smashDepth)return r;if(t.smashHeight&&(r.height=0,r.children))for(var n=0;n{var r=new dt.MathNode("mpadded",[vn(t.body,e)]);return t.smashHeight&&r.setAttribute("height","0px"),t.smashDepth&&r.setAttribute("depth","0px"),r},"mathmlBuilder")});Nt({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(t,e,r){var{parser:n}=t,i=r[0],a=e[0];return{type:"sqrt",mode:n.mode,body:a,index:i}},htmlBuilder(t,e){var r=$r(t.body,e.havingCrampedStyle());r.height===0&&(r.height=e.fontMetrics().xHeight),r=Fe.wrapFragment(r,e);var n=e.fontMetrics(),i=n.defaultRuleThickness,a=i;e.style.idr.height+r.depth+s&&(s=(s+d-r.height-r.depth)/2);var p=u.height-r.height-s-h;r.style.paddingLeft=Et(f);var m=Fe.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+p)},{type:"elem",elem:u},{type:"kern",size:h}]},e);if(t.index){var g=e.havingStyle(nr.SCRIPTSCRIPT),y=$r(t.index,g,e),v=.6*(m.height-m.depth),x=Fe.makeVList({positionType:"shift",positionData:-v,children:[{type:"elem",elem:y}]},e),b=Fe.makeSpan(["root"],[x]);return Fe.makeSpan(["mord","sqrt"],[b,m],e)}else return Fe.makeSpan(["mord","sqrt"],[m],e)},mathmlBuilder(t,e){var{body:r,index:n}=t;return n?new dt.MathNode("mroot",[vn(r,e),vn(n,e)]):new dt.MathNode("msqrt",[vn(r,e)])}});gG={display:nr.DISPLAY,text:nr.TEXT,script:nr.SCRIPT,scriptscript:nr.SCRIPTSCRIPT};Nt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(t,e){var{breakOnTokenText:r,funcName:n,parser:i}=t,a=i.parseExpression(!0,r),s=n.slice(1,n.length-5);return{type:"styling",mode:i.mode,style:s,body:a}},htmlBuilder(t,e){var r=gG[t.style],n=e.havingStyle(r).withFont("");return pV(t.body,n,e)},mathmlBuilder(t,e){var r=gG[t.style],n=e.havingStyle(r),i=_s(t.body,n),a=new dt.MathNode("mstyle",i),s={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]},l=s[t.style];return a.setAttribute("scriptlevel",l[0]),a.setAttribute("displaystyle",l[1]),a}});t5e=o(function(e,r){var n=e.base;if(n)if(n.type==="op"){var i=n.limits&&(r.style.size===nr.DISPLAY.size||n.alwaysHandleSupSub);return i?S0:null}else if(n.type==="operatorname"){var a=n.alwaysHandleSupSub&&(r.style.size===nr.DISPLAY.size||n.limits);return a?dV:null}else{if(n.type==="accent")return Jt.isCharacterBox(n.base)?lA:null;if(n.type==="horizBrace"){var s=!e.sub;return s===n.isOver?uV:null}else return null}else return null},"htmlBuilderDelegate");cd({type:"supsub",htmlBuilder(t,e){var r=t5e(t,e);if(r)return r(t,e);var{base:n,sup:i,sub:a}=t,s=$r(n,e),l,u,h=e.fontMetrics(),f=0,d=0,p=n&&Jt.isCharacterBox(n);if(i){var m=e.havingStyle(e.style.sup());l=$r(i,m,e),p||(f=s.height-m.fontMetrics().supDrop*m.sizeMultiplier/e.sizeMultiplier)}if(a){var g=e.havingStyle(e.style.sub());u=$r(a,g,e),p||(d=s.depth+g.fontMetrics().subDrop*g.sizeMultiplier/e.sizeMultiplier)}var y;e.style===nr.DISPLAY?y=h.sup1:e.style.cramped?y=h.sup3:y=h.sup2;var v=e.sizeMultiplier,x=Et(.5/h.ptPerEm/v),b=null;if(u){var T=t.base&&t.base.type==="op"&&t.base.name&&(t.base.name==="\\oiint"||t.base.name==="\\oiiint");(s instanceof As||T)&&(b=Et(-s.italic))}var S;if(l&&u){f=Math.max(f,y,l.depth+.25*h.xHeight),d=Math.max(d,h.sub2);var w=h.defaultRuleThickness,E=4*w;if(f-l.depth-(u.height-d)0&&(f+=_,d-=_)}var C=[{type:"elem",elem:u,shift:d,marginRight:x,marginLeft:b},{type:"elem",elem:l,shift:-f,marginRight:x}];S=Fe.makeVList({positionType:"individualShift",children:C},e)}else if(u){d=Math.max(d,h.sub1,u.height-.8*h.xHeight);var D=[{type:"elem",elem:u,marginLeft:b,marginRight:x}];S=Fe.makeVList({positionType:"shift",positionData:d,children:D},e)}else if(l)f=Math.max(f,y,l.depth+.25*h.xHeight),S=Fe.makeVList({positionType:"shift",positionData:-f,children:[{type:"elem",elem:l,marginRight:x}]},e);else throw new Error("supsub must have either sup or sub.");var O=X7(s,"right")||"mord";return Fe.makeSpan([O],[s,Fe.makeSpan(["msupsub"],[S])],e)},mathmlBuilder(t,e){var r=!1,n,i;t.base&&t.base.type==="horizBrace"&&(i=!!t.sup,i===t.base.isOver&&(r=!0,n=t.base.isOver)),t.base&&(t.base.type==="op"||t.base.type==="operatorname")&&(t.base.parentIsSupSub=!0);var a=[vn(t.base,e)];t.sub&&a.push(vn(t.sub,e)),t.sup&&a.push(vn(t.sup,e));var s;if(r)s=n?"mover":"munder";else if(t.sub)if(t.sup){var h=t.base;h&&h.type==="op"&&h.limits&&e.style===nr.DISPLAY||h&&h.type==="operatorname"&&h.alwaysHandleSupSub&&(e.style===nr.DISPLAY||h.limits)?s="munderover":s="msubsup"}else{var u=t.base;u&&u.type==="op"&&u.limits&&(e.style===nr.DISPLAY||u.alwaysHandleSupSub)||u&&u.type==="operatorname"&&u.alwaysHandleSupSub&&(u.limits||e.style===nr.DISPLAY)?s="munder":s="msub"}else{var l=t.base;l&&l.type==="op"&&l.limits&&(e.style===nr.DISPLAY||l.alwaysHandleSupSub)||l&&l.type==="operatorname"&&l.alwaysHandleSupSub&&(l.limits||e.style===nr.DISPLAY)?s="mover":s="msup"}return new dt.MathNode(s,a)}});cd({type:"atom",htmlBuilder(t,e){return Fe.mathsym(t.text,t.mode,e,["m"+t.family])},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[Do(t.text,t.mode)]);if(t.family==="bin"){var n=sA(t,e);n==="bold-italic"&&r.setAttribute("mathvariant",n)}else t.family==="punct"?r.setAttribute("separator","true"):(t.family==="open"||t.family==="close")&&r.setAttribute("stretchy","false");return r}});mV={mi:"italic",mn:"normal",mtext:"normal"};cd({type:"mathord",htmlBuilder(t,e){return Fe.makeOrd(t,e,"mathord")},mathmlBuilder(t,e){var r=new dt.MathNode("mi",[Do(t.text,t.mode,e)]),n=sA(t,e)||"italic";return n!==mV[r.type]&&r.setAttribute("mathvariant",n),r}});cd({type:"textord",htmlBuilder(t,e){return Fe.makeOrd(t,e,"textord")},mathmlBuilder(t,e){var r=Do(t.text,t.mode,e),n=sA(t,e)||"normal",i;return t.mode==="text"?i=new dt.MathNode("mtext",[r]):/[0-9]/.test(t.text)?i=new dt.MathNode("mn",[r]):t.text==="\\prime"?i=new dt.MathNode("mo",[r]):i=new dt.MathNode("mi",[r]),n!==mV[i.type]&&i.setAttribute("mathvariant",n),i}});G7={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},V7={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};cd({type:"spacing",htmlBuilder(t,e){if(V7.hasOwnProperty(t.text)){var r=V7[t.text].className||"";if(t.mode==="text"){var n=Fe.makeOrd(t,e,"textord");return n.classes.push(r),n}else return Fe.makeSpan(["mspace",r],[Fe.mathsym(t.text,t.mode,e)],e)}else{if(G7.hasOwnProperty(t.text))return Fe.makeSpan(["mspace",G7[t.text]],[],e);throw new pt('Unknown type of space "'+t.text+'"')}},mathmlBuilder(t,e){var r;if(V7.hasOwnProperty(t.text))r=new dt.MathNode("mtext",[new dt.TextNode("\xA0")]);else{if(G7.hasOwnProperty(t.text))return new dt.MathNode("mspace");throw new pt('Unknown type of space "'+t.text+'"')}return r}});yG=o(()=>{var t=new dt.MathNode("mtd",[]);return t.setAttribute("width","50%"),t},"pad");cd({type:"tag",mathmlBuilder(t,e){var r=new dt.MathNode("mtable",[new dt.MathNode("mtr",[yG(),new dt.MathNode("mtd",[xh(t.body,e)]),yG(),new dt.MathNode("mtd",[xh(t.tag,e)])])]);return r.setAttribute("width","100%"),r}});vG={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},xG={"\\textbf":"textbf","\\textmd":"textmd"},r5e={"\\textit":"textit","\\textup":"textup"},bG=o((t,e)=>{var r=t.font;if(r){if(vG[r])return e.withTextFontFamily(vG[r]);if(xG[r])return e.withTextFontWeight(xG[r]);if(r==="\\emph")return e.fontShape==="textit"?e.withTextFontShape("textup"):e.withTextFontShape("textit")}else return e;return e.withTextFontShape(r5e[r])},"optionsWithFont");Nt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(t,e){var{parser:r,funcName:n}=t,i=e[0];return{type:"text",mode:r.mode,body:gi(i),font:n}},htmlBuilder(t,e){var r=bG(t,e),n=$i(t.body,r,!0);return Fe.makeSpan(["mord","text"],n,r)},mathmlBuilder(t,e){var r=bG(t,e);return xh(t.body,r)}});Nt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(t,e){var{parser:r}=t;return{type:"underline",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=$r(t.body,e),n=Fe.makeLineSpan("underline-line",e),i=e.fontMetrics().defaultRuleThickness,a=Fe.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:i},{type:"elem",elem:n},{type:"kern",size:3*i},{type:"elem",elem:r}]},e);return Fe.makeSpan(["mord","underline"],[a],e)},mathmlBuilder(t,e){var r=new dt.MathNode("mo",[new dt.TextNode("\u203E")]);r.setAttribute("stretchy","true");var n=new dt.MathNode("munder",[vn(t.body,e),r]);return n.setAttribute("accentunder","true"),n}});Nt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(t,e){var{parser:r}=t;return{type:"vcenter",mode:r.mode,body:e[0]}},htmlBuilder(t,e){var r=$r(t.body,e),n=e.fontMetrics().axisHeight,i=.5*(r.height-n-(r.depth+n));return Fe.makeVList({positionType:"shift",positionData:i,children:[{type:"elem",elem:r}]},e)},mathmlBuilder(t,e){return new dt.MathNode("mpadded",[vn(t.body,e)],["vcenter"])}});Nt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,e,r){throw new pt("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(t,e){for(var r=TG(t),n=[],i=e.havingStyle(e.style.text()),a=0;at.body.replace(/ /g,t.star?"\u2423":"\xA0"),"makeVerb"),yh=FG,gV=`[ \r - ]`,n5e="\\\\[a-zA-Z@]+",i5e="\\\\[^\uD800-\uDFFF]",a5e="("+n5e+")"+gV+"*",s5e=`\\\\( -|[ \r ]+ -?)[ \r ]*`,J7="[\u0300-\u036F]",o5e=new RegExp(J7+"+$"),l5e="("+gV+"+)|"+(s5e+"|")+"([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]"+(J7+"*")+"|[\uD800-\uDBFF][\uDC00-\uDFFF]"+(J7+"*")+"|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5"+("|"+a5e)+("|"+i5e+")"),A3=class{static{o(this,"Lexer")}constructor(e,r){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=r,this.tokenRegex=new RegExp(l5e,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,r){this.catcodes[e]=r}lex(){var e=this.input,r=this.tokenRegex.lastIndex;if(r===e.length)return new _o("EOF",new Qs(this,r,r));var n=this.tokenRegex.exec(e);if(n===null||n.index!==r)throw new pt("Unexpected character: '"+e[r]+"'",new _o(e[r],new Qs(this,r,r+1)));var i=n[6]||n[3]||(n[2]?"\\ ":" ");if(this.catcodes[i]===14){var a=e.indexOf(` -`,this.tokenRegex.lastIndex);return a===-1?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=a+1,this.lex()}return new _o(i,new Qs(this,r,this.tokenRegex.lastIndex))}},eA=class{static{o(this,"Namespace")}constructor(e,r){e===void 0&&(e={}),r===void 0&&(r={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=r,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(this.undefStack.length===0)throw new pt("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var r in e)e.hasOwnProperty(r)&&(e[r]==null?delete this.current[r]:this.current[r]=e[r])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,r,n){if(n===void 0&&(n=!1),n){for(var i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=r)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}r==null?delete this.current[e]:this.current[e]=r}},c5e=aV;fe("\\noexpand",function(t){var e=t.popToken();return t.isExpandable(e.text)&&(e.noexpand=!0,e.treatAsRelax=!0),{tokens:[e],numArgs:0}});fe("\\expandafter",function(t){var e=t.popToken();return t.expandOnce(!0),{tokens:[e],numArgs:0}});fe("\\@firstoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[0],numArgs:0}});fe("\\@secondoftwo",function(t){var e=t.consumeArgs(2);return{tokens:e[1],numArgs:0}});fe("\\@ifnextchar",function(t){var e=t.consumeArgs(3);t.consumeSpaces();var r=t.future();return e[0].length===1&&e[0][0].text===r.text?{tokens:e[1],numArgs:0}:{tokens:e[2],numArgs:0}});fe("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}");fe("\\TextOrMath",function(t){var e=t.consumeArgs(2);return t.mode==="text"?{tokens:e[0],numArgs:0}:{tokens:e[1],numArgs:0}});wG={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};fe("\\char",function(t){var e=t.popToken(),r,n="";if(e.text==="'")r=8,e=t.popToken();else if(e.text==='"')r=16,e=t.popToken();else if(e.text==="`")if(e=t.popToken(),e.text[0]==="\\")n=e.text.charCodeAt(1);else{if(e.text==="EOF")throw new pt("\\char` missing argument");n=e.text.charCodeAt(0)}else r=10;if(r){if(n=wG[e.text],n==null||n>=r)throw new pt("Invalid base-"+r+" digit "+e.text);for(var i;(i=wG[t.future().text])!=null&&i{var i=t.consumeArg().tokens;if(i.length!==1)throw new pt("\\newcommand's first argument must be a macro name");var a=i[0].text,s=t.isDefined(a);if(s&&!e)throw new pt("\\newcommand{"+a+"} attempting to redefine "+(a+"; use \\renewcommand"));if(!s&&!r)throw new pt("\\renewcommand{"+a+"} when command "+a+" does not yet exist; use \\newcommand");var l=0;if(i=t.consumeArg().tokens,i.length===1&&i[0].text==="["){for(var u="",h=t.expandNextToken();h.text!=="]"&&h.text!=="EOF";)u+=h.text,h=t.expandNextToken();if(!u.match(/^\s*[0-9]+\s*$/))throw new pt("Invalid number of arguments: "+u);l=parseInt(u),i=t.consumeArg().tokens}return s&&n||t.macros.set(a,{tokens:i,numArgs:l}),""},"newcommand");fe("\\newcommand",t=>gA(t,!1,!0,!1));fe("\\renewcommand",t=>gA(t,!0,!1,!1));fe("\\providecommand",t=>gA(t,!0,!0,!0));fe("\\message",t=>{var e=t.consumeArgs(1)[0];return console.log(e.reverse().map(r=>r.text).join("")),""});fe("\\errmessage",t=>{var e=t.consumeArgs(1)[0];return console.error(e.reverse().map(r=>r.text).join("")),""});fe("\\show",t=>{var e=t.popToken(),r=e.text;return console.log(e,t.macros.get(r),yh[r],An.math[r],An.text[r]),""});fe("\\bgroup","{");fe("\\egroup","}");fe("~","\\nobreakspace");fe("\\lq","`");fe("\\rq","'");fe("\\aa","\\r a");fe("\\AA","\\r A");fe("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xA9}");fe("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}");fe("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xAE}");fe("\u212C","\\mathscr{B}");fe("\u2130","\\mathscr{E}");fe("\u2131","\\mathscr{F}");fe("\u210B","\\mathscr{H}");fe("\u2110","\\mathscr{I}");fe("\u2112","\\mathscr{L}");fe("\u2133","\\mathscr{M}");fe("\u211B","\\mathscr{R}");fe("\u212D","\\mathfrak{C}");fe("\u210C","\\mathfrak{H}");fe("\u2128","\\mathfrak{Z}");fe("\\Bbbk","\\Bbb{k}");fe("\xB7","\\cdotp");fe("\\llap","\\mathllap{\\textrm{#1}}");fe("\\rlap","\\mathrlap{\\textrm{#1}}");fe("\\clap","\\mathclap{\\textrm{#1}}");fe("\\mathstrut","\\vphantom{(}");fe("\\underbar","\\underline{\\text{#1}}");fe("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}');fe("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}");fe("\\ne","\\neq");fe("\u2260","\\neq");fe("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}");fe("\u2209","\\notin");fe("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}");fe("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}");fe("\u225A","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225A}}");fe("\u225B","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225B}}");fe("\u225D","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225D}}");fe("\u225E","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225E}}");fe("\u225F","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225F}}");fe("\u27C2","\\perp");fe("\u203C","\\mathclose{!\\mkern-0.8mu!}");fe("\u220C","\\notni");fe("\u231C","\\ulcorner");fe("\u231D","\\urcorner");fe("\u231E","\\llcorner");fe("\u231F","\\lrcorner");fe("\xA9","\\copyright");fe("\xAE","\\textregistered");fe("\uFE0F","\\textregistered");fe("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}');fe("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}');fe("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}');fe("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}');fe("\\vdots","{\\varvdots\\rule{0pt}{15pt}}");fe("\u22EE","\\vdots");fe("\\varGamma","\\mathit{\\Gamma}");fe("\\varDelta","\\mathit{\\Delta}");fe("\\varTheta","\\mathit{\\Theta}");fe("\\varLambda","\\mathit{\\Lambda}");fe("\\varXi","\\mathit{\\Xi}");fe("\\varPi","\\mathit{\\Pi}");fe("\\varSigma","\\mathit{\\Sigma}");fe("\\varUpsilon","\\mathit{\\Upsilon}");fe("\\varPhi","\\mathit{\\Phi}");fe("\\varPsi","\\mathit{\\Psi}");fe("\\varOmega","\\mathit{\\Omega}");fe("\\substack","\\begin{subarray}{c}#1\\end{subarray}");fe("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax");fe("\\boxed","\\fbox{$\\displaystyle{#1}$}");fe("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;");fe("\\implies","\\DOTSB\\;\\Longrightarrow\\;");fe("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;");fe("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}");fe("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");kG={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};fe("\\dots",function(t){var e="\\dotso",r=t.expandAfterFuture().text;return r in kG?e=kG[r]:(r.slice(0,4)==="\\not"||r in An.math&&Jt.contains(["bin","rel"],An.math[r].group))&&(e="\\dotsb"),e});yA={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};fe("\\dotso",function(t){var e=t.future().text;return e in yA?"\\ldots\\,":"\\ldots"});fe("\\dotsc",function(t){var e=t.future().text;return e in yA&&e!==","?"\\ldots\\,":"\\ldots"});fe("\\cdots",function(t){var e=t.future().text;return e in yA?"\\@cdots\\,":"\\@cdots"});fe("\\dotsb","\\cdots");fe("\\dotsm","\\cdots");fe("\\dotsi","\\!\\cdots");fe("\\dotsx","\\ldots\\,");fe("\\DOTSI","\\relax");fe("\\DOTSB","\\relax");fe("\\DOTSX","\\relax");fe("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax");fe("\\,","\\tmspace+{3mu}{.1667em}");fe("\\thinspace","\\,");fe("\\>","\\mskip{4mu}");fe("\\:","\\tmspace+{4mu}{.2222em}");fe("\\medspace","\\:");fe("\\;","\\tmspace+{5mu}{.2777em}");fe("\\thickspace","\\;");fe("\\!","\\tmspace-{3mu}{.1667em}");fe("\\negthinspace","\\!");fe("\\negmedspace","\\tmspace-{4mu}{.2222em}");fe("\\negthickspace","\\tmspace-{5mu}{.277em}");fe("\\enspace","\\kern.5em ");fe("\\enskip","\\hskip.5em\\relax");fe("\\quad","\\hskip1em\\relax");fe("\\qquad","\\hskip2em\\relax");fe("\\tag","\\@ifstar\\tag@literal\\tag@paren");fe("\\tag@paren","\\tag@literal{({#1})}");fe("\\tag@literal",t=>{if(t.macros.get("\\df@tag"))throw new pt("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"});fe("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}");fe("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)");fe("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}");fe("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1");fe("\\newline","\\\\\\relax");fe("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");yV=Et(Jl["Main-Regular"][84][1]-.7*Jl["Main-Regular"][65][1]);fe("\\LaTeX","\\textrm{\\html@mathml{"+("L\\kern-.36em\\raisebox{"+yV+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{LaTeX}}");fe("\\KaTeX","\\textrm{\\html@mathml{"+("K\\kern-.17em\\raisebox{"+yV+"}{\\scriptstyle A}")+"\\kern-.15em\\TeX}{KaTeX}}");fe("\\hspace","\\@ifstar\\@hspacer\\@hspace");fe("\\@hspace","\\hskip #1\\relax");fe("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax");fe("\\ordinarycolon",":");fe("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}");fe("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}');fe("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}');fe("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}');fe("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}');fe("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}');fe("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}');fe("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}');fe("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}');fe("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}');fe("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}');fe("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}');fe("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}');fe("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}');fe("\u2237","\\dblcolon");fe("\u2239","\\eqcolon");fe("\u2254","\\coloneqq");fe("\u2255","\\eqqcolon");fe("\u2A74","\\Coloneqq");fe("\\ratio","\\vcentcolon");fe("\\coloncolon","\\dblcolon");fe("\\colonequals","\\coloneqq");fe("\\coloncolonequals","\\Coloneqq");fe("\\equalscolon","\\eqqcolon");fe("\\equalscoloncolon","\\Eqqcolon");fe("\\colonminus","\\coloneq");fe("\\coloncolonminus","\\Coloneq");fe("\\minuscolon","\\eqcolon");fe("\\minuscoloncolon","\\Eqcolon");fe("\\coloncolonapprox","\\Colonapprox");fe("\\coloncolonsim","\\Colonsim");fe("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}");fe("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}");fe("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}");fe("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}");fe("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}");fe("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}");fe("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}");fe("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}");fe("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}");fe("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}");fe("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}");fe("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}");fe("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}");fe("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}");fe("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}");fe("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}");fe("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}");fe("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}");fe("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}");fe("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}");fe("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}");fe("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}");fe("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}");fe("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228A}");fe("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2ACB}");fe("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228B}");fe("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2ACC}");fe("\\imath","\\html@mathml{\\@imath}{\u0131}");fe("\\jmath","\\html@mathml{\\@jmath}{\u0237}");fe("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27E6}}");fe("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27E7}}");fe("\u27E6","\\llbracket");fe("\u27E7","\\rrbracket");fe("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}");fe("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}");fe("\u2983","\\lBrace");fe("\u2984","\\rBrace");fe("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29B5}}");fe("\u29B5","\\minuso");fe("\\darr","\\downarrow");fe("\\dArr","\\Downarrow");fe("\\Darr","\\Downarrow");fe("\\lang","\\langle");fe("\\rang","\\rangle");fe("\\uarr","\\uparrow");fe("\\uArr","\\Uparrow");fe("\\Uarr","\\Uparrow");fe("\\N","\\mathbb{N}");fe("\\R","\\mathbb{R}");fe("\\Z","\\mathbb{Z}");fe("\\alef","\\aleph");fe("\\alefsym","\\aleph");fe("\\Alpha","\\mathrm{A}");fe("\\Beta","\\mathrm{B}");fe("\\bull","\\bullet");fe("\\Chi","\\mathrm{X}");fe("\\clubs","\\clubsuit");fe("\\cnums","\\mathbb{C}");fe("\\Complex","\\mathbb{C}");fe("\\Dagger","\\ddagger");fe("\\diamonds","\\diamondsuit");fe("\\empty","\\emptyset");fe("\\Epsilon","\\mathrm{E}");fe("\\Eta","\\mathrm{H}");fe("\\exist","\\exists");fe("\\harr","\\leftrightarrow");fe("\\hArr","\\Leftrightarrow");fe("\\Harr","\\Leftrightarrow");fe("\\hearts","\\heartsuit");fe("\\image","\\Im");fe("\\infin","\\infty");fe("\\Iota","\\mathrm{I}");fe("\\isin","\\in");fe("\\Kappa","\\mathrm{K}");fe("\\larr","\\leftarrow");fe("\\lArr","\\Leftarrow");fe("\\Larr","\\Leftarrow");fe("\\lrarr","\\leftrightarrow");fe("\\lrArr","\\Leftrightarrow");fe("\\Lrarr","\\Leftrightarrow");fe("\\Mu","\\mathrm{M}");fe("\\natnums","\\mathbb{N}");fe("\\Nu","\\mathrm{N}");fe("\\Omicron","\\mathrm{O}");fe("\\plusmn","\\pm");fe("\\rarr","\\rightarrow");fe("\\rArr","\\Rightarrow");fe("\\Rarr","\\Rightarrow");fe("\\real","\\Re");fe("\\reals","\\mathbb{R}");fe("\\Reals","\\mathbb{R}");fe("\\Rho","\\mathrm{P}");fe("\\sdot","\\cdot");fe("\\sect","\\S");fe("\\spades","\\spadesuit");fe("\\sub","\\subset");fe("\\sube","\\subseteq");fe("\\supe","\\supseteq");fe("\\Tau","\\mathrm{T}");fe("\\thetasym","\\vartheta");fe("\\weierp","\\wp");fe("\\Zeta","\\mathrm{Z}");fe("\\argmin","\\DOTSB\\operatorname*{arg\\,min}");fe("\\argmax","\\DOTSB\\operatorname*{arg\\,max}");fe("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits");fe("\\bra","\\mathinner{\\langle{#1}|}");fe("\\ket","\\mathinner{|{#1}\\rangle}");fe("\\braket","\\mathinner{\\langle{#1}\\rangle}");fe("\\Bra","\\left\\langle#1\\right|");fe("\\Ket","\\left|#1\\right\\rangle");vV=o(t=>e=>{var r=e.consumeArg().tokens,n=e.consumeArg().tokens,i=e.consumeArg().tokens,a=e.consumeArg().tokens,s=e.macros.get("|"),l=e.macros.get("\\|");e.macros.beginGroup();var u=o(d=>p=>{t&&(p.macros.set("|",s),i.length&&p.macros.set("\\|",l));var m=d;if(!d&&i.length){var g=p.future();g.text==="|"&&(p.popToken(),m=!0)}return{tokens:m?i:n,numArgs:0}},"midMacro");e.macros.set("|",u(!1)),i.length&&e.macros.set("\\|",u(!0));var h=e.consumeArg().tokens,f=e.expandTokens([...a,...h,...r]);return e.macros.endGroup(),{tokens:f.reverse(),numArgs:0}},"braketHelper");fe("\\bra@ket",vV(!1));fe("\\bra@set",vV(!0));fe("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");fe("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");fe("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");fe("\\angln","{\\angl n}");fe("\\blue","\\textcolor{##6495ed}{#1}");fe("\\orange","\\textcolor{##ffa500}{#1}");fe("\\pink","\\textcolor{##ff00af}{#1}");fe("\\red","\\textcolor{##df0030}{#1}");fe("\\green","\\textcolor{##28ae7b}{#1}");fe("\\gray","\\textcolor{gray}{#1}");fe("\\purple","\\textcolor{##9d38bd}{#1}");fe("\\blueA","\\textcolor{##ccfaff}{#1}");fe("\\blueB","\\textcolor{##80f6ff}{#1}");fe("\\blueC","\\textcolor{##63d9ea}{#1}");fe("\\blueD","\\textcolor{##11accd}{#1}");fe("\\blueE","\\textcolor{##0c7f99}{#1}");fe("\\tealA","\\textcolor{##94fff5}{#1}");fe("\\tealB","\\textcolor{##26edd5}{#1}");fe("\\tealC","\\textcolor{##01d1c1}{#1}");fe("\\tealD","\\textcolor{##01a995}{#1}");fe("\\tealE","\\textcolor{##208170}{#1}");fe("\\greenA","\\textcolor{##b6ffb0}{#1}");fe("\\greenB","\\textcolor{##8af281}{#1}");fe("\\greenC","\\textcolor{##74cf70}{#1}");fe("\\greenD","\\textcolor{##1fab54}{#1}");fe("\\greenE","\\textcolor{##0d923f}{#1}");fe("\\goldA","\\textcolor{##ffd0a9}{#1}");fe("\\goldB","\\textcolor{##ffbb71}{#1}");fe("\\goldC","\\textcolor{##ff9c39}{#1}");fe("\\goldD","\\textcolor{##e07d10}{#1}");fe("\\goldE","\\textcolor{##a75a05}{#1}");fe("\\redA","\\textcolor{##fca9a9}{#1}");fe("\\redB","\\textcolor{##ff8482}{#1}");fe("\\redC","\\textcolor{##f9685d}{#1}");fe("\\redD","\\textcolor{##e84d39}{#1}");fe("\\redE","\\textcolor{##bc2612}{#1}");fe("\\maroonA","\\textcolor{##ffbde0}{#1}");fe("\\maroonB","\\textcolor{##ff92c6}{#1}");fe("\\maroonC","\\textcolor{##ed5fa6}{#1}");fe("\\maroonD","\\textcolor{##ca337c}{#1}");fe("\\maroonE","\\textcolor{##9e034e}{#1}");fe("\\purpleA","\\textcolor{##ddd7ff}{#1}");fe("\\purpleB","\\textcolor{##c6b9fc}{#1}");fe("\\purpleC","\\textcolor{##aa87ff}{#1}");fe("\\purpleD","\\textcolor{##7854ab}{#1}");fe("\\purpleE","\\textcolor{##543b78}{#1}");fe("\\mintA","\\textcolor{##f5f9e8}{#1}");fe("\\mintB","\\textcolor{##edf2df}{#1}");fe("\\mintC","\\textcolor{##e0e5cc}{#1}");fe("\\grayA","\\textcolor{##f6f7f7}{#1}");fe("\\grayB","\\textcolor{##f0f1f2}{#1}");fe("\\grayC","\\textcolor{##e3e5e6}{#1}");fe("\\grayD","\\textcolor{##d6d8da}{#1}");fe("\\grayE","\\textcolor{##babec2}{#1}");fe("\\grayF","\\textcolor{##888d93}{#1}");fe("\\grayG","\\textcolor{##626569}{#1}");fe("\\grayH","\\textcolor{##3b3e40}{#1}");fe("\\grayI","\\textcolor{##21242c}{#1}");fe("\\kaBlue","\\textcolor{##314453}{#1}");fe("\\kaGreen","\\textcolor{##71B307}{#1}");xV={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},tA=class{static{o(this,"MacroExpander")}constructor(e,r,n){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=r,this.expansionCount=0,this.feed(e),this.macros=new eA(c5e,r.macros),this.mode=n,this.stack=[]}feed(e){this.lexer=new A3(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return this.stack.length===0&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var r,n,i;if(e){if(this.consumeSpaces(),this.future().text!=="[")return null;r=this.popToken(),{tokens:i,end:n}=this.consumeArg(["]"])}else({tokens:i,start:r,end:n}=this.consumeArg());return this.pushToken(new _o("EOF",n.loc)),this.pushTokens(i),r.range(n,"")}consumeSpaces(){for(;;){var e=this.future();if(e.text===" ")this.stack.pop();else break}}consumeArg(e){var r=[],n=e&&e.length>0;n||this.consumeSpaces();var i=this.future(),a,s=0,l=0;do{if(a=this.popToken(),r.push(a),a.text==="{")++s;else if(a.text==="}"){if(--s,s===-1)throw new pt("Extra }",a)}else if(a.text==="EOF")throw new pt("Unexpected end of input in a macro argument, expected '"+(e&&n?e[l]:"}")+"'",a);if(e&&n)if((s===0||s===1&&e[l]==="{")&&a.text===e[l]){if(++l,l===e.length){r.splice(-l,l);break}}else l=0}while(s!==0||n);return i.text==="{"&&r[r.length-1].text==="}"&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:i,end:a}}consumeArgs(e,r){if(r){if(r.length!==e+1)throw new pt("The length of delimiters doesn't match the number of args!");for(var n=r[0],i=0;ithis.settings.maxExpand)throw new pt("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var r=this.popToken(),n=r.text,i=r.noexpand?null:this._getExpansion(n);if(i==null||e&&i.unexpandable){if(e&&i==null&&n[0]==="\\"&&!this.isDefined(n))throw new pt("Undefined control sequence: "+n);return this.pushToken(r),!1}this.countExpansion(1);var a=i.tokens,s=this.consumeArgs(i.numArgs,i.delimiters);if(i.numArgs){a=a.slice();for(var l=a.length-1;l>=0;--l){var u=a[l];if(u.text==="#"){if(l===0)throw new pt("Incomplete placeholder at end of macro body",u);if(u=a[--l],u.text==="#")a.splice(l+1,1);else if(/^[1-9]$/.test(u.text))a.splice(l,2,...s[+u.text-1]);else throw new pt("Not a valid argument number",u)}}}return this.pushTokens(a),a.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(this.expandOnce()===!1){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new _o(e)]):void 0}expandTokens(e){var r=[],n=this.stack.length;for(this.pushTokens(e);this.stack.length>n;)if(this.expandOnce(!0)===!1){var i=this.stack.pop();i.treatAsRelax&&(i.noexpand=!1,i.treatAsRelax=!1),r.push(i)}return this.countExpansion(r.length),r}expandMacroAsText(e){var r=this.expandMacro(e);return r&&r.map(n=>n.text).join("")}_getExpansion(e){var r=this.macros.get(e);if(r==null)return r;if(e.length===1){var n=this.lexer.catcodes[e];if(n!=null&&n!==13)return}var i=typeof r=="function"?r(this):r;if(typeof i=="string"){var a=0;if(i.indexOf("#")!==-1)for(var s=i.replace(/##/g,"");s.indexOf("#"+(a+1))!==-1;)++a;for(var l=new A3(i,this.settings),u=[],h=l.lex();h.text!=="EOF";)u.push(h),h=l.lex();u.reverse();var f={tokens:u,numArgs:a};return f}return i}isDefined(e){return this.macros.has(e)||yh.hasOwnProperty(e)||An.math.hasOwnProperty(e)||An.text.hasOwnProperty(e)||xV.hasOwnProperty(e)}isExpandable(e){var r=this.macros.get(e);return r!=null?typeof r=="string"||typeof r=="function"||!r.unexpandable:yh.hasOwnProperty(e)&&!yh[e].primitive}},EG=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,x3=Object.freeze({"\u208A":"+","\u208B":"-","\u208C":"=","\u208D":"(","\u208E":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1D62":"i","\u2C7C":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209A":"p","\u1D63":"r","\u209B":"s","\u209C":"t","\u1D64":"u","\u1D65":"v","\u2093":"x","\u1D66":"\u03B2","\u1D67":"\u03B3","\u1D68":"\u03C1","\u1D69":"\u03D5","\u1D6A":"\u03C7","\u207A":"+","\u207B":"-","\u207C":"=","\u207D":"(","\u207E":")","\u2070":"0","\xB9":"1","\xB2":"2","\xB3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1D2C":"A","\u1D2E":"B","\u1D30":"D","\u1D31":"E","\u1D33":"G","\u1D34":"H","\u1D35":"I","\u1D36":"J","\u1D37":"K","\u1D38":"L","\u1D39":"M","\u1D3A":"N","\u1D3C":"O","\u1D3E":"P","\u1D3F":"R","\u1D40":"T","\u1D41":"U","\u2C7D":"V","\u1D42":"W","\u1D43":"a","\u1D47":"b","\u1D9C":"c","\u1D48":"d","\u1D49":"e","\u1DA0":"f","\u1D4D":"g",\u02B0:"h","\u2071":"i",\u02B2:"j","\u1D4F":"k",\u02E1:"l","\u1D50":"m",\u207F:"n","\u1D52":"o","\u1D56":"p",\u02B3:"r",\u02E2:"s","\u1D57":"t","\u1D58":"u","\u1D5B":"v",\u02B7:"w",\u02E3:"x",\u02B8:"y","\u1DBB":"z","\u1D5D":"\u03B2","\u1D5E":"\u03B3","\u1D5F":"\u03B4","\u1D60":"\u03D5","\u1D61":"\u03C7","\u1DBF":"\u03B8"}),U7={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030C":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030A":{text:"\\r",math:"\\mathring"},"\u030B":{text:"\\H"},"\u0327":{text:"\\c"}},SG={\u00E1:"a\u0301",\u00E0:"a\u0300",\u00E4:"a\u0308",\u01DF:"a\u0308\u0304",\u00E3:"a\u0303",\u0101:"a\u0304",\u0103:"a\u0306",\u1EAF:"a\u0306\u0301",\u1EB1:"a\u0306\u0300",\u1EB5:"a\u0306\u0303",\u01CE:"a\u030C",\u00E2:"a\u0302",\u1EA5:"a\u0302\u0301",\u1EA7:"a\u0302\u0300",\u1EAB:"a\u0302\u0303",\u0227:"a\u0307",\u01E1:"a\u0307\u0304",\u00E5:"a\u030A",\u01FB:"a\u030A\u0301",\u1E03:"b\u0307",\u0107:"c\u0301",\u1E09:"c\u0327\u0301",\u010D:"c\u030C",\u0109:"c\u0302",\u010B:"c\u0307",\u00E7:"c\u0327",\u010F:"d\u030C",\u1E0B:"d\u0307",\u1E11:"d\u0327",\u00E9:"e\u0301",\u00E8:"e\u0300",\u00EB:"e\u0308",\u1EBD:"e\u0303",\u0113:"e\u0304",\u1E17:"e\u0304\u0301",\u1E15:"e\u0304\u0300",\u0115:"e\u0306",\u1E1D:"e\u0327\u0306",\u011B:"e\u030C",\u00EA:"e\u0302",\u1EBF:"e\u0302\u0301",\u1EC1:"e\u0302\u0300",\u1EC5:"e\u0302\u0303",\u0117:"e\u0307",\u0229:"e\u0327",\u1E1F:"f\u0307",\u01F5:"g\u0301",\u1E21:"g\u0304",\u011F:"g\u0306",\u01E7:"g\u030C",\u011D:"g\u0302",\u0121:"g\u0307",\u0123:"g\u0327",\u1E27:"h\u0308",\u021F:"h\u030C",\u0125:"h\u0302",\u1E23:"h\u0307",\u1E29:"h\u0327",\u00ED:"i\u0301",\u00EC:"i\u0300",\u00EF:"i\u0308",\u1E2F:"i\u0308\u0301",\u0129:"i\u0303",\u012B:"i\u0304",\u012D:"i\u0306",\u01D0:"i\u030C",\u00EE:"i\u0302",\u01F0:"j\u030C",\u0135:"j\u0302",\u1E31:"k\u0301",\u01E9:"k\u030C",\u0137:"k\u0327",\u013A:"l\u0301",\u013E:"l\u030C",\u013C:"l\u0327",\u1E3F:"m\u0301",\u1E41:"m\u0307",\u0144:"n\u0301",\u01F9:"n\u0300",\u00F1:"n\u0303",\u0148:"n\u030C",\u1E45:"n\u0307",\u0146:"n\u0327",\u00F3:"o\u0301",\u00F2:"o\u0300",\u00F6:"o\u0308",\u022B:"o\u0308\u0304",\u00F5:"o\u0303",\u1E4D:"o\u0303\u0301",\u1E4F:"o\u0303\u0308",\u022D:"o\u0303\u0304",\u014D:"o\u0304",\u1E53:"o\u0304\u0301",\u1E51:"o\u0304\u0300",\u014F:"o\u0306",\u01D2:"o\u030C",\u00F4:"o\u0302",\u1ED1:"o\u0302\u0301",\u1ED3:"o\u0302\u0300",\u1ED7:"o\u0302\u0303",\u022F:"o\u0307",\u0231:"o\u0307\u0304",\u0151:"o\u030B",\u1E55:"p\u0301",\u1E57:"p\u0307",\u0155:"r\u0301",\u0159:"r\u030C",\u1E59:"r\u0307",\u0157:"r\u0327",\u015B:"s\u0301",\u1E65:"s\u0301\u0307",\u0161:"s\u030C",\u1E67:"s\u030C\u0307",\u015D:"s\u0302",\u1E61:"s\u0307",\u015F:"s\u0327",\u1E97:"t\u0308",\u0165:"t\u030C",\u1E6B:"t\u0307",\u0163:"t\u0327",\u00FA:"u\u0301",\u00F9:"u\u0300",\u00FC:"u\u0308",\u01D8:"u\u0308\u0301",\u01DC:"u\u0308\u0300",\u01D6:"u\u0308\u0304",\u01DA:"u\u0308\u030C",\u0169:"u\u0303",\u1E79:"u\u0303\u0301",\u016B:"u\u0304",\u1E7B:"u\u0304\u0308",\u016D:"u\u0306",\u01D4:"u\u030C",\u00FB:"u\u0302",\u016F:"u\u030A",\u0171:"u\u030B",\u1E7D:"v\u0303",\u1E83:"w\u0301",\u1E81:"w\u0300",\u1E85:"w\u0308",\u0175:"w\u0302",\u1E87:"w\u0307",\u1E98:"w\u030A",\u1E8D:"x\u0308",\u1E8B:"x\u0307",\u00FD:"y\u0301",\u1EF3:"y\u0300",\u00FF:"y\u0308",\u1EF9:"y\u0303",\u0233:"y\u0304",\u0177:"y\u0302",\u1E8F:"y\u0307",\u1E99:"y\u030A",\u017A:"z\u0301",\u017E:"z\u030C",\u1E91:"z\u0302",\u017C:"z\u0307",\u00C1:"A\u0301",\u00C0:"A\u0300",\u00C4:"A\u0308",\u01DE:"A\u0308\u0304",\u00C3:"A\u0303",\u0100:"A\u0304",\u0102:"A\u0306",\u1EAE:"A\u0306\u0301",\u1EB0:"A\u0306\u0300",\u1EB4:"A\u0306\u0303",\u01CD:"A\u030C",\u00C2:"A\u0302",\u1EA4:"A\u0302\u0301",\u1EA6:"A\u0302\u0300",\u1EAA:"A\u0302\u0303",\u0226:"A\u0307",\u01E0:"A\u0307\u0304",\u00C5:"A\u030A",\u01FA:"A\u030A\u0301",\u1E02:"B\u0307",\u0106:"C\u0301",\u1E08:"C\u0327\u0301",\u010C:"C\u030C",\u0108:"C\u0302",\u010A:"C\u0307",\u00C7:"C\u0327",\u010E:"D\u030C",\u1E0A:"D\u0307",\u1E10:"D\u0327",\u00C9:"E\u0301",\u00C8:"E\u0300",\u00CB:"E\u0308",\u1EBC:"E\u0303",\u0112:"E\u0304",\u1E16:"E\u0304\u0301",\u1E14:"E\u0304\u0300",\u0114:"E\u0306",\u1E1C:"E\u0327\u0306",\u011A:"E\u030C",\u00CA:"E\u0302",\u1EBE:"E\u0302\u0301",\u1EC0:"E\u0302\u0300",\u1EC4:"E\u0302\u0303",\u0116:"E\u0307",\u0228:"E\u0327",\u1E1E:"F\u0307",\u01F4:"G\u0301",\u1E20:"G\u0304",\u011E:"G\u0306",\u01E6:"G\u030C",\u011C:"G\u0302",\u0120:"G\u0307",\u0122:"G\u0327",\u1E26:"H\u0308",\u021E:"H\u030C",\u0124:"H\u0302",\u1E22:"H\u0307",\u1E28:"H\u0327",\u00CD:"I\u0301",\u00CC:"I\u0300",\u00CF:"I\u0308",\u1E2E:"I\u0308\u0301",\u0128:"I\u0303",\u012A:"I\u0304",\u012C:"I\u0306",\u01CF:"I\u030C",\u00CE:"I\u0302",\u0130:"I\u0307",\u0134:"J\u0302",\u1E30:"K\u0301",\u01E8:"K\u030C",\u0136:"K\u0327",\u0139:"L\u0301",\u013D:"L\u030C",\u013B:"L\u0327",\u1E3E:"M\u0301",\u1E40:"M\u0307",\u0143:"N\u0301",\u01F8:"N\u0300",\u00D1:"N\u0303",\u0147:"N\u030C",\u1E44:"N\u0307",\u0145:"N\u0327",\u00D3:"O\u0301",\u00D2:"O\u0300",\u00D6:"O\u0308",\u022A:"O\u0308\u0304",\u00D5:"O\u0303",\u1E4C:"O\u0303\u0301",\u1E4E:"O\u0303\u0308",\u022C:"O\u0303\u0304",\u014C:"O\u0304",\u1E52:"O\u0304\u0301",\u1E50:"O\u0304\u0300",\u014E:"O\u0306",\u01D1:"O\u030C",\u00D4:"O\u0302",\u1ED0:"O\u0302\u0301",\u1ED2:"O\u0302\u0300",\u1ED6:"O\u0302\u0303",\u022E:"O\u0307",\u0230:"O\u0307\u0304",\u0150:"O\u030B",\u1E54:"P\u0301",\u1E56:"P\u0307",\u0154:"R\u0301",\u0158:"R\u030C",\u1E58:"R\u0307",\u0156:"R\u0327",\u015A:"S\u0301",\u1E64:"S\u0301\u0307",\u0160:"S\u030C",\u1E66:"S\u030C\u0307",\u015C:"S\u0302",\u1E60:"S\u0307",\u015E:"S\u0327",\u0164:"T\u030C",\u1E6A:"T\u0307",\u0162:"T\u0327",\u00DA:"U\u0301",\u00D9:"U\u0300",\u00DC:"U\u0308",\u01D7:"U\u0308\u0301",\u01DB:"U\u0308\u0300",\u01D5:"U\u0308\u0304",\u01D9:"U\u0308\u030C",\u0168:"U\u0303",\u1E78:"U\u0303\u0301",\u016A:"U\u0304",\u1E7A:"U\u0304\u0308",\u016C:"U\u0306",\u01D3:"U\u030C",\u00DB:"U\u0302",\u016E:"U\u030A",\u0170:"U\u030B",\u1E7C:"V\u0303",\u1E82:"W\u0301",\u1E80:"W\u0300",\u1E84:"W\u0308",\u0174:"W\u0302",\u1E86:"W\u0307",\u1E8C:"X\u0308",\u1E8A:"X\u0307",\u00DD:"Y\u0301",\u1EF2:"Y\u0300",\u0178:"Y\u0308",\u1EF8:"Y\u0303",\u0232:"Y\u0304",\u0176:"Y\u0302",\u1E8E:"Y\u0307",\u0179:"Z\u0301",\u017D:"Z\u030C",\u1E90:"Z\u0302",\u017B:"Z\u0307",\u03AC:"\u03B1\u0301",\u1F70:"\u03B1\u0300",\u1FB1:"\u03B1\u0304",\u1FB0:"\u03B1\u0306",\u03AD:"\u03B5\u0301",\u1F72:"\u03B5\u0300",\u03AE:"\u03B7\u0301",\u1F74:"\u03B7\u0300",\u03AF:"\u03B9\u0301",\u1F76:"\u03B9\u0300",\u03CA:"\u03B9\u0308",\u0390:"\u03B9\u0308\u0301",\u1FD2:"\u03B9\u0308\u0300",\u1FD1:"\u03B9\u0304",\u1FD0:"\u03B9\u0306",\u03CC:"\u03BF\u0301",\u1F78:"\u03BF\u0300",\u03CD:"\u03C5\u0301",\u1F7A:"\u03C5\u0300",\u03CB:"\u03C5\u0308",\u03B0:"\u03C5\u0308\u0301",\u1FE2:"\u03C5\u0308\u0300",\u1FE1:"\u03C5\u0304",\u1FE0:"\u03C5\u0306",\u03CE:"\u03C9\u0301",\u1F7C:"\u03C9\u0300",\u038E:"\u03A5\u0301",\u1FEA:"\u03A5\u0300",\u03AB:"\u03A5\u0308",\u1FE9:"\u03A5\u0304",\u1FE8:"\u03A5\u0306",\u038F:"\u03A9\u0301",\u1FFA:"\u03A9\u0300"},_3=class t{static{o(this,"Parser")}constructor(e,r){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new tA(e,r,this.mode),this.settings=r,this.leftrightDepth=0}expect(e,r){if(r===void 0&&(r=!0),this.fetch().text!==e)throw new pt("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return this.nextToken==null&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var r=this.nextToken;this.consume(),this.gullet.pushToken(new _o("}")),this.gullet.pushTokens(e);var n=this.parseExpression(!1);return this.expect("}"),this.nextToken=r,n}parseExpression(e,r){for(var n=[];;){this.mode==="math"&&this.consumeSpaces();var i=this.fetch();if(t.endOfExpression.indexOf(i.text)!==-1||r&&i.text===r||e&&yh[i.text]&&yh[i.text].infix)break;var a=this.parseAtom(r);if(a){if(a.type==="internal")continue}else break;n.push(a)}return this.mode==="text"&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(e){for(var r=-1,n,i=0;i=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+r[0]+'" used in math mode',e);var l=An[this.mode][r].group,u=Qs.range(e),h;if(e3e.hasOwnProperty(l)){var f=l;h={type:"atom",mode:this.mode,family:f,loc:u,text:r}}else h={type:l,mode:this.mode,loc:u,text:r};s=h}else if(r.charCodeAt(0)>=128)this.settings.strict&&(AG(r.charCodeAt(0))?this.mode==="math"&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+r[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+r[0]+'"'+(" ("+r.charCodeAt(0)+")"),e)),s={type:"textord",mode:"text",loc:Qs.range(e),text:r};else return null;if(this.consume(),a)for(var d=0;d{e instanceof Element&&e.tagName==="A"&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),mh.addHook("afterSanitizeAttributes",e=>{e instanceof Element&&e.tagName==="A"&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),e.getAttribute("target")==="_blank"&&e.setAttribute("rel","noopener"))})}var ud,h5e,f5e,LV,_V,wr,p5e,m5e,g5e,y5e,RV,mu,dr,v5e,x5e,ic,bA,b5e,T5e,DV,P3,yi,hd,Th,Ze,pr=N(()=>{"use strict";L7();ud=//gi,h5e=o(t=>t?RV(t).replace(/\\n/g,"#br#").split("#br#"):[""],"getRows"),f5e=(()=>{let t=!1;return()=>{t||(d5e(),t=!0)}})();o(d5e,"setupDompurifyHooks");LV=o(t=>(f5e(),mh.sanitize(t)),"removeScript"),_V=o((t,e)=>{if(e.flowchart?.htmlLabels!==!1){let r=e.securityLevel;r==="antiscript"||r==="strict"?t=LV(t):r!=="loose"&&(t=RV(t),t=t.replace(//g,">"),t=t.replace(/=/g,"="),t=y5e(t))}return t},"sanitizeMore"),wr=o((t,e)=>t&&(e.dompurifyConfig?t=mh.sanitize(_V(t,e),e.dompurifyConfig).toString():t=mh.sanitize(_V(t,e),{FORBID_TAGS:["style"]}).toString(),t),"sanitizeText"),p5e=o((t,e)=>typeof t=="string"?wr(t,e):t.flat().map(r=>wr(r,e)),"sanitizeTextOrArray"),m5e=o(t=>ud.test(t),"hasBreaks"),g5e=o(t=>t.split(ud),"splitBreaks"),y5e=o(t=>t.replace(/#br#/g,"
    "),"placeholderToBreak"),RV=o(t=>t.replace(ud,"#br#"),"breakToPlaceholder"),mu=o(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),dr=o(t=>!(t===!1||["false","null","0"].includes(String(t).trim().toLowerCase())),"evaluate"),v5e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.max(...e)},"getMax"),x5e=o(function(...t){let e=t.filter(r=>!isNaN(r));return Math.min(...e)},"getMin"),ic=o(function(t){let e=t.split(/(,)/),r=[];for(let n=0;n0&&n+1Math.max(0,t.split(e).length-1),"countOccurrence"),b5e=o((t,e)=>{let r=bA(t,"~"),n=bA(e,"~");return r===1&&n===1},"shouldCombineSets"),T5e=o(t=>{let e=bA(t,"~"),r=!1;if(e<=1)return t;e%2!==0&&t.startsWith("~")&&(t=t.substring(1),r=!0);let n=[...t],i=n.indexOf("~"),a=n.lastIndexOf("~");for(;i!==-1&&a!==-1&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),DV=o(()=>window.MathMLElement!==void 0,"isMathMLSupported"),P3=/\$\$(.*)\$\$/g,yi=o(t=>(t.match(P3)?.length??0)>0,"hasKatex"),hd=o(async(t,e)=>{t=await Th(t,e);let r=document.createElement("div");r.innerHTML=t,r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0",document.querySelector("body")?.insertAdjacentElement("beforeend",r);let i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),Th=o(async(t,e)=>{if(!yi(t))return t;if(!(DV()||e.legacyMathML||e.forceLegacyMathML))return t.replace(P3,"MathML is unsupported in this environment.");{let{default:r}=await Promise.resolve().then(()=>(AV(),CV)),n=e.forceLegacyMathML||!DV()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(ud).map(i=>yi(i)?`
    ${i}
    `:`
    ${i}
    `).join("").replace(P3,(i,a)=>r.renderToString(a,{throwOnError:!0,displayMode:!0,output:n}).replace(/\n/g," ").replace(//g,""))}return t.replace(P3,"Katex is not supported in @mermaid-js/tiny. Please use the full mermaid library.")},"renderKatex"),Ze={getRows:h5e,sanitizeText:wr,sanitizeTextOrArray:p5e,hasBreaks:m5e,splitBreaks:g5e,lineBreakRegex:ud,removeScript:LV,getUrl:mu,evaluate:dr,getMax:v5e,getMin:x5e}});var w5e,k5e,fn,Lo,xi=N(()=>{"use strict";yt();w5e=o(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),k5e=o(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),fn=o(function(t,e,r,n){let i=k5e(e,r,n);w5e(t,i)},"configureSvgSize"),Lo=o(function(t,e,r,n){let i=e.node().getBBox(),a=i.width,s=i.height;X.info(`SVG bounds: ${a}x${s}`,i);let l=0,u=0;X.info(`Graph bounds: ${l}x${u}`,t),l=a+r*2,u=s+r*2,X.info(`Calculated bounds: ${l}x${u}`),fn(e,u,l,n);let h=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",h)},"setupGraphViewbox")});var B3,E5e,NV,MV,TA=N(()=>{"use strict";yt();B3={},E5e=o((t,e,r)=>{let n="";return t in B3&&B3[t]?n=B3[t](r):X.warn(`No theme found for ${t}`),` & { - font-family: ${r.fontFamily}; - font-size: ${r.fontSize}; - fill: ${r.textColor} - } - @keyframes edge-animation-frame { - from { - stroke-dashoffset: 0; - } - } - @keyframes dash { - to { - stroke-dashoffset: 0; - } - } - & .edge-animation-slow { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 50s linear infinite; - stroke-linecap: round; - } - & .edge-animation-fast { - stroke-dasharray: 9,5 !important; - stroke-dashoffset: 900; - animation: dash 20s linear infinite; - stroke-linecap: round; - } - /* Classes common for multiple diagrams */ - - & .error-icon { - fill: ${r.errorBkgColor}; - } - & .error-text { - fill: ${r.errorTextColor}; - stroke: ${r.errorTextColor}; - } - - & .edge-thickness-normal { - stroke-width: 1px; - } - & .edge-thickness-thick { - stroke-width: 3.5px - } - & .edge-pattern-solid { - stroke-dasharray: 0; - } - & .edge-thickness-invisible { - stroke-width: 0; - fill: none; - } - & .edge-pattern-dashed{ - stroke-dasharray: 3; - } - .edge-pattern-dotted { - stroke-dasharray: 2; - } - - & .marker { - fill: ${r.lineColor}; - stroke: ${r.lineColor}; - } - & .marker.cross { - stroke: ${r.lineColor}; - } - - & svg { - font-family: ${r.fontFamily}; - font-size: ${r.fontSize}; - } - & p { - margin: 0 - } - - ${n} - - ${e} -`},"getStyles"),NV=o((t,e)=>{e!==void 0&&(B3[t]=e)},"addStylesForDiagram"),MV=E5e});var rv={};ur(rv,{clear:()=>kr,getAccDescription:()=>Rr,getAccTitle:()=>Dr,getDiagramTitle:()=>Nr,setAccDescription:()=>Lr,setAccTitle:()=>Ar,setDiagramTitle:()=>Or});var wA,kA,EA,SA,kr,Ar,Dr,Lr,Rr,Or,Nr,ci=N(()=>{"use strict";pr();mi();wA="",kA="",EA="",SA=o(t=>wr(t,tr()),"sanitizeText"),kr=o(()=>{wA="",EA="",kA=""},"clear"),Ar=o(t=>{wA=SA(t).replace(/^\s+/g,"")},"setAccTitle"),Dr=o(()=>wA,"getAccTitle"),Lr=o(t=>{EA=SA(t).replace(/\n\s+/g,` -`)},"setAccDescription"),Rr=o(()=>EA,"getAccDescription"),Or=o(t=>{kA=SA(t)},"setDiagramTitle"),Nr=o(()=>kA,"getDiagramTitle")});var IV,S5e,me,nv,$3,fd,AA,C5e,F3,dd,iv,CA,Gt=N(()=>{"use strict";rd();yt();mi();pr();xi();TA();ci();IV=X,S5e=Dy,me=tr,nv=a3,$3=ph,fd=o(t=>wr(t,me()),"sanitizeText"),AA=Lo,C5e=o(()=>rv,"getCommonDb"),F3={},dd=o((t,e,r)=>{F3[t]&&IV.warn(`Diagram with id ${t} already registered. Overwriting.`),F3[t]=e,r&&i7(t,r),NV(t,e.styles),e.injectUtils?.(IV,S5e,me,fd,AA,C5e(),()=>{})},"registerDiagram"),iv=o(t=>{if(t in F3)return F3[t];throw new CA(t)},"getDiagram"),CA=class extends Error{static{o(this,"DiagramNotFoundError")}constructor(e){super(`Diagram ${e} not found.`)}}});var ml,wh,is,pl,ac,av,_A,DA,z3,G3,OV,A5e,_5e,D5e,L5e,R5e,N5e,M5e,I5e,O5e,P5e,B5e,F5e,$5e,z5e,G5e,V5e,U5e,PV,H5e,W5e,BV,q5e,Y5e,X5e,j5e,kh,K5e,Q5e,Z5e,J5e,eTe,sv,LA=N(()=>{"use strict";Gt();pr();ci();ml=[],wh=[""],is="global",pl="",ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],av=[],_A="",DA=!1,z3=4,G3=2,A5e=o(function(){return OV},"getC4Type"),_5e=o(function(t){OV=wr(t,me())},"setC4Type"),D5e=o(function(t,e,r,n,i,a,s,l,u){if(t==null||e===void 0||e===null||r===void 0||r===null||n===void 0||n===null)return;let h={},f=av.find(d=>d.from===e&&d.to===r);if(f?h=f:av.push(h),h.type=t,h.from=e,h.to=r,h.label={text:n},i==null)h.techn={text:""};else if(typeof i=="object"){let[d,p]=Object.entries(i)[0];h[d]={text:p}}else h.techn={text:i};if(a==null)h.descr={text:""};else if(typeof a=="object"){let[d,p]=Object.entries(a)[0];h[d]={text:p}}else h.descr={text:a};if(typeof s=="object"){let[d,p]=Object.entries(s)[0];h[d]=p}else h.sprite=s;if(typeof l=="object"){let[d,p]=Object.entries(l)[0];h[d]=p}else h.tags=l;if(typeof u=="object"){let[d,p]=Object.entries(u)[0];h[d]=p}else h.link=u;h.wrap=kh()},"addRel"),L5e=o(function(t,e,r,n,i,a,s){if(e===null||r===null)return;let l={},u=ml.find(h=>h.alias===e);if(u&&e===u.alias?l=u:(l.alias=e,ml.push(l)),r==null?l.label={text:""}:l.label={text:r},n==null)l.descr={text:""};else if(typeof n=="object"){let[h,f]=Object.entries(n)[0];l[h]={text:f}}else l.descr={text:n};if(typeof i=="object"){let[h,f]=Object.entries(i)[0];l[h]=f}else l.sprite=i;if(typeof a=="object"){let[h,f]=Object.entries(a)[0];l[h]=f}else l.tags=a;if(typeof s=="object"){let[h,f]=Object.entries(s)[0];l[h]=f}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=is,l.wrap=kh()},"addPersonOrSystem"),R5e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=kh(),u.typeC4Shape={text:t},u.parentBoundary=is},"addContainer"),N5e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ml.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ml.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.techn={text:""};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.techn={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof a=="object"){let[f,d]=Object.entries(a)[0];u[f]=d}else u.sprite=a;if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.wrap=kh(),u.typeC4Shape={text:t},u.parentBoundary=is},"addComponent"),M5e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"system"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=is,a.wrap=kh(),pl=is,is=t,wh.push(pl)},"addPersonOrSystemBoundary"),I5e=o(function(t,e,r,n,i){if(t===null||e===null)return;let a={},s=ac.find(l=>l.alias===t);if(s&&t===s.alias?a=s:(a.alias=t,ac.push(a)),e==null?a.label={text:""}:a.label={text:e},r==null)a.type={text:"container"};else if(typeof r=="object"){let[l,u]=Object.entries(r)[0];a[l]={text:u}}else a.type={text:r};if(typeof n=="object"){let[l,u]=Object.entries(n)[0];a[l]=u}else a.tags=n;if(typeof i=="object"){let[l,u]=Object.entries(i)[0];a[l]=u}else a.link=i;a.parentBoundary=is,a.wrap=kh(),pl=is,is=t,wh.push(pl)},"addContainerBoundary"),O5e=o(function(t,e,r,n,i,a,s,l){if(e===null||r===null)return;let u={},h=ac.find(f=>f.alias===e);if(h&&e===h.alias?u=h:(u.alias=e,ac.push(u)),r==null?u.label={text:""}:u.label={text:r},n==null)u.type={text:"node"};else if(typeof n=="object"){let[f,d]=Object.entries(n)[0];u[f]={text:d}}else u.type={text:n};if(i==null)u.descr={text:""};else if(typeof i=="object"){let[f,d]=Object.entries(i)[0];u[f]={text:d}}else u.descr={text:i};if(typeof s=="object"){let[f,d]=Object.entries(s)[0];u[f]=d}else u.tags=s;if(typeof l=="object"){let[f,d]=Object.entries(l)[0];u[f]=d}else u.link=l;u.nodeType=t,u.parentBoundary=is,u.wrap=kh(),pl=is,is=e,wh.push(pl)},"addDeploymentNode"),P5e=o(function(){is=pl,wh.pop(),pl=wh.pop(),wh.push(pl)},"popBoundaryParseStack"),B5e=o(function(t,e,r,n,i,a,s,l,u,h,f){let d=ml.find(p=>p.alias===e);if(!(d===void 0&&(d=ac.find(p=>p.alias===e),d===void 0))){if(r!=null)if(typeof r=="object"){let[p,m]=Object.entries(r)[0];d[p]=m}else d.bgColor=r;if(n!=null)if(typeof n=="object"){let[p,m]=Object.entries(n)[0];d[p]=m}else d.fontColor=n;if(i!=null)if(typeof i=="object"){let[p,m]=Object.entries(i)[0];d[p]=m}else d.borderColor=i;if(a!=null)if(typeof a=="object"){let[p,m]=Object.entries(a)[0];d[p]=m}else d.shadowing=a;if(s!=null)if(typeof s=="object"){let[p,m]=Object.entries(s)[0];d[p]=m}else d.shape=s;if(l!=null)if(typeof l=="object"){let[p,m]=Object.entries(l)[0];d[p]=m}else d.sprite=l;if(u!=null)if(typeof u=="object"){let[p,m]=Object.entries(u)[0];d[p]=m}else d.techn=u;if(h!=null)if(typeof h=="object"){let[p,m]=Object.entries(h)[0];d[p]=m}else d.legendText=h;if(f!=null)if(typeof f=="object"){let[p,m]=Object.entries(f)[0];d[p]=m}else d.legendSprite=f}},"updateElStyle"),F5e=o(function(t,e,r,n,i,a,s){let l=av.find(u=>u.from===e&&u.to===r);if(l!==void 0){if(n!=null)if(typeof n=="object"){let[u,h]=Object.entries(n)[0];l[u]=h}else l.textColor=n;if(i!=null)if(typeof i=="object"){let[u,h]=Object.entries(i)[0];l[u]=h}else l.lineColor=i;if(a!=null)if(typeof a=="object"){let[u,h]=Object.entries(a)[0];l[u]=parseInt(h)}else l.offsetX=parseInt(a);if(s!=null)if(typeof s=="object"){let[u,h]=Object.entries(s)[0];l[u]=parseInt(h)}else l.offsetY=parseInt(s)}},"updateRelStyle"),$5e=o(function(t,e,r){let n=z3,i=G3;if(typeof e=="object"){let a=Object.values(e)[0];n=parseInt(a)}else n=parseInt(e);if(typeof r=="object"){let a=Object.values(r)[0];i=parseInt(a)}else i=parseInt(r);n>=1&&(z3=n),i>=1&&(G3=i)},"updateLayoutConfig"),z5e=o(function(){return z3},"getC4ShapeInRow"),G5e=o(function(){return G3},"getC4BoundaryInRow"),V5e=o(function(){return is},"getCurrentBoundaryParse"),U5e=o(function(){return pl},"getParentBoundaryParse"),PV=o(function(t){return t==null?ml:ml.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),H5e=o(function(t){return ml.find(e=>e.alias===t)},"getC4Shape"),W5e=o(function(t){return Object.keys(PV(t))},"getC4ShapeKeys"),BV=o(function(t){return t==null?ac:ac.filter(e=>e.parentBoundary===t)},"getBoundaries"),q5e=BV,Y5e=o(function(){return av},"getRels"),X5e=o(function(){return _A},"getTitle"),j5e=o(function(t){DA=t},"setWrap"),kh=o(function(){return DA},"autoWrap"),K5e=o(function(){ml=[],ac=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],pl="",is="global",wh=[""],av=[],wh=[""],_A="",DA=!1,z3=4,G3=2},"clear"),Q5e={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},Z5e={FILLED:0,OPEN:1},J5e={LEFTOF:0,RIGHTOF:1,OVER:2},eTe=o(function(t){_A=wr(t,me())},"setTitle"),sv={addPersonOrSystem:L5e,addPersonOrSystemBoundary:M5e,addContainer:R5e,addContainerBoundary:I5e,addComponent:N5e,addDeploymentNode:O5e,popBoundaryParseStack:P5e,addRel:D5e,updateElStyle:B5e,updateRelStyle:F5e,updateLayoutConfig:$5e,autoWrap:kh,setWrap:j5e,getC4ShapeArray:PV,getC4Shape:H5e,getC4ShapeKeys:W5e,getBoundaries:BV,getBoundarys:q5e,getCurrentBoundaryParse:V5e,getParentBoundaryParse:U5e,getRels:Y5e,getTitle:X5e,getC4Type:A5e,getC4ShapeInRow:z5e,getC4BoundaryInRow:G5e,setAccTitle:Ar,getAccTitle:Dr,getAccDescription:Rr,setAccDescription:Lr,getConfig:o(()=>me().c4,"getConfig"),clear:K5e,LINETYPE:Q5e,ARROWTYPE:Z5e,PLACEMENT:J5e,setTitle:eTe,setC4Type:_5e}});function pd(t,e){return t==null||e==null?NaN:te?1:t>=e?0:NaN}var RA=N(()=>{"use strict";o(pd,"ascending")});function NA(t,e){return t==null||e==null?NaN:et?1:e>=t?0:NaN}var FV=N(()=>{"use strict";o(NA,"descending")});function md(t){let e,r,n;t.length!==2?(e=pd,r=o((l,u)=>pd(t(l),u),"compare2"),n=o((l,u)=>t(l)-u,"delta")):(e=t===pd||t===NA?t:tTe,r=t,n=t);function i(l,u,h=0,f=l.length){if(h>>1;r(l[d],u)<0?h=d+1:f=d}while(h>>1;r(l[d],u)<=0?h=d+1:f=d}while(hh&&n(l[d-1],u)>-n(l[d],u)?d-1:d}return o(s,"center"),{left:i,center:s,right:a}}function tTe(){return 0}var MA=N(()=>{"use strict";RA();FV();o(md,"bisector");o(tTe,"zero")});function IA(t){return t===null?NaN:+t}var $V=N(()=>{"use strict";o(IA,"number")});var zV,GV,rTe,nTe,OA,VV=N(()=>{"use strict";RA();MA();$V();zV=md(pd),GV=zV.right,rTe=zV.left,nTe=md(IA).center,OA=GV});function UV({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):r}function iTe({_intern:t,_key:e},r){let n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function aTe({_intern:t,_key:e},r){let n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function sTe(t){return t!==null&&typeof t=="object"?t.valueOf():t}var C0,HV=N(()=>{"use strict";C0=class extends Map{static{o(this,"InternMap")}constructor(e,r=sTe){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:r}}),e!=null)for(let[n,i]of e)this.set(n,i)}get(e){return super.get(UV(this,e))}has(e){return super.has(UV(this,e))}set(e,r){return super.set(iTe(this,e),r)}delete(e){return super.delete(aTe(this,e))}};o(UV,"intern_get");o(iTe,"intern_set");o(aTe,"intern_delete");o(sTe,"keyof")});function V3(t,e,r){let n=(e-t)/Math.max(0,r),i=Math.floor(Math.log10(n)),a=n/Math.pow(10,i),s=a>=oTe?10:a>=lTe?5:a>=cTe?2:1,l,u,h;return i<0?(h=Math.pow(10,-i)/s,l=Math.round(t*h),u=Math.round(e*h),l/he&&--u,h=-h):(h=Math.pow(10,i)*s,l=Math.round(t/h),u=Math.round(e/h),l*he&&--u),u0))return[];if(t===e)return[t];let n=e=i))return[];let l=a-i+1,u=new Array(l);if(n)if(s<0)for(let h=0;h{"use strict";oTe=Math.sqrt(50),lTe=Math.sqrt(10),cTe=Math.sqrt(2);o(V3,"tickSpec");o(U3,"ticks");o(ov,"tickIncrement");o(A0,"tickStep")});function H3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var qV=N(()=>{"use strict";o(H3,"max")});function W3(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var YV=N(()=>{"use strict";o(W3,"min")});function q3(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=Math.max(0,Math.ceil((e-t)/r))|0,a=new Array(i);++n{"use strict";o(q3,"range")});var Eh=N(()=>{"use strict";VV();MA();qV();YV();XV();WV();HV()});function PA(t){return t}var jV=N(()=>{"use strict";o(PA,"default")});function uTe(t){return"translate("+t+",0)"}function hTe(t){return"translate(0,"+t+")"}function fTe(t){return e=>+t(e)}function dTe(t,e){return e=Math.max(0,t.bandwidth()-e*2)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function pTe(){return!this.__axis}function QV(t,e){var r=[],n=null,i=null,a=6,s=6,l=3,u=typeof window<"u"&&window.devicePixelRatio>1?0:.5,h=t===X3||t===Y3?-1:1,f=t===Y3||t===BA?"x":"y",d=t===X3||t===FA?uTe:hTe;function p(m){var g=n??(e.ticks?e.ticks.apply(e,r):e.domain()),y=i??(e.tickFormat?e.tickFormat.apply(e,r):PA),v=Math.max(a,0)+l,x=e.range(),b=+x[0]+u,T=+x[x.length-1]+u,S=(e.bandwidth?dTe:fTe)(e.copy(),u),w=m.selection?m.selection():m,E=w.selectAll(".domain").data([null]),_=w.selectAll(".tick").data(g,e).order(),C=_.exit(),D=_.enter().append("g").attr("class","tick"),O=_.select("line"),R=_.select("text");E=E.merge(E.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),_=_.merge(D),O=O.merge(D.append("line").attr("stroke","currentColor").attr(f+"2",h*a)),R=R.merge(D.append("text").attr("fill","currentColor").attr(f,h*v).attr("dy",t===X3?"0em":t===FA?"0.71em":"0.32em")),m!==w&&(E=E.transition(m),_=_.transition(m),O=O.transition(m),R=R.transition(m),C=C.transition(m).attr("opacity",KV).attr("transform",function(k){return isFinite(k=S(k))?d(k+u):this.getAttribute("transform")}),D.attr("opacity",KV).attr("transform",function(k){var L=this.parentNode.__axis;return d((L&&isFinite(L=L(k))?L:S(k))+u)})),C.remove(),E.attr("d",t===Y3||t===BA?s?"M"+h*s+","+b+"H"+u+"V"+T+"H"+h*s:"M"+u+","+b+"V"+T:s?"M"+b+","+h*s+"V"+u+"H"+T+"V"+h*s:"M"+b+","+u+"H"+T),_.attr("opacity",1).attr("transform",function(k){return d(S(k)+u)}),O.attr(f+"2",h*a),R.attr(f,h*v).text(y),w.filter(pTe).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===BA?"start":t===Y3?"end":"middle"),w.each(function(){this.__axis=S})}return o(p,"axis"),p.scale=function(m){return arguments.length?(e=m,p):e},p.ticks=function(){return r=Array.from(arguments),p},p.tickArguments=function(m){return arguments.length?(r=m==null?[]:Array.from(m),p):r.slice()},p.tickValues=function(m){return arguments.length?(n=m==null?null:Array.from(m),p):n&&n.slice()},p.tickFormat=function(m){return arguments.length?(i=m,p):i},p.tickSize=function(m){return arguments.length?(a=s=+m,p):a},p.tickSizeInner=function(m){return arguments.length?(a=+m,p):a},p.tickSizeOuter=function(m){return arguments.length?(s=+m,p):s},p.tickPadding=function(m){return arguments.length?(l=+m,p):l},p.offset=function(m){return arguments.length?(u=+m,p):u},p}function $A(t){return QV(X3,t)}function zA(t){return QV(FA,t)}var X3,BA,FA,Y3,KV,ZV=N(()=>{"use strict";jV();X3=1,BA=2,FA=3,Y3=4,KV=1e-6;o(uTe,"translateX");o(hTe,"translateY");o(fTe,"number");o(dTe,"center");o(pTe,"entering");o(QV,"axis");o($A,"axisTop");o(zA,"axisBottom")});var JV=N(()=>{"use strict";ZV()});function tU(){for(var t=0,e=arguments.length,r={},n;t=0&&(n=r.slice(i+1),r=r.slice(0,i)),r&&!e.hasOwnProperty(r))throw new Error("unknown type: "+r);return{type:r,name:n}})}function yTe(t,e){for(var r=0,n=t.length,i;r{"use strict";mTe={value:o(()=>{},"value")};o(tU,"dispatch");o(j3,"Dispatch");o(gTe,"parseTypenames");j3.prototype=tU.prototype={constructor:j3,on:o(function(t,e){var r=this._,n=gTe(t+"",r),i,a=-1,s=n.length;if(arguments.length<2){for(;++a0)for(var r=new Array(i),n=0,i,a;n{"use strict";rU()});var K3,UA,HA=N(()=>{"use strict";K3="http://www.w3.org/1999/xhtml",UA={svg:"http://www.w3.org/2000/svg",xhtml:K3,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"}});function sc(t){var e=t+="",r=e.indexOf(":");return r>=0&&(e=t.slice(0,r))!=="xmlns"&&(t=t.slice(r+1)),UA.hasOwnProperty(e)?{space:UA[e],local:t}:t}var Q3=N(()=>{"use strict";HA();o(sc,"default")});function vTe(t){return function(){var e=this.ownerDocument,r=this.namespaceURI;return r===K3&&e.documentElement.namespaceURI===K3?e.createElement(t):e.createElementNS(r,t)}}function xTe(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function lv(t){var e=sc(t);return(e.local?xTe:vTe)(e)}var WA=N(()=>{"use strict";Q3();HA();o(vTe,"creatorInherit");o(xTe,"creatorFixed");o(lv,"default")});function bTe(){}function Sh(t){return t==null?bTe:function(){return this.querySelector(t)}}var Z3=N(()=>{"use strict";o(bTe,"none");o(Sh,"default")});function qA(t){typeof t!="function"&&(t=Sh(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();Z3();o(qA,"default")});function YA(t){return t==null?[]:Array.isArray(t)?t:Array.from(t)}var iU=N(()=>{"use strict";o(YA,"array")});function TTe(){return[]}function _0(t){return t==null?TTe:function(){return this.querySelectorAll(t)}}var XA=N(()=>{"use strict";o(TTe,"empty");o(_0,"default")});function wTe(t){return function(){return YA(t.apply(this,arguments))}}function jA(t){typeof t=="function"?t=wTe(t):t=_0(t);for(var e=this._groups,r=e.length,n=[],i=[],a=0;a{"use strict";gl();iU();XA();o(wTe,"arrayAll");o(jA,"default")});function D0(t){return function(){return this.matches(t)}}function J3(t){return function(e){return e.matches(t)}}var cv=N(()=>{"use strict";o(D0,"default");o(J3,"childMatcher")});function ETe(t){return function(){return kTe.call(this.children,t)}}function STe(){return this.firstElementChild}function KA(t){return this.select(t==null?STe:ETe(typeof t=="function"?t:J3(t)))}var kTe,sU=N(()=>{"use strict";cv();kTe=Array.prototype.find;o(ETe,"childFind");o(STe,"childFirst");o(KA,"default")});function ATe(){return Array.from(this.children)}function _Te(t){return function(){return CTe.call(this.children,t)}}function QA(t){return this.selectAll(t==null?ATe:_Te(typeof t=="function"?t:J3(t)))}var CTe,oU=N(()=>{"use strict";cv();CTe=Array.prototype.filter;o(ATe,"children");o(_Te,"childrenFilter");o(QA,"default")});function ZA(t){typeof t!="function"&&(t=D0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";gl();cv();o(ZA,"default")});function uv(t){return new Array(t.length)}var JA=N(()=>{"use strict";o(uv,"default")});function e8(){return new ui(this._enter||this._groups.map(uv),this._parents)}function hv(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}var t8=N(()=>{"use strict";JA();gl();o(e8,"default");o(hv,"EnterNode");hv.prototype={constructor:hv,appendChild:o(function(t){return this._parent.insertBefore(t,this._next)},"appendChild"),insertBefore:o(function(t,e){return this._parent.insertBefore(t,e)},"insertBefore"),querySelector:o(function(t){return this._parent.querySelector(t)},"querySelector"),querySelectorAll:o(function(t){return this._parent.querySelectorAll(t)},"querySelectorAll")}});function r8(t){return function(){return t}}var cU=N(()=>{"use strict";o(r8,"default")});function DTe(t,e,r,n,i,a){for(var s=0,l,u=e.length,h=a.length;s=T&&(T=b+1);!(w=v[T])&&++T{"use strict";gl();t8();cU();o(DTe,"bindIndex");o(LTe,"bindKey");o(RTe,"datum");o(n8,"default");o(NTe,"arraylike")});function i8(){return new ui(this._exit||this._groups.map(uv),this._parents)}var hU=N(()=>{"use strict";JA();gl();o(i8,"default")});function a8(t,e,r){var n=this.enter(),i=this,a=this.exit();return typeof t=="function"?(n=t(n),n&&(n=n.selection())):n=n.append(t+""),e!=null&&(i=e(i),i&&(i=i.selection())),r==null?a.remove():r(a),n&&i?n.merge(i).order():i}var fU=N(()=>{"use strict";o(a8,"default")});function s8(t){for(var e=t.selection?t.selection():t,r=this._groups,n=e._groups,i=r.length,a=n.length,s=Math.min(i,a),l=new Array(i),u=0;u{"use strict";gl();o(s8,"default")});function o8(){for(var t=this._groups,e=-1,r=t.length;++e=0;)(s=n[i])&&(a&&s.compareDocumentPosition(a)^4&&a.parentNode.insertBefore(s,a),a=s);return this}var pU=N(()=>{"use strict";o(o8,"default")});function l8(t){t||(t=MTe);function e(d,p){return d&&p?t(d.__data__,p.__data__):!d-!p}o(e,"compareNode");for(var r=this._groups,n=r.length,i=new Array(n),a=0;ae?1:t>=e?0:NaN}var mU=N(()=>{"use strict";gl();o(l8,"default");o(MTe,"ascending")});function c8(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}var gU=N(()=>{"use strict";o(c8,"default")});function u8(){return Array.from(this)}var yU=N(()=>{"use strict";o(u8,"default")});function h8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(h8,"default")});function f8(){let t=0;for(let e of this)++t;return t}var xU=N(()=>{"use strict";o(f8,"default")});function d8(){return!this.node()}var bU=N(()=>{"use strict";o(d8,"default")});function p8(t){for(var e=this._groups,r=0,n=e.length;r{"use strict";o(p8,"default")});function ITe(t){return function(){this.removeAttribute(t)}}function OTe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function PTe(t,e){return function(){this.setAttribute(t,e)}}function BTe(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function FTe(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttribute(t):this.setAttribute(t,r)}}function $Te(t,e){return function(){var r=e.apply(this,arguments);r==null?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function m8(t,e){var r=sc(t);if(arguments.length<2){var n=this.node();return r.local?n.getAttributeNS(r.space,r.local):n.getAttribute(r)}return this.each((e==null?r.local?OTe:ITe:typeof e=="function"?r.local?$Te:FTe:r.local?BTe:PTe)(r,e))}var wU=N(()=>{"use strict";Q3();o(ITe,"attrRemove");o(OTe,"attrRemoveNS");o(PTe,"attrConstant");o(BTe,"attrConstantNS");o(FTe,"attrFunction");o($Te,"attrFunctionNS");o(m8,"default")});function fv(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}var g8=N(()=>{"use strict";o(fv,"default")});function zTe(t){return function(){this.style.removeProperty(t)}}function GTe(t,e,r){return function(){this.style.setProperty(t,e,r)}}function VTe(t,e,r){return function(){var n=e.apply(this,arguments);n==null?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function y8(t,e,r){return arguments.length>1?this.each((e==null?zTe:typeof e=="function"?VTe:GTe)(t,e,r??"")):Ch(this.node(),t)}function Ch(t,e){return t.style.getPropertyValue(e)||fv(t).getComputedStyle(t,null).getPropertyValue(e)}var v8=N(()=>{"use strict";g8();o(zTe,"styleRemove");o(GTe,"styleConstant");o(VTe,"styleFunction");o(y8,"default");o(Ch,"styleValue")});function UTe(t){return function(){delete this[t]}}function HTe(t,e){return function(){this[t]=e}}function WTe(t,e){return function(){var r=e.apply(this,arguments);r==null?delete this[t]:this[t]=r}}function x8(t,e){return arguments.length>1?this.each((e==null?UTe:typeof e=="function"?WTe:HTe)(t,e)):this.node()[t]}var kU=N(()=>{"use strict";o(UTe,"propertyRemove");o(HTe,"propertyConstant");o(WTe,"propertyFunction");o(x8,"default")});function EU(t){return t.trim().split(/^|\s+/)}function b8(t){return t.classList||new SU(t)}function SU(t){this._node=t,this._names=EU(t.getAttribute("class")||"")}function CU(t,e){for(var r=b8(t),n=-1,i=e.length;++n{"use strict";o(EU,"classArray");o(b8,"classList");o(SU,"ClassList");SU.prototype={add:o(function(t){var e=this._names.indexOf(t);e<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},"add"),remove:o(function(t){var e=this._names.indexOf(t);e>=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},"remove"),contains:o(function(t){return this._names.indexOf(t)>=0},"contains")};o(CU,"classedAdd");o(AU,"classedRemove");o(qTe,"classedTrue");o(YTe,"classedFalse");o(XTe,"classedFunction");o(T8,"default")});function jTe(){this.textContent=""}function KTe(t){return function(){this.textContent=t}}function QTe(t){return function(){var e=t.apply(this,arguments);this.textContent=e??""}}function w8(t){return arguments.length?this.each(t==null?jTe:(typeof t=="function"?QTe:KTe)(t)):this.node().textContent}var DU=N(()=>{"use strict";o(jTe,"textRemove");o(KTe,"textConstant");o(QTe,"textFunction");o(w8,"default")});function ZTe(){this.innerHTML=""}function JTe(t){return function(){this.innerHTML=t}}function ewe(t){return function(){var e=t.apply(this,arguments);this.innerHTML=e??""}}function k8(t){return arguments.length?this.each(t==null?ZTe:(typeof t=="function"?ewe:JTe)(t)):this.node().innerHTML}var LU=N(()=>{"use strict";o(ZTe,"htmlRemove");o(JTe,"htmlConstant");o(ewe,"htmlFunction");o(k8,"default")});function twe(){this.nextSibling&&this.parentNode.appendChild(this)}function E8(){return this.each(twe)}var RU=N(()=>{"use strict";o(twe,"raise");o(E8,"default")});function rwe(){this.previousSibling&&this.parentNode.insertBefore(this,this.parentNode.firstChild)}function S8(){return this.each(rwe)}var NU=N(()=>{"use strict";o(rwe,"lower");o(S8,"default")});function C8(t){var e=typeof t=="function"?t:lv(t);return this.select(function(){return this.appendChild(e.apply(this,arguments))})}var MU=N(()=>{"use strict";WA();o(C8,"default")});function nwe(){return null}function A8(t,e){var r=typeof t=="function"?t:lv(t),n=e==null?nwe:typeof e=="function"?e:Sh(e);return this.select(function(){return this.insertBefore(r.apply(this,arguments),n.apply(this,arguments)||null)})}var IU=N(()=>{"use strict";WA();Z3();o(nwe,"constantNull");o(A8,"default")});function iwe(){var t=this.parentNode;t&&t.removeChild(this)}function _8(){return this.each(iwe)}var OU=N(()=>{"use strict";o(iwe,"remove");o(_8,"default")});function awe(){var t=this.cloneNode(!1),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function swe(){var t=this.cloneNode(!0),e=this.parentNode;return e?e.insertBefore(t,this.nextSibling):t}function D8(t){return this.select(t?swe:awe)}var PU=N(()=>{"use strict";o(awe,"selection_cloneShallow");o(swe,"selection_cloneDeep");o(D8,"default")});function L8(t){return arguments.length?this.property("__data__",t):this.node().__data__}var BU=N(()=>{"use strict";o(L8,"default")});function owe(t){return function(e){t.call(this,e,this.__data__)}}function lwe(t){return t.trim().split(/^|\s+/).map(function(e){var r="",n=e.indexOf(".");return n>=0&&(r=e.slice(n+1),e=e.slice(0,n)),{type:e,name:r}})}function cwe(t){return function(){var e=this.__on;if(e){for(var r=0,n=-1,i=e.length,a;r{"use strict";o(owe,"contextListener");o(lwe,"parseTypenames");o(cwe,"onRemove");o(uwe,"onAdd");o(R8,"default")});function $U(t,e,r){var n=fv(t),i=n.CustomEvent;typeof i=="function"?i=new i(e,r):(i=n.document.createEvent("Event"),r?(i.initEvent(e,r.bubbles,r.cancelable),i.detail=r.detail):i.initEvent(e,!1,!1)),t.dispatchEvent(i)}function hwe(t,e){return function(){return $U(this,t,e)}}function fwe(t,e){return function(){return $U(this,t,e.apply(this,arguments))}}function N8(t,e){return this.each((typeof e=="function"?fwe:hwe)(t,e))}var zU=N(()=>{"use strict";g8();o($U,"dispatchEvent");o(hwe,"dispatchConstant");o(fwe,"dispatchFunction");o(N8,"default")});function*M8(){for(var t=this._groups,e=0,r=t.length;e{"use strict";o(M8,"default")});function ui(t,e){this._groups=t,this._parents=e}function VU(){return new ui([[document.documentElement]],I8)}function dwe(){return this}var I8,gu,gl=N(()=>{"use strict";nU();aU();sU();oU();lU();uU();t8();hU();fU();dU();pU();mU();gU();yU();vU();xU();bU();TU();wU();v8();kU();_U();DU();LU();RU();NU();MU();IU();OU();PU();BU();FU();zU();GU();I8=[null];o(ui,"Selection");o(VU,"selection");o(dwe,"selection_selection");ui.prototype=VU.prototype={constructor:ui,select:qA,selectAll:jA,selectChild:KA,selectChildren:QA,filter:ZA,data:n8,enter:e8,exit:i8,join:a8,merge:s8,selection:dwe,order:o8,sort:l8,call:c8,nodes:u8,node:h8,size:f8,empty:d8,each:p8,attr:m8,style:y8,property:x8,classed:T8,text:w8,html:k8,raise:E8,lower:S8,append:C8,insert:A8,remove:_8,clone:D8,datum:L8,on:R8,dispatch:N8,[Symbol.iterator]:M8};gu=VU});function Ge(t){return typeof t=="string"?new ui([[document.querySelector(t)]],[document.documentElement]):new ui([[t]],I8)}var UU=N(()=>{"use strict";gl();o(Ge,"default")});var yl=N(()=>{"use strict";cv();Q3();UU();gl();Z3();XA();v8()});var HU=N(()=>{"use strict"});function Ah(t,e,r){t.prototype=e.prototype=r,r.constructor=t}function L0(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}var O8=N(()=>{"use strict";o(Ah,"default");o(L0,"extend")});function _h(){}function qU(){return this.rgb().formatHex()}function Twe(){return this.rgb().formatHex8()}function wwe(){return JU(this).formatHsl()}function YU(){return this.rgb().formatRgb()}function xl(t){var e,r;return t=(t+"").trim().toLowerCase(),(e=pwe.exec(t))?(r=e[1].length,e=parseInt(e[1],16),r===6?XU(e):r===3?new ca(e>>8&15|e>>4&240,e>>4&15|e&240,(e&15)<<4|e&15,1):r===8?e5(e>>24&255,e>>16&255,e>>8&255,(e&255)/255):r===4?e5(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|e&240,((e&15)<<4|e&15)/255):null):(e=mwe.exec(t))?new ca(e[1],e[2],e[3],1):(e=gwe.exec(t))?new ca(e[1]*255/100,e[2]*255/100,e[3]*255/100,1):(e=ywe.exec(t))?e5(e[1],e[2],e[3],e[4]):(e=vwe.exec(t))?e5(e[1]*255/100,e[2]*255/100,e[3]*255/100,e[4]):(e=xwe.exec(t))?QU(e[1],e[2]/100,e[3]/100,1):(e=bwe.exec(t))?QU(e[1],e[2]/100,e[3]/100,e[4]):WU.hasOwnProperty(t)?XU(WU[t]):t==="transparent"?new ca(NaN,NaN,NaN,0):null}function XU(t){return new ca(t>>16&255,t>>8&255,t&255,1)}function e5(t,e,r,n){return n<=0&&(t=e=r=NaN),new ca(t,e,r,n)}function B8(t){return t instanceof _h||(t=xl(t)),t?(t=t.rgb(),new ca(t.r,t.g,t.b,t.opacity)):new ca}function N0(t,e,r,n){return arguments.length===1?B8(t):new ca(t,e,r,n??1)}function ca(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function jU(){return`#${gd(this.r)}${gd(this.g)}${gd(this.b)}`}function kwe(){return`#${gd(this.r)}${gd(this.g)}${gd(this.b)}${gd((isNaN(this.opacity)?1:this.opacity)*255)}`}function KU(){let t=n5(this.opacity);return`${t===1?"rgb(":"rgba("}${yd(this.r)}, ${yd(this.g)}, ${yd(this.b)}${t===1?")":`, ${t})`}`}function n5(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function yd(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function gd(t){return t=yd(t),(t<16?"0":"")+t.toString(16)}function QU(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new vl(t,e,r,n)}function JU(t){if(t instanceof vl)return new vl(t.h,t.s,t.l,t.opacity);if(t instanceof _h||(t=xl(t)),!t)return new vl;if(t instanceof vl)return t;t=t.rgb();var e=t.r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),s=NaN,l=a-i,u=(a+i)/2;return l?(e===a?s=(r-n)/l+(r0&&u<1?0:s,new vl(s,l,u,t.opacity)}function eH(t,e,r,n){return arguments.length===1?JU(t):new vl(t,e,r,n??1)}function vl(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function ZU(t){return t=(t||0)%360,t<0?t+360:t}function t5(t){return Math.max(0,Math.min(1,t||0))}function P8(t,e,r){return(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)*255}var dv,r5,R0,pv,oc,pwe,mwe,gwe,ywe,vwe,xwe,bwe,WU,F8=N(()=>{"use strict";O8();o(_h,"Color");dv=.7,r5=1/dv,R0="\\s*([+-]?\\d+)\\s*",pv="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)\\s*",oc="\\s*([+-]?(?:\\d*\\.)?\\d+(?:[eE][+-]?\\d+)?)%\\s*",pwe=/^#([0-9a-f]{3,8})$/,mwe=new RegExp(`^rgb\\(${R0},${R0},${R0}\\)$`),gwe=new RegExp(`^rgb\\(${oc},${oc},${oc}\\)$`),ywe=new RegExp(`^rgba\\(${R0},${R0},${R0},${pv}\\)$`),vwe=new RegExp(`^rgba\\(${oc},${oc},${oc},${pv}\\)$`),xwe=new RegExp(`^hsl\\(${pv},${oc},${oc}\\)$`),bwe=new RegExp(`^hsla\\(${pv},${oc},${oc},${pv}\\)$`),WU={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Ah(_h,xl,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:qU,formatHex:qU,formatHex8:Twe,formatHsl:wwe,formatRgb:YU,toString:YU});o(qU,"color_formatHex");o(Twe,"color_formatHex8");o(wwe,"color_formatHsl");o(YU,"color_formatRgb");o(xl,"color");o(XU,"rgbn");o(e5,"rgba");o(B8,"rgbConvert");o(N0,"rgb");o(ca,"Rgb");Ah(ca,N0,L0(_h,{brighter(t){return t=t==null?r5:Math.pow(r5,t),new ca(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?dv:Math.pow(dv,t),new ca(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new ca(yd(this.r),yd(this.g),yd(this.b),n5(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:jU,formatHex:jU,formatHex8:kwe,formatRgb:KU,toString:KU}));o(jU,"rgb_formatHex");o(kwe,"rgb_formatHex8");o(KU,"rgb_formatRgb");o(n5,"clampa");o(yd,"clampi");o(gd,"hex");o(QU,"hsla");o(JU,"hslConvert");o(eH,"hsl");o(vl,"Hsl");Ah(vl,eH,L0(_h,{brighter(t){return t=t==null?r5:Math.pow(r5,t),new vl(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?dv:Math.pow(dv,t),new vl(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new ca(P8(t>=240?t-240:t+120,i,n),P8(t,i,n),P8(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new vl(ZU(this.h),t5(this.s),t5(this.l),n5(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){let t=n5(this.opacity);return`${t===1?"hsl(":"hsla("}${ZU(this.h)}, ${t5(this.s)*100}%, ${t5(this.l)*100}%${t===1?")":`, ${t})`}`}}));o(ZU,"clamph");o(t5,"clampt");o(P8,"hsl2rgb")});var tH,rH,nH=N(()=>{"use strict";tH=Math.PI/180,rH=180/Math.PI});function cH(t){if(t instanceof lc)return new lc(t.l,t.a,t.b,t.opacity);if(t instanceof yu)return uH(t);t instanceof ca||(t=B8(t));var e=V8(t.r),r=V8(t.g),n=V8(t.b),i=$8((.2225045*e+.7168786*r+.0606169*n)/aH),a,s;return e===r&&r===n?a=s=i:(a=$8((.4360747*e+.3850649*r+.1430804*n)/iH),s=$8((.0139322*e+.0971045*r+.7141733*n)/sH)),new lc(116*i-16,500*(a-i),200*(i-s),t.opacity)}function U8(t,e,r,n){return arguments.length===1?cH(t):new lc(t,e,r,n??1)}function lc(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function $8(t){return t>Ewe?Math.pow(t,1/3):t/lH+oH}function z8(t){return t>M0?t*t*t:lH*(t-oH)}function G8(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function V8(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Swe(t){if(t instanceof yu)return new yu(t.h,t.c,t.l,t.opacity);if(t instanceof lc||(t=cH(t)),t.a===0&&t.b===0)return new yu(NaN,0{"use strict";O8();F8();nH();i5=18,iH=.96422,aH=1,sH=.82521,oH=4/29,M0=6/29,lH=3*M0*M0,Ewe=M0*M0*M0;o(cH,"labConvert");o(U8,"lab");o(lc,"Lab");Ah(lc,U8,L0(_h,{brighter(t){return new lc(this.l+i5*(t??1),this.a,this.b,this.opacity)},darker(t){return new lc(this.l-i5*(t??1),this.a,this.b,this.opacity)},rgb(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return e=iH*z8(e),t=aH*z8(t),r=sH*z8(r),new ca(G8(3.1338561*e-1.6168667*t-.4906146*r),G8(-.9787684*e+1.9161415*t+.033454*r),G8(.0719453*e-.2289914*t+1.4052427*r),this.opacity)}}));o($8,"xyz2lab");o(z8,"lab2xyz");o(G8,"lrgb2rgb");o(V8,"rgb2lrgb");o(Swe,"hclConvert");o(mv,"hcl");o(yu,"Hcl");o(uH,"hcl2lab");Ah(yu,mv,L0(_h,{brighter(t){return new yu(this.h,this.c,this.l+i5*(t??1),this.opacity)},darker(t){return new yu(this.h,this.c,this.l-i5*(t??1),this.opacity)},rgb(){return uH(this).rgb()}}))});var I0=N(()=>{"use strict";F8();hH()});function H8(t,e,r,n,i){var a=t*t,s=a*t;return((1-3*t+3*a-s)*e+(4-6*a+3*s)*r+(1+3*t+3*a-3*s)*n+s*i)/6}function W8(t){var e=t.length-1;return function(r){var n=r<=0?r=0:r>=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],s=n>0?t[n-1]:2*i-a,l=n{"use strict";o(H8,"basis");o(W8,"default")});function Y8(t){var e=t.length;return function(r){var n=Math.floor(((r%=1)<0?++r:r)*e),i=t[(n+e-1)%e],a=t[n%e],s=t[(n+1)%e],l=t[(n+2)%e];return H8((r-n/e)*e,i,a,s,l)}}var fH=N(()=>{"use strict";q8();o(Y8,"default")});var O0,X8=N(()=>{"use strict";O0=o(t=>()=>t,"default")});function dH(t,e){return function(r){return t+r*e}}function Cwe(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}function pH(t,e){var r=e-t;return r?dH(t,r>180||r<-180?r-360*Math.round(r/360):r):O0(isNaN(t)?e:t)}function mH(t){return(t=+t)==1?vu:function(e,r){return r-e?Cwe(e,r,t):O0(isNaN(e)?r:e)}}function vu(t,e){var r=e-t;return r?dH(t,r):O0(isNaN(t)?e:t)}var j8=N(()=>{"use strict";X8();o(dH,"linear");o(Cwe,"exponential");o(pH,"hue");o(mH,"gamma");o(vu,"nogamma")});function gH(t){return function(e){var r=e.length,n=new Array(r),i=new Array(r),a=new Array(r),s,l;for(s=0;s{"use strict";I0();q8();fH();j8();vd=o(function t(e){var r=mH(e);function n(i,a){var s=r((i=N0(i)).r,(a=N0(a)).r),l=r(i.g,a.g),u=r(i.b,a.b),h=vu(i.opacity,a.opacity);return function(f){return i.r=s(f),i.g=l(f),i.b=u(f),i.opacity=h(f),i+""}}return o(n,"rgb"),n.gamma=t,n},"rgbGamma")(1);o(gH,"rgbSpline");Awe=gH(W8),_we=gH(Y8)});function Q8(t,e){e||(e=[]);var r=t?Math.min(e.length,t.length):0,n=e.slice(),i;return function(a){for(i=0;i{"use strict";o(Q8,"default");o(yH,"isNumberArray")});function xH(t,e){var r=e?e.length:0,n=t?Math.min(r,t.length):0,i=new Array(n),a=new Array(r),s;for(s=0;s{"use strict";a5();o(xH,"genericArray")});function Z8(t,e){var r=new Date;return t=+t,e=+e,function(n){return r.setTime(t*(1-n)+e*n),r}}var TH=N(()=>{"use strict";o(Z8,"default")});function Ki(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var gv=N(()=>{"use strict";o(Ki,"default")});function J8(t,e){var r={},n={},i;(t===null||typeof t!="object")&&(t={}),(e===null||typeof e!="object")&&(e={});for(i in e)i in t?r[i]=Dh(t[i],e[i]):n[i]=e[i];return function(a){for(i in r)n[i]=r[i](a);return n}}var wH=N(()=>{"use strict";a5();o(J8,"default")});function Dwe(t){return function(){return t}}function Lwe(t){return function(e){return t(e)+""}}function P0(t,e){var r=t_.lastIndex=e_.lastIndex=0,n,i,a,s=-1,l=[],u=[];for(t=t+"",e=e+"";(n=t_.exec(t))&&(i=e_.exec(e));)(a=i.index)>r&&(a=e.slice(r,a),l[s]?l[s]+=a:l[++s]=a),(n=n[0])===(i=i[0])?l[s]?l[s]+=i:l[++s]=i:(l[++s]=null,u.push({i:s,x:Ki(n,i)})),r=e_.lastIndex;return r{"use strict";gv();t_=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,e_=new RegExp(t_.source,"g");o(Dwe,"zero");o(Lwe,"one");o(P0,"default")});function Dh(t,e){var r=typeof e,n;return e==null||r==="boolean"?O0(e):(r==="number"?Ki:r==="string"?(n=xl(e))?(e=n,vd):P0:e instanceof xl?vd:e instanceof Date?Z8:yH(e)?Q8:Array.isArray(e)?xH:typeof e.valueOf!="function"&&typeof e.toString!="function"||isNaN(e)?J8:Ki)(t,e)}var a5=N(()=>{"use strict";I0();K8();bH();TH();gv();wH();r_();X8();vH();o(Dh,"default")});function s5(t,e){return t=+t,e=+e,function(r){return Math.round(t*(1-r)+e*r)}}var kH=N(()=>{"use strict";o(s5,"default")});function l5(t,e,r,n,i,a){var s,l,u;return(s=Math.sqrt(t*t+e*e))&&(t/=s,e/=s),(u=t*r+e*n)&&(r-=t*u,n-=e*u),(l=Math.sqrt(r*r+n*n))&&(r/=l,n/=l,u/=l),t*n{"use strict";EH=180/Math.PI,o5={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};o(l5,"default")});function CH(t){let e=new(typeof DOMMatrix=="function"?DOMMatrix:WebKitCSSMatrix)(t+"");return e.isIdentity?o5:l5(e.a,e.b,e.c,e.d,e.e,e.f)}function AH(t){return t==null?o5:(c5||(c5=document.createElementNS("http://www.w3.org/2000/svg","g")),c5.setAttribute("transform",t),(t=c5.transform.baseVal.consolidate())?(t=t.matrix,l5(t.a,t.b,t.c,t.d,t.e,t.f)):o5)}var c5,_H=N(()=>{"use strict";SH();o(CH,"parseCss");o(AH,"parseSvg")});function DH(t,e,r,n){function i(h){return h.length?h.pop()+" ":""}o(i,"pop");function a(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push("translate(",null,e,null,r);g.push({i:y-4,x:Ki(h,d)},{i:y-2,x:Ki(f,p)})}else(d||p)&&m.push("translate("+d+e+p+r)}o(a,"translate");function s(h,f,d,p){h!==f?(h-f>180?f+=360:f-h>180&&(h+=360),p.push({i:d.push(i(d)+"rotate(",null,n)-2,x:Ki(h,f)})):f&&d.push(i(d)+"rotate("+f+n)}o(s,"rotate");function l(h,f,d,p){h!==f?p.push({i:d.push(i(d)+"skewX(",null,n)-2,x:Ki(h,f)}):f&&d.push(i(d)+"skewX("+f+n)}o(l,"skewX");function u(h,f,d,p,m,g){if(h!==d||f!==p){var y=m.push(i(m)+"scale(",null,",",null,")");g.push({i:y-4,x:Ki(h,d)},{i:y-2,x:Ki(f,p)})}else(d!==1||p!==1)&&m.push(i(m)+"scale("+d+","+p+")")}return o(u,"scale"),function(h,f){var d=[],p=[];return h=t(h),f=t(f),a(h.translateX,h.translateY,f.translateX,f.translateY,d,p),s(h.rotate,f.rotate,d,p),l(h.skewX,f.skewX,d,p),u(h.scaleX,h.scaleY,f.scaleX,f.scaleY,d,p),h=f=null,function(m){for(var g=-1,y=p.length,v;++g{"use strict";gv();_H();o(DH,"interpolateTransform");n_=DH(CH,"px, ","px)","deg)"),i_=DH(AH,", ",")",")")});function RH(t){return function(e,r){var n=t((e=mv(e)).h,(r=mv(r)).h),i=vu(e.c,r.c),a=vu(e.l,r.l),s=vu(e.opacity,r.opacity);return function(l){return e.h=n(l),e.c=i(l),e.l=a(l),e.opacity=s(l),e+""}}}var a_,Rwe,NH=N(()=>{"use strict";I0();j8();o(RH,"hcl");a_=RH(pH),Rwe=RH(vu)});var B0=N(()=>{"use strict";a5();gv();kH();r_();LH();K8();NH()});function wv(){return xd||(OH(Nwe),xd=bv.now()+f5)}function Nwe(){xd=0}function Tv(){this._call=this._time=this._next=null}function d5(t,e,r){var n=new Tv;return n.restart(t,e,r),n}function PH(){wv(),++F0;for(var t=u5,e;t;)(e=xd-t._time)>=0&&t._call.call(void 0,e),t=t._next;--F0}function MH(){xd=(h5=bv.now())+f5,F0=vv=0;try{PH()}finally{F0=0,Iwe(),xd=0}}function Mwe(){var t=bv.now(),e=t-h5;e>IH&&(f5-=e,h5=t)}function Iwe(){for(var t,e=u5,r,n=1/0;e;)e._call?(n>e._time&&(n=e._time),t=e,e=e._next):(r=e._next,e._next=null,e=t?t._next=r:u5=r);xv=t,s_(n)}function s_(t){if(!F0){vv&&(vv=clearTimeout(vv));var e=t-xd;e>24?(t<1/0&&(vv=setTimeout(MH,t-bv.now()-f5)),yv&&(yv=clearInterval(yv))):(yv||(h5=bv.now(),yv=setInterval(Mwe,IH)),F0=1,OH(MH))}}var F0,vv,yv,IH,u5,xv,h5,xd,f5,bv,OH,o_=N(()=>{"use strict";F0=0,vv=0,yv=0,IH=1e3,h5=0,xd=0,f5=0,bv=typeof performance=="object"&&performance.now?performance:Date,OH=typeof window=="object"&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};o(wv,"now");o(Nwe,"clearNow");o(Tv,"Timer");Tv.prototype=d5.prototype={constructor:Tv,restart:o(function(t,e,r){if(typeof t!="function")throw new TypeError("callback is not a function");r=(r==null?wv():+r)+(e==null?0:+e),!this._next&&xv!==this&&(xv?xv._next=this:u5=this,xv=this),this._call=t,this._time=r,s_()},"restart"),stop:o(function(){this._call&&(this._call=null,this._time=1/0,s_())},"stop")};o(d5,"timer");o(PH,"timerFlush");o(MH,"wake");o(Mwe,"poke");o(Iwe,"nap");o(s_,"sleep")});function kv(t,e,r){var n=new Tv;return e=e==null?0:+e,n.restart(i=>{n.stop(),t(i+e)},e,r),n}var BH=N(()=>{"use strict";o_();o(kv,"default")});var p5=N(()=>{"use strict";o_();BH()});function xu(t,e,r,n,i,a){var s=t.__transition;if(!s)t.__transition={};else if(r in s)return;Bwe(t,r,{name:e,index:n,group:i,on:Owe,tween:Pwe,time:a.time,delay:a.delay,duration:a.duration,ease:a.ease,timer:null,state:zH})}function Sv(t,e){var r=zi(t,e);if(r.state>zH)throw new Error("too late; already scheduled");return r}function ua(t,e){var r=zi(t,e);if(r.state>m5)throw new Error("too late; already running");return r}function zi(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function Bwe(t,e,r){var n=t.__transition,i;n[e]=r,r.timer=d5(a,0,r.time);function a(h){r.state=FH,r.timer.restart(s,r.delay,r.time),r.delay<=h&&s(h-r.delay)}o(a,"schedule");function s(h){var f,d,p,m;if(r.state!==FH)return u();for(f in n)if(m=n[f],m.name===r.name){if(m.state===m5)return kv(s);m.state===$H?(m.state=Ev,m.timer.stop(),m.on.call("interrupt",t,t.__data__,m.index,m.group),delete n[f]):+f{"use strict";VA();p5();Owe=GA("start","end","cancel","interrupt"),Pwe=[],zH=0,FH=1,g5=2,m5=3,$H=4,y5=5,Ev=6;o(xu,"default");o(Sv,"init");o(ua,"set");o(zi,"get");o(Bwe,"create")});function Cv(t,e){var r=t.__transition,n,i,a=!0,s;if(r){e=e==null?null:e+"";for(s in r){if((n=r[s]).name!==e){a=!1;continue}i=n.state>g5&&n.state{"use strict";Ds();o(Cv,"default")});function l_(t){return this.each(function(){Cv(this,t)})}var VH=N(()=>{"use strict";GH();o(l_,"default")});function Fwe(t,e){var r,n;return function(){var i=ua(this,t),a=i.tween;if(a!==r){n=r=a;for(var s=0,l=n.length;s{"use strict";Ds();o(Fwe,"tweenRemove");o($we,"tweenFunction");o(c_,"default");o($0,"tweenValue")});function _v(t,e){var r;return(typeof e=="number"?Ki:e instanceof xl?vd:(r=xl(e))?(e=r,vd):P0)(t,e)}var u_=N(()=>{"use strict";I0();B0();o(_v,"default")});function zwe(t){return function(){this.removeAttribute(t)}}function Gwe(t){return function(){this.removeAttributeNS(t.space,t.local)}}function Vwe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttribute(t);return s===i?null:s===n?a:a=e(n=s,r)}}function Uwe(t,e,r){var n,i=r+"",a;return function(){var s=this.getAttributeNS(t.space,t.local);return s===i?null:s===n?a:a=e(n=s,r)}}function Hwe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttribute(t):(s=this.getAttribute(t),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function Wwe(t,e,r){var n,i,a;return function(){var s,l=r(this),u;return l==null?void this.removeAttributeNS(t.space,t.local):(s=this.getAttributeNS(t.space,t.local),u=l+"",s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l)))}}function h_(t,e){var r=sc(t),n=r==="transform"?i_:_v;return this.attrTween(t,typeof e=="function"?(r.local?Wwe:Hwe)(r,n,$0(this,"attr."+t,e)):e==null?(r.local?Gwe:zwe)(r):(r.local?Uwe:Vwe)(r,n,e))}var UH=N(()=>{"use strict";B0();yl();Av();u_();o(zwe,"attrRemove");o(Gwe,"attrRemoveNS");o(Vwe,"attrConstant");o(Uwe,"attrConstantNS");o(Hwe,"attrFunction");o(Wwe,"attrFunctionNS");o(h_,"default")});function qwe(t,e){return function(r){this.setAttribute(t,e.call(this,r))}}function Ywe(t,e){return function(r){this.setAttributeNS(t.space,t.local,e.call(this,r))}}function Xwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&Ywe(t,a)),r}return o(i,"tween"),i._value=e,i}function jwe(t,e){var r,n;function i(){var a=e.apply(this,arguments);return a!==n&&(r=(n=a)&&qwe(t,a)),r}return o(i,"tween"),i._value=e,i}function f_(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(e==null)return this.tween(r,null);if(typeof e!="function")throw new Error;var n=sc(t);return this.tween(r,(n.local?Xwe:jwe)(n,e))}var HH=N(()=>{"use strict";yl();o(qwe,"attrInterpolate");o(Ywe,"attrInterpolateNS");o(Xwe,"attrTweenNS");o(jwe,"attrTween");o(f_,"default")});function Kwe(t,e){return function(){Sv(this,t).delay=+e.apply(this,arguments)}}function Qwe(t,e){return e=+e,function(){Sv(this,t).delay=e}}function d_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Kwe:Qwe)(e,t)):zi(this.node(),e).delay}var WH=N(()=>{"use strict";Ds();o(Kwe,"delayFunction");o(Qwe,"delayConstant");o(d_,"default")});function Zwe(t,e){return function(){ua(this,t).duration=+e.apply(this,arguments)}}function Jwe(t,e){return e=+e,function(){ua(this,t).duration=e}}function p_(t){var e=this._id;return arguments.length?this.each((typeof t=="function"?Zwe:Jwe)(e,t)):zi(this.node(),e).duration}var qH=N(()=>{"use strict";Ds();o(Zwe,"durationFunction");o(Jwe,"durationConstant");o(p_,"default")});function eke(t,e){if(typeof e!="function")throw new Error;return function(){ua(this,t).ease=e}}function m_(t){var e=this._id;return arguments.length?this.each(eke(e,t)):zi(this.node(),e).ease}var YH=N(()=>{"use strict";Ds();o(eke,"easeConstant");o(m_,"default")});function tke(t,e){return function(){var r=e.apply(this,arguments);if(typeof r!="function")throw new Error;ua(this,t).ease=r}}function g_(t){if(typeof t!="function")throw new Error;return this.each(tke(this._id,t))}var XH=N(()=>{"use strict";Ds();o(tke,"easeVarying");o(g_,"default")});function y_(t){typeof t!="function"&&(t=D0(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i{"use strict";yl();bd();o(y_,"default")});function v_(t){if(t._id!==this._id)throw new Error;for(var e=this._groups,r=t._groups,n=e.length,i=r.length,a=Math.min(n,i),s=new Array(n),l=0;l{"use strict";bd();o(v_,"default")});function rke(t){return(t+"").trim().split(/^|\s+/).every(function(e){var r=e.indexOf(".");return r>=0&&(e=e.slice(0,r)),!e||e==="start"})}function nke(t,e,r){var n,i,a=rke(e)?Sv:ua;return function(){var s=a(this,t),l=s.on;l!==n&&(i=(n=l).copy()).on(e,r),s.on=i}}function x_(t,e){var r=this._id;return arguments.length<2?zi(this.node(),r).on.on(t):this.each(nke(r,t,e))}var QH=N(()=>{"use strict";Ds();o(rke,"start");o(nke,"onFunction");o(x_,"default")});function ike(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}function b_(){return this.on("end.remove",ike(this._id))}var ZH=N(()=>{"use strict";o(ike,"removeFunction");o(b_,"default")});function T_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=Sh(t));for(var n=this._groups,i=n.length,a=new Array(i),s=0;s{"use strict";yl();bd();Ds();o(T_,"default")});function w_(t){var e=this._name,r=this._id;typeof t!="function"&&(t=_0(t));for(var n=this._groups,i=n.length,a=[],s=[],l=0;l{"use strict";yl();bd();Ds();o(w_,"default")});function k_(){return new ake(this._groups,this._parents)}var ake,tW=N(()=>{"use strict";yl();ake=gu.prototype.constructor;o(k_,"default")});function ske(t,e){var r,n,i;return function(){var a=Ch(this,t),s=(this.style.removeProperty(t),Ch(this,t));return a===s?null:a===r&&s===n?i:i=e(r=a,n=s)}}function rW(t){return function(){this.style.removeProperty(t)}}function oke(t,e,r){var n,i=r+"",a;return function(){var s=Ch(this,t);return s===i?null:s===n?a:a=e(n=s,r)}}function lke(t,e,r){var n,i,a;return function(){var s=Ch(this,t),l=r(this),u=l+"";return l==null&&(u=l=(this.style.removeProperty(t),Ch(this,t))),s===u?null:s===n&&u===i?a:(i=u,a=e(n=s,l))}}function cke(t,e){var r,n,i,a="style."+e,s="end."+a,l;return function(){var u=ua(this,t),h=u.on,f=u.value[a]==null?l||(l=rW(e)):void 0;(h!==r||i!==f)&&(n=(r=h).copy()).on(s,i=f),u.on=n}}function E_(t,e,r){var n=(t+="")=="transform"?n_:_v;return e==null?this.styleTween(t,ske(t,n)).on("end.style."+t,rW(t)):typeof e=="function"?this.styleTween(t,lke(t,n,$0(this,"style."+t,e))).each(cke(this._id,t)):this.styleTween(t,oke(t,n,e),r).on("end.style."+t,null)}var nW=N(()=>{"use strict";B0();yl();Ds();Av();u_();o(ske,"styleNull");o(rW,"styleRemove");o(oke,"styleConstant");o(lke,"styleFunction");o(cke,"styleMaybeRemove");o(E_,"default")});function uke(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}function hke(t,e,r){var n,i;function a(){var s=e.apply(this,arguments);return s!==i&&(n=(i=s)&&uke(t,s,r)),n}return o(a,"tween"),a._value=e,a}function S_(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(e==null)return this.tween(n,null);if(typeof e!="function")throw new Error;return this.tween(n,hke(t,e,r??""))}var iW=N(()=>{"use strict";o(uke,"styleInterpolate");o(hke,"styleTween");o(S_,"default")});function fke(t){return function(){this.textContent=t}}function dke(t){return function(){var e=t(this);this.textContent=e??""}}function C_(t){return this.tween("text",typeof t=="function"?dke($0(this,"text",t)):fke(t==null?"":t+""))}var aW=N(()=>{"use strict";Av();o(fke,"textConstant");o(dke,"textFunction");o(C_,"default")});function pke(t){return function(e){this.textContent=t.call(this,e)}}function mke(t){var e,r;function n(){var i=t.apply(this,arguments);return i!==r&&(e=(r=i)&&pke(i)),e}return o(n,"tween"),n._value=t,n}function A_(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(t==null)return this.tween(e,null);if(typeof t!="function")throw new Error;return this.tween(e,mke(t))}var sW=N(()=>{"use strict";o(pke,"textInterpolate");o(mke,"textTween");o(A_,"default")});function __(){for(var t=this._name,e=this._id,r=v5(),n=this._groups,i=n.length,a=0;a{"use strict";bd();Ds();o(__,"default")});function D_(){var t,e,r=this,n=r._id,i=r.size();return new Promise(function(a,s){var l={value:s},u={value:o(function(){--i===0&&a()},"value")};r.each(function(){var h=ua(this,n),f=h.on;f!==t&&(e=(t=f).copy(),e._.cancel.push(l),e._.interrupt.push(l),e._.end.push(u)),h.on=e}),i===0&&a()})}var lW=N(()=>{"use strict";Ds();o(D_,"default")});function as(t,e,r,n){this._groups=t,this._parents=e,this._name=r,this._id=n}function cW(t){return gu().transition(t)}function v5(){return++gke}var gke,bu,bd=N(()=>{"use strict";yl();UH();HH();WH();qH();YH();XH();jH();KH();QH();ZH();JH();eW();tW();nW();iW();aW();sW();oW();Av();lW();gke=0;o(as,"Transition");o(cW,"transition");o(v5,"newId");bu=gu.prototype;as.prototype=cW.prototype={constructor:as,select:T_,selectAll:w_,selectChild:bu.selectChild,selectChildren:bu.selectChildren,filter:y_,merge:v_,selection:k_,transition:__,call:bu.call,nodes:bu.nodes,node:bu.node,size:bu.size,empty:bu.empty,each:bu.each,on:x_,attr:h_,attrTween:f_,style:E_,styleTween:S_,text:C_,textTween:A_,remove:b_,tween:c_,delay:d_,duration:p_,ease:m_,easeVarying:g_,end:D_,[Symbol.iterator]:bu[Symbol.iterator]}});function x5(t){return((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2}var uW=N(()=>{"use strict";o(x5,"cubicInOut")});var L_=N(()=>{"use strict";uW()});function vke(t,e){for(var r;!(r=t.__transition)||!(r=r[e]);)if(!(t=t.parentNode))throw new Error(`transition ${e} not found`);return r}function R_(t){var e,r;t instanceof as?(e=t._id,t=t._name):(e=v5(),(r=yke).time=wv(),t=t==null?null:t+"");for(var n=this._groups,i=n.length,a=0;a{"use strict";bd();Ds();L_();p5();yke={time:null,delay:0,duration:250,ease:x5};o(vke,"inherit");o(R_,"default")});var fW=N(()=>{"use strict";yl();VH();hW();gu.prototype.interrupt=l_;gu.prototype.transition=R_});var b5=N(()=>{"use strict";fW()});var dW=N(()=>{"use strict"});var pW=N(()=>{"use strict"});var mW=N(()=>{"use strict"});function gW(t){return[+t[0],+t[1]]}function xke(t){return[gW(t[0]),gW(t[1])]}function N_(t){return{type:t}}var _gt,Dgt,Lgt,Rgt,Ngt,Mgt,yW=N(()=>{"use strict";b5();dW();pW();mW();({abs:_gt,max:Dgt,min:Lgt}=Math);o(gW,"number1");o(xke,"number2");Rgt={name:"x",handles:["w","e"].map(N_),input:o(function(t,e){return t==null?null:[[+t[0],e[0][1]],[+t[1],e[1][1]]]},"input"),output:o(function(t){return t&&[t[0][0],t[1][0]]},"output")},Ngt={name:"y",handles:["n","s"].map(N_),input:o(function(t,e){return t==null?null:[[e[0][0],+t[0]],[e[1][0],+t[1]]]},"input"),output:o(function(t){return t&&[t[0][1],t[1][1]]},"output")},Mgt={name:"xy",handles:["n","w","e","s","nw","ne","sw","se"].map(N_),input:o(function(t){return t==null?null:xke(t)},"input"),output:o(function(t){return t},"output")};o(N_,"type")});var vW=N(()=>{"use strict";yW()});function xW(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return xW;let r=10**e;return function(n){this._+=n[0];for(let i=1,a=n.length;i{"use strict";M_=Math.PI,I_=2*M_,Td=1e-6,bke=I_-Td;o(xW,"append");o(Tke,"appendRound");wd=class{static{o(this,"Path")}constructor(e){this._x0=this._y0=this._x1=this._y1=null,this._="",this._append=e==null?xW:Tke(e)}moveTo(e,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}`}closePath(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._append`Z`)}lineTo(e,r){this._append`L${this._x1=+e},${this._y1=+r}`}quadraticCurveTo(e,r,n,i){this._append`Q${+e},${+r},${this._x1=+n},${this._y1=+i}`}bezierCurveTo(e,r,n,i,a,s){this._append`C${+e},${+r},${+n},${+i},${this._x1=+a},${this._y1=+s}`}arcTo(e,r,n,i,a){if(e=+e,r=+r,n=+n,i=+i,a=+a,a<0)throw new Error(`negative radius: ${a}`);let s=this._x1,l=this._y1,u=n-e,h=i-r,f=s-e,d=l-r,p=f*f+d*d;if(this._x1===null)this._append`M${this._x1=e},${this._y1=r}`;else if(p>Td)if(!(Math.abs(d*u-h*f)>Td)||!a)this._append`L${this._x1=e},${this._y1=r}`;else{let m=n-s,g=i-l,y=u*u+h*h,v=m*m+g*g,x=Math.sqrt(y),b=Math.sqrt(p),T=a*Math.tan((M_-Math.acos((y+p-v)/(2*x*b)))/2),S=T/b,w=T/x;Math.abs(S-1)>Td&&this._append`L${e+S*f},${r+S*d}`,this._append`A${a},${a},0,0,${+(d*m>f*g)},${this._x1=e+w*u},${this._y1=r+w*h}`}}arc(e,r,n,i,a,s){if(e=+e,r=+r,n=+n,s=!!s,n<0)throw new Error(`negative radius: ${n}`);let l=n*Math.cos(i),u=n*Math.sin(i),h=e+l,f=r+u,d=1^s,p=s?i-a:a-i;this._x1===null?this._append`M${h},${f}`:(Math.abs(this._x1-h)>Td||Math.abs(this._y1-f)>Td)&&this._append`L${h},${f}`,n&&(p<0&&(p=p%I_+I_),p>bke?this._append`A${n},${n},0,1,${d},${e-l},${r-u}A${n},${n},0,1,${d},${this._x1=h},${this._y1=f}`:p>Td&&this._append`A${n},${n},0,${+(p>=M_)},${d},${this._x1=e+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(e,r,n,i){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}};o(bW,"path");bW.prototype=wd.prototype});var O_=N(()=>{"use strict";TW()});var wW=N(()=>{"use strict"});var kW=N(()=>{"use strict"});var EW=N(()=>{"use strict"});var SW=N(()=>{"use strict"});var CW=N(()=>{"use strict"});var AW=N(()=>{"use strict"});var _W=N(()=>{"use strict"});function P_(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)}function kd(t,e){if((r=(t=e?t.toExponential(e-1):t.toExponential()).indexOf("e"))<0)return null;var r,n=t.slice(0,r);return[n.length>1?n[0]+n.slice(2):n,+t.slice(r+1)]}var Dv=N(()=>{"use strict";o(P_,"default");o(kd,"formatDecimalParts")});function bl(t){return t=kd(Math.abs(t)),t?t[1]:NaN}var Lv=N(()=>{"use strict";Dv();o(bl,"default")});function B_(t,e){return function(r,n){for(var i=r.length,a=[],s=0,l=t[0],u=0;i>0&&l>0&&(u+l+1>n&&(l=Math.max(1,n-u)),a.push(r.substring(i-=l,i+l)),!((u+=l+1)>n));)l=t[s=(s+1)%t.length];return a.reverse().join(e)}}var DW=N(()=>{"use strict";o(B_,"default")});function F_(t){return function(e){return e.replace(/[0-9]/g,function(r){return t[+r]})}}var LW=N(()=>{"use strict";o(F_,"default")});function Lh(t){if(!(e=wke.exec(t)))throw new Error("invalid format: "+t);var e;return new T5({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function T5(t){this.fill=t.fill===void 0?" ":t.fill+"",this.align=t.align===void 0?">":t.align+"",this.sign=t.sign===void 0?"-":t.sign+"",this.symbol=t.symbol===void 0?"":t.symbol+"",this.zero=!!t.zero,this.width=t.width===void 0?void 0:+t.width,this.comma=!!t.comma,this.precision=t.precision===void 0?void 0:+t.precision,this.trim=!!t.trim,this.type=t.type===void 0?"":t.type+""}var wke,$_=N(()=>{"use strict";wke=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;o(Lh,"formatSpecifier");Lh.prototype=T5.prototype;o(T5,"FormatSpecifier");T5.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(this.width===void 0?"":Math.max(1,this.width|0))+(this.comma?",":"")+(this.precision===void 0?"":"."+Math.max(0,this.precision|0))+(this.trim?"~":"")+this.type}});function z_(t){e:for(var e=t.length,r=1,n=-1,i;r0&&(n=0);break}return n>0?t.slice(0,n)+t.slice(i+1):t}var RW=N(()=>{"use strict";o(z_,"default")});function V_(t,e){var r=kd(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(G_=Math.max(-8,Math.min(8,Math.floor(i/3)))*3)+1,s=n.length;return a===s?n:a>s?n+new Array(a-s+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+kd(t,Math.max(0,e+a-1))[0]}var G_,U_=N(()=>{"use strict";Dv();o(V_,"default")});function w5(t,e){var r=kd(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}var NW=N(()=>{"use strict";Dv();o(w5,"default")});var H_,MW=N(()=>{"use strict";Dv();U_();NW();H_={"%":o((t,e)=>(t*100).toFixed(e),"%"),b:o(t=>Math.round(t).toString(2),"b"),c:o(t=>t+"","c"),d:P_,e:o((t,e)=>t.toExponential(e),"e"),f:o((t,e)=>t.toFixed(e),"f"),g:o((t,e)=>t.toPrecision(e),"g"),o:o(t=>Math.round(t).toString(8),"o"),p:o((t,e)=>w5(t*100,e),"p"),r:w5,s:V_,X:o(t=>Math.round(t).toString(16).toUpperCase(),"X"),x:o(t=>Math.round(t).toString(16),"x")}});function k5(t){return t}var IW=N(()=>{"use strict";o(k5,"default")});function W_(t){var e=t.grouping===void 0||t.thousands===void 0?k5:B_(OW.call(t.grouping,Number),t.thousands+""),r=t.currency===void 0?"":t.currency[0]+"",n=t.currency===void 0?"":t.currency[1]+"",i=t.decimal===void 0?".":t.decimal+"",a=t.numerals===void 0?k5:F_(OW.call(t.numerals,String)),s=t.percent===void 0?"%":t.percent+"",l=t.minus===void 0?"\u2212":t.minus+"",u=t.nan===void 0?"NaN":t.nan+"";function h(d){d=Lh(d);var p=d.fill,m=d.align,g=d.sign,y=d.symbol,v=d.zero,x=d.width,b=d.comma,T=d.precision,S=d.trim,w=d.type;w==="n"?(b=!0,w="g"):H_[w]||(T===void 0&&(T=12),S=!0,w="g"),(v||p==="0"&&m==="=")&&(v=!0,p="0",m="=");var E=y==="$"?r:y==="#"&&/[boxX]/.test(w)?"0"+w.toLowerCase():"",_=y==="$"?n:/[%p]/.test(w)?s:"",C=H_[w],D=/[defgprs%]/.test(w);T=T===void 0?6:/[gprs]/.test(w)?Math.max(1,Math.min(21,T)):Math.max(0,Math.min(20,T));function O(R){var k=E,L=_,A,I,M;if(w==="c")L=C(R)+L,R="";else{R=+R;var P=R<0||1/R<0;if(R=isNaN(R)?u:C(Math.abs(R),T),S&&(R=z_(R)),P&&+R==0&&g!=="+"&&(P=!1),k=(P?g==="("?g:l:g==="-"||g==="("?"":g)+k,L=(w==="s"?PW[8+G_/3]:"")+L+(P&&g==="("?")":""),D){for(A=-1,I=R.length;++AM||M>57){L=(M===46?i+R.slice(A+1):R.slice(A))+L,R=R.slice(0,A);break}}}b&&!v&&(R=e(R,1/0));var B=k.length+R.length+L.length,F=B>1)+k+R+L+F.slice(B);break;default:R=F+k+R+L;break}return a(R)}return o(O,"format"),O.toString=function(){return d+""},O}o(h,"newFormat");function f(d,p){var m=h((d=Lh(d),d.type="f",d)),g=Math.max(-8,Math.min(8,Math.floor(bl(p)/3)))*3,y=Math.pow(10,-g),v=PW[8+g/3];return function(x){return m(y*x)+v}}return o(f,"formatPrefix"),{format:h,formatPrefix:f}}var OW,PW,BW=N(()=>{"use strict";Lv();DW();LW();$_();RW();MW();U_();IW();OW=Array.prototype.map,PW=["y","z","a","f","p","n","\xB5","m","","k","M","G","T","P","E","Z","Y"];o(W_,"default")});function q_(t){return E5=W_(t),cc=E5.format,S5=E5.formatPrefix,E5}var E5,cc,S5,FW=N(()=>{"use strict";BW();q_({thousands:",",grouping:[3],currency:["$",""]});o(q_,"defaultLocale")});function C5(t){return Math.max(0,-bl(Math.abs(t)))}var $W=N(()=>{"use strict";Lv();o(C5,"default")});function A5(t,e){return Math.max(0,Math.max(-8,Math.min(8,Math.floor(bl(e)/3)))*3-bl(Math.abs(t)))}var zW=N(()=>{"use strict";Lv();o(A5,"default")});function _5(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,bl(e)-bl(t))+1}var GW=N(()=>{"use strict";Lv();o(_5,"default")});var Y_=N(()=>{"use strict";FW();$_();$W();zW();GW()});var VW=N(()=>{"use strict"});function kke(t){var e=0,r=t.children,n=r&&r.length;if(!n)e=1;else for(;--n>=0;)e+=r[n].value;t.value=e}function X_(){return this.eachAfter(kke)}var UW=N(()=>{"use strict";o(kke,"count");o(X_,"default")});function j_(t,e){let r=-1;for(let n of this)t.call(e,n,++r,this);return this}var HW=N(()=>{"use strict";o(j_,"default")});function K_(t,e){for(var r=this,n=[r],i,a,s=-1;r=n.pop();)if(t.call(e,r,++s,this),i=r.children)for(a=i.length-1;a>=0;--a)n.push(i[a]);return this}var WW=N(()=>{"use strict";o(K_,"default")});function Q_(t,e){for(var r=this,n=[r],i=[],a,s,l,u=-1;r=n.pop();)if(i.push(r),a=r.children)for(s=0,l=a.length;s{"use strict";o(Q_,"default")});function Z_(t,e){let r=-1;for(let n of this)if(t.call(e,n,++r,this))return n}var YW=N(()=>{"use strict";o(Z_,"default")});function J_(t){return this.eachAfter(function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r})}var XW=N(()=>{"use strict";o(J_,"default")});function eD(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})}var jW=N(()=>{"use strict";o(eD,"default")});function tD(t){for(var e=this,r=Eke(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n}function Eke(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;for(t=r.pop(),e=n.pop();t===e;)i=t,t=r.pop(),e=n.pop();return i}var KW=N(()=>{"use strict";o(tD,"default");o(Eke,"leastCommonAncestor")});function rD(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e}var QW=N(()=>{"use strict";o(rD,"default")});function nD(){return Array.from(this)}var ZW=N(()=>{"use strict";o(nD,"default")});function iD(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t}var JW=N(()=>{"use strict";o(iD,"default")});function aD(){var t=this,e=[];return t.each(function(r){r!==t&&e.push({source:r.parent,target:r})}),e}var eq=N(()=>{"use strict";o(aD,"default")});function*sD(){var t=this,e,r=[t],n,i,a;do for(e=r.reverse(),r=[];t=e.pop();)if(yield t,n=t.children)for(i=0,a=n.length;i{"use strict";o(sD,"default")});function z0(t,e){t instanceof Map?(t=[void 0,t],e===void 0&&(e=Ake)):e===void 0&&(e=Cke);for(var r=new Rv(t),n,i=[r],a,s,l,u;n=i.pop();)if((s=e(n.data))&&(u=(s=Array.from(s)).length))for(n.children=s,l=u-1;l>=0;--l)i.push(a=s[l]=new Rv(s[l])),a.parent=n,a.depth=n.depth+1;return r.eachBefore(Dke)}function Ske(){return z0(this).eachBefore(_ke)}function Cke(t){return t.children}function Ake(t){return Array.isArray(t)?t[1]:null}function _ke(t){t.data.value!==void 0&&(t.value=t.data.value),t.data=t.data.data}function Dke(t){var e=0;do t.height=e;while((t=t.parent)&&t.height<++e)}function Rv(t){this.data=t,this.depth=this.height=0,this.parent=null}var rq=N(()=>{"use strict";UW();HW();WW();qW();YW();XW();jW();KW();QW();ZW();JW();eq();tq();o(z0,"hierarchy");o(Ske,"node_copy");o(Cke,"objectChildren");o(Ake,"mapChildren");o(_ke,"copyData");o(Dke,"computeHeight");o(Rv,"Node");Rv.prototype=z0.prototype={constructor:Rv,count:X_,each:j_,eachAfter:Q_,eachBefore:K_,find:Z_,sum:J_,sort:eD,path:tD,ancestors:rD,descendants:nD,leaves:iD,links:aD,copy:Ske,[Symbol.iterator]:sD}});function nq(t){if(typeof t!="function")throw new Error;return t}var iq=N(()=>{"use strict";o(nq,"required")});function G0(){return 0}function Ed(t){return function(){return t}}var aq=N(()=>{"use strict";o(G0,"constantZero");o(Ed,"default")});function oD(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}var sq=N(()=>{"use strict";o(oD,"default")});function lD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(n-e)/t.value;++l{"use strict";o(lD,"default")});function cD(t,e,r,n,i){for(var a=t.children,s,l=-1,u=a.length,h=t.value&&(i-r)/t.value;++l{"use strict";o(cD,"default")});function Rke(t,e,r,n,i,a){for(var s=[],l=e.children,u,h,f=0,d=0,p=l.length,m,g,y=e.value,v,x,b,T,S,w,E;fb&&(b=h),E=v*v*w,T=Math.max(b/E,E/x),T>S){v-=h;break}S=T}s.push(u={value:v,dice:m{"use strict";oq();lq();Lke=(1+Math.sqrt(5))/2;o(Rke,"squarifyRatio");cq=o(function t(e){function r(n,i,a,s,l){Rke(e,n,i,a,s,l)}return o(r,"squarify"),r.ratio=function(n){return t((n=+n)>1?n:1)},r},"custom")(Lke)});function D5(){var t=cq,e=!1,r=1,n=1,i=[0],a=G0,s=G0,l=G0,u=G0,h=G0;function f(p){return p.x0=p.y0=0,p.x1=r,p.y1=n,p.eachBefore(d),i=[0],e&&p.eachBefore(oD),p}o(f,"treemap");function d(p){var m=i[p.depth],g=p.x0+m,y=p.y0+m,v=p.x1-m,x=p.y1-m;v{"use strict";sq();uq();iq();aq();o(D5,"default")});var fq=N(()=>{"use strict";rq();hq()});var dq=N(()=>{"use strict"});var pq=N(()=>{"use strict"});function Rh(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t);break}return this}var Nv=N(()=>{"use strict";o(Rh,"initRange")});function Js(){var t=new C0,e=[],r=[],n=uD;function i(a){let s=t.get(a);if(s===void 0){if(n!==uD)return n;t.set(a,s=e.push(a)-1)}return r[s%r.length]}return o(i,"scale"),i.domain=function(a){if(!arguments.length)return e.slice();e=[],t=new C0;for(let s of a)t.has(s)||t.set(s,e.push(s)-1);return i},i.range=function(a){return arguments.length?(r=Array.from(a),i):r.slice()},i.unknown=function(a){return arguments.length?(n=a,i):n},i.copy=function(){return Js(e,r).unknown(n)},Rh.apply(i,arguments),i}var uD,hD=N(()=>{"use strict";Eh();Nv();uD=Symbol("implicit");o(Js,"ordinal")});function V0(){var t=Js().unknown(void 0),e=t.domain,r=t.range,n=0,i=1,a,s,l=!1,u=0,h=0,f=.5;delete t.unknown;function d(){var p=e().length,m=i{"use strict";Eh();Nv();hD();o(V0,"band")});function fD(t){return function(){return t}}var gq=N(()=>{"use strict";o(fD,"constants")});function dD(t){return+t}var yq=N(()=>{"use strict";o(dD,"number")});function U0(t){return t}function pD(t,e){return(e-=t=+t)?function(r){return(r-t)/e}:fD(isNaN(e)?NaN:.5)}function Nke(t,e){var r;return t>e&&(r=t,t=e,e=r),function(n){return Math.max(t,Math.min(e,n))}}function Mke(t,e,r){var n=t[0],i=t[1],a=e[0],s=e[1];return i2?Ike:Mke,u=h=null,d}o(f,"rescale");function d(p){return p==null||isNaN(p=+p)?a:(u||(u=l(t.map(n),e,r)))(n(s(p)))}return o(d,"scale"),d.invert=function(p){return s(i((h||(h=l(e,t.map(n),Ki)))(p)))},d.domain=function(p){return arguments.length?(t=Array.from(p,dD),f()):t.slice()},d.range=function(p){return arguments.length?(e=Array.from(p),f()):e.slice()},d.rangeRound=function(p){return e=Array.from(p),r=s5,f()},d.clamp=function(p){return arguments.length?(s=p?!0:U0,f()):s!==U0},d.interpolate=function(p){return arguments.length?(r=p,f()):r},d.unknown=function(p){return arguments.length?(a=p,d):a},function(p,m){return n=p,i=m,f()}}function Mv(){return Oke()(U0,U0)}var vq,mD=N(()=>{"use strict";Eh();B0();gq();yq();vq=[0,1];o(U0,"identity");o(pD,"normalize");o(Nke,"clamper");o(Mke,"bimap");o(Ike,"polymap");o(L5,"copy");o(Oke,"transformer");o(Mv,"continuous")});function gD(t,e,r,n){var i=A0(t,e,r),a;switch(n=Lh(n??",f"),n.type){case"s":{var s=Math.max(Math.abs(t),Math.abs(e));return n.precision==null&&!isNaN(a=A5(i,s))&&(n.precision=a),S5(n,s)}case"":case"e":case"g":case"p":case"r":{n.precision==null&&!isNaN(a=_5(i,Math.max(Math.abs(t),Math.abs(e))))&&(n.precision=a-(n.type==="e"));break}case"f":case"%":{n.precision==null&&!isNaN(a=C5(i))&&(n.precision=a-(n.type==="%")*2);break}}return cc(n)}var xq=N(()=>{"use strict";Eh();Y_();o(gD,"tickFormat")});function Pke(t){var e=t.domain;return t.ticks=function(r){var n=e();return U3(n[0],n[n.length-1],r??10)},t.tickFormat=function(r,n){var i=e();return gD(i[0],i[i.length-1],r??10,n)},t.nice=function(r){r==null&&(r=10);var n=e(),i=0,a=n.length-1,s=n[i],l=n[a],u,h,f=10;for(l0;){if(h=ov(s,l,r),h===u)return n[i]=s,n[a]=l,e(n);if(h>0)s=Math.floor(s/h)*h,l=Math.ceil(l/h)*h;else if(h<0)s=Math.ceil(s*h)/h,l=Math.floor(l*h)/h;else break;u=h}return t},t}function Tl(){var t=Mv();return t.copy=function(){return L5(t,Tl())},Rh.apply(t,arguments),Pke(t)}var bq=N(()=>{"use strict";Eh();mD();Nv();xq();o(Pke,"linearish");o(Tl,"linear")});function yD(t,e){t=t.slice();var r=0,n=t.length-1,i=t[r],a=t[n],s;return a{"use strict";o(yD,"nice")});function xn(t,e,r,n){function i(a){return t(a=arguments.length===0?new Date:new Date(+a)),a}return o(i,"interval"),i.floor=a=>(t(a=new Date(+a)),a),i.ceil=a=>(t(a=new Date(a-1)),e(a,1),t(a),a),i.round=a=>{let s=i(a),l=i.ceil(a);return a-s(e(a=new Date(+a),s==null?1:Math.floor(s)),a),i.range=(a,s,l)=>{let u=[];if(a=i.ceil(a),l=l==null?1:Math.floor(l),!(a0))return u;let h;do u.push(h=new Date(+a)),e(a,l),t(a);while(hxn(s=>{if(s>=s)for(;t(s),!a(s);)s.setTime(s-1)},(s,l)=>{if(s>=s)if(l<0)for(;++l<=0;)for(;e(s,-1),!a(s););else for(;--l>=0;)for(;e(s,1),!a(s););}),r&&(i.count=(a,s)=>(vD.setTime(+a),xD.setTime(+s),t(vD),t(xD),Math.floor(r(vD,xD))),i.every=a=>(a=Math.floor(a),!isFinite(a)||!(a>0)?null:a>1?i.filter(n?s=>n(s)%a===0:s=>i.count(0,s)%a===0):i)),i}var vD,xD,Tu=N(()=>{"use strict";vD=new Date,xD=new Date;o(xn,"timeInterval")});var uc,wq,bD=N(()=>{"use strict";Tu();uc=xn(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);uc.every=t=>(t=Math.floor(t),!isFinite(t)||!(t>0)?null:t>1?xn(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):uc);wq=uc.range});var eo,kq,TD=N(()=>{"use strict";Tu();eo=xn(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*1e3)},(t,e)=>(e-t)/1e3,t=>t.getUTCSeconds()),kq=eo.range});var wu,Bke,R5,Fke,wD=N(()=>{"use strict";Tu();wu=xn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getMinutes()),Bke=wu.range,R5=xn(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*6e4)},(t,e)=>(e-t)/6e4,t=>t.getUTCMinutes()),Fke=R5.range});var ku,$ke,N5,zke,kD=N(()=>{"use strict";Tu();ku=xn(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*1e3-t.getMinutes()*6e4)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getHours()),$ke=ku.range,N5=xn(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*36e5)},(t,e)=>(e-t)/36e5,t=>t.getUTCHours()),zke=N5.range});var Ro,Gke,Ov,Vke,M5,Uke,ED=N(()=>{"use strict";Tu();Ro=xn(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5,t=>t.getDate()-1),Gke=Ro.range,Ov=xn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>t.getUTCDate()-1),Vke=Ov.range,M5=xn(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/864e5,t=>Math.floor(t/864e5)),Uke=M5.range});function Ad(t){return xn(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(e,r)=>{e.setDate(e.getDate()+r*7)},(e,r)=>(r-e-(r.getTimezoneOffset()-e.getTimezoneOffset())*6e4)/6048e5)}function _d(t){return xn(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCDate(e.getUTCDate()+r*7)},(e,r)=>(r-e)/6048e5)}var wl,Nh,I5,O5,fc,P5,B5,Sq,Hke,Wke,qke,Yke,Xke,jke,Dd,H0,Cq,Aq,Mh,_q,Dq,Lq,Kke,Qke,Zke,Jke,eEe,tEe,SD=N(()=>{"use strict";Tu();o(Ad,"timeWeekday");wl=Ad(0),Nh=Ad(1),I5=Ad(2),O5=Ad(3),fc=Ad(4),P5=Ad(5),B5=Ad(6),Sq=wl.range,Hke=Nh.range,Wke=I5.range,qke=O5.range,Yke=fc.range,Xke=P5.range,jke=B5.range;o(_d,"utcWeekday");Dd=_d(0),H0=_d(1),Cq=_d(2),Aq=_d(3),Mh=_d(4),_q=_d(5),Dq=_d(6),Lq=Dd.range,Kke=H0.range,Qke=Cq.range,Zke=Aq.range,Jke=Mh.range,eEe=_q.range,tEe=Dq.range});var Eu,rEe,F5,nEe,CD=N(()=>{"use strict";Tu();Eu=xn(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+(e.getFullYear()-t.getFullYear())*12,t=>t.getMonth()),rEe=Eu.range,F5=xn(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+(e.getUTCFullYear()-t.getUTCFullYear())*12,t=>t.getUTCMonth()),nEe=F5.range});var to,iEe,kl,aEe,AD=N(()=>{"use strict";Tu();to=xn(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear());to.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:xn(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)});iEe=to.range,kl=xn(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());kl.every=t=>!isFinite(t=Math.floor(t))||!(t>0)?null:xn(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)});aEe=kl.range});function Nq(t,e,r,n,i,a){let s=[[eo,1,1e3],[eo,5,5*1e3],[eo,15,15*1e3],[eo,30,30*1e3],[a,1,6e4],[a,5,5*6e4],[a,15,15*6e4],[a,30,30*6e4],[i,1,36e5],[i,3,3*36e5],[i,6,6*36e5],[i,12,12*36e5],[n,1,864e5],[n,2,2*864e5],[r,1,6048e5],[e,1,2592e6],[e,3,3*2592e6],[t,1,31536e6]];function l(h,f,d){let p=fv).right(s,p);if(m===s.length)return t.every(A0(h/31536e6,f/31536e6,d));if(m===0)return uc.every(Math.max(A0(h,f,d),1));let[g,y]=s[p/s[m-1][2]{"use strict";Eh();bD();TD();wD();kD();ED();SD();CD();AD();o(Nq,"ticker");[oEe,lEe]=Nq(kl,F5,Dd,M5,N5,R5),[_D,DD]=Nq(to,Eu,wl,Ro,ku,wu)});var $5=N(()=>{"use strict";bD();TD();wD();kD();ED();SD();CD();AD();Mq()});function LD(t){if(0<=t.y&&t.y<100){var e=new Date(-1,t.m,t.d,t.H,t.M,t.S,t.L);return e.setFullYear(t.y),e}return new Date(t.y,t.m,t.d,t.H,t.M,t.S,t.L)}function RD(t){if(0<=t.y&&t.y<100){var e=new Date(Date.UTC(-1,t.m,t.d,t.H,t.M,t.S,t.L));return e.setUTCFullYear(t.y),e}return new Date(Date.UTC(t.y,t.m,t.d,t.H,t.M,t.S,t.L))}function Pv(t,e,r){return{y:t,m:e,d:r,H:0,M:0,S:0,L:0}}function ND(t){var e=t.dateTime,r=t.date,n=t.time,i=t.periods,a=t.days,s=t.shortDays,l=t.months,u=t.shortMonths,h=Bv(i),f=Fv(i),d=Bv(a),p=Fv(a),m=Bv(s),g=Fv(s),y=Bv(l),v=Fv(l),x=Bv(u),b=Fv(u),T={a:P,A:B,b:F,B:z,c:null,d:$q,e:$q,f:REe,g:GEe,G:UEe,H:_Ee,I:DEe,j:LEe,L:Hq,m:NEe,M:MEe,p:$,q:U,Q:Vq,s:Uq,S:IEe,u:OEe,U:PEe,V:BEe,w:FEe,W:$Ee,x:null,X:null,y:zEe,Y:VEe,Z:HEe,"%":Gq},S={a:K,A:ee,b:Y,B:ce,c:null,d:zq,e:zq,f:XEe,g:iSe,G:sSe,H:WEe,I:qEe,j:YEe,L:qq,m:jEe,M:KEe,p:Z,q:ue,Q:Vq,s:Uq,S:QEe,u:ZEe,U:JEe,V:eSe,w:tSe,W:rSe,x:null,X:null,y:nSe,Y:aSe,Z:oSe,"%":Gq},w={a:O,A:R,b:k,B:L,c:A,d:Bq,e:Bq,f:EEe,g:Pq,G:Oq,H:Fq,I:Fq,j:bEe,L:kEe,m:xEe,M:TEe,p:D,q:vEe,Q:CEe,s:AEe,S:wEe,u:dEe,U:pEe,V:mEe,w:fEe,W:gEe,x:I,X:M,y:Pq,Y:Oq,Z:yEe,"%":SEe};T.x=E(r,T),T.X=E(n,T),T.c=E(e,T),S.x=E(r,S),S.X=E(n,S),S.c=E(e,S);function E(Q,j){return function(ne){var te=[],he=-1,le=0,J=Q.length,Se,se,ae;for(ne instanceof Date||(ne=new Date(+ne));++he53)return null;"w"in te||(te.w=1),"Z"in te?(le=RD(Pv(te.y,0,1)),J=le.getUTCDay(),le=J>4||J===0?H0.ceil(le):H0(le),le=Ov.offset(le,(te.V-1)*7),te.y=le.getUTCFullYear(),te.m=le.getUTCMonth(),te.d=le.getUTCDate()+(te.w+6)%7):(le=LD(Pv(te.y,0,1)),J=le.getDay(),le=J>4||J===0?Nh.ceil(le):Nh(le),le=Ro.offset(le,(te.V-1)*7),te.y=le.getFullYear(),te.m=le.getMonth(),te.d=le.getDate()+(te.w+6)%7)}else("W"in te||"U"in te)&&("w"in te||(te.w="u"in te?te.u%7:"W"in te?1:0),J="Z"in te?RD(Pv(te.y,0,1)).getUTCDay():LD(Pv(te.y,0,1)).getDay(),te.m=0,te.d="W"in te?(te.w+6)%7+te.W*7-(J+5)%7:te.w+te.U*7-(J+6)%7);return"Z"in te?(te.H+=te.Z/100|0,te.M+=te.Z%100,RD(te)):LD(te)}}o(_,"newParse");function C(Q,j,ne,te){for(var he=0,le=j.length,J=ne.length,Se,se;he=J)return-1;if(Se=j.charCodeAt(he++),Se===37){if(Se=j.charAt(he++),se=w[Se in Iq?j.charAt(he++):Se],!se||(te=se(Q,ne,te))<0)return-1}else if(Se!=ne.charCodeAt(te++))return-1}return te}o(C,"parseSpecifier");function D(Q,j,ne){var te=h.exec(j.slice(ne));return te?(Q.p=f.get(te[0].toLowerCase()),ne+te[0].length):-1}o(D,"parsePeriod");function O(Q,j,ne){var te=m.exec(j.slice(ne));return te?(Q.w=g.get(te[0].toLowerCase()),ne+te[0].length):-1}o(O,"parseShortWeekday");function R(Q,j,ne){var te=d.exec(j.slice(ne));return te?(Q.w=p.get(te[0].toLowerCase()),ne+te[0].length):-1}o(R,"parseWeekday");function k(Q,j,ne){var te=x.exec(j.slice(ne));return te?(Q.m=b.get(te[0].toLowerCase()),ne+te[0].length):-1}o(k,"parseShortMonth");function L(Q,j,ne){var te=y.exec(j.slice(ne));return te?(Q.m=v.get(te[0].toLowerCase()),ne+te[0].length):-1}o(L,"parseMonth");function A(Q,j,ne){return C(Q,e,j,ne)}o(A,"parseLocaleDateTime");function I(Q,j,ne){return C(Q,r,j,ne)}o(I,"parseLocaleDate");function M(Q,j,ne){return C(Q,n,j,ne)}o(M,"parseLocaleTime");function P(Q){return s[Q.getDay()]}o(P,"formatShortWeekday");function B(Q){return a[Q.getDay()]}o(B,"formatWeekday");function F(Q){return u[Q.getMonth()]}o(F,"formatShortMonth");function z(Q){return l[Q.getMonth()]}o(z,"formatMonth");function $(Q){return i[+(Q.getHours()>=12)]}o($,"formatPeriod");function U(Q){return 1+~~(Q.getMonth()/3)}o(U,"formatQuarter");function K(Q){return s[Q.getUTCDay()]}o(K,"formatUTCShortWeekday");function ee(Q){return a[Q.getUTCDay()]}o(ee,"formatUTCWeekday");function Y(Q){return u[Q.getUTCMonth()]}o(Y,"formatUTCShortMonth");function ce(Q){return l[Q.getUTCMonth()]}o(ce,"formatUTCMonth");function Z(Q){return i[+(Q.getUTCHours()>=12)]}o(Z,"formatUTCPeriod");function ue(Q){return 1+~~(Q.getUTCMonth()/3)}return o(ue,"formatUTCQuarter"),{format:o(function(Q){var j=E(Q+="",T);return j.toString=function(){return Q},j},"format"),parse:o(function(Q){var j=_(Q+="",!1);return j.toString=function(){return Q},j},"parse"),utcFormat:o(function(Q){var j=E(Q+="",S);return j.toString=function(){return Q},j},"utcFormat"),utcParse:o(function(Q){var j=_(Q+="",!0);return j.toString=function(){return Q},j},"utcParse")}}function Wr(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a[e.toLowerCase(),r]))}function fEe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function dEe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function pEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function mEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function gEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function Oq(t,e,r){var n=Qi.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function Pq(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function yEe(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function vEe(t,e,r){var n=Qi.exec(e.slice(r,r+1));return n?(t.q=n[0]*3-3,r+n[0].length):-1}function xEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function Bq(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function bEe(t,e,r){var n=Qi.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function Fq(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function TEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function wEe(t,e,r){var n=Qi.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function kEe(t,e,r){var n=Qi.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function EEe(t,e,r){var n=Qi.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function SEe(t,e,r){var n=cEe.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function CEe(t,e,r){var n=Qi.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function AEe(t,e,r){var n=Qi.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function $q(t,e){return Wr(t.getDate(),e,2)}function _Ee(t,e){return Wr(t.getHours(),e,2)}function DEe(t,e){return Wr(t.getHours()%12||12,e,2)}function LEe(t,e){return Wr(1+Ro.count(to(t),t),e,3)}function Hq(t,e){return Wr(t.getMilliseconds(),e,3)}function REe(t,e){return Hq(t,e)+"000"}function NEe(t,e){return Wr(t.getMonth()+1,e,2)}function MEe(t,e){return Wr(t.getMinutes(),e,2)}function IEe(t,e){return Wr(t.getSeconds(),e,2)}function OEe(t){var e=t.getDay();return e===0?7:e}function PEe(t,e){return Wr(wl.count(to(t)-1,t),e,2)}function Wq(t){var e=t.getDay();return e>=4||e===0?fc(t):fc.ceil(t)}function BEe(t,e){return t=Wq(t),Wr(fc.count(to(t),t)+(to(t).getDay()===4),e,2)}function FEe(t){return t.getDay()}function $Ee(t,e){return Wr(Nh.count(to(t)-1,t),e,2)}function zEe(t,e){return Wr(t.getFullYear()%100,e,2)}function GEe(t,e){return t=Wq(t),Wr(t.getFullYear()%100,e,2)}function VEe(t,e){return Wr(t.getFullYear()%1e4,e,4)}function UEe(t,e){var r=t.getDay();return t=r>=4||r===0?fc(t):fc.ceil(t),Wr(t.getFullYear()%1e4,e,4)}function HEe(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+Wr(e/60|0,"0",2)+Wr(e%60,"0",2)}function zq(t,e){return Wr(t.getUTCDate(),e,2)}function WEe(t,e){return Wr(t.getUTCHours(),e,2)}function qEe(t,e){return Wr(t.getUTCHours()%12||12,e,2)}function YEe(t,e){return Wr(1+Ov.count(kl(t),t),e,3)}function qq(t,e){return Wr(t.getUTCMilliseconds(),e,3)}function XEe(t,e){return qq(t,e)+"000"}function jEe(t,e){return Wr(t.getUTCMonth()+1,e,2)}function KEe(t,e){return Wr(t.getUTCMinutes(),e,2)}function QEe(t,e){return Wr(t.getUTCSeconds(),e,2)}function ZEe(t){var e=t.getUTCDay();return e===0?7:e}function JEe(t,e){return Wr(Dd.count(kl(t)-1,t),e,2)}function Yq(t){var e=t.getUTCDay();return e>=4||e===0?Mh(t):Mh.ceil(t)}function eSe(t,e){return t=Yq(t),Wr(Mh.count(kl(t),t)+(kl(t).getUTCDay()===4),e,2)}function tSe(t){return t.getUTCDay()}function rSe(t,e){return Wr(H0.count(kl(t)-1,t),e,2)}function nSe(t,e){return Wr(t.getUTCFullYear()%100,e,2)}function iSe(t,e){return t=Yq(t),Wr(t.getUTCFullYear()%100,e,2)}function aSe(t,e){return Wr(t.getUTCFullYear()%1e4,e,4)}function sSe(t,e){var r=t.getUTCDay();return t=r>=4||r===0?Mh(t):Mh.ceil(t),Wr(t.getUTCFullYear()%1e4,e,4)}function oSe(){return"+0000"}function Gq(){return"%"}function Vq(t){return+t}function Uq(t){return Math.floor(+t/1e3)}var Iq,Qi,cEe,uEe,Xq=N(()=>{"use strict";$5();o(LD,"localDate");o(RD,"utcDate");o(Pv,"newDate");o(ND,"formatLocale");Iq={"-":"",_:" ",0:"0"},Qi=/^\s*\d+/,cEe=/^%/,uEe=/[\\^$*+?|[\]().{}]/g;o(Wr,"pad");o(hEe,"requote");o(Bv,"formatRe");o(Fv,"formatLookup");o(fEe,"parseWeekdayNumberSunday");o(dEe,"parseWeekdayNumberMonday");o(pEe,"parseWeekNumberSunday");o(mEe,"parseWeekNumberISO");o(gEe,"parseWeekNumberMonday");o(Oq,"parseFullYear");o(Pq,"parseYear");o(yEe,"parseZone");o(vEe,"parseQuarter");o(xEe,"parseMonthNumber");o(Bq,"parseDayOfMonth");o(bEe,"parseDayOfYear");o(Fq,"parseHour24");o(TEe,"parseMinutes");o(wEe,"parseSeconds");o(kEe,"parseMilliseconds");o(EEe,"parseMicroseconds");o(SEe,"parseLiteralPercent");o(CEe,"parseUnixTimestamp");o(AEe,"parseUnixTimestampSeconds");o($q,"formatDayOfMonth");o(_Ee,"formatHour24");o(DEe,"formatHour12");o(LEe,"formatDayOfYear");o(Hq,"formatMilliseconds");o(REe,"formatMicroseconds");o(NEe,"formatMonthNumber");o(MEe,"formatMinutes");o(IEe,"formatSeconds");o(OEe,"formatWeekdayNumberMonday");o(PEe,"formatWeekNumberSunday");o(Wq,"dISO");o(BEe,"formatWeekNumberISO");o(FEe,"formatWeekdayNumberSunday");o($Ee,"formatWeekNumberMonday");o(zEe,"formatYear");o(GEe,"formatYearISO");o(VEe,"formatFullYear");o(UEe,"formatFullYearISO");o(HEe,"formatZone");o(zq,"formatUTCDayOfMonth");o(WEe,"formatUTCHour24");o(qEe,"formatUTCHour12");o(YEe,"formatUTCDayOfYear");o(qq,"formatUTCMilliseconds");o(XEe,"formatUTCMicroseconds");o(jEe,"formatUTCMonthNumber");o(KEe,"formatUTCMinutes");o(QEe,"formatUTCSeconds");o(ZEe,"formatUTCWeekdayNumberMonday");o(JEe,"formatUTCWeekNumberSunday");o(Yq,"UTCdISO");o(eSe,"formatUTCWeekNumberISO");o(tSe,"formatUTCWeekdayNumberSunday");o(rSe,"formatUTCWeekNumberMonday");o(nSe,"formatUTCYear");o(iSe,"formatUTCYearISO");o(aSe,"formatUTCFullYear");o(sSe,"formatUTCFullYearISO");o(oSe,"formatUTCZone");o(Gq,"formatLiteralPercent");o(Vq,"formatUnixTimestamp");o(Uq,"formatUnixTimestampSeconds")});function MD(t){return W0=ND(t),Ld=W0.format,jq=W0.parse,Kq=W0.utcFormat,Qq=W0.utcParse,W0}var W0,Ld,jq,Kq,Qq,Zq=N(()=>{"use strict";Xq();MD({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});o(MD,"defaultLocale")});var ID=N(()=>{"use strict";Zq()});function lSe(t){return new Date(t)}function cSe(t){return t instanceof Date?+t:+new Date(+t)}function Jq(t,e,r,n,i,a,s,l,u,h){var f=Mv(),d=f.invert,p=f.domain,m=h(".%L"),g=h(":%S"),y=h("%I:%M"),v=h("%I %p"),x=h("%a %d"),b=h("%b %d"),T=h("%B"),S=h("%Y");function w(E){return(u(E){"use strict";$5();ID();mD();Nv();Tq();o(lSe,"date");o(cSe,"number");o(Jq,"calendar");o(z5,"time")});var tY=N(()=>{"use strict";mq();bq();hD();eY()});function OD(t){for(var e=t.length/6|0,r=new Array(e),n=0;n{"use strict";o(OD,"default")});var PD,nY=N(()=>{"use strict";rY();PD=OD("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab")});var iY=N(()=>{"use strict";nY()});function Bn(t){return o(function(){return t},"constant")}var G5=N(()=>{"use strict";o(Bn,"default")});function sY(t){return t>1?0:t<-1?q0:Math.acos(t)}function FD(t){return t>=1?$v:t<=-1?-$v:Math.asin(t)}var BD,ha,Ih,aY,V5,El,Rd,Zi,q0,$v,Y0,U5=N(()=>{"use strict";BD=Math.abs,ha=Math.atan2,Ih=Math.cos,aY=Math.max,V5=Math.min,El=Math.sin,Rd=Math.sqrt,Zi=1e-12,q0=Math.PI,$v=q0/2,Y0=2*q0;o(sY,"acos");o(FD,"asin")});function H5(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(r==null)e=null;else{let n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);e=n}return t},()=>new wd(e)}var $D=N(()=>{"use strict";O_();o(H5,"withPath")});function uSe(t){return t.innerRadius}function hSe(t){return t.outerRadius}function fSe(t){return t.startAngle}function dSe(t){return t.endAngle}function pSe(t){return t&&t.padAngle}function mSe(t,e,r,n,i,a,s,l){var u=r-t,h=n-e,f=s-i,d=l-a,p=d*u-f*h;if(!(p*pA*A+I*I&&(C=O,D=R),{cx:C,cy:D,x01:-f,y01:-d,x11:C*(i/w-1),y11:D*(i/w-1)}}function Sl(){var t=uSe,e=hSe,r=Bn(0),n=null,i=fSe,a=dSe,s=pSe,l=null,u=H5(h);function h(){var f,d,p=+t.apply(this,arguments),m=+e.apply(this,arguments),g=i.apply(this,arguments)-$v,y=a.apply(this,arguments)-$v,v=BD(y-g),x=y>g;if(l||(l=f=u()),mZi))l.moveTo(0,0);else if(v>Y0-Zi)l.moveTo(m*Ih(g),m*El(g)),l.arc(0,0,m,g,y,!x),p>Zi&&(l.moveTo(p*Ih(y),p*El(y)),l.arc(0,0,p,y,g,x));else{var b=g,T=y,S=g,w=y,E=v,_=v,C=s.apply(this,arguments)/2,D=C>Zi&&(n?+n.apply(this,arguments):Rd(p*p+m*m)),O=V5(BD(m-p)/2,+r.apply(this,arguments)),R=O,k=O,L,A;if(D>Zi){var I=FD(D/p*El(C)),M=FD(D/m*El(C));(E-=I*2)>Zi?(I*=x?1:-1,S+=I,w-=I):(E=0,S=w=(g+y)/2),(_-=M*2)>Zi?(M*=x?1:-1,b+=M,T-=M):(_=0,b=T=(g+y)/2)}var P=m*Ih(b),B=m*El(b),F=p*Ih(w),z=p*El(w);if(O>Zi){var $=m*Ih(T),U=m*El(T),K=p*Ih(S),ee=p*El(S),Y;if(vZi?k>Zi?(L=W5(K,ee,P,B,m,k,x),A=W5($,U,F,z,m,k,x),l.moveTo(L.cx+L.x01,L.cy+L.y01),kZi)||!(E>Zi)?l.lineTo(F,z):R>Zi?(L=W5(F,z,$,U,p,-R,x),A=W5(P,B,K,ee,p,-R,x),l.lineTo(L.cx+L.x01,L.cy+L.y01),R{"use strict";G5();U5();$D();o(uSe,"arcInnerRadius");o(hSe,"arcOuterRadius");o(fSe,"arcStartAngle");o(dSe,"arcEndAngle");o(pSe,"arcPadAngle");o(mSe,"intersect");o(W5,"cornerTangents");o(Sl,"default")});function zv(t){return typeof t=="object"&&"length"in t?t:Array.from(t)}var yxt,zD=N(()=>{"use strict";yxt=Array.prototype.slice;o(zv,"default")});function lY(t){this._context=t}function Su(t){return new lY(t)}var GD=N(()=>{"use strict";o(lY,"Linear");lY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e);break}},"point")};o(Su,"default")});function cY(t){return t[0]}function uY(t){return t[1]}var hY=N(()=>{"use strict";o(cY,"x");o(uY,"y")});function Cl(t,e){var r=Bn(!0),n=null,i=Su,a=null,s=H5(l);t=typeof t=="function"?t:t===void 0?cY:Bn(t),e=typeof e=="function"?e:e===void 0?uY:Bn(e);function l(u){var h,f=(u=zv(u)).length,d,p=!1,m;for(n==null&&(a=i(m=s())),h=0;h<=f;++h)!(h{"use strict";zD();G5();GD();$D();hY();o(Cl,"default")});function VD(t,e){return et?1:e>=t?0:NaN}var dY=N(()=>{"use strict";o(VD,"default")});function UD(t){return t}var pY=N(()=>{"use strict";o(UD,"default")});function q5(){var t=UD,e=VD,r=null,n=Bn(0),i=Bn(Y0),a=Bn(0);function s(l){var u,h=(l=zv(l)).length,f,d,p=0,m=new Array(h),g=new Array(h),y=+n.apply(this,arguments),v=Math.min(Y0,Math.max(-Y0,i.apply(this,arguments)-y)),x,b=Math.min(Math.abs(v)/h,a.apply(this,arguments)),T=b*(v<0?-1:1),S;for(u=0;u0&&(p+=S);for(e!=null?m.sort(function(w,E){return e(g[w],g[E])}):r!=null&&m.sort(function(w,E){return r(l[w],l[E])}),u=0,d=p?(v-h*T)/p:0;u0?S*d:0)+T,g[f]={data:l[f],index:u,value:S,startAngle:y,endAngle:x,padAngle:b};return g}return o(s,"pie"),s.value=function(l){return arguments.length?(t=typeof l=="function"?l:Bn(+l),s):t},s.sortValues=function(l){return arguments.length?(e=l,r=null,s):e},s.sort=function(l){return arguments.length?(r=l,e=null,s):r},s.startAngle=function(l){return arguments.length?(n=typeof l=="function"?l:Bn(+l),s):n},s.endAngle=function(l){return arguments.length?(i=typeof l=="function"?l:Bn(+l),s):i},s.padAngle=function(l){return arguments.length?(a=typeof l=="function"?l:Bn(+l),s):a},s}var mY=N(()=>{"use strict";zD();G5();dY();pY();U5();o(q5,"default")});function Gv(t){return new Y5(t,!0)}function Vv(t){return new Y5(t,!1)}var Y5,gY=N(()=>{"use strict";Y5=class{static{o(this,"Bump")}constructor(e,r){this._context=e,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,r){switch(e=+e,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(e,r):this._context.moveTo(e,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,r,e,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,e,this._y0,e,r);break}}this._x0=e,this._y0=r}};o(Gv,"bumpX");o(Vv,"bumpY")});function ro(){}var Uv=N(()=>{"use strict";o(ro,"default")});function X0(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function Hv(t){this._context=t}function No(t){return new Hv(t)}var Wv=N(()=>{"use strict";o(X0,"point");o(Hv,"Basis");Hv.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 3:X0(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:X0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(No,"default")});function yY(t){this._context=t}function X5(t){return new yY(t)}var vY=N(()=>{"use strict";Uv();Wv();o(yY,"BasisClosed");yY.prototype={areaStart:ro,areaEnd:ro,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:X0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(X5,"default")});function xY(t){this._context=t}function j5(t){return new xY(t)}var bY=N(()=>{"use strict";Wv();o(xY,"BasisOpen");xY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:X0(this,t,e);break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e},"point")};o(j5,"default")});function TY(t,e){this._basis=new Hv(t),this._beta=e}var HD,wY=N(()=>{"use strict";Wv();o(TY,"Bundle");TY.prototype={lineStart:o(function(){this._x=[],this._y=[],this._basis.lineStart()},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n=t[0],i=e[0],a=t[r]-n,s=e[r]-i,l=-1,u;++l<=r;)u=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(n+u*a),this._beta*e[l]+(1-this._beta)*(i+u*s));this._x=this._y=null,this._basis.lineEnd()},"lineEnd"),point:o(function(t,e){this._x.push(+t),this._y.push(+e)},"point")};HD=o(function t(e){function r(n){return e===1?new Hv(n):new TY(n,e)}return o(r,"bundle"),r.beta=function(n){return t(+n)},r},"custom")(.85)});function j0(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function K5(t,e){this._context=t,this._k=(1-e)/6}var qv,Yv=N(()=>{"use strict";o(j0,"point");o(K5,"Cardinal");K5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:j0(this,this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:j0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};qv=o(function t(e){function r(n){return new K5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function Q5(t,e){this._context=t,this._k=(1-e)/6}var WD,qD=N(()=>{"use strict";Uv();Yv();o(Q5,"CardinalClosed");Q5.prototype={areaStart:ro,areaEnd:ro,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:j0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};WD=o(function t(e){function r(n){return new Q5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function Z5(t,e){this._context=t,this._k=(1-e)/6}var YD,XD=N(()=>{"use strict";Yv();o(Z5,"CardinalOpen");Z5.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:j0(this,t,e);break}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};YD=o(function t(e){function r(n){return new Z5(n,e)}return o(r,"cardinal"),r.tension=function(n){return t(+n)},r},"custom")(0)});function Xv(t,e,r){var n=t._x1,i=t._y1,a=t._x2,s=t._y2;if(t._l01_a>Zi){var l=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,u=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*l-t._x0*t._l12_2a+t._x2*t._l01_2a)/u,i=(i*l-t._y0*t._l12_2a+t._y2*t._l01_2a)/u}if(t._l23_a>Zi){var h=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,f=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*h+t._x1*t._l23_2a-e*t._l12_2a)/f,s=(s*h+t._y1*t._l23_2a-r*t._l12_2a)/f}t._context.bezierCurveTo(n,i,a,s,t._x2,t._y2)}function kY(t,e){this._context=t,this._alpha=e}var jv,J5=N(()=>{"use strict";U5();Yv();o(Xv,"point");o(kY,"CatmullRom");kY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Xv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};jv=o(function t(e){function r(n){return e?new kY(n,e):new K5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function EY(t,e){this._context=t,this._alpha=e}var jD,SY=N(()=>{"use strict";qD();Uv();J5();o(EY,"CatmullRomClosed");EY.prototype={areaStart:ro,areaEnd:ro,lineStart:o(function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 1:{this._context.moveTo(this._x3,this._y3),this._context.closePath();break}case 2:{this._context.lineTo(this._x3,this._y3),this._context.closePath();break}case 3:{this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5);break}}},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Xv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};jD=o(function t(e){function r(n){return e?new EY(n,e):new Q5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function CY(t,e){this._context=t,this._alpha=e}var KD,AY=N(()=>{"use strict";XD();J5();o(CY,"CatmullRomOpen");CY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},"lineStart"),lineEnd:o(function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Xv(this,t,e);break}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e},"point")};KD=o(function t(e){function r(n){return e?new CY(n,e):new Z5(n,0)}return o(r,"catmullRom"),r.alpha=function(n){return t(+n)},r},"custom")(.5)});function _Y(t){this._context=t}function eT(t){return new _Y(t)}var DY=N(()=>{"use strict";Uv();o(_Y,"LinearClosed");_Y.prototype={areaStart:ro,areaEnd:ro,lineStart:o(function(){this._point=0},"lineStart"),lineEnd:o(function(){this._point&&this._context.closePath()},"lineEnd"),point:o(function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))},"point")};o(eT,"default")});function LY(t){return t<0?-1:1}function RY(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),s=(r-t._y1)/(i||n<0&&-0),l=(a*i+s*n)/(n+i);return(LY(a)+LY(s))*Math.min(Math.abs(a),Math.abs(s),.5*Math.abs(l))||0}function NY(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function QD(t,e,r){var n=t._x0,i=t._y0,a=t._x1,s=t._y1,l=(a-n)/3;t._context.bezierCurveTo(n+l,i+l*e,a-l,s-l*r,a,s)}function tT(t){this._context=t}function MY(t){this._context=new IY(t)}function IY(t){this._context=t}function Kv(t){return new tT(t)}function Qv(t){return new MY(t)}var OY=N(()=>{"use strict";o(LY,"sign");o(RY,"slope3");o(NY,"slope2");o(QD,"point");o(tT,"MonotoneX");tT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},"lineStart"),lineEnd:o(function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:QD(this,this._t0,NY(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},"lineEnd"),point:o(function(t,e){var r=NaN;if(t=+t,e=+e,!(t===this._x1&&e===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,QD(this,NY(this,r=RY(this,t,e)),r);break;default:QD(this,this._t0,r=RY(this,t,e));break}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e,this._t0=r}},"point")};o(MY,"MonotoneY");(MY.prototype=Object.create(tT.prototype)).point=function(t,e){tT.prototype.point.call(this,e,t)};o(IY,"ReflectContext");IY.prototype={moveTo:o(function(t,e){this._context.moveTo(e,t)},"moveTo"),closePath:o(function(){this._context.closePath()},"closePath"),lineTo:o(function(t,e){this._context.lineTo(e,t)},"lineTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._context.bezierCurveTo(e,t,n,r,a,i)},"bezierCurveTo")};o(Kv,"monotoneX");o(Qv,"monotoneY")});function BY(t){this._context=t}function PY(t){var e,r=t.length-1,n,i=new Array(r),a=new Array(r),s=new Array(r);for(i[0]=0,a[0]=2,s[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(s[e]-i[e+1])/a[e];for(a[r-1]=(t[r]+i[r-1])/2,e=0;e{"use strict";o(BY,"Natural");BY.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=[],this._y=[]},"lineStart"),lineEnd:o(function(){var t=this._x,e=this._y,r=t.length;if(r)if(this._line?this._context.lineTo(t[0],e[0]):this._context.moveTo(t[0],e[0]),r===2)this._context.lineTo(t[1],e[1]);else for(var n=PY(t),i=PY(e),a=0,s=1;s{"use strict";o(rT,"Step");rT.prototype={areaStart:o(function(){this._line=0},"areaStart"),areaEnd:o(function(){this._line=NaN},"areaEnd"),lineStart:o(function(){this._x=this._y=NaN,this._point=0},"lineStart"),lineEnd:o(function(){0=0&&(this._t=1-this._t,this._line=1-this._line)},"lineEnd"),point:o(function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}break}}this._x=t,this._y=e},"point")};o(Q0,"default");o(Zv,"stepBefore");o(Jv,"stepAfter")});var zY=N(()=>{"use strict";oY();fY();mY();vY();bY();Wv();gY();wY();qD();XD();Yv();SY();AY();J5();DY();GD();OY();FY();$Y()});var GY=N(()=>{"use strict"});var VY=N(()=>{"use strict"});function Oh(t,e,r){this.k=t,this.x=e,this.y=r}function JD(t){for(;!t.__zoom;)if(!(t=t.parentNode))return ZD;return t.__zoom}var ZD,e9=N(()=>{"use strict";o(Oh,"Transform");Oh.prototype={constructor:Oh,scale:o(function(t){return t===1?this:new Oh(this.k*t,this.x,this.y)},"scale"),translate:o(function(t,e){return t===0&e===0?this:new Oh(this.k,this.x+this.k*t,this.y+this.k*e)},"translate"),apply:o(function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},"apply"),applyX:o(function(t){return t*this.k+this.x},"applyX"),applyY:o(function(t){return t*this.k+this.y},"applyY"),invert:o(function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},"invert"),invertX:o(function(t){return(t-this.x)/this.k},"invertX"),invertY:o(function(t){return(t-this.y)/this.k},"invertY"),rescaleX:o(function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},"rescaleX"),rescaleY:o(function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},"rescaleY"),toString:o(function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"},"toString")};ZD=new Oh(1,0,0);JD.prototype=Oh.prototype;o(JD,"transform")});var UY=N(()=>{"use strict"});var HY=N(()=>{"use strict";b5();GY();VY();e9();UY()});var WY=N(()=>{"use strict";HY();e9()});var fr=N(()=>{"use strict";Eh();JV();vW();wW();I0();kW();EW();VA();HU();SW();L_();CW();_W();Y_();VW();fq();B0();O_();dq();AW();pq();tY();iY();yl();zY();$5();ID();p5();b5();WY()});var qY=Pi(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.BLANK_URL=Ji.relativeFirstCharacters=Ji.whitespaceEscapeCharsRegex=Ji.urlSchemeRegex=Ji.ctrlCharactersRegex=Ji.htmlCtrlEntityRegex=Ji.htmlEntitiesRegex=Ji.invalidProtocolRegex=void 0;Ji.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im;Ji.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g;Ji.htmlCtrlEntityRegex=/&(newline|tab);/gi;Ji.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim;Ji.urlSchemeRegex=/^.+(:|:)/gim;Ji.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g;Ji.relativeFirstCharacters=[".","/"];Ji.BLANK_URL="about:blank"});var Z0=Pi(nT=>{"use strict";Object.defineProperty(nT,"__esModule",{value:!0});nT.sanitizeUrl=void 0;var La=qY();function gSe(t){return La.relativeFirstCharacters.indexOf(t[0])>-1}o(gSe,"isRelativeUrlWithoutProtocol");function ySe(t){var e=t.replace(La.ctrlCharactersRegex,"");return e.replace(La.htmlEntitiesRegex,function(r,n){return String.fromCharCode(n)})}o(ySe,"decodeHtmlCharacters");function vSe(t){return URL.canParse(t)}o(vSe,"isValidUrl");function YY(t){try{return decodeURIComponent(t)}catch{return t}}o(YY,"decodeURI");function xSe(t){if(!t)return La.BLANK_URL;var e,r=YY(t.trim());do r=ySe(r).replace(La.htmlCtrlEntityRegex,"").replace(La.ctrlCharactersRegex,"").replace(La.whitespaceEscapeCharsRegex,"").trim(),r=YY(r),e=r.match(La.ctrlCharactersRegex)||r.match(La.htmlEntitiesRegex)||r.match(La.htmlCtrlEntityRegex)||r.match(La.whitespaceEscapeCharsRegex);while(e&&e.length>0);var n=r;if(!n)return La.BLANK_URL;if(gSe(n))return n;var i=n.trimStart(),a=i.match(La.urlSchemeRegex);if(!a)return n;var s=a[0].toLowerCase().trim();if(La.invalidProtocolRegex.test(s))return La.BLANK_URL;var l=i.replace(/\\/g,"/");if(s==="mailto:"||s.includes("://"))return l;if(s==="http:"||s==="https:"){if(!vSe(l))return La.BLANK_URL;var u=new URL(l);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return l}o(xSe,"sanitizeUrl");nT.sanitizeUrl=xSe});var t9,Nd,iT,XY,jY,KY,Al,e2,t2=N(()=>{"use strict";t9=Aa(Z0(),1);pr();Nd=o((t,e)=>{let r=t.append("rect");if(r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),e.name&&r.attr("name",e.name),e.rx&&r.attr("rx",e.rx),e.ry&&r.attr("ry",e.ry),e.attrs!==void 0)for(let n in e.attrs)r.attr(n,e.attrs[n]);return e.class&&r.attr("class",e.class),r},"drawRect"),iT=o((t,e)=>{let r={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};Nd(t,r).lower()},"drawBackgroundRect"),XY=o((t,e)=>{let r=e.text.replace(ud," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),jY=o((t,e,r,n)=>{let i=t.append("image");i.attr("x",e),i.attr("y",r);let a=(0,t9.sanitizeUrl)(n);i.attr("xlink:href",a)},"drawImage"),KY=o((t,e,r,n)=>{let i=t.append("use");i.attr("x",e),i.attr("y",r);let a=(0,t9.sanitizeUrl)(n);i.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),Al=o(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),e2=o(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")});var QY,r9,ZY,bSe,TSe,wSe,kSe,ESe,SSe,CSe,ASe,_Se,DSe,LSe,RSe,Cu,_l,JY=N(()=>{"use strict";pr();t2();QY=Aa(Z0(),1),r9=o(function(t,e){return Nd(t,e)},"drawRect"),ZY=o(function(t,e,r,n,i,a){let s=t.append("image");s.attr("width",e),s.attr("height",r),s.attr("x",n),s.attr("y",i);let l=a.startsWith("data:image/png;base64")?a:(0,QY.sanitizeUrl)(a);s.attr("xlink:href",l)},"drawImage"),bSe=o((t,e,r)=>{let n=t.append("g"),i=0;for(let a of e){let s=a.textColor?a.textColor:"#444444",l=a.lineColor?a.lineColor:"#444444",u=a.offsetX?parseInt(a.offsetX):0,h=a.offsetY?parseInt(a.offsetY):0,f="";if(i===0){let p=n.append("line");p.attr("x1",a.startPoint.x),p.attr("y1",a.startPoint.y),p.attr("x2",a.endPoint.x),p.attr("y2",a.endPoint.y),p.attr("stroke-width","1"),p.attr("stroke",l),p.style("fill","none"),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)"),i=-1}else{let p=n.append("path");p.attr("fill","none").attr("stroke-width","1").attr("stroke",l).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",a.startPoint.x).replaceAll("starty",a.startPoint.y).replaceAll("controlx",a.startPoint.x+(a.endPoint.x-a.startPoint.x)/2-(a.endPoint.x-a.startPoint.x)/4).replaceAll("controly",a.startPoint.y+(a.endPoint.y-a.startPoint.y)/2).replaceAll("stopx",a.endPoint.x).replaceAll("stopy",a.endPoint.y)),a.type!=="rel_b"&&p.attr("marker-end","url("+f+"#arrowhead)"),(a.type==="birel"||a.type==="rel_b")&&p.attr("marker-start","url("+f+"#arrowend)")}let d=r.messageFont();Cu(r)(a.label.text,n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+h,a.label.width,a.label.height,{fill:s},d),a.techn&&a.techn.text!==""&&(d=r.messageFont(),Cu(r)("["+a.techn.text+"]",n,Math.min(a.startPoint.x,a.endPoint.x)+Math.abs(a.endPoint.x-a.startPoint.x)/2+u,Math.min(a.startPoint.y,a.endPoint.y)+Math.abs(a.endPoint.y-a.startPoint.y)/2+r.messageFontSize+5+h,Math.max(a.label.width,a.techn.width),a.techn.height,{fill:s,"font-style":"italic"},d))}},"drawRels"),TSe=o(function(t,e,r){let n=t.append("g"),i=e.bgColor?e.bgColor:"none",a=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let u={x:e.x,y:e.y,fill:i,stroke:a,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};r9(n,u);let h=r.boundaryFont();h.fontWeight="bold",h.fontSize=h.fontSize+2,h.fontColor=s,Cu(r)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},h),e.type&&e.type.text!==""&&(h=r.boundaryFont(),h.fontColor=s,Cu(r)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},h)),e.descr&&e.descr.text!==""&&(h=r.boundaryFont(),h.fontSize=h.fontSize-2,h.fontColor=s,Cu(r)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},h))},"drawBoundary"),wSe=o(function(t,e,r){let n=e.bgColor?e.bgColor:r[e.typeC4Shape.text+"_bg_color"],i=e.borderColor?e.borderColor:r[e.typeC4Shape.text+"_border_color"],a=e.fontColor?e.fontColor:"#FFFFFF",s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":s="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII=";break}let l=t.append("g");l.attr("class","person-man");let u=Al();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":u.x=e.x,u.y=e.y,u.fill=n,u.width=e.width,u.height=e.height,u.stroke=i,u.rx=2.5,u.ry=2.5,u.attrs={"stroke-width":.5},r9(l,u);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":l.append("path").attr("fill",n).attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),l.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",i).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2));break}let h=RSe(r,e.typeC4Shape.text);switch(l.append("text").attr("fill",a).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":ZY(l,48,48,e.x+e.width/2-24,e.y+e.image.Y,s);break}let f=r[e.typeC4Shape.text+"Font"]();return f.fontWeight="bold",f.fontSize=f.fontSize+2,f.fontColor=a,Cu(r)(e.label.text,l,e.x,e.y+e.label.Y,e.width,e.height,{fill:a},f),f=r[e.typeC4Shape.text+"Font"](),f.fontColor=a,e.techn&&e.techn?.text!==""?Cu(r)(e.techn.text,l,e.x,e.y+e.techn.Y,e.width,e.height,{fill:a,"font-style":"italic"},f):e.type&&e.type.text!==""&&Cu(r)(e.type.text,l,e.x,e.y+e.type.Y,e.width,e.height,{fill:a,"font-style":"italic"},f),e.descr&&e.descr.text!==""&&(f=r.personFont(),f.fontColor=a,Cu(r)(e.descr.text,l,e.x,e.y+e.descr.Y,e.width,e.height,{fill:a},f)),e.height},"drawC4Shape"),kSe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),ESe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),SSe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),CSe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),ASe=o(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),_Se=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),DSe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),LSe=o(function(t){let r=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);r.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),r.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),RSe=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),Cu=function(){function t(i,a,s,l,u,h,f){let d=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("text-anchor","middle").text(i);n(d,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d){let{fontSize:p,fontFamily:m,fontWeight:g}=d,y=i.split(Ze.lineBreakRegex);for(let v=0;v{"use strict";NSe=typeof global=="object"&&global&&global.Object===Object&&global,sT=NSe});var MSe,ISe,hi,Mo=N(()=>{"use strict";n9();MSe=typeof self=="object"&&self&&self.Object===Object&&self,ISe=sT||MSe||Function("return this")(),hi=ISe});var OSe,ea,Md=N(()=>{"use strict";Mo();OSe=hi.Symbol,ea=OSe});function FSe(t){var e=PSe.call(t,r2),r=t[r2];try{t[r2]=void 0;var n=!0}catch{}var i=BSe.call(t);return n&&(e?t[r2]=r:delete t[r2]),i}var eX,PSe,BSe,r2,tX,rX=N(()=>{"use strict";Md();eX=Object.prototype,PSe=eX.hasOwnProperty,BSe=eX.toString,r2=ea?ea.toStringTag:void 0;o(FSe,"getRawTag");tX=FSe});function GSe(t){return zSe.call(t)}var $Se,zSe,nX,iX=N(()=>{"use strict";$Se=Object.prototype,zSe=$Se.toString;o(GSe,"objectToString");nX=GSe});function HSe(t){return t==null?t===void 0?USe:VSe:aX&&aX in Object(t)?tX(t):nX(t)}var VSe,USe,aX,fa,Au=N(()=>{"use strict";Md();rX();iX();VSe="[object Null]",USe="[object Undefined]",aX=ea?ea.toStringTag:void 0;o(HSe,"baseGetTag");fa=HSe});function WSe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}var bn,no=N(()=>{"use strict";o(WSe,"isObject");bn=WSe});function KSe(t){if(!bn(t))return!1;var e=fa(t);return e==YSe||e==XSe||e==qSe||e==jSe}var qSe,YSe,XSe,jSe,Ai,n2=N(()=>{"use strict";Au();no();qSe="[object AsyncFunction]",YSe="[object Function]",XSe="[object GeneratorFunction]",jSe="[object Proxy]";o(KSe,"isFunction");Ai=KSe});var QSe,oT,sX=N(()=>{"use strict";Mo();QSe=hi["__core-js_shared__"],oT=QSe});function ZSe(t){return!!oX&&oX in t}var oX,lX,cX=N(()=>{"use strict";sX();oX=function(){var t=/[^.]+$/.exec(oT&&oT.keys&&oT.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();o(ZSe,"isMasked");lX=ZSe});function t6e(t){if(t!=null){try{return e6e.call(t)}catch{}try{return t+""}catch{}}return""}var JSe,e6e,_u,i9=N(()=>{"use strict";JSe=Function.prototype,e6e=JSe.toString;o(t6e,"toSource");_u=t6e});function c6e(t){if(!bn(t)||lX(t))return!1;var e=Ai(t)?l6e:n6e;return e.test(_u(t))}var r6e,n6e,i6e,a6e,s6e,o6e,l6e,uX,hX=N(()=>{"use strict";n2();cX();no();i9();r6e=/[\\^$.*+?()[\]{}|]/g,n6e=/^\[object .+?Constructor\]$/,i6e=Function.prototype,a6e=Object.prototype,s6e=i6e.toString,o6e=a6e.hasOwnProperty,l6e=RegExp("^"+s6e.call(o6e).replace(r6e,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");o(c6e,"baseIsNative");uX=c6e});function u6e(t,e){return t?.[e]}var fX,dX=N(()=>{"use strict";o(u6e,"getValue");fX=u6e});function h6e(t,e){var r=fX(t,e);return uX(r)?r:void 0}var Ls,Ph=N(()=>{"use strict";hX();dX();o(h6e,"getNative");Ls=h6e});var f6e,Du,i2=N(()=>{"use strict";Ph();f6e=Ls(Object,"create"),Du=f6e});function d6e(){this.__data__=Du?Du(null):{},this.size=0}var pX,mX=N(()=>{"use strict";i2();o(d6e,"hashClear");pX=d6e});function p6e(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}var gX,yX=N(()=>{"use strict";o(p6e,"hashDelete");gX=p6e});function v6e(t){var e=this.__data__;if(Du){var r=e[t];return r===m6e?void 0:r}return y6e.call(e,t)?e[t]:void 0}var m6e,g6e,y6e,vX,xX=N(()=>{"use strict";i2();m6e="__lodash_hash_undefined__",g6e=Object.prototype,y6e=g6e.hasOwnProperty;o(v6e,"hashGet");vX=v6e});function T6e(t){var e=this.__data__;return Du?e[t]!==void 0:b6e.call(e,t)}var x6e,b6e,bX,TX=N(()=>{"use strict";i2();x6e=Object.prototype,b6e=x6e.hasOwnProperty;o(T6e,"hashHas");bX=T6e});function k6e(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Du&&e===void 0?w6e:e,this}var w6e,wX,kX=N(()=>{"use strict";i2();w6e="__lodash_hash_undefined__";o(k6e,"hashSet");wX=k6e});function J0(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";mX();yX();xX();TX();kX();o(J0,"Hash");J0.prototype.clear=pX;J0.prototype.delete=gX;J0.prototype.get=vX;J0.prototype.has=bX;J0.prototype.set=wX;a9=J0});function E6e(){this.__data__=[],this.size=0}var SX,CX=N(()=>{"use strict";o(E6e,"listCacheClear");SX=E6e});function S6e(t,e){return t===e||t!==t&&e!==e}var Io,Id=N(()=>{"use strict";o(S6e,"eq");Io=S6e});function C6e(t,e){for(var r=t.length;r--;)if(Io(t[r][0],e))return r;return-1}var Bh,a2=N(()=>{"use strict";Id();o(C6e,"assocIndexOf");Bh=C6e});function D6e(t){var e=this.__data__,r=Bh(e,t);if(r<0)return!1;var n=e.length-1;return r==n?e.pop():_6e.call(e,r,1),--this.size,!0}var A6e,_6e,AX,_X=N(()=>{"use strict";a2();A6e=Array.prototype,_6e=A6e.splice;o(D6e,"listCacheDelete");AX=D6e});function L6e(t){var e=this.__data__,r=Bh(e,t);return r<0?void 0:e[r][1]}var DX,LX=N(()=>{"use strict";a2();o(L6e,"listCacheGet");DX=L6e});function R6e(t){return Bh(this.__data__,t)>-1}var RX,NX=N(()=>{"use strict";a2();o(R6e,"listCacheHas");RX=R6e});function N6e(t,e){var r=this.__data__,n=Bh(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}var MX,IX=N(()=>{"use strict";a2();o(N6e,"listCacheSet");MX=N6e});function em(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";CX();_X();LX();NX();IX();o(em,"ListCache");em.prototype.clear=SX;em.prototype.delete=AX;em.prototype.get=DX;em.prototype.has=RX;em.prototype.set=MX;Fh=em});var M6e,$h,lT=N(()=>{"use strict";Ph();Mo();M6e=Ls(hi,"Map"),$h=M6e});function I6e(){this.size=0,this.__data__={hash:new a9,map:new($h||Fh),string:new a9}}var OX,PX=N(()=>{"use strict";EX();s2();lT();o(I6e,"mapCacheClear");OX=I6e});function O6e(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}var BX,FX=N(()=>{"use strict";o(O6e,"isKeyable");BX=O6e});function P6e(t,e){var r=t.__data__;return BX(e)?r[typeof e=="string"?"string":"hash"]:r.map}var zh,o2=N(()=>{"use strict";FX();o(P6e,"getMapData");zh=P6e});function B6e(t){var e=zh(this,t).delete(t);return this.size-=e?1:0,e}var $X,zX=N(()=>{"use strict";o2();o(B6e,"mapCacheDelete");$X=B6e});function F6e(t){return zh(this,t).get(t)}var GX,VX=N(()=>{"use strict";o2();o(F6e,"mapCacheGet");GX=F6e});function $6e(t){return zh(this,t).has(t)}var UX,HX=N(()=>{"use strict";o2();o($6e,"mapCacheHas");UX=$6e});function z6e(t,e){var r=zh(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this}var WX,qX=N(()=>{"use strict";o2();o(z6e,"mapCacheSet");WX=z6e});function tm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{"use strict";PX();zX();VX();HX();qX();o(tm,"MapCache");tm.prototype.clear=OX;tm.prototype.delete=$X;tm.prototype.get=GX;tm.prototype.has=UX;tm.prototype.set=WX;Od=tm});function s9(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(G6e);var r=o(function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=t.apply(this,n);return r.cache=a.set(i,s)||a,s},"memoized");return r.cache=new(s9.Cache||Od),r}var G6e,rm,o9=N(()=>{"use strict";cT();G6e="Expected a function";o(s9,"memoize");s9.Cache=Od;rm=s9});function V6e(){this.__data__=new Fh,this.size=0}var YX,XX=N(()=>{"use strict";s2();o(V6e,"stackClear");YX=V6e});function U6e(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}var jX,KX=N(()=>{"use strict";o(U6e,"stackDelete");jX=U6e});function H6e(t){return this.__data__.get(t)}var QX,ZX=N(()=>{"use strict";o(H6e,"stackGet");QX=H6e});function W6e(t){return this.__data__.has(t)}var JX,ej=N(()=>{"use strict";o(W6e,"stackHas");JX=W6e});function Y6e(t,e){var r=this.__data__;if(r instanceof Fh){var n=r.__data__;if(!$h||n.length{"use strict";s2();lT();cT();q6e=200;o(Y6e,"stackSet");tj=Y6e});function nm(t){var e=this.__data__=new Fh(t);this.size=e.size}var dc,l2=N(()=>{"use strict";s2();XX();KX();ZX();ej();rj();o(nm,"Stack");nm.prototype.clear=YX;nm.prototype.delete=jX;nm.prototype.get=QX;nm.prototype.has=JX;nm.prototype.set=tj;dc=nm});var X6e,im,l9=N(()=>{"use strict";Ph();X6e=function(){try{var t=Ls(Object,"defineProperty");return t({},"",{}),t}catch{}}(),im=X6e});function j6e(t,e,r){e=="__proto__"&&im?im(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}var pc,am=N(()=>{"use strict";l9();o(j6e,"baseAssignValue");pc=j6e});function K6e(t,e,r){(r!==void 0&&!Io(t[e],r)||r===void 0&&!(e in t))&&pc(t,e,r)}var c2,c9=N(()=>{"use strict";am();Id();o(K6e,"assignMergeValue");c2=K6e});function Q6e(t){return function(e,r,n){for(var i=-1,a=Object(e),s=n(e),l=s.length;l--;){var u=s[t?l:++i];if(r(a[u],u,a)===!1)break}return e}}var nj,ij=N(()=>{"use strict";o(Q6e,"createBaseFor");nj=Q6e});var Z6e,sm,uT=N(()=>{"use strict";ij();Z6e=nj(),sm=Z6e});function eCe(t,e){if(e)return t.slice();var r=t.length,n=oj?oj(r):new t.constructor(r);return t.copy(n),n}var lj,aj,J6e,sj,oj,hT,u9=N(()=>{"use strict";Mo();lj=typeof exports=="object"&&exports&&!exports.nodeType&&exports,aj=lj&&typeof module=="object"&&module&&!module.nodeType&&module,J6e=aj&&aj.exports===lj,sj=J6e?hi.Buffer:void 0,oj=sj?sj.allocUnsafe:void 0;o(eCe,"cloneBuffer");hT=eCe});var tCe,om,h9=N(()=>{"use strict";Mo();tCe=hi.Uint8Array,om=tCe});function rCe(t){var e=new t.constructor(t.byteLength);return new om(e).set(new om(t)),e}var lm,fT=N(()=>{"use strict";h9();o(rCe,"cloneArrayBuffer");lm=rCe});function nCe(t,e){var r=e?lm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}var dT,f9=N(()=>{"use strict";fT();o(nCe,"cloneTypedArray");dT=nCe});function iCe(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";o(iCe,"copyArray");pT=iCe});var cj,aCe,uj,hj=N(()=>{"use strict";no();cj=Object.create,aCe=function(){function t(){}return o(t,"object"),function(e){if(!bn(e))return{};if(cj)return cj(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}(),uj=aCe});function sCe(t,e){return function(r){return t(e(r))}}var mT,p9=N(()=>{"use strict";o(sCe,"overArg");mT=sCe});var oCe,cm,gT=N(()=>{"use strict";p9();oCe=mT(Object.getPrototypeOf,Object),cm=oCe});function cCe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||lCe;return t===r}var lCe,mc,um=N(()=>{"use strict";lCe=Object.prototype;o(cCe,"isPrototype");mc=cCe});function uCe(t){return typeof t.constructor=="function"&&!mc(t)?uj(cm(t)):{}}var yT,m9=N(()=>{"use strict";hj();gT();um();o(uCe,"initCloneObject");yT=uCe});function hCe(t){return t!=null&&typeof t=="object"}var ii,Oo=N(()=>{"use strict";o(hCe,"isObjectLike");ii=hCe});function dCe(t){return ii(t)&&fa(t)==fCe}var fCe,g9,fj=N(()=>{"use strict";Au();Oo();fCe="[object Arguments]";o(dCe,"baseIsArguments");g9=dCe});var dj,pCe,mCe,gCe,Dl,hm=N(()=>{"use strict";fj();Oo();dj=Object.prototype,pCe=dj.hasOwnProperty,mCe=dj.propertyIsEnumerable,gCe=g9(function(){return arguments}())?g9:function(t){return ii(t)&&pCe.call(t,"callee")&&!mCe.call(t,"callee")},Dl=gCe});var yCe,Pt,Wn=N(()=>{"use strict";yCe=Array.isArray,Pt=yCe});function xCe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=vCe}var vCe,fm,vT=N(()=>{"use strict";vCe=9007199254740991;o(xCe,"isLength");fm=xCe});function bCe(t){return t!=null&&fm(t.length)&&!Ai(t)}var fi,Po=N(()=>{"use strict";n2();vT();o(bCe,"isArrayLike");fi=bCe});function TCe(t){return ii(t)&&fi(t)}var Pd,xT=N(()=>{"use strict";Po();Oo();o(TCe,"isArrayLikeObject");Pd=TCe});function wCe(){return!1}var pj,mj=N(()=>{"use strict";o(wCe,"stubFalse");pj=wCe});var vj,gj,kCe,yj,ECe,SCe,Ll,dm=N(()=>{"use strict";Mo();mj();vj=typeof exports=="object"&&exports&&!exports.nodeType&&exports,gj=vj&&typeof module=="object"&&module&&!module.nodeType&&module,kCe=gj&&gj.exports===vj,yj=kCe?hi.Buffer:void 0,ECe=yj?yj.isBuffer:void 0,SCe=ECe||pj,Ll=SCe});function RCe(t){if(!ii(t)||fa(t)!=CCe)return!1;var e=cm(t);if(e===null)return!0;var r=DCe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&xj.call(r)==LCe}var CCe,ACe,_Ce,xj,DCe,LCe,bj,Tj=N(()=>{"use strict";Au();gT();Oo();CCe="[object Object]",ACe=Function.prototype,_Ce=Object.prototype,xj=ACe.toString,DCe=_Ce.hasOwnProperty,LCe=xj.call(Object);o(RCe,"isPlainObject");bj=RCe});function r7e(t){return ii(t)&&fm(t.length)&&!!Fn[fa(t)]}var NCe,MCe,ICe,OCe,PCe,BCe,FCe,$Ce,zCe,GCe,VCe,UCe,HCe,WCe,qCe,YCe,XCe,jCe,KCe,QCe,ZCe,JCe,e7e,t7e,Fn,wj,kj=N(()=>{"use strict";Au();vT();Oo();NCe="[object Arguments]",MCe="[object Array]",ICe="[object Boolean]",OCe="[object Date]",PCe="[object Error]",BCe="[object Function]",FCe="[object Map]",$Ce="[object Number]",zCe="[object Object]",GCe="[object RegExp]",VCe="[object Set]",UCe="[object String]",HCe="[object WeakMap]",WCe="[object ArrayBuffer]",qCe="[object DataView]",YCe="[object Float32Array]",XCe="[object Float64Array]",jCe="[object Int8Array]",KCe="[object Int16Array]",QCe="[object Int32Array]",ZCe="[object Uint8Array]",JCe="[object Uint8ClampedArray]",e7e="[object Uint16Array]",t7e="[object Uint32Array]",Fn={};Fn[YCe]=Fn[XCe]=Fn[jCe]=Fn[KCe]=Fn[QCe]=Fn[ZCe]=Fn[JCe]=Fn[e7e]=Fn[t7e]=!0;Fn[NCe]=Fn[MCe]=Fn[WCe]=Fn[ICe]=Fn[qCe]=Fn[OCe]=Fn[PCe]=Fn[BCe]=Fn[FCe]=Fn[$Ce]=Fn[zCe]=Fn[GCe]=Fn[VCe]=Fn[UCe]=Fn[HCe]=!1;o(r7e,"baseIsTypedArray");wj=r7e});function n7e(t){return function(e){return t(e)}}var Bo,Bd=N(()=>{"use strict";o(n7e,"baseUnary");Bo=n7e});var Ej,u2,i7e,y9,a7e,Fo,h2=N(()=>{"use strict";n9();Ej=typeof exports=="object"&&exports&&!exports.nodeType&&exports,u2=Ej&&typeof module=="object"&&module&&!module.nodeType&&module,i7e=u2&&u2.exports===Ej,y9=i7e&&sT.process,a7e=function(){try{var t=u2&&u2.require&&u2.require("util").types;return t||y9&&y9.binding&&y9.binding("util")}catch{}}(),Fo=a7e});var Sj,s7e,Gh,f2=N(()=>{"use strict";kj();Bd();h2();Sj=Fo&&Fo.isTypedArray,s7e=Sj?Bo(Sj):wj,Gh=s7e});function o7e(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}var d2,v9=N(()=>{"use strict";o(o7e,"safeGet");d2=o7e});function u7e(t,e,r){var n=t[e];(!(c7e.call(t,e)&&Io(n,r))||r===void 0&&!(e in t))&&pc(t,e,r)}var l7e,c7e,gc,pm=N(()=>{"use strict";am();Id();l7e=Object.prototype,c7e=l7e.hasOwnProperty;o(u7e,"assignValue");gc=u7e});function h7e(t,e,r,n){var i=!r;r||(r={});for(var a=-1,s=e.length;++a{"use strict";pm();am();o(h7e,"copyObject");$o=h7e});function f7e(t,e){for(var r=-1,n=Array(t);++r{"use strict";o(f7e,"baseTimes");Cj=f7e});function m7e(t,e){var r=typeof t;return e=e??d7e,!!e&&(r=="number"||r!="symbol"&&p7e.test(t))&&t>-1&&t%1==0&&t{"use strict";d7e=9007199254740991,p7e=/^(?:0|[1-9]\d*)$/;o(m7e,"isIndex");Vh=m7e});function v7e(t,e){var r=Pt(t),n=!r&&Dl(t),i=!r&&!n&&Ll(t),a=!r&&!n&&!i&&Gh(t),s=r||n||i||a,l=s?Cj(t.length,String):[],u=l.length;for(var h in t)(e||y7e.call(t,h))&&!(s&&(h=="length"||i&&(h=="offset"||h=="parent")||a&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||Vh(h,u)))&&l.push(h);return l}var g7e,y7e,bT,x9=N(()=>{"use strict";Aj();hm();Wn();dm();p2();f2();g7e=Object.prototype,y7e=g7e.hasOwnProperty;o(v7e,"arrayLikeKeys");bT=v7e});function x7e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}var _j,Dj=N(()=>{"use strict";o(x7e,"nativeKeysIn");_j=x7e});function w7e(t){if(!bn(t))return _j(t);var e=mc(t),r=[];for(var n in t)n=="constructor"&&(e||!T7e.call(t,n))||r.push(n);return r}var b7e,T7e,Lj,Rj=N(()=>{"use strict";no();um();Dj();b7e=Object.prototype,T7e=b7e.hasOwnProperty;o(w7e,"baseKeysIn");Lj=w7e});function k7e(t){return fi(t)?bT(t,!0):Lj(t)}var Rs,Uh=N(()=>{"use strict";x9();Rj();Po();o(k7e,"keysIn");Rs=k7e});function E7e(t){return $o(t,Rs(t))}var Nj,Mj=N(()=>{"use strict";Fd();Uh();o(E7e,"toPlainObject");Nj=E7e});function S7e(t,e,r,n,i,a,s){var l=d2(t,r),u=d2(e,r),h=s.get(u);if(h){c2(t,r,h);return}var f=a?a(l,u,r+"",t,e,s):void 0,d=f===void 0;if(d){var p=Pt(u),m=!p&&Ll(u),g=!p&&!m&&Gh(u);f=u,p||m||g?Pt(l)?f=l:Pd(l)?f=pT(l):m?(d=!1,f=hT(u,!0)):g?(d=!1,f=dT(u,!0)):f=[]:bj(u)||Dl(u)?(f=l,Dl(l)?f=Nj(l):(!bn(l)||Ai(l))&&(f=yT(u))):d=!1}d&&(s.set(u,f),i(f,u,n,a,s),s.delete(u)),c2(t,r,f)}var Ij,Oj=N(()=>{"use strict";c9();u9();f9();d9();m9();hm();Wn();xT();dm();n2();no();Tj();f2();v9();Mj();o(S7e,"baseMergeDeep");Ij=S7e});function Pj(t,e,r,n,i){t!==e&&sm(e,function(a,s){if(i||(i=new dc),bn(a))Ij(t,e,s,r,Pj,n,i);else{var l=n?n(d2(t,s),a,s+"",t,e,i):void 0;l===void 0&&(l=a),c2(t,s,l)}},Rs)}var Bj,Fj=N(()=>{"use strict";l2();c9();uT();Oj();no();Uh();v9();o(Pj,"baseMerge");Bj=Pj});function C7e(t){return t}var ta,Lu=N(()=>{"use strict";o(C7e,"identity");ta=C7e});function A7e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}var $j,zj=N(()=>{"use strict";o(A7e,"apply");$j=A7e});function _7e(t,e,r){return e=Gj(e===void 0?t.length-1:e,0),function(){for(var n=arguments,i=-1,a=Gj(n.length-e,0),s=Array(a);++i{"use strict";zj();Gj=Math.max;o(_7e,"overRest");TT=_7e});function D7e(t){return function(){return t}}var Ns,T9=N(()=>{"use strict";o(D7e,"constant");Ns=D7e});var L7e,Vj,Uj=N(()=>{"use strict";T9();l9();Lu();L7e=im?function(t,e){return im(t,"toString",{configurable:!0,enumerable:!1,value:Ns(e),writable:!0})}:ta,Vj=L7e});function I7e(t){var e=0,r=0;return function(){var n=M7e(),i=N7e-(n-r);if(r=n,i>0){if(++e>=R7e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}var R7e,N7e,M7e,Hj,Wj=N(()=>{"use strict";R7e=800,N7e=16,M7e=Date.now;o(I7e,"shortOut");Hj=I7e});var O7e,wT,w9=N(()=>{"use strict";Uj();Wj();O7e=Hj(Vj),wT=O7e});function P7e(t,e){return wT(TT(t,e,ta),t+"")}var yc,mm=N(()=>{"use strict";Lu();b9();w9();o(P7e,"baseRest");yc=P7e});function B7e(t,e,r){if(!bn(r))return!1;var n=typeof e;return(n=="number"?fi(r)&&Vh(e,r.length):n=="string"&&e in r)?Io(r[e],t):!1}var io,$d=N(()=>{"use strict";Id();Po();p2();no();o(B7e,"isIterateeCall");io=B7e});function F7e(t){return yc(function(e,r){var n=-1,i=r.length,a=i>1?r[i-1]:void 0,s=i>2?r[2]:void 0;for(a=t.length>3&&typeof a=="function"?(i--,a):void 0,s&&io(r[0],r[1],s)&&(a=i<3?void 0:a,i=1),e=Object(e);++n{"use strict";mm();$d();o(F7e,"createAssigner");kT=F7e});var $7e,Hh,E9=N(()=>{"use strict";Fj();k9();$7e=kT(function(t,e,r){Bj(t,e,r)}),Hh=$7e});function A9(t,e){if(!t)return e;let r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return z7e[r]??e}function H7e(t,e){let r=t.trim();if(r)return e.securityLevel!=="loose"?(0,Xj.sanitizeUrl)(r):r}function Qj(t,e){return!t||!e?0:Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function q7e(t){let e,r=0;t.forEach(i=>{r+=Qj(i,e),e=i});let n=r/2;return _9(t,n)}function Y7e(t){return t.length===1?t[0]:q7e(t)}function j7e(t,e,r){let n=structuredClone(r);X.info("our points",n),e!=="start_left"&&e!=="start_right"&&n.reverse();let i=25+t,a=_9(n,i),s=10+t*.5,l=Math.atan2(n[0].y-a.y,n[0].x-a.x),u={x:0,y:0};return e==="start_left"?(u.x=Math.sin(l+Math.PI)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l+Math.PI)*s+(n[0].y+a.y)/2):e==="end_right"?(u.x=Math.sin(l-Math.PI)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l-Math.PI)*s+(n[0].y+a.y)/2-5):e==="end_left"?(u.x=Math.sin(l)*s+(n[0].x+a.x)/2-5,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2-5):(u.x=Math.sin(l)*s+(n[0].x+a.x)/2,u.y=-Math.cos(l)*s+(n[0].y+a.y)/2),u}function D9(t){let e="",r="";for(let n of t)n!==void 0&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}function K7e(t){let e="",r="0123456789abcdef",n=r.length;for(let i=0;i{"use strict";Xj=Aa(Z0(),1);fr();pr();b7();yt();rd();g0();o9();E9();Q4();C9="\u200B",z7e={curveBasis:No,curveBasisClosed:X5,curveBasisOpen:j5,curveBumpX:Gv,curveBumpY:Vv,curveBundle:HD,curveCardinalClosed:WD,curveCardinalOpen:YD,curveCardinal:qv,curveCatmullRomClosed:jD,curveCatmullRomOpen:KD,curveCatmullRom:jv,curveLinear:Su,curveLinearClosed:eT,curveMonotoneX:Kv,curveMonotoneY:Qv,curveNatural:K0,curveStep:Q0,curveStepAfter:Jv,curveStepBefore:Zv},G7e=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,V7e=o(function(t,e){let r=jj(t,/(?:init\b)|(?:initialize\b)/),n={};if(Array.isArray(r)){let s=r.map(l=>l.args);v0(s),n=Un(n,[...s])}else n=r.args;if(!n)return;let i=m0(t,e),a="config";return n[a]!==void 0&&(i==="flowchart-v2"&&(i="flowchart"),n[i]=n[a],delete n[a]),n},"detectInit"),jj=o(function(t,e=null){try{let r=new RegExp(`[%]{2}(?![{]${G7e.source})(?=[}][%]{2}).* -`,"ig");t=t.trim().replace(r,"").replace(/'/gm,'"'),X.debug(`Detecting diagram directive${e!==null?" type:"+e:""} based on the text:${t}`);let n,i=[];for(;(n=td.exec(t))!==null;)if(n.index===td.lastIndex&&td.lastIndex++,n&&!e||e&&n[1]?.match(e)||e&&n[2]?.match(e)){let a=n[1]?n[1]:n[2],s=n[3]?n[3].trim():n[4]?JSON.parse(n[4].trim()):null;i.push({type:a,args:s})}return i.length===0?{type:t,args:null}:i.length===1?i[0]:i}catch(r){return X.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),Kj=o(function(t){return t.replace(td,"")},"removeDirectives"),U7e=o(function(t,e){for(let[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");o(A9,"interpolateToCurve");o(H7e,"formatUrl");W7e=o((t,...e)=>{let r=t.split("."),n=r.length-1,i=r[n],a=window;for(let s=0;s{let r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),_9=o((t,e)=>{let r,n=e;for(let i of t){if(r){let a=Qj(i,r);if(a===0)return r;if(a=1)return{x:i.x,y:i.y};if(s>0&&s<1)return{x:qj((1-s)*r.x+s*i.x,5),y:qj((1-s)*r.y+s*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),X7e=o((t,e,r)=>{X.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());let i=_9(e,25),a=t?10:5,s=Math.atan2(e[0].y-i.y,e[0].x-i.x),l={x:0,y:0};return l.x=Math.sin(s)*a+(e[0].x+i.x)/2,l.y=-Math.cos(s)*a+(e[0].y+i.y)/2,l},"calcCardinalityPosition");o(j7e,"calcTerminalLabelPosition");o(D9,"getStylesFromArray");Yj=0,L9=o(()=>(Yj++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Yj),"generateId");o(K7e,"makeRandomHex");R9=o(t=>K7e(t.length),"random"),Q7e=o(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),Z7e=o(function(t,e){let r=e.text.replace(Ze.lineBreakRegex," "),[,n]=zo(e.fontSize),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.style("text-anchor",e.anchor),i.style("font-family",e.fontFamily),i.style("font-size",n),i.style("font-weight",e.fontWeight),i.attr("fill",e.fill),e.class!==void 0&&i.attr("class",e.class);let a=i.append("tspan");return a.attr("x",e.x+e.textMargin*2),a.attr("fill",e.fill),a.text(r),i},"drawSimpleText"),N9=rm((t,e,r)=>{if(!t||(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
    "},r),Ze.lineBreakRegex.test(t)))return t;let n=t.split(" ").filter(Boolean),i=[],a="";return n.forEach((s,l)=>{let u=ra(`${s} `,r),h=ra(a,r);if(u>e){let{hyphenatedStrings:p,remainingWord:m}=J7e(s,e,"-",r);i.push(a,...p),a=m}else h+u>=e?(i.push(a),a=s):a=[a,s].filter(Boolean).join(" ");l+1===n.length&&i.push(a)}),i.filter(s=>s!=="").join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),J7e=rm((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);let i=[...t],a=[],s="";return i.forEach((l,u)=>{let h=`${s}${l}`;if(ra(h,n)>=e){let d=u+1,p=i.length===d,m=`${h}${r}`;a.push(p?h:m),s=""}else s=h}),{hyphenatedStrings:a,remainingWord:s}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);o(ST,"calculateTextHeight");o(ra,"calculateTextWidth");M9=rm((t,e)=>{let{fontSize:r=12,fontFamily:n="Arial",fontWeight:i=400}=e;if(!t)return{width:0,height:0};let[,a]=zo(r),s=["sans-serif",n],l=t.split(Ze.lineBreakRegex),u=[],h=Ge("body");if(!h.remove)return{width:0,height:0,lineHeight:0};let f=h.append("svg");for(let p of s){let m=0,g={width:0,height:0,lineHeight:0};for(let y of l){let v=Q7e();v.text=y||C9;let x=Z7e(f,v).style("font-size",a).style("font-weight",i).style("font-family",p),b=(x._groups||x)[0][0].getBBox();if(b.width===0&&b.height===0)throw new Error("svg element not in render tree");g.width=Math.round(Math.max(g.width,b.width)),m=Math.round(b.height),g.height+=m,g.lineHeight=Math.round(Math.max(g.lineHeight,m))}u.push(g)}f.remove();let d=isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1;return u[d]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),S9=class{constructor(e=!1,r){this.count=0;this.count=r?r.length:0,this.next=e?()=>this.count++:()=>Date.now()}static{o(this,"InitIDGenerator")}},eAe=o(function(t){return ET=ET||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),ET.innerHTML=t,unescape(ET.textContent)},"entityDecode");o(I9,"isDetailedError");tAe=o((t,e,r,n)=>{if(!n)return;let i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),zo=o(t=>{if(typeof t=="number")return[t,t+"px"];let e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");o($n,"cleanAndMerge");Vt={assignWithDepth:Un,wrapLabel:N9,calculateTextHeight:ST,calculateTextWidth:ra,calculateTextDimensions:M9,cleanAndMerge:$n,detectInit:V7e,detectDirective:jj,isSubstringInArray:U7e,interpolateToCurve:A9,calcLabelPosition:Y7e,calcCardinalityPosition:X7e,calcTerminalLabelPosition:j7e,formatUrl:H7e,getStylesFromArray:D9,generateId:L9,random:R9,runFunc:W7e,entityDecode:eAe,insertTitle:tAe,parseFontSize:zo,InitIDGenerator:S9},Zj=o(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(r){return r.substring(0,r.length-1)}),e=e.replace(/#\w+;/g,function(r){let n=r.substring(1,r.length-1);return/^\+?\d+$/.test(n)?"\uFB02\xB0\xB0"+n+"\xB6\xDF":"\uFB02\xB0"+n+"\xB6\xDF"}),e},"encodeEntities"),na=o(function(t){return t.replace(/fl°°/g,"&#").replace(/fl°/g,"&").replace(/¶ß/g,";")},"decodeEntities"),Wh=o((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");o(zn,"handleUndefinedAttr")});function Rl(t,e,r,n,i){if(!e[t].width)if(r)e[t].text=N9(e[t].text,i,n),e[t].textLines=e[t].text.split(Ze.lineBreakRegex).length,e[t].width=i,e[t].height=ST(e[t].text,n);else{let a=e[t].text.split(Ze.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(let l of a)e[t].width=Math.max(ra(l,n),e[t].width),s=ST(l,n),e[t].height=e[t].height+s}}function nK(t,e,r,n,i){let a=new DT(i);a.data.widthLimit=r.data.widthLimit/Math.min(O9,n.length);for(let[s,l]of n.entries()){let u=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=u,u=l.image.Y+l.image.height);let h=l.wrap&&Ut.wrap,f=CT(Ut);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Rl("label",l,h,f,a.data.widthLimit),l.label.Y=u+8,u=l.label.Y+l.label.height,l.type&&l.type.text!==""){l.type.text="["+l.type.text+"]";let g=CT(Ut);Rl("type",l,h,g,a.data.widthLimit),l.type.Y=u+5,u=l.type.Y+l.type.height}if(l.descr&&l.descr.text!==""){let g=CT(Ut);g.fontSize=g.fontSize-2,Rl("descr",l,h,g,a.data.widthLimit),l.descr.Y=u+20,u=l.descr.Y+l.descr.height}if(s==0||s%O9===0){let g=r.data.startx+Ut.diagramMarginX,y=r.data.stopy+Ut.diagramMarginY+u;a.setData(g,g,y,y)}else{let g=a.data.stopx!==a.data.startx?a.data.stopx+Ut.diagramMarginX:a.data.startx,y=a.data.starty;a.setData(g,g,y,y)}a.name=l.alias;let d=i.db.getC4ShapeArray(l.alias),p=i.db.getC4ShapeKeys(l.alias);p.length>0&&rK(a,t,d,p),e=l.alias;let m=i.db.getBoundaries(e);m.length>0&&nK(t,e,a,m,i),l.alias!=="global"&&tK(t,l,a),r.data.stopy=Math.max(a.data.stopy+Ut.c4ShapeMargin,r.data.stopy),r.data.stopx=Math.max(a.data.stopx+Ut.c4ShapeMargin,r.data.stopx),AT=Math.max(AT,r.data.stopx),_T=Math.max(_T,r.data.stopy)}}var AT,_T,eK,O9,Ut,DT,P9,m2,CT,rAe,tK,rK,Ms,Jj,nAe,iAe,aAe,B9,iK=N(()=>{"use strict";fr();JY();yt();a7();pr();LA();Gt();g0();er();xi();AT=0,_T=0,eK=4,O9=2;Ry.yy=sv;Ut={},DT=class{static{o(this,"Bounds")}constructor(e){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,P9(e.db.getConfig())}setData(e,r,n,i){this.nextData.startx=this.data.startx=e,this.nextData.stopx=this.data.stopx=r,this.nextData.starty=this.data.starty=n,this.nextData.stopy=this.data.stopy=i}updateVal(e,r,n,i){e[r]===void 0?e[r]=n:e[r]=i(n,e[r])}insert(e){this.nextData.cnt=this.nextData.cnt+1;let r=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+e.margin:this.nextData.stopx+e.margin*2,n=r+e.width,i=this.nextData.starty+e.margin*2,a=i+e.height;(r>=this.data.widthLimit||n>=this.data.widthLimit||this.nextData.cnt>eK)&&(r=this.nextData.startx+e.margin+Ut.nextLinePaddingX,i=this.nextData.stopy+e.margin*2,this.nextData.stopx=n=r+e.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=a=i+e.height,this.nextData.cnt=1),e.x=r,e.y=i,this.updateVal(this.data,"startx",r,Math.min),this.updateVal(this.data,"starty",i,Math.min),this.updateVal(this.data,"stopx",n,Math.max),this.updateVal(this.data,"stopy",a,Math.max),this.updateVal(this.nextData,"startx",r,Math.min),this.updateVal(this.nextData,"starty",i,Math.min),this.updateVal(this.nextData,"stopx",n,Math.max),this.updateVal(this.nextData,"stopy",a,Math.max)}init(e){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},P9(e.db.getConfig())}bumpLastMargin(e){this.data.stopx+=e,this.data.stopy+=e}},P9=o(function(t){Un(Ut,t),t.fontFamily&&(Ut.personFontFamily=Ut.systemFontFamily=Ut.messageFontFamily=t.fontFamily),t.fontSize&&(Ut.personFontSize=Ut.systemFontSize=Ut.messageFontSize=t.fontSize),t.fontWeight&&(Ut.personFontWeight=Ut.systemFontWeight=Ut.messageFontWeight=t.fontWeight)},"setConf"),m2=o((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),CT=o(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),rAe=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");o(Rl,"calcC4ShapeTextWH");tK=o(function(t,e,r){e.x=r.data.startx,e.y=r.data.starty,e.width=r.data.stopx-r.data.startx,e.height=r.data.stopy-r.data.starty,e.label.y=Ut.c4ShapeMargin-35;let n=e.wrap&&Ut.wrap,i=CT(Ut);i.fontSize=i.fontSize+2,i.fontWeight="bold";let a=ra(e.label.text,i);Rl("label",e,n,i,a),_l.drawBoundary(t,e,Ut)},"drawBoundary"),rK=o(function(t,e,r,n){let i=0;for(let a of n){i=0;let s=r[a],l=m2(Ut,s.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,s.typeC4Shape.width=ra("\xAB"+s.typeC4Shape.text+"\xBB",l),s.typeC4Shape.height=l.fontSize+2,s.typeC4Shape.Y=Ut.c4ShapePadding,i=s.typeC4Shape.Y+s.typeC4Shape.height-4,s.image={width:0,height:0,Y:0},s.typeC4Shape.text){case"person":case"external_person":s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height;break}s.sprite&&(s.image.width=48,s.image.height=48,s.image.Y=i,i=s.image.Y+s.image.height);let u=s.wrap&&Ut.wrap,h=Ut.width-Ut.c4ShapePadding*2,f=m2(Ut,s.typeC4Shape.text);if(f.fontSize=f.fontSize+2,f.fontWeight="bold",Rl("label",s,u,f,h),s.label.Y=i+8,i=s.label.Y+s.label.height,s.type&&s.type.text!==""){s.type.text="["+s.type.text+"]";let m=m2(Ut,s.typeC4Shape.text);Rl("type",s,u,m,h),s.type.Y=i+5,i=s.type.Y+s.type.height}else if(s.techn&&s.techn.text!==""){s.techn.text="["+s.techn.text+"]";let m=m2(Ut,s.techn.text);Rl("techn",s,u,m,h),s.techn.Y=i+5,i=s.techn.Y+s.techn.height}let d=i,p=s.label.width;if(s.descr&&s.descr.text!==""){let m=m2(Ut,s.typeC4Shape.text);Rl("descr",s,u,m,h),s.descr.Y=i+20,i=s.descr.Y+s.descr.height,p=Math.max(s.label.width,s.descr.width),d=i-s.descr.textLines*5}p=p+Ut.c4ShapePadding,s.width=Math.max(s.width||Ut.width,p,Ut.width),s.height=Math.max(s.height||Ut.height,d,Ut.height),s.margin=s.margin||Ut.c4ShapeMargin,t.insert(s),_l.drawC4Shape(e,s,Ut)}t.bumpLastMargin(Ut.c4ShapeMargin)},"drawC4ShapeArray"),Ms=class{static{o(this,"Point")}constructor(e,r){this.x=e,this.y=r}},Jj=o(function(t,e){let r=t.x,n=t.y,i=e.x,a=e.y,s=r+t.width/2,l=n+t.height/2,u=Math.abs(r-i),h=Math.abs(n-a),f=h/u,d=t.height/t.width,p=null;return n==a&&ri?p=new Ms(r,l):r==i&&na&&(p=new Ms(s,n)),r>i&&n=f?p=new Ms(r,l+f*t.width/2):p=new Ms(s-u/h*t.height/2,n+t.height):r=f?p=new Ms(r+t.width,l+f*t.width/2):p=new Ms(s+u/h*t.height/2,n+t.height):ra?d>=f?p=new Ms(r+t.width,l-f*t.width/2):p=new Ms(s+t.height/2*u/h,n):r>i&&n>a&&(d>=f?p=new Ms(r,l-t.width/2*f):p=new Ms(s-t.height/2*u/h,n)),p},"getIntersectPoint"),nAe=o(function(t,e){let r={x:0,y:0};r.x=e.x+e.width/2,r.y=e.y+e.height/2;let n=Jj(t,r);r.x=t.x+t.width/2,r.y=t.y+t.height/2;let i=Jj(e,r);return{startPoint:n,endPoint:i}},"getIntersectPoints"),iAe=o(function(t,e,r,n){let i=0;for(let a of e){i=i+1;let s=a.wrap&&Ut.wrap,l=rAe(Ut);n.db.getC4Type()==="C4Dynamic"&&(a.label.text=i+": "+a.label.text);let h=ra(a.label.text,l);Rl("label",a,s,l,h),a.techn&&a.techn.text!==""&&(h=ra(a.techn.text,l),Rl("techn",a,s,l,h)),a.descr&&a.descr.text!==""&&(h=ra(a.descr.text,l),Rl("descr",a,s,l,h));let f=r(a.from),d=r(a.to),p=nAe(f,d);a.startPoint=p.startPoint,a.endPoint=p.endPoint}_l.drawRels(t,e,Ut)},"drawRels");o(nK,"drawInsideBoundary");aAe=o(function(t,e,r,n){Ut=me().c4;let i=me().securityLevel,a;i==="sandbox"&&(a=Ge("#i"+e));let s=i==="sandbox"?Ge(a.nodes()[0].contentDocument.body):Ge("body"),l=n.db;n.db.setWrap(Ut.wrap),eK=l.getC4ShapeInRow(),O9=l.getC4BoundaryInRow(),X.debug(`C:${JSON.stringify(Ut,null,2)}`);let u=i==="sandbox"?s.select(`[id="${e}"]`):Ge(`[id="${e}"]`);_l.insertComputerIcon(u),_l.insertDatabaseIcon(u),_l.insertClockIcon(u);let h=new DT(n);h.setData(Ut.diagramMarginX,Ut.diagramMarginX,Ut.diagramMarginY,Ut.diagramMarginY),h.data.widthLimit=screen.availWidth,AT=Ut.diagramMarginX,_T=Ut.diagramMarginY;let f=n.db.getTitle(),d=n.db.getBoundaries("");nK(u,"",h,d,n),_l.insertArrowHead(u),_l.insertArrowEnd(u),_l.insertArrowCrossHead(u),_l.insertArrowFilledHead(u),iAe(u,n.db.getRels(),n.db.getC4Shape,n),h.data.stopx=AT,h.data.stopy=_T;let p=h.data,g=p.stopy-p.starty+2*Ut.diagramMarginY,v=p.stopx-p.startx+2*Ut.diagramMarginX;f&&u.append("text").text(f).attr("x",(p.stopx-p.startx)/2-4*Ut.diagramMarginX).attr("y",p.starty+Ut.diagramMarginY),fn(u,g,v,Ut.useMaxWidth);let x=f?60:0;u.attr("viewBox",p.startx-Ut.diagramMarginX+" -"+(Ut.diagramMarginY+x)+" "+v+" "+(g+x)),X.debug("models:",p)},"draw"),B9={drawPersonOrSystemArray:rK,drawBoundary:tK,setConf:P9,draw:aAe}});var sAe,aK,sK=N(()=>{"use strict";sAe=o(t=>`.person { - stroke: ${t.personBorder}; - fill: ${t.personBkg}; - } -`,"getStyles"),aK=sAe});var oK={};ur(oK,{diagram:()=>oAe});var oAe,lK=N(()=>{"use strict";a7();LA();iK();sK();oAe={parser:G$,db:sv,renderer:B9,styles:aK,init:o(({c4:t,wrap:e})=>{B9.setConf(t),sv.setWrap(e)},"init")}});function CK(t){return typeof t>"u"||t===null}function hAe(t){return typeof t=="object"&&t!==null}function fAe(t){return Array.isArray(t)?t:CK(t)?[]:[t]}function dAe(t,e){var r,n,i,a;if(e)for(a=Object.keys(e),r=0,n=a.length;rl&&(a=" ... ",e=n-l+a.length),r-n>l&&(s=" ...",r=n+l-s.length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+s,pos:n-e+a.length}}function $9(t,e){return Gi.repeat(" ",e-t.length)+t}function wAe(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),typeof e.indent!="number"&&(e.indent=1),typeof e.linesBefore!="number"&&(e.linesBefore=3),typeof e.linesAfter!="number"&&(e.linesAfter=2);for(var r=/\r?\n|\r|\0/g,n=[0],i=[],a,s=-1;a=r.exec(t.buffer);)i.push(a.index),n.push(a.index+a[0].length),t.position<=a.index&&s<0&&(s=n.length-2);s<0&&(s=n.length-1);var l="",u,h,f=Math.min(t.line+e.linesAfter,i.length).toString().length,d=e.maxLength-(e.indent+f+3);for(u=1;u<=e.linesBefore&&!(s-u<0);u++)h=F9(t.buffer,n[s-u],i[s-u],t.position-(n[s]-n[s-u]),d),l=Gi.repeat(" ",e.indent)+$9((t.line-u+1).toString(),f)+" | "+h.str+` -`+l;for(h=F9(t.buffer,n[s],i[s],t.position,d),l+=Gi.repeat(" ",e.indent)+$9((t.line+1).toString(),f)+" | "+h.str+` -`,l+=Gi.repeat("-",e.indent+f+3+h.pos)+`^ -`,u=1;u<=e.linesAfter&&!(s+u>=i.length);u++)h=F9(t.buffer,n[s+u],i[s+u],t.position-(n[s]-n[s+u]),d),l+=Gi.repeat(" ",e.indent)+$9((t.line+u+1).toString(),f)+" | "+h.str+` -`;return l.replace(/\n$/,"")}function CAe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(n){e[String(n)]=r})}),e}function AAe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(EAe.indexOf(r)===-1)throw new Is('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=CAe(e.styleAliases||null),SAe.indexOf(this.kind)===-1)throw new Is('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}function hK(t,e){var r=[];return t[e].forEach(function(n){var i=r.length;r.forEach(function(a,s){a.tag===n.tag&&a.kind===n.kind&&a.multi===n.multi&&(i=s)}),r[i]=n}),r}function _Ae(){var t={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}},e,r;function n(i){i.multi?(t.multi[i.kind].push(i),t.multi.fallback.push(i)):t[i.kind][i.tag]=t.fallback[i.tag]=i}for(o(n,"collectType"),e=0,r=arguments.length;e=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:r*parseFloat(e,10)}function JAe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Gi.isNegativeZero(t))return"-0.0";return r=t.toString(10),ZAe.test(r)?r.replace("e",".e"):r}function e8e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Gi.isNegativeZero(t))}function n8e(t){return t===null?!1:DK.exec(t)!==null||LK.exec(t)!==null}function i8e(t){var e,r,n,i,a,s,l,u=0,h=null,f,d,p;if(e=DK.exec(t),e===null&&(e=LK.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],s=+e[5],l=+e[6],e[7]){for(u=e[7].slice(0,3);u.length<3;)u+="0";u=+u}return e[9]&&(f=+e[10],d=+(e[11]||0),h=(f*60+d)*6e4,e[9]==="-"&&(h=-h)),p=new Date(Date.UTC(r,n,i,a,s,l,u)),h&&p.setTime(p.getTime()-h),p}function a8e(t){return t.toISOString()}function o8e(t){return t==="<<"||t===null}function c8e(t){if(t===null)return!1;var e,r,n=0,i=t.length,a=q9;for(r=0;r64)){if(e<0)return!1;n+=6}return n%8===0}function u8e(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=q9,s=0,l=[];for(e=0;e>16&255),l.push(s>>8&255),l.push(s&255)),s=s<<6|a.indexOf(n.charAt(e));return r=i%4*6,r===0?(l.push(s>>16&255),l.push(s>>8&255),l.push(s&255)):r===18?(l.push(s>>10&255),l.push(s>>2&255)):r===12&&l.push(s>>4&255),new Uint8Array(l)}function h8e(t){var e="",r=0,n,i,a=t.length,s=q9;for(n=0;n>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]),r=(r<<8)+t[n];return i=a%3,i===0?(e+=s[r>>18&63],e+=s[r>>12&63],e+=s[r>>6&63],e+=s[r&63]):i===2?(e+=s[r>>10&63],e+=s[r>>4&63],e+=s[r<<2&63],e+=s[64]):i===1&&(e+=s[r>>2&63],e+=s[r<<4&63],e+=s[64],e+=s[64]),e}function f8e(t){return Object.prototype.toString.call(t)==="[object Uint8Array]"}function g8e(t){if(t===null)return!0;var e=[],r,n,i,a,s,l=t;for(r=0,n=l.length;r>10)+55296,(t-65536&1023)+56320)}function O8e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||RK,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function FK(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=kAe(r),new Is(e,r)}function Qt(t,e){throw FK(t,e)}function NT(t,e){t.onWarning&&t.onWarning.call(null,FK(t,e))}function qh(t,e,r,n){var i,a,s,l;if(e1&&(t.result+=Gi.repeat(` -`,e-1))}function P8e(t,e,r){var n,i,a,s,l,u,h,f,d=t.kind,p=t.result,m;if(m=t.input.charCodeAt(t.position),Os(m)||ym(m)||m===35||m===38||m===42||m===33||m===124||m===62||m===39||m===34||m===37||m===64||m===96||(m===63||m===45)&&(i=t.input.charCodeAt(t.position+1),Os(i)||r&&ym(i)))return!1;for(t.kind="scalar",t.result="",a=s=t.position,l=!1;m!==0;){if(m===58){if(i=t.input.charCodeAt(t.position+1),Os(i)||r&&ym(i))break}else if(m===35){if(n=t.input.charCodeAt(t.position-1),Os(n))break}else{if(t.position===t.lineStart&&OT(t)||r&&ym(m))break;if(vc(m))if(u=t.line,h=t.lineStart,f=t.lineIndent,_i(t,!1,-1),t.lineIndent>=e){l=!0,m=t.input.charCodeAt(t.position);continue}else{t.position=s,t.line=u,t.lineStart=h,t.lineIndent=f;break}}l&&(qh(t,a,s,!1),X9(t,t.line-u),a=s=t.position,l=!1),Gd(m)||(s=t.position+1),m=t.input.charCodeAt(++t.position)}return qh(t,a,s,!1),t.result?!0:(t.kind=d,t.result=p,!1)}function B8e(t,e){var r,n,i;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(qh(t,n,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)n=t.position,t.position++,i=t.position;else return!0;else vc(r)?(qh(t,n,i,!0),X9(t,_i(t,!1,e)),n=i=t.position):t.position===t.lineStart&&OT(t)?Qt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Qt(t,"unexpected end of the stream within a single quoted scalar")}function F8e(t,e){var r,n,i,a,s,l;if(l=t.input.charCodeAt(t.position),l!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;(l=t.input.charCodeAt(t.position))!==0;){if(l===34)return qh(t,r,t.position,!0),t.position++,!0;if(l===92){if(qh(t,r,t.position,!0),l=t.input.charCodeAt(++t.position),vc(l))_i(t,!1,e);else if(l<256&&PK[l])t.result+=BK[l],t.position++;else if((s=N8e(l))>0){for(i=s,a=0;i>0;i--)l=t.input.charCodeAt(++t.position),(s=R8e(l))>=0?a=(a<<4)+s:Qt(t,"expected hexadecimal character");t.result+=I8e(a),t.position++}else Qt(t,"unknown escape sequence");r=n=t.position}else vc(l)?(qh(t,r,n,!0),X9(t,_i(t,!1,e)),r=n=t.position):t.position===t.lineStart&&OT(t)?Qt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Qt(t,"unexpected end of the stream within a double quoted scalar")}function $8e(t,e){var r=!0,n,i,a,s=t.tag,l,u=t.anchor,h,f,d,p,m,g=Object.create(null),y,v,x,b;if(b=t.input.charCodeAt(t.position),b===91)f=93,m=!1,l=[];else if(b===123)f=125,m=!0,l={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=l),b=t.input.charCodeAt(++t.position);b!==0;){if(_i(t,!0,e),b=t.input.charCodeAt(t.position),b===f)return t.position++,t.tag=s,t.anchor=u,t.kind=m?"mapping":"sequence",t.result=l,!0;r?b===44&&Qt(t,"expected the node content, but found ','"):Qt(t,"missed comma between flow collection entries"),v=y=x=null,d=p=!1,b===63&&(h=t.input.charCodeAt(t.position+1),Os(h)&&(d=p=!0,t.position++,_i(t,!0,e))),n=t.line,i=t.lineStart,a=t.position,xm(t,e,LT,!1,!0),v=t.tag,y=t.result,_i(t,!0,e),b=t.input.charCodeAt(t.position),(p||t.line===n)&&b===58&&(d=!0,b=t.input.charCodeAt(++t.position),_i(t,!0,e),xm(t,e,LT,!1,!0),x=t.result),m?vm(t,l,g,v,y,x,n,i,a):d?l.push(vm(t,null,g,v,y,x,n,i,a)):l.push(y),_i(t,!0,e),b=t.input.charCodeAt(t.position),b===44?(r=!0,b=t.input.charCodeAt(++t.position)):r=!1}Qt(t,"unexpected end of the stream within a flow collection")}function z8e(t,e){var r,n,i=z9,a=!1,s=!1,l=e,u=0,h=!1,f,d;if(d=t.input.charCodeAt(t.position),d===124)n=!1;else if(d===62)n=!0;else return!1;for(t.kind="scalar",t.result="";d!==0;)if(d=t.input.charCodeAt(++t.position),d===43||d===45)z9===i?i=d===43?fK:A8e:Qt(t,"repeat of a chomping mode identifier");else if((f=M8e(d))>=0)f===0?Qt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):s?Qt(t,"repeat of an indentation width identifier"):(l=e+f-1,s=!0);else break;if(Gd(d)){do d=t.input.charCodeAt(++t.position);while(Gd(d));if(d===35)do d=t.input.charCodeAt(++t.position);while(!vc(d)&&d!==0)}for(;d!==0;){for(Y9(t),t.lineIndent=0,d=t.input.charCodeAt(t.position);(!s||t.lineIndentl&&(l=t.lineIndent),vc(d)){u++;continue}if(t.lineIndente)&&u!==0)Qt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(v&&(s=t.line,l=t.lineStart,u=t.position),xm(t,e,RT,!0,i)&&(v?g=t.result:y=t.result),v||(vm(t,d,p,m,g,y,s,l,u),m=g=y=null),_i(t,!0,-1),b=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&b!==0)Qt(t,"bad indentation of a mapping entry");else if(t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndente?u=1:t.lineIndent===e?u=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),d=0,p=t.implicitTypes.length;d"),t.result!==null&&g.kind!==t.kind&&Qt(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+g.kind+'", not "'+t.kind+'"'),g.resolve(t.result,t.tag)?(t.result=g.construct(t.result,t.tag),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Qt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||f}function W8e(t){var e=t.position,r,n,i,a=!1,s;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);(s=t.input.charCodeAt(t.position))!==0&&(_i(t,!0,-1),s=t.input.charCodeAt(t.position),!(t.lineIndent>0||s!==37));){for(a=!0,s=t.input.charCodeAt(++t.position),r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);for(n=t.input.slice(r,t.position),i=[],n.length<1&&Qt(t,"directive name must not be less than one character in length");s!==0;){for(;Gd(s);)s=t.input.charCodeAt(++t.position);if(s===35){do s=t.input.charCodeAt(++t.position);while(s!==0&&!vc(s));break}if(vc(s))break;for(r=t.position;s!==0&&!Os(s);)s=t.input.charCodeAt(++t.position);i.push(t.input.slice(r,t.position))}s!==0&&Y9(t),Yh.call(mK,n)?mK[n](t,n,i):NT(t,'unknown document directive "'+n+'"')}if(_i(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,_i(t,!0,-1)):a&&Qt(t,"directives end mark is expected"),xm(t,t.lineIndent-1,RT,!1,!0),_i(t,!0,-1),t.checkLineBreaks&&D8e.test(t.input.slice(e,t.position))&&NT(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&OT(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,_i(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var n=$K(t,r);if(typeof e!="function")return n;for(var i=0,a=n.length;i=55296&&r<=56319&&e+1=56320&&n<=57343)?(r-55296)*1024+n-56320+65536:r}function XK(t){var e=/^\n* /;return e.test(t)}function T_e(t,e,r,n,i,a,s,l){var u,h=0,f=null,d=!1,p=!1,m=n!==-1,g=-1,y=x_e(g2(t,0))&&b_e(g2(t,t.length-1));if(e||s)for(u=0;u=65536?u+=2:u++){if(h=g2(t,u),!b2(h))return gm;y=y&&bK(h,f,l),f=h}else{for(u=0;u=65536?u+=2:u++){if(h=g2(t,u),h===v2)d=!0,m&&(p=p||u-g-1>n&&t[g+1]!==" ",g=u);else if(!b2(h))return gm;y=y&&bK(h,f,l),f=h}p=p||m&&u-g-1>n&&t[g+1]!==" "}return!d&&!p?y&&!s&&!i(t)?jK:a===x2?gm:H9:r>9&&XK(t)?gm:s?a===x2?gm:H9:p?QK:KK}function w_e(t,e,r,n,i){t.dump=function(){if(e.length===0)return t.quotingType===x2?'""':"''";if(!t.noCompatMode&&(f_e.indexOf(e)!==-1||d_e.test(e)))return t.quotingType===x2?'"'+e+'"':"'"+e+"'";var a=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),l=n||t.flowLevel>-1&&r>=t.flowLevel;function u(h){return v_e(t,h)}switch(o(u,"testAmbiguity"),T_e(e,l,t.indent,s,u,t.quotingType,t.forceQuotes&&!n,i)){case jK:return e;case H9:return"'"+e.replace(/'/g,"''")+"'";case KK:return"|"+TK(e,t.indent)+wK(vK(e,a));case QK:return">"+TK(e,t.indent)+wK(vK(k_e(e,s),a));case gm:return'"'+E_e(e)+'"';default:throw new Is("impossible error: invalid scalar style")}}()}function TK(t,e){var r=XK(t)?String(e):"",n=t[t.length-1]===` -`,i=n&&(t[t.length-2]===` -`||t===` -`),a=i?"+":n?"":"-";return r+a+` -`}function wK(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function k_e(t,e){for(var r=/(\n+)([^\n]*)/g,n=function(){var h=t.indexOf(` -`);return h=h!==-1?h:t.length,r.lastIndex=h,kK(t.slice(0,h),e)}(),i=t[0]===` -`||t[0]===" ",a,s;s=r.exec(t);){var l=s[1],u=s[2];a=u[0]===" ",n+=l+(!i&&!a&&u!==""?` -`:"")+kK(u,e),i=a}return n}function kK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,n,i=0,a,s=0,l=0,u="";n=r.exec(t);)l=n.index,l-i>e&&(a=s>i?s:l,u+=` -`+t.slice(i,a),i=a+1),s=l;return u+=` -`,t.length-i>e&&s>i?u+=t.slice(i,s)+` -`+t.slice(s+1):u+=t.slice(i),u.slice(1)}function E_e(t){for(var e="",r=0,n,i=0;i=65536?i+=2:i++)r=g2(t,i),n=Na[r],!n&&b2(r)?(e+=t[i],r>=65536&&(e+=t[i+1])):e+=n||m_e(r);return e}function S_e(t,e,r){var n="",i=t.tag,a,s,l;for(a=0,s=r.length;a"u"&&Ru(t,e,null,!1,!1))&&(n!==""&&(n+=","+(t.condenseFlow?"":" ")),n+=t.dump);t.tag=i,t.dump="["+n+"]"}function EK(t,e,r,n){var i="",a=t.tag,s,l,u;for(s=0,l=r.length;s"u"&&Ru(t,e+1,null,!0,!0,!1,!0))&&((!n||i!=="")&&(i+=U9(t,e)),t.dump&&v2===t.dump.charCodeAt(0)?i+="-":i+="- ",i+=t.dump);t.tag=a,t.dump=i||"[]"}function C_e(t,e,r){var n="",i=t.tag,a=Object.keys(r),s,l,u,h,f;for(s=0,l=a.length;s1024&&(f+="? "),f+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Ru(t,e,h,!1,!1)&&(f+=t.dump,n+=f));t.tag=i,t.dump="{"+n+"}"}function A_e(t,e,r,n){var i="",a=t.tag,s=Object.keys(r),l,u,h,f,d,p;if(t.sortKeys===!0)s.sort();else if(typeof t.sortKeys=="function")s.sort(t.sortKeys);else if(t.sortKeys)throw new Is("sortKeys must be a boolean or a function");for(l=0,u=s.length;l1024,d&&(t.dump&&v2===t.dump.charCodeAt(0)?p+="?":p+="? "),p+=t.dump,d&&(p+=U9(t,e)),Ru(t,e+1,f,!0,d)&&(t.dump&&v2===t.dump.charCodeAt(0)?p+=":":p+=": ",p+=t.dump,i+=p));t.tag=a,t.dump=i||"{}"}function SK(t,e,r){var n,i,a,s,l,u;for(i=r?t.explicitTypes:t.implicitTypes,a=0,s=i.length;a tag resolver accepts not "'+u+'" style');t.dump=n}return!0}return!1}function Ru(t,e,r,n,i,a,s){t.tag=null,t.dump=r,SK(t,r,!1)||SK(t,r,!0);var l=GK.call(t.dump),u=n,h;n&&(n=t.flowLevel<0||t.flowLevel>e);var f=l==="[object Object]"||l==="[object Array]",d,p;if(f&&(d=t.duplicates.indexOf(r),p=d!==-1),(t.tag!==null&&t.tag!=="?"||p||t.indent!==2&&e>0)&&(i=!1),p&&t.usedDuplicates[d])t.dump="*ref_"+d;else{if(f&&p&&!t.usedDuplicates[d]&&(t.usedDuplicates[d]=!0),l==="[object Object]")n&&Object.keys(t.dump).length!==0?(A_e(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(C_e(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object Array]")n&&t.dump.length!==0?(t.noArrayIndent&&!s&&e>0?EK(t,e-1,t.dump,i):EK(t,e,t.dump,i),p&&(t.dump="&ref_"+d+t.dump)):(S_e(t,e,t.dump),p&&(t.dump="&ref_"+d+" "+t.dump));else if(l==="[object String]")t.tag!=="?"&&w_e(t,t.dump,e,a,u);else{if(l==="[object Undefined]")return!1;if(t.skipInvalid)return!1;throw new Is("unacceptable kind of an object to dump "+l)}t.tag!==null&&t.tag!=="?"&&(h=encodeURI(t.tag[0]==="!"?t.tag.slice(1):t.tag).replace(/!/g,"%21"),t.tag[0]==="!"?h="!"+h:h.slice(0,18)==="tag:yaml.org,2002:"?h="!!"+h.slice(18):h="!<"+h+">",t.dump=h+" "+t.dump)}return!0}function __e(t,e){var r=[],n=[],i,a;for(W9(t,r,n),i=0,a=n.length;i{"use strict";o(CK,"isNothing");o(hAe,"isObject");o(fAe,"toArray");o(dAe,"extend");o(pAe,"repeat");o(mAe,"isNegativeZero");gAe=CK,yAe=hAe,vAe=fAe,xAe=pAe,bAe=mAe,TAe=dAe,Gi={isNothing:gAe,isObject:yAe,toArray:vAe,repeat:xAe,isNegativeZero:bAe,extend:TAe};o(AK,"formatError");o(y2,"YAMLException$1");y2.prototype=Object.create(Error.prototype);y2.prototype.constructor=y2;y2.prototype.toString=o(function(e){return this.name+": "+AK(this,e)},"toString");Is=y2;o(F9,"getLine");o($9,"padStart");o(wAe,"makeSnippet");kAe=wAe,EAe=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],SAe=["scalar","sequence","mapping"];o(CAe,"compileStyleAliases");o(AAe,"Type$1");Ra=AAe;o(hK,"compileList");o(_Ae,"compileMap");o(G9,"Schema$1");G9.prototype.extend=o(function(e){var r=[],n=[];if(e instanceof Ra)n.push(e);else if(Array.isArray(e))n=n.concat(e);else if(e&&(Array.isArray(e.implicit)||Array.isArray(e.explicit)))e.implicit&&(r=r.concat(e.implicit)),e.explicit&&(n=n.concat(e.explicit));else throw new Is("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");r.forEach(function(a){if(!(a instanceof Ra))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(a.loadKind&&a.loadKind!=="scalar")throw new Is("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(a.multi)throw new Is("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),n.forEach(function(a){if(!(a instanceof Ra))throw new Is("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var i=Object.create(G9.prototype);return i.implicit=(this.implicit||[]).concat(r),i.explicit=(this.explicit||[]).concat(n),i.compiledImplicit=hK(i,"implicit"),i.compiledExplicit=hK(i,"explicit"),i.compiledTypeMap=_Ae(i.compiledImplicit,i.compiledExplicit),i},"extend");DAe=G9,LAe=new Ra("tag:yaml.org,2002:str",{kind:"scalar",construct:o(function(t){return t!==null?t:""},"construct")}),RAe=new Ra("tag:yaml.org,2002:seq",{kind:"sequence",construct:o(function(t){return t!==null?t:[]},"construct")}),NAe=new Ra("tag:yaml.org,2002:map",{kind:"mapping",construct:o(function(t){return t!==null?t:{}},"construct")}),MAe=new DAe({explicit:[LAe,RAe,NAe]});o(IAe,"resolveYamlNull");o(OAe,"constructYamlNull");o(PAe,"isNull");BAe=new Ra("tag:yaml.org,2002:null",{kind:"scalar",resolve:IAe,construct:OAe,predicate:PAe,represent:{canonical:o(function(){return"~"},"canonical"),lowercase:o(function(){return"null"},"lowercase"),uppercase:o(function(){return"NULL"},"uppercase"),camelcase:o(function(){return"Null"},"camelcase"),empty:o(function(){return""},"empty")},defaultStyle:"lowercase"});o(FAe,"resolveYamlBoolean");o($Ae,"constructYamlBoolean");o(zAe,"isBoolean");GAe=new Ra("tag:yaml.org,2002:bool",{kind:"scalar",resolve:FAe,construct:$Ae,predicate:zAe,represent:{lowercase:o(function(t){return t?"true":"false"},"lowercase"),uppercase:o(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:o(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});o(VAe,"isHexCode");o(UAe,"isOctCode");o(HAe,"isDecCode");o(WAe,"resolveYamlInteger");o(qAe,"constructYamlInteger");o(YAe,"isInteger");XAe=new Ra("tag:yaml.org,2002:int",{kind:"scalar",resolve:WAe,construct:qAe,predicate:YAe,represent:{binary:o(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:o(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:o(function(t){return t.toString(10)},"decimal"),hexadecimal:o(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),jAe=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");o(KAe,"resolveYamlFloat");o(QAe,"constructYamlFloat");ZAe=/^[-+]?[0-9]+e/;o(JAe,"representYamlFloat");o(e8e,"isFloat");t8e=new Ra("tag:yaml.org,2002:float",{kind:"scalar",resolve:KAe,construct:QAe,predicate:e8e,represent:JAe,defaultStyle:"lowercase"}),_K=MAe.extend({implicit:[BAe,GAe,XAe,t8e]}),r8e=_K,DK=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),LK=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");o(n8e,"resolveYamlTimestamp");o(i8e,"constructYamlTimestamp");o(a8e,"representYamlTimestamp");s8e=new Ra("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:n8e,construct:i8e,instanceOf:Date,represent:a8e});o(o8e,"resolveYamlMerge");l8e=new Ra("tag:yaml.org,2002:merge",{kind:"scalar",resolve:o8e}),q9=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;o(c8e,"resolveYamlBinary");o(u8e,"constructYamlBinary");o(h8e,"representYamlBinary");o(f8e,"isBinary");d8e=new Ra("tag:yaml.org,2002:binary",{kind:"scalar",resolve:c8e,construct:u8e,predicate:f8e,represent:h8e}),p8e=Object.prototype.hasOwnProperty,m8e=Object.prototype.toString;o(g8e,"resolveYamlOmap");o(y8e,"constructYamlOmap");v8e=new Ra("tag:yaml.org,2002:omap",{kind:"sequence",resolve:g8e,construct:y8e}),x8e=Object.prototype.toString;o(b8e,"resolveYamlPairs");o(T8e,"constructYamlPairs");w8e=new Ra("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:b8e,construct:T8e}),k8e=Object.prototype.hasOwnProperty;o(E8e,"resolveYamlSet");o(S8e,"constructYamlSet");C8e=new Ra("tag:yaml.org,2002:set",{kind:"mapping",resolve:E8e,construct:S8e}),RK=r8e.extend({implicit:[s8e,l8e],explicit:[d8e,v8e,w8e,C8e]}),Yh=Object.prototype.hasOwnProperty,LT=1,NK=2,MK=3,RT=4,z9=1,A8e=2,fK=3,_8e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,D8e=/[\x85\u2028\u2029]/,L8e=/[,\[\]\{\}]/,IK=/^(?:!|!!|![a-z\-]+!)$/i,OK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;o(dK,"_class");o(vc,"is_EOL");o(Gd,"is_WHITE_SPACE");o(Os,"is_WS_OR_EOL");o(ym,"is_FLOW_INDICATOR");o(R8e,"fromHexCode");o(N8e,"escapedHexLen");o(M8e,"fromDecimalCode");o(pK,"simpleEscapeSequence");o(I8e,"charFromCodepoint");PK=new Array(256),BK=new Array(256);for(zd=0;zd<256;zd++)PK[zd]=pK(zd)?1:0,BK[zd]=pK(zd);o(O8e,"State$1");o(FK,"generateError");o(Qt,"throwError");o(NT,"throwWarning");mK={YAML:o(function(e,r,n){var i,a,s;e.version!==null&&Qt(e,"duplication of %YAML directive"),n.length!==1&&Qt(e,"YAML directive accepts exactly one argument"),i=/^([0-9]+)\.([0-9]+)$/.exec(n[0]),i===null&&Qt(e,"ill-formed argument of the YAML directive"),a=parseInt(i[1],10),s=parseInt(i[2],10),a!==1&&Qt(e,"unacceptable YAML version of the document"),e.version=n[0],e.checkLineBreaks=s<2,s!==1&&s!==2&&NT(e,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:o(function(e,r,n){var i,a;n.length!==2&&Qt(e,"TAG directive accepts exactly two arguments"),i=n[0],a=n[1],IK.test(i)||Qt(e,"ill-formed tag handle (first argument) of the TAG directive"),Yh.call(e.tagMap,i)&&Qt(e,'there is a previously declared suffix for "'+i+'" tag handle'),OK.test(a)||Qt(e,"ill-formed tag prefix (second argument) of the TAG directive");try{a=decodeURIComponent(a)}catch{Qt(e,"tag prefix is malformed: "+a)}e.tagMap[i]=a},"handleTagDirective")};o(qh,"captureSegment");o(gK,"mergeMappings");o(vm,"storeMappingPair");o(Y9,"readLineBreak");o(_i,"skipSeparationSpace");o(OT,"testDocumentSeparator");o(X9,"writeFoldedLines");o(P8e,"readPlainScalar");o(B8e,"readSingleQuotedScalar");o(F8e,"readDoubleQuotedScalar");o($8e,"readFlowCollection");o(z8e,"readBlockScalar");o(yK,"readBlockSequence");o(G8e,"readBlockMapping");o(V8e,"readTagProperty");o(U8e,"readAnchorProperty");o(H8e,"readAlias");o(xm,"composeNode");o(W8e,"readDocument");o($K,"loadDocuments");o(q8e,"loadAll$1");o(Y8e,"load$1");X8e=q8e,j8e=Y8e,zK={loadAll:X8e,load:j8e},GK=Object.prototype.toString,VK=Object.prototype.hasOwnProperty,j9=65279,K8e=9,v2=10,Q8e=13,Z8e=32,J8e=33,e_e=34,V9=35,t_e=37,r_e=38,n_e=39,i_e=42,UK=44,a_e=45,MT=58,s_e=61,o_e=62,l_e=63,c_e=64,HK=91,WK=93,u_e=96,qK=123,h_e=124,YK=125,Na={};Na[0]="\\0";Na[7]="\\a";Na[8]="\\b";Na[9]="\\t";Na[10]="\\n";Na[11]="\\v";Na[12]="\\f";Na[13]="\\r";Na[27]="\\e";Na[34]='\\"';Na[92]="\\\\";Na[133]="\\N";Na[160]="\\_";Na[8232]="\\L";Na[8233]="\\P";f_e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],d_e=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;o(p_e,"compileStyleMap");o(m_e,"encodeHex");g_e=1,x2=2;o(y_e,"State");o(vK,"indentString");o(U9,"generateNextLine");o(v_e,"testImplicitResolving");o(IT,"isWhitespace");o(b2,"isPrintable");o(xK,"isNsCharOrWhitespace");o(bK,"isPlainSafe");o(x_e,"isPlainSafeFirst");o(b_e,"isPlainSafeLast");o(g2,"codePointAt");o(XK,"needIndentIndicator");jK=1,H9=2,KK=3,QK=4,gm=5;o(T_e,"chooseScalarStyle");o(w_e,"writeScalar");o(TK,"blockHeader");o(wK,"dropEndingNewline");o(k_e,"foldString");o(kK,"foldLine");o(E_e,"escapeString");o(S_e,"writeFlowSequence");o(EK,"writeBlockSequence");o(C_e,"writeFlowMapping");o(A_e,"writeBlockMapping");o(SK,"detectType");o(Ru,"writeNode");o(__e,"getDuplicateReferences");o(W9,"inspectNode");o(D_e,"dump$1");L_e=D_e,R_e={dump:L_e};o(K9,"renamed");bm=_K,Tm=zK.load,qSt=zK.loadAll,YSt=R_e.dump,XSt=K9("safeLoad","load"),jSt=K9("safeLoadAll","loadAll"),KSt=K9("safeDump","dump")});function tL(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function nQ(t){Ud=t}function nn(t,e=""){let r=typeof t=="string"?t:t.source,n={replace:o((i,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(ss.caret,"$1"),r=r.replace(i,s),n},"replace"),getRegex:o(()=>new RegExp(r,e),"getRegex")};return n}function xc(t,e){if(e){if(ss.escapeTest.test(t))return t.replace(ss.escapeReplace,JK)}else if(ss.escapeTestNoEncode.test(t))return t.replace(ss.escapeReplaceNoEncode,JK);return t}function eQ(t){try{t=encodeURI(t).replace(ss.percentDecode,"%")}catch{return null}return t}function tQ(t,e){let r=t.replace(ss.findPipe,(a,s,l)=>{let u=!1,h=s;for(;--h>=0&&l[h]==="\\";)u=!u;return u?"|":" |"}),n=r.split(ss.splitPipe),i=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length0?-2:-1}function rQ(t,e,r,n,i){let a=e.href,s=e.title||null,l=t[1].replace(i.other.outputLinkReplace,"$1");n.state.inLink=!0;let u={type:t[0].charAt(0)==="!"?"image":"link",raw:r,href:a,title:s,text:l,tokens:n.inlineTokens(l)};return n.state.inLink=!1,u}function fDe(t,e,r){let n=t.match(r.other.indentCodeCompensation);if(n===null)return e;let i=n[1];return e.split(` -`).map(a=>{let s=a.match(r.other.beginningSpace);if(s===null)return a;let[l]=s;return l.length>=i.length?a.slice(i.length):a}).join(` -`)}function Jr(t,e){return Vd.parse(t,e)}var Ud,k2,ss,N_e,M_e,I_e,E2,O_e,rL,iQ,aQ,P_e,nL,B_e,iL,F_e,$_e,VT,aL,z_e,sQ,G_e,sL,ZK,V_e,U_e,H_e,W_e,oQ,q_e,UT,oL,lQ,Y_e,cQ,X_e,j_e,K_e,uQ,Q_e,Z_e,hQ,J_e,eDe,tDe,rDe,nDe,iDe,aDe,$T,sDe,fQ,dQ,oDe,lL,lDe,Z9,cDe,BT,T2,uDe,JK,zT,Nu,GT,cL,Mu,FT,dDe,Vd,ZSt,JSt,e6t,t6t,r6t,n6t,i6t,pQ=N(()=>{"use strict";o(tL,"M");Ud=tL();o(nQ,"H");k2={exec:o(()=>null,"exec")};o(nn,"h");ss={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:o(t=>new RegExp(`^( {0,3}${t})((?:[ ][^\\n]*)?(?:\\n|$))`),"listItemRegex"),nextBulletRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),"nextBulletRegex"),hrRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),"hrRegex"),fencesBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),"fencesBeginRegex"),headingBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),"headingBeginRegex"),htmlBeginRegex:o(t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i"),"htmlBeginRegex")},N_e=/^(?:[ \t]*(?:\n|$))+/,M_e=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,I_e=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,E2=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,O_e=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,rL=/(?:[*+-]|\d{1,9}[.)])/,iQ=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,aQ=nn(iQ).replace(/bull/g,rL).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),P_e=nn(iQ).replace(/bull/g,rL).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),nL=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,B_e=/^[^\n]+/,iL=/(?!\s*\])(?:\\.|[^\[\]\\])+/,F_e=nn(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",iL).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),$_e=nn(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,rL).getRegex(),VT="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",aL=/|$))/,z_e=nn("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",aL).replace("tag",VT).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),sQ=nn(nL).replace("hr",E2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",VT).getRegex(),G_e=nn(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",sQ).getRegex(),sL={blockquote:G_e,code:M_e,def:F_e,fences:I_e,heading:O_e,hr:E2,html:z_e,lheading:aQ,list:$_e,newline:N_e,paragraph:sQ,table:k2,text:B_e},ZK=nn("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",E2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",VT).getRegex(),V_e={...sL,lheading:P_e,table:ZK,paragraph:nn(nL).replace("hr",E2).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ZK).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",VT).getRegex()},U_e={...sL,html:nn(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",aL).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:k2,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:nn(nL).replace("hr",E2).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",aQ).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},H_e=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,W_e=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,oQ=/^( {2,}|\\)\n(?!\s*$)/,q_e=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g,uQ=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Q_e=nn(uQ,"u").replace(/punct/g,UT).getRegex(),Z_e=nn(uQ,"u").replace(/punct/g,cQ).getRegex(),hQ="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",J_e=nn(hQ,"gu").replace(/notPunctSpace/g,lQ).replace(/punctSpace/g,oL).replace(/punct/g,UT).getRegex(),eDe=nn(hQ,"gu").replace(/notPunctSpace/g,j_e).replace(/punctSpace/g,X_e).replace(/punct/g,cQ).getRegex(),tDe=nn("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,lQ).replace(/punctSpace/g,oL).replace(/punct/g,UT).getRegex(),rDe=nn(/\\(punct)/,"gu").replace(/punct/g,UT).getRegex(),nDe=nn(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),iDe=nn(aL).replace("(?:-->|$)","-->").getRegex(),aDe=nn("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",iDe).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),$T=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,sDe=nn(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",$T).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),fQ=nn(/^!?\[(label)\]\[(ref)\]/).replace("label",$T).replace("ref",iL).getRegex(),dQ=nn(/^!?\[(ref)\](?:\[\])?/).replace("ref",iL).getRegex(),oDe=nn("reflink|nolink(?!\\()","g").replace("reflink",fQ).replace("nolink",dQ).getRegex(),lL={_backpedal:k2,anyPunctuation:rDe,autolink:nDe,blockSkip:K_e,br:oQ,code:W_e,del:k2,emStrongLDelim:Q_e,emStrongRDelimAst:J_e,emStrongRDelimUnd:tDe,escape:H_e,link:sDe,nolink:dQ,punctuation:Y_e,reflink:fQ,reflinkSearch:oDe,tag:aDe,text:q_e,url:k2},lDe={...lL,link:nn(/^!?\[(label)\]\((.*?)\)/).replace("label",$T).getRegex(),reflink:nn(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",$T).getRegex()},Z9={...lL,emStrongRDelimAst:eDe,emStrongLDelim:Z_e,url:nn(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},JK=o(t=>uDe[t],"ge");o(xc,"R");o(eQ,"J");o(tQ,"V");o(w2,"A");o(hDe,"fe");o(rQ,"de");o(fDe,"Je");zT=class{static{o(this,"S")}options;rules;lexer;constructor(t){this.options=t||Ud}space(t){let e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){let e=this.rules.block.code.exec(t);if(e){let r=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?r:w2(r,` -`)}}}fences(t){let e=this.rules.block.fences.exec(t);if(e){let r=e[0],n=fDe(r,e[3]||"",this.rules);return{type:"code",raw:r,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:n}}}heading(t){let e=this.rules.block.heading.exec(t);if(e){let r=e[2].trim();if(this.rules.other.endingHash.test(r)){let n=w2(r,"#");(this.options.pedantic||!n||this.rules.other.endingSpaceChar.test(n))&&(r=n.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:r,tokens:this.lexer.inline(r)}}}hr(t){let e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:w2(e[0],` -`)}}blockquote(t){let e=this.rules.block.blockquote.exec(t);if(e){let r=w2(e[0],` -`).split(` -`),n="",i="",a=[];for(;r.length>0;){let s=!1,l=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:n,start:n?+r.slice(0,-1):"",loose:!1,items:[]};r=n?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=n?r:"[*+-]");let a=this.rules.other.listItemRegex(r),s=!1;for(;t;){let u=!1,h="",f="";if(!(e=a.exec(t))||this.rules.block.hr.test(t))break;h=e[0],t=t.substring(h.length);let d=e[2].split(` -`,1)[0].replace(this.rules.other.listReplaceTabs,x=>" ".repeat(3*x.length)),p=t.split(` -`,1)[0],m=!d.trim(),g=0;if(this.options.pedantic?(g=2,f=d.trimStart()):m?g=e[1].length+1:(g=e[2].search(this.rules.other.nonSpaceChar),g=g>4?1:g,f=d.slice(g),g+=e[1].length),m&&this.rules.other.blankLine.test(p)&&(h+=p+` -`,t=t.substring(p.length+1),u=!0),!u){let x=this.rules.other.nextBulletRegex(g),b=this.rules.other.hrRegex(g),T=this.rules.other.fencesBeginRegex(g),S=this.rules.other.headingBeginRegex(g),w=this.rules.other.htmlBeginRegex(g);for(;t;){let E=t.split(` -`,1)[0],_;if(p=E,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting," "),_=p):_=p.replace(this.rules.other.tabCharGlobal," "),T.test(p)||S.test(p)||w.test(p)||x.test(p)||b.test(p))break;if(_.search(this.rules.other.nonSpaceChar)>=g||!p.trim())f+=` -`+_.slice(g);else{if(m||d.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||T.test(d)||S.test(d)||b.test(d))break;f+=` -`+p}!m&&!p.trim()&&(m=!0),h+=E+` -`,t=t.substring(E.length+1),d=_.slice(g)}}i.loose||(s?i.loose=!0:this.rules.other.doubleBlankLine.test(h)&&(s=!0));let y=null,v;this.options.gfm&&(y=this.rules.other.listIsTask.exec(f),y&&(v=y[0]!=="[ ] ",f=f.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:h,task:!!y,checked:v,loose:!1,text:f,tokens:[]}),i.raw+=h}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u=0;ud.type==="space"),f=h.length>0&&h.some(d=>this.rules.other.anyLine.test(d.raw));i.loose=f}if(i.loose)for(let u=0;u({text:l,tokens:this.lexer.inline(l),header:!1,align:a.align[u]})));return a}}lheading(t){let e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){let e=this.rules.block.paragraph.exec(t);if(e){let r=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:r,tokens:this.lexer.inline(r)}}}text(t){let e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){let e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){let e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){let e=this.rules.inline.link.exec(t);if(e){let r=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let a=w2(r.slice(0,-1),"\\");if((r.length-a.length)%2===0)return}else{let a=hDe(e[2],"()");if(a===-2)return;if(a>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+a;e[2]=e[2].substring(0,a),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let n=e[2],i="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(n);a&&(n=a[1],i=a[3])}else i=e[3]?e[3].slice(1,-1):"";return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?n=n.slice(1):n=n.slice(1,-1)),rQ(e,{href:n&&n.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(t,e){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){let n=(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=e[n.toLowerCase()];if(!i){let a=r[0].charAt(0);return{type:"text",raw:a,text:a}}return rQ(r,i,r[0],this.lexer,this.rules)}}emStrong(t,e,r=""){let n=this.rules.inline.emStrongLDelim.exec(t);if(!(!n||n[3]&&r.match(this.rules.other.unicodeAlphaNumeric))&&(!(n[1]||n[2])||!r||this.rules.inline.punctuation.exec(r))){let i=[...n[0]].length-1,a,s,l=i,u=0,h=n[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(h.lastIndex=0,e=e.slice(-1*t.length+i);(n=h.exec(e))!=null;){if(a=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!a)continue;if(s=[...a].length,n[3]||n[4]){l+=s;continue}else if((n[5]||n[6])&&i%3&&!((i+s)%3)){u+=s;continue}if(l-=s,l>0)continue;s=Math.min(s,s+l+u);let f=[...n[0]][0].length,d=t.slice(0,i+n.index+f+s);if(Math.min(i,s)%2){let m=d.slice(1,-1);return{type:"em",raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}let p=d.slice(2,-2);return{type:"strong",raw:d,text:p,tokens:this.lexer.inlineTokens(p)}}}}codespan(t){let e=this.rules.inline.code.exec(t);if(e){let r=e[2].replace(this.rules.other.newLineCharGlobal," "),n=this.rules.other.nonSpaceChar.test(r),i=this.rules.other.startingSpaceChar.test(r)&&this.rules.other.endingSpaceChar.test(r);return n&&i&&(r=r.substring(1,r.length-1)),{type:"codespan",raw:e[0],text:r}}}br(t){let e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){let e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){let e=this.rules.inline.autolink.exec(t);if(e){let r,n;return e[2]==="@"?(r=e[1],n="mailto:"+r):(r=e[1],n=r),{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let r,n;if(e[2]==="@")r=e[0],n="mailto:"+r;else{let i;do i=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(i!==e[0]);r=e[0],e[1]==="www."?n="http://"+e[0]:n=e[0]}return{type:"link",raw:e[0],text:r,href:n,tokens:[{type:"text",raw:r,text:r}]}}}inlineText(t){let e=this.rules.inline.text.exec(t);if(e){let r=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:r}}}},Nu=class J9{static{o(this,"a")}tokens;options;state;tokenizer;inlineQueue;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Ud,this.options.tokenizer=this.options.tokenizer||new zT,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let r={other:ss,block:BT.normal,inline:T2.normal};this.options.pedantic?(r.block=BT.pedantic,r.inline=T2.pedantic):this.options.gfm&&(r.block=BT.gfm,this.options.breaks?r.inline=T2.breaks:r.inline=T2.gfm),this.tokenizer.rules=r}static get rules(){return{block:BT,inline:T2}}static lex(e,r){return new J9(r).lex(e)}static lexInline(e,r){return new J9(r).inlineTokens(e)}lex(e){e=e.replace(ss.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let r=0;r(i=s.call({lexer:this},e,r))?(e=e.substring(i.raw.length),r.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let s=r.at(-1);i.raw.length===1&&s!==void 0?s.raw+=` -`:r.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=` -`+i.raw,s.text+=` -`+i.text,this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="paragraph"||s?.type==="text"?(s.raw+=` -`+i.raw,s.text+=` -`+i.raw,this.inlineQueue.at(-1).src=s.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title});continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),r.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),r.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let s=1/0,l=e.slice(1),u;this.options.extensions.startBlock.forEach(h=>{u=h.call({lexer:this},l),typeof u=="number"&&u>=0&&(s=Math.min(s,u))}),s<1/0&&s>=0&&(a=e.substring(0,s+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let s=r.at(-1);n&&s?.type==="paragraph"?(s.raw+=` -`+i.raw,s.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let s=r.at(-1);s?.type==="text"?(s.raw+=` -`+i.raw,s.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=s.text):r.push(i);continue}if(e){let s="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(s);break}else throw new Error(s)}}return this.state.top=!0,r}inline(e,r=[]){return this.inlineQueue.push({src:e,tokens:r}),r}inlineTokens(e,r=[]){let n=e,i=null;if(this.tokens.links){let l=Object.keys(this.tokens.links);if(l.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(n))!=null;)l.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(n))!=null;)n=n.slice(0,i.index)+"++"+n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;(i=this.tokenizer.rules.inline.blockSkip.exec(n))!=null;)n=n.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let a=!1,s="";for(;e;){a||(s=""),a=!1;let l;if(this.options.extensions?.inline?.some(h=>(l=h.call({lexer:this},e,r))?(e=e.substring(l.raw.length),r.push(l),!0):!1))continue;if(l=this.tokenizer.escape(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.tag(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.link(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(l.raw.length);let h=r.at(-1);l.type==="text"&&h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(l=this.tokenizer.emStrong(e,n,s)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.codespan(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.br(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.del(e)){e=e.substring(l.raw.length),r.push(l);continue}if(l=this.tokenizer.autolink(e)){e=e.substring(l.raw.length),r.push(l);continue}if(!this.state.inLink&&(l=this.tokenizer.url(e))){e=e.substring(l.raw.length),r.push(l);continue}let u=e;if(this.options.extensions?.startInline){let h=1/0,f=e.slice(1),d;this.options.extensions.startInline.forEach(p=>{d=p.call({lexer:this},f),typeof d=="number"&&d>=0&&(h=Math.min(h,d))}),h<1/0&&h>=0&&(u=e.substring(0,h+1))}if(l=this.tokenizer.inlineText(u)){e=e.substring(l.raw.length),l.raw.slice(-1)!=="_"&&(s=l.raw.slice(-1)),a=!0;let h=r.at(-1);h?.type==="text"?(h.raw+=l.raw,h.text+=l.text):r.push(l);continue}if(e){let h="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(h);break}else throw new Error(h)}}return r}},GT=class{static{o(this,"$")}options;parser;constructor(t){this.options=t||Ud}space(t){return""}code({text:t,lang:e,escaped:r}){let n=(e||"").match(ss.notSpaceStart)?.[0],i=t.replace(ss.endingNewline,"")+` -`;return n?'
    '+(r?i:xc(i,!0))+`
    -`:"
    "+(r?i:xc(i,!0))+`
    -`}blockquote({tokens:t}){return`
    -${this.parser.parse(t)}
    -`}html({text:t}){return t}heading({tokens:t,depth:e}){return`${this.parser.parseInline(t)} -`}hr(t){return`
    -`}list(t){let e=t.ordered,r=t.start,n="";for(let s=0;s -`+n+" -`}listitem(t){let e="";if(t.task){let r=this.checkbox({checked:!!t.checked});t.loose?t.tokens[0]?.type==="paragraph"?(t.tokens[0].text=r+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&t.tokens[0].tokens[0].type==="text"&&(t.tokens[0].tokens[0].text=r+" "+xc(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`
  • ${e}
  • -`}checkbox({checked:t}){return"'}paragraph({tokens:t}){return`

    ${this.parser.parseInline(t)}

    -`}table(t){let e="",r="";for(let i=0;i${n}`),` - -`+e+` -`+n+`
    -`}tablerow({text:t}){return` -${t} -`}tablecell(t){let e=this.parser.parseInline(t.tokens),r=t.header?"th":"td";return(t.align?`<${r} align="${t.align}">`:`<${r}>`)+e+` -`}strong({tokens:t}){return`${this.parser.parseInline(t)}`}em({tokens:t}){return`${this.parser.parseInline(t)}`}codespan({text:t}){return`${xc(t,!0)}`}br(t){return"
    "}del({tokens:t}){return`${this.parser.parseInline(t)}`}link({href:t,title:e,tokens:r}){let n=this.parser.parseInline(r),i=eQ(t);if(i===null)return n;t=i;let a='
    ",a}image({href:t,title:e,text:r,tokens:n}){n&&(r=this.parser.parseInline(n,this.parser.textRenderer));let i=eQ(t);if(i===null)return xc(r);t=i;let a=`${r}{let s=i[a].flat(1/0);r=r.concat(this.walkTokens(s,e))}):i.tokens&&(r=r.concat(this.walkTokens(i.tokens,e)))}}return r}use(...t){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(r=>{let n={...r};if(n.async=this.defaults.async||n.async||!1,r.extensions&&(r.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let a=e.renderers[i.name];a?e.renderers[i.name]=function(...s){let l=i.renderer.apply(this,s);return l===!1&&(l=a.apply(this,s)),l}:e.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[i.level];a?a.unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level==="block"?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level==="inline"&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),n.extensions=e),r.renderer){let i=this.defaults.renderer||new GT(this.defaults);for(let a in r.renderer){if(!(a in i))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,l=r.renderer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f||""}}n.renderer=i}if(r.tokenizer){let i=this.defaults.tokenizer||new zT(this.defaults);for(let a in r.tokenizer){if(!(a in i))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,l=r.tokenizer[s],u=i[s];i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.tokenizer=i}if(r.hooks){let i=this.defaults.hooks||new FT;for(let a in r.hooks){if(!(a in i))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,l=r.hooks[s],u=i[s];FT.passThroughHooks.has(a)?i[s]=h=>{if(this.defaults.async)return Promise.resolve(l.call(i,h)).then(d=>u.call(i,d));let f=l.call(i,h);return u.call(i,f)}:i[s]=(...h)=>{let f=l.apply(i,h);return f===!1&&(f=u.apply(i,h)),f}}n.hooks=i}if(r.walkTokens){let i=this.defaults.walkTokens,a=r.walkTokens;n.walkTokens=function(s){let l=[];return l.push(a.call(this,s)),i&&(l=l.concat(i.call(this,s))),l}}this.defaults={...this.defaults,...n}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return Nu.lex(t,e??this.defaults)}parser(t,e){return Mu.parse(t,e??this.defaults)}parseMarkdown(t){return(e,r)=>{let n={...r},i={...this.defaults,...n},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&n.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));i.hooks&&(i.hooks.options=i,i.hooks.block=t);let s=i.hooks?i.hooks.provideLexer():t?Nu.lex:Nu.lexInline,l=i.hooks?i.hooks.provideParser():t?Mu.parse:Mu.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(e):e).then(u=>s(u,i)).then(u=>i.hooks?i.hooks.processAllTokens(u):u).then(u=>i.walkTokens?Promise.all(this.walkTokens(u,i.walkTokens)).then(()=>u):u).then(u=>l(u,i)).then(u=>i.hooks?i.hooks.postprocess(u):u).catch(a);try{i.hooks&&(e=i.hooks.preprocess(e));let u=s(e,i);i.hooks&&(u=i.hooks.processAllTokens(u)),i.walkTokens&&this.walkTokens(u,i.walkTokens);let h=l(u,i);return i.hooks&&(h=i.hooks.postprocess(h)),h}catch(u){return a(u)}}}onError(t,e){return r=>{if(r.message+=` -Please report this to https://github.com/markedjs/marked.`,t){let n="

    An error occurred:

    "+xc(r.message+"",!0)+"
    ";return e?Promise.resolve(n):n}if(e)return Promise.reject(r);throw r}}},Vd=new dDe;o(Jr,"k");Jr.options=Jr.setOptions=function(t){return Vd.setOptions(t),Jr.defaults=Vd.defaults,nQ(Jr.defaults),Jr};Jr.getDefaults=tL;Jr.defaults=Ud;Jr.use=function(...t){return Vd.use(...t),Jr.defaults=Vd.defaults,nQ(Jr.defaults),Jr};Jr.walkTokens=function(t,e){return Vd.walkTokens(t,e)};Jr.parseInline=Vd.parseInline;Jr.Parser=Mu;Jr.parser=Mu.parse;Jr.Renderer=GT;Jr.TextRenderer=cL;Jr.Lexer=Nu;Jr.lexer=Nu.lex;Jr.Tokenizer=zT;Jr.Hooks=FT;Jr.parse=Jr;ZSt=Jr.options,JSt=Jr.setOptions,e6t=Jr.use,t6t=Jr.walkTokens,r6t=Jr.parseInline,n6t=Mu.parse,i6t=Nu.lex});function pDe(t,{markdownAutoWrap:e}){let n=t.replace(//g,` -`).replace(/\n{2,}/g,` -`),i=j4(n);return e===!1?i.replace(/ /g," "):i}function mQ(t,e={}){let r=pDe(t,e),n=Jr.lexer(r),i=[[]],a=0;function s(l,u="normal"){l.type==="text"?l.text.split(` -`).forEach((f,d)=>{d!==0&&(a++,i.push([])),f.split(" ").forEach(p=>{p=p.replace(/'/g,"'"),p&&i[a].push({content:p,type:u})})}):l.type==="strong"||l.type==="em"?l.tokens.forEach(h=>{s(h,l.type)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}return o(s,"processNode"),n.forEach(l=>{l.type==="paragraph"?l.tokens?.forEach(u=>{s(u)}):l.type==="html"&&i[a].push({content:l.text,type:"normal"})}),i}function gQ(t,{markdownAutoWrap:e}={}){let r=Jr.lexer(t);function n(i){return i.type==="text"?e===!1?i.text.replace(/\n */g,"
    ").replace(/ /g," "):i.text.replace(/\n */g,"
    "):i.type==="strong"?`${i.tokens?.map(n).join("")}`:i.type==="em"?`${i.tokens?.map(n).join("")}`:i.type==="paragraph"?`

    ${i.tokens?.map(n).join("")}

    `:i.type==="space"?"":i.type==="html"?`${i.text}`:i.type==="escape"?i.text:`Unsupported markdown: ${i.type}`}return o(n,"output"),r.map(n).join("")}var yQ=N(()=>{"use strict";pQ();r7();o(pDe,"preprocessMarkdown");o(mQ,"markdownToLines");o(gQ,"markdownToHTML")});function mDe(t){return Intl.Segmenter?[...new Intl.Segmenter().segment(t)].map(e=>e.segment):[...t]}function gDe(t,e){let r=mDe(e.content);return vQ(t,[],r,e.type)}function vQ(t,e,r,n){if(r.length===0)return[{content:e.join(""),type:n},{content:"",type:n}];let[i,...a]=r,s=[...e,i];return t([{content:s.join(""),type:n}])?vQ(t,s,a,n):(e.length===0&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function xQ(t,e){if(t.some(({content:r})=>r.includes(` -`)))throw new Error("splitLineToFitWidth does not support newlines in the line");return uL(t,e)}function uL(t,e,r=[],n=[]){if(t.length===0)return n.length>0&&r.push(n),r.length>0?r:[];let i="";t[0].content===" "&&(i=" ",t.shift());let a=t.shift()??{content:" ",type:"normal"},s=[...n];if(i!==""&&s.push({content:i,type:"normal"}),s.push(a),e(s))return uL(t,e,r,s);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){let[l,u]=gDe(e,a);r.push([l]),u.content&&t.unshift(u)}return uL(t,e,r)}var bQ=N(()=>{"use strict";o(mDe,"splitTextToChars");o(gDe,"splitWordToFitWidth");o(vQ,"splitWordToFitWidthRecursion");o(xQ,"splitLineToFitWidth");o(uL,"splitLineToFitWidthRecursion")});function TQ(t,e){e&&t.attr("style",e)}async function yDe(t,e,r,n,i=!1){let a=t.append("foreignObject");a.attr("width",`${10*r}px`),a.attr("height",`${10*r}px`);let s=a.append("xhtml:div"),l=e.label;e.label&&yi(e.label)&&(l=await Th(e.label.replace(Ze.lineBreakRegex,` -`),me()));let u=e.isNode?"nodeLabel":"edgeLabel",h=s.append("span");h.html(l),TQ(h,e.labelStyle),h.attr("class",`${u} ${n}`),TQ(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),i&&s.attr("class","labelBkg");let f=s.node().getBoundingClientRect();return f.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),f=s.node().getBoundingClientRect()),a.node()}function hL(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function vDe(t,e,r){let n=t.append("text"),i=hL(n,1,e);fL(i,r);let a=i.node().getComputedTextLength();return n.remove(),a}function wQ(t,e,r){let n=t.append("text"),i=hL(n,1,e);fL(i,[{content:r,type:"normal"}]);let a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function xDe(t,e,r,n=!1){let a=e.append("g"),s=a.insert("rect").attr("class","background").attr("style","stroke: none"),l=a.append("text").attr("y","-10.1"),u=0;for(let h of r){let f=o(p=>vDe(a,1.1,p)<=t,"checkWidth"),d=f(h)?[h]:xQ(h,f);for(let p of d){let m=hL(l,u,1.1);fL(m,p),u++}}if(n){let h=l.node().getBBox(),f=2;return s.attr("x",h.x-f).attr("y",h.y-f).attr("width",h.width+2*f).attr("height",h.height+2*f),a.node()}else return l.node()}function fL(t,e){t.text(""),e.forEach((r,n)=>{let i=t.append("tspan").attr("font-style",r.type==="em"?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight",r.type==="strong"?"bold":"normal");n===0?i.text(r.content):i.text(" "+r.content)})}async function dL(t){let e=[];t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(n,i,a)=>(e.push((async()=>{let s=`${i}:${a}`;return await F$(s)?await Es(s,void 0,{class:"label-icon"}):``})()),n));let r=await Promise.all(e);return t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>r.shift()??"")}var qn,ao=N(()=>{"use strict";fr();Gt();pr();yt();yQ();er();jl();bQ();o(TQ,"applyStyle");o(yDe,"addHtmlSpan");o(hL,"createTspan");o(vDe,"computeWidthOfText");o(wQ,"computeDimensionOfText");o(xDe,"createFormattedText");o(fL,"updateTextContentAndStyles");o(dL,"replaceIconSubstring");qn=o(async(t,e="",{style:r="",isTitle:n=!1,classes:i="",useHtmlLabels:a=!0,isNode:s=!0,width:l=200,addSvgBackground:u=!1}={},h)=>{if(X.debug("XYZ createText",e,r,n,i,a,s,"addSvgBackground: ",u),a){let f=gQ(e,h),d=await dL(na(f)),p=e.replace(/\\\\/g,"\\"),m={isNode:s,label:yi(e)?p:d,labelStyle:r.replace("fill:","color:")};return await yDe(t,m,l,i,u)}else{let f=e.replace(//g,"
    "),d=mQ(f.replace("
    ","
    "),h),p=xDe(l,t,d,e?u:!1);if(s){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ge(p).attr("style",m)}else{let m=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");Ge(p).select("rect").attr("style",m.replace(/background:/g,"fill:"));let g=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");Ge(p).select("text").attr("style",g)}return p}},"createText")});function Xt(t){let e=t.map((r,n)=>`${n===0?"M":"L"}${r.x},${r.y}`);return e.push("Z"),e.join(" ")}function Go(t,e,r,n,i,a){let s=[],u=r-t,h=n-e,f=u/a,d=2*Math.PI/f,p=e+h/2;for(let m=0;m<=50;m++){let g=m/50,y=t+g*u,v=p+i*Math.sin(d*(y-t));s.push({x:y,y:v})}return s}function WT(t,e,r,n,i,a){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d{"use strict";ao();Gt();fr();_a();pr();er();mt=o(async(t,e,r)=>{let n,i=e.useHtmlLabels||dr(me()?.htmlLabels);r?n=r:n="node default";let a=t.insert("g").attr("class",n).attr("id",e.domId||e.id),s=a.insert("g").attr("class","label").attr("style",zn(e.labelStyle)),l;e.label===void 0?l="":l=typeof e.label=="string"?e.label:e.label[0];let u=await qn(s,wr(na(l),me()),{useHtmlLabels:i,width:e.width||me().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img}),h=u.getBBox(),f=(e?.padding??0)/2;if(i){let d=u.children[0],p=Ge(u),m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=me().fontSize?me().fontSize:window.getComputedStyle(document.body).fontSize,T=5,[S=or.fontSize]=zo(b),w=S*T+"px";y.style.minWidth=w,y.style.maxWidth=w}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}return i?s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):s.attr("transform","translate(0, "+-h.height/2+")"),e.centerLabel&&s.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),s.insert("rect",":first-child"),{shapeSvg:a,bbox:h,halfPadding:f,label:s}},"labelHelper"),HT=o(async(t,e,r)=>{let n=r.useHtmlLabels||dr(me()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),a=await qn(i,wr(na(e),me()),{useHtmlLabels:n,width:r.width||me()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img}),s=a.getBBox(),l=r.padding/2;if(dr(me()?.flowchart?.htmlLabels)){let u=a.children[0],h=Ge(a);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}return n?i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"):i.attr("transform","translate(0, "+-s.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:s,halfPadding:l,label:i}},"insertLabel"),Ke=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),ht=o((t,e)=>(t.look==="handDrawn"?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");o(Xt,"createPathFromPoints");o(Go,"generateFullSineWavePoints");o(WT,"generateCirclePoints")});function bDe(t,e){return t.intersect(e)}var kQ,EQ=N(()=>{"use strict";o(bDe,"intersectNode");kQ=bDe});function TDe(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(TDe,"intersectEllipse");qT=TDe});function wDe(t,e,r){return qT(t,e,e,r)}var SQ,CQ=N(()=>{"use strict";pL();o(wDe,"intersectCircle");SQ=wDe});function kDe(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&AQ(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&AQ(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function AQ(t,e){return t*e>0}var _Q,DQ=N(()=>{"use strict";o(kDe,"intersectLine");o(AQ,"sameSign");_Q=kDe});function EDe(t,e,r){let n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(f){s=Math.min(s,f.x),l=Math.min(l,f.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));let u=n-t.width/2-s,h=i-t.height/2-l;for(let f=0;f1&&a.sort(function(f,d){let p=f.x-r.x,m=f.y-r.y,g=Math.sqrt(p*p+m*m),y=d.x-r.x,v=d.y-r.y,x=Math.sqrt(y*y+v*v);return g{"use strict";DQ();o(EDe,"intersectPolygon");LQ=EDe});var SDe,Xh,mL=N(()=>{"use strict";SDe=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),Xh=SDe});var Xe,Ht=N(()=>{"use strict";EQ();CQ();pL();RQ();mL();Xe={node:kQ,circle:SQ,ellipse:qT,polygon:LQ,rect:Xh}});var NQ,bc,CDe,S2,Ye,Qe,zt=N(()=>{"use strict";Gt();NQ=o(t=>{let{handDrawnSeed:e}=me();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),bc=o(t=>{let e=CDe([...t.cssCompiledStyles||[],...t.cssStyles||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),CDe=o(t=>{let e=new Map;return t.forEach(r=>{let[n,i]=r.split(":");e.set(n.trim(),i?.trim())}),e},"styles2Map"),S2=o(t=>t==="color"||t==="font-size"||t==="font-family"||t==="font-weight"||t==="font-style"||t==="text-decoration"||t==="text-align"||t==="text-transform"||t==="line-height"||t==="letter-spacing"||t==="word-spacing"||t==="text-shadow"||t==="text-overflow"||t==="white-space"||t==="word-wrap"||t==="word-break"||t==="overflow-wrap"||t==="hyphens","isLabelStyle"),Ye=o(t=>{let{stylesArray:e}=bc(t),r=[],n=[],i=[],a=[];return e.forEach(s=>{let l=s[0];S2(l)?r.push(s.join(":")+" !important"):(n.push(s.join(":")+" !important"),l.includes("stroke")&&i.push(s.join(":")+" !important"),l==="fill"&&a.push(s.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:a}},"styles2String"),Qe=o((t,e)=>{let{themeVariables:r,handDrawnSeed:n}=me(),{nodeBorder:i,mainBkg:a}=r,{stylesMap:s}=bc(t);return Object.assign({roughness:.7,fill:s.get("fill")||a,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:s.get("stroke")||i,seed:n,strokeWidth:s.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0]},e)},"userNodeOverrides")});function gL(t,e,r){if(t&&t.length){let[n,i]=e,a=Math.PI/180*r,s=Math.cos(a),l=Math.sin(a);for(let u of t){let[h,f]=u;u[0]=(h-n)*s-(f-i)*l+n,u[1]=(h-n)*l+(f-i)*s+i}}}function ADe(t,e){return t[0]===e[0]&&t[1]===e[1]}function _De(t,e,r,n=1){let i=r,a=Math.max(e,.1),s=t[0]&&t[0][0]&&typeof t[0][0]=="number"?[t]:t,l=[0,0];if(i)for(let h of s)gL(h,l,i);let u=function(h,f,d){let p=[];for(let b of h){let T=[...b];ADe(T[0],T[T.length-1])||T.push([T[0][0],T[0][1]]),T.length>2&&p.push(T)}let m=[];f=Math.max(f,.1);let g=[];for(let b of p)for(let T=0;Tb.yminT.ymin?1:b.xT.x?1:b.ymax===T.ymax?0:(b.ymax-T.ymax)/Math.abs(b.ymax-T.ymax)),!g.length)return m;let y=[],v=g[0].ymin,x=0;for(;y.length||g.length;){if(g.length){let b=-1;for(let T=0;Tv);T++)b=T;g.splice(0,b+1).forEach(T=>{y.push({s:v,edge:T})})}if(y=y.filter(b=>!(b.edge.ymax<=v)),y.sort((b,T)=>b.edge.x===T.edge.x?0:(b.edge.x-T.edge.x)/Math.abs(b.edge.x-T.edge.x)),(d!==1||x%f==0)&&y.length>1)for(let b=0;b=y.length)break;let S=y[b].edge,w=y[T].edge;m.push([[Math.round(S.x),v],[Math.round(w.x),v]])}v+=d,y.forEach(b=>{b.edge.x=b.edge.x+d*b.edge.islope}),x++}return m}(s,a,n);if(i){for(let h of s)gL(h,l,-i);(function(h,f,d){let p=[];h.forEach(m=>p.push(...m)),gL(p,f,d)})(u,l,-i)}return u}function D2(t,e){var r;let n=e.hachureAngle+90,i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let a=1;return e.roughness>=1&&(((r=e.randomizer)===null||r===void 0?void 0:r.next())||Math.random())>.7&&(a=i),_De(t,i,n,a||1)}function tw(t){let e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}function vL(t,e){return t.type===e}function NL(t){let e=[],r=function(s){let l=new Array;for(;s!=="";)if(s.match(/^([ \t\r\n,]+)/))s=s.substr(RegExp.$1.length);else if(s.match(/^([aAcChHlLmMqQsStTvVzZ])/))l[l.length]={type:DDe,text:RegExp.$1},s=s.substr(RegExp.$1.length);else{if(!s.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];l[l.length]={type:yL,text:`${parseFloat(RegExp.$1)}`},s=s.substr(RegExp.$1.length)}return l[l.length]={type:MQ,text:""},l}(t),n="BOD",i=0,a=r[i];for(;!vL(a,MQ);){let s=0,l=[];if(n==="BOD"){if(a.text!=="M"&&a.text!=="m")return NL("M0,0"+t);i++,s=YT[a.text],n=a.text}else vL(a,yL)?s=YT[n]:(i++,s=YT[a.text],n=a.text);if(!(i+sf%2?h+r:h+e);a.push({key:"C",data:u}),e=u[4],r=u[5];break}case"Q":a.push({key:"Q",data:[...l]}),e=l[2],r=l[3];break;case"q":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"Q",data:u}),e=u[2],r=u[3];break}case"A":a.push({key:"A",data:[...l]}),e=l[5],r=l[6];break;case"a":e+=l[5],r+=l[6],a.push({key:"A",data:[l[0],l[1],l[2],l[3],l[4],e,r]});break;case"H":a.push({key:"H",data:[...l]}),e=l[0];break;case"h":e+=l[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...l]}),r=l[0];break;case"v":r+=l[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...l]}),e=l[2],r=l[3];break;case"s":{let u=l.map((h,f)=>f%2?h+r:h+e);a.push({key:"S",data:u}),e=u[2],r=u[3];break}case"T":a.push({key:"T",data:[...l]}),e=l[0],r=l[1];break;case"t":e+=l[0],r+=l[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function VQ(t){let e=[],r="",n=0,i=0,a=0,s=0,l=0,u=0;for(let{key:h,data:f}of t){switch(h){case"M":e.push({key:"M",data:[...f]}),[n,i]=f,[a,s]=f;break;case"C":e.push({key:"C",data:[...f]}),n=f[4],i=f[5],l=f[2],u=f[3];break;case"L":e.push({key:"L",data:[...f]}),[n,i]=f;break;case"H":n=f[0],e.push({key:"L",data:[n,i]});break;case"V":i=f[0],e.push({key:"L",data:[n,i]});break;case"S":{let d=0,p=0;r==="C"||r==="S"?(d=n+(n-l),p=i+(i-u)):(d=n,p=i),e.push({key:"C",data:[d,p,...f]}),l=f[0],u=f[1],n=f[2],i=f[3];break}case"T":{let[d,p]=f,m=0,g=0;r==="Q"||r==="T"?(m=n+(n-l),g=i+(i-u)):(m=n,g=i);let y=n+2*(m-n)/3,v=i+2*(g-i)/3,x=d+2*(m-d)/3,b=p+2*(g-p)/3;e.push({key:"C",data:[y,v,x,b,d,p]}),l=m,u=g,n=d,i=p;break}case"Q":{let[d,p,m,g]=f,y=n+2*(d-n)/3,v=i+2*(p-i)/3,x=m+2*(d-m)/3,b=g+2*(p-g)/3;e.push({key:"C",data:[y,v,x,b,m,g]}),l=d,u=p,n=m,i=g;break}case"A":{let d=Math.abs(f[0]),p=Math.abs(f[1]),m=f[2],g=f[3],y=f[4],v=f[5],x=f[6];d===0||p===0?(e.push({key:"C",data:[n,i,v,x,v,x]}),n=v,i=x):(n!==v||i!==x)&&(UQ(n,i,v,x,d,p,m,g,y).forEach(function(b){e.push({key:"C",data:b})}),n=v,i=x);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=s}r=h}return e}function C2(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function UQ(t,e,r,n,i,a,s,l,u,h){let f=(d=s,Math.PI*d/180);var d;let p=[],m=0,g=0,y=0,v=0;if(h)[m,g,y,v]=h;else{[t,e]=C2(t,e,-f),[r,n]=C2(r,n,-f);let L=(t-r)/2,A=(e-n)/2,I=L*L/(i*i)+A*A/(a*a);I>1&&(I=Math.sqrt(I),i*=I,a*=I);let M=i*i,P=a*a,B=M*P-M*A*A-P*L*L,F=M*A*A+P*L*L,z=(l===u?-1:1)*Math.sqrt(Math.abs(B/F));y=z*i*A/a+(t+r)/2,v=z*-a*L/i+(e+n)/2,m=Math.asin(parseFloat(((e-v)/a).toFixed(9))),g=Math.asin(parseFloat(((n-v)/a).toFixed(9))),tg&&(m-=2*Math.PI),!u&&g>m&&(g-=2*Math.PI)}let x=g-m;if(Math.abs(x)>120*Math.PI/180){let L=g,A=r,I=n;g=u&&g>m?m+120*Math.PI/180*1:m+120*Math.PI/180*-1,p=UQ(r=y+i*Math.cos(g),n=v+a*Math.sin(g),A,I,i,a,s,0,u,[g,L,y,v])}x=g-m;let b=Math.cos(m),T=Math.sin(m),S=Math.cos(g),w=Math.sin(g),E=Math.tan(x/4),_=4/3*i*E,C=4/3*a*E,D=[t,e],O=[t+_*T,e-C*b],R=[r+_*w,n-C*S],k=[r,n];if(O[0]=2*D[0]-O[0],O[1]=2*D[1]-O[1],h)return[O,R,k].concat(p);{p=[O,R,k].concat(p);let L=[];for(let A=0;A2){let i=[];for(let a=0;a2*Math.PI&&(m=0,g=2*Math.PI);let y=2*Math.PI/u.curveStepCount,v=Math.min(y/2,(g-m)/2),x=$Q(v,h,f,d,p,m,g,1,u);if(!u.disableMultiStroke){let b=$Q(v,h,f,d,p,m,g,1.5,u);x.push(...b)}return s&&(l?x.push(...jh(h,f,h+d*Math.cos(m),f+p*Math.sin(m),u),...jh(h,f,h+d*Math.cos(g),f+p*Math.sin(g),u)):x.push({op:"lineTo",data:[h,f]},{op:"lineTo",data:[h+d*Math.cos(m),f+p*Math.sin(m)]})),{type:"path",ops:x}}function PQ(t,e){let r=VQ(GQ(NL(t))),n=[],i=[0,0],a=[0,0];for(let{key:s,data:l}of r)switch(s){case"M":a=[l[0],l[1]],i=[l[0],l[1]];break;case"L":n.push(...jh(a[0],a[1],l[0],l[1],e)),a=[l[0],l[1]];break;case"C":{let[u,h,f,d,p,m]=l;n.push(...NDe(u,h,f,d,p,m,a,e)),a=[p,m];break}case"Z":n.push(...jh(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function xL(t,e){let r=[];for(let n of t)if(n.length){let i=e.maxRandomnessOffset||0,a=n.length;if(a>2){r.push({op:"move",data:[n[0][0]+ar(i,e),n[0][1]+ar(i,e)]});for(let s=1;s500?.4:-.0016668*u+1.233334;let f=i.maxRandomnessOffset||0;f*f*100>l&&(f=u/10);let d=f/2,p=.2+.2*qQ(i),m=i.bowing*i.maxRandomnessOffset*(n-e)/200,g=i.bowing*i.maxRandomnessOffset*(t-r)/200;m=ar(m,i,h),g=ar(g,i,h);let y=[],v=o(()=>ar(d,i,h),"M"),x=o(()=>ar(f,i,h),"k"),b=i.preserveVertices;return a&&(s?y.push({op:"move",data:[t+(b?0:v()),e+(b?0:v())]}):y.push({op:"move",data:[t+(b?0:ar(f,i,h)),e+(b?0:ar(f,i,h))]})),s?y.push({op:"bcurveTo",data:[m+t+(r-t)*p+v(),g+e+(n-e)*p+v(),m+t+2*(r-t)*p+v(),g+e+2*(n-e)*p+v(),r+(b?0:v()),n+(b?0:v())]}):y.push({op:"bcurveTo",data:[m+t+(r-t)*p+x(),g+e+(n-e)*p+x(),m+t+2*(r-t)*p+x(),g+e+2*(n-e)*p+x(),r+(b?0:x()),n+(b?0:x())]}),y}function XT(t,e,r){if(!t.length)return[];let n=[];n.push([t[0][0]+ar(e,r),t[0][1]+ar(e,r)]),n.push([t[0][0]+ar(e,r),t[0][1]+ar(e,r)]);for(let i=1;i3){let a=[],s=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let l=1;l+21&&i.push(l)):i.push(l),i.push(t[e+3])}else{let u=t[e+0],h=t[e+1],f=t[e+2],d=t[e+3],p=Hd(u,h,.5),m=Hd(h,f,.5),g=Hd(f,d,.5),y=Hd(p,m,.5),v=Hd(m,g,.5),x=Hd(y,v,.5);DL([u,p,y,x],0,r,i),DL([x,v,g,d],0,r,i)}var a,s;return i}function IDe(t,e){return ew(t,0,t.length,e)}function ew(t,e,r,n,i){let a=i||[],s=t[e],l=t[r-1],u=0,h=1;for(let f=e+1;fu&&(u=d,h=f)}return Math.sqrt(u)>n?(ew(t,e,h+1,n,a),ew(t,h,r,n,a)):(a.length||a.push(s),a.push(l)),a}function bL(t,e=.15,r){let n=[],i=(t.length-1)/3;for(let a=0;a0?ew(n,0,n.length,r):n}var _2,TL,wL,kL,EL,SL,Ps,CL,DDe,yL,MQ,YT,LDe,so,km,LL,jT,RL,je,Wt=N(()=>{"use strict";o(gL,"t");o(ADe,"e");o(_De,"s");o(D2,"n");_2=class{static{o(this,"o")}constructor(e){this.helper=e}fillPolygons(e,r){return this._fillPolygons(e,r)}_fillPolygons(e,r){let n=D2(e,r);return{type:"fillSketch",ops:this.renderLines(n,r)}}renderLines(e,r){let n=[];for(let i of e)n.push(...this.helper.doubleLineOps(i[0][0],i[0][1],i[1][0],i[1][1],r));return n}};o(tw,"a");TL=class extends _2{static{o(this,"h")}fillPolygons(e,r){let n=r.hachureGap;n<0&&(n=4*r.strokeWidth),n=Math.max(n,.1);let i=D2(e,Object.assign({},r,{hachureGap:n})),a=Math.PI/180*r.hachureAngle,s=[],l=.5*n*Math.cos(a),u=.5*n*Math.sin(a);for(let[h,f]of i)tw([h,f])&&s.push([[h[0]-l,h[1]+u],[...f]],[[h[0]+l,h[1]-u],[...f]]);return{type:"fillSketch",ops:this.renderLines(s,r)}}},wL=class extends _2{static{o(this,"r")}fillPolygons(e,r){let n=this._fillPolygons(e,r),i=Object.assign({},r,{hachureAngle:r.hachureAngle+90}),a=this._fillPolygons(e,i);return n.ops=n.ops.concat(a.ops),n}},kL=class{static{o(this,"i")}constructor(e){this.helper=e}fillPolygons(e,r){let n=D2(e,r=Object.assign({},r,{hachureAngle:0}));return this.dotsOnLines(n,r)}dotsOnLines(e,r){let n=[],i=r.hachureGap;i<0&&(i=4*r.strokeWidth),i=Math.max(i,.1);let a=r.fillWeight;a<0&&(a=r.strokeWidth/2);let s=i/4;for(let l of e){let u=tw(l),h=u/i,f=Math.ceil(h)-1,d=u-f*i,p=(l[0][0]+l[1][0])/2-i/4,m=Math.min(l[0][1],l[1][1]);for(let g=0;g{let l=tw(s),u=Math.floor(l/(n+i)),h=(l+i-u*(n+i))/2,f=s[0],d=s[1];f[0]>d[0]&&(f=s[1],d=s[0]);let p=Math.atan((d[1]-f[1])/(d[0]-f[0]));for(let m=0;m{let s=tw(a),l=Math.round(s/(2*r)),u=a[0],h=a[1];u[0]>h[0]&&(u=a[1],h=a[0]);let f=Math.atan((h[1]-u[1])/(h[0]-u[0]));for(let d=0;d2*Math.PI&&(_=0,C=2*Math.PI);let D=(C-_)/b.curveStepCount,O=[];for(let R=_;R<=C;R+=D)O.push([T+w*Math.cos(R),S+E*Math.sin(R)]);return O.push([T+w*Math.cos(C),S+E*Math.sin(C)]),O.push([T,S]),wm([O],b)}(e,r,n,i,a,s,h));return h.stroke!==so&&f.push(d),this._d("arc",f,h)}curve(e,r){let n=this._o(r),i=[],a=IQ(e,n);if(n.fill&&n.fill!==so)if(n.fillStyle==="solid"){let s=IQ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(s.ops)})}else{let s=[],l=e;if(l.length){let u=typeof l[0][0]=="number"?[l]:l;for(let h of u)h.length<3?s.push(...h):h.length===3?s.push(...bL(zQ([h[0],h[0],h[1],h[2]]),10,(1+n.roughness)/2)):s.push(...bL(zQ(h),10,(1+n.roughness)/2))}s.length&&i.push(wm([s],n))}return n.stroke!==so&&i.push(a),this._d("curve",i,n)}polygon(e,r){let n=this._o(r),i=[],a=KT(e,!0,n);return n.fill&&(n.fillStyle==="solid"?i.push(xL([e],n)):i.push(wm([e],n))),n.stroke!==so&&i.push(a),this._d("polygon",i,n)}path(e,r){let n=this._o(r),i=[];if(!e)return this._d("path",i,n);e=(e||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");let a=n.fill&&n.fill!=="transparent"&&n.fill!==so,s=n.stroke!==so,l=!!(n.simplification&&n.simplification<1),u=function(f,d,p){let m=VQ(GQ(NL(f))),g=[],y=[],v=[0,0],x=[],b=o(()=>{x.length>=4&&y.push(...bL(x,d)),x=[]},"i"),T=o(()=>{b(),y.length&&(g.push(y),y=[])},"c");for(let{key:w,data:E}of m)switch(w){case"M":T(),v=[E[0],E[1]],y.push(v);break;case"L":b(),y.push([E[0],E[1]]);break;case"C":if(!x.length){let _=y.length?y[y.length-1]:v;x.push([_[0],_[1]])}x.push([E[0],E[1]]),x.push([E[2],E[3]]),x.push([E[4],E[5]]);break;case"Z":b(),y.push([v[0],v[1]])}if(T(),!p)return g;let S=[];for(let w of g){let E=IDe(w,p);E.length&&S.push(E)}return S}(e,1,l?4-4*(n.simplification||1):(1+n.roughness)/2),h=PQ(e,n);if(a)if(n.fillStyle==="solid")if(u.length===1){let f=PQ(e,Object.assign(Object.assign({},n),{disableMultiStroke:!0,roughness:n.roughness?n.roughness+n.fillShapeRoughnessGain:0}));i.push({type:"fillPath",ops:this._mergedShape(f.ops)})}else i.push(xL(u,n));else i.push(wm(u,n));return s&&(l?u.forEach(f=>{i.push(KT(f,!1,n))}):i.push(h)),this._d("path",i,n)}opsToPath(e,r){let n="";for(let i of e.ops){let a=typeof r=="number"&&r>=0?i.data.map(s=>+s.toFixed(r)):i.data;switch(i.op){case"move":n+=`M${a[0]} ${a[1]} `;break;case"bcurveTo":n+=`C${a[0]} ${a[1]}, ${a[2]} ${a[3]}, ${a[4]} ${a[5]} `;break;case"lineTo":n+=`L${a[0]} ${a[1]} `}}return n.trim()}toPaths(e){let r=e.sets||[],n=e.options||this.defaultOptions,i=[];for(let a of r){let s=null;switch(a.type){case"path":s={d:this.opsToPath(a),stroke:n.stroke,strokeWidth:n.strokeWidth,fill:so};break;case"fillPath":s={d:this.opsToPath(a),stroke:so,strokeWidth:0,fill:n.fill||so};break;case"fillSketch":s=this.fillSketch(a,n)}s&&i.push(s)}return i}fillSketch(e,r){let n=r.fillWeight;return n<0&&(n=r.strokeWidth/2),{d:this.opsToPath(e),stroke:r.fill||so,strokeWidth:n,fill:so}}_mergedShape(e){return e.filter((r,n)=>n===0||r.op!=="move")}},LL=class{static{o(this,"st")}constructor(e,r){this.canvas=e,this.ctx=this.canvas.getContext("2d"),this.gen=new km(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.ctx,a=e.options.fixedDecimalPlaceDigits;for(let s of r)switch(s.type){case"path":i.save(),i.strokeStyle=n.stroke==="none"?"transparent":n.stroke,i.lineWidth=n.strokeWidth,n.strokeLineDash&&i.setLineDash(n.strokeLineDash),n.strokeLineDashOffset&&(i.lineDashOffset=n.strokeLineDashOffset),this._drawToContext(i,s,a),i.restore();break;case"fillPath":{i.save(),i.fillStyle=n.fill||"";let l=e.shape==="curve"||e.shape==="polygon"||e.shape==="path"?"evenodd":"nonzero";this._drawToContext(i,s,a,l),i.restore();break}case"fillSketch":this.fillSketch(i,s,n)}}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2),e.save(),n.fillLineDash&&e.setLineDash(n.fillLineDash),n.fillLineDashOffset&&(e.lineDashOffset=n.fillLineDashOffset),e.strokeStyle=n.fill||"",e.lineWidth=i,this._drawToContext(e,r,n.fixedDecimalPlaceDigits),e.restore()}_drawToContext(e,r,n,i="nonzero"){e.beginPath();for(let a of r.ops){let s=typeof n=="number"&&n>=0?a.data.map(l=>+l.toFixed(n)):a.data;switch(a.op){case"move":e.moveTo(s[0],s[1]);break;case"bcurveTo":e.bezierCurveTo(s[0],s[1],s[2],s[3],s[4],s[5]);break;case"lineTo":e.lineTo(s[0],s[1])}}r.type==="fillPath"?e.fill(i):e.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s),s}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s),s}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s),s}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a),a}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n),n}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n),n}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h),h}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n),n}path(e,r){let n=this.gen.path(e,r);return this.draw(n),n}},jT="http://www.w3.org/2000/svg",RL=class{static{o(this,"ot")}constructor(e,r){this.svg=e,this.gen=new km(r)}draw(e){let r=e.sets||[],n=e.options||this.getDefaultOptions(),i=this.svg.ownerDocument||window.document,a=i.createElementNS(jT,"g"),s=e.options.fixedDecimalPlaceDigits;for(let l of r){let u=null;switch(l.type){case"path":u=i.createElementNS(jT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke",n.stroke),u.setAttribute("stroke-width",n.strokeWidth+""),u.setAttribute("fill","none"),n.strokeLineDash&&u.setAttribute("stroke-dasharray",n.strokeLineDash.join(" ").trim()),n.strokeLineDashOffset&&u.setAttribute("stroke-dashoffset",`${n.strokeLineDashOffset}`);break;case"fillPath":u=i.createElementNS(jT,"path"),u.setAttribute("d",this.opsToPath(l,s)),u.setAttribute("stroke","none"),u.setAttribute("stroke-width","0"),u.setAttribute("fill",n.fill||""),e.shape!=="curve"&&e.shape!=="polygon"||u.setAttribute("fill-rule","evenodd");break;case"fillSketch":u=this.fillSketch(i,l,n)}u&&a.appendChild(u)}return a}fillSketch(e,r,n){let i=n.fillWeight;i<0&&(i=n.strokeWidth/2);let a=e.createElementNS(jT,"path");return a.setAttribute("d",this.opsToPath(r,n.fixedDecimalPlaceDigits)),a.setAttribute("stroke",n.fill||""),a.setAttribute("stroke-width",i+""),a.setAttribute("fill","none"),n.fillLineDash&&a.setAttribute("stroke-dasharray",n.fillLineDash.join(" ").trim()),n.fillLineDashOffset&&a.setAttribute("stroke-dashoffset",`${n.fillLineDashOffset}`),a}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(e,r){return this.gen.opsToPath(e,r)}line(e,r,n,i,a){let s=this.gen.line(e,r,n,i,a);return this.draw(s)}rectangle(e,r,n,i,a){let s=this.gen.rectangle(e,r,n,i,a);return this.draw(s)}ellipse(e,r,n,i,a){let s=this.gen.ellipse(e,r,n,i,a);return this.draw(s)}circle(e,r,n,i){let a=this.gen.circle(e,r,n,i);return this.draw(a)}linearPath(e,r){let n=this.gen.linearPath(e,r);return this.draw(n)}polygon(e,r){let n=this.gen.polygon(e,r);return this.draw(n)}arc(e,r,n,i,a,s,l=!1,u){let h=this.gen.arc(e,r,n,i,a,s,l,u);return this.draw(h)}curve(e,r){let n=this.gen.curve(e,r);return this.draw(n)}path(e,r){let n=this.gen.path(e,r);return this.draw(n)}},je={canvas:o((t,e)=>new LL(t,e),"canvas"),svg:o((t,e)=>new RL(t,e),"svg"),generator:o(t=>new km(t),"generator"),newSeed:o(()=>km.newSeed(),"newSeed")}});function YQ(t,e){let{labelStyles:r}=Ye(e);e.labelStyle=r;let n=ht(e),i=n;n||(i="anchor");let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=1,{cssStyles:l}=e,u=je.svg(a),h=Qe(e,{fill:"black",stroke:"none",fillStyle:"solid"});e.look!=="handDrawn"&&(h.roughness=0);let f=u.circle(0,0,s*2,h),d=a.insert(()=>f,":first-child");return d.attr("class","anchor").attr("style",zn(l)),Ke(e,d),e.intersect=function(p){return X.info("Circle intersect",e,s,p),Xe.circle(e,s,p)},a}var XQ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();er();o(YQ,"anchor")});function jQ(t,e,r,n,i,a,s){let u=(t+r)/2,h=(e+n)/2,f=Math.atan2(n-e,r-t),d=(r-t)/2,p=(n-e)/2,m=d/i,g=p/a,y=Math.sqrt(m**2+g**2);if(y>1)throw new Error("The given radii are too small to create an arc between the points.");let v=Math.sqrt(1-y**2),x=u+v*a*Math.sin(f)*(s?-1:1),b=h-v*i*Math.cos(f)*(s?-1:1),T=Math.atan2((e-b)/a,(t-x)/i),w=Math.atan2((n-b)/a,(r-x)/i)-T;s&&w<0&&(w+=2*Math.PI),!s&&w>0&&(w-=2*Math.PI);let E=[];for(let _=0;_<20;_++){let C=_/19,D=T+C*w,O=x+i*Math.cos(D),R=b+a*Math.sin(D);E.push({x:O,y:R})}return E}async function KQ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=a.width+e.padding+20,l=a.height+e.padding,u=l/2,h=u/(2.5+l/50),{cssStyles:f}=e,d=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...jQ(-s/2,-l/2,-s/2,l/2,h,u,!1),{x:s/2,y:l/2},...jQ(s/2,l/2,s/2,-l/2,h,u,!0)],p=je.svg(i),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Xt(d),y=p.path(g,m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(${h/2}, 0)`),Ke(e,v),e.intersect=function(x){return Xe.polygon(e,d,x)},i}var QQ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(jQ,"generateArcPoints");o(KQ,"bowTieRect")});function Ma(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Iu=N(()=>{"use strict";o(Ma,"insertPolygonShape")});async function ZQ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=a.height+e.padding,l=12,u=a.width+e.padding+l,h=0,f=u,d=-s,p=0,m=[{x:h+l,y:d},{x:f,y:d},{x:f,y:p},{x:h,y:p},{x:h,y:d+l},{x:h+l,y:d}],g,{cssStyles:y}=e;if(e.look==="handDrawn"){let v=je.svg(i),x=Qe(e,{}),b=Xt(m),T=v.path(b,x);g=i.insert(()=>T,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),y&&g.attr("style",y)}else g=Ma(i,u,s,m);return n&&g.attr("style",n),Ke(e,g),e.intersect=function(v){return Xe.polygon(e,m,v)},i}var JQ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();Ft();o(ZQ,"card")});function eZ(t,e){let{nodeStyles:r}=Ye(e);e.label="";let n=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:i}=e,a=Math.max(28,e.width??0),s=[{x:0,y:a/2},{x:a/2,y:0},{x:0,y:-a/2},{x:-a/2,y:0}],l=je.svg(n),u=Qe(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=Xt(s),f=l.path(h,u),d=n.insert(()=>f,":first-child");return i&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",i),r&&e.look!=="handDrawn"&&d.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(p){return Xe.polygon(e,s,p)},n}var tZ=N(()=>{"use strict";Ht();Wt();zt();Ft();o(eZ,"choice")});async function rZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await mt(t,e,ht(e)),l=a.width/2+s,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=je.svg(i),d=Qe(e,{}),p=f.circle(0,0,l*2,d);u=i.insert(()=>p,":first-child"),u.attr("class","basic label-container").attr("style",zn(h))}else u=i.insert("circle",":first-child").attr("class","basic label-container").attr("style",n).attr("r",l).attr("cx",0).attr("cy",0);return Ke(e,u),e.intersect=function(f){return X.info("Circle intersect",e,l,f),Xe.circle(e,l,f)},i}var nZ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();er();o(rZ,"circle")});function ODe(t){let e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=t*2,i={x:n/2*e,y:n/2*r},a={x:-(n/2)*e,y:n/2*r},s={x:-(n/2)*e,y:-(n/2)*r},l={x:n/2*e,y:-(n/2)*r};return`M ${a.x},${a.y} L ${l.x},${l.y} - M ${i.x},${i.y} L ${s.x},${s.y}`}function iZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r,e.label="";let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),a=Math.max(30,e?.width??0),{cssStyles:s}=e,l=je.svg(i),u=Qe(e,{});e.look!=="handDrawn"&&(u.roughness=0,u.fillStyle="solid");let h=l.circle(0,0,a*2,u),f=ODe(a),d=l.path(f,u),p=i.insert(()=>h,":first-child");return p.insert(()=>d),s&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",s),n&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",n),Ke(e,p),e.intersect=function(m){return X.info("crossedCircle intersect",e,{radius:a,point:m}),Xe.circle(e,a,m)},i}var aZ=N(()=>{"use strict";yt();Ft();zt();Wt();Ht();o(ODe,"createLine");o(iZ,"crossedCircle")});function Kh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${h}, 0)`),s.attr("transform",`translate(${-l/2+h-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Ke(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var oZ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(Kh,"generateCirclePoints");o(sZ,"curlyBraceLeft")});function Qh(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;dT,":first-child").attr("stroke-opacity",0),S.insert(()=>x,":first-child"),S.attr("class","text"),f&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${-h}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Ke(e,S),e.intersect=function(w){return Xe.polygon(e,p,w)},i}var cZ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(Qh,"generateCirclePoints");o(lZ,"curlyBraceRight")});function Ia(t,e,r,n=100,i=0,a=180){let s=[],l=i*Math.PI/180,f=(a*Math.PI/180-l)/(n-1);for(let d=0;d_,":first-child").attr("stroke-opacity",0),C.insert(()=>b,":first-child"),C.insert(()=>w,":first-child"),C.attr("class","text"),f&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",f),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(${h-h/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)/2-(a.y-(a.top??0))})`),Ke(e,C),e.intersect=function(D){return Xe.polygon(e,m,D)},i}var hZ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(Ia,"generateCirclePoints");o(uZ,"curlyBraces")});async function fZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=80,l=20,u=Math.max(s,(a.width+(e.padding??0)*2)*1.25,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=je.svg(i),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=u,y=h,v=g-f,x=y/4,b=[{x:v,y:0},{x,y:0},{x:0,y:y/2},{x,y},{x:v,y},...WT(-v,-y/2,f,50,270,90)],T=Xt(b),S=p.path(T,m),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&w.selectChildren("path").attr("style",n),w.attr("transform",`translate(${-u/2}, ${-h/2})`),Ke(e,w),e.intersect=function(E){return Xe.polygon(e,b,E)},i}var dZ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(fZ,"curvedTrapezoid")});async function pZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+e.padding,e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+e.padding,e.height??0),d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=je.svg(i),g=BDe(0,0,l,f,u,h),y=FDe(0,h,l,f,u,h),v=m.path(g,Qe(e,{})),x=m.path(y,Qe(e,{fill:"none"}));d=i.insert(()=>x,":first-child"),d=i.insert(()=>v,":first-child"),d.attr("class","basic label-container"),p&&d.attr("style",p)}else{let m=PDe(0,0,l,f,u,h);d=i.insert("path",":first-child").attr("d",m).attr("class","basic label-container").attr("style",zn(p)).attr("style",n)}return d.attr("label-offset-y",h),d.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Ke(e,d),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+(e.padding??0)/1.5-(a.y-(a.top??0))})`),e.intersect=function(m){let g=Xe.rect(e,m),y=g.x-(e.x??0);if(u!=0&&(Math.abs(y)<(e.width??0)/2||Math.abs(y)==(e.width??0)/2&&Math.abs(g.y-(e.y??0))>(e.height??0)/2-h)){let v=h*h*(1-y*y/(u*u));v>0&&(v=Math.sqrt(v)),v=h-v,m.y-(e.y??0)>0&&(v=-v),g.y+=v}return g},i}var PDe,BDe,FDe,mZ=N(()=>{"use strict";Ft();Ht();zt();Wt();er();PDe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createCylinderPathD"),BDe=o((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`].join(" "),"createOuterCylinderPathD"),FDe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(pZ,"cylinder")});async function gZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=a.width+e.padding,u=a.height+e.padding,h=u*.2,f=-l/2,d=-u/2-h/2,{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d+h},{x:-f,y:d+h},{x:-f,y:-d},{x:f,y:-d},{x:f,y:d},{x:-f,y:d},{x:-f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${f+(e.padding??0)/2-(a.x-(a.left??0))}, ${d+h+(e.padding??0)/2-(a.y-(a.top??0))})`),Ke(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var yZ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(gZ,"dividedRectangle")});async function vZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,halfPadding:s}=await mt(t,e,ht(e)),u=a.width/2+s+5,h=a.width/2+s,f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=je.svg(i),m=Qe(e,{roughness:.2,strokeWidth:2.5}),g=Qe(e,{roughness:.2,strokeWidth:1.5}),y=p.circle(0,0,u*2,m),v=p.circle(0,0,h*2,g);f=i.insert("g",":first-child"),f.attr("class",zn(e.cssClasses)).attr("style",zn(d)),f.node()?.appendChild(y),f.node()?.appendChild(v)}else{f=i.insert("g",":first-child");let p=f.insert("circle",":first-child"),m=f.insert("circle");f.attr("class","basic label-container").attr("style",n),p.attr("class","outer-circle").attr("style",n).attr("r",u).attr("cx",0).attr("cy",0),m.attr("class","inner-circle").attr("style",n).attr("r",h).attr("cx",0).attr("cy",0)}return Ke(e,f),e.intersect=function(p){return X.info("DoubleCircle intersect",e,u,p),Xe.circle(e,u,p)},i}var xZ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();er();o(vZ,"doublecircle")});function bZ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ye(e);e.label="",e.labelStyle=n;let a=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),s=7,{cssStyles:l}=e,u=je.svg(a),{nodeBorder:h}=r,f=Qe(e,{fillStyle:"solid"});e.look!=="handDrawn"&&(f.roughness=0);let d=u.circle(0,0,s*2,f),p=a.insert(()=>d,":first-child");return p.selectAll("path").attr("style",`fill: ${h} !important;`),l&&l.length>0&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",l),i&&e.look!=="handDrawn"&&p.selectAll("path").attr("style",i),Ke(e,p),e.intersect=function(m){return X.info("filledCircle intersect",e,{radius:s,point:m}),Xe.circle(e,s,m)},a}var TZ=N(()=>{"use strict";Wt();yt();Ht();zt();Ft();o(bZ,"filledCircle")});async function wZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=a.width+(e.padding??0),u=l+a.height,h=l+a.height,f=[{x:0,y:-u},{x:h,y:-u},{x:h/2,y:0}],{cssStyles:d}=e,p=je.svg(i),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=Xt(f),y=p.path(g,m),v=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`);return d&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),e.width=l,e.height=u,Ke(e,v),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${-u/2+(e.padding??0)/2+(a.y-(a.top??0))})`),e.intersect=function(x){return X.info("Triangle intersect",e,f,x),Xe.polygon(e,f,x)},i}var kZ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();Ft();o(wZ,"flippedTriangle")});function EZ(t,e,{dir:r,config:{state:n,themeVariables:i}}){let{nodeStyles:a}=Ye(e);e.label="";let s=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,u=Math.max(70,e?.width??0),h=Math.max(10,e?.height??0);r==="LR"&&(u=Math.max(10,e?.width??0),h=Math.max(70,e?.height??0));let f=-1*u/2,d=-1*h/2,p=je.svg(s),m=Qe(e,{stroke:i.lineColor,fill:i.lineColor});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=p.rectangle(f,d,u,h,m),y=s.insert(()=>g,":first-child");l&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",l),a&&e.look!=="handDrawn"&&y.selectAll("path").attr("style",a),Ke(e,y);let v=n?.padding??0;return e.width&&e.height&&(e.width+=v/2||0,e.height+=v/2||0),e.intersect=function(x){return Xe.rect(e,x)},s}var SZ=N(()=>{"use strict";Wt();Ht();zt();Ft();o(EZ,"forkJoin")});async function CZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let i=80,a=50,{shapeSvg:s,bbox:l}=await mt(t,e,ht(e)),u=Math.max(i,l.width+(e.padding??0)*2,e?.width??0),h=Math.max(a,l.height+(e.padding??0)*2,e?.height??0),f=h/2,{cssStyles:d}=e,p=je.svg(s),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-u/2,y:-h/2},{x:u/2-f,y:-h/2},...WT(-u/2+f,0,f,50,90,270),{x:u/2-f,y:h/2},{x:-u/2,y:h/2}],y=Xt(g),v=p.path(y,m),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),Ke(e,x),e.intersect=function(b){return X.info("Pill intersect",e,{radius:f,point:b}),Xe.polygon(e,g,b)},s}var AZ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();o(CZ,"halfRoundedRectangle")});async function _Z(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=4,l=a.height+e.padding,u=l/s,h=a.width+2*u+e.padding,f=[{x:u,y:0},{x:h-u,y:0},{x:h,y:-l/2},{x:h-u,y:-l},{x:u,y:-l},{x:0,y:-l/2}],d,{cssStyles:p}=e;if(e.look==="handDrawn"){let m=je.svg(i),g=Qe(e,{}),y=$De(0,0,h,l,u),v=m.path(y,g);d=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${l/2})`),p&&d.attr("style",p)}else d=Ma(i,h,l,f);return n&&d.attr("style",n),e.width=h,e.height=l,Ke(e,d),e.intersect=function(m){return Xe.polygon(e,f,m)},i}var $De,DZ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();$De=o((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");o(_Z,"hexagon")});async function LZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.label="",e.labelStyle=r;let{shapeSvg:i}=await mt(t,e,ht(e)),a=Math.max(30,e?.width??0),s=Math.max(30,e?.height??0),{cssStyles:l}=e,u=je.svg(i),h=Qe(e,{});e.look!=="handDrawn"&&(h.roughness=0,h.fillStyle="solid");let f=[{x:0,y:0},{x:a,y:0},{x:0,y:s},{x:a,y:s}],d=Xt(f),p=u.path(d,h),m=i.insert(()=>p,":first-child");return m.attr("class","basic label-container"),l&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",l),n&&e.look!=="handDrawn"&&m.selectChildren("path").attr("style",n),m.attr("transform",`translate(${-a/2}, ${-s/2})`),Ke(e,m),e.intersect=function(g){return X.info("Pill intersect",e,{points:f}),Xe.polygon(e,f,g)},i}var RZ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();o(LZ,"hourglass")});async function NZ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ye(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await mt(t,e,"icon-shape default"),p=e.pos==="t",m=l,g=l,{nodeBorder:y}=r,{stylesMap:v}=bc(e),x=-g/2,b=-m/2,T=e.label?8:0,S=je.svg(h),w=Qe(e,{stroke:"none",fill:"none"});e.look!=="handDrawn"&&(w.roughness=0,w.fillStyle="solid");let E=S.rectangle(x,b,g,m,w),_=Math.max(g,f.width),C=m+f.height+T,D=S.rectangle(-_/2,-C/2,_,C,{...w,fill:"transparent",stroke:"none"}),O=h.insert(()=>E,":first-child"),R=h.insert(()=>D);if(e.icon){let k=h.append("g");k.html(`${await Es(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let L=k.node().getBBox(),A=L.width,I=L.height,M=L.x,P=L.y;k.attr("transform",`translate(${-A/2-M},${p?f.height/2+T/2-I/2-P:-f.height/2-T/2-I/2-P})`),k.attr("style",`color: ${v.get("stroke")??y};`)}return d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${p?-C/2:C/2-f.height})`),O.attr("transform",`translate(0,${p?f.height/2+T/2:-f.height/2-T/2})`),Ke(e,R),e.intersect=function(k){if(X.info("iconSquare intersect",e,k),!e.label)return Xe.rect(e,k);let L=e.x??0,A=e.y??0,I=e.height??0,M=[];return p?M=[{x:L-f.width/2,y:A-I/2},{x:L+f.width/2,y:A-I/2},{x:L+f.width/2,y:A-I/2+f.height+T},{x:L+g/2,y:A-I/2+f.height+T},{x:L+g/2,y:A+I/2},{x:L-g/2,y:A+I/2},{x:L-g/2,y:A-I/2+f.height+T},{x:L-f.width/2,y:A-I/2+f.height+T}]:M=[{x:L-g/2,y:A-I/2},{x:L+g/2,y:A-I/2},{x:L+g/2,y:A-I/2+m},{x:L+f.width/2,y:A-I/2+m},{x:L+f.width/2/2,y:A+I/2},{x:L-f.width/2,y:A+I/2},{x:L-f.width/2,y:A-I/2+m},{x:L-g/2,y:A-I/2+m}],Xe.polygon(e,M,k)},h}var MZ=N(()=>{"use strict";Wt();yt();jl();Ht();zt();Ft();o(NZ,"icon")});async function IZ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ye(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,label:d}=await mt(t,e,"icon-shape default"),p=20,m=e.label?8:0,g=e.pos==="t",{nodeBorder:y,mainBkg:v}=r,{stylesMap:x}=bc(e),b=je.svg(h),T=Qe(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=x.get("fill");T.stroke=S??v;let w=h.append("g");e.icon&&w.html(`${await Es(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let E=w.node().getBBox(),_=E.width,C=E.height,D=E.x,O=E.y,R=Math.max(_,C)*Math.SQRT2+p*2,k=b.circle(0,0,R,T),L=Math.max(R,f.width),A=R+f.height+m,I=b.rectangle(-L/2,-A/2,L,A,{...T,fill:"transparent",stroke:"none"}),M=h.insert(()=>k,":first-child"),P=h.insert(()=>I);return w.attr("transform",`translate(${-_/2-D},${g?f.height/2+m/2-C/2-O:-f.height/2-m/2-C/2-O})`),w.attr("style",`color: ${x.get("stroke")??y};`),d.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${g?-A/2:A/2-f.height})`),M.attr("transform",`translate(0,${g?f.height/2+m/2:-f.height/2-m/2})`),Ke(e,P),e.intersect=function(B){return X.info("iconSquare intersect",e,B),Xe.rect(e,B)},h}var OZ=N(()=>{"use strict";Wt();yt();jl();Ht();zt();Ft();o(IZ,"iconCircle")});var Oa,Zh=N(()=>{"use strict";Oa=o((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD")});async function PZ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ye(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await mt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=bc(e),T=-y/2,S=-g/2,w=e.label?8:0,E=je.svg(h),_=Qe(e,{});e.look!=="handDrawn"&&(_.roughness=0,_.fillStyle="solid");let C=b.get("fill");_.stroke=C??x;let D=E.path(Oa(T,S,y,g,5),_),O=Math.max(y,f.width),R=g+f.height+w,k=E.rectangle(-O/2,-R/2,O,R,{..._,fill:"transparent",stroke:"none"}),L=h.insert(()=>D,":first-child").attr("class","icon-shape2"),A=h.insert(()=>k);if(e.icon){let I=h.append("g");I.html(`${await Es(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=I.node().getBBox(),P=M.width,B=M.height,F=M.x,z=M.y;I.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-z:-f.height/2-w/2-B/2-z})`),I.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-R/2:R/2-f.height})`),L.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Ke(e,A),e.intersect=function(I){if(X.info("iconSquare intersect",e,I),!e.label)return Xe.rect(e,I);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,I)},h}var BZ=N(()=>{"use strict";Wt();yt();jl();Ht();zt();Zh();Ft();o(PZ,"iconRounded")});async function FZ(t,e,{config:{themeVariables:r,flowchart:n}}){let{labelStyles:i}=Ye(e);e.labelStyle=i;let a=e.assetHeight??48,s=e.assetWidth??48,l=Math.max(a,s),u=n?.wrappingWidth;e.width=Math.max(l,u??0);let{shapeSvg:h,bbox:f,halfPadding:d,label:p}=await mt(t,e,"icon-shape default"),m=e.pos==="t",g=l+d*2,y=l+d*2,{nodeBorder:v,mainBkg:x}=r,{stylesMap:b}=bc(e),T=-y/2,S=-g/2,w=e.label?8:0,E=je.svg(h),_=Qe(e,{});e.look!=="handDrawn"&&(_.roughness=0,_.fillStyle="solid");let C=b.get("fill");_.stroke=C??x;let D=E.path(Oa(T,S,y,g,.1),_),O=Math.max(y,f.width),R=g+f.height+w,k=E.rectangle(-O/2,-R/2,O,R,{..._,fill:"transparent",stroke:"none"}),L=h.insert(()=>D,":first-child"),A=h.insert(()=>k);if(e.icon){let I=h.append("g");I.html(`${await Es(e.icon,{height:l,width:l,fallbackPrefix:""})}`);let M=I.node().getBBox(),P=M.width,B=M.height,F=M.x,z=M.y;I.attr("transform",`translate(${-P/2-F},${m?f.height/2+w/2-B/2-z:-f.height/2-w/2-B/2-z})`),I.attr("style",`color: ${b.get("stroke")??v};`)}return p.attr("transform",`translate(${-f.width/2-(f.x-(f.left??0))},${m?-R/2:R/2-f.height})`),L.attr("transform",`translate(0,${m?f.height/2+w/2:-f.height/2-w/2})`),Ke(e,A),e.intersect=function(I){if(X.info("iconSquare intersect",e,I),!e.label)return Xe.rect(e,I);let M=e.x??0,P=e.y??0,B=e.height??0,F=[];return m?F=[{x:M-f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2},{x:M+f.width/2,y:P-B/2+f.height+w},{x:M+y/2,y:P-B/2+f.height+w},{x:M+y/2,y:P+B/2},{x:M-y/2,y:P+B/2},{x:M-y/2,y:P-B/2+f.height+w},{x:M-f.width/2,y:P-B/2+f.height+w}]:F=[{x:M-y/2,y:P-B/2},{x:M+y/2,y:P-B/2},{x:M+y/2,y:P-B/2+g},{x:M+f.width/2,y:P-B/2+g},{x:M+f.width/2/2,y:P+B/2},{x:M-f.width/2,y:P+B/2},{x:M-f.width/2,y:P-B/2+g},{x:M-y/2,y:P-B/2+g}],Xe.polygon(e,F,I)},h}var $Z=N(()=>{"use strict";Wt();yt();jl();Ht();Zh();zt();Ft();o(FZ,"iconSquare")});async function zZ(t,e,{config:{flowchart:r}}){let n=new Image;n.src=e?.img??"",await n.decode();let i=Number(n.naturalWidth.toString().replace("px","")),a=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=i/a;let{labelStyles:s}=Ye(e);e.labelStyle=s;let l=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;let u=Math.max(e.label?l??0:0,e?.assetWidth??i),h=e.constraint==="on"&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:u,f=e.constraint==="on"?h/e.imageAspectRatio:e?.assetHeight??a;e.width=Math.max(h,l??0);let{shapeSvg:d,bbox:p,label:m}=await mt(t,e,"image-shape default"),g=e.pos==="t",y=-h/2,v=-f/2,x=e.label?8:0,b=je.svg(d),T=Qe(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(y,v,h,f,T),w=Math.max(h,p.width),E=f+p.height+x,_=b.rectangle(-w/2,-E/2,w,E,{...T,fill:"none",stroke:"none"}),C=d.insert(()=>S,":first-child"),D=d.insert(()=>_);if(e.img){let O=d.append("image");O.attr("href",e.img),O.attr("width",h),O.attr("height",f),O.attr("preserveAspectRatio","none"),O.attr("transform",`translate(${-h/2},${g?E/2-f:-E/2})`)}return m.attr("transform",`translate(${-p.width/2-(p.x-(p.left??0))},${g?-f/2-p.height/2-x/2:f/2-p.height/2+x/2})`),C.attr("transform",`translate(0,${g?p.height/2+x/2:-p.height/2-x/2})`),Ke(e,D),e.intersect=function(O){if(X.info("iconSquare intersect",e,O),!e.label)return Xe.rect(e,O);let R=e.x??0,k=e.y??0,L=e.height??0,A=[];return g?A=[{x:R-p.width/2,y:k-L/2},{x:R+p.width/2,y:k-L/2},{x:R+p.width/2,y:k-L/2+p.height+x},{x:R+h/2,y:k-L/2+p.height+x},{x:R+h/2,y:k+L/2},{x:R-h/2,y:k+L/2},{x:R-h/2,y:k-L/2+p.height+x},{x:R-p.width/2,y:k-L/2+p.height+x}]:A=[{x:R-h/2,y:k-L/2},{x:R+h/2,y:k-L/2},{x:R+h/2,y:k-L/2+f},{x:R+p.width/2,y:k-L/2+f},{x:R+p.width/2/2,y:k+L/2},{x:R-p.width/2,y:k+L/2},{x:R-p.width/2,y:k-L/2+f},{x:R-h/2,y:k-L/2+f}],Xe.polygon(e,A,O)},d}var GZ=N(()=>{"use strict";Wt();yt();Ht();zt();Ft();o(zZ,"imageSquare")});async function VZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=je.svg(i),p=Qe(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ma(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Ke(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var UZ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();o(VZ,"inv_trapezoid")});async function Ou(t,e,r){let{labelStyles:n,nodeStyles:i}=Ye(e);e.labelStyle=n;let{shapeSvg:a,bbox:s}=await mt(t,e,ht(e)),l=Math.max(s.width+r.labelPaddingX*2,e?.width||0),u=Math.max(s.height+r.labelPaddingY*2,e?.height||0),h=-l/2,f=-u/2,d,{rx:p,ry:m}=e,{cssStyles:g}=e;if(r?.rx&&r.ry&&(p=r.rx,m=r.ry),e.look==="handDrawn"){let y=je.svg(a),v=Qe(e,{}),x=p||m?y.path(Oa(h,f,l,u,p||0),v):y.rectangle(h,f,l,u,v);d=a.insert(()=>x,":first-child"),d.attr("class","basic label-container").attr("style",zn(g))}else d=a.insert("rect",":first-child"),d.attr("class","basic label-container").attr("style",i).attr("rx",zn(p)).attr("ry",zn(m)).attr("x",h).attr("y",f).attr("width",l).attr("height",u);return Ke(e,d),e.intersect=function(y){return Xe.rect(e,y)},a}var Em=N(()=>{"use strict";Ft();Ht();Zh();zt();Wt();er();o(Ou,"drawRect")});async function HZ(t,e){let{shapeSvg:r,bbox:n,label:i}=await mt(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-(n.width/2)-(n.x-(n.left??0))}, ${-(n.height/2)-(n.y-(n.top??0))})`),Ke(e,a),e.intersect=function(u){return Xe.rect(e,u)},r}var WZ=N(()=>{"use strict";Em();Ft();Ht();o(HZ,"labelRect")});async function qZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-(3*l)/6,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=je.svg(i),p=Qe(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ma(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Ke(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var YZ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();o(qZ,"lean_left")});async function XZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0),e?.width??0),l=Math.max(a.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=je.svg(i),p=Qe(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ma(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Ke(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var jZ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();o(XZ,"lean_right")});function KZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.label="",e.labelStyle=r;let i=t.insert("g").attr("class",ht(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,s=Math.max(35,e?.width??0),l=Math.max(35,e?.height??0),u=7,h=[{x:s,y:0},{x:0,y:l+u/2},{x:s-2*u,y:l+u/2},{x:0,y:2*l},{x:s,y:l-u/2},{x:2*u,y:l-u/2}],f=je.svg(i),d=Qe(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=Xt(h),m=f.path(p,d),g=i.insert(()=>m,":first-child");return a&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",a),n&&e.look!=="handDrawn"&&g.selectAll("path").attr("style",n),g.attr("transform",`translate(-${s/2},${-l})`),Ke(e,g),e.intersect=function(y){return X.info("lightningBolt intersect",e,y),Xe.polygon(e,h,y)},i}var QZ=N(()=>{"use strict";yt();Ft();zt();Wt();Ht();Ft();o(KZ,"lightningBolt")});async function ZZ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e.width??0),u=l/2,h=u/(2.5+l/50),f=Math.max(a.height+h+(e.padding??0),e.height??0),d=f*.1,p,{cssStyles:m}=e;if(e.look==="handDrawn"){let g=je.svg(i),y=GDe(0,0,l,f,u,h,d),v=VDe(0,h,l,f,u,h),x=Qe(e,{}),b=g.path(y,x),T=g.path(v,x);i.insert(()=>T,":first-child").attr("class","line"),p=i.insert(()=>b,":first-child"),p.attr("class","basic label-container"),m&&p.attr("style",m)}else{let g=zDe(0,0,l,f,u,h,d);p=i.insert("path",":first-child").attr("d",g).attr("class","basic label-container").attr("style",zn(m)).attr("style",n)}return p.attr("label-offset-y",h),p.attr("transform",`translate(${-l/2}, ${-(f/2+h)})`),Ke(e,p),s.attr("transform",`translate(${-(a.width/2)-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),e.intersect=function(g){let y=Xe.rect(e,g),v=y.x-(e.x??0);if(u!=0&&(Math.abs(v)<(e.width??0)/2||Math.abs(v)==(e.width??0)/2&&Math.abs(y.y-(e.y??0))>(e.height??0)/2-h)){let x=h*h*(1-v*v/(u*u));x>0&&(x=Math.sqrt(x)),x=h-x,g.y-(e.y??0)>0&&(x=-x),y.y+=x}return y},i}var zDe,GDe,VDe,JZ=N(()=>{"use strict";Ft();Ht();zt();Wt();er();zDe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),GDe=o((t,e,r,n,i,a,s)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,`l0,${-n}`,`M${t},${e+a+s}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),VDe=o((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");o(ZZ,"linedCylinder")});async function eJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,{cssStyles:d}=e,p=je.svg(i),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:-l/2-l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:f/2},...Go(-l/2-l/2*.1,f/2,l/2+l/2*.1,f/2,h,.8),{x:l/2+l/2*.1,y:-f/2},{x:-l/2-l/2*.1,y:-f/2},{x:-l/2,y:-f/2},{x:-l/2,y:f/2*1.1},{x:-l/2,y:-f/2}],y=p.polygon(g.map(x=>[x.x,x.y]),m),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&v.selectAll("path").attr("style",n),v.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Ke(e,v),e.intersect=function(x){return Xe.polygon(e,g,x)},i}var tJ=N(()=>{"use strict";Ft();Ht();Wt();zt();o(eJ,"linedWaveEdgedRect")});async function rJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{}),y=[{x:f-h,y:d+h},{x:f-h,y:d+u+h},{x:f+l-h,y:d+u+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d+u-h},{x:f+l+h,y:d+u-h},{x:f+l+h,y:d-h},{x:f+h,y:d-h},{x:f+h,y:d},{x:f,y:d},{x:f,y:d+h}],v=[{x:f,y:d+h},{x:f+l-h,y:d+h},{x:f+l-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d},{x:f,y:d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Xt(y),b=m.path(x,g),T=Xt(v),S=m.path(T,{...g,fill:"none"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)-h-(a.x-(a.left??0))}, ${-(a.height/2)+h-(a.y-(a.top??0))})`),Ke(e,w),e.intersect=function(E){return Xe.polygon(e,y,E)},i}var nJ=N(()=>{"use strict";Ft();zt();Wt();Ht();o(rJ,"multiRect")});async function iJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=u+h,d=-l/2,p=-f/2,m=5,{cssStyles:g}=e,y=Go(d-m,p+f+m,d+l-m,p+f+m,h,.8),v=y?.[y.length-1],x=[{x:d-m,y:p+m},{x:d-m,y:p+f+m},...y,{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:v.y-2*m},{x:d+l+m,y:v.y-2*m},{x:d+l+m,y:p-m},{x:d+m,y:p-m},{x:d+m,y:p},{x:d,y:p},{x:d,y:p+m}],b=[{x:d,y:p+m},{x:d+l-m,y:p+m},{x:d+l-m,y:v.y-m},{x:d+l,y:v.y-m},{x:d+l,y:p},{x:d,y:p}],T=je.svg(i),S=Qe(e,{});e.look!=="handDrawn"&&(S.roughness=0,S.fillStyle="solid");let w=Xt(x),E=T.path(w,S),_=Xt(b),C=T.path(_,S),D=i.insert(()=>E,":first-child");return D.insert(()=>C),D.attr("class","basic label-container"),g&&e.look!=="handDrawn"&&D.selectAll("path").attr("style",g),n&&e.look!=="handDrawn"&&D.selectAll("path").attr("style",n),D.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-(a.width/2)-m-(a.x-(a.left??0))}, ${-(a.height/2)+m-h/2-(a.y-(a.top??0))})`),Ke(e,D),e.intersect=function(O){return Xe.polygon(e,x,O)},i}var aJ=N(()=>{"use strict";Ft();Ht();Wt();zt();o(iJ,"multiWaveEdgedRectangle")});async function sJ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ye(e);e.labelStyle=n,e.useHtmlLabels||tr().flowchart?.htmlLabels!==!1||(e.centerLabel=!0);let{shapeSvg:s,bbox:l,label:u}=await mt(t,e,ht(e)),h=Math.max(l.width+(e.padding??0)*2,e?.width??0),f=Math.max(l.height+(e.padding??0)*2,e?.height??0),d=-h/2,p=-f/2,{cssStyles:m}=e,g=je.svg(s),y=Qe(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=g.rectangle(d,p,h,f,y),x=s.insert(()=>v,":first-child");return x.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",m),i&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",i),u.attr("transform",`translate(${-l.width/2-(l.x-(l.left??0))}, ${-(l.height/2)-(l.y-(l.top??0))})`),Ke(e,x),e.intersect=function(b){return Xe.rect(e,b)},s}var oJ=N(()=>{"use strict";Wt();Ht();zt();Ft();mi();o(sJ,"note")});async function lJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=s+l,h=[{x:u/2,y:0},{x:u,y:-u/2},{x:u/2,y:-u},{x:0,y:-u/2}],f,{cssStyles:d}=e;if(e.look==="handDrawn"){let p=je.svg(i),m=Qe(e,{}),g=UDe(0,0,u),y=p.path(g,m);f=i.insert(()=>y,":first-child").attr("transform",`translate(${-u/2}, ${u/2})`),d&&f.attr("style",d)}else f=Ma(i,u,u,h);return n&&f.attr("style",n),Ke(e,f),e.intersect=function(p){return X.debug(`APA12 Intersect called SPLIT -point:`,p,` -node: -`,e,` -res:`,Xe.polygon(e,h,p)),Xe.polygon(e,h,p)},i}var UDe,cJ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();Iu();UDe=o((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");o(lJ,"question")});async function uJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0),e?.width??0),u=Math.max(a.height+(e.padding??0),e?.height??0),h=-l/2,f=-u/2,d=f/2,p=[{x:h+d,y:f},{x:h,y:0},{x:h+d,y:-f},{x:-h,y:-f},{x:-h,y:f}],{cssStyles:m}=e,g=je.svg(i),y=Qe(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=Xt(p),x=g.path(v,y),b=i.insert(()=>x,":first-child");return b.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(${-d/2},0)`),s.attr("transform",`translate(${-d/2-a.width/2-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Ke(e,b),e.intersect=function(T){return Xe.polygon(e,p,T)},i}var hJ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(uJ,"rect_left_inv_arrow")});function HDe(t,e){e&&t.attr("style",e)}async function WDe(t){let e=Ge(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label;t.label&&yi(t.label)&&(n=await Th(t.label.replace(Ze.lineBreakRegex,` -`),me()));let i=t.isNode?"nodeLabel":"edgeLabel";return r.html('"+n+""),HDe(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var qDe,Tc,rw=N(()=>{"use strict";fr();yt();Gt();pr();er();o(HDe,"applyStyle");o(WDe,"addHtmlLabel");qDe=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),dr(me().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),X.info("vertexText"+i);let a={isNode:n,label:na(i).replace(/fa[blrs]?:fa-[\w-]+/g,l=>``),labelStyle:e&&e.replace("fill:","color:")};return await WDe(a)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),Tc=qDe});async function fJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let i;e.cssClasses?i="node "+e.cssClasses:i="node default";let a=t.insert("g").attr("class",i).attr("id",e.domId||e.id),s=a.insert("g"),l=a.insert("g").attr("class","label").attr("style",n),u=e.description,h=e.label,f=l.node().appendChild(await Tc(h,e.labelStyle,!0,!0)),d={width:0,height:0};if(dr(me()?.flowchart?.htmlLabels)){let C=f.children[0],D=Ge(f);d=C.getBoundingClientRect(),D.attr("width",d.width),D.attr("height",d.height)}X.info("Text 2",u);let p=u||[],m=f.getBBox(),g=l.node().appendChild(await Tc(p.join?p.join("
    "):p,e.labelStyle,!0,!0)),y=g.children[0],v=Ge(g);d=y.getBoundingClientRect(),v.attr("width",d.width),v.attr("height",d.height);let x=(e.padding||0)/2;Ge(g).attr("transform","translate( "+(d.width>m.width?0:(m.width-d.width)/2)+", "+(m.height+x+5)+")"),Ge(f).attr("transform","translate( "+(d.width(X.debug("Rough node insert CXC",O),R),":first-child"),E=a.insert(()=>(X.debug("Rough node insert CXC",O),O),":first-child")}else E=s.insert("rect",":first-child"),_=s.insert("line"),E.attr("class","outer title-state").attr("style",n).attr("x",-d.width/2-x).attr("y",-d.height/2-x).attr("width",d.width+(e.padding||0)).attr("height",d.height+(e.padding||0)),_.attr("class","divider").attr("x1",-d.width/2-x).attr("x2",d.width/2+x).attr("y1",-d.height/2-x+m.height+x).attr("y2",-d.height/2-x+m.height+x);return Ke(e,E),e.intersect=function(C){return Xe.rect(e,C)},a}var dJ=N(()=>{"use strict";fr();pr();Ft();rw();Ht();zt();Wt();Gt();Zh();yt();o(fJ,"rectWithTitle")});async function pJ(t,e){let r={rx:5,ry:5,classes:"",labelPaddingX:(e?.padding||0)*1,labelPaddingY:(e?.padding||0)*1};return Ou(t,e,r)}var mJ=N(()=>{"use strict";Em();o(pJ,"roundedRect")});async function gJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=e?.padding??0,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=-a.width/2-l,d=-a.height/2-l,{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=[{x:f,y:d},{x:f+u+8,y:d},{x:f+u+8,y:d+h},{x:f-8,y:d+h},{x:f-8,y:d},{x:f,y:d},{x:f,y:d+h}],v=m.polygon(y.map(b=>[b.x,b.y]),g),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container").attr("style",zn(p)),n&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),p&&e.look!=="handDrawn"&&x.selectAll("path").attr("style",n),s.attr("transform",`translate(${-u/2+4+(e.padding??0)-(a.x-(a.left??0))},${-h/2+(e.padding??0)-(a.y-(a.top??0))})`),Ke(e,x),e.intersect=function(b){return Xe.rect(e,b)},i}var yJ=N(()=>{"use strict";Ft();Ht();zt();Wt();er();o(gJ,"shadedProcess")});async function vJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=-l/2,f=-u/2,{cssStyles:d}=e,p=je.svg(i),m=Qe(e,{});e.look!=="handDrawn"&&(m.roughness=0,m.fillStyle="solid");let g=[{x:h,y:f},{x:h,y:f+u},{x:h+l,y:f+u},{x:h+l,y:f-u/2}],y=Xt(g),v=p.path(y,m),x=i.insert(()=>v,":first-child");return x.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",d),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),x.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))}, ${-u/4+(e.padding??0)-(a.y-(a.top??0))})`),Ke(e,x),e.intersect=function(b){return Xe.polygon(e,g,b)},i}var xJ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(vJ,"slopedRect")});async function bJ(t,e){let r={rx:0,ry:0,classes:"",labelPaddingX:(e?.padding||0)*2,labelPaddingY:(e?.padding||0)*1};return Ou(t,e,r)}var TJ=N(()=>{"use strict";Em();o(bJ,"squareRect")});async function wJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=a.height+e.padding,l=a.width+s/4+e.padding,u,{cssStyles:h}=e;if(e.look==="handDrawn"){let f=je.svg(i),d=Qe(e,{}),p=Oa(-l/2,-s/2,l,s,s/2),m=f.path(p,d);u=i.insert(()=>m,":first-child"),u.attr("class","basic label-container").attr("style",zn(h))}else u=i.insert("rect",":first-child"),u.attr("class","basic label-container").attr("style",n).attr("rx",s/2).attr("ry",s/2).attr("x",-l/2).attr("y",-s/2).attr("width",l).attr("height",s);return Ke(e,u),e.intersect=function(f){return Xe.rect(e,f)},i}var kJ=N(()=>{"use strict";Ft();Ht();zt();Wt();Zh();er();o(wJ,"stadium")});async function EJ(t,e){return Ou(t,e,{rx:5,ry:5,classes:"flowchart-node"})}var SJ=N(()=>{"use strict";Em();o(EJ,"state")});function CJ(t,e,{config:{themeVariables:r}}){let{labelStyles:n,nodeStyles:i}=Ye(e);e.labelStyle=n;let{cssStyles:a}=e,{lineColor:s,stateBorder:l,nodeBorder:u}=r,h=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),f=je.svg(h),d=Qe(e,{});e.look!=="handDrawn"&&(d.roughness=0,d.fillStyle="solid");let p=f.circle(0,0,14,{...d,stroke:s,strokeWidth:2}),m=l??u,g=f.circle(0,0,5,{...d,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),y=h.insert(()=>p,":first-child");return y.insert(()=>g),a&&y.selectAll("path").attr("style",a),i&&y.selectAll("path").attr("style",i),Ke(e,y),e.intersect=function(v){return Xe.circle(e,7,v)},h}var AJ=N(()=>{"use strict";Wt();Ht();zt();Ft();o(CJ,"stateEnd")});function _J(t,e,{config:{themeVariables:r}}){let{lineColor:n}=r,i=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a;if(e.look==="handDrawn"){let l=je.svg(i).circle(0,0,14,NQ(n));a=i.insert(()=>l),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else a=i.insert("circle",":first-child"),a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return Ke(e,a),e.intersect=function(s){return Xe.circle(e,7,s)},i}var DJ=N(()=>{"use strict";Wt();Ht();zt();Ft();o(_J,"stateStart")});async function LJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=(e?.padding||0)/2,l=a.width+e.padding,u=a.height+e.padding,h=-a.width/2-s,f=-a.height/2-s,d=[{x:0,y:0},{x:l,y:0},{x:l,y:-u},{x:0,y:-u},{x:0,y:0},{x:-8,y:0},{x:l+8,y:0},{x:l+8,y:-u},{x:-8,y:-u},{x:-8,y:0}];if(e.look==="handDrawn"){let p=je.svg(i),m=Qe(e,{}),g=p.rectangle(h-8,f,l+16,u,m),y=p.line(h,f,h,f+u,m),v=p.line(h+l,f,h+l,f+u,m);i.insert(()=>y,":first-child"),i.insert(()=>v,":first-child");let x=i.insert(()=>g,":first-child"),{cssStyles:b}=e;x.attr("class","basic label-container").attr("style",zn(b)),Ke(e,x)}else{let p=Ma(i,l,u,d);n&&p.attr("style",n),Ke(e,p)}return e.intersect=function(p){return Xe.polygon(e,d,p)},i}var RJ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();er();o(LJ,"subroutine")});async function NJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=Math.max(a.width+(e.padding??0)*2,e?.width??0),l=Math.max(a.height+(e.padding??0)*2,e?.height??0),u=-s/2,h=-l/2,f=.2*l,d=.2*l,{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{}),y=[{x:u-f/2,y:h},{x:u+s+f/2,y:h},{x:u+s+f/2,y:h+l},{x:u-f/2,y:h+l}],v=[{x:u+s-f/2,y:h+l},{x:u+s+f/2,y:h+l},{x:u+s+f/2,y:h+l-d}];e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=Xt(y),b=m.path(x,g),T=Xt(v),S=m.path(T,{...g,fillStyle:"solid"}),w=i.insert(()=>S,":first-child");return w.insert(()=>b,":first-child"),w.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Ke(e,w),e.intersect=function(E){return Xe.polygon(e,y,E)},i}var MJ=N(()=>{"use strict";Ft();zt();Wt();Ht();o(NJ,"taggedRect")});async function IJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/4,f=.2*l,d=.2*u,p=u+h,{cssStyles:m}=e,g=je.svg(i),y=Qe(e,{});e.look!=="handDrawn"&&(y.roughness=0,y.fillStyle="solid");let v=[{x:-l/2-l/2*.1,y:p/2},...Go(-l/2-l/2*.1,p/2,l/2+l/2*.1,p/2,h,.8),{x:l/2+l/2*.1,y:-p/2},{x:-l/2-l/2*.1,y:-p/2}],x=-l/2+l/2*.1,b=-p/2-d*.4,T=[{x:x+l-f,y:(b+u)*1.4},{x:x+l,y:b+u-d},{x:x+l,y:(b+u)*.9},...Go(x+l,(b+u)*1.3,x+l-f,(b+u)*1.5,-u*.03,.5)],S=Xt(v),w=g.path(S,y),E=Xt(T),_=g.path(E,{...y,fillStyle:"solid"}),C=i.insert(()=>_,":first-child");return C.insert(()=>w,":first-child"),C.attr("class","basic label-container"),m&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",m),n&&e.look!=="handDrawn"&&C.selectAll("path").attr("style",n),C.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h/2-(a.y-(a.top??0))})`),Ke(e,C),e.intersect=function(D){return Xe.polygon(e,v,D)},i}var OJ=N(()=>{"use strict";Ft();Ht();Wt();zt();o(IJ,"taggedWaveEdgedRectangle")});async function PJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=Math.max(a.width+e.padding,e?.width||0),l=Math.max(a.height+e.padding,e?.height||0),u=-s/2,h=-l/2,f=i.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",u).attr("y",h).attr("width",s).attr("height",l),Ke(e,f),e.intersect=function(d){return Xe.rect(e,d)},i}var BJ=N(()=>{"use strict";Ft();Ht();zt();o(PJ,"text")});async function FJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s,halfPadding:l}=await mt(t,e,ht(e)),u=e.look==="neo"?l*2:l,h=a.height+u,f=h/2,d=f/(2.5+h/50),p=a.width+d+u,{cssStyles:m}=e,g;if(e.look==="handDrawn"){let y=je.svg(i),v=XDe(0,0,p,h,d,f),x=jDe(0,0,p,h,d,f),b=y.path(v,Qe(e,{})),T=y.path(x,Qe(e,{fill:"none"}));g=i.insert(()=>T,":first-child"),g=i.insert(()=>b,":first-child"),g.attr("class","basic label-container"),m&&g.attr("style",m)}else{let y=YDe(0,0,p,h,d,f);g=i.insert("path",":first-child").attr("d",y).attr("class","basic label-container").attr("style",zn(m)).attr("style",n),g.attr("class","basic label-container"),m&&g.selectAll("path").attr("style",m),n&&g.selectAll("path").attr("style",n)}return g.attr("label-offset-x",d),g.attr("transform",`translate(${-p/2}, ${h/2} )`),s.attr("transform",`translate(${-(a.width/2)-d-(a.x-(a.left??0))}, ${-(a.height/2)-(a.y-(a.top??0))})`),Ke(e,g),e.intersect=function(y){let v=Xe.rect(e,y),x=v.y-(e.y??0);if(f!=0&&(Math.abs(x)<(e.height??0)/2||Math.abs(x)==(e.height??0)/2&&Math.abs(v.x-(e.x??0))>(e.width??0)/2-d)){let b=d*d*(1-x*x/(f*f));b!=0&&(b=Math.sqrt(Math.abs(b))),b=d-b,y.x-(e.x??0)>0&&(b=-b),v.x+=b}return v},i}var YDe,XDe,jDe,$J=N(()=>{"use strict";Ft();zt();Wt();Ht();er();YDe=o((t,e,r,n,i,a)=>`M${t},${e} - a${i},${a} 0,0,1 0,${-n} - l${r},0 - a${i},${a} 0,0,1 0,${n} - M${r},${-n} - a${i},${a} 0,0,0 0,${n} - l${-r},0`,"createCylinderPathD"),XDe=o((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),jDe=o((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");o(FJ,"tiltedCylinder")});async function zJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=a.width+e.padding,l=a.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}],h,{cssStyles:f}=e;if(e.look==="handDrawn"){let d=je.svg(i),p=Qe(e,{}),m=Xt(u),g=d.path(m,p);h=i.insert(()=>g,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),f&&h.attr("style",f)}else h=Ma(i,s,l,u);return n&&h.attr("style",n),e.width=s,e.height=l,Ke(e,h),e.intersect=function(d){return Xe.polygon(e,u,d)},i}var GJ=N(()=>{"use strict";Ft();Ht();zt();Wt();Iu();o(zJ,"trapezoid")});async function VJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=60,l=20,u=Math.max(s,a.width+(e.padding??0)*2,e?.width??0),h=Math.max(l,a.height+(e.padding??0)*2,e?.height??0),{cssStyles:f}=e,d=je.svg(i),p=Qe(e,{});e.look!=="handDrawn"&&(p.roughness=0,p.fillStyle="solid");let m=[{x:-u/2*.8,y:-h/2},{x:u/2*.8,y:-h/2},{x:u/2,y:-h/2*.6},{x:u/2,y:h/2},{x:-u/2,y:h/2},{x:-u/2,y:-h/2*.6}],g=Xt(m),y=d.path(g,p),v=i.insert(()=>y,":first-child");return v.attr("class","basic label-container"),f&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",f),n&&e.look!=="handDrawn"&&v.selectChildren("path").attr("style",n),Ke(e,v),e.intersect=function(x){return Xe.polygon(e,m,x)},i}var UJ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(VJ,"trapezoidalPentagon")});async function HJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=dr(me().flowchart?.htmlLabels),u=a.width+(e.padding??0),h=u+a.height,f=u+a.height,d=[{x:0,y:0},{x:f,y:0},{x:f/2,y:-h}],{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=Xt(d),v=m.path(y,g),x=i.insert(()=>v,":first-child").attr("transform",`translate(${-h/2}, ${h/2})`);return p&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",p),n&&e.look!=="handDrawn"&&x.selectChildren("path").attr("style",n),e.width=u,e.height=h,Ke(e,x),s.attr("transform",`translate(${-a.width/2-(a.x-(a.left??0))}, ${h/2-(a.height+(e.padding??0)/(l?2:1)-(a.y-(a.top??0)))})`),e.intersect=function(b){return X.info("Triangle intersect",e,d,b),Xe.polygon(e,d,b)},i}var WJ=N(()=>{"use strict";yt();Ft();Ht();zt();Wt();Ft();pr();Gt();o(HJ,"triangle")});async function qJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=u/8,f=u+h,{cssStyles:d}=e,m=70-l,g=m>0?m/2:0,y=je.svg(i),v=Qe(e,{});e.look!=="handDrawn"&&(v.roughness=0,v.fillStyle="solid");let x=[{x:-l/2-g,y:f/2},...Go(-l/2-g,f/2,l/2+g,f/2,h,.8),{x:l/2+g,y:-f/2},{x:-l/2-g,y:-f/2}],b=Xt(x),T=y.path(b,v),S=i.insert(()=>T,":first-child");return S.attr("class","basic label-container"),d&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",d),n&&e.look!=="handDrawn"&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(0,${-h/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(a.x-(a.left??0))},${-u/2+(e.padding??0)-h-(a.y-(a.top??0))})`),Ke(e,S),e.intersect=function(w){return Xe.polygon(e,x,w)},i}var YJ=N(()=>{"use strict";Ft();Ht();Wt();zt();o(qJ,"waveEdgedRectangle")});async function XJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a}=await mt(t,e,ht(e)),s=100,l=50,u=Math.max(a.width+(e.padding??0)*2,e?.width??0),h=Math.max(a.height+(e.padding??0)*2,e?.height??0),f=u/h,d=u,p=h;d>p*f?p=d/f:d=p*f,d=Math.max(d,s),p=Math.max(p,l);let m=Math.min(p*.2,p/4),g=p+m*2,{cssStyles:y}=e,v=je.svg(i),x=Qe(e,{});e.look!=="handDrawn"&&(x.roughness=0,x.fillStyle="solid");let b=[{x:-d/2,y:g/2},...Go(-d/2,g/2,d/2,g/2,m,1),{x:d/2,y:-g/2},...Go(d/2,-g/2,-d/2,-g/2,m,-1)],T=Xt(b),S=v.path(T,x),w=i.insert(()=>S,":first-child");return w.attr("class","basic label-container"),y&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",y),n&&e.look!=="handDrawn"&&w.selectAll("path").attr("style",n),Ke(e,w),e.intersect=function(E){return Xe.polygon(e,b,E)},i}var jJ=N(()=>{"use strict";Ft();Ht();zt();Wt();o(XJ,"waveRectangle")});async function KJ(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let{shapeSvg:i,bbox:a,label:s}=await mt(t,e,ht(e)),l=Math.max(a.width+(e.padding??0)*2,e?.width??0),u=Math.max(a.height+(e.padding??0)*2,e?.height??0),h=5,f=-l/2,d=-u/2,{cssStyles:p}=e,m=je.svg(i),g=Qe(e,{}),y=[{x:f-h,y:d-h},{x:f-h,y:d+u},{x:f+l,y:d+u},{x:f+l,y:d-h}],v=`M${f-h},${d-h} L${f+l},${d-h} L${f+l},${d+u} L${f-h},${d+u} L${f-h},${d-h} - M${f-h},${d} L${f+l},${d} - M${f},${d-h} L${f},${d+u}`;e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let x=m.path(v,g),b=i.insert(()=>x,":first-child");return b.attr("transform",`translate(${h/2}, ${h/2})`),b.attr("class","basic label-container"),p&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",p),n&&e.look!=="handDrawn"&&b.selectAll("path").attr("style",n),s.attr("transform",`translate(${-(a.width/2)+h/2-(a.x-(a.left??0))}, ${-(a.height/2)+h/2-(a.y-(a.top??0))})`),Ke(e,b),e.intersect=function(T){return Xe.polygon(e,y,T)},i}var QJ=N(()=>{"use strict";Ft();zt();Wt();Ht();o(KJ,"windowPane")});async function ML(t,e){let r=e;if(r.alias&&(e.label=r.alias),e.look==="handDrawn"){let{themeVariables:U}=tr(),{background:K}=U,ee={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${K}`]};await ML(t,ee)}let n=tr();e.useHtmlLabels=n.htmlLabels;let i=n.er?.diagramPadding??10,a=n.er?.entityPadding??6,{cssStyles:s}=e,{labelStyles:l,nodeStyles:u}=Ye(e);if(r.attributes.length===0&&e.label){let U={rx:0,ry:0,labelPaddingX:i,labelPaddingY:i*1.5,classes:""};ra(e.label,n)+U.labelPaddingX*20){let U=d.width+i*2-(y+v+x+b);y+=U/w,v+=U/w,x>0&&(x+=U/w),b>0&&(b+=U/w)}let _=y+v+x+b,C=je.svg(f),D=Qe(e,{});e.look!=="handDrawn"&&(D.roughness=0,D.fillStyle="solid");let O=0;g.length>0&&(O=g.reduce((U,K)=>U+(K?.rowHeight??0),0));let R=Math.max(E.width+i*2,e?.width||0,_),k=Math.max((O??0)+d.height,e?.height||0),L=-R/2,A=-k/2;f.selectAll("g:not(:first-child)").each((U,K,ee)=>{let Y=Ge(ee[K]),ce=Y.attr("transform"),Z=0,ue=0;if(ce){let j=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(ce);j&&(Z=parseFloat(j[1]),ue=parseFloat(j[2]),Y.attr("class").includes("attribute-name")?Z+=y:Y.attr("class").includes("attribute-keys")?Z+=y+v:Y.attr("class").includes("attribute-comment")&&(Z+=y+v+x))}Y.attr("transform",`translate(${L+i/2+Z}, ${ue+A+d.height+a/2})`)}),f.select(".name").attr("transform","translate("+-d.width/2+", "+(A+a/2)+")");let I=C.rectangle(L,A,R,k,D),M=f.insert(()=>I,":first-child").attr("style",s.join("")),{themeVariables:P}=tr(),{rowEven:B,rowOdd:F,nodeBorder:z}=P;m.push(0);for(let[U,K]of g.entries()){let Y=(U+1)%2===0&&K.yOffset!==0,ce=C.rectangle(L,d.height+A+K?.yOffset,R,K?.rowHeight,{...D,fill:Y?B:F,stroke:z});f.insert(()=>ce,"g.label").attr("style",s.join("")).attr("class",`row-rect-${Y?"even":"odd"}`)}let $=C.line(L,d.height+A,R+L,d.height+A,D);f.insert(()=>$).attr("class","divider"),$=C.line(y+L,d.height+A,y+L,k+A,D),f.insert(()=>$).attr("class","divider"),T&&($=C.line(y+v+L,d.height+A,y+v+L,k+A,D),f.insert(()=>$).attr("class","divider")),S&&($=C.line(y+v+x+L,d.height+A,y+v+x+L,k+A,D),f.insert(()=>$).attr("class","divider"));for(let U of m)$=C.line(L,d.height+A+U,R+L,d.height+A+U,D),f.insert(()=>$).attr("class","divider");if(Ke(e,M),u&&e.look!=="handDrawn"){let K=u.split(";")?.filter(ee=>ee.includes("stroke"))?.map(ee=>`${ee}`).join("; ");f.selectAll("path").attr("style",K??""),f.selectAll(".row-rect-even path").attr("style",u)}return e.intersect=function(U){return Xe.rect(e,U)},f}async function L2(t,e,r,n=0,i=0,a=[],s=""){let l=t.insert("g").attr("class",`label ${a.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",s);e!==ic(e)&&(e=ic(e),e=e.replaceAll("<","<").replaceAll(">",">"));let u=l.node().appendChild(await qn(l,e,{width:ra(e,r)+100,style:s,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let f=u.children[0];for(f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">");f.childNodes[0];)f=f.childNodes[0],f.textContent=f.textContent.replaceAll("<","<").replaceAll(">",">")}let h=u.getBBox();if(dr(r.htmlLabels)){let f=u.children[0];f.style.textAlign="start";let d=Ge(u);h=f.getBoundingClientRect(),d.attr("width",h.width),d.attr("height",h.height)}return h}var ZJ=N(()=>{"use strict";Ft();Ht();zt();Wt();Em();mi();ao();pr();fr();er();o(ML,"erBox");o(L2,"addText")});async function JJ(t,e,r,n,i=r.class.padding??12){let a=n?0:3,s=t.insert("g").attr("class",ht(e)).attr("id",e.domId||e.id),l=null,u=null,h=null,f=null,d=0,p=0,m=0;if(l=s.insert("g").attr("class","annotation-group text"),e.annotations.length>0){let b=e.annotations[0];await nw(l,{text:`\xAB${b}\xBB`},0),d=l.node().getBBox().height}u=s.insert("g").attr("class","label-group text"),await nw(u,e,0,["font-weight: bolder"]);let g=u.node().getBBox();p=g.height,h=s.insert("g").attr("class","members-group text");let y=0;for(let b of e.members){let T=await nw(h,b,y,[b.parseClassifier()]);y+=T+a}m=h.node().getBBox().height,m<=0&&(m=i/2),f=s.insert("g").attr("class","methods-group text");let v=0;for(let b of e.methods){let T=await nw(f,b,v,[b.parseClassifier()]);v+=T+a}let x=s.node().getBBox();if(l!==null){let b=l.node().getBBox();l.attr("transform",`translate(${-b.width/2})`)}return u.attr("transform",`translate(${-g.width/2}, ${d})`),x=s.node().getBBox(),h.attr("transform",`translate(0, ${d+p+i*2})`),x=s.node().getBBox(),f.attr("transform",`translate(0, ${d+p+(m?m+i*4:i*2)})`),x=s.node().getBBox(),{shapeSvg:s,bbox:x}}async function nw(t,e,r,n=[]){let i=t.insert("g").attr("class","label").attr("style",n.join("; ")),a=tr(),s="useHtmlLabels"in e?e.useHtmlLabels:dr(a.htmlLabels)??!0,l="";"text"in e?l=e.text:l=e.label,!s&&l.startsWith("\\")&&(l=l.substring(1)),yi(l)&&(s=!0);let u=await qn(i,fd(na(l)),{width:ra(l,a)+50,classes:"markdown-node-label",useHtmlLabels:s},a),h,f=1;if(s){let d=u.children[0],p=Ge(u);f=d.innerHTML.split("
    ").length,d.innerHTML.includes("")&&(f+=d.innerHTML.split("").length-1);let m=d.getElementsByTagName("img");if(m){let g=l.replace(/]*>/g,"").trim()==="";await Promise.all([...m].map(y=>new Promise(v=>{function x(){if(y.style.display="flex",y.style.flexDirection="column",g){let b=a.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,S=parseInt(b,10)*5+"px";y.style.minWidth=S,y.style.maxWidth=S}else y.style.width="100%";v(y)}o(x,"setupImage"),setTimeout(()=>{y.complete&&x()}),y.addEventListener("error",x),y.addEventListener("load",x)})))}h=d.getBoundingClientRect(),p.attr("width",h.width),p.attr("height",h.height)}else{n.includes("font-weight: bolder")&&Ge(u).selectAll("tspan").attr("font-weight",""),f=u.children.length;let d=u.children[0];(u.textContent===""||u.textContent.includes(">"))&&(d.textContent=l[0]+l.substring(1).replaceAll(">",">").replaceAll("<","<").trim(),l[1]===" "&&(d.textContent=d.textContent[0]+" "+d.textContent.substring(1))),d.textContent==="undefined"&&(d.textContent=""),h=u.getBBox()}return i.attr("transform","translate(0,"+(-h.height/(2*f)+r)+")"),h.height}var eee=N(()=>{"use strict";fr();mi();Ft();er();Gt();ao();pr();o(JJ,"textHelper");o(nw,"addText")});async function tee(t,e){let r=me(),n=r.class.padding??12,i=n,a=e.useHtmlLabels??dr(r.htmlLabels)??!0,s=e;s.annotations=s.annotations??[],s.members=s.members??[],s.methods=s.methods??[];let{shapeSvg:l,bbox:u}=await JJ(t,e,r,a,i),{labelStyles:h,nodeStyles:f}=Ye(e);e.labelStyle=h,e.cssStyles=s.styles||"";let d=s.styles?.join(";")||f||"";e.cssStyles||(e.cssStyles=d.replaceAll("!important","").split(";"));let p=s.members.length===0&&s.methods.length===0&&!r.class?.hideEmptyMembersBox,m=je.svg(l),g=Qe(e,{});e.look!=="handDrawn"&&(g.roughness=0,g.fillStyle="solid");let y=u.width,v=u.height;s.members.length===0&&s.methods.length===0?v+=i:s.members.length>0&&s.methods.length===0&&(v+=i*2);let x=-y/2,b=-v/2,T=m.rectangle(x-n,b-n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0),y+2*n,v+2*n+(p?n*2:s.members.length===0&&s.methods.length===0?-n:0),g),S=l.insert(()=>T,":first-child");S.attr("class","basic label-container");let w=S.node().getBBox();l.selectAll(".text").each((D,O,R)=>{let k=Ge(R[O]),L=k.attr("transform"),A=0;if(L){let B=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(L);B&&(A=parseFloat(B[2]))}let I=A+b+n-(p?n:s.members.length===0&&s.methods.length===0?-n/2:0);a||(I-=4);let M=x;(k.attr("class").includes("label-group")||k.attr("class").includes("annotation-group"))&&(M=-k.node()?.getBBox().width/2||0,l.selectAll("text").each(function(P,B,F){window.getComputedStyle(F[B]).textAnchor==="middle"&&(M=0)})),k.attr("transform",`translate(${M}, ${I})`)});let E=l.select(".annotation-group").node().getBBox().height-(p?n/2:0)||0,_=l.select(".label-group").node().getBBox().height-(p?n/2:0)||0,C=l.select(".members-group").node().getBBox().height-(p?n/2:0)||0;if(s.members.length>0||s.methods.length>0||p){let D=m.line(w.x,E+_+b+n,w.x+w.width,E+_+b+n,g);l.insert(()=>D).attr("class","divider").attr("style",d)}if(p||s.members.length>0||s.methods.length>0){let D=m.line(w.x,E+_+C+b+i*2+n,w.x+w.width,E+_+C+b+n+i*2,g);l.insert(()=>D).attr("class","divider").attr("style",d)}if(s.look!=="handDrawn"&&l.selectAll("path").attr("style",d),S.select(":nth-child(2)").attr("style",d),l.selectAll(".divider").select("path").attr("style",d),e.labelStyle?l.selectAll("span").attr("style",e.labelStyle):l.selectAll("span").attr("style",d),!a){let D=RegExp(/color\s*:\s*([^;]*)/),O=D.exec(d);if(O){let R=O[0].replace("color","fill");l.selectAll("tspan").attr("style",R)}else if(h){let R=D.exec(h);if(R){let k=R[0].replace("color","fill");l.selectAll("tspan").attr("style",k)}}}return Ke(e,S),e.intersect=function(D){return Xe.rect(e,D)},l}var ree=N(()=>{"use strict";Ft();Gt();fr();Wt();zt();Ht();eee();pr();o(tee,"classBox")});async function nee(t,e){let{labelStyles:r,nodeStyles:n}=Ye(e);e.labelStyle=r;let i=e,a=e,s=20,l=20,u="verifyMethod"in e,h=ht(e),f=t.insert("g").attr("class",h).attr("id",e.domId??e.id),d;u?d=await Pu(f,`<<${i.type}>>`,0,e.labelStyle):d=await Pu(f,"<<Element>>",0,e.labelStyle);let p=d,m=await Pu(f,i.name,p,e.labelStyle+"; font-weight: bold;");if(p+=m+l,u){let E=await Pu(f,`${i.requirementId?`id: ${i.requirementId}`:""}`,p,e.labelStyle);p+=E;let _=await Pu(f,`${i.text?`Text: ${i.text}`:""}`,p,e.labelStyle);p+=_;let C=await Pu(f,`${i.risk?`Risk: ${i.risk}`:""}`,p,e.labelStyle);p+=C,await Pu(f,`${i.verifyMethod?`Verification: ${i.verifyMethod}`:""}`,p,e.labelStyle)}else{let E=await Pu(f,`${a.type?`Type: ${a.type}`:""}`,p,e.labelStyle);p+=E,await Pu(f,`${a.docRef?`Doc Ref: ${a.docRef}`:""}`,p,e.labelStyle)}let g=(f.node()?.getBBox().width??200)+s,y=(f.node()?.getBBox().height??200)+s,v=-g/2,x=-y/2,b=je.svg(f),T=Qe(e,{});e.look!=="handDrawn"&&(T.roughness=0,T.fillStyle="solid");let S=b.rectangle(v,x,g,y,T),w=f.insert(()=>S,":first-child");if(w.attr("class","basic label-container").attr("style",n),f.selectAll(".label").each((E,_,C)=>{let D=Ge(C[_]),O=D.attr("transform"),R=0,k=0;if(O){let M=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(O);M&&(R=parseFloat(M[1]),k=parseFloat(M[2]))}let L=k-y/2,A=v+s/2;(_===0||_===1)&&(A=R),D.attr("transform",`translate(${A}, ${L+s})`)}),p>d+m+l){let E=b.line(v,x+d+m+l,v+g,x+d+m+l,T);f.insert(()=>E).attr("style",n)}return Ke(e,w),e.intersect=function(E){return Xe.rect(e,E)},f}async function Pu(t,e,r,n=""){if(e==="")return 0;let i=t.insert("g").attr("class","label").attr("style",n),a=me(),s=a.htmlLabels??!0,l=await qn(i,fd(na(e)),{width:ra(e,a)+50,classes:"markdown-node-label",useHtmlLabels:s,style:n},a),u;if(s){let h=l.children[0],f=Ge(l);u=h.getBoundingClientRect(),f.attr("width",u.width),f.attr("height",u.height)}else{let h=l.children[0];for(let f of h.children)f.textContent=f.textContent.replaceAll(">",">").replaceAll("<","<"),n&&f.setAttribute("style",n);u=l.getBBox(),u.height+=6}return i.attr("transform",`translate(${-u.width/2},${-u.height/2+r})`),u.height}var iee=N(()=>{"use strict";Ft();Ht();zt();Wt();er();Gt();ao();fr();o(nee,"requirementBox");o(Pu,"addText")});async function aee(t,e,{config:r}){let{labelStyles:n,nodeStyles:i}=Ye(e);e.labelStyle=n||"";let a=10,s=e.width;e.width=(e.width??200)-10;let{shapeSvg:l,bbox:u,label:h}=await mt(t,e,ht(e)),f=e.padding||10,d="",p;"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(d=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),p=l.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",d).attr("target","_blank"));let m={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1},g,y;p?{label:g,bbox:y}=await HT(p,"ticket"in e&&e.ticket||"",m):{label:g,bbox:y}=await HT(l,"ticket"in e&&e.ticket||"",m);let{label:v,bbox:x}=await HT(l,"assigned"in e&&e.assigned||"",m);e.width=s;let b=10,T=e?.width||0,S=Math.max(y.height,x.height)/2,w=Math.max(u.height+b*2,e?.height||0)+S,E=-T/2,_=-w/2;h.attr("transform","translate("+(f-T/2)+", "+(-S-u.height/2)+")"),g.attr("transform","translate("+(f-T/2)+", "+(-S+u.height/2)+")"),v.attr("transform","translate("+(f+T/2-x.width-2*a)+", "+(-S+u.height/2)+")");let C,{rx:D,ry:O}=e,{cssStyles:R}=e;if(e.look==="handDrawn"){let k=je.svg(l),L=Qe(e,{}),A=D||O?k.path(Oa(E,_,T,w,D||0),L):k.rectangle(E,_,T,w,L);C=l.insert(()=>A,":first-child"),C.attr("class","basic label-container").attr("style",R||null)}else{C=l.insert("rect",":first-child"),C.attr("class","basic label-container __APA__").attr("style",i).attr("rx",D??5).attr("ry",O??5).attr("x",E).attr("y",_).attr("width",T).attr("height",w);let k="priority"in e&&e.priority;if(k){let L=l.append("line"),A=E+2,I=_+Math.floor((D??0)/2),M=_+w-Math.floor((D??0)/2);L.attr("x1",A).attr("y1",I).attr("x2",A).attr("y2",M).attr("stroke-width","4").attr("stroke",KDe(k))}}return Ke(e,C),e.height=w,e.intersect=function(k){return Xe.rect(e,k)},l}var KDe,see=N(()=>{"use strict";Ft();Ht();Zh();zt();Wt();KDe=o(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");o(aee,"kanbanItem")});function oee(t){return t in IL}var QDe,ZDe,IL,OL=N(()=>{"use strict";XQ();QQ();JQ();tZ();nZ();aZ();oZ();cZ();hZ();dZ();mZ();yZ();xZ();TZ();kZ();SZ();AZ();DZ();RZ();MZ();OZ();BZ();$Z();GZ();UZ();WZ();YZ();jZ();QZ();JZ();tJ();nJ();aJ();oJ();cJ();hJ();dJ();mJ();yJ();xJ();TJ();kJ();SJ();AJ();DJ();RJ();MJ();OJ();BJ();$J();GJ();UJ();WJ();YJ();jJ();QJ();ZJ();ree();iee();see();QDe=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:bJ},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:pJ},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:wJ},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:LJ},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:pZ},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:rZ},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:lJ},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:_Z},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:XZ},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:qZ},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:zJ},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:VZ},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:vZ},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:PJ},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:ZQ},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:gJ},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:_J},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:CJ},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:EZ},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:LZ},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:sZ},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:lZ},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:uZ},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:KZ},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:qJ},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:CZ},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:FJ},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:ZZ},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:fZ},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:gZ},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:HJ},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:KJ},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:bZ},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:VJ},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:wZ},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:vJ},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:iJ},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:rJ},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:KQ},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:iZ},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:IJ},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:NJ},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:XJ},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:uJ},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:eJ}],ZDe=o(()=>{let e=[...Object.entries({state:EJ,choice:eZ,note:sJ,rectWithTitle:fJ,labelRect:HZ,iconSquare:FZ,iconCircle:IZ,icon:NZ,iconRounded:PZ,imageSquare:zZ,anchor:YQ,kanbanItem:aee,classBox:tee,erBox:ML,requirementBox:nee}),...QDe.flatMap(r=>[r.shortName,..."aliases"in r?r.aliases:[],..."internalAliases"in r?r.internalAliases:[]].map(i=>[i,r.handler]))];return Object.fromEntries(e)},"generateShapeMap"),IL=ZDe();o(oee,"isValidShape")});var JDe,iw,lee=N(()=>{"use strict";fr();PT();Gt();yt();OL();er();pr();ci();JDe="flowchart-",iw=class{constructor(){this.vertexCounter=0;this.config=me();this.vertices=new Map;this.edges=[];this.classes=new Map;this.subGraphs=[];this.subGraphLookup=new Map;this.tooltips=new Map;this.subCount=0;this.firstGraphFlag=!0;this.secCount=-1;this.posCrossRef=[];this.funs=[];this.setAccTitle=Ar;this.setAccDescription=Lr;this.setDiagramTitle=Or;this.getAccTitle=Dr;this.getAccDescription=Rr;this.getDiagramTitle=Nr;this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{o(this,"FlowDB")}sanitizeText(e){return Ze.sanitizeText(e,this.config)}lookUpDomId(e){for(let r of this.vertices.values())if(r.id===e)return r.domId;return e}addVertex(e,r,n,i,a,s,l={},u){if(!e||e.trim().length===0)return;let h;if(u!==void 0){let m;u.includes(` -`)?m=u+` -`:m=`{ -`+u+` -}`,h=Tm(m,{schema:bm})}let f=this.edges.find(m=>m.id===e);if(f){let m=h;m?.animate!==void 0&&(f.animate=m.animate),m?.animation!==void 0&&(f.animation=m.animation);return}let d,p=this.vertices.get(e);if(p===void 0&&(p={id:e,labelType:"text",domId:JDe+e+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(e,p)),this.vertexCounter++,r!==void 0?(this.config=me(),d=this.sanitizeText(r.text.trim()),p.labelType=r.type,d.startsWith('"')&&d.endsWith('"')&&(d=d.substring(1,d.length-1)),p.text=d):p.text===void 0&&(p.text=e),n!==void 0&&(p.type=n),i?.forEach(m=>{p.styles.push(m)}),a?.forEach(m=>{p.classes.push(m)}),s!==void 0&&(p.dir=s),p.props===void 0?p.props=l:l!==void 0&&Object.assign(p.props,l),h!==void 0){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!oee(h.shape))throw new Error(`No such shape: ${h.shape}.`);p.type=h?.shape}h?.label&&(p.text=h?.label),h?.icon&&(p.icon=h?.icon,!h.label?.trim()&&p.text===e&&(p.text="")),h?.form&&(p.form=h?.form),h?.pos&&(p.pos=h?.pos),h?.img&&(p.img=h?.img,!h.label?.trim()&&p.text===e&&(p.text="")),h?.constraint&&(p.constraint=h.constraint),h.w&&(p.assetWidth=Number(h.w)),h.h&&(p.assetHeight=Number(h.h))}}addSingleLink(e,r,n,i){let l={start:e,end:r,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};X.info("abc78 Got edge...",l);let u=n.text;if(u!==void 0&&(l.text=this.sanitizeText(u.text.trim()),l.text.startsWith('"')&&l.text.endsWith('"')&&(l.text=l.text.substring(1,l.text.length-1)),l.labelType=u.type),n!==void 0&&(l.type=n.type,l.stroke=n.stroke,l.length=n.length>10?10:n.length),i&&!this.edges.some(h=>h.id===i))l.id=i,l.isUserDefinedId=!0;else{let h=this.edges.filter(f=>f.start===l.start&&f.end===l.end);h.length===0?l.id=Wh(l.start,l.end,{counter:0,prefix:"L"}):l.id=Wh(l.start,l.end,{counter:h.length+1,prefix:"L"})}if(this.edges.length<(this.config.maxEdges??500))X.info("Pushing edge..."),this.edges.push(l);else throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}. - -Initialize mermaid with maxEdges set to a higher number to allow more edges. -You cannot set this config via configuration inside the diagram as it is a secure config. -You have to call mermaid.initialize.`)}isLinkData(e){return e!==null&&typeof e=="object"&&"id"in e&&typeof e.id=="string"}addLink(e,r,n){let i=this.isLinkData(n)?n.id.replace("@",""):void 0;X.info("addLink",e,r,i);for(let a of e)for(let s of r){let l=a===e[e.length-1],u=s===r[0];l&&u?this.addSingleLink(a,s,n,i):this.addSingleLink(a,s,n,void 0)}}updateLinkInterpolate(e,r){e.forEach(n=>{n==="default"?this.edges.defaultInterpolate=r:this.edges[n].interpolate=r})}updateLink(e,r){e.forEach(n=>{if(typeof n=="number"&&n>=this.edges.length)throw new Error(`The index ${n} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);n==="default"?this.edges.defaultStyle=r:(this.edges[n].style=r,(this.edges[n]?.style?.length??0)>0&&!this.edges[n]?.style?.some(i=>i?.startsWith("fill"))&&this.edges[n]?.style?.push("fill:none"))})}addClass(e,r){let n=r.join().replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");e.split(",").forEach(i=>{let a=this.classes.get(i);a===void 0&&(a={id:i,styles:[],textStyles:[]},this.classes.set(i,a)),n?.forEach(s=>{if(/color/.exec(s)){let l=s.replace("fill","bgFill");a.textStyles.push(l)}a.styles.push(s)})})}setDirection(e){this.direction=e,/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),this.direction==="TD"&&(this.direction="TB")}setClass(e,r){for(let n of e.split(",")){let i=this.vertices.get(n);i&&i.classes.push(r);let a=this.edges.find(l=>l.id===n);a&&a.classes.push(r);let s=this.subGraphLookup.get(n);s&&s.classes.push(r)}}setTooltip(e,r){if(r!==void 0){r=this.sanitizeText(r);for(let n of e.split(","))this.tooltips.set(this.version==="gen-1"?this.lookUpDomId(n):n,r)}}setClickFun(e,r,n){let i=this.lookUpDomId(e);if(me().securityLevel!=="loose"||r===void 0)return;let a=[];if(typeof n=="string"){a=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let l=0;l{let l=document.querySelector(`[id="${i}"]`);l!==null&&l.addEventListener("click",()=>{Vt.runFunc(r,...a)},!1)}))}setLink(e,r,n){e.split(",").forEach(i=>{let a=this.vertices.get(i);a!==void 0&&(a.link=Vt.formatUrl(r,this.config),a.linkTarget=n)}),this.setClass(e,"clickable")}getTooltip(e){return this.tooltips.get(e)}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFun(i,r,n)}),this.setClass(e,"clickable")}bindFunctions(e){this.funs.forEach(r=>{r(e)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(e){let r=Ge(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=Ge("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),Ge(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=Ge(a.currentTarget);if(s.attr("title")===null)return;let u=a.currentTarget?.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.bottom+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),Ge(a.currentTarget).classed("hover",!1)})}clear(e="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=e,this.config=me(),kr()}setGen(e){this.version=e||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(e,r,n){let i=e.text.trim(),a=n.text;e===n&&/\s/.exec(n.text)&&(i=void 0);let l=o(p=>{let m={boolean:{},number:{},string:{}},g=[],y;return{nodeList:p.filter(function(x){let b=typeof x;return x.stmt&&x.stmt==="dir"?(y=x.value,!1):x.trim()===""?!1:b in m?m[b].hasOwnProperty(x)?!1:m[b][x]=!0:g.includes(x)?!1:g.push(x)}),dir:y}},"uniq")(r.flat()),u=l.nodeList,h=l.dir,f=me().flowchart??{};if(h=h??(f.inheritDir?this.getDirection()??me().direction??void 0:void 0),this.version==="gen-1")for(let p=0;p2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=r,this.subGraphs[r].id===e)return{result:!0,count:0};let i=0,a=1;for(;i=0){let l=this.indexNodes2(e,s);if(l.result)return{result:!0,count:a+l.count};a=a+l.count}i=i+1}return{result:!1,count:a}}getDepthFirstPos(e){return this.posCrossRef[e]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return this.firstGraphFlag?(this.firstGraphFlag=!1,!0):!1}destructStartLink(e){let r=e.trim(),n="arrow_open";switch(r[0]){case"<":n="arrow_point",r=r.slice(1);break;case"x":n="arrow_cross",r=r.slice(1);break;case"o":n="arrow_circle",r=r.slice(1);break}let i="normal";return r.includes("=")&&(i="thick"),r.includes(".")&&(i="dotted"),{type:n,stroke:i}}countChar(e,r){let n=r.length,i=0;for(let a=0;a":i="arrow_point",r.startsWith("<")&&(i="double_"+i,n=n.slice(1));break;case"o":i="arrow_circle",r.startsWith("o")&&(i="double_"+i,n=n.slice(1));break}let a="normal",s=n.length-1;n.startsWith("=")&&(a="thick"),n.startsWith("~")&&(a="invisible");let l=this.countChar(".",n);return l&&(a="dotted",s=l),{type:i,stroke:a,length:s}}destructLink(e,r){let n=this.destructEndLink(e),i;if(r){if(i=this.destructStartLink(r),i.stroke!==n.stroke)return{type:"INVALID",stroke:"INVALID"};if(i.type==="arrow_open")i.type=n.type;else{if(i.type!==n.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return i.type==="double_arrow"&&(i.type="double_arrow_point"),i.length=n.length,i}return n}exists(e,r){for(let n of e)if(n.nodes.includes(r))return!0;return!1}makeUniq(e,r){let n=[];return e.nodes.forEach((i,a)=>{this.exists(r,i)||n.push(e.nodes[a])}),{nodes:n}}getTypeFromVertex(e){if(e.img)return"imageSquare";if(e.icon)return e.form==="circle"?"iconCircle":e.form==="square"?"iconSquare":e.form==="rounded"?"iconRounded":"icon";switch(e.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return e.type}}findNode(e,r){return e.find(n=>n.id===r)}destructEdgeType(e){let r="none",n="arrow_point";switch(e){case"arrow_point":case"arrow_circle":case"arrow_cross":n=e;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":r=e.replace("double_",""),n=r;break}return{arrowTypeStart:r,arrowTypeEnd:n}}addNodeFromVertex(e,r,n,i,a,s){let l=n.get(e.id),u=i.get(e.id)??!1,h=this.findNode(r,e.id);if(h)h.cssStyles=e.styles,h.cssCompiledStyles=this.getCompiledStyles(e.classes),h.cssClasses=e.classes.join(" ");else{let f={id:e.id,label:e.text,labelStyle:"",parentId:l,padding:a.flowchart?.padding||8,cssStyles:e.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...e.classes]),cssClasses:"default "+e.classes.join(" "),dir:e.dir,domId:e.domId,look:s,link:e.link,linkTarget:e.linkTarget,tooltip:this.getTooltip(e.id),icon:e.icon,pos:e.pos,img:e.img,assetWidth:e.assetWidth,assetHeight:e.assetHeight,constraint:e.constraint};u?r.push({...f,isGroup:!0,shape:"rect"}):r.push({...f,isGroup:!1,shape:this.getTypeFromVertex(e)})}}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}getData(){let e=me(),r=[],n=[],i=this.getSubGraphs(),a=new Map,s=new Map;for(let h=i.length-1;h>=0;h--){let f=i[h];f.nodes.length>0&&s.set(f.id,!0);for(let d of f.nodes)a.set(d,f.id)}for(let h=i.length-1;h>=0;h--){let f=i[h];r.push({id:f.id,label:f.title,labelStyle:"",parentId:a.get(f.id),padding:8,cssCompiledStyles:this.getCompiledStyles(f.classes),cssClasses:f.classes.join(" "),shape:"rect",dir:f.dir,isGroup:!0,look:e.look})}this.getVertices().forEach(h=>{this.addNodeFromVertex(h,r,a,s,e,e.look||"classic")});let u=this.getEdges();return u.forEach((h,f)=>{let{arrowTypeStart:d,arrowTypeEnd:p}=this.destructEdgeType(h.type),m=[...u.defaultStyle??[]];h.style&&m.push(...h.style);let g={id:Wh(h.start,h.end,{counter:f,prefix:"L"},h.id),isUserDefinedId:h.isUserDefinedId,start:h.start,end:h.end,type:h.type??"normal",label:h.text,labelpos:"c",thickness:h.stroke,minlen:h.length,classes:h?.stroke==="invisible"?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":d,arrowTypeEnd:h?.stroke==="invisible"||h?.type==="arrow_open"?"none":p,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(h.classes),labelStyle:m,style:m,pattern:h.stroke,look:e.look,animate:h.animate,animation:h.animation,curve:h.interpolate||this.edges.defaultInterpolate||e.flowchart?.curve};n.push(g)}),{nodes:r,edges:n,other:{},config:e}}defaultConfig(){return $3.flowchart}}});var wc,Sm=N(()=>{"use strict";fr();wc=o((t,e)=>{let r;return e==="sandbox"&&(r=Ge("#i"+t)),(e==="sandbox"?Ge(r.nodes()[0].contentDocument.body):Ge("body")).select(`[id="${t}"]`)},"getDiagramElement")});var Bu,R2=N(()=>{"use strict";Bu=o(({flowchart:t})=>{let e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0,n=e+r;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:n}},"getSubGraphTitleMargins")});var cee,e9e,t9e,r9e,n9e,i9e,a9e,uee,Cm,hee,aw=N(()=>{"use strict";Gt();pr();yt();R2();fr();Wt();ao();mL();rw();Zh();zt();cee=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ye(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=dr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await qn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0}),y=g.getBBox();if(dr(r.flowchart.htmlLabels)){let _=g.children[0],C=Ge(g);y=_.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let _=je.svg(d),C=Qe(e,{roughness:.7,fill:a,stroke:s,fillWeight:3,seed:i}),D=_.path(Oa(b,T,v,x,0),C);S=d.insert(()=>(X.debug("Rough node insert CXC",D),D),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Bu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let _=m.select("span");_&&_.attr("style",l)}let E=S.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(_){return Xh(e,_)},{cluster:d,labelBBox:y}},"rect"),e9e=o((t,e)=>{let r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");let s=n.node().getBBox();return e.width=s.width,e.height=s.height,e.intersect=function(l){return Xh(e,l)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),t9e=o(async(t,e)=>{let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:s,compositeTitleBackground:l,nodeBorder:u}=n,h=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),f=h.insert("g",":first-child"),d=h.insert("g").attr("class","cluster-label"),p=h.append("rect"),m=d.node().appendChild(await Tc(e.label,e.labelStyle,void 0,!0)),g=m.getBBox();if(dr(r.flowchart.htmlLabels)){let D=m.children[0],O=Ge(m);g=D.getBoundingClientRect(),O.attr("width",g.width),O.attr("height",g.height)}let y=0*e.padding,v=y/2,x=(e.width<=g.width+e.padding?g.width+e.padding:e.width)+y;e.width<=g.width+e.padding?e.diff=(x-e.width)/2-e.padding:e.diff=-e.padding;let b=e.height+y,T=e.height+y-g.height-6,S=e.x-x/2,w=e.y-b/2;e.width=x;let E=e.y-e.height/2-v+g.height+2,_;if(e.look==="handDrawn"){let D=e.cssClasses.includes("statediagram-cluster-alt"),O=je.svg(h),R=e.rx||e.ry?O.path(Oa(S,w,x,b,10),{roughness:.7,fill:l,fillStyle:"solid",stroke:u,seed:i}):O.rectangle(S,w,x,b,{seed:i});_=h.insert(()=>R,":first-child");let k=O.rectangle(S,E,x,T,{fill:D?a:s,fillStyle:D?"hachure":"solid",stroke:u,seed:i});_=h.insert(()=>R,":first-child"),p=h.insert(()=>k)}else _=f.insert("rect",":first-child"),_.attr("class","outer").attr("x",S).attr("y",w).attr("width",x).attr("height",b).attr("data-look",e.look),p.attr("class","inner").attr("x",S).attr("y",E).attr("width",x).attr("height",T);d.attr("transform",`translate(${e.x-g.width/2}, ${w+1-(dr(r.flowchart.htmlLabels)?0:3)})`);let C=_.node().getBBox();return e.height=C.height,e.offsetX=0,e.offsetY=g.height-e.padding/2,e.labelBBox=g,e.intersect=function(D){return Xh(e,D)},{cluster:h,labelBBox:g}},"roundedWithTitle"),r9e=o(async(t,e)=>{X.info("Creating subgraph rect for ",e.id,e);let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{clusterBkg:a,clusterBorder:s}=n,{labelStyles:l,nodeStyles:u,borderStyles:h,backgroundStyles:f}=Ye(e),d=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),p=dr(r.flowchart.htmlLabels),m=d.insert("g").attr("class","cluster-label "),g=await qn(m,e.label,{style:e.labelStyle,useHtmlLabels:p,isNode:!0,width:e.width}),y=g.getBBox();if(dr(r.flowchart.htmlLabels)){let _=g.children[0],C=Ge(g);y=_.getBoundingClientRect(),C.attr("width",y.width),C.attr("height",y.height)}let v=e.width<=y.width+e.padding?y.width+e.padding:e.width;e.width<=y.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;let x=e.height,b=e.x-v/2,T=e.y-x/2;X.trace("Data ",e,JSON.stringify(e));let S;if(e.look==="handDrawn"){let _=je.svg(d),C=Qe(e,{roughness:.7,fill:a,stroke:s,fillWeight:4,seed:i}),D=_.path(Oa(b,T,v,x,e.rx),C);S=d.insert(()=>(X.debug("Rough node insert CXC",D),D),":first-child"),S.select("path:nth-child(2)").attr("style",h.join(";")),S.select("path").attr("style",f.join(";").replace("fill","stroke"))}else S=d.insert("rect",":first-child"),S.attr("style",u).attr("rx",e.rx).attr("ry",e.ry).attr("x",b).attr("y",T).attr("width",v).attr("height",x);let{subGraphTitleTopMargin:w}=Bu(r);if(m.attr("transform",`translate(${e.x-y.width/2}, ${e.y-e.height/2+w})`),l){let _=m.select("span");_&&_.attr("style",l)}let E=S.node().getBBox();return e.offsetX=0,e.width=E.width,e.height=E.height,e.offsetY=y.height-e.padding/2,e.intersect=function(_){return Xh(e,_)},{cluster:d,labelBBox:y}},"kanbanSection"),n9e=o((t,e)=>{let r=me(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,s=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=s.insert("g",":first-child"),u=0*e.padding,h=e.width+u;e.diff=-e.padding;let f=e.height+u,d=e.x-h/2,p=e.y-f/2;e.width=h;let m;if(e.look==="handDrawn"){let v=je.svg(s).rectangle(d,p,h,f,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});m=s.insert(()=>v,":first-child")}else m=l.insert("rect",":first-child"),m.attr("class","divider").attr("x",d).attr("y",p).attr("width",h).attr("height",f).attr("data-look",e.look);let g=m.node().getBBox();return e.height=g.height,e.offsetX=0,e.offsetY=0,e.intersect=function(y){return Xh(e,y)},{cluster:s,labelBBox:{}}},"divider"),i9e=cee,a9e={rect:cee,squareRect:i9e,roundedWithTitle:t9e,noteGroup:e9e,divider:n9e,kanbanSection:r9e},uee=new Map,Cm=o(async(t,e)=>{let r=e.shape||"rect",n=await a9e[r](t,e);return uee.set(e.id,n),n},"insertCluster"),hee=o(()=>{uee=new Map},"clear")});function sw(t,e){if(t===void 0||e===void 0)return{angle:0,deltaX:0,deltaY:0};t=Yn(t),e=Yn(e);let[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}var Vo,Yn,ow,PL=N(()=>{"use strict";Vo={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};o(sw,"calculateDeltaAndAngle");Yn=o(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),ow=o(t=>({x:o(function(e,r,n){let i=0,a=Yn(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(Vo,t.arrowTypeEnd)){let{angle:m,deltaX:g}=sw(n[n.length-1],n[n.length-2]);i=Vo[t.arrowTypeEnd]*Math.cos(m)*(g>=0?1:-1)}let s=Math.abs(Yn(e).x-Yn(n[n.length-1]).x),l=Math.abs(Yn(e).y-Yn(n[n.length-1]).y),u=Math.abs(Yn(e).x-Yn(n[0]).x),h=Math.abs(Yn(e).y-Yn(n[0]).y),f=Vo[t.arrowTypeStart],d=Vo[t.arrowTypeEnd],p=1;if(s0&&l0&&h=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(Vo,t.arrowTypeEnd)){let{angle:m,deltaY:g}=sw(n[n.length-1],n[n.length-2]);i=Vo[t.arrowTypeEnd]*Math.abs(Math.sin(m))*(g>=0?1:-1)}let s=Math.abs(Yn(e).y-Yn(n[n.length-1]).y),l=Math.abs(Yn(e).x-Yn(n[n.length-1]).x),u=Math.abs(Yn(e).y-Yn(n[0]).y),h=Math.abs(Yn(e).x-Yn(n[0]).x),f=Vo[t.arrowTypeStart],d=Vo[t.arrowTypeEnd],p=1;if(s0&&l0&&h{"use strict";yt();dee=o((t,e,r,n,i,a)=>{e.arrowTypeStart&&fee(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&fee(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),s9e={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},fee=o((t,e,r,n,i,a,s)=>{let l=s9e[r];if(!l){X.warn(`Unknown arrow type: ${r}`);return}let u=l.type,f=`${i}_${a}-${u}${e==="start"?"Start":"End"}`;if(s&&s.trim()!==""){let d=s.replace(/[^\dA-Za-z]/g,"_"),p=`${f}_${d}`;if(!document.getElementById(p)){let m=document.getElementById(f);if(m){let g=m.cloneNode(!0);g.id=p,g.querySelectorAll("path, circle, line").forEach(v=>{v.setAttribute("stroke",s),l.fill&&v.setAttribute("fill",s)}),m.parentNode?.appendChild(g)}}t.attr(`marker-${e}`,`url(${n}#${p})`)}else t.attr(`marker-${e}`,`url(${n}#${f})`)},"addEdgeMarker")});function lw(t,e){me().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}function c9e(t){let e=[],r=[];for(let n=1;n5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===s.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-s.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}var cw,da,yee,N2,uw,hw,o9e,l9e,mee,gee,u9e,fw,BL=N(()=>{"use strict";Gt();pr();yt();ao();er();PL();R2();fr();Wt();rw();pee();zt();cw=new Map,da=new Map,yee=o(()=>{cw.clear(),da.clear()},"clear"),N2=o(t=>t?t.reduce((r,n)=>r+";"+n,""):"","getLabelStyles"),uw=o(async(t,e)=>{let r=dr(me().flowchart.htmlLabels),n=await qn(t,e.label,{style:N2(e.labelStyle),useHtmlLabels:r,addSvgBackground:!0,isNode:!1});X.info("abc82",e,e.labelType);let i=t.insert("g").attr("class","edgeLabel"),a=i.insert("g").attr("class","label");a.node().appendChild(n);let s=n.getBBox();if(r){let u=n.children[0],h=Ge(n);s=u.getBoundingClientRect(),h.attr("width",s.width),h.attr("height",s.height)}a.attr("transform","translate("+-s.width/2+", "+-s.height/2+")"),cw.set(e.id,i),e.width=s.width,e.height=s.height;let l;if(e.startLabelLeft){let u=await Tc(e.startLabelLeft,N2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startLeft=h,lw(l,e.startLabelLeft)}if(e.startLabelRight){let u=await Tc(e.startLabelRight,N2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=h.node().appendChild(u),f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),da.get(e.id)||da.set(e.id,{}),da.get(e.id).startRight=h,lw(l,e.startLabelRight)}if(e.endLabelLeft){let u=await Tc(e.endLabelLeft,N2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endLeft=h,lw(l,e.endLabelLeft)}if(e.endLabelRight){let u=await Tc(e.endLabelRight,N2(e.labelStyle)),h=t.insert("g").attr("class","edgeTerminals"),f=h.insert("g").attr("class","inner");l=f.node().appendChild(u);let d=u.getBBox();f.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),h.node().appendChild(u),da.get(e.id)||da.set(e.id,{}),da.get(e.id).endRight=h,lw(l,e.endLabelRight)}return n},"insertEdgeLabel");o(lw,"setTerminalWidth");hw=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,cw.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=me(),{subGraphTitleTotalMargin:i}=Bu(n);if(t.label){let a=cw.get(t.id),s=t.x,l=t.y;if(r){let u=Vt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=da.get(t.id).startLeft,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=da.get(t.id).startRight,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=da.get(t.id).endLeft,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=da.get(t.id).endRight,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),o9e=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),l9e=o((t,e,r)=>{X.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(e)} - insidePoint : ${JSON.stringify(r)} - node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(X.info("abc88 checking point",a,e),!o9e(e,a)&&!i){let s=l9e(e,n,a);X.debug("abc88 inside",a,n,s),X.debug("abc88 intersection",s,e);let l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)?X.warn("abc88 no intersect",s,r):r.push(s),i=!0}else X.warn("abc88 outside",a,n),n=a,i||r.push(a)}),X.debug("returning points",r),r},"cutPathAtIntersect");o(c9e,"extractCornerPoints");gee=o(function(t,e,r){let n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),s=r/a;return{x:e.x-s*n,y:e.y-s*i}},"findAdjacentPoint"),u9e=o(function(t){let{cornerPointPositions:e}=c9e(t),r=[];for(let n=0;n10&&Math.abs(a.y-i.y)>=10){X.debug("Corner point fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));let m=5;s.x===l.x?p={x:h<0?l.x-m+d:l.x+m-d,y:f<0?l.y-d:l.y+d}:p={x:h<0?l.x-d:l.x+d,y:f<0?l.y-m+d:l.y+m-d}}else X.debug("Corner point skipping fixing",Math.abs(a.x-i.x),Math.abs(a.y-i.y));r.push(p,u)}else r.push(t[n]);return r},"fixCorners"),fw=o(function(t,e,r,n,i,a,s){let{handDrawnSeed:l}=me(),u=e.points,h=!1,f=i;var d=a;let p=[];for(let D in e.cssCompiledStyles)S2(D)||p.push(e.cssCompiledStyles[D]);d.intersect&&f.intersect&&(u=u.slice(1,e.points.length-1),u.unshift(f.intersect(u[0])),X.debug("Last point APA12",e.start,"-->",e.end,u[u.length-1],d,d.intersect(u[u.length-1])),u.push(d.intersect(u[u.length-1]))),e.toCluster&&(X.info("to cluster abc88",r.get(e.toCluster)),u=mee(e.points,r.get(e.toCluster).node),h=!0),e.fromCluster&&(X.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(u,null,2)),u=mee(u.reverse(),r.get(e.fromCluster).node).reverse(),h=!0);let m=u.filter(D=>!Number.isNaN(D.y));m=u9e(m);let g=No;switch(g=Su,e.curve){case"linear":g=Su;break;case"basis":g=No;break;case"cardinal":g=qv;break;case"bumpX":g=Gv;break;case"bumpY":g=Vv;break;case"catmullRom":g=jv;break;case"monotoneX":g=Kv;break;case"monotoneY":g=Qv;break;case"natural":g=K0;break;case"step":g=Q0;break;case"stepAfter":g=Jv;break;case"stepBefore":g=Zv;break;default:g=No}let{x:y,y:v}=ow(e),x=Cl().x(y).y(v).curve(g),b;switch(e.thickness){case"normal":b="edge-thickness-normal";break;case"thick":b="edge-thickness-thick";break;case"invisible":b="edge-thickness-invisible";break;default:b="edge-thickness-normal"}switch(e.pattern){case"solid":b+=" edge-pattern-solid";break;case"dotted":b+=" edge-pattern-dotted";break;case"dashed":b+=" edge-pattern-dashed";break;default:b+=" edge-pattern-solid"}let T,S=x(m),w=Array.isArray(e.style)?e.style:e.style?[e.style]:[],E=w.find(D=>D?.startsWith("stroke:"));if(e.look==="handDrawn"){let D=je.svg(t);Object.assign([],m);let O=D.path(S,{roughness:.3,seed:l});b+=" transition",T=Ge(O).select("path").attr("id",e.id).attr("class"," "+b+(e.classes?" "+e.classes:"")).attr("style",w?w.reduce((k,L)=>k+";"+L,""):"");let R=T.attr("d");T.attr("d",R),t.node().appendChild(T.node())}else{let D=p.join(";"),O=w?w.reduce((L,A)=>L+A+";",""):"",R="";e.animate&&(R=" edge-animation-fast"),e.animation&&(R=" edge-animation-"+e.animation);let k=D?D+";"+O+";":O;T=t.append("path").attr("d",S).attr("id",e.id).attr("class"," "+b+(e.classes?" "+e.classes:"")+(R??"")).attr("style",k),E=k.match(/stroke:([^;]+)/)?.[1]}let _="";(me().flowchart.arrowMarkerAbsolute||me().state.arrowMarkerAbsolute)&&(_=mu(!0)),X.info("arrowTypeStart",e.arrowTypeStart),X.info("arrowTypeEnd",e.arrowTypeEnd),dee(T,e,_,s,n,E);let C={};return h&&(C.updatedPath=u),C.originalPath=e.points,C},"insertEdge")});var h9e,f9e,d9e,p9e,m9e,g9e,y9e,v9e,x9e,b9e,T9e,w9e,k9e,E9e,S9e,C9e,A9e,dw,FL=N(()=>{"use strict";yt();h9e=o((t,e,r,n)=>{e.forEach(i=>{A9e[i](t,r,n)})},"insertMarkers"),f9e=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),d9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),p9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),m9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),g9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),y9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),v9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),x9e=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),b9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),T9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),w9e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),k9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),E9e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");let i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),S9e=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d",`M0,0 - L20,10 - M20,10 - L0,20`)},"requirement_arrow"),C9e=o((t,e,r)=>{let n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains"),A9e={extension:f9e,composition:d9e,aggregation:p9e,dependency:m9e,lollipop:g9e,point:y9e,circle:v9e,cross:x9e,barb:b9e,only_one:T9e,zero_or_one:w9e,one_or_more:k9e,zero_or_more:E9e,requirement_arrow:S9e,requirement_contains:C9e},dw=h9e});async function Am(t,e,r){let n,i;e.shape==="rect"&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");let a=e.shape?IL[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let s;r.config.securityLevel==="sandbox"?s="_top":e.linkTarget&&(s=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",s??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),pw.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}var pw,vee,xee,M2,mw=N(()=>{"use strict";yt();OL();pw=new Map;o(Am,"insertNode");vee=o((t,e)=>{pw.set(e.id,t)},"setNodeElem"),xee=o(()=>{pw.clear()},"clear"),M2=o(t=>{let e=pw.get(t.id);X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});var bee,Tee=N(()=>{"use strict";mi();pr();yt();aw();BL();FL();mw();Ft();er();bee={common:Ze,getConfig:tr,insertCluster:Cm,insertEdge:fw,insertEdgeLabel:uw,insertMarkers:dw,insertNode:Am,interpolateToCurve:A9,labelHelper:mt,log:X,positionEdgeLabel:hw}});function D9e(t){return typeof t=="symbol"||ii(t)&&fa(t)==_9e}var _9e,oo,Wd=N(()=>{"use strict";Au();Oo();_9e="[object Symbol]";o(D9e,"isSymbol");oo=D9e});function L9e(t,e){for(var r=-1,n=t==null?0:t.length,i=Array(n);++r{"use strict";o(L9e,"arrayMap");Bs=L9e});function Eee(t){if(typeof t=="string")return t;if(Pt(t))return Bs(t,Eee)+"";if(oo(t))return kee?kee.call(t):"";var e=t+"";return e=="0"&&1/t==-R9e?"-0":e}var R9e,wee,kee,See,Cee=N(()=>{"use strict";Md();qd();Wn();Wd();R9e=1/0,wee=ea?ea.prototype:void 0,kee=wee?wee.toString:void 0;o(Eee,"baseToString");See=Eee});function M9e(t){for(var e=t.length;e--&&N9e.test(t.charAt(e)););return e}var N9e,Aee,_ee=N(()=>{"use strict";N9e=/\s/;o(M9e,"trimmedEndIndex");Aee=M9e});function O9e(t){return t&&t.slice(0,Aee(t)+1).replace(I9e,"")}var I9e,Dee,Lee=N(()=>{"use strict";_ee();I9e=/^\s+/;o(O9e,"baseTrim");Dee=O9e});function z9e(t){if(typeof t=="number")return t;if(oo(t))return Ree;if(bn(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=bn(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Dee(t);var r=B9e.test(t);return r||F9e.test(t)?$9e(t.slice(2),r?2:8):P9e.test(t)?Ree:+t}var Ree,P9e,B9e,F9e,$9e,Nee,Mee=N(()=>{"use strict";Lee();no();Wd();Ree=NaN,P9e=/^[-+]0x[0-9a-f]+$/i,B9e=/^0b[01]+$/i,F9e=/^0o[0-7]+$/i,$9e=parseInt;o(z9e,"toNumber");Nee=z9e});function V9e(t){if(!t)return t===0?t:0;if(t=Nee(t),t===Iee||t===-Iee){var e=t<0?-1:1;return e*G9e}return t===t?t:0}var Iee,G9e,_m,$L=N(()=>{"use strict";Mee();Iee=1/0,G9e=17976931348623157e292;o(V9e,"toFinite");_m=V9e});function U9e(t){var e=_m(t),r=e%1;return e===e?r?e-r:e:0}var kc,Dm=N(()=>{"use strict";$L();o(U9e,"toInteger");kc=U9e});var H9e,gw,Oee=N(()=>{"use strict";Ph();Mo();H9e=Ls(hi,"WeakMap"),gw=H9e});function W9e(){}var ai,zL=N(()=>{"use strict";o(W9e,"noop");ai=W9e});function q9e(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(q9e,"arrayEach");yw=q9e});function Y9e(t,e,r,n){for(var i=t.length,a=r+(n?1:-1);n?a--:++a{"use strict";o(Y9e,"baseFindIndex");vw=Y9e});function X9e(t){return t!==t}var Pee,Bee=N(()=>{"use strict";o(X9e,"baseIsNaN");Pee=X9e});function j9e(t,e,r){for(var n=r-1,i=t.length;++n{"use strict";o(j9e,"strictIndexOf");Fee=j9e});function K9e(t,e,r){return e===e?Fee(t,e,r):vw(t,Pee,r)}var Lm,xw=N(()=>{"use strict";VL();Bee();$ee();o(K9e,"baseIndexOf");Lm=K9e});function Q9e(t,e){var r=t==null?0:t.length;return!!r&&Lm(t,e,0)>-1}var bw,UL=N(()=>{"use strict";xw();o(Q9e,"arrayIncludes");bw=Q9e});var Z9e,zee,Gee=N(()=>{"use strict";p9();Z9e=mT(Object.keys,Object),zee=Z9e});function tLe(t){if(!mc(t))return zee(t);var e=[];for(var r in Object(t))eLe.call(t,r)&&r!="constructor"&&e.push(r);return e}var J9e,eLe,Rm,Tw=N(()=>{"use strict";um();Gee();J9e=Object.prototype,eLe=J9e.hasOwnProperty;o(tLe,"baseKeys");Rm=tLe});function rLe(t){return fi(t)?bT(t):Rm(t)}var zr,Ec=N(()=>{"use strict";x9();Tw();Po();o(rLe,"keys");zr=rLe});var nLe,iLe,aLe,pa,Vee=N(()=>{"use strict";pm();Fd();k9();Po();um();Ec();nLe=Object.prototype,iLe=nLe.hasOwnProperty,aLe=kT(function(t,e){if(mc(e)||fi(e)){$o(e,zr(e),t);return}for(var r in e)iLe.call(e,r)&&gc(t,r,e[r])}),pa=aLe});function lLe(t,e){if(Pt(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||oo(t)?!0:oLe.test(t)||!sLe.test(t)||e!=null&&t in Object(e)}var sLe,oLe,Nm,ww=N(()=>{"use strict";Wn();Wd();sLe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,oLe=/^\w*$/;o(lLe,"isKey");Nm=lLe});function uLe(t){var e=rm(t,function(n){return r.size===cLe&&r.clear(),n}),r=e.cache;return e}var cLe,Uee,Hee=N(()=>{"use strict";o9();cLe=500;o(uLe,"memoizeCapped");Uee=uLe});var hLe,fLe,dLe,Wee,qee=N(()=>{"use strict";Hee();hLe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,fLe=/\\(\\)?/g,dLe=Uee(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(hLe,function(r,n,i,a){e.push(i?a.replace(fLe,"$1"):n||r)}),e}),Wee=dLe});function pLe(t){return t==null?"":See(t)}var kw,HL=N(()=>{"use strict";Cee();o(pLe,"toString");kw=pLe});function mLe(t,e){return Pt(t)?t:Nm(t,e)?[t]:Wee(kw(t))}var Jh,I2=N(()=>{"use strict";Wn();ww();qee();HL();o(mLe,"castPath");Jh=mLe});function yLe(t){if(typeof t=="string"||oo(t))return t;var e=t+"";return e=="0"&&1/t==-gLe?"-0":e}var gLe,Sc,Mm=N(()=>{"use strict";Wd();gLe=1/0;o(yLe,"toKey");Sc=yLe});function vLe(t,e){e=Jh(e,t);for(var r=0,n=e.length;t!=null&&r{"use strict";I2();Mm();o(vLe,"baseGet");ef=vLe});function xLe(t,e,r){var n=t==null?void 0:ef(t,e);return n===void 0?r:n}var Yee,Xee=N(()=>{"use strict";O2();o(xLe,"get");Yee=xLe});function bLe(t,e){for(var r=-1,n=e.length,i=t.length;++r{"use strict";o(bLe,"arrayPush");Im=bLe});function TLe(t){return Pt(t)||Dl(t)||!!(jee&&t&&t[jee])}var jee,Kee,Qee=N(()=>{"use strict";Md();hm();Wn();jee=ea?ea.isConcatSpreadable:void 0;o(TLe,"isFlattenable");Kee=TLe});function Zee(t,e,r,n,i){var a=-1,s=t.length;for(r||(r=Kee),i||(i=[]);++a0&&r(l)?e>1?Zee(l,e-1,r,n,i):Im(i,l):n||(i[i.length]=l)}return i}var Cc,Om=N(()=>{"use strict";Ew();Qee();o(Zee,"baseFlatten");Cc=Zee});function wLe(t){var e=t==null?0:t.length;return e?Cc(t,1):[]}var qr,Sw=N(()=>{"use strict";Om();o(wLe,"flatten");qr=wLe});function kLe(t){return wT(TT(t,void 0,qr),t+"")}var Jee,ete=N(()=>{"use strict";Sw();b9();w9();o(kLe,"flatRest");Jee=kLe});function ELe(t,e,r){var n=-1,i=t.length;e<0&&(e=-e>i?0:i+e),r=r>i?i:r,r<0&&(r+=i),i=e>r?0:r-e>>>0,e>>>=0;for(var a=Array(i);++n{"use strict";o(ELe,"baseSlice");Cw=ELe});function MLe(t){return NLe.test(t)}var SLe,CLe,ALe,_Le,DLe,LLe,RLe,NLe,tte,rte=N(()=>{"use strict";SLe="\\ud800-\\udfff",CLe="\\u0300-\\u036f",ALe="\\ufe20-\\ufe2f",_Le="\\u20d0-\\u20ff",DLe=CLe+ALe+_Le,LLe="\\ufe0e\\ufe0f",RLe="\\u200d",NLe=RegExp("["+RLe+SLe+DLe+LLe+"]");o(MLe,"hasUnicode");tte=MLe});function ILe(t,e,r,n){var i=-1,a=t==null?0:t.length;for(n&&a&&(r=t[++i]);++i{"use strict";o(ILe,"arrayReduce");nte=ILe});function OLe(t,e){return t&&$o(e,zr(e),t)}var ate,ste=N(()=>{"use strict";Fd();Ec();o(OLe,"baseAssign");ate=OLe});function PLe(t,e){return t&&$o(e,Rs(e),t)}var ote,lte=N(()=>{"use strict";Fd();Uh();o(PLe,"baseAssignIn");ote=PLe});function BLe(t,e){for(var r=-1,n=t==null?0:t.length,i=0,a=[];++r{"use strict";o(BLe,"arrayFilter");Pm=BLe});function FLe(){return[]}var _w,qL=N(()=>{"use strict";o(FLe,"stubArray");_w=FLe});var $Le,zLe,cte,GLe,Bm,Dw=N(()=>{"use strict";Aw();qL();$Le=Object.prototype,zLe=$Le.propertyIsEnumerable,cte=Object.getOwnPropertySymbols,GLe=cte?function(t){return t==null?[]:(t=Object(t),Pm(cte(t),function(e){return zLe.call(t,e)}))}:_w,Bm=GLe});function VLe(t,e){return $o(t,Bm(t),e)}var ute,hte=N(()=>{"use strict";Fd();Dw();o(VLe,"copySymbols");ute=VLe});var ULe,HLe,Lw,YL=N(()=>{"use strict";Ew();gT();Dw();qL();ULe=Object.getOwnPropertySymbols,HLe=ULe?function(t){for(var e=[];t;)Im(e,Bm(t)),t=cm(t);return e}:_w,Lw=HLe});function WLe(t,e){return $o(t,Lw(t),e)}var fte,dte=N(()=>{"use strict";Fd();YL();o(WLe,"copySymbolsIn");fte=WLe});function qLe(t,e,r){var n=e(t);return Pt(t)?n:Im(n,r(t))}var Rw,XL=N(()=>{"use strict";Ew();Wn();o(qLe,"baseGetAllKeys");Rw=qLe});function YLe(t){return Rw(t,zr,Bm)}var P2,jL=N(()=>{"use strict";XL();Dw();Ec();o(YLe,"getAllKeys");P2=YLe});function XLe(t){return Rw(t,Rs,Lw)}var Nw,KL=N(()=>{"use strict";XL();YL();Uh();o(XLe,"getAllKeysIn");Nw=XLe});var jLe,Mw,pte=N(()=>{"use strict";Ph();Mo();jLe=Ls(hi,"DataView"),Mw=jLe});var KLe,Iw,mte=N(()=>{"use strict";Ph();Mo();KLe=Ls(hi,"Promise"),Iw=KLe});var QLe,tf,QL=N(()=>{"use strict";Ph();Mo();QLe=Ls(hi,"Set"),tf=QLe});var gte,ZLe,yte,vte,xte,bte,JLe,eRe,tRe,rRe,nRe,Yd,lo,Xd=N(()=>{"use strict";pte();lT();mte();QL();Oee();Au();i9();gte="[object Map]",ZLe="[object Object]",yte="[object Promise]",vte="[object Set]",xte="[object WeakMap]",bte="[object DataView]",JLe=_u(Mw),eRe=_u($h),tRe=_u(Iw),rRe=_u(tf),nRe=_u(gw),Yd=fa;(Mw&&Yd(new Mw(new ArrayBuffer(1)))!=bte||$h&&Yd(new $h)!=gte||Iw&&Yd(Iw.resolve())!=yte||tf&&Yd(new tf)!=vte||gw&&Yd(new gw)!=xte)&&(Yd=o(function(t){var e=fa(t),r=e==ZLe?t.constructor:void 0,n=r?_u(r):"";if(n)switch(n){case JLe:return bte;case eRe:return gte;case tRe:return yte;case rRe:return vte;case nRe:return xte}return e},"getTag"));lo=Yd});function sRe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&aRe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}var iRe,aRe,Tte,wte=N(()=>{"use strict";iRe=Object.prototype,aRe=iRe.hasOwnProperty;o(sRe,"initCloneArray");Tte=sRe});function oRe(t,e){var r=e?lm(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}var kte,Ete=N(()=>{"use strict";fT();o(oRe,"cloneDataView");kte=oRe});function cRe(t){var e=new t.constructor(t.source,lRe.exec(t));return e.lastIndex=t.lastIndex,e}var lRe,Ste,Cte=N(()=>{"use strict";lRe=/\w*$/;o(cRe,"cloneRegExp");Ste=cRe});function uRe(t){return _te?Object(_te.call(t)):{}}var Ate,_te,Dte,Lte=N(()=>{"use strict";Md();Ate=ea?ea.prototype:void 0,_te=Ate?Ate.valueOf:void 0;o(uRe,"cloneSymbol");Dte=uRe});function LRe(t,e,r){var n=t.constructor;switch(e){case xRe:return lm(t);case hRe:case fRe:return new n(+t);case bRe:return kte(t,r);case TRe:case wRe:case kRe:case ERe:case SRe:case CRe:case ARe:case _Re:case DRe:return dT(t,r);case dRe:return new n;case pRe:case yRe:return new n(t);case mRe:return Ste(t);case gRe:return new n;case vRe:return Dte(t)}}var hRe,fRe,dRe,pRe,mRe,gRe,yRe,vRe,xRe,bRe,TRe,wRe,kRe,ERe,SRe,CRe,ARe,_Re,DRe,Rte,Nte=N(()=>{"use strict";fT();Ete();Cte();Lte();f9();hRe="[object Boolean]",fRe="[object Date]",dRe="[object Map]",pRe="[object Number]",mRe="[object RegExp]",gRe="[object Set]",yRe="[object String]",vRe="[object Symbol]",xRe="[object ArrayBuffer]",bRe="[object DataView]",TRe="[object Float32Array]",wRe="[object Float64Array]",kRe="[object Int8Array]",ERe="[object Int16Array]",SRe="[object Int32Array]",CRe="[object Uint8Array]",ARe="[object Uint8ClampedArray]",_Re="[object Uint16Array]",DRe="[object Uint32Array]";o(LRe,"initCloneByTag");Rte=LRe});function NRe(t){return ii(t)&&lo(t)==RRe}var RRe,Mte,Ite=N(()=>{"use strict";Xd();Oo();RRe="[object Map]";o(NRe,"baseIsMap");Mte=NRe});var Ote,MRe,Pte,Bte=N(()=>{"use strict";Ite();Bd();h2();Ote=Fo&&Fo.isMap,MRe=Ote?Bo(Ote):Mte,Pte=MRe});function ORe(t){return ii(t)&&lo(t)==IRe}var IRe,Fte,$te=N(()=>{"use strict";Xd();Oo();IRe="[object Set]";o(ORe,"baseIsSet");Fte=ORe});var zte,PRe,Gte,Vte=N(()=>{"use strict";$te();Bd();h2();zte=Fo&&Fo.isSet,PRe=zte?Bo(zte):Fte,Gte=PRe});function Ow(t,e,r,n,i,a){var s,l=e&BRe,u=e&FRe,h=e&$Re;if(r&&(s=i?r(t,n,i,a):r(t)),s!==void 0)return s;if(!bn(t))return t;var f=Pt(t);if(f){if(s=Tte(t),!l)return pT(t,s)}else{var d=lo(t),p=d==Hte||d==HRe;if(Ll(t))return hT(t,l);if(d==Wte||d==Ute||p&&!i){if(s=u||p?{}:yT(t),!l)return u?fte(t,ote(s,t)):ute(t,ate(s,t))}else{if(!_n[d])return i?t:{};s=Rte(t,d,l)}}a||(a=new dc);var m=a.get(t);if(m)return m;a.set(t,s),Gte(t)?t.forEach(function(v){s.add(Ow(v,e,r,v,t,a))}):Pte(t)&&t.forEach(function(v,x){s.set(x,Ow(v,e,r,x,t,a))});var g=h?u?Nw:P2:u?Rs:zr,y=f?void 0:g(t);return yw(y||t,function(v,x){y&&(x=v,v=t[x]),gc(s,x,Ow(v,e,r,x,t,a))}),s}var BRe,FRe,$Re,Ute,zRe,GRe,VRe,URe,Hte,HRe,WRe,qRe,Wte,YRe,XRe,jRe,KRe,QRe,ZRe,JRe,eNe,tNe,rNe,nNe,iNe,aNe,sNe,oNe,lNe,_n,Pw,ZL=N(()=>{"use strict";l2();GL();pm();ste();lte();u9();d9();hte();dte();jL();KL();Xd();wte();Nte();m9();Wn();dm();Bte();no();Vte();Ec();Uh();BRe=1,FRe=2,$Re=4,Ute="[object Arguments]",zRe="[object Array]",GRe="[object Boolean]",VRe="[object Date]",URe="[object Error]",Hte="[object Function]",HRe="[object GeneratorFunction]",WRe="[object Map]",qRe="[object Number]",Wte="[object Object]",YRe="[object RegExp]",XRe="[object Set]",jRe="[object String]",KRe="[object Symbol]",QRe="[object WeakMap]",ZRe="[object ArrayBuffer]",JRe="[object DataView]",eNe="[object Float32Array]",tNe="[object Float64Array]",rNe="[object Int8Array]",nNe="[object Int16Array]",iNe="[object Int32Array]",aNe="[object Uint8Array]",sNe="[object Uint8ClampedArray]",oNe="[object Uint16Array]",lNe="[object Uint32Array]",_n={};_n[Ute]=_n[zRe]=_n[ZRe]=_n[JRe]=_n[GRe]=_n[VRe]=_n[eNe]=_n[tNe]=_n[rNe]=_n[nNe]=_n[iNe]=_n[WRe]=_n[qRe]=_n[Wte]=_n[YRe]=_n[XRe]=_n[jRe]=_n[KRe]=_n[aNe]=_n[sNe]=_n[oNe]=_n[lNe]=!0;_n[URe]=_n[Hte]=_n[QRe]=!1;o(Ow,"baseClone");Pw=Ow});function uNe(t){return Pw(t,cNe)}var cNe,an,JL=N(()=>{"use strict";ZL();cNe=4;o(uNe,"clone");an=uNe});function dNe(t){return Pw(t,hNe|fNe)}var hNe,fNe,eR,qte=N(()=>{"use strict";ZL();hNe=1,fNe=4;o(dNe,"cloneDeep");eR=dNe});function pNe(t){for(var e=-1,r=t==null?0:t.length,n=0,i=[];++e{"use strict";o(pNe,"compact");Ac=pNe});function gNe(t){return this.__data__.set(t,mNe),this}var mNe,Xte,jte=N(()=>{"use strict";mNe="__lodash_hash_undefined__";o(gNe,"setCacheAdd");Xte=gNe});function yNe(t){return this.__data__.has(t)}var Kte,Qte=N(()=>{"use strict";o(yNe,"setCacheHas");Kte=yNe});function Bw(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new Od;++e{"use strict";cT();jte();Qte();o(Bw,"SetCache");Bw.prototype.add=Bw.prototype.push=Xte;Bw.prototype.has=Kte;Fm=Bw});function vNe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(vNe,"arraySome");$w=vNe});function xNe(t,e){return t.has(e)}var $m,zw=N(()=>{"use strict";o(xNe,"cacheHas");$m=xNe});function wNe(t,e,r,n,i,a){var s=r&bNe,l=t.length,u=e.length;if(l!=u&&!(s&&u>l))return!1;var h=a.get(t),f=a.get(e);if(h&&f)return h==e&&f==t;var d=-1,p=!0,m=r&TNe?new Fm:void 0;for(a.set(t,e),a.set(e,t);++d{"use strict";Fw();tR();zw();bNe=1,TNe=2;o(wNe,"equalArrays");Gw=wNe});function kNe(t){var e=-1,r=Array(t.size);return t.forEach(function(n,i){r[++e]=[i,n]}),r}var Zte,Jte=N(()=>{"use strict";o(kNe,"mapToArray");Zte=kNe});function ENe(t){var e=-1,r=Array(t.size);return t.forEach(function(n){r[++e]=n}),r}var zm,Vw=N(()=>{"use strict";o(ENe,"setToArray");zm=ENe});function FNe(t,e,r,n,i,a,s){switch(r){case BNe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case PNe:return!(t.byteLength!=e.byteLength||!a(new om(t),new om(e)));case ANe:case _Ne:case RNe:return Io(+t,+e);case DNe:return t.name==e.name&&t.message==e.message;case NNe:case INe:return t==e+"";case LNe:var l=Zte;case MNe:var u=n&SNe;if(l||(l=zm),t.size!=e.size&&!u)return!1;var h=s.get(t);if(h)return h==e;n|=CNe,s.set(t,e);var f=Gw(l(t),l(e),n,i,a,s);return s.delete(t),f;case ONe:if(nR)return nR.call(t)==nR.call(e)}return!1}var SNe,CNe,ANe,_Ne,DNe,LNe,RNe,NNe,MNe,INe,ONe,PNe,BNe,ere,nR,tre,rre=N(()=>{"use strict";Md();h9();Id();rR();Jte();Vw();SNe=1,CNe=2,ANe="[object Boolean]",_Ne="[object Date]",DNe="[object Error]",LNe="[object Map]",RNe="[object Number]",NNe="[object RegExp]",MNe="[object Set]",INe="[object String]",ONe="[object Symbol]",PNe="[object ArrayBuffer]",BNe="[object DataView]",ere=ea?ea.prototype:void 0,nR=ere?ere.valueOf:void 0;o(FNe,"equalByTag");tre=FNe});function VNe(t,e,r,n,i,a){var s=r&$Ne,l=P2(t),u=l.length,h=P2(e),f=h.length;if(u!=f&&!s)return!1;for(var d=u;d--;){var p=l[d];if(!(s?p in e:GNe.call(e,p)))return!1}var m=a.get(t),g=a.get(e);if(m&&g)return m==e&&g==t;var y=!0;a.set(t,e),a.set(e,t);for(var v=s;++d{"use strict";jL();$Ne=1,zNe=Object.prototype,GNe=zNe.hasOwnProperty;o(VNe,"equalObjects");nre=VNe});function WNe(t,e,r,n,i,a){var s=Pt(t),l=Pt(e),u=s?sre:lo(t),h=l?sre:lo(e);u=u==are?Uw:u,h=h==are?Uw:h;var f=u==Uw,d=h==Uw,p=u==h;if(p&&Ll(t)){if(!Ll(e))return!1;s=!0,f=!1}if(p&&!f)return a||(a=new dc),s||Gh(t)?Gw(t,e,r,n,i,a):tre(t,e,u,r,n,i,a);if(!(r&UNe)){var m=f&&ore.call(t,"__wrapped__"),g=d&&ore.call(e,"__wrapped__");if(m||g){var y=m?t.value():t,v=g?e.value():e;return a||(a=new dc),i(y,v,r,n,a)}}return p?(a||(a=new dc),nre(t,e,r,n,i,a)):!1}var UNe,are,sre,Uw,HNe,ore,lre,cre=N(()=>{"use strict";l2();rR();rre();ire();Xd();Wn();dm();f2();UNe=1,are="[object Arguments]",sre="[object Array]",Uw="[object Object]",HNe=Object.prototype,ore=HNe.hasOwnProperty;o(WNe,"baseIsEqualDeep");lre=WNe});function ure(t,e,r,n,i){return t===e?!0:t==null||e==null||!ii(t)&&!ii(e)?t!==t&&e!==e:lre(t,e,r,n,ure,i)}var Hw,iR=N(()=>{"use strict";cre();Oo();o(ure,"baseIsEqual");Hw=ure});function XNe(t,e,r,n){var i=r.length,a=i,s=!n;if(t==null)return!a;for(t=Object(t);i--;){var l=r[i];if(s&&l[2]?l[1]!==t[l[0]]:!(l[0]in t))return!1}for(;++i{"use strict";l2();iR();qNe=1,YNe=2;o(XNe,"baseIsMatch");hre=XNe});function jNe(t){return t===t&&!bn(t)}var Ww,aR=N(()=>{"use strict";no();o(jNe,"isStrictComparable");Ww=jNe});function KNe(t){for(var e=zr(t),r=e.length;r--;){var n=e[r],i=t[n];e[r]=[n,i,Ww(i)]}return e}var dre,pre=N(()=>{"use strict";aR();Ec();o(KNe,"getMatchData");dre=KNe});function QNe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}var qw,sR=N(()=>{"use strict";o(QNe,"matchesStrictComparable");qw=QNe});function ZNe(t){var e=dre(t);return e.length==1&&e[0][2]?qw(e[0][0],e[0][1]):function(r){return r===t||hre(r,t,e)}}var mre,gre=N(()=>{"use strict";fre();pre();sR();o(ZNe,"baseMatches");mre=ZNe});function JNe(t,e){return t!=null&&e in Object(t)}var yre,vre=N(()=>{"use strict";o(JNe,"baseHasIn");yre=JNe});function eMe(t,e,r){e=Jh(e,t);for(var n=-1,i=e.length,a=!1;++n{"use strict";I2();hm();Wn();p2();vT();Mm();o(eMe,"hasPath");Yw=eMe});function tMe(t,e){return t!=null&&Yw(t,e,yre)}var Xw,lR=N(()=>{"use strict";vre();oR();o(tMe,"hasIn");Xw=tMe});function iMe(t,e){return Nm(t)&&Ww(e)?qw(Sc(t),e):function(r){var n=Yee(r,t);return n===void 0&&n===e?Xw(r,t):Hw(e,n,rMe|nMe)}}var rMe,nMe,xre,bre=N(()=>{"use strict";iR();Xee();lR();ww();aR();sR();Mm();rMe=1,nMe=2;o(iMe,"baseMatchesProperty");xre=iMe});function aMe(t){return function(e){return e?.[t]}}var jw,cR=N(()=>{"use strict";o(aMe,"baseProperty");jw=aMe});function sMe(t){return function(e){return ef(e,t)}}var Tre,wre=N(()=>{"use strict";O2();o(sMe,"basePropertyDeep");Tre=sMe});function oMe(t){return Nm(t)?jw(Sc(t)):Tre(t)}var kre,Ere=N(()=>{"use strict";cR();wre();ww();Mm();o(oMe,"property");kre=oMe});function lMe(t){return typeof t=="function"?t:t==null?ta:typeof t=="object"?Pt(t)?xre(t[0],t[1]):mre(t):kre(t)}var mn,os=N(()=>{"use strict";gre();bre();Lu();Wn();Ere();o(lMe,"baseIteratee");mn=lMe});function cMe(t,e,r,n){for(var i=-1,a=t==null?0:t.length;++i{"use strict";o(cMe,"arrayAggregator");Sre=cMe});function uMe(t,e){return t&&sm(t,e,zr)}var Gm,Kw=N(()=>{"use strict";uT();Ec();o(uMe,"baseForOwn");Gm=uMe});function hMe(t,e){return function(r,n){if(r==null)return r;if(!fi(r))return t(r,n);for(var i=r.length,a=e?i:-1,s=Object(r);(e?a--:++a{"use strict";Po();o(hMe,"createBaseEach");Are=hMe});var fMe,Fs,rf=N(()=>{"use strict";Kw();_re();fMe=Are(Gm),Fs=fMe});function dMe(t,e,r,n){return Fs(t,function(i,a,s){e(n,i,r(i),s)}),n}var Dre,Lre=N(()=>{"use strict";rf();o(dMe,"baseAggregator");Dre=dMe});function pMe(t,e){return function(r,n){var i=Pt(r)?Sre:Dre,a=e?e():{};return i(r,t,mn(n,2),a)}}var Rre,Nre=N(()=>{"use strict";Cre();Lre();os();Wn();o(pMe,"createAggregator");Rre=pMe});var mMe,Qw,Mre=N(()=>{"use strict";Mo();mMe=o(function(){return hi.Date.now()},"now"),Qw=mMe});var Ire,gMe,yMe,nf,Ore=N(()=>{"use strict";mm();Id();$d();Uh();Ire=Object.prototype,gMe=Ire.hasOwnProperty,yMe=yc(function(t,e){t=Object(t);var r=-1,n=e.length,i=n>2?e[2]:void 0;for(i&&io(e[0],e[1],i)&&(n=1);++r{"use strict";o(vMe,"arrayIncludesWith");Zw=vMe});function bMe(t,e,r,n){var i=-1,a=bw,s=!0,l=t.length,u=[],h=e.length;if(!l)return u;r&&(e=Bs(e,Bo(r))),n?(a=Zw,s=!1):e.length>=xMe&&(a=$m,s=!1,e=new Fm(e));e:for(;++i{"use strict";Fw();UL();uR();qd();Bd();zw();xMe=200;o(bMe,"baseDifference");Pre=bMe});var TMe,af,Fre=N(()=>{"use strict";Bre();Om();mm();xT();TMe=yc(function(t,e){return Pd(t)?Pre(t,Cc(e,1,Pd,!0)):[]}),af=TMe});function wMe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}var ma,$re=N(()=>{"use strict";o(wMe,"last");ma=wMe});function kMe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:kc(e),Cw(t,e<0?0:e,n)):[]}var bi,zre=N(()=>{"use strict";WL();Dm();o(kMe,"drop");bi=kMe});function EMe(t,e,r){var n=t==null?0:t.length;return n?(e=r||e===void 0?1:kc(e),e=n-e,Cw(t,0,e<0?0:e)):[]}var Fu,Gre=N(()=>{"use strict";WL();Dm();o(EMe,"dropRight");Fu=EMe});function SMe(t){return typeof t=="function"?t:ta}var Vm,Jw=N(()=>{"use strict";Lu();o(SMe,"castFunction");Vm=SMe});function CMe(t,e){var r=Pt(t)?yw:Fs;return r(t,Vm(e))}var Ae,ek=N(()=>{"use strict";GL();rf();Jw();Wn();o(CMe,"forEach");Ae=CMe});var Vre=N(()=>{"use strict";ek()});function AMe(t,e){for(var r=-1,n=t==null?0:t.length;++r{"use strict";o(AMe,"arrayEvery");Ure=AMe});function _Me(t,e){var r=!0;return Fs(t,function(n,i,a){return r=!!e(n,i,a),r}),r}var Wre,qre=N(()=>{"use strict";rf();o(_Me,"baseEvery");Wre=_Me});function DMe(t,e,r){var n=Pt(t)?Ure:Wre;return r&&io(t,e,r)&&(e=void 0),n(t,mn(e,3))}var Pa,Yre=N(()=>{"use strict";Hre();qre();os();Wn();$d();o(DMe,"every");Pa=DMe});function LMe(t,e){var r=[];return Fs(t,function(n,i,a){e(n,i,a)&&r.push(n)}),r}var tk,hR=N(()=>{"use strict";rf();o(LMe,"baseFilter");tk=LMe});function RMe(t,e){var r=Pt(t)?Pm:tk;return r(t,mn(e,3))}var Yr,fR=N(()=>{"use strict";Aw();hR();os();Wn();o(RMe,"filter");Yr=RMe});function NMe(t){return function(e,r,n){var i=Object(e);if(!fi(e)){var a=mn(r,3);e=zr(e),r=o(function(l){return a(i[l],l,i)},"predicate")}var s=t(e,r,n);return s>-1?i[a?e[s]:s]:void 0}}var Xre,jre=N(()=>{"use strict";os();Po();Ec();o(NMe,"createFind");Xre=NMe});function IMe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:kc(r);return i<0&&(i=MMe(n+i,0)),vw(t,mn(e,3),i)}var MMe,Kre,Qre=N(()=>{"use strict";VL();os();Dm();MMe=Math.max;o(IMe,"findIndex");Kre=IMe});var OMe,ls,Zre=N(()=>{"use strict";jre();Qre();OMe=Xre(Kre),ls=OMe});function PMe(t){return t&&t.length?t[0]:void 0}var ia,Jre=N(()=>{"use strict";o(PMe,"head");ia=PMe});var ene=N(()=>{"use strict";Jre()});function BMe(t,e){var r=-1,n=fi(t)?Array(t.length):[];return Fs(t,function(i,a,s){n[++r]=e(i,a,s)}),n}var rk,dR=N(()=>{"use strict";rf();Po();o(BMe,"baseMap");rk=BMe});function FMe(t,e){var r=Pt(t)?Bs:rk;return r(t,mn(e,3))}var Je,Um=N(()=>{"use strict";qd();os();dR();Wn();o(FMe,"map");Je=FMe});function $Me(t,e){return Cc(Je(t,e),1)}var ga,pR=N(()=>{"use strict";Om();Um();o($Me,"flatMap");ga=$Me});function zMe(t,e){return t==null?t:sm(t,Vm(e),Rs)}var mR,tne=N(()=>{"use strict";uT();Jw();Uh();o(zMe,"forIn");mR=zMe});function GMe(t,e){return t&&Gm(t,Vm(e))}var gR,rne=N(()=>{"use strict";Kw();Jw();o(GMe,"forOwn");gR=GMe});var VMe,UMe,HMe,yR,nne=N(()=>{"use strict";am();Nre();VMe=Object.prototype,UMe=VMe.hasOwnProperty,HMe=Rre(function(t,e,r){UMe.call(t,r)?t[r].push(e):pc(t,r,[e])}),yR=HMe});function WMe(t,e){return t>e}var ine,ane=N(()=>{"use strict";o(WMe,"baseGt");ine=WMe});function XMe(t,e){return t!=null&&YMe.call(t,e)}var qMe,YMe,sne,one=N(()=>{"use strict";qMe=Object.prototype,YMe=qMe.hasOwnProperty;o(XMe,"baseHas");sne=XMe});function jMe(t,e){return t!=null&&Yw(t,e,sne)}var Bt,lne=N(()=>{"use strict";one();oR();o(jMe,"has");Bt=jMe});function QMe(t){return typeof t=="string"||!Pt(t)&&ii(t)&&fa(t)==KMe}var KMe,Ti,nk=N(()=>{"use strict";Au();Wn();Oo();KMe="[object String]";o(QMe,"isString");Ti=QMe});function ZMe(t,e){return Bs(e,function(r){return t[r]})}var cne,une=N(()=>{"use strict";qd();o(ZMe,"baseValues");cne=ZMe});function JMe(t){return t==null?[]:cne(t,zr(t))}var br,vR=N(()=>{"use strict";une();Ec();o(JMe,"values");br=JMe});function tIe(t,e,r,n){t=fi(t)?t:br(t),r=r&&!n?kc(r):0;var i=t.length;return r<0&&(r=eIe(i+r,0)),Ti(t)?r<=i&&t.indexOf(e,r)>-1:!!i&&Lm(t,e,r)>-1}var eIe,Xn,hne=N(()=>{"use strict";xw();Po();nk();Dm();vR();eIe=Math.max;o(tIe,"includes");Xn=tIe});function nIe(t,e,r){var n=t==null?0:t.length;if(!n)return-1;var i=r==null?0:kc(r);return i<0&&(i=rIe(n+i,0)),Lm(t,e,i)}var rIe,ik,fne=N(()=>{"use strict";xw();Dm();rIe=Math.max;o(nIe,"indexOf");ik=nIe});function lIe(t){if(t==null)return!0;if(fi(t)&&(Pt(t)||typeof t=="string"||typeof t.splice=="function"||Ll(t)||Gh(t)||Dl(t)))return!t.length;var e=lo(t);if(e==iIe||e==aIe)return!t.size;if(mc(t))return!Rm(t).length;for(var r in t)if(oIe.call(t,r))return!1;return!0}var iIe,aIe,sIe,oIe,hr,ak=N(()=>{"use strict";Tw();Xd();hm();Wn();Po();dm();um();f2();iIe="[object Map]",aIe="[object Set]",sIe=Object.prototype,oIe=sIe.hasOwnProperty;o(lIe,"isEmpty");hr=lIe});function uIe(t){return ii(t)&&fa(t)==cIe}var cIe,dne,pne=N(()=>{"use strict";Au();Oo();cIe="[object RegExp]";o(uIe,"baseIsRegExp");dne=uIe});var mne,hIe,Uo,gne=N(()=>{"use strict";pne();Bd();h2();mne=Fo&&Fo.isRegExp,hIe=mne?Bo(mne):dne,Uo=hIe});function fIe(t){return t===void 0}var mr,yne=N(()=>{"use strict";o(fIe,"isUndefined");mr=fIe});function dIe(t,e){return t{"use strict";o(dIe,"baseLt");sk=dIe});function pIe(t,e){var r={};return e=mn(e,3),Gm(t,function(n,i,a){pc(r,i,e(n,i,a))}),r}var jd,vne=N(()=>{"use strict";am();Kw();os();o(pIe,"mapValues");jd=pIe});function mIe(t,e,r){for(var n=-1,i=t.length;++n{"use strict";Wd();o(mIe,"baseExtremum");Hm=mIe});function gIe(t){return t&&t.length?Hm(t,ta,ine):void 0}var $s,xne=N(()=>{"use strict";ok();ane();Lu();o(gIe,"max");$s=gIe});function yIe(t){return t&&t.length?Hm(t,ta,sk):void 0}var Nl,bR=N(()=>{"use strict";ok();xR();Lu();o(yIe,"min");Nl=yIe});function vIe(t,e){return t&&t.length?Hm(t,mn(e,2),sk):void 0}var Kd,bne=N(()=>{"use strict";ok();os();xR();o(vIe,"minBy");Kd=vIe});function bIe(t){if(typeof t!="function")throw new TypeError(xIe);return function(){var e=arguments;switch(e.length){case 0:return!t.call(this);case 1:return!t.call(this,e[0]);case 2:return!t.call(this,e[0],e[1]);case 3:return!t.call(this,e[0],e[1],e[2])}return!t.apply(this,e)}}var xIe,Tne,wne=N(()=>{"use strict";xIe="Expected a function";o(bIe,"negate");Tne=bIe});function TIe(t,e,r,n){if(!bn(t))return t;e=Jh(e,t);for(var i=-1,a=e.length,s=a-1,l=t;l!=null&&++i{"use strict";pm();I2();p2();no();Mm();o(TIe,"baseSet");kne=TIe});function wIe(t,e,r){for(var n=-1,i=e.length,a={};++n{"use strict";O2();Ene();I2();o(wIe,"basePickBy");lk=wIe});function kIe(t,e){if(t==null)return{};var r=Bs(Nw(t),function(n){return[n]});return e=mn(e),lk(t,r,function(n,i){return e(n,i[0])})}var zs,Sne=N(()=>{"use strict";qd();os();TR();KL();o(kIe,"pickBy");zs=kIe});function EIe(t,e){var r=t.length;for(t.sort(e);r--;)t[r]=t[r].value;return t}var Cne,Ane=N(()=>{"use strict";o(EIe,"baseSortBy");Cne=EIe});function SIe(t,e){if(t!==e){var r=t!==void 0,n=t===null,i=t===t,a=oo(t),s=e!==void 0,l=e===null,u=e===e,h=oo(e);if(!l&&!h&&!a&&t>e||a&&s&&u&&!l&&!h||n&&s&&u||!r&&u||!i)return 1;if(!n&&!a&&!h&&t{"use strict";Wd();o(SIe,"compareAscending");_ne=SIe});function CIe(t,e,r){for(var n=-1,i=t.criteria,a=e.criteria,s=i.length,l=r.length;++n=l)return u;var h=r[n];return u*(h=="desc"?-1:1)}}return t.index-e.index}var Lne,Rne=N(()=>{"use strict";Dne();o(CIe,"compareMultiple");Lne=CIe});function AIe(t,e,r){e.length?e=Bs(e,function(a){return Pt(a)?function(s){return ef(s,a.length===1?a[0]:a)}:a}):e=[ta];var n=-1;e=Bs(e,Bo(mn));var i=rk(t,function(a,s,l){var u=Bs(e,function(h){return h(a)});return{criteria:u,index:++n,value:a}});return Cne(i,function(a,s){return Lne(a,s,r)})}var Nne,Mne=N(()=>{"use strict";qd();O2();os();dR();Ane();Bd();Rne();Lu();Wn();o(AIe,"baseOrderBy");Nne=AIe});var _Ie,Ine,One=N(()=>{"use strict";cR();_Ie=jw("length"),Ine=_Ie});function zIe(t){for(var e=Pne.lastIndex=0;Pne.test(t);)++e;return e}var Bne,DIe,LIe,RIe,NIe,MIe,IIe,wR,kR,OIe,Fne,$ne,zne,PIe,Gne,Vne,BIe,FIe,$Ie,Pne,Une,Hne=N(()=>{"use strict";Bne="\\ud800-\\udfff",DIe="\\u0300-\\u036f",LIe="\\ufe20-\\ufe2f",RIe="\\u20d0-\\u20ff",NIe=DIe+LIe+RIe,MIe="\\ufe0e\\ufe0f",IIe="["+Bne+"]",wR="["+NIe+"]",kR="\\ud83c[\\udffb-\\udfff]",OIe="(?:"+wR+"|"+kR+")",Fne="[^"+Bne+"]",$ne="(?:\\ud83c[\\udde6-\\uddff]){2}",zne="[\\ud800-\\udbff][\\udc00-\\udfff]",PIe="\\u200d",Gne=OIe+"?",Vne="["+MIe+"]?",BIe="(?:"+PIe+"(?:"+[Fne,$ne,zne].join("|")+")"+Vne+Gne+")*",FIe=Vne+Gne+BIe,$Ie="(?:"+[Fne+wR+"?",wR,$ne,zne,IIe].join("|")+")",Pne=RegExp(kR+"(?="+kR+")|"+$Ie+FIe,"g");o(zIe,"unicodeSize");Une=zIe});function GIe(t){return tte(t)?Une(t):Ine(t)}var Wne,qne=N(()=>{"use strict";One();rte();Hne();o(GIe,"stringSize");Wne=GIe});function VIe(t,e){return lk(t,e,function(r,n){return Xw(t,n)})}var Yne,Xne=N(()=>{"use strict";TR();lR();o(VIe,"basePick");Yne=VIe});var UIe,Qd,jne=N(()=>{"use strict";Xne();ete();UIe=Jee(function(t,e){return t==null?{}:Yne(t,e)}),Qd=UIe});function qIe(t,e,r,n){for(var i=-1,a=WIe(HIe((e-t)/(r||1)),0),s=Array(a);a--;)s[n?a:++i]=t,t+=r;return s}var HIe,WIe,Kne,Qne=N(()=>{"use strict";HIe=Math.ceil,WIe=Math.max;o(qIe,"baseRange");Kne=qIe});function YIe(t){return function(e,r,n){return n&&typeof n!="number"&&io(e,r,n)&&(r=n=void 0),e=_m(e),r===void 0?(r=e,e=0):r=_m(r),n=n===void 0?e{"use strict";Qne();$d();$L();o(YIe,"createRange");Zne=YIe});var XIe,Ho,eie=N(()=>{"use strict";Jne();XIe=Zne(),Ho=XIe});function jIe(t,e,r,n,i){return i(t,function(a,s,l){r=n?(n=!1,a):e(r,a,s,l)}),r}var tie,rie=N(()=>{"use strict";o(jIe,"baseReduce");tie=jIe});function KIe(t,e,r){var n=Pt(t)?nte:tie,i=arguments.length<3;return n(t,mn(e,4),r,i,Fs)}var Xr,ER=N(()=>{"use strict";ite();rf();os();rie();Wn();o(KIe,"reduce");Xr=KIe});function QIe(t,e){var r=Pt(t)?Pm:tk;return r(t,Tne(mn(e,3)))}var sf,nie=N(()=>{"use strict";Aw();hR();os();Wn();wne();o(QIe,"reject");sf=QIe});function eOe(t){if(t==null)return 0;if(fi(t))return Ti(t)?Wne(t):t.length;var e=lo(t);return e==ZIe||e==JIe?t.size:Rm(t).length}var ZIe,JIe,SR,iie=N(()=>{"use strict";Tw();Xd();Po();nk();qne();ZIe="[object Map]",JIe="[object Set]";o(eOe,"size");SR=eOe});function tOe(t,e){var r;return Fs(t,function(n,i,a){return r=e(n,i,a),!r}),!!r}var aie,sie=N(()=>{"use strict";rf();o(tOe,"baseSome");aie=tOe});function rOe(t,e,r){var n=Pt(t)?$w:aie;return r&&io(t,e,r)&&(e=void 0),n(t,mn(e,3))}var B2,oie=N(()=>{"use strict";tR();os();sie();Wn();$d();o(rOe,"some");B2=rOe});var nOe,_c,lie=N(()=>{"use strict";Om();Mne();mm();$d();nOe=yc(function(t,e){if(t==null)return[];var r=e.length;return r>1&&io(t,e[0],e[1])?e=[]:r>2&&io(e[0],e[1],e[2])&&(e=[e[0]]),Nne(t,Cc(e,1),[])}),_c=nOe});var iOe,aOe,cie,uie=N(()=>{"use strict";QL();zL();Vw();iOe=1/0,aOe=tf&&1/zm(new tf([,-0]))[1]==iOe?function(t){return new tf(t)}:ai,cie=aOe});function oOe(t,e,r){var n=-1,i=bw,a=t.length,s=!0,l=[],u=l;if(r)s=!1,i=Zw;else if(a>=sOe){var h=e?null:cie(t);if(h)return zm(h);s=!1,i=$m,u=new Fm}else u=e?[]:l;e:for(;++n{"use strict";Fw();UL();uR();zw();uie();Vw();sOe=200;o(oOe,"baseUniq");Wm=oOe});var lOe,CR,hie=N(()=>{"use strict";Om();mm();ck();xT();lOe=yc(function(t){return Wm(Cc(t,1,Pd,!0))}),CR=lOe});function cOe(t){return t&&t.length?Wm(t):[]}var qm,fie=N(()=>{"use strict";ck();o(cOe,"uniq");qm=cOe});function uOe(t,e){return t&&t.length?Wm(t,mn(e,2)):[]}var die,pie=N(()=>{"use strict";os();ck();o(uOe,"uniqBy");die=uOe});function fOe(t){var e=++hOe;return kw(t)+e}var hOe,Zd,mie=N(()=>{"use strict";HL();hOe=0;o(fOe,"uniqueId");Zd=fOe});function dOe(t,e,r){for(var n=-1,i=t.length,a=e.length,s={};++n{"use strict";o(dOe,"baseZipObject");gie=dOe});function pOe(t,e){return gie(t||[],e||[],gc)}var uk,vie=N(()=>{"use strict";pm();yie();o(pOe,"zipObject");uk=pOe});var qt=N(()=>{"use strict";Vee();JL();qte();Yte();T9();Ore();Fre();zre();Gre();Vre();Yre();fR();Zre();ene();pR();Sw();ek();tne();rne();nne();lne();Lu();hne();fne();Wn();ak();n2();no();gne();nk();yne();Ec();$re();Um();vne();xne();E9();bR();bne();zL();Mre();jne();Sne();eie();ER();nie();iie();oie();lie();hie();fie();mie();vR();vie();});function bie(t,e){t[e]?t[e]++:t[e]=1}function Tie(t,e){--t[e]||delete t[e]}function F2(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}return i+xie+a+xie+(mr(n)?mOe:n)}function gOe(t,e,r,n){var i=""+e,a=""+r;if(!t&&i>a){var s=i;i=a,a=s}var l={v:i,w:a};return n&&(l.name=n),l}function AR(t,e){return F2(t,e.v,e.w,e.name)}var mOe,Jd,xie,sn,hk=N(()=>{"use strict";qt();mOe="\0",Jd="\0",xie="",sn=class{static{o(this,"Graph")}constructor(e={}){this._isDirected=Object.prototype.hasOwnProperty.call(e,"directed")?e.directed:!0,this._isMultigraph=Object.prototype.hasOwnProperty.call(e,"multigraph")?e.multigraph:!1,this._isCompound=Object.prototype.hasOwnProperty.call(e,"compound")?e.compound:!1,this._label=void 0,this._defaultNodeLabelFn=Ns(void 0),this._defaultEdgeLabelFn=Ns(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[Jd]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return Ai(e)||(e=Ns(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return zr(this._nodes)}sources(){var e=this;return Yr(this.nodes(),function(r){return hr(e._in[r])})}sinks(){var e=this;return Yr(this.nodes(),function(r){return hr(e._out[r])})}setNodes(e,r){var n=arguments,i=this;return Ae(e,function(a){n.length>1?i.setNode(a,r):i.setNode(a)}),this}setNode(e,r){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=r),this):(this._nodes[e]=arguments.length>1?r:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=Jd,this._children[e]={},this._children[Jd][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var r=o(n=>this.removeEdge(this._edgeObjs[n]),"removeEdge");delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],Ae(this.children(e),n=>{this.setParent(n)}),delete this._children[e]),Ae(zr(this._in[e]),r),delete this._in[e],delete this._preds[e],Ae(zr(this._out[e]),r),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,r){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(mr(r))r=Jd;else{r+="";for(var n=r;!mr(n);n=this.parent(n))if(n===e)throw new Error("Setting "+r+" as parent of "+e+" would create a cycle");this.setNode(r)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=r,this._children[r][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var r=this._parent[e];if(r!==Jd)return r}}children(e){if(mr(e)&&(e=Jd),this._isCompound){var r=this._children[e];if(r)return zr(r)}else{if(e===Jd)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var r=this._preds[e];if(r)return zr(r)}successors(e){var r=this._sucs[e];if(r)return zr(r)}neighbors(e){var r=this.predecessors(e);if(r)return CR(r,this.successors(e))}isLeaf(e){var r;return this.isDirected()?r=this.successors(e):r=this.neighbors(e),r.length===0}filterNodes(e){var r=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});r.setGraph(this.graph());var n=this;Ae(this._nodes,function(s,l){e(l)&&r.setNode(l,s)}),Ae(this._edgeObjs,function(s){r.hasNode(s.v)&&r.hasNode(s.w)&&r.setEdge(s,n.edge(s))});var i={};function a(s){var l=n.parent(s);return l===void 0||r.hasNode(l)?(i[s]=l,l):l in i?i[l]:a(l)}return o(a,"findParent"),this._isCompound&&Ae(r.nodes(),function(s){r.setParent(s,a(s))}),r}setDefaultEdgeLabel(e){return Ai(e)||(e=Ns(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return br(this._edgeObjs)}setPath(e,r){var n=this,i=arguments;return Xr(e,function(a,s){return i.length>1?n.setEdge(a,s,r):n.setEdge(a,s),s}),this}setEdge(){var e,r,n,i,a=!1,s=arguments[0];typeof s=="object"&&s!==null&&"v"in s?(e=s.v,r=s.w,n=s.name,arguments.length===2&&(i=arguments[1],a=!0)):(e=s,r=arguments[1],n=arguments[3],arguments.length>2&&(i=arguments[2],a=!0)),e=""+e,r=""+r,mr(n)||(n=""+n);var l=F2(this._isDirected,e,r,n);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,l))return a&&(this._edgeLabels[l]=i),this;if(!mr(n)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(r),this._edgeLabels[l]=a?i:this._defaultEdgeLabelFn(e,r,n);var u=gOe(this._isDirected,e,r,n);return e=u.v,r=u.w,Object.freeze(u),this._edgeObjs[l]=u,bie(this._preds[r],e),bie(this._sucs[e],r),this._in[r][l]=u,this._out[e][l]=u,this._edgeCount++,this}edge(e,r,n){var i=arguments.length===1?AR(this._isDirected,arguments[0]):F2(this._isDirected,e,r,n);return this._edgeLabels[i]}hasEdge(e,r,n){var i=arguments.length===1?AR(this._isDirected,arguments[0]):F2(this._isDirected,e,r,n);return Object.prototype.hasOwnProperty.call(this._edgeLabels,i)}removeEdge(e,r,n){var i=arguments.length===1?AR(this._isDirected,arguments[0]):F2(this._isDirected,e,r,n),a=this._edgeObjs[i];return a&&(e=a.v,r=a.w,delete this._edgeLabels[i],delete this._edgeObjs[i],Tie(this._preds[r],e),Tie(this._sucs[e],r),delete this._in[r][i],delete this._out[e][i],this._edgeCount--),this}inEdges(e,r){var n=this._in[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.v===r}):i}}outEdges(e,r){var n=this._out[e];if(n){var i=br(n);return r?Yr(i,function(a){return a.w===r}):i}}nodeEdges(e,r){var n=this.inEdges(e,r);if(n)return n.concat(this.outEdges(e,r))}};sn.prototype._nodeCount=0;sn.prototype._edgeCount=0;o(bie,"incrementOrInitEntry");o(Tie,"decrementOrRemoveEntry");o(F2,"edgeArgsToId");o(gOe,"edgeArgsToObj");o(AR,"edgeObjToId")});var Wo=N(()=>{"use strict";hk()});function wie(t){t._prev._next=t._next,t._next._prev=t._prev,delete t._next,delete t._prev}function yOe(t,e){if(t!=="_next"&&t!=="_prev")return e}var dk,kie=N(()=>{"use strict";dk=class{static{o(this,"List")}constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,r=e._prev;if(r!==e)return wie(r),r}enqueue(e){var r=this._sentinel;e._prev&&e._next&&wie(e),e._next=r._next,r._next._prev=e,r._next=e,e._prev=r}toString(){for(var e=[],r=this._sentinel,n=r._prev;n!==r;)e.push(JSON.stringify(n,yOe)),n=n._prev;return"["+e.join(", ")+"]"}};o(wie,"unlink");o(yOe,"filterOutLinks")});function Eie(t,e){if(t.nodeCount()<=1)return[];var r=bOe(t,e||vOe),n=xOe(r.graph,r.buckets,r.zeroIdx);return qr(Je(n,function(i){return t.outEdges(i.v,i.w)}))}function xOe(t,e,r){for(var n=[],i=e[e.length-1],a=e[0],s;t.nodeCount();){for(;s=a.dequeue();)_R(t,e,r,s);for(;s=i.dequeue();)_R(t,e,r,s);if(t.nodeCount()){for(var l=e.length-2;l>0;--l)if(s=e[l].dequeue(),s){n=n.concat(_R(t,e,r,s,!0));break}}}return n}function _R(t,e,r,n,i){var a=i?[]:void 0;return Ae(t.inEdges(n.v),function(s){var l=t.edge(s),u=t.node(s.v);i&&a.push({v:s.v,w:s.w}),u.out-=l,DR(e,r,u)}),Ae(t.outEdges(n.v),function(s){var l=t.edge(s),u=s.w,h=t.node(u);h.in-=l,DR(e,r,h)}),t.removeNode(n.v),a}function bOe(t,e){var r=new sn,n=0,i=0;Ae(t.nodes(),function(l){r.setNode(l,{v:l,in:0,out:0})}),Ae(t.edges(),function(l){var u=r.edge(l.v,l.w)||0,h=e(l),f=u+h;r.setEdge(l.v,l.w,f),i=Math.max(i,r.node(l.v).out+=h),n=Math.max(n,r.node(l.w).in+=h)});var a=Ho(i+n+3).map(function(){return new dk}),s=n+1;return Ae(r.nodes(),function(l){DR(a,s,r.node(l))}),{graph:r,buckets:a,zeroIdx:s}}function DR(t,e,r){r.out?r.in?t[r.out-r.in+e].enqueue(r):t[t.length-1].enqueue(r):t[0].enqueue(r)}var vOe,Sie=N(()=>{"use strict";qt();Wo();kie();vOe=Ns(1);o(Eie,"greedyFAS");o(xOe,"doGreedyFAS");o(_R,"removeNode");o(bOe,"buildState");o(DR,"assignBucket")});function Cie(t){var e=t.graph().acyclicer==="greedy"?Eie(t,r(t)):TOe(t);Ae(e,function(n){var i=t.edge(n);t.removeEdge(n),i.forwardName=n.name,i.reversed=!0,t.setEdge(n.w,n.v,i,Zd("rev"))});function r(n){return function(i){return n.edge(i).weight}}o(r,"weightFn")}function TOe(t){var e=[],r={},n={};function i(a){Object.prototype.hasOwnProperty.call(n,a)||(n[a]=!0,r[a]=!0,Ae(t.outEdges(a),function(s){Object.prototype.hasOwnProperty.call(r,s.w)?e.push(s):i(s.w)}),delete r[a])}return o(i,"dfs"),Ae(t.nodes(),i),e}function Aie(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.reversed){t.removeEdge(e);var n=r.forwardName;delete r.reversed,delete r.forwardName,t.setEdge(e.w,e.v,r,n)}})}var LR=N(()=>{"use strict";qt();Sie();o(Cie,"run");o(TOe,"dfsFAS");o(Aie,"undo")});function Dc(t,e,r,n){var i;do i=Zd(n);while(t.hasNode(i));return r.dummy=e,t.setNode(i,r),i}function Die(t){var e=new sn().setGraph(t.graph());return Ae(t.nodes(),function(r){e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){var n=e.edge(r.v,r.w)||{weight:0,minlen:1},i=t.edge(r);e.setEdge(r.v,r.w,{weight:n.weight+i.weight,minlen:Math.max(n.minlen,i.minlen)})}),e}function pk(t){var e=new sn({multigraph:t.isMultigraph()}).setGraph(t.graph());return Ae(t.nodes(),function(r){t.children(r).length||e.setNode(r,t.node(r))}),Ae(t.edges(),function(r){e.setEdge(r,t.edge(r))}),e}function RR(t,e){var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2;if(!i&&!a)throw new Error("Not possible to find intersection inside of the rectangle");var u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=l*i/a,h=l):(i<0&&(s=-s),u=s,h=s*a/i),{x:r+u,y:n+h}}function of(t){var e=Je(Ho(MR(t)+1),function(){return[]});return Ae(t.nodes(),function(r){var n=t.node(r),i=n.rank;mr(i)||(e[i][n.order]=r)}),e}function Lie(t){var e=Nl(Je(t.nodes(),function(r){return t.node(r).rank}));Ae(t.nodes(),function(r){var n=t.node(r);Bt(n,"rank")&&(n.rank-=e)})}function Rie(t){var e=Nl(Je(t.nodes(),function(a){return t.node(a).rank})),r=[];Ae(t.nodes(),function(a){var s=t.node(a).rank-e;r[s]||(r[s]=[]),r[s].push(a)});var n=0,i=t.graph().nodeRankFactor;Ae(r,function(a,s){mr(a)&&s%i!==0?--n:n&&Ae(a,function(l){t.node(l).rank+=n})})}function NR(t,e,r,n){var i={width:0,height:0};return arguments.length>=4&&(i.rank=r,i.order=n),Dc(t,"border",i,e)}function MR(t){return $s(Je(t.nodes(),function(e){var r=t.node(e).rank;if(!mr(r))return r}))}function Nie(t,e){var r={lhs:[],rhs:[]};return Ae(t,function(n){e(n)?r.lhs.push(n):r.rhs.push(n)}),r}function Mie(t,e){var r=Qw();try{return e()}finally{console.log(t+" time: "+(Qw()-r)+"ms")}}function Iie(t,e){return e()}var Lc=N(()=>{"use strict";qt();Wo();o(Dc,"addDummyNode");o(Die,"simplify");o(pk,"asNonCompoundGraph");o(RR,"intersectRect");o(of,"buildLayerMatrix");o(Lie,"normalizeRanks");o(Rie,"removeEmptyRanks");o(NR,"addBorderNode");o(MR,"maxRank");o(Nie,"partition");o(Mie,"time");o(Iie,"notime")});function Pie(t){function e(r){var n=t.children(r),i=t.node(r);if(n.length&&Ae(n,e),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var a=i.minRank,s=i.maxRank+1;a{"use strict";qt();Lc();o(Pie,"addBorderSegments");o(Oie,"addBorderNode")});function $ie(t){var e=t.graph().rankdir.toLowerCase();(e==="lr"||e==="rl")&&Gie(t)}function zie(t){var e=t.graph().rankdir.toLowerCase();(e==="bt"||e==="rl")&&wOe(t),(e==="lr"||e==="rl")&&(kOe(t),Gie(t))}function Gie(t){Ae(t.nodes(),function(e){Fie(t.node(e))}),Ae(t.edges(),function(e){Fie(t.edge(e))})}function Fie(t){var e=t.width;t.width=t.height,t.height=e}function wOe(t){Ae(t.nodes(),function(e){IR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,IR),Object.prototype.hasOwnProperty.call(r,"y")&&IR(r)})}function IR(t){t.y=-t.y}function kOe(t){Ae(t.nodes(),function(e){OR(t.node(e))}),Ae(t.edges(),function(e){var r=t.edge(e);Ae(r.points,OR),Object.prototype.hasOwnProperty.call(r,"x")&&OR(r)})}function OR(t){var e=t.x;t.x=t.y,t.y=e}var Vie=N(()=>{"use strict";qt();o($ie,"adjust");o(zie,"undo");o(Gie,"swapWidthHeight");o(Fie,"swapWidthHeightOne");o(wOe,"reverseY");o(IR,"reverseYOne");o(kOe,"swapXY");o(OR,"swapXYOne")});function Uie(t){t.graph().dummyChains=[],Ae(t.edges(),function(e){SOe(t,e)})}function SOe(t,e){var r=e.v,n=t.node(r).rank,i=e.w,a=t.node(i).rank,s=e.name,l=t.edge(e),u=l.labelRank;if(a!==n+1){t.removeEdge(e);var h=void 0,f,d;for(d=0,++n;n{"use strict";qt();Lc();o(Uie,"run");o(SOe,"normalizeEdge");o(Hie,"undo")});function $2(t){var e={};function r(n){var i=t.node(n);if(Object.prototype.hasOwnProperty.call(e,n))return i.rank;e[n]=!0;var a=Nl(Je(t.outEdges(n),function(s){return r(s.w)-t.edge(s).minlen}));return(a===Number.POSITIVE_INFINITY||a===void 0||a===null)&&(a=0),i.rank=a}o(r,"dfs"),Ae(t.sources(),r)}function ep(t,e){return t.node(e.w).rank-t.node(e.v).rank-t.edge(e).minlen}var mk=N(()=>{"use strict";qt();o($2,"longestPath");o(ep,"slack")});function gk(t){var e=new sn({directed:!1}),r=t.nodes()[0],n=t.nodeCount();e.setNode(r,{});for(var i,a;COe(e,t){"use strict";qt();Wo();mk();o(gk,"feasibleTree");o(COe,"tightTree");o(AOe,"findMinSlackEdge");o(_Oe,"shiftRanks")});var qie=N(()=>{"use strict"});var FR=N(()=>{"use strict"});var eXt,$R=N(()=>{"use strict";qt();FR();eXt=Ns(1)});var Yie=N(()=>{"use strict";$R()});var zR=N(()=>{"use strict"});var Xie=N(()=>{"use strict";zR()});var hXt,jie=N(()=>{"use strict";qt();hXt=Ns(1)});function GR(t){var e={},r={},n=[];function i(a){if(Object.prototype.hasOwnProperty.call(r,a))throw new z2;Object.prototype.hasOwnProperty.call(e,a)||(r[a]=!0,e[a]=!0,Ae(t.predecessors(a),i),delete r[a],n.push(a))}if(o(i,"visit"),Ae(t.sinks(),i),SR(e)!==t.nodeCount())throw new z2;return n}function z2(){}var VR=N(()=>{"use strict";qt();GR.CycleException=z2;o(GR,"topsort");o(z2,"CycleException");z2.prototype=new Error});var Kie=N(()=>{"use strict";VR()});function yk(t,e,r){Pt(e)||(e=[e]);var n=(t.isDirected()?t.successors:t.neighbors).bind(t),i=[],a={};return Ae(e,function(s){if(!t.hasNode(s))throw new Error("Graph does not have node: "+s);Qie(t,s,r==="post",a,n,i)}),i}function Qie(t,e,r,n,i,a){Object.prototype.hasOwnProperty.call(n,e)||(n[e]=!0,r||a.push(e),Ae(i(e),function(s){Qie(t,s,r,n,i,a)}),r&&a.push(e))}var UR=N(()=>{"use strict";qt();o(yk,"dfs");o(Qie,"doDfs")});function HR(t,e){return yk(t,e,"post")}var Zie=N(()=>{"use strict";UR();o(HR,"postorder")});function WR(t,e){return yk(t,e,"pre")}var Jie=N(()=>{"use strict";UR();o(WR,"preorder")});var eae=N(()=>{"use strict";FR();hk()});var tae=N(()=>{"use strict";qie();$R();Yie();Xie();jie();Kie();Zie();Jie();eae();zR();VR()});function cf(t){t=Die(t),$2(t);var e=gk(t);YR(e),qR(e,t);for(var r,n;r=aae(e);)n=sae(e,t,r),oae(e,t,r,n)}function qR(t,e){var r=HR(t,t.nodes());r=r.slice(0,r.length-1),Ae(r,function(n){MOe(t,e,n)})}function MOe(t,e,r){var n=t.node(r),i=n.parent;t.edge(r,i).cutvalue=nae(t,e,r)}function nae(t,e,r){var n=t.node(r),i=n.parent,a=!0,s=e.edge(r,i),l=0;return s||(a=!1,s=e.edge(i,r)),l=s.weight,Ae(e.nodeEdges(r),function(u){var h=u.v===r,f=h?u.w:u.v;if(f!==i){var d=h===a,p=e.edge(u).weight;if(l+=d?p:-p,OOe(t,r,f)){var m=t.edge(r,f).cutvalue;l+=d?-m:m}}}),l}function YR(t,e){arguments.length<2&&(e=t.nodes()[0]),iae(t,{},1,e)}function iae(t,e,r,n,i){var a=r,s=t.node(n);return e[n]=!0,Ae(t.neighbors(n),function(l){Object.prototype.hasOwnProperty.call(e,l)||(r=iae(t,e,r,l,n))}),s.low=a,s.lim=r++,i?s.parent=i:delete s.parent,r}function aae(t){return ls(t.edges(),function(e){return t.edge(e).cutvalue<0})}function sae(t,e,r){var n=r.v,i=r.w;e.hasEdge(n,i)||(n=r.w,i=r.v);var a=t.node(n),s=t.node(i),l=a,u=!1;a.lim>s.lim&&(l=s,u=!0);var h=Yr(e.edges(),function(f){return u===rae(t,t.node(f.v),l)&&u!==rae(t,t.node(f.w),l)});return Kd(h,function(f){return ep(e,f)})}function oae(t,e,r,n){var i=r.v,a=r.w;t.removeEdge(i,a),t.setEdge(n.v,n.w,{}),YR(t),qR(t,e),IOe(t,e)}function IOe(t,e){var r=ls(t.nodes(),function(i){return!e.node(i).parent}),n=WR(t,r);n=n.slice(1),Ae(n,function(i){var a=t.node(i).parent,s=e.edge(i,a),l=!1;s||(s=e.edge(a,i),l=!0),e.node(i).rank=e.node(a).rank+(l?s.minlen:-s.minlen)})}function OOe(t,e,r){return t.hasEdge(e,r)}function rae(t,e,r){return r.low<=e.lim&&e.lim<=r.lim}var lae=N(()=>{"use strict";qt();tae();Lc();BR();mk();cf.initLowLimValues=YR;cf.initCutValues=qR;cf.calcCutValue=nae;cf.leaveEdge=aae;cf.enterEdge=sae;cf.exchangeEdges=oae;o(cf,"networkSimplex");o(qR,"initCutValues");o(MOe,"assignCutValue");o(nae,"calcCutValue");o(YR,"initLowLimValues");o(iae,"dfsAssignLowLim");o(aae,"leaveEdge");o(sae,"enterEdge");o(oae,"exchangeEdges");o(IOe,"updateRanks");o(OOe,"isTreeEdge");o(rae,"isDescendant")});function XR(t){switch(t.graph().ranker){case"network-simplex":cae(t);break;case"tight-tree":BOe(t);break;case"longest-path":POe(t);break;default:cae(t)}}function BOe(t){$2(t),gk(t)}function cae(t){cf(t)}var POe,jR=N(()=>{"use strict";BR();lae();mk();o(XR,"rank");POe=$2;o(BOe,"tightTreeRanker");o(cae,"networkSimplexRanker")});function uae(t){var e=Dc(t,"root",{},"_root"),r=FOe(t),n=$s(br(r))-1,i=2*n+1;t.graph().nestingRoot=e,Ae(t.edges(),function(s){t.edge(s).minlen*=i});var a=$Oe(t)+1;Ae(t.children(),function(s){hae(t,e,i,a,n,r,s)}),t.graph().nodeRankFactor=i}function hae(t,e,r,n,i,a,s){var l=t.children(s);if(!l.length){s!==e&&t.setEdge(e,s,{weight:0,minlen:r});return}var u=NR(t,"_bt"),h=NR(t,"_bb"),f=t.node(s);t.setParent(u,s),f.borderTop=u,t.setParent(h,s),f.borderBottom=h,Ae(l,function(d){hae(t,e,r,n,i,a,d);var p=t.node(d),m=p.borderTop?p.borderTop:d,g=p.borderBottom?p.borderBottom:d,y=p.borderTop?n:2*n,v=m!==g?1:i-a[s]+1;t.setEdge(u,m,{weight:y,minlen:v,nestingEdge:!0}),t.setEdge(g,h,{weight:y,minlen:v,nestingEdge:!0})}),t.parent(s)||t.setEdge(e,u,{weight:0,minlen:i+a[s]})}function FOe(t){var e={};function r(n,i){var a=t.children(n);a&&a.length&&Ae(a,function(s){r(s,i+1)}),e[n]=i}return o(r,"dfs"),Ae(t.children(),function(n){r(n,1)}),e}function $Oe(t){return Xr(t.edges(),function(e,r){return e+t.edge(r).weight},0)}function fae(t){var e=t.graph();t.removeNode(e.nestingRoot),delete e.nestingRoot,Ae(t.edges(),function(r){var n=t.edge(r);n.nestingEdge&&t.removeEdge(r)})}var dae=N(()=>{"use strict";qt();Lc();o(uae,"run");o(hae,"dfs");o(FOe,"treeDepths");o($Oe,"sumWeights");o(fae,"cleanup")});function pae(t,e,r){var n={},i;Ae(r,function(a){for(var s=t.parent(a),l,u;s;){if(l=t.parent(s),l?(u=n[l],n[l]=s):(u=i,i=s),u&&u!==s){e.setEdge(u,s);return}s=l}})}var mae=N(()=>{"use strict";qt();o(pae,"addSubgraphConstraints")});function gae(t,e,r){var n=GOe(t),i=new sn({compound:!0}).setGraph({root:n}).setDefaultNodeLabel(function(a){return t.node(a)});return Ae(t.nodes(),function(a){var s=t.node(a),l=t.parent(a);(s.rank===e||s.minRank<=e&&e<=s.maxRank)&&(i.setNode(a),i.setParent(a,l||n),Ae(t[r](a),function(u){var h=u.v===a?u.w:u.v,f=i.edge(h,a),d=mr(f)?0:f.weight;i.setEdge(h,a,{weight:t.edge(u).weight+d})}),Object.prototype.hasOwnProperty.call(s,"minRank")&&i.setNode(a,{borderLeft:s.borderLeft[e],borderRight:s.borderRight[e]}))}),i}function GOe(t){for(var e;t.hasNode(e=Zd("_root")););return e}var yae=N(()=>{"use strict";qt();Wo();o(gae,"buildLayerGraph");o(GOe,"createRootNode")});function vae(t,e){for(var r=0,n=1;n0;)f%2&&(d+=l[f+1]),f=f-1>>1,l[f]+=h.weight;u+=h.weight*d})),u}var xae=N(()=>{"use strict";qt();o(vae,"crossCount");o(VOe,"twoLayerCrossCount")});function bae(t){var e={},r=Yr(t.nodes(),function(l){return!t.children(l).length}),n=$s(Je(r,function(l){return t.node(l).rank})),i=Je(Ho(n+1),function(){return[]});function a(l){if(!Bt(e,l)){e[l]=!0;var u=t.node(l);i[u.rank].push(l),Ae(t.successors(l),a)}}o(a,"dfs");var s=_c(r,function(l){return t.node(l).rank});return Ae(s,a),i}var Tae=N(()=>{"use strict";qt();o(bae,"initOrder")});function wae(t,e){return Je(e,function(r){var n=t.inEdges(r);if(n.length){var i=Xr(n,function(a,s){var l=t.edge(s),u=t.node(s.v);return{sum:a.sum+l.weight*u.order,weight:a.weight+l.weight}},{sum:0,weight:0});return{v:r,barycenter:i.sum/i.weight,weight:i.weight}}else return{v:r}})}var kae=N(()=>{"use strict";qt();o(wae,"barycenter")});function Eae(t,e){var r={};Ae(t,function(i,a){var s=r[i.v]={indegree:0,in:[],out:[],vs:[i.v],i:a};mr(i.barycenter)||(s.barycenter=i.barycenter,s.weight=i.weight)}),Ae(e.edges(),function(i){var a=r[i.v],s=r[i.w];!mr(a)&&!mr(s)&&(s.indegree++,a.out.push(r[i.w]))});var n=Yr(r,function(i){return!i.indegree});return UOe(n)}function UOe(t){var e=[];function r(a){return function(s){s.merged||(mr(s.barycenter)||mr(a.barycenter)||s.barycenter>=a.barycenter)&&HOe(a,s)}}o(r,"handleIn");function n(a){return function(s){s.in.push(a),--s.indegree===0&&t.push(s)}}for(o(n,"handleOut");t.length;){var i=t.pop();e.push(i),Ae(i.in.reverse(),r(i)),Ae(i.out,n(i))}return Je(Yr(e,function(a){return!a.merged}),function(a){return Qd(a,["vs","i","barycenter","weight"])})}function HOe(t,e){var r=0,n=0;t.weight&&(r+=t.barycenter*t.weight,n+=t.weight),e.weight&&(r+=e.barycenter*e.weight,n+=e.weight),t.vs=e.vs.concat(t.vs),t.barycenter=r/n,t.weight=n,t.i=Math.min(e.i,t.i),e.merged=!0}var Sae=N(()=>{"use strict";qt();o(Eae,"resolveConflicts");o(UOe,"doResolveConflicts");o(HOe,"mergeEntries")});function Aae(t,e){var r=Nie(t,function(f){return Object.prototype.hasOwnProperty.call(f,"barycenter")}),n=r.lhs,i=_c(r.rhs,function(f){return-f.i}),a=[],s=0,l=0,u=0;n.sort(WOe(!!e)),u=Cae(a,i,u),Ae(n,function(f){u+=f.vs.length,a.push(f.vs),s+=f.barycenter*f.weight,l+=f.weight,u=Cae(a,i,u)});var h={vs:qr(a)};return l&&(h.barycenter=s/l,h.weight=l),h}function Cae(t,e,r){for(var n;e.length&&(n=ma(e)).i<=r;)e.pop(),t.push(n.vs),r++;return r}function WOe(t){return function(e,r){return e.barycenterr.barycenter?1:t?r.i-e.i:e.i-r.i}}var _ae=N(()=>{"use strict";qt();Lc();o(Aae,"sort");o(Cae,"consumeUnsortable");o(WOe,"compareWithBias")});function KR(t,e,r,n){var i=t.children(e),a=t.node(e),s=a?a.borderLeft:void 0,l=a?a.borderRight:void 0,u={};s&&(i=Yr(i,function(g){return g!==s&&g!==l}));var h=wae(t,i);Ae(h,function(g){if(t.children(g.v).length){var y=KR(t,g.v,r,n);u[g.v]=y,Object.prototype.hasOwnProperty.call(y,"barycenter")&&YOe(g,y)}});var f=Eae(h,r);qOe(f,u);var d=Aae(f,n);if(s&&(d.vs=qr([s,d.vs,l]),t.predecessors(s).length)){var p=t.node(t.predecessors(s)[0]),m=t.node(t.predecessors(l)[0]);Object.prototype.hasOwnProperty.call(d,"barycenter")||(d.barycenter=0,d.weight=0),d.barycenter=(d.barycenter*d.weight+p.order+m.order)/(d.weight+2),d.weight+=2}return d}function qOe(t,e){Ae(t,function(r){r.vs=qr(r.vs.map(function(n){return e[n]?e[n].vs:n}))})}function YOe(t,e){mr(t.barycenter)?(t.barycenter=e.barycenter,t.weight=e.weight):(t.barycenter=(t.barycenter*t.weight+e.barycenter*e.weight)/(t.weight+e.weight),t.weight+=e.weight)}var Dae=N(()=>{"use strict";qt();kae();Sae();_ae();o(KR,"sortSubgraph");o(qOe,"expandSubgraphs");o(YOe,"mergeBarycenters")});function Nae(t){var e=MR(t),r=Lae(t,Ho(1,e+1),"inEdges"),n=Lae(t,Ho(e-1,-1,-1),"outEdges"),i=bae(t);Rae(t,i);for(var a=Number.POSITIVE_INFINITY,s,l=0,u=0;u<4;++l,++u){XOe(l%2?r:n,l%4>=2),i=of(t);var h=vae(t,i);h{"use strict";qt();Wo();Lc();mae();yae();xae();Tae();Dae();o(Nae,"order");o(Lae,"buildLayerGraphs");o(XOe,"sweepLayerGraphs");o(Rae,"assignOrder")});function Iae(t){var e=KOe(t);Ae(t.graph().dummyChains,function(r){for(var n=t.node(r),i=n.edgeObj,a=jOe(t,e,i.v,i.w),s=a.path,l=a.lca,u=0,h=s[u],f=!0;r!==i.w;){if(n=t.node(r),f){for(;(h=s[u])!==l&&t.node(h).maxRanks||l>e[u].lim));for(h=u,u=n;(u=t.parent(u))!==h;)a.push(u);return{path:i.concat(a.reverse()),lca:h}}function KOe(t){var e={},r=0;function n(i){var a=r;Ae(t.children(i),n),e[i]={low:a,lim:r++}}return o(n,"dfs"),Ae(t.children(),n),e}var Oae=N(()=>{"use strict";qt();o(Iae,"parentDummyChains");o(jOe,"findPath");o(KOe,"postorder")});function QOe(t,e){var r={};function n(i,a){var s=0,l=0,u=i.length,h=ma(a);return Ae(a,function(f,d){var p=JOe(t,f),m=p?t.node(p).order:u;(p||f===h)&&(Ae(a.slice(l,d+1),function(g){Ae(t.predecessors(g),function(y){var v=t.node(y),x=v.order;(xh)&&Pae(r,p,f)})})}o(n,"scan");function i(a,s){var l=-1,u,h=0;return Ae(s,function(f,d){if(t.node(f).dummy==="border"){var p=t.predecessors(f);p.length&&(u=t.node(p[0]).order,n(s,h,d,l,u),h=d,l=u)}n(s,h,s.length,u,a.length)}),s}return o(i,"visitLayer"),Xr(e,i),r}function JOe(t,e){if(t.node(e).dummy)return ls(t.predecessors(e),function(r){return t.node(r).dummy})}function Pae(t,e,r){if(e>r){var n=e;e=r,r=n}var i=t[e];i||(t[e]=i={}),i[r]=!0}function ePe(t,e,r){if(e>r){var n=e;e=r,r=n}return!!t[e]&&Object.prototype.hasOwnProperty.call(t[e],r)}function tPe(t,e,r,n){var i={},a={},s={};return Ae(e,function(l){Ae(l,function(u,h){i[u]=u,a[u]=u,s[u]=h})}),Ae(e,function(l){var u=-1;Ae(l,function(h){var f=n(h);if(f.length){f=_c(f,function(y){return s[y]});for(var d=(f.length-1)/2,p=Math.floor(d),m=Math.ceil(d);p<=m;++p){var g=f[p];a[h]===h&&u{"use strict";qt();Wo();Lc();o(QOe,"findType1Conflicts");o(ZOe,"findType2Conflicts");o(JOe,"findOtherInnerSegmentNode");o(Pae,"addConflict");o(ePe,"hasConflict");o(tPe,"verticalAlignment");o(rPe,"horizontalCompaction");o(nPe,"buildBlockGraph");o(iPe,"findSmallestWidthAlignment");o(aPe,"alignCoordinates");o(sPe,"balance");o(Bae,"positionX");o(oPe,"sep");o(lPe,"width")});function $ae(t){t=pk(t),cPe(t),gR(Bae(t),function(e,r){t.node(r).x=e})}function cPe(t){var e=of(t),r=t.graph().ranksep,n=0;Ae(e,function(i){var a=$s(Je(i,function(s){return t.node(s).height}));Ae(i,function(s){t.node(s).y=n+a/2}),n+=a+r})}var zae=N(()=>{"use strict";qt();Lc();Fae();o($ae,"position");o(cPe,"positionY")});function G2(t,e){var r=e&&e.debugTiming?Mie:Iie;r("layout",()=>{var n=r(" buildLayoutGraph",()=>bPe(t));r(" runLayout",()=>uPe(n,r)),r(" updateInputGraph",()=>hPe(t,n))})}function uPe(t,e){e(" makeSpaceForEdgeLabels",()=>TPe(t)),e(" removeSelfEdges",()=>LPe(t)),e(" acyclic",()=>Cie(t)),e(" nestingGraph.run",()=>uae(t)),e(" rank",()=>XR(pk(t))),e(" injectEdgeLabelProxies",()=>wPe(t)),e(" removeEmptyRanks",()=>Rie(t)),e(" nestingGraph.cleanup",()=>fae(t)),e(" normalizeRanks",()=>Lie(t)),e(" assignRankMinMax",()=>kPe(t)),e(" removeEdgeLabelProxies",()=>EPe(t)),e(" normalize.run",()=>Uie(t)),e(" parentDummyChains",()=>Iae(t)),e(" addBorderSegments",()=>Pie(t)),e(" order",()=>Nae(t)),e(" insertSelfEdges",()=>RPe(t)),e(" adjustCoordinateSystem",()=>$ie(t)),e(" position",()=>$ae(t)),e(" positionSelfEdges",()=>NPe(t)),e(" removeBorderNodes",()=>DPe(t)),e(" normalize.undo",()=>Hie(t)),e(" fixupEdgeLabelCoords",()=>APe(t)),e(" undoCoordinateSystem",()=>zie(t)),e(" translateGraph",()=>SPe(t)),e(" assignNodeIntersects",()=>CPe(t)),e(" reversePoints",()=>_Pe(t)),e(" acyclic.undo",()=>Aie(t))}function hPe(t,e){Ae(t.nodes(),function(r){var n=t.node(r),i=e.node(r);n&&(n.x=i.x,n.y=i.y,e.children(r).length&&(n.width=i.width,n.height=i.height))}),Ae(t.edges(),function(r){var n=t.edge(r),i=e.edge(r);n.points=i.points,Object.prototype.hasOwnProperty.call(i,"x")&&(n.x=i.x,n.y=i.y)}),t.graph().width=e.graph().width,t.graph().height=e.graph().height}function bPe(t){var e=new sn({multigraph:!0,compound:!0}),r=ZR(t.graph());return e.setGraph(Hh({},dPe,QR(r,fPe),Qd(r,pPe))),Ae(t.nodes(),function(n){var i=ZR(t.node(n));e.setNode(n,nf(QR(i,mPe),gPe)),e.setParent(n,t.parent(n))}),Ae(t.edges(),function(n){var i=ZR(t.edge(n));e.setEdge(n,Hh({},vPe,QR(i,yPe),Qd(i,xPe)))}),e}function TPe(t){var e=t.graph();e.ranksep/=2,Ae(t.edges(),function(r){var n=t.edge(r);n.minlen*=2,n.labelpos.toLowerCase()!=="c"&&(e.rankdir==="TB"||e.rankdir==="BT"?n.width+=n.labeloffset:n.height+=n.labeloffset)})}function wPe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(r.width&&r.height){var n=t.node(e.v),i=t.node(e.w),a={rank:(i.rank-n.rank)/2+n.rank,e};Dc(t,"edge-proxy",a,"_ep")}})}function kPe(t){var e=0;Ae(t.nodes(),function(r){var n=t.node(r);n.borderTop&&(n.minRank=t.node(n.borderTop).rank,n.maxRank=t.node(n.borderBottom).rank,e=$s(e,n.maxRank))}),t.graph().maxRank=e}function EPe(t){Ae(t.nodes(),function(e){var r=t.node(e);r.dummy==="edge-proxy"&&(t.edge(r.e).labelRank=r.rank,t.removeNode(e))})}function SPe(t){var e=Number.POSITIVE_INFINITY,r=0,n=Number.POSITIVE_INFINITY,i=0,a=t.graph(),s=a.marginx||0,l=a.marginy||0;function u(h){var f=h.x,d=h.y,p=h.width,m=h.height;e=Math.min(e,f-p/2),r=Math.max(r,f+p/2),n=Math.min(n,d-m/2),i=Math.max(i,d+m/2)}o(u,"getExtremes"),Ae(t.nodes(),function(h){u(t.node(h))}),Ae(t.edges(),function(h){var f=t.edge(h);Object.prototype.hasOwnProperty.call(f,"x")&&u(f)}),e-=s,n-=l,Ae(t.nodes(),function(h){var f=t.node(h);f.x-=e,f.y-=n}),Ae(t.edges(),function(h){var f=t.edge(h);Ae(f.points,function(d){d.x-=e,d.y-=n}),Object.prototype.hasOwnProperty.call(f,"x")&&(f.x-=e),Object.prototype.hasOwnProperty.call(f,"y")&&(f.y-=n)}),a.width=r-e+s,a.height=i-n+l}function CPe(t){Ae(t.edges(),function(e){var r=t.edge(e),n=t.node(e.v),i=t.node(e.w),a,s;r.points?(a=r.points[0],s=r.points[r.points.length-1]):(r.points=[],a=i,s=n),r.points.unshift(RR(n,a)),r.points.push(RR(i,s))})}function APe(t){Ae(t.edges(),function(e){var r=t.edge(e);if(Object.prototype.hasOwnProperty.call(r,"x"))switch((r.labelpos==="l"||r.labelpos==="r")&&(r.width-=r.labeloffset),r.labelpos){case"l":r.x-=r.width/2+r.labeloffset;break;case"r":r.x+=r.width/2+r.labeloffset;break}})}function _Pe(t){Ae(t.edges(),function(e){var r=t.edge(e);r.reversed&&r.points.reverse()})}function DPe(t){Ae(t.nodes(),function(e){if(t.children(e).length){var r=t.node(e),n=t.node(r.borderTop),i=t.node(r.borderBottom),a=t.node(ma(r.borderLeft)),s=t.node(ma(r.borderRight));r.width=Math.abs(s.x-a.x),r.height=Math.abs(i.y-n.y),r.x=a.x+r.width/2,r.y=n.y+r.height/2}}),Ae(t.nodes(),function(e){t.node(e).dummy==="border"&&t.removeNode(e)})}function LPe(t){Ae(t.edges(),function(e){if(e.v===e.w){var r=t.node(e.v);r.selfEdges||(r.selfEdges=[]),r.selfEdges.push({e,label:t.edge(e)}),t.removeEdge(e)}})}function RPe(t){var e=of(t);Ae(e,function(r){var n=0;Ae(r,function(i,a){var s=t.node(i);s.order=a+n,Ae(s.selfEdges,function(l){Dc(t,"selfedge",{width:l.label.width,height:l.label.height,rank:s.rank,order:a+ ++n,e:l.e,label:l.label},"_se")}),delete s.selfEdges})})}function NPe(t){Ae(t.nodes(),function(e){var r=t.node(e);if(r.dummy==="selfedge"){var n=t.node(r.e.v),i=n.x+n.width/2,a=n.y,s=r.x-i,l=n.height/2;t.setEdge(r.e,r.label),t.removeNode(e),r.label.points=[{x:i+2*s/3,y:a-l},{x:i+5*s/6,y:a-l},{x:i+s,y:a},{x:i+5*s/6,y:a+l},{x:i+2*s/3,y:a+l}],r.label.x=r.x,r.label.y=r.y}})}function QR(t,e){return jd(Qd(t,e),Number)}function ZR(t){var e={};return Ae(t,function(r,n){e[n.toLowerCase()]=r}),e}var fPe,dPe,pPe,mPe,gPe,yPe,vPe,xPe,Gae=N(()=>{"use strict";qt();Wo();Bie();Vie();LR();PR();jR();dae();Mae();Oae();zae();Lc();o(G2,"layout");o(uPe,"runLayout");o(hPe,"updateInputGraph");fPe=["nodesep","edgesep","ranksep","marginx","marginy"],dPe={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},pPe=["acyclicer","ranker","rankdir","align"],mPe=["width","height"],gPe={width:0,height:0},yPe=["minlen","weight","width","height","labeloffset"],vPe={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},xPe=["labelpos"];o(bPe,"buildLayoutGraph");o(TPe,"makeSpaceForEdgeLabels");o(wPe,"injectEdgeLabelProxies");o(kPe,"assignRankMinMax");o(EPe,"removeEdgeLabelProxies");o(SPe,"translateGraph");o(CPe,"assignNodeIntersects");o(APe,"fixupEdgeLabelCoords");o(_Pe,"reversePointsForReversedEdges");o(DPe,"removeBorderNodes");o(LPe,"removeSelfEdges");o(RPe,"insertSelfEdges");o(NPe,"positionSelfEdges");o(QR,"selectNumberAttrs");o(ZR,"canonicalize")});var JR=N(()=>{"use strict";LR();Gae();PR();jR()});function qo(t){var e={options:{directed:t.isDirected(),multigraph:t.isMultigraph(),compound:t.isCompound()},nodes:MPe(t),edges:IPe(t)};return mr(t.graph())||(e.value=an(t.graph())),e}function MPe(t){return Je(t.nodes(),function(e){var r=t.node(e),n=t.parent(e),i={v:e};return mr(r)||(i.value=r),mr(n)||(i.parent=n),i})}function IPe(t){return Je(t.edges(),function(e){var r=t.edge(e),n={v:e.v,w:e.w};return mr(e.name)||(n.name=e.name),mr(r)||(n.value=r),n})}var eN=N(()=>{"use strict";qt();hk();o(qo,"write");o(MPe,"writeNodes");o(IPe,"writeEdges")});var Tr,tp,Hae,Wae,vk,OPe,qae,Yae,PPe,Ym,Uae,Xae,jae,Kae,Qae,Zae=N(()=>{"use strict";yt();Wo();eN();Tr=new Map,tp=new Map,Hae=new Map,Wae=o(()=>{tp.clear(),Hae.clear(),Tr.clear()},"clear"),vk=o((t,e)=>{let r=tp.get(e)||[];return X.trace("In isDescendant",e," ",t," = ",r.includes(t)),r.includes(t)},"isDescendant"),OPe=o((t,e)=>{let r=tp.get(e)||[];return X.info("Descendants of ",e," is ",r),X.info("Edge is ",t),t.v===e||t.w===e?!1:r?r.includes(t.v)||vk(t.v,e)||vk(t.w,e)||r.includes(t.w):(X.debug("Tilt, ",e,",not in descendants"),!1)},"edgeInCluster"),qae=o((t,e,r,n)=>{X.warn("Copying children of ",t,"root",n,"data",e.node(t),n);let i=e.children(t)||[];t!==n&&i.push(t),X.warn("Copying (nodes) clusterId",t,"nodes",i),i.forEach(a=>{if(e.children(a).length>0)qae(a,e,r,n);else{let s=e.node(a);X.info("cp ",a," to ",n," with parent ",t),r.setNode(a,s),n!==e.parent(a)&&(X.warn("Setting parent",a,e.parent(a)),r.setParent(a,e.parent(a))),t!==n&&a!==t?(X.debug("Setting parent",a,t),r.setParent(a,t)):(X.info("In copy ",t,"root",n,"data",e.node(t),n),X.debug("Not Setting parent for node=",a,"cluster!==rootId",t!==n,"node!==clusterId",a!==t));let l=e.edges(a);X.debug("Copying Edges",l),l.forEach(u=>{X.info("Edge",u);let h=e.edge(u.v,u.w,u.name);X.info("Edge data",h,n);try{OPe(u,n)?(X.info("Copying as ",u.v,u.w,h,u.name),r.setEdge(u.v,u.w,h,u.name),X.info("newGraph edges ",r.edges(),r.edge(r.edges()[0]))):X.info("Skipping copy of edge ",u.v,"-->",u.w," rootId: ",n," clusterId:",t)}catch(f){X.error(f)}})}X.debug("Removing node",a),e.removeNode(a)})},"copy"),Yae=o((t,e)=>{let r=e.children(t),n=[...r];for(let i of r)Hae.set(i,t),n=[...n,...Yae(i,e)];return n},"extractDescendants"),PPe=o((t,e,r)=>{let n=t.edges().filter(u=>u.v===e||u.w===e),i=t.edges().filter(u=>u.v===r||u.w===r),a=n.map(u=>({v:u.v===e?r:u.v,w:u.w===e?e:u.w})),s=i.map(u=>({v:u.v,w:u.w}));return a.filter(u=>s.some(h=>u.v===h.v&&u.w===h.w))},"findCommonEdges"),Ym=o((t,e,r)=>{let n=e.children(t);if(X.trace("Searching children of id ",t,n),n.length<1)return t;let i;for(let a of n){let s=Ym(a,e,r),l=PPe(e,r,s);if(s)if(l.length>0)i=s;else return s}return i},"findNonClusterChild"),Uae=o(t=>!Tr.has(t)||!Tr.get(t).externalConnections?t:Tr.has(t)?Tr.get(t).id:t,"getAnchorId"),Xae=o((t,e)=>{if(!t||e>10){X.debug("Opting out, no graph ");return}else X.debug("Opting in, graph ");t.nodes().forEach(function(r){t.children(r).length>0&&(X.warn("Cluster identified",r," Replacement id in edges: ",Ym(r,t,r)),tp.set(r,Yae(r,t)),Tr.set(r,{id:Ym(r,t,r),clusterData:t.node(r)}))}),t.nodes().forEach(function(r){let n=t.children(r),i=t.edges();n.length>0?(X.debug("Cluster identified",r,tp),i.forEach(a=>{let s=vk(a.v,r),l=vk(a.w,r);s^l&&(X.warn("Edge: ",a," leaves cluster ",r),X.warn("Descendants of XXX ",r,": ",tp.get(r)),Tr.get(r).externalConnections=!0)})):X.debug("Not a cluster ",r,tp)});for(let r of Tr.keys()){let n=Tr.get(r).id,i=t.parent(n);i!==r&&Tr.has(i)&&!Tr.get(i).externalConnections&&(Tr.get(r).id=i)}t.edges().forEach(function(r){let n=t.edge(r);X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(r)),X.warn("Edge "+r.v+" -> "+r.w+": "+JSON.stringify(t.edge(r)));let i=r.v,a=r.w;if(X.warn("Fix XXX",Tr,"ids:",r.v,r.w,"Translating: ",Tr.get(r.v)," --- ",Tr.get(r.w)),Tr.get(r.v)||Tr.get(r.w)){if(X.warn("Fixing and trying - removing XXX",r.v,r.w,r.name),i=Uae(r.v),a=Uae(r.w),t.removeEdge(r.v,r.w,r.name),i!==r.v){let s=t.parent(i);Tr.get(s).externalConnections=!0,n.fromCluster=r.v}if(a!==r.w){let s=t.parent(a);Tr.get(s).externalConnections=!0,n.toCluster=r.w}X.warn("Fix Replacing with XXX",i,a,r.name),t.setEdge(i,a,n,r.name)}}),X.warn("Adjusted Graph",qo(t)),jae(t,0),X.trace(Tr)},"adjustClustersAndEdges"),jae=o((t,e)=>{if(X.warn("extractor - ",e,qo(t),t.children("D")),e>10){X.error("Bailing out");return}let r=t.nodes(),n=!1;for(let i of r){let a=t.children(i);n=n||a.length>0}if(!n){X.debug("Done, no node has children",t.nodes());return}X.debug("Nodes = ",r,e);for(let i of r)if(X.debug("Extracting node",i,Tr,Tr.has(i)&&!Tr.get(i).externalConnections,!t.parent(i),t.node(i),t.children("D")," Depth ",e),!Tr.has(i))X.debug("Not a cluster",i,e);else if(!Tr.get(i).externalConnections&&t.children(i)&&t.children(i).length>0){X.warn("Cluster without external connections, without a parent and with children",i,e);let s=t.graph().rankdir==="TB"?"LR":"TB";Tr.get(i)?.clusterData?.dir&&(s=Tr.get(i).clusterData.dir,X.warn("Fixing dir",Tr.get(i).clusterData.dir,s));let l=new sn({multigraph:!0,compound:!0}).setGraph({rankdir:s,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});X.warn("Old graph before copy",qo(t)),qae(i,t,l,i),t.setNode(i,{clusterNode:!0,id:i,clusterData:Tr.get(i).clusterData,label:Tr.get(i).label,graph:l}),X.warn("New graph after copy node: (",i,")",qo(l)),X.debug("Old graph after copy",qo(t))}else X.warn("Cluster ** ",i," **not meeting the criteria !externalConnections:",!Tr.get(i).externalConnections," no parent: ",!t.parent(i)," children ",t.children(i)&&t.children(i).length>0,t.children("D"),e),X.debug(Tr);r=t.nodes(),X.warn("New list of nodes",r);for(let i of r){let a=t.node(i);X.warn(" Now next level",i,a),a?.clusterNode&&jae(a.graph,e+1)}},"extractor"),Kae=o((t,e)=>{if(e.length===0)return[];let r=Object.assign([],e);return e.forEach(n=>{let i=t.children(n),a=Kae(t,i);r=[...r,...a]}),r},"sorter"),Qae=o(t=>Kae(t,t.children()),"sortNodesByHierarchy")});var ese={};ur(ese,{render:()=>BPe});var Jae,BPe,tse=N(()=>{"use strict";JR();eN();Wo();FL();Ft();Zae();mw();aw();BL();yt();R2();Gt();Jae=o(async(t,e,r,n,i,a)=>{X.warn("Graph in recursive render:XAX",qo(e),i);let s=e.graph().rankdir;X.trace("Dir in recursive render - dir:",s);let l=t.insert("g").attr("class","root");e.nodes()?X.info("Recursive render XXX",e.nodes()):X.info("No nodes found for",e),e.edges().length>0&&X.info("Recursive edges",e.edge(e.edges()[0]));let u=l.insert("g").attr("class","clusters"),h=l.insert("g").attr("class","edgePaths"),f=l.insert("g").attr("class","edgeLabels"),d=l.insert("g").attr("class","nodes");await Promise.all(e.nodes().map(async function(y){let v=e.node(y);if(i!==void 0){let x=JSON.parse(JSON.stringify(i.clusterData));X.trace(`Setting data for parent cluster XXX - Node.id = `,y,` - data=`,x.height,` -Parent cluster`,i.height),e.setNode(i.id,x),e.parent(y)||(X.trace("Setting parent",y,i.id),e.setParent(y,i.id,x))}if(X.info("(Insert) Node XXX"+y+": "+JSON.stringify(e.node(y))),v?.clusterNode){X.info("Cluster identified XBX",y,v.width,e.node(y));let{ranksep:x,nodesep:b}=e.graph();v.graph.setGraph({...v.graph.graph(),ranksep:x+25,nodesep:b});let T=await Jae(d,v.graph,r,n,e.node(y),a),S=T.elem;Ke(v,S),v.diff=T.diff||0,X.info("New compound node after recursive render XAX",y,"width",v.width,"height",v.height),vee(S,v)}else e.children(y).length>0?(X.trace("Cluster - the non recursive path XBX",y,v.id,v,v.width,"Graph:",e),X.trace(Ym(v.id,e)),Tr.set(v.id,{id:Ym(v.id,e),node:v})):(X.trace("Node - the non recursive path XAX",y,d,e.node(y),s),await Am(d,e.node(y),{config:a,dir:s}))})),await o(async()=>{let y=e.edges().map(async function(v){let x=e.edge(v.v,v.w,v.name);X.info("Edge "+v.v+" -> "+v.w+": "+JSON.stringify(v)),X.info("Edge "+v.v+" -> "+v.w+": ",v," ",JSON.stringify(e.edge(v))),X.info("Fix",Tr,"ids:",v.v,v.w,"Translating: ",Tr.get(v.v),Tr.get(v.w)),await uw(f,x)});await Promise.all(y)},"processEdges")(),X.info("Graph before layout:",JSON.stringify(qo(e))),X.info("############################################# XXX"),X.info("### Layout ### XXX"),X.info("############################################# XXX"),G2(e),X.info("Graph after layout:",JSON.stringify(qo(e)));let m=0,{subGraphTitleTotalMargin:g}=Bu(a);return await Promise.all(Qae(e).map(async function(y){let v=e.node(y);if(X.info("Position XBX => "+y+": ("+v.x,","+v.y,") width: ",v.width," height: ",v.height),v?.clusterNode)v.y+=g,X.info("A tainted cluster node XBX1",y,v.id,v.width,v.height,v.x,v.y,e.parent(y)),Tr.get(v.id).node=v,M2(v);else if(e.children(y).length>0){X.info("A pure cluster node XBX1",y,v.id,v.x,v.y,v.width,v.height,e.parent(y)),v.height+=g,e.node(v.parentId);let x=v?.padding/2||0,b=v?.labelBBox?.height||0,T=b-x||0;X.debug("OffsetY",T,"labelHeight",b,"halfPadding",x),await Cm(u,v),Tr.get(v.id).node=v}else{let x=e.node(v.parentId);v.y+=g/2,X.info("A regular node XBX1 - using the padding",v.id,"parent",v.parentId,v.width,v.height,v.x,v.y,"offsetY",v.offsetY,"parent",x,x?.offsetY,v),M2(v)}})),e.edges().forEach(function(y){let v=e.edge(y);X.info("Edge "+y.v+" -> "+y.w+": "+JSON.stringify(v),v),v.points.forEach(S=>S.y+=g/2);let x=e.node(y.v);var b=e.node(y.w);let T=fw(h,v,Tr,r,x,b,n);hw(v,T)}),e.nodes().forEach(function(y){let v=e.node(y);X.info(y,v.type,v.diff),v.isGroup&&(m=v.diff)}),X.warn("Returning from recursive render XAX",l,m),{elem:l,diff:m}},"recursiveRender"),BPe=o(async(t,e)=>{let r=new sn({multigraph:!0,compound:!0}).setGraph({rankdir:t.direction,nodesep:t.config?.nodeSpacing||t.config?.flowchart?.nodeSpacing||t.nodeSpacing,ranksep:t.config?.rankSpacing||t.config?.flowchart?.rankSpacing||t.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),n=e.select("g");dw(n,t.markers,t.type,t.diagramId),xee(),yee(),hee(),Wae(),t.nodes.forEach(a=>{r.setNode(a.id,{...a}),a.parentId&&r.setParent(a.id,a.parentId)}),X.debug("Edges:",t.edges),t.edges.forEach(a=>{if(a.start===a.end){let s=a.start,l=s+"---"+s+"---1",u=s+"---"+s+"---2",h=r.node(s);r.setNode(l,{domId:l,id:l,parentId:h.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),r.setParent(l,h.parentId),r.setNode(u,{domId:u,id:u,parentId:h.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),r.setParent(u,h.parentId);let f=structuredClone(a),d=structuredClone(a),p=structuredClone(a);f.label="",f.arrowTypeEnd="none",f.id=s+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=s+"-cyclic-special-mid",p.label="",h.isGroup&&(f.fromCluster=s,p.toCluster=s),p.id=s+"-cyclic-special-2",p.arrowTypeStart="none",r.setEdge(s,l,f,s+"-cyclic-special-0"),r.setEdge(l,u,d,s+"-cyclic-special-1"),r.setEdge(u,s,p,s+"-cyc{"use strict";Tee();yt();V2={},tN=o(t=>{for(let e of t)V2[e.name]=e},"registerLayoutLoaders"),FPe=o(()=>{tN([{name:"dagre",loader:o(async()=>await Promise.resolve().then(()=>(tse(),ese)),"loader")}])},"registerDefaultLayoutLoaders");FPe();Rc=o(async(t,e)=>{if(!(t.layoutAlgorithm in V2))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);let r=V2[t.layoutAlgorithm];return(await r.loader()).render(t,e,bee,{algorithm:r.algorithm})},"render"),uf=o((t="",{fallback:e="dagre"}={})=>{if(t in V2)return t;if(e in V2)return X.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")});var Yo,$Pe,zPe,np=N(()=>{"use strict";xi();yt();Yo=o((t,e,r,n)=>{t.attr("class",r);let{width:i,height:a,x:s,y:l}=$Pe(t,e);fn(t,a,i,n);let u=zPe(s,l,i,a,e);t.attr("viewBox",u),X.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),$Pe=o((t,e)=>{let r=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:r.width+e*2,height:r.height+e*2,x:r.x,y:r.y}},"calculateDimensionsWithPadding"),zPe=o((t,e,r,n,i)=>`${t-i} ${e-i} ${r} ${n}`,"createViewBox")});var GPe,VPe,rse,nse=N(()=>{"use strict";fr();Gt();yt();Sm();rp();np();er();GPe=o(function(t,e){return e.db.getClasses()},"getClasses"),VPe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,flowchart:a,layout:s}=me(),l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?l.nodes()[0].contentDocument:document;X.debug("Before getData: ");let h=n.db.getData();X.debug("Data: ",h);let f=wc(e,i),d=n.db.getDirection();h.type=n.type,h.layoutAlgorithm=uf(s),h.layoutAlgorithm==="dagre"&&s==="elk"&&X.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),h.direction=d,h.nodeSpacing=a?.nodeSpacing||50,h.rankSpacing=a?.rankSpacing||50,h.markers=["point","circle","cross"],h.diagramId=e,X.debug("REF1:",h),await Rc(h,f);let p=h.config.flowchart?.diagramPadding??8;Vt.insertTitle(f,"flowchartTitleText",a?.titleTopMargin||0,n.db.getDiagramTitle()),Yo(f,p,"flowchart",a?.useMaxWidth||!1);for(let m of h.nodes){let g=Ge(`#${e} [id="${m.id}"]`);if(!g||!m.link)continue;let y=u.createElementNS("http://www.w3.org/2000/svg","a");y.setAttributeNS("http://www.w3.org/2000/svg","class",m.cssClasses),y.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),i==="sandbox"?y.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):m.linkTarget&&y.setAttributeNS("http://www.w3.org/2000/svg","target",m.linkTarget);let v=g.insert(function(){return y},":first-child"),x=g.select(".label-container");x&&v.append(function(){return x.node()});let b=g.select(".label");b&&v.append(function(){return b.node()})}},"draw"),rse={getClasses:GPe,draw:VPe}});var rN,nN,ise=N(()=>{"use strict";rN=function(){var t=o(function(Hr,et,gt,Kt){for(gt=gt||{},Kt=Hr.length;Kt--;gt[Hr[Kt]]=et);return gt},"o"),e=[1,4],r=[1,3],n=[1,5],i=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],a=[2,2],s=[1,13],l=[1,14],u=[1,15],h=[1,16],f=[1,23],d=[1,25],p=[1,26],m=[1,27],g=[1,49],y=[1,48],v=[1,29],x=[1,30],b=[1,31],T=[1,32],S=[1,33],w=[1,44],E=[1,46],_=[1,42],C=[1,47],D=[1,43],O=[1,50],R=[1,45],k=[1,51],L=[1,52],A=[1,34],I=[1,35],M=[1,36],P=[1,37],B=[1,57],F=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],z=[1,61],$=[1,60],U=[1,62],K=[8,9,11,75,77,78],ee=[1,78],Y=[1,91],ce=[1,96],Z=[1,95],ue=[1,92],Q=[1,88],j=[1,94],ne=[1,90],te=[1,97],he=[1,93],le=[1,98],J=[1,89],Se=[8,9,10,11,40,75,77,78],se=[8,9,10,11,40,46,75,77,78],ae=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],Oe=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],ye=[44,60,89,102,105,106,109,111,114,115,116],Be=[1,121],He=[1,122],ze=[1,124],Le=[1,123],Ie=[44,60,62,74,89,102,105,106,109,111,114,115,116],xe=[1,133],q=[1,147],de=[1,148],ie=[1,149],oe=[1,150],V=[1,135],Te=[1,137],W=[1,141],pe=[1,142],ve=[1,143],Pe=[1,144],_e=[1,145],be=[1,146],Ve=[1,151],De=[1,152],qe=[1,131],at=[1,132],Rt=[1,139],st=[1,134],Ue=[1,138],ct=[1,136],We=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],ot=[1,154],Yt=[1,156],Tt=[8,9,11],Mt=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],bt=[1,176],ut=[1,172],St=[1,173],ft=[1,177],vt=[1,174],nt=[1,175],pn=[77,116,119],kt=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],On=[10,106],tn=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],Mr=[1,247],Ir=[1,245],Pn=[1,249],Dt=[1,243],Ce=[1,244],tt=[1,246],Ct=[1,248],gr=[1,250],rn=[1,268],yn=[8,9,11,106],Zr=[8,9,10,11,60,84,105,106,109,110,111,112],Oi={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],performAction:o(function(et,gt,Kt,lt,Cn,ge,Qf){var we=ge.length-1;switch(Cn){case 2:this.$=[];break;case 3:(!Array.isArray(ge[we])||ge[we].length>0)&&ge[we-1].push(ge[we]),this.$=ge[we-1];break;case 4:case 183:this.$=ge[we];break;case 11:lt.setDirection("TB"),this.$="TB";break;case 12:lt.setDirection(ge[we-1]),this.$=ge[we-1];break;case 27:this.$=ge[we-1].nodes;break;case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 33:this.$=lt.addSubGraph(ge[we-6],ge[we-1],ge[we-4]);break;case 34:this.$=lt.addSubGraph(ge[we-3],ge[we-1],ge[we-3]);break;case 35:this.$=lt.addSubGraph(void 0,ge[we-1],void 0);break;case 37:this.$=ge[we].trim(),lt.setAccTitle(this.$);break;case 38:case 39:this.$=ge[we].trim(),lt.setAccDescription(this.$);break;case 43:this.$=ge[we-1]+ge[we];break;case 44:this.$=ge[we];break;case 45:lt.addVertex(ge[we-1][ge[we-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ge[we]),lt.addLink(ge[we-3].stmt,ge[we-1],ge[we-2]),this.$={stmt:ge[we-1],nodes:ge[we-1].concat(ge[we-3].nodes)};break;case 46:lt.addLink(ge[we-2].stmt,ge[we],ge[we-1]),this.$={stmt:ge[we],nodes:ge[we].concat(ge[we-2].nodes)};break;case 47:lt.addLink(ge[we-3].stmt,ge[we-1],ge[we-2]),this.$={stmt:ge[we-1],nodes:ge[we-1].concat(ge[we-3].nodes)};break;case 48:this.$={stmt:ge[we-1],nodes:ge[we-1]};break;case 49:lt.addVertex(ge[we-1][ge[we-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ge[we]),this.$={stmt:ge[we-1],nodes:ge[we-1],shapeData:ge[we]};break;case 50:this.$={stmt:ge[we],nodes:ge[we]};break;case 51:this.$=[ge[we]];break;case 52:lt.addVertex(ge[we-5][ge[we-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,ge[we-4]),this.$=ge[we-5].concat(ge[we]);break;case 53:this.$=ge[we-4].concat(ge[we]);break;case 54:this.$=ge[we];break;case 55:this.$=ge[we-2],lt.setClass(ge[we-2],ge[we]);break;case 56:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"square");break;case 57:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"doublecircle");break;case 58:this.$=ge[we-5],lt.addVertex(ge[we-5],ge[we-2],"circle");break;case 59:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"ellipse");break;case 60:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"stadium");break;case 61:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"subroutine");break;case 62:this.$=ge[we-7],lt.addVertex(ge[we-7],ge[we-1],"rect",void 0,void 0,void 0,Object.fromEntries([[ge[we-5],ge[we-3]]]));break;case 63:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"cylinder");break;case 64:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"round");break;case 65:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"diamond");break;case 66:this.$=ge[we-5],lt.addVertex(ge[we-5],ge[we-2],"hexagon");break;case 67:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"odd");break;case 68:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"trapezoid");break;case 69:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"inv_trapezoid");break;case 70:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"lean_right");break;case 71:this.$=ge[we-3],lt.addVertex(ge[we-3],ge[we-1],"lean_left");break;case 72:this.$=ge[we],lt.addVertex(ge[we]);break;case 73:ge[we-1].text=ge[we],this.$=ge[we-1];break;case 74:case 75:ge[we-2].text=ge[we-1],this.$=ge[we-2];break;case 76:this.$=ge[we];break;case 77:var Ei=lt.destructLink(ge[we],ge[we-2]);this.$={type:Ei.type,stroke:Ei.stroke,length:Ei.length,text:ge[we-1]};break;case 78:var Ei=lt.destructLink(ge[we],ge[we-2]);this.$={type:Ei.type,stroke:Ei.stroke,length:Ei.length,text:ge[we-1],id:ge[we-3]};break;case 79:this.$={text:ge[we],type:"text"};break;case 80:this.$={text:ge[we-1].text+""+ge[we],type:ge[we-1].type};break;case 81:this.$={text:ge[we],type:"string"};break;case 82:this.$={text:ge[we],type:"markdown"};break;case 83:var Ei=lt.destructLink(ge[we]);this.$={type:Ei.type,stroke:Ei.stroke,length:Ei.length};break;case 84:var Ei=lt.destructLink(ge[we]);this.$={type:Ei.type,stroke:Ei.stroke,length:Ei.length,id:ge[we-1]};break;case 85:this.$=ge[we-1];break;case 86:this.$={text:ge[we],type:"text"};break;case 87:this.$={text:ge[we-1].text+""+ge[we],type:ge[we-1].type};break;case 88:this.$={text:ge[we],type:"string"};break;case 89:case 104:this.$={text:ge[we],type:"markdown"};break;case 101:this.$={text:ge[we],type:"text"};break;case 102:this.$={text:ge[we-1].text+""+ge[we],type:ge[we-1].type};break;case 103:this.$={text:ge[we],type:"text"};break;case 105:this.$=ge[we-4],lt.addClass(ge[we-2],ge[we]);break;case 106:this.$=ge[we-4],lt.setClass(ge[we-2],ge[we]);break;case 107:case 115:this.$=ge[we-1],lt.setClickEvent(ge[we-1],ge[we]);break;case 108:case 116:this.$=ge[we-3],lt.setClickEvent(ge[we-3],ge[we-2]),lt.setTooltip(ge[we-3],ge[we]);break;case 109:this.$=ge[we-2],lt.setClickEvent(ge[we-2],ge[we-1],ge[we]);break;case 110:this.$=ge[we-4],lt.setClickEvent(ge[we-4],ge[we-3],ge[we-2]),lt.setTooltip(ge[we-4],ge[we]);break;case 111:this.$=ge[we-2],lt.setLink(ge[we-2],ge[we]);break;case 112:this.$=ge[we-4],lt.setLink(ge[we-4],ge[we-2]),lt.setTooltip(ge[we-4],ge[we]);break;case 113:this.$=ge[we-4],lt.setLink(ge[we-4],ge[we-2],ge[we]);break;case 114:this.$=ge[we-6],lt.setLink(ge[we-6],ge[we-4],ge[we]),lt.setTooltip(ge[we-6],ge[we-2]);break;case 117:this.$=ge[we-1],lt.setLink(ge[we-1],ge[we]);break;case 118:this.$=ge[we-3],lt.setLink(ge[we-3],ge[we-2]),lt.setTooltip(ge[we-3],ge[we]);break;case 119:this.$=ge[we-3],lt.setLink(ge[we-3],ge[we-2],ge[we]);break;case 120:this.$=ge[we-5],lt.setLink(ge[we-5],ge[we-4],ge[we]),lt.setTooltip(ge[we-5],ge[we-2]);break;case 121:this.$=ge[we-4],lt.addVertex(ge[we-2],void 0,void 0,ge[we]);break;case 122:this.$=ge[we-4],lt.updateLink([ge[we-2]],ge[we]);break;case 123:this.$=ge[we-4],lt.updateLink(ge[we-2],ge[we]);break;case 124:this.$=ge[we-8],lt.updateLinkInterpolate([ge[we-6]],ge[we-2]),lt.updateLink([ge[we-6]],ge[we]);break;case 125:this.$=ge[we-8],lt.updateLinkInterpolate(ge[we-6],ge[we-2]),lt.updateLink(ge[we-6],ge[we]);break;case 126:this.$=ge[we-6],lt.updateLinkInterpolate([ge[we-4]],ge[we]);break;case 127:this.$=ge[we-6],lt.updateLinkInterpolate(ge[we-4],ge[we]);break;case 128:case 130:this.$=[ge[we]];break;case 129:case 131:ge[we-2].push(ge[we]),this.$=ge[we-2];break;case 133:this.$=ge[we-1]+ge[we];break;case 181:this.$=ge[we];break;case 182:this.$=ge[we-1]+""+ge[we];break;case 184:this.$=ge[we-1]+""+ge[we];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"};break}},"anonymous"),table:[{3:1,4:2,9:e,10:r,12:n},{1:[3]},t(i,a,{5:6}),{4:7,9:e,10:r,12:n},{4:8,9:e,10:r,12:n},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L,121:A,122:I,123:M,124:P},t(i,[2,9]),t(i,[2,10]),t(i,[2,11]),{8:[1,54],9:[1,55],10:B,15:53,18:56},t(F,[2,3]),t(F,[2,4]),t(F,[2,5]),t(F,[2,6]),t(F,[2,7]),t(F,[2,8]),{8:z,9:$,11:U,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:z,9:$,11:U,21:67},{8:z,9:$,11:U,21:68},{8:z,9:$,11:U,21:69},{8:z,9:$,11:U,21:70},{8:z,9:$,11:U,21:71},{8:z,9:$,10:[1,72],11:U,21:73},t(F,[2,36]),{35:[1,74]},{37:[1,75]},t(F,[2,39]),t(K,[2,50],{18:76,39:77,10:B,40:ee}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:Y,44:ce,60:Z,80:[1,86],89:ue,95:[1,83],97:[1,84],101:85,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J,120:87},t(F,[2,185]),t(F,[2,186]),t(F,[2,187]),t(F,[2,188]),t(Se,[2,51]),t(Se,[2,54],{46:[1,99]}),t(se,[2,72],{113:112,29:[1,100],44:g,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:y,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:w,102:E,105:_,106:C,109:D,111:O,114:R,115:k,116:L}),t(ae,[2,181]),t(ae,[2,142]),t(ae,[2,143]),t(ae,[2,144]),t(ae,[2,145]),t(ae,[2,146]),t(ae,[2,147]),t(ae,[2,148]),t(ae,[2,149]),t(ae,[2,150]),t(ae,[2,151]),t(ae,[2,152]),t(i,[2,12]),t(i,[2,18]),t(i,[2,19]),{9:[1,113]},t(Oe,[2,26],{18:114,10:B}),t(F,[2,27]),{42:115,43:38,44:g,45:39,47:40,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},t(F,[2,40]),t(F,[2,41]),t(F,[2,42]),t(ye,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:Be,81:He,116:ze,119:Le},{75:[1,125],77:[1,126]},t(Ie,[2,83]),t(F,[2,28]),t(F,[2,29]),t(F,[2,30]),t(F,[2,31]),t(F,[2,32]),{10:xe,12:q,14:de,27:ie,28:127,32:oe,44:V,60:Te,75:W,80:[1,129],81:[1,130],83:140,84:pe,85:ve,86:Pe,87:_e,88:be,89:Ve,90:De,91:128,105:qe,109:at,111:Rt,114:st,115:Ue,116:ct},t(We,a,{5:153}),t(F,[2,37]),t(F,[2,38]),t(K,[2,48],{44:ot}),t(K,[2,49],{18:155,10:B,40:Yt}),t(Se,[2,44]),{44:g,47:157,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},{102:[1,158],103:159,105:[1,160]},{44:g,47:161,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},{44:g,47:162,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},t(Tt,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t(Tt,[2,115],{120:167,10:[1,166],14:Y,44:ce,60:Z,89:ue,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J}),t(Tt,[2,117],{10:[1,168]}),t(Mt,[2,183]),t(Mt,[2,170]),t(Mt,[2,171]),t(Mt,[2,172]),t(Mt,[2,173]),t(Mt,[2,174]),t(Mt,[2,175]),t(Mt,[2,176]),t(Mt,[2,177]),t(Mt,[2,178]),t(Mt,[2,179]),t(Mt,[2,180]),{44:g,47:169,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},{30:170,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:178,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:180,50:[1,179],67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:181,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:182,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:183,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{109:[1,184]},{30:185,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:186,65:[1,187],67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:188,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:189,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{30:190,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},t(ae,[2,182]),t(i,[2,20]),t(Oe,[2,25]),t(K,[2,46],{39:191,18:192,10:B,40:ee}),t(ye,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{77:[1,196],79:197,116:ze,119:Le},t(pn,[2,79]),t(pn,[2,81]),t(pn,[2,82]),t(pn,[2,168]),t(pn,[2,169]),{76:198,79:120,80:Be,81:He,116:ze,119:Le},t(Ie,[2,84]),{8:z,9:$,10:xe,11:U,12:q,14:de,21:200,27:ie,29:[1,199],32:oe,44:V,60:Te,75:W,83:140,84:pe,85:ve,86:Pe,87:_e,88:be,89:Ve,90:De,91:201,105:qe,109:at,111:Rt,114:st,115:Ue,116:ct},t(kt,[2,101]),t(kt,[2,103]),t(kt,[2,104]),t(kt,[2,157]),t(kt,[2,158]),t(kt,[2,159]),t(kt,[2,160]),t(kt,[2,161]),t(kt,[2,162]),t(kt,[2,163]),t(kt,[2,164]),t(kt,[2,165]),t(kt,[2,166]),t(kt,[2,167]),t(kt,[2,90]),t(kt,[2,91]),t(kt,[2,92]),t(kt,[2,93]),t(kt,[2,94]),t(kt,[2,95]),t(kt,[2,96]),t(kt,[2,97]),t(kt,[2,98]),t(kt,[2,99]),t(kt,[2,100]),{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,202],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L,121:A,122:I,123:M,124:P},{10:B,18:203},{44:[1,204]},t(Se,[2,43]),{10:[1,205],44:g,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:112,114:R,115:k,116:L},{10:[1,206]},{10:[1,207],106:[1,208]},t(On,[2,128]),{10:[1,209],44:g,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:112,114:R,115:k,116:L},{10:[1,210],44:g,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:112,114:R,115:k,116:L},{80:[1,211]},t(Tt,[2,109],{10:[1,212]}),t(Tt,[2,111],{10:[1,213]}),{80:[1,214]},t(Mt,[2,184]),{80:[1,215],98:[1,216]},t(Se,[2,55],{113:112,44:g,60:y,89:w,102:E,105:_,106:C,109:D,111:O,114:R,115:k,116:L}),{31:[1,217],67:bt,82:218,116:ft,117:vt,118:nt},t(tn,[2,86]),t(tn,[2,88]),t(tn,[2,89]),t(tn,[2,153]),t(tn,[2,154]),t(tn,[2,155]),t(tn,[2,156]),{49:[1,219],67:bt,82:218,116:ft,117:vt,118:nt},{30:220,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{51:[1,221],67:bt,82:218,116:ft,117:vt,118:nt},{53:[1,222],67:bt,82:218,116:ft,117:vt,118:nt},{55:[1,223],67:bt,82:218,116:ft,117:vt,118:nt},{57:[1,224],67:bt,82:218,116:ft,117:vt,118:nt},{60:[1,225]},{64:[1,226],67:bt,82:218,116:ft,117:vt,118:nt},{66:[1,227],67:bt,82:218,116:ft,117:vt,118:nt},{30:228,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},{31:[1,229],67:bt,82:218,116:ft,117:vt,118:nt},{67:bt,69:[1,230],71:[1,231],82:218,116:ft,117:vt,118:nt},{67:bt,69:[1,233],71:[1,232],82:218,116:ft,117:vt,118:nt},t(K,[2,45],{18:155,10:B,40:Yt}),t(K,[2,47],{44:ot}),t(ye,[2,75]),t(ye,[2,74]),{62:[1,234],67:bt,82:218,116:ft,117:vt,118:nt},t(ye,[2,77]),t(pn,[2,80]),{77:[1,235],79:197,116:ze,119:Le},{30:236,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},t(We,a,{5:237}),t(kt,[2,102]),t(F,[2,35]),{43:238,44:g,45:39,47:40,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},{10:B,18:239},{10:Mr,60:Ir,84:Pn,92:240,105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},{10:Mr,60:Ir,84:Pn,92:251,104:[1,252],105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},{10:Mr,60:Ir,84:Pn,92:253,104:[1,254],105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},{105:[1,255]},{10:Mr,60:Ir,84:Pn,92:256,105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},{44:g,47:257,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},t(Tt,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t(Tt,[2,116]),t(Tt,[2,118],{10:[1,261]}),t(Tt,[2,119]),t(se,[2,56]),t(tn,[2,87]),t(se,[2,57]),{51:[1,262],67:bt,82:218,116:ft,117:vt,118:nt},t(se,[2,64]),t(se,[2,59]),t(se,[2,60]),t(se,[2,61]),{109:[1,263]},t(se,[2,63]),t(se,[2,65]),{66:[1,264],67:bt,82:218,116:ft,117:vt,118:nt},t(se,[2,67]),t(se,[2,68]),t(se,[2,70]),t(se,[2,69]),t(se,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(ye,[2,78]),{31:[1,265],67:bt,82:218,116:ft,117:vt,118:nt},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,266],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L,121:A,122:I,123:M,124:P},t(Se,[2,53]),{43:267,44:g,45:39,47:40,60:y,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L},t(Tt,[2,121],{106:rn}),t(yn,[2,130],{108:269,10:Mr,60:Ir,84:Pn,105:Dt,109:Ce,110:tt,111:Ct,112:gr}),t(Zr,[2,132]),t(Zr,[2,134]),t(Zr,[2,135]),t(Zr,[2,136]),t(Zr,[2,137]),t(Zr,[2,138]),t(Zr,[2,139]),t(Zr,[2,140]),t(Zr,[2,141]),t(Tt,[2,122],{106:rn}),{10:[1,270]},t(Tt,[2,123],{106:rn}),{10:[1,271]},t(On,[2,129]),t(Tt,[2,105],{106:rn}),t(Tt,[2,106],{113:112,44:g,60:y,89:w,102:E,105:_,106:C,109:D,111:O,114:R,115:k,116:L}),t(Tt,[2,110]),t(Tt,[2,112],{10:[1,272]}),t(Tt,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:z,9:$,11:U,21:277},t(F,[2,34]),t(Se,[2,52]),{10:Mr,60:Ir,84:Pn,105:Dt,107:278,108:242,109:Ce,110:tt,111:Ct,112:gr},t(Zr,[2,133]),{14:Y,44:ce,60:Z,89:ue,101:279,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J,120:87},{14:Y,44:ce,60:Z,89:ue,101:280,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J,120:87},{98:[1,281]},t(Tt,[2,120]),t(se,[2,58]),{30:282,67:bt,80:ut,81:St,82:171,116:ft,117:vt,118:nt},t(se,[2,66]),t(We,a,{5:283}),t(yn,[2,131],{108:269,10:Mr,60:Ir,84:Pn,105:Dt,109:Ce,110:tt,111:Ct,112:gr}),t(Tt,[2,126],{120:167,10:[1,284],14:Y,44:ce,60:Z,89:ue,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J}),t(Tt,[2,127],{120:167,10:[1,285],14:Y,44:ce,60:Z,89:ue,105:Q,106:j,109:ne,111:te,114:he,115:le,116:J}),t(Tt,[2,114]),{31:[1,286],67:bt,82:218,116:ft,117:vt,118:nt},{6:11,7:12,8:s,9:l,10:u,11:h,20:17,22:18,23:19,24:20,25:21,26:22,27:f,32:[1,287],33:24,34:d,36:p,38:m,42:28,43:38,44:g,45:39,47:40,60:y,84:v,85:x,86:b,87:T,88:S,89:w,102:E,105:_,106:C,109:D,111:O,113:41,114:R,115:k,116:L,121:A,122:I,123:M,124:P},{10:Mr,60:Ir,84:Pn,92:288,105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},{10:Mr,60:Ir,84:Pn,92:289,105:Dt,107:241,108:242,109:Ce,110:tt,111:Ct,112:gr},t(se,[2,62]),t(F,[2,33]),t(Tt,[2,124],{106:rn}),t(Tt,[2,125],{106:rn})],defaultActions:{},parseError:o(function(et,gt){if(gt.recoverable)this.trace(et);else{var Kt=new Error(et);throw Kt.hash=gt,Kt}},"parseError"),parse:o(function(et){var gt=this,Kt=[0],lt=[],Cn=[null],ge=[],Qf=this.table,we="",Ei=0,l$=0,c$=0,tbe=2,u$=1,rbe=ge.slice.call(arguments,1),ji=Object.create(this.lexer),Zf={yy:{}};for(var $C in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$C)&&(Zf.yy[$C]=this.yy[$C]);ji.setInput(et,Zf.yy),Zf.yy.lexer=ji,Zf.yy.parser=this,typeof ji.yylloc>"u"&&(ji.yylloc={});var zC=ji.yylloc;ge.push(zC);var nbe=ji.options&&ji.options.ranges;typeof Zf.yy.parseError=="function"?this.parseError=Zf.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Qit(Xs){Kt.length=Kt.length-2*Xs,Cn.length=Cn.length-Xs,ge.length=ge.length-Xs}o(Qit,"popStack");function ibe(){var Xs;return Xs=lt.pop()||ji.lex()||u$,typeof Xs!="number"&&(Xs instanceof Array&&(lt=Xs,Xs=lt.pop()),Xs=gt.symbols_[Xs]||Xs),Xs}o(ibe,"lex");for(var Ka,GC,Jf,wo,Zit,VC,c0={},z4,nu,h$,G4;;){if(Jf=Kt[Kt.length-1],this.defaultActions[Jf]?wo=this.defaultActions[Jf]:((Ka===null||typeof Ka>"u")&&(Ka=ibe()),wo=Qf[Jf]&&Qf[Jf][Ka]),typeof wo>"u"||!wo.length||!wo[0]){var UC="";G4=[];for(z4 in Qf[Jf])this.terminals_[z4]&&z4>tbe&&G4.push("'"+this.terminals_[z4]+"'");ji.showPosition?UC="Parse error on line "+(Ei+1)+`: -`+ji.showPosition()+` -Expecting `+G4.join(", ")+", got '"+(this.terminals_[Ka]||Ka)+"'":UC="Parse error on line "+(Ei+1)+": Unexpected "+(Ka==u$?"end of input":"'"+(this.terminals_[Ka]||Ka)+"'"),this.parseError(UC,{text:ji.match,token:this.terminals_[Ka]||Ka,line:ji.yylineno,loc:zC,expected:G4})}if(wo[0]instanceof Array&&wo.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Jf+", token: "+Ka);switch(wo[0]){case 1:Kt.push(Ka),Cn.push(ji.yytext),ge.push(ji.yylloc),Kt.push(wo[1]),Ka=null,GC?(Ka=GC,GC=null):(l$=ji.yyleng,we=ji.yytext,Ei=ji.yylineno,zC=ji.yylloc,c$>0&&c$--);break;case 2:if(nu=this.productions_[wo[1]][1],c0.$=Cn[Cn.length-nu],c0._$={first_line:ge[ge.length-(nu||1)].first_line,last_line:ge[ge.length-1].last_line,first_column:ge[ge.length-(nu||1)].first_column,last_column:ge[ge.length-1].last_column},nbe&&(c0._$.range=[ge[ge.length-(nu||1)].range[0],ge[ge.length-1].range[1]]),VC=this.performAction.apply(c0,[we,l$,Ei,Zf.yy,wo[1],Cn,ge].concat(rbe)),typeof VC<"u")return VC;nu&&(Kt=Kt.slice(0,-1*nu*2),Cn=Cn.slice(0,-1*nu),ge=ge.slice(0,-1*nu)),Kt.push(this.productions_[wo[1]][0]),Cn.push(c0.$),ge.push(c0._$),h$=Qf[Kt[Kt.length-2]][Kt[Kt.length-1]],Kt.push(h$);break;case 3:return!0}}return!0},"parse")},ei=function(){var Hr={EOF:1,parseError:o(function(gt,Kt){if(this.yy.parser)this.yy.parser.parseError(gt,Kt);else throw new Error(gt)},"parseError"),setInput:o(function(et,gt){return this.yy=gt||this.yy||{},this._input=et,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var et=this._input[0];this.yytext+=et,this.yyleng++,this.offset++,this.match+=et,this.matched+=et;var gt=et.match(/(?:\r\n?|\n).*/g);return gt?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),et},"input"),unput:o(function(et){var gt=et.length,Kt=et.split(/(?:\r\n?|\n)/g);this._input=et+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-gt),this.offset-=gt;var lt=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Kt.length-1&&(this.yylineno-=Kt.length-1);var Cn=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Kt?(Kt.length===lt.length?this.yylloc.first_column:0)+lt[lt.length-Kt.length].length-Kt[0].length:this.yylloc.first_column-gt},this.options.ranges&&(this.yylloc.range=[Cn[0],Cn[0]+this.yyleng-gt]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(et){this.unput(this.match.slice(et))},"less"),pastInput:o(function(){var et=this.matched.substr(0,this.matched.length-this.match.length);return(et.length>20?"...":"")+et.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var et=this.match;return et.length<20&&(et+=this._input.substr(0,20-et.length)),(et.substr(0,20)+(et.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var et=this.pastInput(),gt=new Array(et.length+1).join("-");return et+this.upcomingInput()+` -`+gt+"^"},"showPosition"),test_match:o(function(et,gt){var Kt,lt,Cn;if(this.options.backtrack_lexer&&(Cn={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(Cn.yylloc.range=this.yylloc.range.slice(0))),lt=et[0].match(/(?:\r\n?|\n).*/g),lt&&(this.yylineno+=lt.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:lt?lt[lt.length-1].length-lt[lt.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+et[0].length},this.yytext+=et[0],this.match+=et[0],this.matches=et,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(et[0].length),this.matched+=et[0],Kt=this.performAction.call(this,this.yy,this,gt,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Kt)return Kt;if(this._backtrack){for(var ge in Cn)this[ge]=Cn[ge];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var et,gt,Kt,lt;this._more||(this.yytext="",this.match="");for(var Cn=this._currentRules(),ge=0;gegt[0].length)){if(gt=Kt,lt=ge,this.options.backtrack_lexer){if(et=this.test_match(Kt,Cn[ge]),et!==!1)return et;if(this._backtrack){gt=!1;continue}else return!1}else if(!this.options.flex)break}return gt?(et=this.test_match(gt,Cn[lt]),et!==!1?et:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var gt=this.next();return gt||this.lex()},"lex"),begin:o(function(gt){this.conditionStack.push(gt)},"begin"),popState:o(function(){var gt=this.conditionStack.length-1;return gt>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(gt){return gt=this.conditionStack.length-1-Math.abs(gt||0),gt>=0?this.conditionStack[gt]:"INITIAL"},"topState"),pushState:o(function(gt){this.begin(gt)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(gt,Kt,lt,Cn){var ge=Cn;switch(lt){case 0:return this.begin("acc_title"),34;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),36;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),Kt.yytext="",40;break;case 8:return this.pushState("shapeDataStr"),40;break;case 9:return this.popState(),40;break;case 10:let Qf=/\n\s*/g;return Kt.yytext=Kt.yytext.replace(Qf,"
    "),40;break;case 11:return 40;case 12:this.popState();break;case 13:this.begin("callbackname");break;case 14:this.popState();break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 17:this.popState();break;case 18:return 96;case 19:return"MD_STR";case 20:this.popState();break;case 21:this.begin("md_string");break;case 22:return"STR";case 23:this.popState();break;case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 33:this.popState();break;case 34:return 88;case 35:return gt.lex.firstGraph()&&this.begin("dir"),12;break;case 36:return gt.lex.firstGraph()&&this.begin("dir"),12;break;case 37:return gt.lex.firstGraph()&&this.begin("dir"),12;break;case 38:return 27;case 39:return 32;case 40:return 98;case 41:return 98;case 42:return 98;case 43:return 98;case 44:return this.popState(),13;break;case 45:return this.popState(),14;break;case 46:return this.popState(),14;break;case 47:return this.popState(),14;break;case 48:return this.popState(),14;break;case 49:return this.popState(),14;break;case 50:return this.popState(),14;break;case 51:return this.popState(),14;break;case 52:return this.popState(),14;break;case 53:return this.popState(),14;break;case 54:return this.popState(),14;break;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:return 111;case 62:return 46;case 63:return 60;case 64:return 44;case 65:return 8;case 66:return 106;case 67:return 115;case 68:return this.popState(),77;break;case 69:return this.pushState("edgeText"),75;break;case 70:return 119;case 71:return this.popState(),77;break;case 72:return this.pushState("thickEdgeText"),75;break;case 73:return 119;case 74:return this.popState(),77;break;case 75:return this.pushState("dottedEdgeText"),75;break;case 76:return 119;case 77:return 77;case 78:return this.popState(),53;break;case 79:return"TEXT";case 80:return this.pushState("ellipseText"),52;break;case 81:return this.popState(),55;break;case 82:return this.pushState("text"),54;break;case 83:return this.popState(),57;break;case 84:return this.pushState("text"),56;break;case 85:return 58;case 86:return this.pushState("text"),67;break;case 87:return this.popState(),64;break;case 88:return this.pushState("text"),63;break;case 89:return this.popState(),49;break;case 90:return this.pushState("text"),48;break;case 91:return this.popState(),69;break;case 92:return this.popState(),71;break;case 93:return 117;case 94:return this.pushState("trapText"),68;break;case 95:return this.pushState("trapText"),70;break;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 101:return 115;case 102:return 111;case 103:return 44;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;break;case 108:return this.pushState("text"),62;break;case 109:return this.popState(),51;break;case 110:return this.pushState("text"),50;break;case 111:return this.popState(),31;break;case 112:return this.pushState("text"),29;break;case 113:return this.popState(),66;break;case 114:return this.pushState("text"),65;break;case 115:return"TEXT";case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},text:{rules:[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],inclusive:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],inclusive:!0}}};return Hr}();Oi.lexer=ei;function Sn(){this.yy={}}return o(Sn,"Parser"),Sn.prototype=Oi,Oi.Parser=Sn,new Sn}();rN.parser=rN;nN=rN});var ase,sse,ose=N(()=>{"use strict";ise();ase=Object.assign({},nN);ase.parse=t=>{let e=t.replace(/}\s*\n/g,`} -`);return nN.parse(e)};sse=ase});var Nc,Xm=N(()=>{"use strict";Nc=o(()=>` - /* Font Awesome icon styling - consolidated */ - .label-icon { - display: inline-block; - height: 1em; - overflow: visible; - vertical-align: -0.125em; - } - - .node .label-icon path { - fill: currentColor; - stroke: revert; - stroke-width: revert; - } -`,"getIconStyles")});var UPe,HPe,lse,cse=N(()=>{"use strict";Ks();Xm();UPe=o((t,e)=>{let r=id,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Qa(n,i,a,e)},"fade"),HPe=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .cluster-label text { - fill: ${t.titleColor}; - } - .cluster-label span { - color: ${t.titleColor}; - } - .cluster-label span p { - background-color: transparent; - } - - .label text,span { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .katex path { - fill: #000; - stroke: #000; - stroke-width: 1px; - } - - .rough-node .label,.node .label, .image-shape .label, .icon-shape .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - - .root .anchor path { - fill: ${t.lineColor} !important; - stroke-width: 0; - stroke: ${t.lineColor}; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${UPe(t.edgeLabelBackground,.5)}; - // background-color: - } - - .cluster rect { - fill: ${t.clusterBkg}; - stroke: ${t.clusterBorder}; - stroke-width: 1px; - } - - .cluster text { - fill: ${t.titleColor}; - } - - .cluster span { - color: ${t.titleColor}; - } - /* .cluster div { - color: ${t.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } - - rect.text { - fill: none; - stroke-width: 0; - } - - .icon-shape, .image-shape { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - padding: 2px; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - ${Nc()} -`,"getStyles"),lse=HPe});var xk={};ur(xk,{diagram:()=>WPe});var WPe,bk=N(()=>{"use strict";Gt();lee();nse();ose();cse();WPe={parser:sse,get db(){return new iw},renderer:rse,styles:lse,init:o(t=>{t.flowchart||(t.flowchart={}),t.layout&&nv({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,nv({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}});var iN,pse,mse=N(()=>{"use strict";iN=function(){var t=o(function(te,he,le,J){for(le=le||{},J=te.length;J--;le[te[J]]=he);return le},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],r=[1,10],n=[1,11],i=[1,12],a=[1,13],s=[1,20],l=[1,21],u=[1,22],h=[1,23],f=[1,24],d=[1,19],p=[1,25],m=[1,26],g=[1,18],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],w=[1,42],E=[1,43],_=[1,52],C=[40,50,68,69],D=[1,63],O=[1,61],R=[1,58],k=[1,62],L=[1,64],A=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],I=[63,64,65,66,67],M=[1,81],P=[1,80],B=[1,78],F=[1,79],z=[6,10,42,47],$=[6,10,13,41,42,47,48,49],U=[1,89],K=[1,88],ee=[1,87],Y=[19,56],ce=[1,98],Z=[1,97],ue=[19,56,58,60],Q={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,attribute:51,attributeType:52,attributeName:53,attributeKeyTypeList:54,attributeComment:55,ATTRIBUTE_WORD:56,attributeKeyType:57,",":58,ATTRIBUTE_KEY:59,COMMENT:60,cardinality:61,relType:62,ZERO_OR_ONE:63,ZERO_OR_MORE:64,ONE_OR_MORE:65,ONLY_ONE:66,MD_PARENT:67,NON_IDENTIFYING:68,IDENTIFYING:69,WORD:70,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",56:"ATTRIBUTE_WORD",58:",",59:"ATTRIBUTE_KEY",60:"COMMENT",63:"ZERO_OR_ONE",64:"ZERO_OR_MORE",65:"ONE_OR_MORE",66:"ONLY_ONE",67:"MD_PARENT",68:"NON_IDENTIFYING",69:"IDENTIFYING",70:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],performAction:o(function(he,le,J,Se,se,ae,Oe){var ye=ae.length-1;switch(se){case 1:break;case 2:this.$=[];break;case 3:ae[ye-1].push(ae[ye]),this.$=ae[ye-1];break;case 4:case 5:this.$=ae[ye];break;case 6:case 7:this.$=[];break;case 8:Se.addEntity(ae[ye-4]),Se.addEntity(ae[ye-2]),Se.addRelationship(ae[ye-4],ae[ye],ae[ye-2],ae[ye-3]);break;case 9:Se.addEntity(ae[ye-8]),Se.addEntity(ae[ye-4]),Se.addRelationship(ae[ye-8],ae[ye],ae[ye-4],ae[ye-5]),Se.setClass([ae[ye-8]],ae[ye-6]),Se.setClass([ae[ye-4]],ae[ye-2]);break;case 10:Se.addEntity(ae[ye-6]),Se.addEntity(ae[ye-2]),Se.addRelationship(ae[ye-6],ae[ye],ae[ye-2],ae[ye-3]),Se.setClass([ae[ye-6]],ae[ye-4]);break;case 11:Se.addEntity(ae[ye-6]),Se.addEntity(ae[ye-4]),Se.addRelationship(ae[ye-6],ae[ye],ae[ye-4],ae[ye-5]),Se.setClass([ae[ye-4]],ae[ye-2]);break;case 12:Se.addEntity(ae[ye-3]),Se.addAttributes(ae[ye-3],ae[ye-1]);break;case 13:Se.addEntity(ae[ye-5]),Se.addAttributes(ae[ye-5],ae[ye-1]),Se.setClass([ae[ye-5]],ae[ye-3]);break;case 14:Se.addEntity(ae[ye-2]);break;case 15:Se.addEntity(ae[ye-4]),Se.setClass([ae[ye-4]],ae[ye-2]);break;case 16:Se.addEntity(ae[ye]);break;case 17:Se.addEntity(ae[ye-2]),Se.setClass([ae[ye-2]],ae[ye]);break;case 18:Se.addEntity(ae[ye-6],ae[ye-4]),Se.addAttributes(ae[ye-6],ae[ye-1]);break;case 19:Se.addEntity(ae[ye-8],ae[ye-6]),Se.addAttributes(ae[ye-8],ae[ye-1]),Se.setClass([ae[ye-8]],ae[ye-3]);break;case 20:Se.addEntity(ae[ye-5],ae[ye-3]);break;case 21:Se.addEntity(ae[ye-7],ae[ye-5]),Se.setClass([ae[ye-7]],ae[ye-2]);break;case 22:Se.addEntity(ae[ye-3],ae[ye-1]);break;case 23:Se.addEntity(ae[ye-5],ae[ye-3]),Se.setClass([ae[ye-5]],ae[ye]);break;case 24:case 25:this.$=ae[ye].trim(),Se.setAccTitle(this.$);break;case 26:case 27:this.$=ae[ye].trim(),Se.setAccDescription(this.$);break;case 32:Se.setDirection("TB");break;case 33:Se.setDirection("BT");break;case 34:Se.setDirection("RL");break;case 35:Se.setDirection("LR");break;case 36:this.$=ae[ye-3],Se.addClass(ae[ye-2],ae[ye-1]);break;case 37:case 38:case 56:case 64:this.$=[ae[ye]];break;case 39:case 40:this.$=ae[ye-2].concat([ae[ye]]);break;case 41:this.$=ae[ye-2],Se.setClass(ae[ye-1],ae[ye]);break;case 42:this.$=ae[ye-3],Se.addCssStyles(ae[ye-2],ae[ye-1]);break;case 43:this.$=[ae[ye]];break;case 44:ae[ye-2].push(ae[ye]),this.$=ae[ye-2];break;case 46:this.$=ae[ye-1]+ae[ye];break;case 54:case 76:case 77:this.$=ae[ye].replace(/"/g,"");break;case 55:case 78:this.$=ae[ye];break;case 57:ae[ye].push(ae[ye-1]),this.$=ae[ye];break;case 58:this.$={type:ae[ye-1],name:ae[ye]};break;case 59:this.$={type:ae[ye-2],name:ae[ye-1],keys:ae[ye]};break;case 60:this.$={type:ae[ye-2],name:ae[ye-1],comment:ae[ye]};break;case 61:this.$={type:ae[ye-3],name:ae[ye-2],keys:ae[ye-1],comment:ae[ye]};break;case 62:case 63:case 66:this.$=ae[ye];break;case 65:ae[ye-2].push(ae[ye]),this.$=ae[ye-2];break;case 67:this.$=ae[ye].replace(/"/g,"");break;case 68:this.$={cardA:ae[ye],relType:ae[ye-1],cardB:ae[ye-2]};break;case 69:this.$=Se.Cardinality.ZERO_OR_ONE;break;case 70:this.$=Se.Cardinality.ZERO_OR_MORE;break;case 71:this.$=Se.Cardinality.ONE_OR_MORE;break;case 72:this.$=Se.Cardinality.ONLY_ONE;break;case 73:this.$=Se.Cardinality.MD_PARENT;break;case 74:this.$=Se.Identification.NON_IDENTIFYING;break;case 75:this.$=Se.Identification.IDENTIFYING;break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:27,11:9,22:r,24:n,26:i,28:a,29:14,30:15,31:16,32:17,33:s,34:l,35:u,36:h,37:f,40:d,43:p,44:m,50:g},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:y,64:v,65:x,66:b,67:T}),{23:[1,38]},{25:[1,39]},{27:[1,40]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(S,[2,54]),t(S,[2,55]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:41,40:w,41:E},{16:44,40:w,41:E},{16:45,40:w,41:E},t(e,[2,4]),{11:46,40:d,50:g},{16:47,40:w,41:E},{18:48,19:[1,49],51:50,52:51,56:_},{11:53,40:d,50:g},{62:54,68:[1,55],69:[1,56]},t(C,[2,69]),t(C,[2,70]),t(C,[2,71]),t(C,[2,72]),t(C,[2,73]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:D,38:57,41:O,42:R,45:59,46:60,48:k,49:L},t(A,[2,37]),t(A,[2,38]),{16:65,40:w,41:E,42:R},{13:D,38:66,41:O,42:R,45:59,46:60,48:k,49:L},{13:[1,67],15:[1,68]},t(e,[2,17],{61:32,12:69,17:[1,70],42:R,63:y,64:v,65:x,66:b,67:T}),{19:[1,71]},t(e,[2,14]),{18:72,19:[2,56],51:50,52:51,56:_},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:y,64:v,65:x,66:b,67:T},t(I,[2,74]),t(I,[2,75]),{6:M,10:P,39:77,42:B,47:F},{40:[1,82],41:[1,83]},t(z,[2,43],{46:84,13:D,41:O,48:k,49:L}),t($,[2,45]),t($,[2,50]),t($,[2,51]),t($,[2,52]),t($,[2,53]),t(e,[2,41],{42:R}),{6:M,10:P,39:85,42:B,47:F},{14:86,40:U,50:K,70:ee},{16:90,40:w,41:E},{11:91,40:d,50:g},{18:92,19:[1,93],51:50,52:51,56:_},t(e,[2,12]),{19:[2,57]},t(Y,[2,58],{54:94,55:95,57:96,59:ce,60:Z}),t([19,56,59,60],[2,63]),t(e,[2,22],{15:[1,100],17:[1,99]}),t([40,50],[2,68]),t(e,[2,36]),{13:D,41:O,45:101,46:60,48:k,49:L},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(A,[2,39]),t(A,[2,40]),t($,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,76]),t(e,[2,77]),t(e,[2,78]),{13:[1,102],42:R},{13:[1,104],15:[1,103]},{19:[1,105]},t(e,[2,15]),t(Y,[2,59],{55:106,58:[1,107],60:Z}),t(Y,[2,60]),t(ue,[2,64]),t(Y,[2,67]),t(ue,[2,66]),{18:108,19:[1,109],51:50,52:51,56:_},{16:110,40:w,41:E},t(z,[2,44],{46:84,13:D,41:O,48:k,49:L}),{14:111,40:U,50:K,70:ee},{16:112,40:w,41:E},{14:113,40:U,50:K,70:ee},t(e,[2,13]),t(Y,[2,61]),{57:114,59:ce},{19:[1,115]},t(e,[2,20]),t(e,[2,23],{17:[1,116],42:R}),t(e,[2,11]),{13:[1,117],42:R},t(e,[2,10]),t(ue,[2,65]),t(e,[2,18]),{18:118,19:[1,119],51:50,52:51,56:_},{14:120,40:U,50:K,70:ee},{19:[1,121]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{52:[2,62],72:[2,57]},parseError:o(function(he,le){if(le.recoverable)this.trace(he);else{var J=new Error(he);throw J.hash=le,J}},"parseError"),parse:o(function(he){var le=this,J=[0],Se=[],se=[null],ae=[],Oe=this.table,ye="",Be=0,He=0,ze=0,Le=2,Ie=1,xe=ae.slice.call(arguments,1),q=Object.create(this.lexer),de={yy:{}};for(var ie in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ie)&&(de.yy[ie]=this.yy[ie]);q.setInput(he,de.yy),de.yy.lexer=q,de.yy.parser=this,typeof q.yylloc>"u"&&(q.yylloc={});var oe=q.yylloc;ae.push(oe);var V=q.options&&q.options.ranges;typeof de.yy.parseError=="function"?this.parseError=de.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Te(ct){J.length=J.length-2*ct,se.length=se.length-ct,ae.length=ae.length-ct}o(Te,"popStack");function W(){var ct;return ct=Se.pop()||q.lex()||Ie,typeof ct!="number"&&(ct instanceof Array&&(Se=ct,ct=Se.pop()),ct=le.symbols_[ct]||ct),ct}o(W,"lex");for(var pe,ve,Pe,_e,be,Ve,De={},qe,at,Rt,st;;){if(Pe=J[J.length-1],this.defaultActions[Pe]?_e=this.defaultActions[Pe]:((pe===null||typeof pe>"u")&&(pe=W()),_e=Oe[Pe]&&Oe[Pe][pe]),typeof _e>"u"||!_e.length||!_e[0]){var Ue="";st=[];for(qe in Oe[Pe])this.terminals_[qe]&&qe>Le&&st.push("'"+this.terminals_[qe]+"'");q.showPosition?Ue="Parse error on line "+(Be+1)+`: -`+q.showPosition()+` -Expecting `+st.join(", ")+", got '"+(this.terminals_[pe]||pe)+"'":Ue="Parse error on line "+(Be+1)+": Unexpected "+(pe==Ie?"end of input":"'"+(this.terminals_[pe]||pe)+"'"),this.parseError(Ue,{text:q.match,token:this.terminals_[pe]||pe,line:q.yylineno,loc:oe,expected:st})}if(_e[0]instanceof Array&&_e.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Pe+", token: "+pe);switch(_e[0]){case 1:J.push(pe),se.push(q.yytext),ae.push(q.yylloc),J.push(_e[1]),pe=null,ve?(pe=ve,ve=null):(He=q.yyleng,ye=q.yytext,Be=q.yylineno,oe=q.yylloc,ze>0&&ze--);break;case 2:if(at=this.productions_[_e[1]][1],De.$=se[se.length-at],De._$={first_line:ae[ae.length-(at||1)].first_line,last_line:ae[ae.length-1].last_line,first_column:ae[ae.length-(at||1)].first_column,last_column:ae[ae.length-1].last_column},V&&(De._$.range=[ae[ae.length-(at||1)].range[0],ae[ae.length-1].range[1]]),Ve=this.performAction.apply(De,[ye,He,Be,de.yy,_e[1],se,ae].concat(xe)),typeof Ve<"u")return Ve;at&&(J=J.slice(0,-1*at*2),se=se.slice(0,-1*at),ae=ae.slice(0,-1*at)),J.push(this.productions_[_e[1]][0]),se.push(De.$),ae.push(De._$),Rt=Oe[J[J.length-2]][J[J.length-1]],J.push(Rt);break;case 3:return!0}}return!0},"parse")},j=function(){var te={EOF:1,parseError:o(function(le,J){if(this.yy.parser)this.yy.parser.parseError(le,J);else throw new Error(le)},"parseError"),setInput:o(function(he,le){return this.yy=le||this.yy||{},this._input=he,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var he=this._input[0];this.yytext+=he,this.yyleng++,this.offset++,this.match+=he,this.matched+=he;var le=he.match(/(?:\r\n?|\n).*/g);return le?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),he},"input"),unput:o(function(he){var le=he.length,J=he.split(/(?:\r\n?|\n)/g);this._input=he+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-le),this.offset-=le;var Se=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),J.length-1&&(this.yylineno-=J.length-1);var se=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:J?(J.length===Se.length?this.yylloc.first_column:0)+Se[Se.length-J.length].length-J[0].length:this.yylloc.first_column-le},this.options.ranges&&(this.yylloc.range=[se[0],se[0]+this.yyleng-le]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(he){this.unput(this.match.slice(he))},"less"),pastInput:o(function(){var he=this.matched.substr(0,this.matched.length-this.match.length);return(he.length>20?"...":"")+he.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var he=this.match;return he.length<20&&(he+=this._input.substr(0,20-he.length)),(he.substr(0,20)+(he.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var he=this.pastInput(),le=new Array(he.length+1).join("-");return he+this.upcomingInput()+` -`+le+"^"},"showPosition"),test_match:o(function(he,le){var J,Se,se;if(this.options.backtrack_lexer&&(se={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(se.yylloc.range=this.yylloc.range.slice(0))),Se=he[0].match(/(?:\r\n?|\n).*/g),Se&&(this.yylineno+=Se.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Se?Se[Se.length-1].length-Se[Se.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+he[0].length},this.yytext+=he[0],this.match+=he[0],this.matches=he,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(he[0].length),this.matched+=he[0],J=this.performAction.call(this,this.yy,this,le,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),J)return J;if(this._backtrack){for(var ae in se)this[ae]=se[ae];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var he,le,J,Se;this._more||(this.yytext="",this.match="");for(var se=this._currentRules(),ae=0;aele[0].length)){if(le=J,Se=ae,this.options.backtrack_lexer){if(he=this.test_match(J,se[ae]),he!==!1)return he;if(this._backtrack){le=!1;continue}else return!1}else if(!this.options.flex)break}return le?(he=this.test_match(le,se[Se]),he!==!1?he:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var le=this.next();return le||this.lex()},"lex"),begin:o(function(le){this.conditionStack.push(le)},"begin"),popState:o(function(){var le=this.conditionStack.length-1;return le>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(le){return le=this.conditionStack.length-1-Math.abs(le||0),le>=0?this.conditionStack[le]:"INITIAL"},"topState"),pushState:o(function(le){this.begin(le)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(le,J,Se,se){var ae=se;switch(Se){case 0:return this.begin("acc_title"),24;break;case 1:return this.popState(),"acc_title_value";break;case 2:return this.begin("acc_descr"),26;break;case 3:return this.popState(),"acc_descr_value";break;case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:break;case 13:return 8;case 14:return 50;case 15:return 70;case 16:return 4;case 17:return this.begin("block"),17;break;case 18:return 49;case 19:return 49;case 20:return 42;case 21:return 15;case 22:return 13;case 23:break;case 24:return 59;case 25:return 56;case 26:return 56;case 27:return 60;case 28:break;case 29:return this.popState(),19;break;case 30:return J.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;break;case 34:return this.popState(),10;break;case 35:break;case 36:return 13;case 37:return 42;case 38:return 49;case 39:return this.begin("style"),37;break;case 40:return 43;case 41:return 63;case 42:return 65;case 43:return 65;case 44:return 65;case 45:return 63;case 46:return 63;case 47:return 64;case 48:return 64;case 49:return 64;case 50:return 64;case 51:return 64;case 52:return 65;case 53:return 64;case 54:return 65;case 55:return 66;case 56:return 66;case 57:return 66;case 58:return 66;case 59:return 63;case 60:return 64;case 61:return 65;case 62:return 67;case 63:return 68;case 64:return 69;case 65:return 69;case 66:return 68;case 67:return 68;case 68:return 68;case 69:return 41;case 70:return 47;case 71:return 40;case 72:return 48;case 73:return J.yytext[0];case 74:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,69,70],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],inclusive:!0}}};return te}();Q.lexer=j;function ne(){this.yy={}}return o(ne,"Parser"),ne.prototype=Q,Q.Parser=ne,new ne}();iN.parser=iN;pse=iN});var Tk,gse=N(()=>{"use strict";yt();Gt();ci();er();Tk=class{constructor(){this.entities=new Map;this.relationships=[];this.classes=new Map;this.direction="TB";this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"};this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"};this.setAccTitle=Ar;this.getAccTitle=Dr;this.setAccDescription=Lr;this.getAccDescription=Rr;this.setDiagramTitle=Or;this.getDiagramTitle=Nr;this.getConfig=o(()=>me().er,"getConfig");this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"ErDB")}addEntity(e,r=""){return this.entities.has(e)?!this.entities.get(e)?.alias&&r&&(this.entities.get(e).alias=r,X.info(`Add alias '${r}' to entity '${e}'`)):(this.entities.set(e,{id:`entity-${e}-${this.entities.size}`,label:e,attributes:[],alias:r,shape:"erBox",look:me().look??"default",cssClasses:"default",cssStyles:[]}),X.info("Added new entity :",e)),this.entities.get(e)}getEntity(e){return this.entities.get(e)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(e,r){let n=this.addEntity(e),i;for(i=r.length-1;i>=0;i--)r[i].keys||(r[i].keys=[]),r[i].comment||(r[i].comment=""),n.attributes.push(r[i]),X.debug("Added attribute ",r[i].name)}addRelationship(e,r,n,i){let a=this.entities.get(e),s=this.entities.get(n);if(!a||!s)return;let l={entityA:a.id,roleA:r,entityB:s.id,relSpec:i};this.relationships.push(l),X.debug("Added new relationship :",l)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(e){this.direction=e}getCompiledStyles(e){let r=[];for(let n of e){let i=this.classes.get(n);i?.styles&&(r=[...r,...i.styles??[]].map(a=>a.trim())),i?.textStyles&&(r=[...r,...i.textStyles??[]].map(a=>a.trim()))}return r}addCssStyles(e,r){for(let n of e){let i=this.entities.get(n);if(!r||!i)return;for(let a of r)i.cssStyles.push(a)}}addClass(e,r){e.forEach(n=>{let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)})})}setClass(e,r){for(let n of e){let i=this.entities.get(n);if(i)for(let a of r)i.cssClasses+=" "+a}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],kr()}getData(){let e=[],r=[],n=me();for(let a of this.entities.keys()){let s=this.entities.get(a);s&&(s.cssCompiledStyles=this.getCompiledStyles(s.cssClasses.split(" ")),e.push(s))}let i=0;for(let a of this.relationships){let s={id:Wh(a.entityA,a.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:a.entityA,end:a.entityB,label:a.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:a.relSpec.cardB.toLowerCase(),arrowTypeEnd:a.relSpec.cardA.toLowerCase(),pattern:a.relSpec.relType=="IDENTIFYING"?"solid":"dashed",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:"TB"}}}});var aN={};ur(aN,{draw:()=>ZPe});var ZPe,yse=N(()=>{"use strict";Gt();yt();Sm();rp();np();er();fr();ZPe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing er diagram (unified)",e);let{securityLevel:i,er:a,layout:s}=me(),l=n.db.getData(),u=wc(e,i);l.type=n.type,l.layoutAlgorithm=uf(s),l.config.flowchart.nodeSpacing=a?.nodeSpacing||140,l.config.flowchart.rankSpacing=a?.rankSpacing||80,l.direction=n.db.getDirection(),l.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],l.diagramId=e,await Rc(l,u),l.layoutAlgorithm==="elk"&&u.select(".edges").lower();let h=u.selectAll('[id*="-background"]');Array.from(h).length>0&&h.each(function(){let d=Ge(this),m=d.attr("id").replace("-background",""),g=u.select(`#${CSS.escape(m)}`);if(!g.empty()){let y=g.attr("transform");d.attr("transform",y)}});let f=8;Vt.insertTitle(u,"erDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Yo(u,f,"erDiagram",a?.useMaxWidth??!0)},"draw")});var JPe,eBe,vse,xse=N(()=>{"use strict";Ks();JPe=o((t,e)=>{let r=id,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Qa(n,i,a,e)},"fade"),eBe=o(t=>` - .entityBox { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - } - - .relationshipLabelBox { - fill: ${t.tertiaryColor}; - opacity: 0.7; - background-color: ${t.tertiaryColor}; - rect { - opacity: 0.5; - } - } - - .labelBkg { - background-color: ${JPe(t.tertiaryColor,.5)}; - } - - .edgeLabel .label { - fill: ${t.nodeBorder}; - font-size: 14px; - } - - .label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - - .edge-pattern-dashed { - stroke-dasharray: 8,8; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon - { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .relationshipLine { - stroke: ${t.lineColor}; - stroke-width: 1; - fill: none; - } - - .marker { - fill: none !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; - } -`,"getStyles"),vse=eBe});var bse={};ur(bse,{diagram:()=>tBe});var tBe,Tse=N(()=>{"use strict";mse();gse();yse();xse();tBe={parser:pse,get db(){return new Tk},renderer:aN,styles:vse}});function si(t){return typeof t=="object"&&t!==null&&typeof t.$type=="string"}function ya(t){return typeof t=="object"&&t!==null&&typeof t.$refText=="string"}function sN(t){return typeof t=="object"&&t!==null&&typeof t.name=="string"&&typeof t.type=="string"&&typeof t.path=="string"}function ap(t){return typeof t=="object"&&t!==null&&si(t.container)&&ya(t.reference)&&typeof t.message=="string"}function Ml(t){return typeof t=="object"&&t!==null&&Array.isArray(t.content)}function hf(t){return typeof t=="object"&&t!==null&&typeof t.tokenType=="object"}function U2(t){return Ml(t)&&typeof t.fullText=="string"}var ip,Il=N(()=>{"use strict";o(si,"isAstNode");o(ya,"isReference");o(sN,"isAstNodeDescription");o(ap,"isLinkingError");ip=class{static{o(this,"AbstractAstReflection")}constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,r){return si(e)&&this.isSubtype(e.$type,r)}isSubtype(e,r){if(e===r)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});let i=n[r];if(i!==void 0)return i;{let a=this.computeIsSubtype(e,r);return n[r]=a,a}}getAllSubTypes(e){let r=this.allSubtypes[e];if(r)return r;{let n=this.getAllTypes(),i=[];for(let a of n)this.isSubtype(a,e)&&i.push(a);return this.allSubtypes[e]=i,i}}};o(Ml,"isCompositeCstNode");o(hf,"isLeafCstNode");o(U2,"isRootCstNode")});function aBe(t){return typeof t=="string"?t:typeof t>"u"?"undefined":typeof t.toString=="function"?t.toString():Object.prototype.toString.call(t)}function wk(t){return!!t&&typeof t[Symbol.iterator]=="function"}function en(...t){if(t.length===1){let e=t[0];if(e instanceof co)return e;if(wk(e))return new co(()=>e[Symbol.iterator](),r=>r.next());if(typeof e.length=="number")return new co(()=>({index:0}),r=>r.index1?new co(()=>({collIndex:0,arrIndex:0}),e=>{do{if(e.iterator){let r=e.iterator.next();if(!r.done)return r;e.iterator=void 0}if(e.array){if(e.arrIndex{"use strict";co=class t{static{o(this,"StreamImpl")}constructor(e,r){this.startFn=e,this.nextFn=r}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){return!!this.iterator().next().done}count(){let e=this.iterator(),r=0,n=e.next();for(;!n.done;)r++,n=e.next();return r}toArray(){let e=[],r=this.iterator(),n;do n=r.next(),n.value!==void 0&&e.push(n.value);while(!n.done);return e}toSet(){return new Set(this)}toMap(e,r){let n=this.map(i=>[e?e(i):i,r?r(i):i]);return new Map(n)}toString(){return this.join()}concat(e){return new t(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),r=>{let n;if(!r.firstDone){do if(n=this.nextFn(r.first),!n.done)return n;while(!n.done);r.firstDone=!0}do if(n=r.iterator.next(),!n.done)return n;while(!n.done);return Ba})}join(e=","){let r=this.iterator(),n="",i,a=!1;do i=r.next(),i.done||(a&&(n+=e),n+=aBe(i.value)),a=!0;while(!i.done);return n}indexOf(e,r=0){let n=this.iterator(),i=0,a=n.next();for(;!a.done;){if(i>=r&&a.value===e)return i;a=n.next(),i++}return-1}every(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(!e(n.value))return!1;n=r.next()}return!0}some(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return!0;n=r.next()}return!1}forEach(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;)e(i.value,n),i=r.next(),n++}map(e){return new t(this.startFn,r=>{let{done:n,value:i}=this.nextFn(r);return n?Ba:{done:!1,value:e(i)}})}filter(e){return new t(this.startFn,r=>{let n;do if(n=this.nextFn(r),!n.done&&e(n.value))return n;while(!n.done);return Ba})}nonNullable(){return this.filter(e=>e!=null)}reduce(e,r){let n=this.iterator(),i=r,a=n.next();for(;!a.done;)i===void 0?i=a.value:i=e(i,a.value),a=n.next();return i}reduceRight(e,r){return this.recursiveReduce(this.iterator(),e,r)}recursiveReduce(e,r,n){let i=e.next();if(i.done)return n;let a=this.recursiveReduce(e,r,n);return a===void 0?i.value:r(a,i.value)}find(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(e(n.value))return n.value;n=r.next()}}findIndex(e){let r=this.iterator(),n=0,i=r.next();for(;!i.done;){if(e(i.value))return n;i=r.next(),n++}return-1}includes(e){let r=this.iterator(),n=r.next();for(;!n.done;){if(n.value===e)return!0;n=r.next()}return!1}flatMap(e){return new t(()=>({this:this.startFn()}),r=>{do{if(r.iterator){let a=r.iterator.next();if(a.done)r.iterator=void 0;else return a}let{done:n,value:i}=this.nextFn(r.this);if(!n){let a=e(i);if(wk(a))r.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}}while(r.iterator);return Ba})}flat(e){if(e===void 0&&(e=1),e<=0)return this;let r=e>1?this.flat(e-1):this;return new t(()=>({this:r.startFn()}),n=>{do{if(n.iterator){let s=n.iterator.next();if(s.done)n.iterator=void 0;else return s}let{done:i,value:a}=r.nextFn(n.this);if(!i)if(wk(a))n.iterator=a[Symbol.iterator]();else return{done:!1,value:a}}while(n.iterator);return Ba})}head(){let r=this.iterator().next();if(!r.done)return r.value}tail(e=1){return new t(()=>{let r=this.startFn();for(let n=0;n({size:0,state:this.startFn()}),r=>(r.size++,r.size>e?Ba:this.nextFn(r.state)))}distinct(e){return new t(()=>({set:new Set,internalState:this.startFn()}),r=>{let n;do if(n=this.nextFn(r.internalState),!n.done){let i=e?e(n.value):n.value;if(!r.set.has(i))return r.set.add(i),n}while(!n.done);return Ba})}exclude(e,r){let n=new Set;for(let i of e){let a=r?r(i):i;n.add(a)}return this.filter(i=>{let a=r?r(i):i;return!n.has(a)})}};o(aBe,"toString");o(wk,"isIterable");H2=new co(()=>{},()=>Ba),Ba=Object.freeze({done:!0,value:void 0});o(en,"stream");Mc=class extends co{static{o(this,"TreeStreamImpl")}constructor(e,r,n){super(()=>({iterators:n?.includeRoot?[[e][Symbol.iterator]()]:[r(e)[Symbol.iterator]()],pruned:!1}),i=>{for(i.pruned&&(i.iterators.pop(),i.pruned=!1);i.iterators.length>0;){let s=i.iterators[i.iterators.length-1].next();if(s.done)i.iterators.pop();else return i.iterators.push(r(s.value)[Symbol.iterator]()),s}return Ba})}iterator(){let e={state:this.startFn(),next:o(()=>this.nextFn(e.state),"next"),prune:o(()=>{e.state.pruned=!0},"prune"),[Symbol.iterator]:()=>e};return e}};(function(t){function e(a){return a.reduce((s,l)=>s+l,0)}o(e,"sum"),t.sum=e;function r(a){return a.reduce((s,l)=>s*l,0)}o(r,"product"),t.product=r;function n(a){return a.reduce((s,l)=>Math.min(s,l))}o(n,"min"),t.min=n;function i(a){return a.reduce((s,l)=>Math.max(s,l))}o(i,"max"),t.max=i})(jm||(jm={}))});var Ek={};ur(Ek,{DefaultNameRegexp:()=>kk,RangeComparison:()=>Ic,compareRange:()=>Sse,findCommentNode:()=>uN,findDeclarationNodeAtOffset:()=>oBe,findLeafNodeAtOffset:()=>hN,findLeafNodeBeforeOffset:()=>Cse,flattenCst:()=>sBe,getInteriorNodes:()=>uBe,getNextNode:()=>lBe,getPreviousNode:()=>_se,getStartlineNode:()=>cBe,inRange:()=>cN,isChildNode:()=>lN,isCommentNode:()=>oN,streamCst:()=>sp,toDocumentSegment:()=>op,tokenToRange:()=>Km});function sp(t){return new Mc(t,e=>Ml(e)?e.content:[],{includeRoot:!0})}function sBe(t){return sp(t).filter(hf)}function lN(t,e){for(;t.container;)if(t=t.container,t===e)return!0;return!1}function Km(t){return{start:{character:t.startColumn-1,line:t.startLine-1},end:{character:t.endColumn,line:t.endLine-1}}}function op(t){if(!t)return;let{offset:e,end:r,range:n}=t;return{range:n,offset:e,end:r,length:r-e}}function Sse(t,e){if(t.end.linee.end.line||t.start.line===e.end.line&&t.start.character>=e.end.character)return Ic.After;let r=t.start.line>e.start.line||t.start.line===e.start.line&&t.start.character>=e.start.character,n=t.end.lineIc.After}function oBe(t,e,r=kk){if(t){if(e>0){let n=e-t.offset,i=t.text.charAt(n);r.test(i)||e--}return hN(t,e)}}function uN(t,e){if(t){let r=_se(t,!0);if(r&&oN(r,e))return r;if(U2(t)){let n=t.content.findIndex(i=>!i.hidden);for(let i=n-1;i>=0;i--){let a=t.content[i];if(oN(a,e))return a}}}}function oN(t,e){return hf(t)&&e.includes(t.tokenType.name)}function hN(t,e){if(hf(t))return t;if(Ml(t)){let r=Ase(t,e,!1);if(r)return hN(r,e)}}function Cse(t,e){if(hf(t))return t;if(Ml(t)){let r=Ase(t,e,!0);if(r)return Cse(r,e)}}function Ase(t,e,r){let n=0,i=t.content.length-1,a;for(;n<=i;){let s=Math.floor((n+i)/2),l=t.content[s];if(l.offset<=e&&l.end>e)return l;l.end<=e?(a=r?l:void 0,n=s+1):i=s-1}return a}function _se(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t);for(;n>0;){n--;let i=r.content[n];if(e||!i.hidden)return i}t=r}}function lBe(t,e=!0){for(;t.container;){let r=t.container,n=r.content.indexOf(t),i=r.content.length-1;for(;n{"use strict";Il();Gs();o(sp,"streamCst");o(sBe,"flattenCst");o(lN,"isChildNode");o(Km,"tokenToRange");o(op,"toDocumentSegment");(function(t){t[t.Before=0]="Before",t[t.After=1]="After",t[t.OverlapFront=2]="OverlapFront",t[t.OverlapBack=3]="OverlapBack",t[t.Inside=4]="Inside",t[t.Outside=5]="Outside"})(Ic||(Ic={}));o(Sse,"compareRange");o(cN,"inRange");kk=/^[\w\p{L}]$/u;o(oBe,"findDeclarationNodeAtOffset");o(uN,"findCommentNode");o(oN,"isCommentNode");o(hN,"findLeafNodeAtOffset");o(Cse,"findLeafNodeBeforeOffset");o(Ase,"binarySearch");o(_se,"getPreviousNode");o(lBe,"getNextNode");o(cBe,"getStartlineNode");o(uBe,"getInteriorNodes");o(hBe,"getCommonParent");o(Ese,"getParentChain")});function Oc(t){throw new Error("Error! The input value was not handled.")}var lp,Sk=N(()=>{"use strict";lp=class extends Error{static{o(this,"ErrorWithLocation")}constructor(e,r){super(e?`${r} at ${e.range.start.line}:${e.range.start.character}`:r)}};o(Oc,"assertUnreachable")});var J2={};ur(J2,{AbstractElement:()=>Jm,AbstractRule:()=>Qm,AbstractType:()=>Zm,Action:()=>vg,Alternatives:()=>xg,ArrayLiteral:()=>eg,ArrayType:()=>tg,Assignment:()=>bg,BooleanLiteral:()=>rg,CharacterRange:()=>Tg,Condition:()=>W2,Conjunction:()=>ng,CrossReference:()=>wg,Disjunction:()=>ig,EndOfFile:()=>kg,Grammar:()=>ag,GrammarImport:()=>Y2,Group:()=>Eg,InferredType:()=>sg,Interface:()=>og,Keyword:()=>Sg,LangiumGrammarAstReflection:()=>Og,LangiumGrammarTerminals:()=>fBe,NamedArgument:()=>X2,NegatedToken:()=>Cg,Negation:()=>lg,NumberLiteral:()=>cg,Parameter:()=>ug,ParameterReference:()=>hg,ParserRule:()=>fg,ReferenceType:()=>dg,RegexToken:()=>Ag,ReturnType:()=>j2,RuleCall:()=>_g,SimpleType:()=>pg,StringLiteral:()=>mg,TerminalAlternatives:()=>Dg,TerminalGroup:()=>Lg,TerminalRule:()=>cp,TerminalRuleCall:()=>Rg,Type:()=>gg,TypeAttribute:()=>K2,TypeDefinition:()=>Ck,UnionType:()=>yg,UnorderedGroup:()=>Ng,UntilToken:()=>Mg,ValueLiteral:()=>q2,Wildcard:()=>Ig,isAbstractElement:()=>Q2,isAbstractRule:()=>dBe,isAbstractType:()=>pBe,isAction:()=>$u,isAlternatives:()=>Lk,isArrayLiteral:()=>xBe,isArrayType:()=>fN,isAssignment:()=>Pl,isBooleanLiteral:()=>dN,isCharacterRange:()=>TN,isCondition:()=>mBe,isConjunction:()=>pN,isCrossReference:()=>up,isDisjunction:()=>mN,isEndOfFile:()=>wN,isFeatureName:()=>gBe,isGrammar:()=>bBe,isGrammarImport:()=>TBe,isGroup:()=>ff,isInferredType:()=>Ak,isInterface:()=>_k,isKeyword:()=>Xo,isNamedArgument:()=>wBe,isNegatedToken:()=>kN,isNegation:()=>gN,isNumberLiteral:()=>kBe,isParameter:()=>EBe,isParameterReference:()=>yN,isParserRule:()=>Fa,isPrimitiveType:()=>Dse,isReferenceType:()=>vN,isRegexToken:()=>EN,isReturnType:()=>xN,isRuleCall:()=>Bl,isSimpleType:()=>Dk,isStringLiteral:()=>SBe,isTerminalAlternatives:()=>SN,isTerminalGroup:()=>CN,isTerminalRule:()=>uo,isTerminalRuleCall:()=>Rk,isType:()=>Z2,isTypeAttribute:()=>CBe,isTypeDefinition:()=>yBe,isUnionType:()=>bN,isUnorderedGroup:()=>Nk,isUntilToken:()=>AN,isValueLiteral:()=>vBe,isWildcard:()=>_N,reflection:()=>cr});function dBe(t){return cr.isInstance(t,Qm)}function pBe(t){return cr.isInstance(t,Zm)}function mBe(t){return cr.isInstance(t,W2)}function gBe(t){return Dse(t)||t==="current"||t==="entry"||t==="extends"||t==="false"||t==="fragment"||t==="grammar"||t==="hidden"||t==="import"||t==="interface"||t==="returns"||t==="terminal"||t==="true"||t==="type"||t==="infer"||t==="infers"||t==="with"||typeof t=="string"&&/\^?[_a-zA-Z][\w_]*/.test(t)}function Dse(t){return t==="string"||t==="number"||t==="boolean"||t==="Date"||t==="bigint"}function yBe(t){return cr.isInstance(t,Ck)}function vBe(t){return cr.isInstance(t,q2)}function Q2(t){return cr.isInstance(t,Jm)}function xBe(t){return cr.isInstance(t,eg)}function fN(t){return cr.isInstance(t,tg)}function dN(t){return cr.isInstance(t,rg)}function pN(t){return cr.isInstance(t,ng)}function mN(t){return cr.isInstance(t,ig)}function bBe(t){return cr.isInstance(t,ag)}function TBe(t){return cr.isInstance(t,Y2)}function Ak(t){return cr.isInstance(t,sg)}function _k(t){return cr.isInstance(t,og)}function wBe(t){return cr.isInstance(t,X2)}function gN(t){return cr.isInstance(t,lg)}function kBe(t){return cr.isInstance(t,cg)}function EBe(t){return cr.isInstance(t,ug)}function yN(t){return cr.isInstance(t,hg)}function Fa(t){return cr.isInstance(t,fg)}function vN(t){return cr.isInstance(t,dg)}function xN(t){return cr.isInstance(t,j2)}function Dk(t){return cr.isInstance(t,pg)}function SBe(t){return cr.isInstance(t,mg)}function uo(t){return cr.isInstance(t,cp)}function Z2(t){return cr.isInstance(t,gg)}function CBe(t){return cr.isInstance(t,K2)}function bN(t){return cr.isInstance(t,yg)}function $u(t){return cr.isInstance(t,vg)}function Lk(t){return cr.isInstance(t,xg)}function Pl(t){return cr.isInstance(t,bg)}function TN(t){return cr.isInstance(t,Tg)}function up(t){return cr.isInstance(t,wg)}function wN(t){return cr.isInstance(t,kg)}function ff(t){return cr.isInstance(t,Eg)}function Xo(t){return cr.isInstance(t,Sg)}function kN(t){return cr.isInstance(t,Cg)}function EN(t){return cr.isInstance(t,Ag)}function Bl(t){return cr.isInstance(t,_g)}function SN(t){return cr.isInstance(t,Dg)}function CN(t){return cr.isInstance(t,Lg)}function Rk(t){return cr.isInstance(t,Rg)}function Nk(t){return cr.isInstance(t,Ng)}function AN(t){return cr.isInstance(t,Mg)}function _N(t){return cr.isInstance(t,Ig)}var fBe,Qm,Zm,W2,Ck,q2,Jm,eg,tg,rg,ng,ig,ag,Y2,sg,og,X2,lg,cg,ug,hg,fg,dg,j2,pg,mg,cp,gg,K2,yg,vg,xg,bg,Tg,wg,kg,Eg,Sg,Cg,Ag,_g,Dg,Lg,Rg,Ng,Mg,Ig,Og,cr,Pc=N(()=>{"use strict";Il();fBe={ID:/\^?[_a-zA-Z][\w_]*/,STRING:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,NUMBER:/NaN|-?((\d*\.\d+|\d+)([Ee][+-]?\d+)?|Infinity)/,RegexLiteral:/\/(?![*+?])(?:[^\r\n\[/\\]|\\.|\[(?:[^\r\n\]\\]|\\.)*\])+\/[a-z]*/,WS:/\s+/,ML_COMMENT:/\/\*[\s\S]*?\*\//,SL_COMMENT:/\/\/[^\n\r]*/},Qm="AbstractRule";o(dBe,"isAbstractRule");Zm="AbstractType";o(pBe,"isAbstractType");W2="Condition";o(mBe,"isCondition");o(gBe,"isFeatureName");o(Dse,"isPrimitiveType");Ck="TypeDefinition";o(yBe,"isTypeDefinition");q2="ValueLiteral";o(vBe,"isValueLiteral");Jm="AbstractElement";o(Q2,"isAbstractElement");eg="ArrayLiteral";o(xBe,"isArrayLiteral");tg="ArrayType";o(fN,"isArrayType");rg="BooleanLiteral";o(dN,"isBooleanLiteral");ng="Conjunction";o(pN,"isConjunction");ig="Disjunction";o(mN,"isDisjunction");ag="Grammar";o(bBe,"isGrammar");Y2="GrammarImport";o(TBe,"isGrammarImport");sg="InferredType";o(Ak,"isInferredType");og="Interface";o(_k,"isInterface");X2="NamedArgument";o(wBe,"isNamedArgument");lg="Negation";o(gN,"isNegation");cg="NumberLiteral";o(kBe,"isNumberLiteral");ug="Parameter";o(EBe,"isParameter");hg="ParameterReference";o(yN,"isParameterReference");fg="ParserRule";o(Fa,"isParserRule");dg="ReferenceType";o(vN,"isReferenceType");j2="ReturnType";o(xN,"isReturnType");pg="SimpleType";o(Dk,"isSimpleType");mg="StringLiteral";o(SBe,"isStringLiteral");cp="TerminalRule";o(uo,"isTerminalRule");gg="Type";o(Z2,"isType");K2="TypeAttribute";o(CBe,"isTypeAttribute");yg="UnionType";o(bN,"isUnionType");vg="Action";o($u,"isAction");xg="Alternatives";o(Lk,"isAlternatives");bg="Assignment";o(Pl,"isAssignment");Tg="CharacterRange";o(TN,"isCharacterRange");wg="CrossReference";o(up,"isCrossReference");kg="EndOfFile";o(wN,"isEndOfFile");Eg="Group";o(ff,"isGroup");Sg="Keyword";o(Xo,"isKeyword");Cg="NegatedToken";o(kN,"isNegatedToken");Ag="RegexToken";o(EN,"isRegexToken");_g="RuleCall";o(Bl,"isRuleCall");Dg="TerminalAlternatives";o(SN,"isTerminalAlternatives");Lg="TerminalGroup";o(CN,"isTerminalGroup");Rg="TerminalRuleCall";o(Rk,"isTerminalRuleCall");Ng="UnorderedGroup";o(Nk,"isUnorderedGroup");Mg="UntilToken";o(AN,"isUntilToken");Ig="Wildcard";o(_N,"isWildcard");Og=class extends ip{static{o(this,"LangiumGrammarAstReflection")}getAllTypes(){return[Jm,Qm,Zm,vg,xg,eg,tg,bg,rg,Tg,W2,ng,wg,ig,kg,ag,Y2,Eg,sg,og,Sg,X2,Cg,lg,cg,ug,hg,fg,dg,Ag,j2,_g,pg,mg,Dg,Lg,cp,Rg,gg,K2,Ck,yg,Ng,Mg,q2,Ig]}computeIsSubtype(e,r){switch(e){case vg:case xg:case bg:case Tg:case wg:case kg:case Eg:case Sg:case Cg:case Ag:case _g:case Dg:case Lg:case Rg:case Ng:case Mg:case Ig:return this.isSubtype(Jm,r);case eg:case cg:case mg:return this.isSubtype(q2,r);case tg:case dg:case pg:case yg:return this.isSubtype(Ck,r);case rg:return this.isSubtype(W2,r)||this.isSubtype(q2,r);case ng:case ig:case lg:case hg:return this.isSubtype(W2,r);case sg:case og:case gg:return this.isSubtype(Zm,r);case fg:return this.isSubtype(Qm,r)||this.isSubtype(Zm,r);case cp:return this.isSubtype(Qm,r);default:return!1}}getReferenceType(e){let r=`${e.container.$type}:${e.property}`;switch(r){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return Zm;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return Qm;case"Grammar:usedGrammars":return ag;case"NamedArgument:parameter":case"ParameterReference:parameter":return ug;case"TerminalRuleCall:rule":return cp;default:throw new Error(`${r} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Jm:return{name:Jm,properties:[{name:"cardinality"},{name:"lookahead"}]};case eg:return{name:eg,properties:[{name:"elements",defaultValue:[]}]};case tg:return{name:tg,properties:[{name:"elementType"}]};case rg:return{name:rg,properties:[{name:"true",defaultValue:!1}]};case ng:return{name:ng,properties:[{name:"left"},{name:"right"}]};case ig:return{name:ig,properties:[{name:"left"},{name:"right"}]};case ag:return{name:ag,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case Y2:return{name:Y2,properties:[{name:"path"}]};case sg:return{name:sg,properties:[{name:"name"}]};case og:return{name:og,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case X2:return{name:X2,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case lg:return{name:lg,properties:[{name:"value"}]};case cg:return{name:cg,properties:[{name:"value"}]};case ug:return{name:ug,properties:[{name:"name"}]};case hg:return{name:hg,properties:[{name:"parameter"}]};case fg:return{name:fg,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case dg:return{name:dg,properties:[{name:"referenceType"}]};case j2:return{name:j2,properties:[{name:"name"}]};case pg:return{name:pg,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case mg:return{name:mg,properties:[{name:"value"}]};case cp:return{name:cp,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case gg:return{name:gg,properties:[{name:"name"},{name:"type"}]};case K2:return{name:K2,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case yg:return{name:yg,properties:[{name:"types",defaultValue:[]}]};case vg:return{name:vg,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case xg:return{name:xg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case bg:return{name:bg,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Tg:return{name:Tg,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case wg:return{name:wg,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case kg:return{name:kg,properties:[{name:"cardinality"},{name:"lookahead"}]};case Eg:return{name:Eg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case Sg:return{name:Sg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case Cg:return{name:Cg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case Ag:return{name:Ag,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case _g:return{name:_g,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case Dg:return{name:Dg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Lg:return{name:Lg,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Rg:return{name:Rg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case Ng:return{name:Ng,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Mg:return{name:Mg,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case Ig:return{name:Ig,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}},cr=new Og});var Ik={};ur(Ik,{assignMandatoryProperties:()=>RN,copyAstNode:()=>LN,findLocalReferences:()=>_Be,findRootNode:()=>ex,getContainerOfType:()=>hp,getDocument:()=>$a,hasContainerOfType:()=>ABe,linkContentToContainer:()=>Mk,streamAllContents:()=>Bc,streamAst:()=>jo,streamContents:()=>tx,streamReferences:()=>Pg});function Mk(t){for(let[e,r]of Object.entries(t))e.startsWith("$")||(Array.isArray(r)?r.forEach((n,i)=>{si(n)&&(n.$container=t,n.$containerProperty=e,n.$containerIndex=i)}):si(r)&&(r.$container=t,r.$containerProperty=e))}function hp(t,e){let r=t;for(;r;){if(e(r))return r;r=r.$container}}function ABe(t,e){let r=t;for(;r;){if(e(r))return!0;r=r.$container}return!1}function $a(t){let r=ex(t).$document;if(!r)throw new Error("AST node has no document.");return r}function ex(t){for(;t.$container;)t=t.$container;return t}function tx(t,e){if(!t)throw new Error("Node must be an AstNode.");let r=e?.range;return new co(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),n=>{for(;n.keyIndextx(r,e))}function jo(t,e){if(t){if(e?.range&&!DN(t,e.range))return new Mc(t,()=>[])}else throw new Error("Root node must be an AstNode.");return new Mc(t,r=>tx(r,e),{includeRoot:!0})}function DN(t,e){var r;if(!e)return!0;let n=(r=t.$cstNode)===null||r===void 0?void 0:r.range;return n?cN(n,e):!1}function Pg(t){return new co(()=>({keys:Object.keys(t),keyIndex:0,arrayIndex:0}),e=>{for(;e.keyIndex{Pg(n).forEach(i=>{i.reference.ref===t&&r.push(i.reference)})}),en(r)}function RN(t,e){let r=t.getTypeMetaData(e.$type),n=e;for(let i of r.properties)i.defaultValue!==void 0&&n[i.name]===void 0&&(n[i.name]=Lse(i.defaultValue))}function Lse(t){return Array.isArray(t)?[...t.map(Lse)]:t}function LN(t,e){let r={$type:t.$type};for(let[n,i]of Object.entries(t))if(!n.startsWith("$"))if(si(i))r[n]=LN(i,e);else if(ya(i))r[n]=e(r,n,i.$refNode,i.$refText);else if(Array.isArray(i)){let a=[];for(let s of i)si(s)?a.push(LN(s,e)):ya(s)?a.push(e(r,n,s.$refNode,s.$refText)):a.push(s);r[n]=a}else r[n]=i;return Mk(r),r}var cs=N(()=>{"use strict";Il();Gs();Ol();o(Mk,"linkContentToContainer");o(hp,"getContainerOfType");o(ABe,"hasContainerOfType");o($a,"getDocument");o(ex,"findRootNode");o(tx,"streamContents");o(Bc,"streamAllContents");o(jo,"streamAst");o(DN,"isAstNodeInRange");o(Pg,"streamReferences");o(_Be,"findLocalReferences");o(RN,"assignMandatoryProperties");o(Lse,"copyDefaultValue");o(LN,"copyAstNode")});function sr(t){return t.charCodeAt(0)}function Ok(t,e){Array.isArray(t)?t.forEach(function(r){e.push(r)}):e.push(t)}function Bg(t,e){if(t[e]===!0)throw"duplicate flag "+e;let r=t[e];t[e]=!0}function fp(t){if(t===void 0)throw Error("Internal Error - Should never get here!");return!0}function rx(){throw Error("Internal Error - Should never get here!")}function NN(t){return t.type==="Character"}var MN=N(()=>{"use strict";o(sr,"cc");o(Ok,"insertToSet");o(Bg,"addFlag");o(fp,"ASSERT_EXISTS");o(rx,"ASSERT_NEVER_REACH_HERE");o(NN,"isCharacter")});var nx,ix,IN,Rse=N(()=>{"use strict";MN();nx=[];for(let t=sr("0");t<=sr("9");t++)nx.push(t);ix=[sr("_")].concat(nx);for(let t=sr("a");t<=sr("z");t++)ix.push(t);for(let t=sr("A");t<=sr("Z");t++)ix.push(t);IN=[sr(" "),sr("\f"),sr(` -`),sr("\r"),sr(" "),sr("\v"),sr(" "),sr("\xA0"),sr("\u1680"),sr("\u2000"),sr("\u2001"),sr("\u2002"),sr("\u2003"),sr("\u2004"),sr("\u2005"),sr("\u2006"),sr("\u2007"),sr("\u2008"),sr("\u2009"),sr("\u200A"),sr("\u2028"),sr("\u2029"),sr("\u202F"),sr("\u205F"),sr("\u3000"),sr("\uFEFF")]});var DBe,Pk,LBe,dp,Nse=N(()=>{"use strict";MN();Rse();DBe=/[0-9a-fA-F]/,Pk=/[0-9]/,LBe=/[1-9]/,dp=class{static{o(this,"RegExpParser")}constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");let r=this.disjunction();this.consumeChar("/");let n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":Bg(n,"global");break;case"i":Bg(n,"ignoreCase");break;case"m":Bg(n,"multiLine");break;case"u":Bg(n,"unicode");break;case"y":Bg(n,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:r,loc:this.loc(0)}}disjunction(){let e=[],r=this.idx;for(e.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(r)}}alternative(){let e=[],r=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(r)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){let e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");let r;switch(this.popChar()){case"=":r="Lookahead";break;case"!":r="NegativeLookahead";break}fp(r);let n=this.disjunction();return this.consumeChar(")"),{type:r,value:n,loc:this.loc(e)}}return rx()}quantifier(e=!1){let r,n=this.idx;switch(this.popChar()){case"*":r={atLeast:0,atMost:1/0};break;case"+":r={atLeast:1,atMost:1/0};break;case"?":r={atLeast:0,atMost:1};break;case"{":let i=this.integerIncludingZero();switch(this.popChar()){case"}":r={atLeast:i,atMost:i};break;case",":let a;this.isDigit()?(a=this.integerIncludingZero(),r={atLeast:i,atMost:a}):r={atLeast:i,atMost:1/0},this.consumeChar("}");break}if(e===!0&&r===void 0)return;fp(r);break}if(!(e===!0&&r===void 0)&&fp(r))return this.peekChar(0)==="?"?(this.consumeChar("?"),r.greedy=!1):r.greedy=!0,r.type="Quantifier",r.loc=this.loc(n),r}atom(){let e,r=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group();break}return e===void 0&&this.isPatternCharacter()&&(e=this.patternCharacter()),fp(e)?(e.loc=this.loc(r),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):rx()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[sr(` -`),sr("\r"),sr("\u2028"),sr("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,r=!1;switch(this.popChar()){case"d":e=nx;break;case"D":e=nx,r=!0;break;case"s":e=IN;break;case"S":e=IN,r=!0;break;case"w":e=ix;break;case"W":e=ix,r=!0;break}return fp(e)?{type:"Set",value:e,complement:r}:rx()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=sr("\f");break;case"n":e=sr(` -`);break;case"r":e=sr("\r");break;case"t":e=sr(" ");break;case"v":e=sr("\v");break}return fp(e)?{type:"Character",value:e}:rx()}controlLetterEscapeAtom(){this.consumeChar("c");let e=this.popChar();if(/[a-zA-Z]/.test(e)===!1)throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:sr("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){let e=this.popChar();return{type:"Character",value:sr(e)}}classPatternCharacterAtom(){switch(this.peekChar()){case` -`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:let e=this.popChar();return{type:"Character",value:sr(e)}}}characterClass(){let e=[],r=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),r=!0);this.isClassAtom();){let n=this.classAtom(),i=n.type==="Character";if(NN(n)&&this.isRangeDash()){this.consumeChar("-");let a=this.classAtom(),s=a.type==="Character";if(NN(a)){if(a.value=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}});var Fc,Mse=N(()=>{"use strict";Fc=class{static{o(this,"BaseRegExpVisitor")}visitChildren(e){for(let r in e){let n=e[r];e.hasOwnProperty(r)&&(n.type!==void 0?this.visit(n):Array.isArray(n)&&n.forEach(i=>{this.visit(i)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e);break}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}});var ax=N(()=>{"use strict";Nse();Mse()});var Bk={};ur(Bk,{NEWLINE_REGEXP:()=>PN,escapeRegExp:()=>mp,getCaseInsensitivePattern:()=>FN,getTerminalParts:()=>RBe,isMultilineComment:()=>BN,isWhitespace:()=>Fg,partialMatches:()=>$N,partialRegExp:()=>Pse,whitespaceCharacters:()=>Ose});function RBe(t){try{typeof t!="string"&&(t=t.source),t=`/${t}/`;let e=Ise.pattern(t),r=[];for(let n of e.value.value)pp.reset(t),pp.visit(n),r.push({start:pp.startRegexp,end:pp.endRegex});return r}catch{return[]}}function BN(t){try{return typeof t=="string"&&(t=new RegExp(t)),t=t.toString(),pp.reset(t),pp.visit(Ise.pattern(t)),pp.multiline}catch{return!1}}function Fg(t){let e=typeof t=="string"?new RegExp(t):t;return Ose.some(r=>e.test(r))}function mp(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function FN(t){return Array.prototype.map.call(t,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:mp(e)).join("")}function $N(t,e){let r=Pse(t),n=e.match(r);return!!n&&n[0].length>0}function Pse(t){typeof t=="string"&&(t=new RegExp(t));let e=t,r=t.source,n=0;function i(){let a="",s;function l(h){a+=r.substr(n,h),n+=h}o(l,"appendRaw");function u(h){a+="(?:"+r.substr(n,h)+"|$)",n+=h}for(o(u,"appendOptional");n",n)-n+1);break;default:u(2);break}break;case"[":s=/\[(?:\\.|.)*?\]/g,s.lastIndex=n,s=s.exec(r)||[],u(s[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":l(1);break;case"{":s=/\{\d+,?\d*\}/g,s.lastIndex=n,s=s.exec(r),s?l(s[0].length):u(1);break;case"(":if(r[n+1]==="?")switch(r[n+2]){case":":a+="(?:",n+=3,a+=i()+"|$)";break;case"=":a+="(?=",n+=3,a+=i()+")";break;case"!":s=n,n+=3,i(),a+=r.substr(s,n-s);break;case"<":switch(r[n+3]){case"=":case"!":s=n,n+=4,i(),a+=r.substr(s,n-s);break;default:l(r.indexOf(">",n)-n+1),a+=i()+"|$)";break}break}else l(1),a+=i()+"|$)";break;case")":return++n,a;default:u(1);break}return a}return o(i,"process"),new RegExp(i(),t.flags)}var PN,Ise,ON,pp,Ose,$g=N(()=>{"use strict";ax();PN=/\r?\n/gm,Ise=new dp,ON=class extends Fc{static{o(this,"TerminalRegExpVisitor")}constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){let r=String.fromCharCode(e.value);if(!this.multiline&&r===` -`&&(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let n=mp(r);this.endRegexpStack.push(n),this.isStarting&&(this.startRegexp+=n)}}visitSet(e){if(!this.multiline){let r=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(r);this.multiline=!!` -`.match(n)}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{let r=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(r),this.isStarting&&(this.startRegexp+=r)}}visitChildren(e){e.type==="Group"&&e.quantifier||super.visitChildren(e)}},pp=new ON;o(RBe,"getTerminalParts");o(BN,"isMultilineComment");Ose=`\f -\r \v \xA0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF`.split("");o(Fg,"isWhitespace");o(mp,"escapeRegExp");o(FN,"getCaseInsensitivePattern");o($N,"partialMatches");o(Pse,"partialRegExp")});var $k={};ur($k,{findAssignment:()=>XN,findNameAssignment:()=>Fk,findNodeForKeyword:()=>qN,findNodeForProperty:()=>ox,findNodesForKeyword:()=>NBe,findNodesForKeywordInternal:()=>YN,findNodesForProperty:()=>HN,getActionAtElement:()=>Gse,getActionType:()=>Use,getAllReachableRules:()=>sx,getCrossReferenceTerminal:()=>VN,getEntryRule:()=>Bse,getExplicitRuleType:()=>zg,getHiddenRules:()=>Fse,getRuleType:()=>jN,getRuleTypeName:()=>BBe,getTypeName:()=>cx,isArrayCardinality:()=>IBe,isArrayOperator:()=>OBe,isCommentTerminal:()=>UN,isDataType:()=>PBe,isDataTypeRule:()=>lx,isOptionalCardinality:()=>MBe,terminalRegex:()=>Gg});function Bse(t){return t.rules.find(e=>Fa(e)&&e.entry)}function Fse(t){return t.rules.filter(e=>uo(e)&&e.hidden)}function sx(t,e){let r=new Set,n=Bse(t);if(!n)return new Set(t.rules);let i=[n].concat(Fse(t));for(let s of i)$se(s,r,e);let a=new Set;for(let s of t.rules)(r.has(s.name)||uo(s)&&s.hidden)&&a.add(s);return a}function $se(t,e,r){e.add(t.name),Bc(t).forEach(n=>{if(Bl(n)||r&&Rk(n)){let i=n.rule.ref;i&&!e.has(i.name)&&$se(i,e,r)}})}function VN(t){if(t.terminal)return t.terminal;if(t.type.ref){let e=Fk(t.type.ref);return e?.terminal}}function UN(t){return t.hidden&&!Fg(Gg(t))}function HN(t,e){return!t||!e?[]:WN(t,e,t.astNode,!0)}function ox(t,e,r){if(!t||!e)return;let n=WN(t,e,t.astNode,!0);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function WN(t,e,r,n){if(!n){let i=hp(t.grammarSource,Pl);if(i&&i.feature===e)return[t]}return Ml(t)&&t.astNode===r?t.content.flatMap(i=>WN(i,e,r,!1)):[]}function NBe(t,e){return t?YN(t,e,t?.astNode):[]}function qN(t,e,r){if(!t)return;let n=YN(t,e,t?.astNode);if(n.length!==0)return r!==void 0?r=Math.max(0,Math.min(r,n.length-1)):r=0,n[r]}function YN(t,e,r){if(t.astNode!==r)return[];if(Xo(t.grammarSource)&&t.grammarSource.value===e)return[t];let n=sp(t).iterator(),i,a=[];do if(i=n.next(),!i.done){let s=i.value;s.astNode===r?Xo(s.grammarSource)&&s.grammarSource.value===e&&a.push(s):n.prune()}while(!i.done);return a}function XN(t){var e;let r=t.astNode;for(;r===((e=t.container)===null||e===void 0?void 0:e.astNode);){let n=hp(t.grammarSource,Pl);if(n)return n;t=t.container}}function Fk(t){let e=t;return Ak(e)&&($u(e.$container)?e=e.$container.$container:Fa(e.$container)?e=e.$container:Oc(e.$container)),zse(t,e,new Map)}function zse(t,e,r){var n;function i(a,s){let l;return hp(a,Pl)||(l=zse(s,s,r)),r.set(t,l),l}if(o(i,"go"),r.has(t))return r.get(t);r.set(t,void 0);for(let a of Bc(e)){if(Pl(a)&&a.feature.toLowerCase()==="name")return r.set(t,a),a;if(Bl(a)&&Fa(a.rule.ref))return i(a,a.rule.ref);if(Dk(a)&&(!((n=a.typeRef)===null||n===void 0)&&n.ref))return i(a,a.typeRef.ref)}}function Gse(t){let e=t.$container;if(ff(e)){let r=e.elements,n=r.indexOf(t);for(let i=n-1;i>=0;i--){let a=r[i];if($u(a))return a;{let s=Bc(r[i]).find($u);if(s)return s}}}if(Q2(e))return Gse(e)}function MBe(t,e){return t==="?"||t==="*"||ff(e)&&!!e.guardCondition}function IBe(t){return t==="*"||t==="+"}function OBe(t){return t==="+="}function lx(t){return Vse(t,new Set)}function Vse(t,e){if(e.has(t))return!0;e.add(t);for(let r of Bc(t))if(Bl(r)){if(!r.rule.ref||Fa(r.rule.ref)&&!Vse(r.rule.ref,e))return!1}else{if(Pl(r))return!1;if($u(r))return!1}return!!t.definition}function PBe(t){return GN(t.type,new Set)}function GN(t,e){if(e.has(t))return!0;if(e.add(t),fN(t))return!1;if(vN(t))return!1;if(bN(t))return t.types.every(r=>GN(r,e));if(Dk(t)){if(t.primitiveType!==void 0)return!0;if(t.stringType!==void 0)return!0;if(t.typeRef!==void 0){let r=t.typeRef.ref;return Z2(r)?GN(r.type,e):!1}else return!1}else return!1}function zg(t){if(t.inferredType)return t.inferredType.name;if(t.dataType)return t.dataType;if(t.returnType){let e=t.returnType.ref;if(e){if(Fa(e))return e.name;if(_k(e)||Z2(e))return e.name}}}function cx(t){var e;if(Fa(t))return lx(t)?t.name:(e=zg(t))!==null&&e!==void 0?e:t.name;if(_k(t)||Z2(t)||xN(t))return t.name;if($u(t)){let r=Use(t);if(r)return r}else if(Ak(t))return t.name;throw new Error("Cannot get name of Unknown Type")}function Use(t){var e;if(t.inferredType)return t.inferredType.name;if(!((e=t.type)===null||e===void 0)&&e.ref)return cx(t.type.ref)}function BBe(t){var e,r,n;return uo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":lx(t)?t.name:(n=zg(t))!==null&&n!==void 0?n:t.name}function jN(t){var e,r,n;return uo(t)?(r=(e=t.type)===null||e===void 0?void 0:e.name)!==null&&r!==void 0?r:"string":(n=zg(t))!==null&&n!==void 0?n:t.name}function Gg(t){let e={s:!1,i:!1,u:!1},r=Vg(t.definition,e),n=Object.entries(e).filter(([,i])=>i).map(([i])=>i).join("");return new RegExp(r,n)}function Vg(t,e){if(SN(t))return FBe(t);if(CN(t))return $Be(t);if(TN(t))return VBe(t);if(Rk(t)){let r=t.rule.ref;if(!r)throw new Error("Missing rule reference.");return zu(Vg(r.definition),{cardinality:t.cardinality,lookahead:t.lookahead})}else{if(kN(t))return GBe(t);if(AN(t))return zBe(t);if(EN(t)){let r=t.regex.lastIndexOf("/"),n=t.regex.substring(1,r),i=t.regex.substring(r+1);return e&&(e.i=i.includes("i"),e.s=i.includes("s"),e.u=i.includes("u")),zu(n,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}else{if(_N(t))return zu(KN,{cardinality:t.cardinality,lookahead:t.lookahead});throw new Error(`Invalid terminal element: ${t?.$type}`)}}}function FBe(t){return zu(t.elements.map(e=>Vg(e)).join("|"),{cardinality:t.cardinality,lookahead:t.lookahead})}function $Be(t){return zu(t.elements.map(e=>Vg(e)).join(""),{cardinality:t.cardinality,lookahead:t.lookahead})}function zBe(t){return zu(`${KN}*?${Vg(t.terminal)}`,{cardinality:t.cardinality,lookahead:t.lookahead})}function GBe(t){return zu(`(?!${Vg(t.terminal)})${KN}*?`,{cardinality:t.cardinality,lookahead:t.lookahead})}function VBe(t){return t.right?zu(`[${zN(t.left)}-${zN(t.right)}]`,{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1}):zu(zN(t.left),{cardinality:t.cardinality,lookahead:t.lookahead,wrap:!1})}function zN(t){return mp(t.value)}function zu(t,e){var r;return(e.wrap!==!1||e.lookahead)&&(t=`(${(r=e.lookahead)!==null&&r!==void 0?r:""}${t})`),e.cardinality?`${t}${e.cardinality}`:t}var KN,Fl=N(()=>{"use strict";Sk();Pc();Il();cs();Ol();$g();o(Bse,"getEntryRule");o(Fse,"getHiddenRules");o(sx,"getAllReachableRules");o($se,"ruleDfs");o(VN,"getCrossReferenceTerminal");o(UN,"isCommentTerminal");o(HN,"findNodesForProperty");o(ox,"findNodeForProperty");o(WN,"findNodesForPropertyInternal");o(NBe,"findNodesForKeyword");o(qN,"findNodeForKeyword");o(YN,"findNodesForKeywordInternal");o(XN,"findAssignment");o(Fk,"findNameAssignment");o(zse,"findNameAssignmentInternal");o(Gse,"getActionAtElement");o(MBe,"isOptionalCardinality");o(IBe,"isArrayCardinality");o(OBe,"isArrayOperator");o(lx,"isDataTypeRule");o(Vse,"isDataTypeRuleInternal");o(PBe,"isDataType");o(GN,"isDataTypeInternal");o(zg,"getExplicitRuleType");o(cx,"getTypeName");o(Use,"getActionType");o(BBe,"getRuleTypeName");o(jN,"getRuleType");o(Gg,"terminalRegex");KN=/[\s\S]/.source;o(Vg,"abstractElementToRegex");o(FBe,"terminalAlternativesToRegex");o($Be,"terminalGroupToRegex");o(zBe,"untilTokenToRegex");o(GBe,"negateTokenToRegex");o(VBe,"characterRangeToRegex");o(zN,"keywordToRegex");o(zu,"withCardinality")});function QN(t){let e=[],r=t.Grammar;for(let n of r.rules)uo(n)&&UN(n)&&BN(Gg(n))&&e.push(n.name);return{multilineCommentRules:e,nameRegexp:kk}}var ZN=N(()=>{"use strict";Ol();Fl();$g();Pc();o(QN,"createGrammarConfig")});var JN=N(()=>{"use strict"});function Ug(t){console&&console.error&&console.error(`Error: ${t}`)}function ux(t){console&&console.warn&&console.warn(`Warning: ${t}`)}var Hse=N(()=>{"use strict";o(Ug,"PRINT_ERROR");o(ux,"PRINT_WARNING")});function hx(t){let e=new Date().getTime(),r=t();return{time:new Date().getTime()-e,value:r}}var Wse=N(()=>{"use strict";o(hx,"timer")});function fx(t){function e(){}o(e,"FakeConstructor"),e.prototype=t;let r=new e;function n(){return typeof r.bar}return o(n,"fakeAccess"),n(),n(),t;(0,eval)(t)}var qse=N(()=>{"use strict";o(fx,"toFastProperties")});var Hg=N(()=>{"use strict";Hse();Wse();qse()});function UBe(t){return HBe(t)?t.LABEL:t.name}function HBe(t){return Ti(t.LABEL)&&t.LABEL!==""}function zk(t){return Je(t,Wg)}function Wg(t){function e(r){return Je(r,Wg)}if(o(e,"convertDefinition"),t instanceof on){let r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return Ti(t.label)&&(r.label=t.label),r}else{if(t instanceof Dn)return{type:"Alternative",definition:e(t.definition)};if(t instanceof ln)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof Ln)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof Rn)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Wg(new Er({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Tn)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Wg(new Er({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Pr)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof wn)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof Er){let r={type:"Terminal",name:t.terminalType.name,label:UBe(t.terminalType),idx:t.idx};Ti(t.label)&&(r.terminalLabel=t.label);let n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=Uo(n)?n.source:n),r}else{if(t instanceof us)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}var ho,on,us,Dn,ln,Ln,Rn,Pr,Tn,wn,Er,Gk=N(()=>{"use strict";qt();o(UBe,"tokenLabel");o(HBe,"hasTokenLabel");ho=class{static{o(this,"AbstractProduction")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),Ae(this.definition,r=>{r.accept(e)})}},on=class extends ho{static{o(this,"NonTerminal")}constructor(e){super([]),this.idx=1,pa(this,zs(e,r=>r!==void 0))}set definition(e){}get definition(){return this.referencedRule!==void 0?this.referencedRule.definition:[]}accept(e){e.visit(this)}},us=class extends ho{static{o(this,"Rule")}constructor(e){super(e.definition),this.orgText="",pa(this,zs(e,r=>r!==void 0))}},Dn=class extends ho{static{o(this,"Alternative")}constructor(e){super(e.definition),this.ignoreAmbiguities=!1,pa(this,zs(e,r=>r!==void 0))}},ln=class extends ho{static{o(this,"Option")}constructor(e){super(e.definition),this.idx=1,pa(this,zs(e,r=>r!==void 0))}},Ln=class extends ho{static{o(this,"RepetitionMandatory")}constructor(e){super(e.definition),this.idx=1,pa(this,zs(e,r=>r!==void 0))}},Rn=class extends ho{static{o(this,"RepetitionMandatoryWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,zs(e,r=>r!==void 0))}},Pr=class extends ho{static{o(this,"Repetition")}constructor(e){super(e.definition),this.idx=1,pa(this,zs(e,r=>r!==void 0))}},Tn=class extends ho{static{o(this,"RepetitionWithSeparator")}constructor(e){super(e.definition),this.idx=1,pa(this,zs(e,r=>r!==void 0))}},wn=class extends ho{static{o(this,"Alternation")}get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,pa(this,zs(e,r=>r!==void 0))}},Er=class{static{o(this,"Terminal")}constructor(e){this.idx=1,pa(this,zs(e,r=>r!==void 0))}accept(e){e.visit(this)}};o(zk,"serializeGrammar");o(Wg,"serializeProduction")});var hs,Yse=N(()=>{"use strict";Gk();hs=class{static{o(this,"GAstVisitor")}visit(e){let r=e;switch(r.constructor){case on:return this.visitNonTerminal(r);case Dn:return this.visitAlternative(r);case ln:return this.visitOption(r);case Ln:return this.visitRepetitionMandatory(r);case Rn:return this.visitRepetitionMandatoryWithSeparator(r);case Tn:return this.visitRepetitionWithSeparator(r);case Pr:return this.visitRepetition(r);case wn:return this.visitAlternation(r);case Er:return this.visitTerminal(r);case us:return this.visitRule(r);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}});function eM(t){return t instanceof Dn||t instanceof ln||t instanceof Pr||t instanceof Ln||t instanceof Rn||t instanceof Tn||t instanceof Er||t instanceof us}function gp(t,e=[]){return t instanceof ln||t instanceof Pr||t instanceof Tn?!0:t instanceof wn?B2(t.definition,n=>gp(n,e)):t instanceof on&&Xn(e,t)?!1:t instanceof ho?(t instanceof on&&e.push(t),Pa(t.definition,n=>gp(n,e))):!1}function tM(t){return t instanceof wn}function Vs(t){if(t instanceof on)return"SUBRULE";if(t instanceof ln)return"OPTION";if(t instanceof wn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Rn)return"AT_LEAST_ONE_SEP";if(t instanceof Tn)return"MANY_SEP";if(t instanceof Pr)return"MANY";if(t instanceof Er)return"CONSUME";throw Error("non exhaustive match")}var Xse=N(()=>{"use strict";qt();Gk();o(eM,"isSequenceProd");o(gp,"isOptionalProd");o(tM,"isBranchingProd");o(Vs,"getProductionDslName")});var fs=N(()=>{"use strict";Gk();Yse();Xse()});function jse(t,e,r){return[new ln({definition:[new Er({terminalType:t.separator})].concat(t.definition)})].concat(e,r)}var Gu,Vk=N(()=>{"use strict";qt();fs();Gu=class{static{o(this,"RestWalker")}walk(e,r=[]){Ae(e.definition,(n,i)=>{let a=bi(e.definition,i+1);if(n instanceof on)this.walkProdRef(n,a,r);else if(n instanceof Er)this.walkTerminal(n,a,r);else if(n instanceof Dn)this.walkFlat(n,a,r);else if(n instanceof ln)this.walkOption(n,a,r);else if(n instanceof Ln)this.walkAtLeastOne(n,a,r);else if(n instanceof Rn)this.walkAtLeastOneSep(n,a,r);else if(n instanceof Tn)this.walkManySep(n,a,r);else if(n instanceof Pr)this.walkMany(n,a,r);else if(n instanceof wn)this.walkOr(n,a,r);else throw Error("non exhaustive match")})}walkTerminal(e,r,n){}walkProdRef(e,r,n){}walkFlat(e,r,n){let i=r.concat(n);this.walk(e,i)}walkOption(e,r,n){let i=r.concat(n);this.walk(e,i)}walkAtLeastOne(e,r,n){let i=[new ln({definition:e.definition})].concat(r,n);this.walk(e,i)}walkAtLeastOneSep(e,r,n){let i=jse(e,r,n);this.walk(e,i)}walkMany(e,r,n){let i=[new ln({definition:e.definition})].concat(r,n);this.walk(e,i)}walkManySep(e,r,n){let i=jse(e,r,n);this.walk(e,i)}walkOr(e,r,n){let i=r.concat(n);Ae(e.definition,a=>{let s=new Dn({definition:[a]});this.walk(s,i)})}};o(jse,"restForRepetitionWithSeparator")});function yp(t){if(t instanceof on)return yp(t.referencedRule);if(t instanceof Er)return YBe(t);if(eM(t))return WBe(t);if(tM(t))return qBe(t);throw Error("non exhaustive match")}function WBe(t){let e=[],r=t.definition,n=0,i=r.length>n,a,s=!0;for(;i&&s;)a=r[n],s=gp(a),e=e.concat(yp(a)),n=n+1,i=r.length>n;return qm(e)}function qBe(t){let e=Je(t.definition,r=>yp(r));return qm(qr(e))}function YBe(t){return[t.terminalType]}var rM=N(()=>{"use strict";qt();fs();o(yp,"first");o(WBe,"firstForSequence");o(qBe,"firstForBranching");o(YBe,"firstForTerminal")});var Uk,nM=N(()=>{"use strict";Uk="_~IN~_"});function Kse(t){let e={};return Ae(t,r=>{let n=new iM(r).startWalking();pa(e,n)}),e}function XBe(t,e){return t.name+e+Uk}var iM,Qse=N(()=>{"use strict";Vk();rM();qt();nM();fs();iM=class extends Gu{static{o(this,"ResyncFollowsWalker")}constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,r,n){}walkProdRef(e,r,n){let i=XBe(e.referencedRule,e.idx)+this.topProd.name,a=r.concat(n),s=new Dn({definition:a}),l=yp(s);this.follows[i]=l}};o(Kse,"computeAllProdsFollows");o(XBe,"buildBetweenProdsFollowPrefix")});function qg(t){let e=t.toString();if(Hk.hasOwnProperty(e))return Hk[e];{let r=jBe.pattern(e);return Hk[e]=r,r}}function Zse(){Hk={}}var Hk,jBe,Wk=N(()=>{"use strict";ax();Hk={},jBe=new dp;o(qg,"getRegExpAst");o(Zse,"clearRegExpParserCache")});function toe(t,e=!1){try{let r=qg(t);return aM(r.value,{},r.flags.ignoreCase)}catch(r){if(r.message===eoe)e&&ux(`${dx} Unable to optimize: < ${t.toString()} > - Complement Sets cannot be automatically optimized. - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";e&&(n=` - This will disable the lexer's first char optimizations. - See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),Ug(`${dx} - Failed parsing: < ${t.toString()} > - Using the @chevrotain/regexp-to-ast library - Please open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function aM(t,e,r){switch(t.type){case"Disjunction":for(let i=0;i{if(typeof u=="number")qk(u,e,r);else{let h=u;if(r===!0)for(let f=h.from;f<=h.to;f++)qk(f,e,r);else{for(let f=h.from;f<=h.to&&f=Yg){let f=h.from>=Yg?h.from:Yg,d=h.to,p=$c(f),m=$c(d);for(let g=p;g<=m;g++)e[g]=g}}}});break;case"Group":aM(s.value,e,r);break;default:throw Error("Non Exhaustive Match")}let l=s.quantifier!==void 0&&s.quantifier.atLeast===0;if(s.type==="Group"&&sM(s)===!1||s.type!=="Group"&&l===!1)break}break;default:throw Error("non exhaustive match!")}return br(e)}function qk(t,e,r){let n=$c(t);e[n]=n,r===!0&&KBe(t,e)}function KBe(t,e){let r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){let i=$c(n.charCodeAt(0));e[i]=i}else{let i=r.toLowerCase();if(i!==r){let a=$c(i.charCodeAt(0));e[a]=a}}}function Jse(t,e){return ls(t.value,r=>{if(typeof r=="number")return Xn(e,r);{let n=r;return ls(e,i=>n.from<=i&&i<=n.to)!==void 0}})}function sM(t){let e=t.quantifier;return e&&e.atLeast===0?!0:t.value?Pt(t.value)?Pa(t.value,sM):sM(t.value):!1}function Yk(t,e){if(e instanceof RegExp){let r=qg(e),n=new oM(t);return n.visit(r),n.found}else return ls(e,r=>Xn(t,r.charCodeAt(0)))!==void 0}var eoe,dx,oM,roe=N(()=>{"use strict";ax();qt();Hg();Wk();lM();eoe="Complement Sets are not supported for first char optimization",dx=`Unable to use "first char" lexer optimizations: -`;o(toe,"getOptimizedStartCodesIndices");o(aM,"firstCharOptimizedIndices");o(qk,"addOptimizedIdxToResult");o(KBe,"handleIgnoreCase");o(Jse,"findCode");o(sM,"isWholeOptional");oM=class extends Fc{static{o(this,"CharCodeFinder")}constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(this.found!==!0){switch(e.type){case"Lookahead":this.visitLookahead(e);return;case"NegativeLookahead":this.visitNegativeLookahead(e);return}super.visitChildren(e)}}visitCharacter(e){Xn(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?Jse(e,this.targetCharCodes)===void 0&&(this.found=!0):Jse(e,this.targetCharCodes)!==void 0&&(this.found=!0)}};o(Yk,"canMatchCharCode")});function aoe(t,e){e=nf(e,{useSticky:uM,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` -`],tracer:o((b,T)=>T(),"tracer")});let r=e.tracer;r("initCharCodeToOptimizedIndexMap",()=>{pFe()});let n;r("Reject Lexer.NA",()=>{n=sf(t,b=>b[vp]===Kn.NA)});let i=!1,a;r("Transform Patterns",()=>{i=!1,a=Je(n,b=>{let T=b[vp];if(Uo(T)){let S=T.source;return S.length===1&&S!=="^"&&S!=="$"&&S!=="."&&!T.ignoreCase?S:S.length===2&&S[0]==="\\"&&!Xn(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],S[1])?S[1]:e.useSticky?ioe(T):noe(T)}else{if(Ai(T))return i=!0,{exec:T};if(typeof T=="object")return i=!0,T;if(typeof T=="string"){if(T.length===1)return T;{let S=T.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),w=new RegExp(S);return e.useSticky?ioe(w):noe(w)}}else throw Error("non exhaustive match")}})});let s,l,u,h,f;r("misc mapping",()=>{s=Je(n,b=>b.tokenTypeIdx),l=Je(n,b=>{let T=b.GROUP;if(T!==Kn.SKIPPED){if(Ti(T))return T;if(mr(T))return!1;throw Error("non exhaustive match")}}),u=Je(n,b=>{let T=b.LONGER_ALT;if(T)return Pt(T)?Je(T,w=>ik(n,w)):[ik(n,T)]}),h=Je(n,b=>b.PUSH_MODE),f=Je(n,b=>Bt(b,"POP_MODE"))});let d;r("Line Terminator Handling",()=>{let b=doe(e.lineTerminatorCharacters);d=Je(n,T=>!1),e.positionTracking!=="onlyOffset"&&(d=Je(n,T=>Bt(T,"LINE_BREAKS")?!!T.LINE_BREAKS:foe(T,b)===!1&&Yk(b,T.PATTERN)))});let p,m,g,y;r("Misc Mapping #2",()=>{p=Je(n,uoe),m=Je(a,fFe),g=Xr(n,(b,T)=>{let S=T.GROUP;return Ti(S)&&S!==Kn.SKIPPED&&(b[S]=[]),b},{}),y=Je(a,(b,T)=>({pattern:a[T],longerAlt:u[T],canLineTerminator:d[T],isCustom:p[T],short:m[T],group:l[T],push:h[T],pop:f[T],tokenTypeIdx:s[T],tokenType:n[T]}))});let v=!0,x=[];return e.safeMode||r("First Char Optimization",()=>{x=Xr(n,(b,T,S)=>{if(typeof T.PATTERN=="string"){let w=T.PATTERN.charCodeAt(0),E=$c(w);cM(b,E,y[S])}else if(Pt(T.START_CHARS_HINT)){let w;Ae(T.START_CHARS_HINT,E=>{let _=typeof E=="string"?E.charCodeAt(0):E,C=$c(_);w!==C&&(w=C,cM(b,C,y[S]))})}else if(Uo(T.PATTERN))if(T.PATTERN.unicode)v=!1,e.ensureOptimizations&&Ug(`${dx} Unable to analyze < ${T.PATTERN.toString()} > pattern. - The regexp unicode flag is not currently supported by the regexp-to-ast library. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{let w=toe(T.PATTERN,e.ensureOptimizations);hr(w)&&(v=!1),Ae(w,E=>{cM(b,E,y[S])})}else e.ensureOptimizations&&Ug(`${dx} TokenType: <${T.name}> is using a custom token pattern without providing parameter. - This will disable the lexer's first char optimizations. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),v=!1;return b},[])}),{emptyGroups:g,patternIdxToConfig:y,charCodeToPatternIdxToConfig:x,hasCustom:i,canBeOptimized:v}}function soe(t,e){let r=[],n=ZBe(t);r=r.concat(n.errors);let i=JBe(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(QBe(a)),r=r.concat(oFe(a)),r=r.concat(lFe(a,e)),r=r.concat(cFe(a)),r}function QBe(t){let e=[],r=Yr(t,n=>Uo(n[vp]));return e=e.concat(tFe(r)),e=e.concat(iFe(r)),e=e.concat(aFe(r)),e=e.concat(sFe(r)),e=e.concat(rFe(r)),e}function ZBe(t){let e=Yr(t,i=>!Bt(i,vp)),r=Je(e,i=>({message:"Token Type: ->"+i.name+"<- missing static 'PATTERN' property",type:jn.MISSING_PATTERN,tokenTypes:[i]})),n=af(t,e);return{errors:r,valid:n}}function JBe(t){let e=Yr(t,i=>{let a=i[vp];return!Uo(a)&&!Ai(a)&&!Bt(a,"exec")&&!Ti(a)}),r=Je(e,i=>({message:"Token Type: ->"+i.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:jn.INVALID_PATTERN,tokenTypes:[i]})),n=af(t,e);return{errors:r,valid:n}}function tFe(t){class e extends Fc{static{o(this,"EndAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitEndAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=qg(a),l=new e;return l.visit(s),l.found}catch{return eFe.test(a.source)}});return Je(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$' - See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:jn.EOI_ANCHOR_FOUND,tokenTypes:[i]}))}function rFe(t){let e=Yr(t,n=>n.PATTERN.test(""));return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' must not match an empty string",type:jn.EMPTY_MATCH_PATTERN,tokenTypes:[n]}))}function iFe(t){class e extends Fc{static{o(this,"StartAnchorFinder")}constructor(){super(...arguments),this.found=!1}visitStartAnchor(a){this.found=!0}}let r=Yr(t,i=>{let a=i.PATTERN;try{let s=qg(a),l=new e;return l.visit(s),l.found}catch{return nFe.test(a.source)}});return Je(r,i=>({message:`Unexpected RegExp Anchor Error: - Token Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^' - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:jn.SOI_ANCHOR_FOUND,tokenTypes:[i]}))}function aFe(t){let e=Yr(t,n=>{let i=n[vp];return i instanceof RegExp&&(i.multiline||i.global)});return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:jn.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}))}function sFe(t){let e=[],r=Je(t,a=>Xr(t,(s,l)=>(a.PATTERN.source===l.PATTERN.source&&!Xn(e,l)&&l.PATTERN!==Kn.NA&&(e.push(l),s.push(l)),s),[]));r=Ac(r);let n=Yr(r,a=>a.length>1);return Je(n,a=>{let s=Je(a,u=>u.name);return{message:`The same RegExp pattern ->${ia(a).PATTERN}<-has been used in all of the following Token Types: ${s.join(", ")} <-`,type:jn.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}})}function oFe(t){let e=Yr(t,n=>{if(!Bt(n,"GROUP"))return!1;let i=n.GROUP;return i!==Kn.SKIPPED&&i!==Kn.NA&&!Ti(i)});return Je(e,n=>({message:"Token Type: ->"+n.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:jn.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}))}function lFe(t,e){let r=Yr(t,i=>i.PUSH_MODE!==void 0&&!Xn(e,i.PUSH_MODE));return Je(r,i=>({message:`Token Type: ->${i.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${i.PUSH_MODE}<-which does not exist`,type:jn.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}))}function cFe(t){let e=[],r=Xr(t,(n,i,a)=>{let s=i.PATTERN;return s===Kn.NA||(Ti(s)?n.push({str:s,idx:a,tokenType:i}):Uo(s)&&hFe(s)&&n.push({str:s.source,idx:a,tokenType:i})),n},[]);return Ae(t,(n,i)=>{Ae(r,({str:a,idx:s,tokenType:l})=>{if(i${l.name}<- can never be matched. -Because it appears AFTER the Token Type ->${n.name}<-in the lexer's definition. -See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:u,type:jn.UNREACHABLE_PATTERN,tokenTypes:[n,l]})}})}),e}function uFe(t,e){if(Uo(e)){let r=e.exec(t);return r!==null&&r.index===0}else{if(Ai(e))return e(t,0,[],{});if(Bt(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function hFe(t){return ls([".","\\","[","]","|","^","$","(",")","?","*","+","{"],r=>t.source.indexOf(r)!==-1)===void 0}function noe(t){let e=t.ignoreCase?"i":"";return new RegExp(`^(?:${t.source})`,e)}function ioe(t){let e=t.ignoreCase?"iy":"y";return new RegExp(`${t.source}`,e)}function ooe(t,e,r){let n=[];return Bt(t,Xg)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Xg+`> property in its definition -`,type:jn.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),Bt(t,Xk)||n.push({message:"A MultiMode Lexer cannot be initialized without a <"+Xk+`> property in its definition -`,type:jn.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),Bt(t,Xk)&&Bt(t,Xg)&&!Bt(t.modes,t.defaultMode)&&n.push({message:`A MultiMode Lexer cannot be initialized with a ${Xg}: <${t.defaultMode}>which does not exist -`,type:jn.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),Bt(t,Xk)&&Ae(t.modes,(i,a)=>{Ae(i,(s,l)=>{if(mr(s))n.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${a}> at index: <${l}> -`,type:jn.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if(Bt(s,"LONGER_ALT")){let u=Pt(s.LONGER_ALT)?s.LONGER_ALT:[s.LONGER_ALT];Ae(u,h=>{!mr(h)&&!Xn(i,h)&&n.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${h.name}> on token <${s.name}> outside of mode <${a}> -`,type:jn.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),n}function loe(t,e,r){let n=[],i=!1,a=Ac(qr(br(t.modes))),s=sf(a,u=>u[vp]===Kn.NA),l=doe(r);return e&&Ae(s,u=>{let h=foe(u,l);if(h!==!1){let d={message:dFe(u,h),type:h.issue,tokenType:u};n.push(d)}else Bt(u,"LINE_BREAKS")?u.LINE_BREAKS===!0&&(i=!0):Yk(l,u.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found. - This Lexer has been defined to track line and column information, - But none of the Token Types can be identified as matching a line terminator. - See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS - for details.`,type:jn.NO_LINE_BREAKS_FLAGS}),n}function coe(t){let e={},r=zr(t);return Ae(r,n=>{let i=t[n];if(Pt(i))e[n]=[];else throw Error("non exhaustive match")}),e}function uoe(t){let e=t.PATTERN;if(Uo(e))return!1;if(Ai(e))return!0;if(Bt(e,"exec"))return!0;if(Ti(e))return!1;throw Error("non exhaustive match")}function fFe(t){return Ti(t)&&t.length===1?t.charCodeAt(0):!1}function foe(t,e){if(Bt(t,"LINE_BREAKS"))return!1;if(Uo(t.PATTERN)){try{Yk(e,t.PATTERN)}catch(r){return{issue:jn.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(Ti(t.PATTERN))return!1;if(uoe(t))return{issue:jn.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}}function dFe(t,e){if(e.issue===jn.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern. - The problem is in the <${t.name}> Token Type - Root cause: ${e.errMsg}. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(e.issue===jn.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. - The problem is in the <${t.name}> Token Type - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}function doe(t){return Je(t,r=>Ti(r)?r.charCodeAt(0):r)}function cM(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}function $c(t){return t255?255+~~(t/255):t}}var vp,Xg,Xk,uM,eFe,nFe,hoe,Yg,jk,lM=N(()=>{"use strict";ax();px();qt();Hg();roe();Wk();vp="PATTERN",Xg="defaultMode",Xk="modes",uM=typeof new RegExp("(?:)").sticky=="boolean";o(aoe,"analyzeTokenTypes");o(soe,"validatePatterns");o(QBe,"validateRegExpPattern");o(ZBe,"findMissingPatterns");o(JBe,"findInvalidPatterns");eFe=/[^\\][$]/;o(tFe,"findEndOfInputAnchor");o(rFe,"findEmptyMatchRegExps");nFe=/[^\\[][\^]|^\^/;o(iFe,"findStartOfInputAnchor");o(aFe,"findUnsupportedFlags");o(sFe,"findDuplicatePatterns");o(oFe,"findInvalidGroupType");o(lFe,"findModesThatDoNotExist");o(cFe,"findUnreachablePatterns");o(uFe,"testTokenType");o(hFe,"noMetaChar");o(noe,"addStartOfInput");o(ioe,"addStickyFlag");o(ooe,"performRuntimeChecks");o(loe,"performWarningRuntimeChecks");o(coe,"cloneEmptyGroups");o(uoe,"isCustomPattern");o(fFe,"isShortPattern");hoe={test:o(function(t){let e=t.length;for(let r=this.lastIndex;r{r.isParent=r.categoryMatches.length>0})}function mFe(t){let e=an(t),r=t,n=!0;for(;n;){r=Ac(qr(Je(r,a=>a.CATEGORIES)));let i=af(r,e);e=e.concat(i),hr(i)?n=!1:r=i}return e}function gFe(t){Ae(t,e=>{hM(e)||(goe[poe]=e,e.tokenTypeIdx=poe++),moe(e)&&!Pt(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),moe(e)||(e.CATEGORIES=[]),xFe(e)||(e.categoryMatches=[]),bFe(e)||(e.categoryMatchesMap={})})}function yFe(t){Ae(t,e=>{e.categoryMatches=[],Ae(e.categoryMatchesMap,(r,n)=>{e.categoryMatches.push(goe[n].tokenTypeIdx)})})}function vFe(t){Ae(t,e=>{yoe([],e)})}function yoe(t,e){Ae(t,r=>{e.categoryMatchesMap[r.tokenTypeIdx]=!0}),Ae(e.CATEGORIES,r=>{let n=t.concat(e);Xn(n,r)||yoe(n,r)})}function hM(t){return Bt(t,"tokenTypeIdx")}function moe(t){return Bt(t,"CATEGORIES")}function xFe(t){return Bt(t,"categoryMatches")}function bFe(t){return Bt(t,"categoryMatchesMap")}function voe(t){return Bt(t,"tokenTypeIdx")}var poe,goe,xp=N(()=>{"use strict";qt();o(Vu,"tokenStructuredMatcher");o(jg,"tokenStructuredMatcherNoCategories");poe=1,goe={};o(Uu,"augmentTokenTypes");o(mFe,"expandCategories");o(gFe,"assignTokenDefaultProps");o(yFe,"assignCategoriesTokensProp");o(vFe,"assignCategoriesMapProp");o(yoe,"singleAssignCategoriesToksMap");o(hM,"hasShortKeyProperty");o(moe,"hasCategoriesProperty");o(xFe,"hasExtendingTokensTypesProperty");o(bFe,"hasExtendingTokensTypesMapProperty");o(voe,"isTokenType")});var Kg,fM=N(()=>{"use strict";Kg={buildUnableToPopLexerModeMessage(t){return`Unable to pop Lexer Mode after encountering Token ->${t.image}<- The Mode Stack is empty`},buildUnexpectedCharactersMessage(t,e,r,n,i){return`unexpected character: ->${t.charAt(e)}<- at offset: ${e}, skipped ${r} characters.`}}});var jn,mx,Kn,px=N(()=>{"use strict";lM();qt();Hg();xp();fM();Wk();(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",t[t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"})(jn||(jn={}));mx={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` -`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:Kg,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(mx);Kn=class{static{o(this,"Lexer")}constructor(e,r=mx){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(i,a)=>{if(this.traceInitPerf===!0){this.traceInitIndent++;let s=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${i}>`);let{time:l,value:u}=hx(a),h=l>10?console.warn:console.log;return this.traceInitIndent time: ${l}ms`),this.traceInitIndent--,u}else return a()},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. -a boolean 2nd argument is no longer supported`);this.config=pa({},mx,r);let n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let i,a=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===mx.lineTerminatorsPattern)this.config.lineTerminatorsPattern=hoe;else if(this.config.lineTerminatorCharacters===mx.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. - For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),Pt(e)?i={modes:{defaultMode:an(e)},defaultMode:Xg}:(a=!1,i=an(e))}),this.config.skipValidations===!1&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(ooe(i,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(loe(i,this.trackStartLines,this.config.lineTerminatorCharacters))})),i.modes=i.modes?i.modes:{},Ae(i.modes,(l,u)=>{i.modes[u]=sf(l,h=>mr(h))});let s=zr(i.modes);if(Ae(i.modes,(l,u)=>{this.TRACE_INIT(`Mode: <${u}> processing`,()=>{if(this.modes.push(u),this.config.skipValidations===!1&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(soe(l,s))}),hr(this.lexerDefinitionErrors)){Uu(l);let h;this.TRACE_INIT("analyzeTokenTypes",()=>{h=aoe(l,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[u]=h.patternIdxToConfig,this.charCodeToPatternIdxToConfig[u]=h.charCodeToPatternIdxToConfig,this.emptyGroups=pa({},this.emptyGroups,h.emptyGroups),this.hasCustom=h.hasCustom||this.hasCustom,this.canModeBeOptimized[u]=h.canBeOptimized}})}),this.defaultMode=i.defaultMode,!hr(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){let u=Je(this.lexerDefinitionErrors,h=>h.message).join(`----------------------- -`);throw new Error(`Errors detected in definition of Lexer: -`+u)}Ae(this.lexerDefinitionWarning,l=>{ux(l.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(uM?(this.chopInput=ta,this.match=this.matchWithTest):(this.updateLastIndex=ai,this.match=this.matchWithExec),a&&(this.handleModes=ai),this.trackStartLines===!1&&(this.computeNewColumn=ta),this.trackEndLines===!1&&(this.updateTokenEndLineColumnLocation=ai),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else if(/onlyOffset/i.test(this.config.positionTracking))this.createTokenInstance=this.createOffsetOnlyToken;else throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{let l=Xr(this.canModeBeOptimized,(u,h,f)=>(h===!1&&u.push(f),u),[]);if(r.ensureOptimizations&&!hr(l))throw Error(`Lexer Modes: < ${l.join(", ")} > cannot be optimized. - Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. - Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{Zse()}),this.TRACE_INIT("toFastProperties",()=>{fx(this)})})}tokenize(e,r=this.defaultMode){if(!hr(this.lexerDefinitionErrors)){let i=Je(this.lexerDefinitionErrors,a=>a.message).join(`----------------------- -`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: -`+i)}return this.tokenizeInternal(e,r)}tokenizeInternal(e,r){let n,i,a,s,l,u,h,f,d,p,m,g,y,v,x,b,T=e,S=T.length,w=0,E=0,_=this.hasCustom?0:Math.floor(e.length/10),C=new Array(_),D=[],O=this.trackStartLines?1:void 0,R=this.trackStartLines?1:void 0,k=coe(this.emptyGroups),L=this.trackStartLines,A=this.config.lineTerminatorsPattern,I=0,M=[],P=[],B=[],F=[];Object.freeze(F);let z;function $(){return M}o($,"getPossiblePatternsSlow");function U(Z){let ue=$c(Z),Q=P[ue];return Q===void 0?F:Q}o(U,"getPossiblePatternsOptimized");let K=o(Z=>{if(B.length===1&&Z.tokenType.PUSH_MODE===void 0){let ue=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(Z);D.push({offset:Z.startOffset,line:Z.startLine,column:Z.startColumn,length:Z.image.length,message:ue})}else{B.pop();let ue=ma(B);M=this.patternIdxToConfig[ue],P=this.charCodeToPatternIdxToConfig[ue],I=M.length;let Q=this.canModeBeOptimized[ue]&&this.config.safeMode===!1;P&&Q?z=U:z=$}},"pop_mode");function ee(Z){B.push(Z),P=this.charCodeToPatternIdxToConfig[Z],M=this.patternIdxToConfig[Z],I=M.length,I=M.length;let ue=this.canModeBeOptimized[Z]&&this.config.safeMode===!1;P&&ue?z=U:z=$}o(ee,"push_mode"),ee.call(this,r);let Y,ce=this.config.recoveryEnabled;for(;wu.length){u=s,h=f,Y=he;break}}}break}}if(u!==null){if(d=u.length,p=Y.group,p!==void 0&&(m=Y.tokenTypeIdx,g=this.createTokenInstance(u,w,m,Y.tokenType,O,R,d),this.handlePayload(g,h),p===!1?E=this.addToken(C,E,g):k[p].push(g)),e=this.chopInput(e,d),w=w+d,R=this.computeNewColumn(R,d),L===!0&&Y.canLineTerminator===!0){let j=0,ne,te;A.lastIndex=0;do ne=A.test(u),ne===!0&&(te=A.lastIndex-1,j++);while(ne===!0);j!==0&&(O=O+j,R=d-te,this.updateTokenEndLineColumnLocation(g,p,te,j,O,R,d))}this.handleModes(Y,K,ee,g)}else{let j=w,ne=O,te=R,he=ce===!1;for(;he===!1&&w{"use strict";qt();px();xp();o(Hu,"tokenLabel");o(dM,"hasTokenLabel");TFe="parent",xoe="categories",boe="label",Toe="group",woe="push_mode",koe="pop_mode",Eoe="longer_alt",Soe="line_breaks",Coe="start_chars_hint";o(df,"createToken");o(wFe,"createTokenInternal");fo=df({name:"EOF",pattern:Kn.NA});Uu([fo]);o(Wu,"createTokenInstance");o(gx,"tokenMatcher")});var qu,Aoe,$l,Qg=N(()=>{"use strict";bp();qt();fs();qu={buildMismatchTokenMessage({expected:t,actual:e,previous:r,ruleName:n}){return`Expecting ${dM(t)?`--> ${Hu(t)} <--`:`token of type --> ${t.name} <--`} but found --> '${e.image}' <--`},buildNotAllInputParsedMessage({firstRedundant:t,ruleName:e}){return"Redundant input, expecting EOF but found: "+t.image},buildNoViableAltMessage({expectedPathsPerAlt:t,actual:e,previous:r,customUserDescription:n,ruleName:i}){let a="Expecting: ",l=` -but found: '`+ia(e).image+"'";if(n)return a+n+l;{let u=Xr(t,(p,m)=>p.concat(m),[]),h=Je(u,p=>`[${Je(p,m=>Hu(m)).join(", ")}]`),d=`one of these possible Token sequences: -${Je(h,(p,m)=>` ${m+1}. ${p}`).join(` -`)}`;return a+d+l}},buildEarlyExitMessage({expectedIterationPaths:t,actual:e,customUserDescription:r,ruleName:n}){let i="Expecting: ",s=` -but found: '`+ia(e).image+"'";if(r)return i+r+s;{let u=`expecting at least one iteration which starts with one of these possible Token sequences:: - <${Je(t,h=>`[${Je(h,f=>Hu(f)).join(",")}]`).join(" ,")}>`;return i+u+s}}};Object.freeze(qu);Aoe={buildRuleNotFoundError(t,e){return"Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- -inside top level rule: ->`+t.name+"<-"}},$l={buildDuplicateFoundError(t,e){function r(f){return f instanceof Er?f.terminalType.name:f instanceof on?f.nonTerminalName:""}o(r,"getExtraProductionArgument");let n=t.name,i=ia(e),a=i.idx,s=Vs(i),l=r(i),u=a>0,h=`->${s}${u?a:""}<- ${l?`with argument: ->${l}<-`:""} - appears more than once (${e.length} times) in the top level rule: ->${n}<-. - For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES - `;return h=h.replace(/[ \t]+/g," "),h=h.replace(/\s\s+/g,` -`),h},buildNamespaceConflictError(t){return`Namespace conflict found in grammar. -The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${t.name}>. -To resolve this make sure each Terminal and Non-Terminal names are unique -This is easy to accomplish by using the convention that Terminal names start with an uppercase letter -and Non-Terminal names start with a lower case letter.`},buildAlternationPrefixAmbiguityError(t){let e=Je(t.prefixPath,i=>Hu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx;return`Ambiguous alternatives: <${t.ambiguityIndices.join(" ,")}> due to common lookahead prefix -in inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX -For Further details.`},buildAlternationAmbiguityError(t){let e=Je(t.prefixPath,i=>Hu(i)).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(" ,")}> in inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n},buildEmptyRepetitionError(t){let e=Vs(t.repetition);return t.repetition.idx!==0&&(e+=t.repetition.idx),`The repetition <${e}> within Rule <${t.topLevelRule.name}> can never consume any tokens. -This could lead to an infinite loop.`},buildTokenNameError(t){return"deprecated"},buildEmptyAlternationError(t){return`Ambiguous empty alternative: <${t.emptyChoiceIdx+1}> in inside <${t.topLevelRule.name}> Rule. -Only the last alternative may be an empty alternative.`},buildTooManyAlternativesError(t){return`An Alternation cannot have more than 256 alternatives: - inside <${t.topLevelRule.name}> Rule. - has ${t.alternation.definition.length+1} alternatives.`},buildLeftRecursionError(t){let e=t.topLevelRule.name,r=Je(t.leftRecursionPath,a=>a.name),n=`${e} --> ${r.concat([e]).join(" --> ")}`;return`Left Recursion found in grammar. -rule: <${e}> can be invoked from itself (directly or indirectly) -without consuming any Tokens. The grammar path that causes this is: - ${n} - To fix this refactor your grammar to remove the left recursion. -see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError(t){return"deprecated"},buildDuplicateRuleNameError(t){let e;return t.topLevelRule instanceof us?e=t.topLevelRule.name:e=t.topLevelRule,`Duplicate definition, rule: ->${e}<- is already defined in the grammar: ->${t.grammarName}<-`}}});function _oe(t,e){let r=new pM(t,e);return r.resolveRefs(),r.errors}var pM,Doe=N(()=>{"use strict";Us();qt();fs();o(_oe,"resolveGrammar");pM=class extends hs{static{o(this,"GastRefResolverVisitor")}constructor(e,r){super(),this.nameToTopRule=e,this.errMsgProvider=r,this.errors=[]}resolveRefs(){Ae(br(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){let r=this.nameToTopRule[e.nonTerminalName];if(r)e.referencedRule=r;else{let n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:n,type:Vi.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}});function Jk(t,e,r=[]){r=an(r);let n=[],i=0;function a(l){return l.concat(bi(t,i+1))}o(a,"remainingPathWith");function s(l){let u=Jk(a(l),e,r);return n.concat(u)}for(o(s,"getAlternativesForProd");r.length{hr(u.definition)===!1&&(n=s(u.definition))}),n;if(l instanceof Er)r.push(l.terminalType);else throw Error("non exhaustive match")}i++}return n.push({partialPath:r,suffixDef:bi(t,i)}),n}function eE(t,e,r,n){let i="EXIT_NONE_TERMINAL",a=[i],s="EXIT_ALTERNATIVE",l=!1,u=e.length,h=u-n-1,f=[],d=[];for(d.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!hr(d);){let p=d.pop();if(p===s){l&&ma(d).idx<=h&&d.pop();continue}let m=p.def,g=p.idx,y=p.ruleStack,v=p.occurrenceStack;if(hr(m))continue;let x=m[0];if(x===i){let b={idx:g,def:bi(m),ruleStack:Fu(y),occurrenceStack:Fu(v)};d.push(b)}else if(x instanceof Er)if(g=0;b--){let T=x.definition[b],S={idx:g,def:T.definition.concat(bi(m)),ruleStack:y,occurrenceStack:v};d.push(S),d.push(s)}else if(x instanceof Dn)d.push({idx:g,def:x.definition.concat(bi(m)),ruleStack:y,occurrenceStack:v});else if(x instanceof us)d.push(kFe(x,g,y,v));else throw Error("non exhaustive match")}return f}function kFe(t,e,r,n){let i=an(r);i.push(t.name);let a=an(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}var mM,Kk,Zg,Qk,yx,Zk,vx,xx=N(()=>{"use strict";qt();rM();Vk();fs();mM=class extends Gu{static{o(this,"AbstractNextPossibleTokensWalker")}constructor(e,r){super(),this.topProd=e,this.path=r,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=an(this.path.ruleStack).reverse(),this.occurrenceStack=an(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,r=[]){this.found||super.walk(e,r)}walkProdRef(e,r,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){let i=r.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,i)}}updateExpectedNext(){hr(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}},Kk=class extends mM{static{o(this,"NextAfterTokenWalker")}constructor(e,r){super(e,r),this.path=r,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,r,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){let i=r.concat(n),a=new Dn({definition:i});this.possibleTokTypes=yp(a),this.found=!0}}},Zg=class extends Gu{static{o(this,"AbstractNextTerminalAfterProductionWalker")}constructor(e,r){super(),this.topRule=e,this.occurrence=r,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}},Qk=class extends Zg{static{o(this,"NextTerminalAfterManyWalker")}walkMany(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkMany(e,r,n)}},yx=class extends Zg{static{o(this,"NextTerminalAfterManySepWalker")}walkManySep(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkManySep(e,r,n)}},Zk=class extends Zg{static{o(this,"NextTerminalAfterAtLeastOneWalker")}walkAtLeastOne(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOne(e,r,n)}},vx=class extends Zg{static{o(this,"NextTerminalAfterAtLeastOneSepWalker")}walkAtLeastOneSep(e,r,n){if(e.idx===this.occurrence){let i=ia(r.concat(n));this.result.isEndOfRule=i===void 0,i instanceof Er&&(this.result.token=i.terminalType,this.result.occurrence=i.idx)}else super.walkAtLeastOneSep(e,r,n)}};o(Jk,"possiblePathsFrom");o(eE,"nextPossibleTokensAfter");o(kFe,"expandTopLevelRule")});function bx(t){if(t instanceof ln||t==="Option")return Qn.OPTION;if(t instanceof Pr||t==="Repetition")return Qn.REPETITION;if(t instanceof Ln||t==="RepetitionMandatory")return Qn.REPETITION_MANDATORY;if(t instanceof Rn||t==="RepetitionMandatoryWithSeparator")return Qn.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof Tn||t==="RepetitionWithSeparator")return Qn.REPETITION_WITH_SEPARATOR;if(t instanceof wn||t==="Alternation")return Qn.ALTERNATION;throw Error("non exhaustive match")}function rE(t){let{occurrence:e,rule:r,prodType:n,maxLookahead:i}=t,a=bx(n);return a===Qn.ALTERNATION?Jg(e,r,i):e1(e,r,a,i)}function Roe(t,e,r,n,i,a){let s=Jg(t,e,r),l=Boe(s)?jg:Vu;return a(s,n,l,i)}function Noe(t,e,r,n,i,a){let s=e1(t,e,i,r),l=Boe(s)?jg:Vu;return a(s[0],l,n)}function Moe(t,e,r,n){let i=t.length,a=Pa(t,s=>Pa(s,l=>l.length===1));if(e)return function(s){let l=Je(s,u=>u.GATE);for(let u=0;uqr(u)),l=Xr(s,(u,h,f)=>(Ae(h,d=>{Bt(u,d.tokenTypeIdx)||(u[d.tokenTypeIdx]=f),Ae(d.categoryMatches,p=>{Bt(u,p)||(u[p]=f)})}),u),{});return function(){let u=this.LA(1);return l[u.tokenTypeIdx]}}else return function(){for(let s=0;sa.length===1),i=t.length;if(n&&!r){let a=qr(t);if(a.length===1&&hr(a[0].categoryMatches)){let l=a[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===l}}else{let s=Xr(a,(l,u,h)=>(l[u.tokenTypeIdx]=!0,Ae(u.categoryMatches,f=>{l[f]=!0}),l),[]);return function(){let l=this.LA(1);return s[l.tokenTypeIdx]===!0}}}else return function(){e:for(let a=0;aJk([s],1)),n=Loe(r.length),i=Je(r,s=>{let l={};return Ae(s,u=>{let h=gM(u.partialPath);Ae(h,f=>{l[f]=!0})}),l}),a=r;for(let s=1;s<=e;s++){let l=a;a=Loe(l.length);for(let u=0;u{let x=gM(v.partialPath);Ae(x,b=>{i[u][b]=!0})})}}}}return n}function Jg(t,e,r,n){let i=new tE(t,Qn.ALTERNATION,n);return e.accept(i),Ooe(i.result,r)}function e1(t,e,r,n){let i=new tE(t,r);e.accept(i);let a=i.result,l=new yM(e,t,r).startWalking(),u=new Dn({definition:a}),h=new Dn({definition:l});return Ooe([u,h],n)}function nE(t,e){e:for(let r=0;r{let i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}function Boe(t){return Pa(t,e=>Pa(e,r=>Pa(r,n=>hr(n.categoryMatches))))}var Qn,yM,tE,t1=N(()=>{"use strict";qt();xx();Vk();xp();fs();(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(Qn||(Qn={}));o(bx,"getProdType");o(rE,"getLookaheadPaths");o(Roe,"buildLookaheadFuncForOr");o(Noe,"buildLookaheadFuncForOptionalProd");o(Moe,"buildAlternativesLookAheadFunc");o(Ioe,"buildSingleAlternativeLookaheadFunction");yM=class extends Gu{static{o(this,"RestDefinitionFinderWalker")}constructor(e,r,n){super(),this.topProd=e,this.targetOccurrence=r,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,r,n,i){return e.idx===this.targetOccurrence&&this.targetProdType===r?(this.restDef=n.concat(i),!0):!1}walkOption(e,r,n){this.checkIsTarget(e,Qn.OPTION,r,n)||super.walkOption(e,r,n)}walkAtLeastOne(e,r,n){this.checkIsTarget(e,Qn.REPETITION_MANDATORY,r,n)||super.walkOption(e,r,n)}walkAtLeastOneSep(e,r,n){this.checkIsTarget(e,Qn.REPETITION_MANDATORY_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}walkMany(e,r,n){this.checkIsTarget(e,Qn.REPETITION,r,n)||super.walkOption(e,r,n)}walkManySep(e,r,n){this.checkIsTarget(e,Qn.REPETITION_WITH_SEPARATOR,r,n)||super.walkOption(e,r,n)}},tE=class extends hs{static{o(this,"InsideDefinitionFinderVisitor")}constructor(e,r,n){super(),this.targetOccurrence=e,this.targetProdType=r,this.targetRef=n,this.result=[]}checkIsTarget(e,r){e.idx===this.targetOccurrence&&this.targetProdType===r&&(this.targetRef===void 0||e===this.targetRef)&&(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,Qn.OPTION)}visitRepetition(e){this.checkIsTarget(e,Qn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,Qn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,Qn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,Qn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,Qn.ALTERNATION)}};o(Loe,"initializeArrayOfArrays");o(gM,"pathToHashKeys");o(EFe,"isUniquePrefixHash");o(Ooe,"lookAheadSequenceFromAlternatives");o(Jg,"getLookaheadPathsForOr");o(e1,"getLookaheadPathsForOptionalProd");o(nE,"containsPath");o(Poe,"isStrictPrefixOfPath");o(Boe,"areTokenCategoriesNotUsed")});function Foe(t){let e=t.lookaheadStrategy.validate({rules:t.rules,tokenTypes:t.tokenTypes,grammarName:t.grammarName});return Je(e,r=>Object.assign({type:Vi.CUSTOM_LOOKAHEAD_VALIDATION},r))}function $oe(t,e,r,n){let i=ga(t,u=>SFe(u,r)),a=RFe(t,e,r),s=ga(t,u=>_Fe(u,r)),l=ga(t,u=>AFe(u,t,n,r));return i.concat(a,s,l)}function SFe(t,e){let r=new vM;t.accept(r);let n=r.allProductions,i=yR(n,CFe),a=zs(i,l=>l.length>1);return Je(br(a),l=>{let u=ia(l),h=e.buildDuplicateFoundError(t,l),f=Vs(u),d={message:h,type:Vi.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:f,occurrence:u.idx},p=zoe(u);return p&&(d.parameter=p),d})}function CFe(t){return`${Vs(t)}_#_${t.idx}_#_${zoe(t)}`}function zoe(t){return t instanceof Er?t.terminalType.name:t instanceof on?t.nonTerminalName:""}function AFe(t,e,r,n){let i=[];if(Xr(e,(s,l)=>l.name===t.name?s+1:s,0)>1){let s=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:s,type:Vi.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}function Goe(t,e,r){let n=[],i;return Xn(e,t)||(i=`Invalid rule override, rule: ->${t}<- cannot be overridden in the grammar: ->${r}<-as it is not defined in any of the super grammars `,n.push({message:i,type:Vi.INVALID_RULE_OVERRIDE,ruleName:t})),n}function bM(t,e,r,n=[]){let i=[],a=iE(e.definition);if(hr(a))return[];{let s=t.name;Xn(a,t)&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Vi.LEFT_RECURSION,ruleName:s});let u=af(a,n.concat([t])),h=ga(u,f=>{let d=an(n);return d.push(f),bM(t,f,r,d)});return i.concat(h)}}function iE(t){let e=[];if(hr(t))return e;let r=ia(t);if(r instanceof on)e.push(r.referencedRule);else if(r instanceof Dn||r instanceof ln||r instanceof Ln||r instanceof Rn||r instanceof Tn||r instanceof Pr)e=e.concat(iE(r.definition));else if(r instanceof wn)e=qr(Je(r.definition,a=>iE(a.definition)));else if(!(r instanceof Er))throw Error("non exhaustive match");let n=gp(r),i=t.length>1;if(n&&i){let a=bi(t);return e.concat(iE(a))}else return e}function Voe(t,e){let r=new Tx;t.accept(r);let n=r.alternations;return ga(n,a=>{let s=Fu(a.definition);return ga(s,(l,u)=>{let h=eE([l],[],Vu,1);return hr(h)?[{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:a,emptyChoiceIdx:u}),type:Vi.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:a.idx,alternative:u+1}]:[]})})}function Uoe(t,e,r){let n=new Tx;t.accept(n);let i=n.alternations;return i=sf(i,s=>s.ignoreAmbiguities===!0),ga(i,s=>{let l=s.idx,u=s.maxLookahead||e,h=Jg(l,t,u,s),f=DFe(h,s,t,r),d=LFe(h,s,t,r);return f.concat(d)})}function _Fe(t,e){let r=new Tx;t.accept(r);let n=r.alternations;return ga(n,a=>a.definition.length>255?[{message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:a}),type:Vi.TOO_MANY_ALTS,ruleName:t.name,occurrence:a.idx}]:[])}function Hoe(t,e,r){let n=[];return Ae(t,i=>{let a=new xM;i.accept(a);let s=a.allProductions;Ae(s,l=>{let u=bx(l),h=l.maxLookahead||e,f=l.idx,p=e1(f,i,u,h)[0];if(hr(qr(p))){let m=r.buildEmptyRepetitionError({topLevelRule:i,repetition:l});n.push({message:m,type:Vi.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}function DFe(t,e,r,n){let i=[],a=Xr(t,(l,u,h)=>(e.definition[h].ignoreAmbiguities===!0||Ae(u,f=>{let d=[h];Ae(t,(p,m)=>{h!==m&&nE(p,f)&&e.definition[m].ignoreAmbiguities!==!0&&d.push(m)}),d.length>1&&!nE(i,f)&&(i.push(f),l.push({alts:d,path:f}))}),l),[]);return Je(a,l=>{let u=Je(l.alts,f=>f+1);return{message:n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:u,prefixPath:l.path}),type:Vi.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:l.alts}})}function LFe(t,e,r,n){let i=Xr(t,(s,l,u)=>{let h=Je(l,f=>({idx:u,path:f}));return s.concat(h)},[]);return Ac(ga(i,s=>{if(e.definition[s.idx].ignoreAmbiguities===!0)return[];let u=s.idx,h=s.path,f=Yr(i,p=>e.definition[p.idx].ignoreAmbiguities!==!0&&p.idx{let m=[p.idx+1,u+1],g=e.idx===0?"":e.idx;return{message:n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:m,prefixPath:p.path}),type:Vi.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:g,alternatives:m}})}))}function RFe(t,e,r){let n=[],i=Je(e,a=>a.name);return Ae(t,a=>{let s=a.name;if(Xn(i,s)){let l=r.buildNamespaceConflictError(a);n.push({message:l,type:Vi.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:s})}}),n}var vM,Tx,xM,wx=N(()=>{"use strict";qt();Us();fs();t1();xx();xp();o(Foe,"validateLookahead");o($oe,"validateGrammar");o(SFe,"validateDuplicateProductions");o(CFe,"identifyProductionForDuplicates");o(zoe,"getExtraProductionArgument");vM=class extends hs{static{o(this,"OccurrenceValidationCollector")}constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}};o(AFe,"validateRuleDoesNotAlreadyExist");o(Goe,"validateRuleIsOverridden");o(bM,"validateNoLeftRecursion");o(iE,"getFirstNoneTerminal");Tx=class extends hs{static{o(this,"OrCollector")}constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}};o(Voe,"validateEmptyOrAlternative");o(Uoe,"validateAmbiguousAlternationAlternatives");xM=class extends hs{static{o(this,"RepetitionCollector")}constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}};o(_Fe,"validateTooManyAlts");o(Hoe,"validateSomeNonEmptyLookaheadPath");o(DFe,"checkAlternativesAmbiguities");o(LFe,"checkPrefixAlternativesAmbiguities");o(RFe,"checkTerminalAndNoneTerminalsNameSpace")});function Woe(t){let e=nf(t,{errMsgProvider:Aoe}),r={};return Ae(t.rules,n=>{r[n.name]=n}),_oe(r,e.errMsgProvider)}function qoe(t){return t=nf(t,{errMsgProvider:$l}),$oe(t.rules,t.tokenTypes,t.errMsgProvider,t.grammarName)}var Yoe=N(()=>{"use strict";qt();Doe();wx();Qg();o(Woe,"resolveGrammar");o(qoe,"validateGrammar")});function pf(t){return Xn(Zoe,t.name)}var Xoe,joe,Koe,Qoe,Zoe,r1,Tp,kx,Ex,Sx,n1=N(()=>{"use strict";qt();Xoe="MismatchedTokenException",joe="NoViableAltException",Koe="EarlyExitException",Qoe="NotAllInputParsedException",Zoe=[Xoe,joe,Koe,Qoe];Object.freeze(Zoe);o(pf,"isRecognitionException");r1=class extends Error{static{o(this,"RecognitionException")}constructor(e,r){super(e),this.token=r,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}},Tp=class extends r1{static{o(this,"MismatchedTokenException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Xoe}},kx=class extends r1{static{o(this,"NoViableAltException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=joe}},Ex=class extends r1{static{o(this,"NotAllInputParsedException")}constructor(e,r){super(e,r),this.name=Qoe}},Sx=class extends r1{static{o(this,"EarlyExitException")}constructor(e,r,n){super(e,r),this.previousToken=n,this.name=Koe}}});function NFe(t,e,r,n,i,a,s){let l=this.getKeyForAutomaticLookahead(n,i),u=this.firstAfterRepMap[l];if(u===void 0){let p=this.getCurrRuleFullName(),m=this.getGAstProductions()[p];u=new a(m,i).startWalking(),this.firstAfterRepMap[l]=u}let h=u.token,f=u.occurrence,d=u.isEndOfRule;this.RULE_STACK.length===1&&d&&h===void 0&&(h=fo,f=1),!(h===void 0||f===void 0)&&this.shouldInRepetitionRecoveryBeTried(h,f,s)&&this.tryInRepetitionRecovery(t,e,r,h)}var TM,kM,wM,aE,EM=N(()=>{"use strict";bp();qt();n1();nM();Us();TM={},kM="InRuleRecoveryException",wM=class extends Error{static{o(this,"InRuleRecoveryException")}constructor(e){super(e),this.name=kM}},aE=class{static{o(this,"Recoverable")}initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=Bt(e,"recoveryEnabled")?e.recoveryEnabled:ds.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=NFe)}getTokenToInsert(e){let r=Wu(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,r,n,i){let a=this.findReSyncTokenType(),s=this.exportLexerState(),l=[],u=!1,h=this.LA(1),f=this.LA(1),d=o(()=>{let p=this.LA(0),m=this.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:h,previous:p,ruleName:this.getCurrRuleFullName()}),g=new Tp(m,h,this.LA(0));g.resyncedTokens=Fu(l),this.SAVE_ERROR(g)},"generateErrorMessage");for(;!u;)if(this.tokenMatcher(f,i)){d();return}else if(n.call(this)){d(),e.apply(this,r);return}else this.tokenMatcher(f,a)?u=!0:(f=this.SKIP_TOKEN(),this.addToResyncTokens(f,l));this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,r,n){return!(n===!1||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))}getFollowsForInRuleRecovery(e,r){let n=this.getCurrentGrammarPath(e,r);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){let n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new wM("sad sad panda")}canPerformInRuleRecovery(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,r){if(!this.canTokenTypeBeInsertedInRecovery(e)||hr(r))return!1;let n=this.LA(1);return ls(r,a=>this.tokenMatcher(n,a))!==void 0}canRecoverWithSingleTokenDeletion(e){return this.canTokenTypeBeDeletedInRecovery(e)?this.tokenMatcher(this.LA(2),e):!1}isInCurrentRuleReSyncSet(e){let r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return Xn(n,e)}findReSyncTokenType(){let e=this.flattenFollowSet(),r=this.LA(1),n=2;for(;;){let i=ls(e,a=>gx(r,a));if(i!==void 0)return i;r=this.LA(n),n++}}getCurrFollowKey(){if(this.RULE_STACK.length===1)return TM;let e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){let e=this.RULE_STACK,r=this.RULE_OCCURRENCE_STACK;return Je(e,(n,i)=>i===0?TM:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:r[i],inRule:this.shortRuleNameToFullName(e[i-1])})}flattenFollowSet(){let e=Je(this.buildFullFollowKeyStack(),r=>this.getFollowSetFromFollowKey(r));return qr(e)}getFollowSetFromFollowKey(e){if(e===TM)return[fo];let r=e.ruleName+e.idxInCallingRule+Uk+e.inRule;return this.resyncFollows[r]}addToResyncTokens(e,r){return this.tokenMatcher(e,fo)||r.push(e),r}reSyncTo(e){let r=[],n=this.LA(1);for(;this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return Fu(r)}attemptInRepetitionRecovery(e,r,n,i,a,s,l){}getCurrentGrammarPath(e,r){let n=this.getHumanReadableRuleStack(),i=an(this.RULE_OCCURRENCE_STACK);return{ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r}}getHumanReadableRuleStack(){return Je(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}};o(NFe,"attemptInRepetitionRecovery")});function sE(t,e,r){return r|e|t}var oE=N(()=>{"use strict";o(sE,"getKeyForAutomaticLookahead")});var Yu,SM=N(()=>{"use strict";qt();Qg();Us();wx();t1();Yu=class{static{o(this,"LLkLookaheadStrategy")}constructor(e){var r;this.maxLookahead=(r=e?.maxLookahead)!==null&&r!==void 0?r:ds.maxLookahead}validate(e){let r=this.validateNoLeftRecursion(e.rules);if(hr(r)){let n=this.validateEmptyOrAlternatives(e.rules),i=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),a=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...r,...n,...i,...a]}return r}validateNoLeftRecursion(e){return ga(e,r=>bM(r,r,$l))}validateEmptyOrAlternatives(e){return ga(e,r=>Voe(r,$l))}validateAmbiguousAlternationAlternatives(e,r){return ga(e,n=>Uoe(n,r,$l))}validateSomeNonEmptyLookaheadPath(e,r){return Hoe(e,r,$l)}buildLookaheadForAlternation(e){return Roe(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,Moe)}buildLookaheadForOptional(e){return Noe(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,bx(e.prodType),Ioe)}}});function MFe(t){lE.reset(),t.accept(lE);let e=lE.dslMethods;return lE.reset(),e}var cE,CM,lE,Joe=N(()=>{"use strict";qt();Us();oE();fs();SM();cE=class{static{o(this,"LooksAhead")}initLooksAhead(e){this.dynamicTokensEnabled=Bt(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:ds.dynamicTokensEnabled,this.maxLookahead=Bt(e,"maxLookahead")?e.maxLookahead:ds.maxLookahead,this.lookaheadStrategy=Bt(e,"lookaheadStrategy")?e.lookaheadStrategy:new Yu({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){Ae(e,r=>{this.TRACE_INIT(`${r.name} Rule Lookahead`,()=>{let{alternation:n,repetition:i,option:a,repetitionMandatory:s,repetitionMandatoryWithSeparator:l,repetitionWithSeparator:u}=MFe(r);Ae(n,h=>{let f=h.idx===0?"":h.idx;this.TRACE_INIT(`${Vs(h)}${f}`,()=>{let d=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:h.idx,rule:r,maxLookahead:h.maxLookahead||this.maxLookahead,hasPredicates:h.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),p=sE(this.fullRuleNameToShort[r.name],256,h.idx);this.setLaFuncCache(p,d)})}),Ae(i,h=>{this.computeLookaheadFunc(r,h.idx,768,"Repetition",h.maxLookahead,Vs(h))}),Ae(a,h=>{this.computeLookaheadFunc(r,h.idx,512,"Option",h.maxLookahead,Vs(h))}),Ae(s,h=>{this.computeLookaheadFunc(r,h.idx,1024,"RepetitionMandatory",h.maxLookahead,Vs(h))}),Ae(l,h=>{this.computeLookaheadFunc(r,h.idx,1536,"RepetitionMandatoryWithSeparator",h.maxLookahead,Vs(h))}),Ae(u,h=>{this.computeLookaheadFunc(r,h.idx,1280,"RepetitionWithSeparator",h.maxLookahead,Vs(h))})})})}computeLookaheadFunc(e,r,n,i,a,s){this.TRACE_INIT(`${s}${r===0?"":r}`,()=>{let l=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:r,rule:e,maxLookahead:a||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:i}),u=sE(this.fullRuleNameToShort[e.name],n,r);this.setLaFuncCache(u,l)})}getKeyForAutomaticLookahead(e,r){let n=this.getLastExplicitRuleShortName();return sE(n,e,r)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,r){this.lookAheadFuncsCache.set(e,r)}},CM=class extends hs{static{o(this,"DslMethodsCollectorVisitor")}constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}},lE=new CM;o(MFe,"collectMethods")});function DM(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";o(DM,"setNodeLocationOnlyOffset");o(LM,"setNodeLocationFull");o(ele,"addTerminalToCst");o(tle,"addNoneTerminalToCst")});function RM(t,e){Object.defineProperty(t,IFe,{enumerable:!1,configurable:!0,writable:!1,value:e})}var IFe,nle=N(()=>{"use strict";IFe="name";o(RM,"defineNameProp")});function OFe(t,e){let r=zr(t),n=r.length;for(let i=0;is.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>: - ${a.join(` - -`).replace(/\n/g,` - `)}`)}},"validateVisitor")};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}function ale(t,e,r){let n=o(function(){},"derivedConstructor");RM(n,t+"BaseSemanticsWithDefaults");let i=Object.create(r.prototype);return Ae(e,a=>{i[a]=OFe}),n.prototype=i,n.prototype.constructor=n,n}function PFe(t,e){return BFe(t,e)}function BFe(t,e){let r=Yr(e,i=>Ai(t[i])===!1),n=Je(r,i=>({msg:`Missing visitor method: <${i}> on ${t.constructor.name} CST Visitor.`,type:NM.MISSING_METHOD,methodName:i}));return Ac(n)}var NM,sle=N(()=>{"use strict";qt();nle();o(OFe,"defaultVisit");o(ile,"createBaseSemanticVisitorConstructor");o(ale,"createBaseVisitorConstructorWithDefaults");(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(NM||(NM={}));o(PFe,"validateVisitor");o(BFe,"validateMissingCstMethods")});var dE,ole=N(()=>{"use strict";rle();qt();sle();Us();dE=class{static{o(this,"TreeBuilder")}initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=Bt(e,"nodeLocationTracking")?e.nodeLocationTracking:ds.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=ai,this.cstFinallyStateUpdate=ai,this.cstPostTerminal=ai,this.cstPostNonTerminal=ai,this.cstPostRule=ai;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=LM,this.setNodeLocationFromNode=LM,this.cstPostRule=ai,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=ai,this.setNodeLocationFromNode=ai,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=DM,this.setNodeLocationFromNode=DM,this.cstPostRule=ai,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=ai,this.setNodeLocationFromNode=ai,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=ai,this.setNodeLocationFromNode=ai,this.cstPostRule=ai,this.setInitialNodeLocation=ai;else throw Error(`Invalid config option: "${e.nodeLocationTracking}"`)}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){let r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){let r={name:e,children:Object.create(null)};this.setInitialNodeLocation(r),this.CST_STACK.push(r)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){let r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN}cstPostTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];ele(n,r,e),this.setNodeLocationFromToken(n.location,r)}cstPostNonTerminal(e,r){let n=this.CST_STACK[this.CST_STACK.length-1];tle(n,r,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if(mr(this.baseCstVisitorConstructor)){let e=ile(this.className,zr(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if(mr(this.baseCstVisitorWithDefaultsConstructor)){let e=ale(this.className,zr(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){let e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){let e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}}});var pE,lle=N(()=>{"use strict";Us();pE=class{static{o(this,"LexerAdapter")}initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):i1}LA(e){let r=this.currIdx+e;return r<0||this.tokVectorLength<=r?i1:this.tokVector[r]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}}});var mE,cle=N(()=>{"use strict";qt();n1();Us();Qg();wx();fs();mE=class{static{o(this,"RecognizerApi")}ACTION(e){return e.call(this)}consume(e,r,n){return this.consumeInternal(r,e,n)}subrule(e,r,n){return this.subruleInternal(r,e,n)}option(e,r){return this.optionInternal(r,e)}or(e,r){return this.orInternal(r,e)}many(e,r){return this.manyInternal(e,r)}atLeastOne(e,r){return this.atLeastOneInternal(e,r)}CONSUME(e,r){return this.consumeInternal(e,0,r)}CONSUME1(e,r){return this.consumeInternal(e,1,r)}CONSUME2(e,r){return this.consumeInternal(e,2,r)}CONSUME3(e,r){return this.consumeInternal(e,3,r)}CONSUME4(e,r){return this.consumeInternal(e,4,r)}CONSUME5(e,r){return this.consumeInternal(e,5,r)}CONSUME6(e,r){return this.consumeInternal(e,6,r)}CONSUME7(e,r){return this.consumeInternal(e,7,r)}CONSUME8(e,r){return this.consumeInternal(e,8,r)}CONSUME9(e,r){return this.consumeInternal(e,9,r)}SUBRULE(e,r){return this.subruleInternal(e,0,r)}SUBRULE1(e,r){return this.subruleInternal(e,1,r)}SUBRULE2(e,r){return this.subruleInternal(e,2,r)}SUBRULE3(e,r){return this.subruleInternal(e,3,r)}SUBRULE4(e,r){return this.subruleInternal(e,4,r)}SUBRULE5(e,r){return this.subruleInternal(e,5,r)}SUBRULE6(e,r){return this.subruleInternal(e,6,r)}SUBRULE7(e,r){return this.subruleInternal(e,7,r)}SUBRULE8(e,r){return this.subruleInternal(e,8,r)}SUBRULE9(e,r){return this.subruleInternal(e,9,r)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,r,n=a1){if(Xn(this.definedRulesNames,e)){let s={message:$l.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Vi.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);let i=this.defineRule(e,r,n);return this[e]=i,i}OVERRIDE_RULE(e,r,n=a1){let i=Goe(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(i);let a=this.defineRule(e,r,n);return this[e]=a,a}BACKTRACK(e,r){return function(){this.isBackTrackingStack.push(1);let n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(pf(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return zk(br(this.gastProductionsCache))}}});var gE,ule=N(()=>{"use strict";qt();oE();n1();t1();xx();Us();EM();bp();xp();gE=class{static{o(this,"RecognizerEngine")}initRecognizerEngine(e,r){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=jg,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},Bt(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 - For Further details.`);if(Pt(e)){if(hr(e))throw Error(`A Token Vocabulary cannot be empty. - Note that the first argument for the parser constructor - is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. - See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 - For Further details.`)}if(Pt(e))this.tokensMap=Xr(e,(a,s)=>(a[s.name]=s,a),{});else if(Bt(e,"modes")&&Pa(qr(br(e.modes)),voe)){let a=qr(br(e.modes)),s=qm(a);this.tokensMap=Xr(s,(l,u)=>(l[u.name]=u,l),{})}else if(bn(e))this.tokensMap=an(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=fo;let n=Bt(e,"modes")?qr(br(e.modes)):br(e),i=Pa(n,a=>hr(a.categoryMatches));this.tokenMatcher=i?jg:Vu,Uu(br(this.tokensMap))}defineRule(e,r,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called' -Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);let i=Bt(n,"resyncEnabled")?n.resyncEnabled:a1.resyncEnabled,a=Bt(n,"recoveryValueFunc")?n.recoveryValueFunc:a1.recoveryValueFunc,s=this.ruleShortNameIdx<<12;this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s;let l;return this.outputCst===!0?l=o(function(...f){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f);let d=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(d),d}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTry"):l=o(function(...f){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),r.apply(this,f)}catch(d){return this.invokeRuleCatch(d,i,a)}finally{this.ruleFinallyStateUpdate()}},"invokeRuleWithTryCst"),Object.assign(l,{ruleName:e,originalGrammarAction:r})}invokeRuleCatch(e,r,n){let i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(pf(e)){let s=e;if(a){let l=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(l))if(s.resyncedTokens=this.reSyncTo(l),this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];return u.recoveredNode=!0,u}else return n(e);else{if(this.outputCst){let u=this.CST_STACK[this.CST_STACK.length-1];u.recoveredNode=!0,s.partialCstResult=u}throw s}}else{if(i)return this.moveToTerminatedState(),n(e);throw s}}else throw e}optionInternal(e,r){let n=this.getKeyForAutomaticLookahead(512,r);return this.optionInternalLogic(e,r,n)}optionInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof e!="function"){a=e.DEF;let s=e.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=e;if(i.call(this)===!0)return a.call(this)}atLeastOneInternal(e,r){let n=this.getKeyForAutomaticLookahead(1024,e);return this.atLeastOneInternalLogic(e,r,n)}atLeastOneInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let s=r.GATE;if(s!==void 0){let l=i;i=o(()=>s.call(this)&&l.call(this),"lookAheadFunc")}}else a=r;if(i.call(this)===!0){let s=this.doSingleRepetition(a);for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a)}else throw this.raiseEarlyExitException(e,Qn.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],i,1024,e,Zk)}atLeastOneSepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1536,e);this.atLeastOneSepFirstInternalLogic(e,r,n)}atLeastOneSepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,vx],l,1536,e,vx)}else throw this.raiseEarlyExitException(e,Qn.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)}manyInternal(e,r){let n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,r,n)}manyInternalLogic(e,r,n){let i=this.getLaFuncFromCache(n),a;if(typeof r!="function"){a=r.DEF;let l=r.GATE;if(l!==void 0){let u=i;i=o(()=>l.call(this)&&u.call(this),"lookaheadFunction")}}else a=r;let s=!0;for(;i.call(this)===!0&&s===!0;)s=this.doSingleRepetition(a);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],i,768,e,Qk,s)}manySepFirstInternal(e,r){let n=this.getKeyForAutomaticLookahead(1280,e);this.manySepFirstInternalLogic(e,r,n)}manySepFirstInternalLogic(e,r,n){let i=r.DEF,a=r.SEP;if(this.getLaFuncFromCache(n).call(this)===!0){i.call(this);let l=o(()=>this.tokenMatcher(this.LA(1),a),"separatorLookAheadFunc");for(;this.tokenMatcher(this.LA(1),a)===!0;)this.CONSUME(a),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,a,l,i,yx],l,1280,e,yx)}}repetitionSepSecondInternal(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,1536,e,a)}doSingleRepetition(e){let r=this.getLexerPosition();return e.call(this),this.getLexerPosition()>r}orInternal(e,r){let n=this.getKeyForAutomaticLookahead(256,r),i=Pt(e)?e:e.DEF,s=this.getLaFuncFromCache(n).call(this,i);if(s!==void 0)return i[s].ALT.call(this);this.raiseNoAltException(r,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){let e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new Ex(r,e))}}subruleInternal(e,r,n){let i;try{let a=n!==void 0?n.ARGS:void 0;return this.subruleIdx=r,i=e.apply(this,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(a){throw this.subruleInternalError(a,n,e.ruleName)}}subruleInternalError(e,r,n){throw pf(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,r,n){let i;try{let a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(a){i=this.consumeInternalRecovery(e,r,a)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i}consumeInternalError(e,r,n){let i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Tp(i,r,a))}consumeInternalRecovery(e,r,n){if(this.recoveryEnabled&&n.name==="MismatchedTokenException"&&!this.isBackTracking()){let i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===kM?n:a}}else throw n}saveRecogState(){let e=this.errors,r=an(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r)}isBackTracking(){return this.isBackTrackingStack.length!==0}getCurrRuleFullName(){let e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),fo)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}}});var yE,hle=N(()=>{"use strict";n1();qt();t1();Us();yE=class{static{o(this,"ErrorHandler")}initErrorHandler(e){this._errors=[],this.errorMessageProvider=Bt(e,"errorMessageProvider")?e.errorMessageProvider:ds.errorMessageProvider}SAVE_ERROR(e){if(pf(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:an(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return an(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,r,n){let i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],l=e1(e,a,r,this.maxLookahead)[0],u=[];for(let f=1;f<=this.maxLookahead;f++)u.push(this.LA(f));let h=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:l,actual:u,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new Sx(h,this.LA(1),this.LA(0)))}raiseNoAltException(e,r){let n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=Jg(e,i,this.maxLookahead),s=[];for(let h=1;h<=this.maxLookahead;h++)s.push(this.LA(h));let l=this.LA(0),u=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:s,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new kx(u,this.LA(1),l))}}});var vE,fle=N(()=>{"use strict";xx();qt();vE=class{static{o(this,"ContentAssist")}initContentAssist(){}computeContentAssist(e,r){let n=this.gastProductionsCache[e];if(mr(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return eE([n],r,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){let r=ia(e.ruleStack),i=this.getGAstProductions()[r];return new Kk(i,e).startWalking()}}});function Ax(t,e,r,n=!1){bE(r);let i=ma(this.recordingProdStack),a=Ai(e)?e:e.DEF,s=new t({definition:[],idx:r});return n&&(s.separator=e.SEP),Bt(e,"MAX_LOOKAHEAD")&&(s.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(s),a.call(this),i.definition.push(s),this.recordingProdStack.pop(),TE}function zFe(t,e){bE(e);let r=ma(this.recordingProdStack),n=Pt(t)===!1,i=n===!1?t:t.DEF,a=new wn({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});Bt(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD);let s=B2(i,l=>Ai(l.GATE));return a.hasPredicates=s,r.definition.push(a),Ae(i,l=>{let u=new Dn({definition:[]});a.definition.push(u),Bt(l,"IGNORE_AMBIGUITIES")?u.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:Bt(l,"GATE")&&(u.ignoreAmbiguities=!0),this.recordingProdStack.push(u),l.ALT.call(this),this.recordingProdStack.pop()}),TE}function mle(t){return t===0?"":`${t}`}function bE(t){if(t<0||t>ple){let e=new Error(`Invalid DSL Method idx value: <${t}> - Idx value must be a none negative value smaller than ${ple+1}`);throw e.KNOWN_RECORDER_ERROR=!0,e}}var TE,dle,ple,gle,yle,$Fe,xE,vle=N(()=>{"use strict";qt();fs();px();xp();bp();Us();oE();TE={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(TE);dle=!0,ple=Math.pow(2,8)-1,gle=df({name:"RECORDING_PHASE_TOKEN",pattern:Kn.NA});Uu([gle]);yle=Wu(gle,`This IToken indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(yle);$Fe={name:`This CSTNode indicates the Parser is in Recording Phase - See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},xE=class{static{o(this,"GastRecorder")}initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){let r=e>0?e:"";this[`CONSUME${r}`]=function(n,i){return this.consumeInternalRecord(n,e,i)},this[`SUBRULE${r}`]=function(n,i){return this.subruleInternalRecord(n,e,i)},this[`OPTION${r}`]=function(n){return this.optionInternalRecord(n,e)},this[`OR${r}`]=function(n){return this.orInternalRecord(n,e)},this[`MANY${r}`]=function(n){this.manyInternalRecord(e,n)},this[`MANY_SEP${r}`]=function(n){this.manySepFirstInternalRecord(e,n)},this[`AT_LEAST_ONE${r}`]=function(n){this.atLeastOneInternalRecord(e,n)},this[`AT_LEAST_ONE_SEP${r}`]=function(n){this.atLeastOneSepFirstInternalRecord(e,n)}}this.consume=function(e,r,n){return this.consumeInternalRecord(r,e,n)},this.subrule=function(e,r,n){return this.subruleInternalRecord(r,e,n)},this.option=function(e,r){return this.optionInternalRecord(r,e)},this.or=function(e,r){return this.orInternalRecord(r,e)},this.many=function(e,r){this.manyInternalRecord(e,r)},this.atLeastOne=function(e,r){this.atLeastOneInternalRecord(e,r)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{let e=this;for(let r=0;r<10;r++){let n=r>0?r:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,r){return()=>!0}LA_RECORD(e){return i1}topLevelRuleRecord(e,r){try{let n=new us({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` - This error was thrown during the "grammar recording phase" For more info see: - https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch{throw n}throw n}}optionInternalRecord(e,r){return Ax.call(this,ln,e,r)}atLeastOneInternalRecord(e,r){Ax.call(this,Ln,r,e)}atLeastOneSepFirstInternalRecord(e,r){Ax.call(this,Rn,r,e,dle)}manyInternalRecord(e,r){Ax.call(this,Pr,r,e)}manySepFirstInternalRecord(e,r){Ax.call(this,Tn,r,e,dle)}orInternalRecord(e,r){return zFe.call(this,e,r)}subruleInternalRecord(e,r,n){if(bE(r),!e||Bt(e,"ruleName")===!1){let l=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw l.KNOWN_RECORDER_ERROR=!0,l}let i=ma(this.recordingProdStack),a=e.ruleName,s=new on({idx:r,nonTerminalName:a,label:n?.LABEL,referencedRule:void 0});return i.definition.push(s),this.outputCst?$Fe:TE}consumeInternalRecord(e,r,n){if(bE(r),!hM(e)){let s=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}> - inside top level rule: <${this.recordingProdStack[0].name}>`);throw s.KNOWN_RECORDER_ERROR=!0,s}let i=ma(this.recordingProdStack),a=new Er({idx:r,terminalType:e,label:n?.LABEL});return i.definition.push(a),yle}};o(Ax,"recordProd");o(zFe,"recordOrProd");o(mle,"getIdxSuffix");o(bE,"assertMethodIdxIsValid")});var wE,xle=N(()=>{"use strict";qt();Hg();Us();wE=class{static{o(this,"PerformanceTracer")}initPerformanceTracer(e){if(Bt(e,"traceInitPerf")){let r=e.traceInitPerf,n=typeof r=="number";this.traceInitMaxIdent=n?r:1/0,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ds.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;let n=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <${e}>`);let{time:i,value:a}=hx(r),s=i>10?console.warn:console.log;return this.traceInitIndent time: ${i}ms`),this.traceInitIndent--,a}else return r()}}});function ble(t,e){e.forEach(r=>{let n=r.prototype;Object.getOwnPropertyNames(n).forEach(i=>{if(i==="constructor")return;let a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]})})}var Tle=N(()=>{"use strict";o(ble,"applyMixins")});function kE(t=void 0){return function(){return t}}var i1,ds,a1,Vi,_x,Dx,Us=N(()=>{"use strict";qt();Hg();Qse();bp();Qg();Yoe();EM();Joe();ole();lle();cle();ule();hle();fle();vle();xle();Tle();wx();i1=Wu(fo,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(i1);ds=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:qu,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),a1=Object.freeze({recoveryValueFunc:o(()=>{},"recoveryValueFunc"),resyncEnabled:!0});(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",t[t.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"})(Vi||(Vi={}));o(kE,"EMPTY_ALT");_x=class t{static{o(this,"Parser")}static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;let r=this.className;this.TRACE_INIT("toFastProps",()=>{fx(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),Ae(this.definedRulesNames,i=>{let s=this[i].originalGrammarAction,l;this.TRACE_INIT(`${i} Rule`,()=>{l=this.topLevelRuleRecord(i,s)}),this.gastProductionsCache[i]=l})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Woe({rules:br(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if(hr(n)&&this.skipValidations===!1){let i=qoe({rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),errMsgProvider:$l,grammarName:r}),a=Foe({lookaheadStrategy:this.lookaheadStrategy,rules:br(this.gastProductionsCache),tokenTypes:br(this.tokensMap),grammarName:r});this.definitionErrors=this.definitionErrors.concat(i,a)}}),hr(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{let i=Kse(br(this.gastProductionsCache));this.resyncFollows=i}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var i,a;(a=(i=this.lookaheadStrategy).initialize)===null||a===void 0||a.call(i,{rules:br(this.gastProductionsCache)}),this.preComputeLookaheadFunctions(br(this.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!hr(this.definitionErrors))throw e=Je(this.definitionErrors,i=>i.message),new Error(`Parser Definition Errors detected: - ${e.join(` -------------------------------- -`)}`)})}constructor(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;let n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),Bt(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. - Please use the flag on the relevant DSL method instead. - See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES - For further details.`);this.skipValidations=Bt(r,"skipValidations")?r.skipValidations:ds.skipValidations}};_x.DEFER_DEFINITION_ERRORS_HANDLING=!1;ble(_x,[aE,cE,dE,pE,gE,mE,yE,vE,xE,wE]);Dx=class extends _x{static{o(this,"EmbeddedActionsParser")}constructor(e,r=ds){let n=an(r);n.outputCst=!1,super(e,n)}}});var wle=N(()=>{"use strict";fs()});var kle=N(()=>{"use strict"});var Ele=N(()=>{"use strict";wle();kle()});var Sle=N(()=>{"use strict";JN()});var mf=N(()=>{"use strict";JN();Us();px();bp();t1();SM();Qg();n1();fM();fs();fs();Ele();Sle()});function wp(t,e,r){return`${t.name}_${e}_${r}`}function Dle(t){let e={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};YFe(e,t);let r=t.length;for(let n=0;nLle(t,e,s));return c1(t,e,n,r,...i)}function JFe(t,e,r){let n=aa(t,e,r,{type:gf});yf(t,n);let i=c1(t,e,n,r,kp(t,e,r));return e$e(t,e,r,i)}function kp(t,e,r){let n=Yr(Je(r.definition,i=>Lle(t,e,i)),i=>i!==void 0);return n.length===1?n[0]:n.length===0?void 0:r$e(t,n)}function Rle(t,e,r,n,i){let a=n.left,s=n.right,l=aa(t,e,r,{type:qFe});yf(t,l);let u=aa(t,e,r,{type:_le});return a.loopback=l,u.loopback=l,t.decisionMap[wp(e,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",r.idx)]=l,Di(s,l),i===void 0?(Di(l,a),Di(l,u)):(Di(l,u),Di(l,i.left),Di(i.right,a)),{left:a,right:u}}function Nle(t,e,r,n,i){let a=n.left,s=n.right,l=aa(t,e,r,{type:WFe});yf(t,l);let u=aa(t,e,r,{type:_le}),h=aa(t,e,r,{type:HFe});return l.loopback=h,u.loopback=h,Di(l,a),Di(l,u),Di(s,h),i!==void 0?(Di(h,u),Di(h,i.left),Di(i.right,a)):Di(h,l),t.decisionMap[wp(e,i?"RepetitionWithSeparator":"Repetition",r.idx)]=l,{left:l,right:u}}function e$e(t,e,r,n){let i=n.left,a=n.right;return Di(i,a),t.decisionMap[wp(e,"Option",r.idx)]=i,n}function yf(t,e){return t.decisionStates.push(e),e.decision=t.decisionStates.length-1,e.decision}function c1(t,e,r,n,...i){let a=aa(t,e,n,{type:UFe,start:r});r.end=a;for(let l of i)l!==void 0?(Di(r,l.left),Di(l.right,a)):Di(r,a);let s={left:r,right:a};return t.decisionMap[wp(e,t$e(n),n.idx)]=r,s}function t$e(t){if(t instanceof wn)return"Alternation";if(t instanceof ln)return"Option";if(t instanceof Pr)return"Repetition";if(t instanceof Tn)return"RepetitionWithSeparator";if(t instanceof Ln)return"RepetitionMandatory";if(t instanceof Rn)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}function r$e(t,e){let r=e.length;for(let a=0;a{"use strict";Um();fR();mf();o(wp,"buildATNKey");gf=1,VFe=2,Cle=4,Ale=5,l1=7,UFe=8,HFe=9,WFe=10,qFe=11,_le=12,Lx=class{static{o(this,"AbstractTransition")}constructor(e){this.target=e}isEpsilon(){return!1}},s1=class extends Lx{static{o(this,"AtomTransition")}constructor(e,r){super(e),this.tokenType=r}},Rx=class extends Lx{static{o(this,"EpsilonTransition")}constructor(e){super(e)}isEpsilon(){return!0}},o1=class extends Lx{static{o(this,"RuleTransition")}constructor(e,r,n){super(e),this.rule=r,this.followState=n}isEpsilon(){return!0}};o(Dle,"createATN");o(YFe,"createRuleStartAndStopATNStates");o(Lle,"atom");o(XFe,"repetition");o(jFe,"repetitionSep");o(KFe,"repetitionMandatory");o(QFe,"repetitionMandatorySep");o(ZFe,"alternation");o(JFe,"option");o(kp,"block");o(Rle,"plus");o(Nle,"star");o(e$e,"optional");o(yf,"defineDecisionState");o(c1,"makeAlts");o(t$e,"getProdType");o(r$e,"makeBlock");o(IM,"tokenRef");o(n$e,"ruleRef");o(i$e,"buildRuleHandle");o(Di,"epsilon");o(aa,"newState");o(OM,"addTransition");o(a$e,"removeState")});function PM(t,e=!0){return`${e?`a${t.alt}`:""}s${t.state.stateNumber}:${t.stack.map(r=>r.stateNumber.toString()).join("_")}`}var Nx,u1,Ile=N(()=>{"use strict";Um();Nx={},u1=class{static{o(this,"ATNConfigSet")}constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){let r=PM(e);r in this.map||(this.map[r]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return Je(this.configs,e=>e.alt)}get key(){let e="";for(let r in this.map)e+=r+":";return e}};o(PM,"getATNConfigKey")});function s$e(t,e){let r={};return n=>{let i=n.toString(),a=r[i];return a!==void 0||(a={atnStartState:t,decision:e,states:{}},r[i]=a),a}}function Ple(t,e=!0){let r=new Set;for(let n of t){let i=new Set;for(let a of n){if(a===void 0){if(e)break;return!1}let s=[a.tokenTypeIdx].concat(a.categoryMatches);for(let l of s)if(r.has(l)){if(!i.has(l))return!1}else r.add(l),i.add(l)}}return!0}function o$e(t){let e=t.decisionStates.length,r=Array(e);for(let n=0;nHu(i)).join(", "),r=t.production.idx===0?"":t.production.idx,n=`Ambiguous Alternatives Detected: <${t.ambiguityIndices.join(", ")}> in <${f$e(t.production)}${r}> inside <${t.topLevelRule.name}> Rule, -<${e}> may appears as a prefix path in all these alternatives. -`;return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES -For Further details.`,n}function f$e(t){if(t instanceof on)return"SUBRULE";if(t instanceof ln)return"OPTION";if(t instanceof wn)return"OR";if(t instanceof Ln)return"AT_LEAST_ONE";if(t instanceof Rn)return"AT_LEAST_ONE_SEP";if(t instanceof Tn)return"MANY_SEP";if(t instanceof Pr)return"MANY";if(t instanceof Er)return"CONSUME";throw Error("non exhaustive match")}function d$e(t,e,r){let n=ga(e.configs.elements,a=>a.state.transitions),i=die(n.filter(a=>a instanceof s1).map(a=>a.tokenType),a=>a.tokenTypeIdx);return{actualToken:r,possibleTokenTypes:i,tokenPath:t}}function p$e(t,e){return t.edges[e.tokenTypeIdx]}function m$e(t,e,r){let n=new u1,i=[];for(let s of t.elements){if(r.is(s.alt)===!1)continue;if(s.state.type===l1){i.push(s);continue}let l=s.state.transitions.length;for(let u=0;u0&&!b$e(a))for(let s of i)a.add(s);return a}function g$e(t,e){if(t instanceof s1&&gx(e,t.tokenType))return t.target}function y$e(t,e){let r;for(let n of t.elements)if(e.is(n.alt)===!0){if(r===void 0)r=n.alt;else if(r!==n.alt)return}return r}function Fle(t){return{configs:t,edges:{},isAcceptState:!1,prediction:-1}}function Ble(t,e,r,n){return n=$le(t,n),e.edges[r.tokenTypeIdx]=n,n}function $le(t,e){if(e===Nx)return e;let r=e.configs.key,n=t.states[r];return n!==void 0?n:(e.configs.finalize(),t.states[r]=e,e)}function v$e(t){let e=new u1,r=t.transitions.length;for(let n=0;n0){let i=[...t.stack],s={state:i.pop(),alt:t.alt,stack:i};SE(s,e)}else e.add(t);return}r.epsilonOnlyTransitions||e.add(t);let n=r.transitions.length;for(let i=0;i1)return!0;return!1}function S$e(t){for(let e of Array.from(t.values()))if(Object.keys(e).length===1)return!0;return!1}var EE,Ole,Mx,zle=N(()=>{"use strict";mf();Mle();Ile();bR();pR();pie();Um();Sw();ek();ak();ER();o(s$e,"createDFACache");EE=class{static{o(this,"PredicateSet")}constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,r){this.predicates[e]=r}toString(){let e="",r=this.predicates.length;for(let n=0;nconsole.log(n)}initialize(e){this.atn=Dle(e.rules),this.dfas=o$e(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){let{prodOccurrence:r,rule:n,hasPredicates:i,dynamicTokensEnabled:a}=e,s=this.dfas,l=this.logging,u=wp(n,"Alternation",r),f=this.atn.decisionMap[u].decision,d=Je(rE({maxLookahead:1,occurrence:r,prodType:"Alternation",rule:n}),p=>Je(p,m=>m[0]));if(Ple(d,!1)&&!a){let p=Xr(d,(m,g,y)=>(Ae(g,v=>{v&&(m[v.tokenTypeIdx]=y,Ae(v.categoryMatches,x=>{m[x]=y}))}),m),{});return i?function(m){var g;let y=this.LA(1),v=p[y.tokenTypeIdx];if(m!==void 0&&v!==void 0){let x=(g=m[v])===null||g===void 0?void 0:g.GATE;if(x!==void 0&&x.call(this)===!1)return}return v}:function(){let m=this.LA(1);return p[m.tokenTypeIdx]}}else return i?function(p){let m=new EE,g=p===void 0?0:p.length;for(let v=0;vJe(p,m=>m[0]));if(Ple(d)&&d[0][0]&&!a){let p=d[0],m=qr(p);if(m.length===1&&hr(m[0].categoryMatches)){let y=m[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===y}}else{let g=Xr(m,(y,v)=>(v!==void 0&&(y[v.tokenTypeIdx]=!0,Ae(v.categoryMatches,x=>{y[x]=!0})),y),{});return function(){let y=this.LA(1);return g[y.tokenTypeIdx]===!0}}}return function(){let p=BM.call(this,s,f,Ole,l);return typeof p=="object"?!1:p===0}}};o(Ple,"isLL1Sequence");o(o$e,"initATNSimulator");o(BM,"adaptivePredict");o(l$e,"performLookahead");o(c$e,"computeLookaheadTarget");o(u$e,"reportLookaheadAmbiguity");o(h$e,"buildAmbiguityError");o(f$e,"getProductionDslName");o(d$e,"buildAdaptivePredictError");o(p$e,"getExistingTargetState");o(m$e,"computeReachSet");o(g$e,"getReachableTarget");o(y$e,"getUniqueAlt");o(Fle,"newDFAState");o(Ble,"addDFAEdge");o($le,"addDFAState");o(v$e,"computeStartState");o(SE,"closure");o(x$e,"getEpsilonTarget");o(b$e,"hasConfigInRuleStopState");o(T$e,"allConfigsInRuleStopStates");o(w$e,"hasConflictTerminatingPrediction");o(k$e,"getConflictingAltSets");o(E$e,"hasConflictingAltSet");o(S$e,"hasStateAssociatedWithOneAlt")});var Gle=N(()=>{"use strict";zle()});var Vle,FM,Ule,CE,jr,Br,AE,Hle,$M,Wle,qle,Yle,Xle,zM,jle,Kle,Qle,_E,h1,f1,GM,d1,Zle,VM,UM,HM,WM,qM,Jle,ece,YM,tce,XM,Ix,rce,nce,ice,ace,sce,oce,lce,cce,DE,uce,hce,fce,dce,pce,mce,gce,yce,vce,xce,bce,LE,Tce,wce,kce,Ece,Sce,Cce,Ace,_ce,Dce,Lce,Rce,Nce,Mce,jM,KM,Ice,Oce,Pce,Bce,Fce,$ce,zce,Gce,Vce,QM,$e,ZM=N(()=>{"use strict";(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(Vle||(Vle={}));(function(t){function e(r){return typeof r=="string"}o(e,"is"),t.is=e})(FM||(FM={}));(function(t){t.MIN_VALUE=-2147483648,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(Ule||(Ule={}));(function(t){t.MIN_VALUE=0,t.MAX_VALUE=2147483647;function e(r){return typeof r=="number"&&t.MIN_VALUE<=r&&r<=t.MAX_VALUE}o(e,"is"),t.is=e})(CE||(CE={}));(function(t){function e(n,i){return n===Number.MAX_VALUE&&(n=CE.MAX_VALUE),i===Number.MAX_VALUE&&(i=CE.MAX_VALUE),{line:n,character:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&$e.uinteger(i.line)&&$e.uinteger(i.character)}o(r,"is"),t.is=r})(jr||(jr={}));(function(t){function e(n,i,a,s){if($e.uinteger(n)&&$e.uinteger(i)&&$e.uinteger(a)&&$e.uinteger(s))return{start:jr.create(n,i),end:jr.create(a,s)};if(jr.is(n)&&jr.is(i))return{start:n,end:i};throw new Error(`Range#create called with invalid arguments[${n}, ${i}, ${a}, ${s}]`)}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&jr.is(i.start)&&jr.is(i.end)}o(r,"is"),t.is=r})(Br||(Br={}));(function(t){function e(n,i){return{uri:n,range:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&Br.is(i.range)&&($e.string(i.uri)||$e.undefined(i.uri))}o(r,"is"),t.is=r})(AE||(AE={}));(function(t){function e(n,i,a,s){return{targetUri:n,targetRange:i,targetSelectionRange:a,originSelectionRange:s}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&Br.is(i.targetRange)&&$e.string(i.targetUri)&&Br.is(i.targetSelectionRange)&&(Br.is(i.originSelectionRange)||$e.undefined(i.originSelectionRange))}o(r,"is"),t.is=r})(Hle||(Hle={}));(function(t){function e(n,i,a,s){return{red:n,green:i,blue:a,alpha:s}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&$e.numberRange(i.red,0,1)&&$e.numberRange(i.green,0,1)&&$e.numberRange(i.blue,0,1)&&$e.numberRange(i.alpha,0,1)}o(r,"is"),t.is=r})($M||($M={}));(function(t){function e(n,i){return{range:n,color:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&Br.is(i.range)&&$M.is(i.color)}o(r,"is"),t.is=r})(Wle||(Wle={}));(function(t){function e(n,i,a){return{label:n,textEdit:i,additionalTextEdits:a}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&$e.string(i.label)&&($e.undefined(i.textEdit)||f1.is(i))&&($e.undefined(i.additionalTextEdits)||$e.typedArray(i.additionalTextEdits,f1.is))}o(r,"is"),t.is=r})(qle||(qle={}));(function(t){t.Comment="comment",t.Imports="imports",t.Region="region"})(Yle||(Yle={}));(function(t){function e(n,i,a,s,l,u){let h={startLine:n,endLine:i};return $e.defined(a)&&(h.startCharacter=a),$e.defined(s)&&(h.endCharacter=s),$e.defined(l)&&(h.kind=l),$e.defined(u)&&(h.collapsedText=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&$e.uinteger(i.startLine)&&$e.uinteger(i.startLine)&&($e.undefined(i.startCharacter)||$e.uinteger(i.startCharacter))&&($e.undefined(i.endCharacter)||$e.uinteger(i.endCharacter))&&($e.undefined(i.kind)||$e.string(i.kind))}o(r,"is"),t.is=r})(Xle||(Xle={}));(function(t){function e(n,i){return{location:n,message:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&AE.is(i.location)&&$e.string(i.message)}o(r,"is"),t.is=r})(zM||(zM={}));(function(t){t.Error=1,t.Warning=2,t.Information=3,t.Hint=4})(jle||(jle={}));(function(t){t.Unnecessary=1,t.Deprecated=2})(Kle||(Kle={}));(function(t){function e(r){let n=r;return $e.objectLiteral(n)&&$e.string(n.href)}o(e,"is"),t.is=e})(Qle||(Qle={}));(function(t){function e(n,i,a,s,l,u){let h={range:n,message:i};return $e.defined(a)&&(h.severity=a),$e.defined(s)&&(h.code=s),$e.defined(l)&&(h.source=l),$e.defined(u)&&(h.relatedInformation=u),h}o(e,"create"),t.create=e;function r(n){var i;let a=n;return $e.defined(a)&&Br.is(a.range)&&$e.string(a.message)&&($e.number(a.severity)||$e.undefined(a.severity))&&($e.integer(a.code)||$e.string(a.code)||$e.undefined(a.code))&&($e.undefined(a.codeDescription)||$e.string((i=a.codeDescription)===null||i===void 0?void 0:i.href))&&($e.string(a.source)||$e.undefined(a.source))&&($e.undefined(a.relatedInformation)||$e.typedArray(a.relatedInformation,zM.is))}o(r,"is"),t.is=r})(_E||(_E={}));(function(t){function e(n,i,...a){let s={title:n,command:i};return $e.defined(a)&&a.length>0&&(s.arguments=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.string(i.title)&&$e.string(i.command)}o(r,"is"),t.is=r})(h1||(h1={}));(function(t){function e(a,s){return{range:a,newText:s}}o(e,"replace"),t.replace=e;function r(a,s){return{range:{start:a,end:a},newText:s}}o(r,"insert"),t.insert=r;function n(a){return{range:a,newText:""}}o(n,"del"),t.del=n;function i(a){let s=a;return $e.objectLiteral(s)&&$e.string(s.newText)&&Br.is(s.range)}o(i,"is"),t.is=i})(f1||(f1={}));(function(t){function e(n,i,a){let s={label:n};return i!==void 0&&(s.needsConfirmation=i),a!==void 0&&(s.description=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&$e.string(i.label)&&($e.boolean(i.needsConfirmation)||i.needsConfirmation===void 0)&&($e.string(i.description)||i.description===void 0)}o(r,"is"),t.is=r})(GM||(GM={}));(function(t){function e(r){let n=r;return $e.string(n)}o(e,"is"),t.is=e})(d1||(d1={}));(function(t){function e(a,s,l){return{range:a,newText:s,annotationId:l}}o(e,"replace"),t.replace=e;function r(a,s,l){return{range:{start:a,end:a},newText:s,annotationId:l}}o(r,"insert"),t.insert=r;function n(a,s){return{range:a,newText:"",annotationId:s}}o(n,"del"),t.del=n;function i(a){let s=a;return f1.is(s)&&(GM.is(s.annotationId)||d1.is(s.annotationId))}o(i,"is"),t.is=i})(Zle||(Zle={}));(function(t){function e(n,i){return{textDocument:n,edits:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&YM.is(i.textDocument)&&Array.isArray(i.edits)}o(r,"is"),t.is=r})(VM||(VM={}));(function(t){function e(n,i,a){let s={kind:"create",uri:n};return i!==void 0&&(i.overwrite!==void 0||i.ignoreIfExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="create"&&$e.string(i.uri)&&(i.options===void 0||(i.options.overwrite===void 0||$e.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||$e.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||d1.is(i.annotationId))}o(r,"is"),t.is=r})(UM||(UM={}));(function(t){function e(n,i,a,s){let l={kind:"rename",oldUri:n,newUri:i};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(l.options=a),s!==void 0&&(l.annotationId=s),l}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="rename"&&$e.string(i.oldUri)&&$e.string(i.newUri)&&(i.options===void 0||(i.options.overwrite===void 0||$e.boolean(i.options.overwrite))&&(i.options.ignoreIfExists===void 0||$e.boolean(i.options.ignoreIfExists)))&&(i.annotationId===void 0||d1.is(i.annotationId))}o(r,"is"),t.is=r})(HM||(HM={}));(function(t){function e(n,i,a){let s={kind:"delete",uri:n};return i!==void 0&&(i.recursive!==void 0||i.ignoreIfNotExists!==void 0)&&(s.options=i),a!==void 0&&(s.annotationId=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&i.kind==="delete"&&$e.string(i.uri)&&(i.options===void 0||(i.options.recursive===void 0||$e.boolean(i.options.recursive))&&(i.options.ignoreIfNotExists===void 0||$e.boolean(i.options.ignoreIfNotExists)))&&(i.annotationId===void 0||d1.is(i.annotationId))}o(r,"is"),t.is=r})(WM||(WM={}));(function(t){function e(r){let n=r;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(i=>$e.string(i.kind)?UM.is(i)||HM.is(i)||WM.is(i):VM.is(i)))}o(e,"is"),t.is=e})(qM||(qM={}));(function(t){function e(n){return{uri:n}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.string(i.uri)}o(r,"is"),t.is=r})(Jle||(Jle={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.string(i.uri)&&$e.integer(i.version)}o(r,"is"),t.is=r})(ece||(ece={}));(function(t){function e(n,i){return{uri:n,version:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.string(i.uri)&&(i.version===null||$e.integer(i.version))}o(r,"is"),t.is=r})(YM||(YM={}));(function(t){function e(n,i,a,s){return{uri:n,languageId:i,version:a,text:s}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.string(i.uri)&&$e.string(i.languageId)&&$e.integer(i.version)&&$e.string(i.text)}o(r,"is"),t.is=r})(tce||(tce={}));(function(t){t.PlainText="plaintext",t.Markdown="markdown";function e(r){let n=r;return n===t.PlainText||n===t.Markdown}o(e,"is"),t.is=e})(XM||(XM={}));(function(t){function e(r){let n=r;return $e.objectLiteral(r)&&XM.is(n.kind)&&$e.string(n.value)}o(e,"is"),t.is=e})(Ix||(Ix={}));(function(t){t.Text=1,t.Method=2,t.Function=3,t.Constructor=4,t.Field=5,t.Variable=6,t.Class=7,t.Interface=8,t.Module=9,t.Property=10,t.Unit=11,t.Value=12,t.Enum=13,t.Keyword=14,t.Snippet=15,t.Color=16,t.File=17,t.Reference=18,t.Folder=19,t.EnumMember=20,t.Constant=21,t.Struct=22,t.Event=23,t.Operator=24,t.TypeParameter=25})(rce||(rce={}));(function(t){t.PlainText=1,t.Snippet=2})(nce||(nce={}));(function(t){t.Deprecated=1})(ice||(ice={}));(function(t){function e(n,i,a){return{newText:n,insert:i,replace:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i&&$e.string(i.newText)&&Br.is(i.insert)&&Br.is(i.replace)}o(r,"is"),t.is=r})(ace||(ace={}));(function(t){t.asIs=1,t.adjustIndentation=2})(sce||(sce={}));(function(t){function e(r){let n=r;return n&&($e.string(n.detail)||n.detail===void 0)&&($e.string(n.description)||n.description===void 0)}o(e,"is"),t.is=e})(oce||(oce={}));(function(t){function e(r){return{label:r}}o(e,"create"),t.create=e})(lce||(lce={}));(function(t){function e(r,n){return{items:r||[],isIncomplete:!!n}}o(e,"create"),t.create=e})(cce||(cce={}));(function(t){function e(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}o(e,"fromPlainText"),t.fromPlainText=e;function r(n){let i=n;return $e.string(i)||$e.objectLiteral(i)&&$e.string(i.language)&&$e.string(i.value)}o(r,"is"),t.is=r})(DE||(DE={}));(function(t){function e(r){let n=r;return!!n&&$e.objectLiteral(n)&&(Ix.is(n.contents)||DE.is(n.contents)||$e.typedArray(n.contents,DE.is))&&(r.range===void 0||Br.is(r.range))}o(e,"is"),t.is=e})(uce||(uce={}));(function(t){function e(r,n){return n?{label:r,documentation:n}:{label:r}}o(e,"create"),t.create=e})(hce||(hce={}));(function(t){function e(r,n,...i){let a={label:r};return $e.defined(n)&&(a.documentation=n),$e.defined(i)?a.parameters=i:a.parameters=[],a}o(e,"create"),t.create=e})(fce||(fce={}));(function(t){t.Text=1,t.Read=2,t.Write=3})(dce||(dce={}));(function(t){function e(r,n){let i={range:r};return $e.number(n)&&(i.kind=n),i}o(e,"create"),t.create=e})(pce||(pce={}));(function(t){t.File=1,t.Module=2,t.Namespace=3,t.Package=4,t.Class=5,t.Method=6,t.Property=7,t.Field=8,t.Constructor=9,t.Enum=10,t.Interface=11,t.Function=12,t.Variable=13,t.Constant=14,t.String=15,t.Number=16,t.Boolean=17,t.Array=18,t.Object=19,t.Key=20,t.Null=21,t.EnumMember=22,t.Struct=23,t.Event=24,t.Operator=25,t.TypeParameter=26})(mce||(mce={}));(function(t){t.Deprecated=1})(gce||(gce={}));(function(t){function e(r,n,i,a,s){let l={name:r,kind:n,location:{uri:a,range:i}};return s&&(l.containerName=s),l}o(e,"create"),t.create=e})(yce||(yce={}));(function(t){function e(r,n,i,a){return a!==void 0?{name:r,kind:n,location:{uri:i,range:a}}:{name:r,kind:n,location:{uri:i}}}o(e,"create"),t.create=e})(vce||(vce={}));(function(t){function e(n,i,a,s,l,u){let h={name:n,detail:i,kind:a,range:s,selectionRange:l};return u!==void 0&&(h.children=u),h}o(e,"create"),t.create=e;function r(n){let i=n;return i&&$e.string(i.name)&&$e.number(i.kind)&&Br.is(i.range)&&Br.is(i.selectionRange)&&(i.detail===void 0||$e.string(i.detail))&&(i.deprecated===void 0||$e.boolean(i.deprecated))&&(i.children===void 0||Array.isArray(i.children))&&(i.tags===void 0||Array.isArray(i.tags))}o(r,"is"),t.is=r})(xce||(xce={}));(function(t){t.Empty="",t.QuickFix="quickfix",t.Refactor="refactor",t.RefactorExtract="refactor.extract",t.RefactorInline="refactor.inline",t.RefactorRewrite="refactor.rewrite",t.Source="source",t.SourceOrganizeImports="source.organizeImports",t.SourceFixAll="source.fixAll"})(bce||(bce={}));(function(t){t.Invoked=1,t.Automatic=2})(LE||(LE={}));(function(t){function e(n,i,a){let s={diagnostics:n};return i!=null&&(s.only=i),a!=null&&(s.triggerKind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.typedArray(i.diagnostics,_E.is)&&(i.only===void 0||$e.typedArray(i.only,$e.string))&&(i.triggerKind===void 0||i.triggerKind===LE.Invoked||i.triggerKind===LE.Automatic)}o(r,"is"),t.is=r})(Tce||(Tce={}));(function(t){function e(n,i,a){let s={title:n},l=!0;return typeof i=="string"?(l=!1,s.kind=i):h1.is(i)?s.command=i:s.edit=i,l&&a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return i&&$e.string(i.title)&&(i.diagnostics===void 0||$e.typedArray(i.diagnostics,_E.is))&&(i.kind===void 0||$e.string(i.kind))&&(i.edit!==void 0||i.command!==void 0)&&(i.command===void 0||h1.is(i.command))&&(i.isPreferred===void 0||$e.boolean(i.isPreferred))&&(i.edit===void 0||qM.is(i.edit))}o(r,"is"),t.is=r})(wce||(wce={}));(function(t){function e(n,i){let a={range:n};return $e.defined(i)&&(a.data=i),a}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&Br.is(i.range)&&($e.undefined(i.command)||h1.is(i.command))}o(r,"is"),t.is=r})(kce||(kce={}));(function(t){function e(n,i){return{tabSize:n,insertSpaces:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&$e.uinteger(i.tabSize)&&$e.boolean(i.insertSpaces)}o(r,"is"),t.is=r})(Ece||(Ece={}));(function(t){function e(n,i,a){return{range:n,target:i,data:a}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&Br.is(i.range)&&($e.undefined(i.target)||$e.string(i.target))}o(r,"is"),t.is=r})(Sce||(Sce={}));(function(t){function e(n,i){return{range:n,parent:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&Br.is(i.range)&&(i.parent===void 0||t.is(i.parent))}o(r,"is"),t.is=r})(Cce||(Cce={}));(function(t){t.namespace="namespace",t.type="type",t.class="class",t.enum="enum",t.interface="interface",t.struct="struct",t.typeParameter="typeParameter",t.parameter="parameter",t.variable="variable",t.property="property",t.enumMember="enumMember",t.event="event",t.function="function",t.method="method",t.macro="macro",t.keyword="keyword",t.modifier="modifier",t.comment="comment",t.string="string",t.number="number",t.regexp="regexp",t.operator="operator",t.decorator="decorator"})(Ace||(Ace={}));(function(t){t.declaration="declaration",t.definition="definition",t.readonly="readonly",t.static="static",t.deprecated="deprecated",t.abstract="abstract",t.async="async",t.modification="modification",t.documentation="documentation",t.defaultLibrary="defaultLibrary"})(_ce||(_ce={}));(function(t){function e(r){let n=r;return $e.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}o(e,"is"),t.is=e})(Dce||(Dce={}));(function(t){function e(n,i){return{range:n,text:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Br.is(i.range)&&$e.string(i.text)}o(r,"is"),t.is=r})(Lce||(Lce={}));(function(t){function e(n,i,a){return{range:n,variableName:i,caseSensitiveLookup:a}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Br.is(i.range)&&$e.boolean(i.caseSensitiveLookup)&&($e.string(i.variableName)||i.variableName===void 0)}o(r,"is"),t.is=r})(Rce||(Rce={}));(function(t){function e(n,i){return{range:n,expression:i}}o(e,"create"),t.create=e;function r(n){let i=n;return i!=null&&Br.is(i.range)&&($e.string(i.expression)||i.expression===void 0)}o(r,"is"),t.is=r})(Nce||(Nce={}));(function(t){function e(n,i){return{frameId:n,stoppedLocation:i}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.defined(i)&&Br.is(n.stoppedLocation)}o(r,"is"),t.is=r})(Mce||(Mce={}));(function(t){t.Type=1,t.Parameter=2;function e(r){return r===1||r===2}o(e,"is"),t.is=e})(jM||(jM={}));(function(t){function e(n){return{value:n}}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&(i.tooltip===void 0||$e.string(i.tooltip)||Ix.is(i.tooltip))&&(i.location===void 0||AE.is(i.location))&&(i.command===void 0||h1.is(i.command))}o(r,"is"),t.is=r})(KM||(KM={}));(function(t){function e(n,i,a){let s={position:n,label:i};return a!==void 0&&(s.kind=a),s}o(e,"create"),t.create=e;function r(n){let i=n;return $e.objectLiteral(i)&&jr.is(i.position)&&($e.string(i.label)||$e.typedArray(i.label,KM.is))&&(i.kind===void 0||jM.is(i.kind))&&i.textEdits===void 0||$e.typedArray(i.textEdits,f1.is)&&(i.tooltip===void 0||$e.string(i.tooltip)||Ix.is(i.tooltip))&&(i.paddingLeft===void 0||$e.boolean(i.paddingLeft))&&(i.paddingRight===void 0||$e.boolean(i.paddingRight))}o(r,"is"),t.is=r})(Ice||(Ice={}));(function(t){function e(r){return{kind:"snippet",value:r}}o(e,"createSnippet"),t.createSnippet=e})(Oce||(Oce={}));(function(t){function e(r,n,i,a){return{insertText:r,filterText:n,range:i,command:a}}o(e,"create"),t.create=e})(Pce||(Pce={}));(function(t){function e(r){return{items:r}}o(e,"create"),t.create=e})(Bce||(Bce={}));(function(t){t.Invoked=0,t.Automatic=1})(Fce||(Fce={}));(function(t){function e(r,n){return{range:r,text:n}}o(e,"create"),t.create=e})($ce||($ce={}));(function(t){function e(r,n){return{triggerKind:r,selectedCompletionInfo:n}}o(e,"create"),t.create=e})(zce||(zce={}));(function(t){function e(r){let n=r;return $e.objectLiteral(n)&&FM.is(n.uri)&&$e.string(n.name)}o(e,"is"),t.is=e})(Gce||(Gce={}));(function(t){function e(a,s,l,u){return new QM(a,s,l,u)}o(e,"create"),t.create=e;function r(a){let s=a;return!!($e.defined(s)&&$e.string(s.uri)&&($e.undefined(s.languageId)||$e.string(s.languageId))&&$e.uinteger(s.lineCount)&&$e.func(s.getText)&&$e.func(s.positionAt)&&$e.func(s.offsetAt))}o(r,"is"),t.is=r;function n(a,s){let l=a.getText(),u=i(s,(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),h=l.length;for(let f=u.length-1;f>=0;f--){let d=u[f],p=a.offsetAt(d.range.start),m=a.offsetAt(d.range.end);if(m<=h)l=l.substring(0,p)+d.newText+l.substring(m,l.length);else throw new Error("Overlapping edit");h=p}return l}o(n,"applyEdits"),t.applyEdits=n;function i(a,s){if(a.length<=1)return a;let l=a.length/2|0,u=a.slice(0,l),h=a.slice(l);i(u,s),i(h,s);let f=0,d=0,p=0;for(;f0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),n=0,i=r.length;if(i===0)return jr.create(0,e);for(;ne?i=s:n=s+1}let a=n-1;return jr.create(a,e-r[a])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line],i=e.line+1"u"}o(n,"undefined"),t.undefined=n;function i(m){return m===!0||m===!1}o(i,"boolean"),t.boolean=i;function a(m){return e.call(m)==="[object String]"}o(a,"string"),t.string=a;function s(m){return e.call(m)==="[object Number]"}o(s,"number"),t.number=s;function l(m,g,y){return e.call(m)==="[object Number]"&&g<=m&&m<=y}o(l,"numberRange"),t.numberRange=l;function u(m){return e.call(m)==="[object Number]"&&-2147483648<=m&&m<=2147483647}o(u,"integer"),t.integer=u;function h(m){return e.call(m)==="[object Number]"&&0<=m&&m<=2147483647}o(h,"uinteger"),t.uinteger=h;function f(m){return e.call(m)==="[object Function]"}o(f,"func"),t.func=f;function d(m){return m!==null&&typeof m=="object"}o(d,"objectLiteral"),t.objectLiteral=d;function p(m,g){return Array.isArray(m)&&m.every(g)}o(p,"typedArray"),t.typedArray=p})($e||($e={}))});var Ox,Px,Ep,Sp,JM,p1,RE=N(()=>{"use strict";ZM();Ol();Ox=class{static{o(this,"CstNodeBuilder")}constructor(){this.nodeStack=[]}get current(){var e;return(e=this.nodeStack[this.nodeStack.length-1])!==null&&e!==void 0?e:this.rootNode}buildRootNode(e){return this.rootNode=new p1(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){let r=new Sp;return r.grammarSource=e,r.root=this.rootNode,this.current.content.push(r),this.nodeStack.push(r),r}buildLeafNode(e,r){let n=new Ep(e.startOffset,e.image.length,Km(e),e.tokenType,!r);return n.grammarSource=r,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){let r=e.container;if(r){let n=r.content.indexOf(e);n>=0&&r.content.splice(n,1)}}addHiddenNodes(e){let r=[];for(let a of e){let s=new Ep(a.startOffset,a.image.length,Km(a),a.tokenType,!0);s.root=this.rootNode,r.push(s)}let n=this.current,i=!1;if(n.content.length>0){n.content.push(...r);return}for(;n.container;){let a=n.container.content.indexOf(n);if(a>0){n.container.content.splice(a,0,...r),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...r)}construct(e){let r=this.current;typeof e.$type=="string"&&(this.current.astNode=e),e.$cstNode=r;let n=this.nodeStack.pop();n?.content.length===0&&this.removeNode(n)}},Px=class{static{o(this,"AbstractCstNode")}get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,r;let n=typeof((e=this._astNode)===null||e===void 0?void 0:e.$type)=="string"?this._astNode:(r=this.container)===null||r===void 0?void 0:r.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}},Ep=class extends Px{static{o(this,"LeafCstNodeImpl")}get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,r,n,i,a=!1){super(),this._hidden=a,this._offset=e,this._tokenType=i,this._length=r,this._range=n}},Sp=class extends Px{static{o(this,"CompositeCstNodeImpl")}constructor(){super(...arguments),this.content=new JM(this)}get children(){return this.content}get offset(){var e,r;return(r=(e=this.firstNonHiddenNode)===null||e===void 0?void 0:e.offset)!==null&&r!==void 0?r:0}get length(){return this.end-this.offset}get end(){var e,r;return(r=(e=this.lastNonHiddenNode)===null||e===void 0?void 0:e.end)!==null&&r!==void 0?r:0}get range(){let e=this.firstNonHiddenNode,r=this.lastNonHiddenNode;if(e&&r){if(this._rangeCache===void 0){let{range:n}=e,{range:i}=r;this._rangeCache={start:n.start,end:i.end.line=0;e--){let r=this.content[e];if(!r.hidden)return r}return this.content[this.content.length-1]}},JM=class t extends Array{static{o(this,"CstNodeContainer")}constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,t.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,r,...n){return this.addParents(n),super.splice(e,r,...n)}addParents(e){for(let r of e)r.container=this.parent}},p1=class extends Sp{static{o(this,"RootCstNodeImpl")}get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=e??""}}});function eI(t){return t.$type===NE}var NE,Uce,Hce,Bx,Fx,ME,m1,$x,C$e,tI,zx=N(()=>{"use strict";mf();Gle();Pc();Fl();cs();RE();NE=Symbol("Datatype");o(eI,"isDataTypeNode");Uce="\u200B",Hce=o(t=>t.endsWith(Uce)?t:t+Uce,"withRuleSuffix"),Bx=class{static{o(this,"AbstractLangiumParser")}constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;let r=this.lexer.definition,n=e.LanguageMetaData.mode==="production";this.wrapper=new tI(r,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,r){this.wrapper.wrapOr(e,r)}optional(e,r){this.wrapper.wrapOption(e,r)}many(e,r){this.wrapper.wrapMany(e,r)}atLeastOne(e,r){this.wrapper.wrapAtLeastOne(e,r)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}},Fx=class extends Bx{static{o(this,"LangiumParser")}get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new Ox,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,r){let n=this.computeRuleType(e),i=this.wrapper.DEFINE_RULE(Hce(e.name),this.startImplementation(n,r).bind(this));return this.allRules.set(e.name,i),e.entry&&(this.mainRule=i),i}computeRuleType(e){if(!e.fragment){if(lx(e))return NE;{let r=zg(e);return r??e.name}}}parse(e,r={}){this.nodeBuilder.buildRootNode(e);let n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;let i=r.rule?this.allRules.get(r.rule):this.mainRule;if(!i)throw new Error(r.rule?`No rule found with name '${r.rule}'`:"No main rule available.");let a=i.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:a,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,r){return n=>{let i=!this.isRecording()&&e!==void 0;if(i){let s={$type:e};this.stack.push(s),e===NE&&(s.value="")}let a;try{a=r(n)}catch{a=void 0}return a===void 0&&i&&(a=this.construct()),a}}extractHiddenTokens(e){let r=this.lexerResult.hidden;if(!r.length)return[];let n=e.startOffset;for(let i=0;in)return r.splice(0,i);return r.splice(0,r.length)}consume(e,r,n){let i=this.wrapper.wrapConsume(e,r);if(!this.isRecording()&&this.isValidToken(i)){let a=this.extractHiddenTokens(i);this.nodeBuilder.addHiddenNodes(a);let s=this.nodeBuilder.buildLeafNode(i,n),{assignment:l,isCrossRef:u}=this.getAssignment(n),h=this.current;if(l){let f=Xo(n)?i.image:this.converter.convert(i.image,s);this.assign(l.operator,l.feature,f,s,u)}else if(eI(h)){let f=i.image;Xo(n)||(f=this.converter.convert(f,s).toString()),h.value+=f}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&typeof e.endOffset=="number"&&!isNaN(e.endOffset)}subrule(e,r,n,i,a){let s;!this.isRecording()&&!n&&(s=this.nodeBuilder.buildCompositeNode(i));let l=this.wrapper.wrapSubrule(e,r,a);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(l,i,s)}performSubruleAssignment(e,r,n){let{assignment:i,isCrossRef:a}=this.getAssignment(r);if(i)this.assign(i.operator,i.feature,e,n,a);else if(!i){let s=this.current;if(eI(s))s.value+=e.toString();else if(typeof e=="object"&&e){let u=this.assignWithoutOverride(e,s);this.stack.pop(),this.stack.push(u)}}}action(e,r){if(!this.isRecording()){let n=this.current;if(r.feature&&r.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode),this.nodeBuilder.buildCompositeNode(r).content.push(n.$cstNode);let a={$type:e};this.stack.push(a),this.assign(r.operator,r.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;let e=this.current;return Mk(e),this.nodeBuilder.construct(e),this.stack.pop(),eI(e)?this.converter.convert(e.value,e.$cstNode):(RN(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){let r=hp(e,Pl);this.assignmentMap.set(e,{assignment:r,isCrossRef:r?up(r.terminal):!1})}return this.assignmentMap.get(e)}assign(e,r,n,i,a){let s=this.current,l;switch(a&&typeof n=="string"?l=this.linker.buildReference(s,r,i,n):l=n,e){case"=":{s[r]=l;break}case"?=":{s[r]=!0;break}case"+=":Array.isArray(s[r])||(s[r]=[]),s[r].push(l)}}assignWithoutOverride(e,r){for(let[i,a]of Object.entries(r)){let s=e[i];s===void 0?e[i]=a:Array.isArray(s)&&Array.isArray(a)&&(a.push(...s),e[i]=a)}let n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}},ME=class{static{o(this,"AbstractParserErrorMessageProvider")}buildMismatchTokenMessage(e){return qu.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return qu.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return qu.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return qu.buildEarlyExitMessage(e)}},m1=class extends ME{static{o(this,"LangiumParserErrorMessageProvider")}buildMismatchTokenMessage({expected:e,actual:r}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${r.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}},$x=class extends Bx{static{o(this,"LangiumCompletionParser")}constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();let r=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=r.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,r){let n=this.wrapper.DEFINE_RULE(Hce(e.name),this.startImplementation(r).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return r=>{let n=this.keepStackSize();try{e(r)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){let e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,r,n){this.wrapper.wrapConsume(e,r),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,r,n,i,a){this.before(i),this.wrapper.wrapSubrule(e,r,a),this.after(i)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){let r=this.elementStack.lastIndexOf(e);r>=0&&this.elementStack.splice(r)}}get currIdx(){return this.wrapper.currIdx}},C$e={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new m1},tI=class extends Dx{static{o(this,"ChevrotainWrapper")}constructor(e,r){let n=r&&"maxLookahead"in r;super(e,Object.assign(Object.assign(Object.assign({},C$e),{lookaheadStrategy:n?new Yu({maxLookahead:r.maxLookahead}):new Mx({logging:r.skipValidations?()=>{}:void 0})}),r))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,r){return this.RULE(e,r)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,r){return this.consume(e,r)}wrapSubrule(e,r,n){return this.subrule(e,r,{ARGS:[n]})}wrapOr(e,r){this.or(e,r)}wrapOption(e,r){this.option(e,r)}wrapMany(e,r){this.many(e,r)}wrapAtLeastOne(e,r){this.atLeastOne(e,r)}}});function Gx(t,e,r){return A$e({parser:e,tokens:r,ruleNames:new Map},t),e}function A$e(t,e){let r=sx(e,!1),n=en(e.rules).filter(Fa).filter(i=>r.has(i));for(let i of n){let a=Object.assign(Object.assign({},t),{consume:1,optional:1,subrule:1,many:1,or:1});t.parser.rule(i,Cp(a,i.definition))}}function Cp(t,e,r=!1){let n;if(Xo(e))n=I$e(t,e);else if($u(e))n=_$e(t,e);else if(Pl(e))n=Cp(t,e.terminal);else if(up(e))n=Wce(t,e);else if(Bl(e))n=D$e(t,e);else if(Lk(e))n=R$e(t,e);else if(Nk(e))n=N$e(t,e);else if(ff(e))n=M$e(t,e);else if(wN(e)){let i=t.consume++;n=o(()=>t.parser.consume(i,fo,e),"method")}else throw new lp(e.$cstNode,`Unexpected element type: ${e.$type}`);return qce(t,r?void 0:IE(e),n,e.cardinality)}function _$e(t,e){let r=cx(e);return()=>t.parser.action(r,e)}function D$e(t,e){let r=e.rule.ref;if(Fa(r)){let n=t.subrule++,i=r.fragment,a=e.arguments.length>0?L$e(r,e.arguments):()=>({});return s=>t.parser.subrule(n,Yce(t,r),i,e,a(s))}else if(uo(r)){let n=t.consume++,i=rI(t,r.name);return()=>t.parser.consume(n,i,e)}else if(r)Oc(r);else throw new lp(e.$cstNode,`Undefined rule: ${e.rule.$refText}`)}function L$e(t,e){let r=e.map(n=>Xu(n.value));return n=>{let i={};for(let a=0;ae(n)||r(n)}else if(pN(t)){let e=Xu(t.left),r=Xu(t.right);return n=>e(n)&&r(n)}else if(gN(t)){let e=Xu(t.value);return r=>!e(r)}else if(yN(t)){let e=t.parameter.ref.name;return r=>r!==void 0&&r[e]===!0}else if(dN(t)){let e=!!t.true;return()=>e}Oc(t)}function R$e(t,e){if(e.elements.length===1)return Cp(t,e.elements[0]);{let r=[];for(let i of e.elements){let a={ALT:Cp(t,i,!0)},s=IE(i);s&&(a.GATE=Xu(s)),r.push(a)}let n=t.or++;return i=>t.parser.alternatives(n,r.map(a=>{let s={ALT:o(()=>a.ALT(i),"ALT")},l=a.GATE;return l&&(s.GATE=()=>l(i)),s}))}}function N$e(t,e){if(e.elements.length===1)return Cp(t,e.elements[0]);let r=[];for(let l of e.elements){let u={ALT:Cp(t,l,!0)},h=IE(l);h&&(u.GATE=Xu(h)),r.push(u)}let n=t.or++,i=o((l,u)=>{let h=u.getRuleStack().join("-");return`uGroup_${l}_${h}`},"idFunc"),a=o(l=>t.parser.alternatives(n,r.map((u,h)=>{let f={ALT:o(()=>!0,"ALT")},d=t.parser;f.ALT=()=>{if(u.ALT(l),!d.isRecording()){let m=i(n,d);d.unorderedGroups.get(m)||d.unorderedGroups.set(m,[]);let g=d.unorderedGroups.get(m);typeof g?.[h]>"u"&&(g[h]=!0)}};let p=u.GATE;return p?f.GATE=()=>p(l):f.GATE=()=>{let m=d.unorderedGroups.get(i(n,d));return!m?.[h]},f})),"alternatives"),s=qce(t,IE(e),a,"*");return l=>{s(l),t.parser.isRecording()||t.parser.unorderedGroups.delete(i(n,t.parser))}}function M$e(t,e){let r=e.elements.map(n=>Cp(t,n));return n=>r.forEach(i=>i(n))}function IE(t){if(ff(t))return t.guardCondition}function Wce(t,e,r=e.terminal){if(r)if(Bl(r)&&Fa(r.rule.ref)){let n=r.rule.ref,i=t.subrule++;return a=>t.parser.subrule(i,Yce(t,n),!1,e,a)}else if(Bl(r)&&uo(r.rule.ref)){let n=t.consume++,i=rI(t,r.rule.ref.name);return()=>t.parser.consume(n,i,e)}else if(Xo(r)){let n=t.consume++,i=rI(t,r.value);return()=>t.parser.consume(n,i,e)}else throw new Error("Could not build cross reference parser");else{if(!e.type.ref)throw new Error("Could not resolve reference to type: "+e.type.$refText);let n=Fk(e.type.ref),i=n?.terminal;if(!i)throw new Error("Could not find name assignment for type: "+cx(e.type.ref));return Wce(t,e,i)}}function I$e(t,e){let r=t.consume++,n=t.tokens[e.value];if(!n)throw new Error("Could not find token for keyword: "+e.value);return()=>t.parser.consume(r,n,e)}function qce(t,e,r,n){let i=e&&Xu(e);if(!n)if(i){let a=t.or++;return s=>t.parser.alternatives(a,[{ALT:o(()=>r(s),"ALT"),GATE:o(()=>i(s),"GATE")},{ALT:kE(),GATE:o(()=>!i(s),"GATE")}])}else return r;if(n==="*"){let a=t.many++;return s=>t.parser.many(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else if(n==="+"){let a=t.many++;if(i){let s=t.or++;return l=>t.parser.alternatives(s,[{ALT:o(()=>t.parser.atLeastOne(a,{DEF:o(()=>r(l),"DEF")}),"ALT"),GATE:o(()=>i(l),"GATE")},{ALT:kE(),GATE:o(()=>!i(l),"GATE")}])}else return s=>t.parser.atLeastOne(a,{DEF:o(()=>r(s),"DEF")})}else if(n==="?"){let a=t.optional++;return s=>t.parser.optional(a,{DEF:o(()=>r(s),"DEF"),GATE:i?()=>i(s):void 0})}else Oc(n)}function Yce(t,e){let r=O$e(t,e),n=t.parser.getRule(r);if(!n)throw new Error(`Rule "${r}" not found."`);return n}function O$e(t,e){if(Fa(e))return e.name;if(t.ruleNames.has(e))return t.ruleNames.get(e);{let r=e,n=r.$container,i=e.$type;for(;!Fa(n);)(ff(n)||Lk(n)||Nk(n))&&(i=n.elements.indexOf(r).toString()+":"+i),r=n,n=n.$container;return i=n.name+":"+i,t.ruleNames.set(e,i),i}}function rI(t,e){let r=t.tokens[e];if(!r)throw new Error(`Token "${e}" not found."`);return r}var OE=N(()=>{"use strict";mf();Pc();Sk();Gs();Fl();o(Gx,"createParser");o(A$e,"buildRules");o(Cp,"buildElement");o(_$e,"buildAction");o(D$e,"buildRuleCall");o(L$e,"buildRuleCallPredicate");o(Xu,"buildPredicate");o(R$e,"buildAlternatives");o(N$e,"buildUnorderedGroup");o(M$e,"buildGroup");o(IE,"getGuardCondition");o(Wce,"buildCrossReference");o(I$e,"buildKeyword");o(qce,"wrap");o(Yce,"getRule");o(O$e,"getRuleName");o(rI,"getToken")});function nI(t){let e=t.Grammar,r=t.parser.Lexer,n=new $x(t);return Gx(e,n,r.definition),n.finalize(),n}var iI=N(()=>{"use strict";zx();OE();o(nI,"createCompletionParser")});function aI(t){let e=Xce(t);return e.finalize(),e}function Xce(t){let e=t.Grammar,r=t.parser.Lexer,n=new Fx(t);return Gx(e,n,r.definition)}var sI=N(()=>{"use strict";zx();OE();o(aI,"createLangiumParser");o(Xce,"prepareLangiumParser")});var ju,PE=N(()=>{"use strict";mf();Pc();cs();Fl();$g();Gs();ju=class{static{o(this,"DefaultTokenBuilder")}constructor(){this.diagnostics=[]}buildTokens(e,r){let n=en(sx(e,!1)),i=this.buildTerminalTokens(n),a=this.buildKeywordTokens(n,i,r);return i.forEach(s=>{let l=s.PATTERN;typeof l=="object"&&l&&"test"in l&&Fg(l)?a.unshift(s):a.push(s)}),a}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){let e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(uo).filter(r=>!r.fragment).map(r=>this.buildTerminalToken(r)).toArray()}buildTerminalToken(e){let r=Gg(e),n=this.requiresCustomPattern(r)?this.regexPatternFunction(r):r,i={name:e.name,PATTERN:n};return typeof n=="function"&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=Fg(r)?Kn.SKIPPED:"hidden"),i}requiresCustomPattern(e){return e.flags.includes("u")||e.flags.includes("s")?!0:!!(e.source.includes("?<=")||e.source.includes("?(r.lastIndex=i,r.exec(n))}buildKeywordTokens(e,r,n){return e.filter(Fa).flatMap(i=>Bc(i).filter(Xo)).distinct(i=>i.value).toArray().sort((i,a)=>a.value.length-i.value.length).map(i=>this.buildKeywordToken(i,r,!!n?.caseInsensitive))}buildKeywordToken(e,r,n){let i=this.buildKeywordPattern(e,n),a={name:e.value,PATTERN:i,LONGER_ALT:this.findLongerAlt(e,r)};return typeof i=="function"&&(a.LINE_BREAKS=!0),a}buildKeywordPattern(e,r){return r?new RegExp(FN(e.value)):e.value}findLongerAlt(e,r){return r.reduce((n,i)=>{let a=i?.PATTERN;return a?.source&&$N("^"+a.source+"$",e.value)&&n.push(i),n},[])}}});var Ap,zc,oI=N(()=>{"use strict";Pc();Fl();Ap=class{static{o(this,"DefaultValueConverter")}convert(e,r){let n=r.grammarSource;if(up(n)&&(n=VN(n)),Bl(n)){let i=n.rule.ref;if(!i)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(i,e,r)}return e}runConverter(e,r,n){var i;switch(e.name.toUpperCase()){case"INT":return zc.convertInt(r);case"STRING":return zc.convertString(r);case"ID":return zc.convertID(r)}switch((i=jN(e))===null||i===void 0?void 0:i.toLowerCase()){case"number":return zc.convertNumber(r);case"boolean":return zc.convertBoolean(r);case"bigint":return zc.convertBigint(r);case"date":return zc.convertDate(r);default:return r}}};(function(t){function e(h){let f="";for(let d=1;d{"use strict";Object.defineProperty(uI,"__esModule",{value:!0});var lI;function cI(){if(lI===void 0)throw new Error("No runtime abstraction layer installed");return lI}o(cI,"RAL");(function(t){function e(r){if(r===void 0)throw new Error("No runtime abstraction layer provided");lI=r}o(e,"install"),t.install=e})(cI||(cI={}));uI.default=cI});var Qce=Pi(za=>{"use strict";Object.defineProperty(za,"__esModule",{value:!0});za.stringArray=za.array=za.func=za.error=za.number=za.string=za.boolean=void 0;function P$e(t){return t===!0||t===!1}o(P$e,"boolean");za.boolean=P$e;function jce(t){return typeof t=="string"||t instanceof String}o(jce,"string");za.string=jce;function B$e(t){return typeof t=="number"||t instanceof Number}o(B$e,"number");za.number=B$e;function F$e(t){return t instanceof Error}o(F$e,"error");za.error=F$e;function $$e(t){return typeof t=="function"}o($$e,"func");za.func=$$e;function Kce(t){return Array.isArray(t)}o(Kce,"array");za.array=Kce;function z$e(t){return Kce(t)&&t.every(e=>jce(e))}o(z$e,"stringArray");za.stringArray=z$e});var dI=Pi(g1=>{"use strict";Object.defineProperty(g1,"__esModule",{value:!0});g1.Emitter=g1.Event=void 0;var G$e=hI(),Zce;(function(t){let e={dispose(){}};t.None=function(){return e}})(Zce||(g1.Event=Zce={}));var fI=class{static{o(this,"CallbackList")}add(e,r=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(r),Array.isArray(n)&&n.push({dispose:o(()=>this.remove(e,r),"dispose")})}remove(e,r=null){if(!this._callbacks)return;let n=!1;for(let i=0,a=this._callbacks.length;i{this._callbacks||(this._callbacks=new fI),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,r);let i={dispose:o(()=>{this._callbacks&&(this._callbacks.remove(e,r),i.dispose=t._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))},"dispose")};return Array.isArray(n)&&n.push(i),i}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}};g1.Emitter=BE;BE._noop=function(){}});var Jce=Pi(y1=>{"use strict";Object.defineProperty(y1,"__esModule",{value:!0});y1.CancellationTokenSource=y1.CancellationToken=void 0;var V$e=hI(),U$e=Qce(),pI=dI(),FE;(function(t){t.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:pI.Event.None}),t.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:pI.Event.None});function e(r){let n=r;return n&&(n===t.None||n===t.Cancelled||U$e.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}o(e,"is"),t.is=e})(FE||(y1.CancellationToken=FE={}));var H$e=Object.freeze(function(t,e){let r=(0,V$e.default)().timer.setTimeout(t.bind(e),0);return{dispose(){r.dispose()}}}),$E=class{static{o(this,"MutableToken")}constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?H$e:(this._emitter||(this._emitter=new pI.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}},mI=class{static{o(this,"CancellationTokenSource")}get token(){return this._token||(this._token=new $E),this._token}cancel(){this._token?this._token.cancel():this._token=FE.Cancelled}dispose(){this._token?this._token instanceof $E&&this._token.dispose():this._token=FE.None}};y1.CancellationTokenSource=mI});var yr={};var Ko=N(()=>{"use strict";Cr(yr,Aa(Jce(),1))});function gI(){return new Promise(t=>{typeof setImmediate>"u"?setTimeout(t,0):setImmediate(t)})}function GE(){return zE=performance.now(),new yr.CancellationTokenSource}function tue(t){eue=t}function Vc(t){return t===Gc}async function wi(t){if(t===yr.CancellationToken.None)return;let e=performance.now();if(e-zE>=eue&&(zE=e,await gI(),zE=performance.now()),t.isCancellationRequested)throw Gc}var zE,eue,Gc,ps,Qo=N(()=>{"use strict";Ko();o(gI,"delayNextTick");zE=0,eue=10;o(GE,"startCancelableOperation");o(tue,"setInterruptionPeriod");Gc=Symbol("OperationCancelled");o(Vc,"isOperationCancelled");o(wi,"interruptAndCheck");ps=class{static{o(this,"Deferred")}constructor(){this.promise=new Promise((e,r)=>{this.resolve=n=>(e(n),this),this.reject=n=>(r(n),this)})}}});function yI(t,e){if(t.length<=1)return t;let r=t.length/2|0,n=t.slice(0,r),i=t.slice(r);yI(n,e),yI(i,e);let a=0,s=0,l=0;for(;ar.line||e.line===r.line&&e.character>r.character?{start:r,end:e}:t}function W$e(t){let e=iue(t.range);return e!==t.range?{newText:t.newText,range:e}:t}var VE,v1,aue=N(()=>{"use strict";VE=class t{static{o(this,"FullTextDocument")}constructor(e,r,n,i){this._uri=e,this._languageId=r,this._version=n,this._content=i,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let r=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(r,n)}return this._content}update(e,r){for(let n of e)if(t.isIncremental(n)){let i=iue(n.range),a=this.offsetAt(i.start),s=this.offsetAt(i.end);this._content=this._content.substring(0,a)+n.text+this._content.substring(s,this._content.length);let l=Math.max(i.start.line,0),u=Math.max(i.end.line,0),h=this._lineOffsets,f=rue(n.text,!1,a);if(u-l===f.length)for(let p=0,m=f.length;pe?i=s:n=s+1}let a=n-1;return e=this.ensureBeforeEOL(e,r[a]),{line:a,character:e-r[a]}}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let n=r[e.line];if(e.character<=0)return n;let i=e.line+1r&&nue(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range!==void 0&&(r.rangeLength===void 0||typeof r.rangeLength=="number")}static isFull(e){let r=e;return r!=null&&typeof r.text=="string"&&r.range===void 0&&r.rangeLength===void 0}};(function(t){function e(i,a,s,l){return new VE(i,a,s,l)}o(e,"create"),t.create=e;function r(i,a,s){if(i instanceof VE)return i.update(a,s),i;throw new Error("TextDocument.update: document must be created by TextDocument.create")}o(r,"update"),t.update=r;function n(i,a){let s=i.getText(),l=yI(a.map(W$e),(f,d)=>{let p=f.range.start.line-d.range.start.line;return p===0?f.range.start.character-d.range.start.character:p}),u=0,h=[];for(let f of l){let d=i.offsetAt(f.range.start);if(du&&h.push(s.substring(u,d)),f.newText.length&&h.push(f.newText),u=i.offsetAt(f.range.end)}return h.push(s.substr(u)),h.join("")}o(n,"applyEdits"),t.applyEdits=n})(v1||(v1={}));o(yI,"mergeSort");o(rue,"computeLineOffsets");o(nue,"isEOL");o(iue,"getWellformedRange");o(W$e,"getWellformedEdit")});var sue,ms,x1,vI=N(()=>{"use strict";(()=>{"use strict";var t={470:i=>{function a(u){if(typeof u!="string")throw new TypeError("Path must be a string. Received "+JSON.stringify(u))}o(a,"e");function s(u,h){for(var f,d="",p=0,m=-1,g=0,y=0;y<=u.length;++y){if(y2){var v=d.lastIndexOf("/");if(v!==d.length-1){v===-1?(d="",p=0):p=(d=d.slice(0,v)).length-1-d.lastIndexOf("/"),m=y,g=0;continue}}else if(d.length===2||d.length===1){d="",p=0,m=y,g=0;continue}}h&&(d.length>0?d+="/..":d="..",p=2)}else d.length>0?d+="/"+u.slice(m+1,y):d=u.slice(m+1,y),p=y-m-1;m=y,g=0}else f===46&&g!==-1?++g:g=-1}return d}o(s,"r");var l={resolve:o(function(){for(var u,h="",f=!1,d=arguments.length-1;d>=-1&&!f;d--){var p;d>=0?p=arguments[d]:(u===void 0&&(u=process.cwd()),p=u),a(p),p.length!==0&&(h=p+"/"+h,f=p.charCodeAt(0)===47)}return h=s(h,!f),f?h.length>0?"/"+h:"/":h.length>0?h:"."},"resolve"),normalize:o(function(u){if(a(u),u.length===0)return".";var h=u.charCodeAt(0)===47,f=u.charCodeAt(u.length-1)===47;return(u=s(u,!h)).length!==0||h||(u="."),u.length>0&&f&&(u+="/"),h?"/"+u:u},"normalize"),isAbsolute:o(function(u){return a(u),u.length>0&&u.charCodeAt(0)===47},"isAbsolute"),join:o(function(){if(arguments.length===0)return".";for(var u,h=0;h0&&(u===void 0?u=f:u+="/"+f)}return u===void 0?".":l.normalize(u)},"join"),relative:o(function(u,h){if(a(u),a(h),u===h||(u=l.resolve(u))===(h=l.resolve(h)))return"";for(var f=1;fy){if(h.charCodeAt(m+x)===47)return h.slice(m+x+1);if(x===0)return h.slice(m+x)}else p>y&&(u.charCodeAt(f+x)===47?v=x:x===0&&(v=0));break}var b=u.charCodeAt(f+x);if(b!==h.charCodeAt(m+x))break;b===47&&(v=x)}var T="";for(x=f+v+1;x<=d;++x)x!==d&&u.charCodeAt(x)!==47||(T.length===0?T+="..":T+="/..");return T.length>0?T+h.slice(m+v):(m+=v,h.charCodeAt(m)===47&&++m,h.slice(m))},"relative"),_makeLong:o(function(u){return u},"_makeLong"),dirname:o(function(u){if(a(u),u.length===0)return".";for(var h=u.charCodeAt(0),f=h===47,d=-1,p=!0,m=u.length-1;m>=1;--m)if((h=u.charCodeAt(m))===47){if(!p){d=m;break}}else p=!1;return d===-1?f?"/":".":f&&d===1?"//":u.slice(0,d)},"dirname"),basename:o(function(u,h){if(h!==void 0&&typeof h!="string")throw new TypeError('"ext" argument must be a string');a(u);var f,d=0,p=-1,m=!0;if(h!==void 0&&h.length>0&&h.length<=u.length){if(h.length===u.length&&h===u)return"";var g=h.length-1,y=-1;for(f=u.length-1;f>=0;--f){var v=u.charCodeAt(f);if(v===47){if(!m){d=f+1;break}}else y===-1&&(m=!1,y=f+1),g>=0&&(v===h.charCodeAt(g)?--g==-1&&(p=f):(g=-1,p=y))}return d===p?p=y:p===-1&&(p=u.length),u.slice(d,p)}for(f=u.length-1;f>=0;--f)if(u.charCodeAt(f)===47){if(!m){d=f+1;break}}else p===-1&&(m=!1,p=f+1);return p===-1?"":u.slice(d,p)},"basename"),extname:o(function(u){a(u);for(var h=-1,f=0,d=-1,p=!0,m=0,g=u.length-1;g>=0;--g){var y=u.charCodeAt(g);if(y!==47)d===-1&&(p=!1,d=g+1),y===46?h===-1?h=g:m!==1&&(m=1):h!==-1&&(m=-1);else if(!p){f=g+1;break}}return h===-1||d===-1||m===0||m===1&&h===d-1&&h===f+1?"":u.slice(h,d)},"extname"),format:o(function(u){if(u===null||typeof u!="object")throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof u);return function(h,f){var d=f.dir||f.root,p=f.base||(f.name||"")+(f.ext||"");return d?d===f.root?d+p:d+"/"+p:p}(0,u)},"format"),parse:o(function(u){a(u);var h={root:"",dir:"",base:"",ext:"",name:""};if(u.length===0)return h;var f,d=u.charCodeAt(0),p=d===47;p?(h.root="/",f=1):f=0;for(var m=-1,g=0,y=-1,v=!0,x=u.length-1,b=0;x>=f;--x)if((d=u.charCodeAt(x))!==47)y===-1&&(v=!1,y=x+1),d===46?m===-1?m=x:b!==1&&(b=1):m!==-1&&(b=-1);else if(!v){g=x+1;break}return m===-1||y===-1||b===0||b===1&&m===y-1&&m===g+1?y!==-1&&(h.base=h.name=g===0&&p?u.slice(1,y):u.slice(g,y)):(g===0&&p?(h.name=u.slice(1,m),h.base=u.slice(1,y)):(h.name=u.slice(g,m),h.base=u.slice(g,y)),h.ext=u.slice(m,y)),g>0?h.dir=u.slice(0,g-1):p&&(h.dir="/"),h},"parse"),sep:"/",delimiter:":",win32:null,posix:null};l.posix=l,i.exports=l}},e={};function r(i){var a=e[i];if(a!==void 0)return a.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}o(r,"r"),r.d=(i,a)=>{for(var s in a)r.o(a,s)&&!r.o(i,s)&&Object.defineProperty(i,s,{enumerable:!0,get:a[s]})},r.o=(i,a)=>Object.prototype.hasOwnProperty.call(i,a),r.r=i=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(i,"__esModule",{value:!0})};var n={};(()=>{let i;r.r(n),r.d(n,{URI:o(()=>p,"URI"),Utils:o(()=>O,"Utils")}),typeof process=="object"?i=process.platform==="win32":typeof navigator=="object"&&(i=navigator.userAgent.indexOf("Windows")>=0);let a=/^\w[\w\d+.-]*$/,s=/^\//,l=/^\/\//;function u(R,k){if(!R.scheme&&k)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${R.authority}", path: "${R.path}", query: "${R.query}", fragment: "${R.fragment}"}`);if(R.scheme&&!a.test(R.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(R.path){if(R.authority){if(!s.test(R.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(l.test(R.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}}o(u,"s");let h="",f="/",d=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class p{static{o(this,"f")}static isUri(k){return k instanceof p||!!k&&typeof k.authority=="string"&&typeof k.fragment=="string"&&typeof k.path=="string"&&typeof k.query=="string"&&typeof k.scheme=="string"&&typeof k.fsPath=="string"&&typeof k.with=="function"&&typeof k.toString=="function"}scheme;authority;path;query;fragment;constructor(k,L,A,I,M,P=!1){typeof k=="object"?(this.scheme=k.scheme||h,this.authority=k.authority||h,this.path=k.path||h,this.query=k.query||h,this.fragment=k.fragment||h):(this.scheme=function(B,F){return B||F?B:"file"}(k,P),this.authority=L||h,this.path=function(B,F){switch(B){case"https":case"http":case"file":F?F[0]!==f&&(F=f+F):F=f}return F}(this.scheme,A||h),this.query=I||h,this.fragment=M||h,u(this,P))}get fsPath(){return b(this,!1)}with(k){if(!k)return this;let{scheme:L,authority:A,path:I,query:M,fragment:P}=k;return L===void 0?L=this.scheme:L===null&&(L=h),A===void 0?A=this.authority:A===null&&(A=h),I===void 0?I=this.path:I===null&&(I=h),M===void 0?M=this.query:M===null&&(M=h),P===void 0?P=this.fragment:P===null&&(P=h),L===this.scheme&&A===this.authority&&I===this.path&&M===this.query&&P===this.fragment?this:new g(L,A,I,M,P)}static parse(k,L=!1){let A=d.exec(k);return A?new g(A[2]||h,E(A[4]||h),E(A[5]||h),E(A[7]||h),E(A[9]||h),L):new g(h,h,h,h,h)}static file(k){let L=h;if(i&&(k=k.replace(/\\/g,f)),k[0]===f&&k[1]===f){let A=k.indexOf(f,2);A===-1?(L=k.substring(2),k=f):(L=k.substring(2,A),k=k.substring(A)||f)}return new g("file",L,k,h,h)}static from(k){let L=new g(k.scheme,k.authority,k.path,k.query,k.fragment);return u(L,!0),L}toString(k=!1){return T(this,k)}toJSON(){return this}static revive(k){if(k){if(k instanceof p)return k;{let L=new g(k);return L._formatted=k.external,L._fsPath=k._sep===m?k.fsPath:null,L}}return k}}let m=i?1:void 0;class g extends p{static{o(this,"l")}_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(k=!1){return k?T(this,!0):(this._formatted||(this._formatted=T(this,!1)),this._formatted)}toJSON(){let k={$mid:1};return this._fsPath&&(k.fsPath=this._fsPath,k._sep=m),this._formatted&&(k.external=this._formatted),this.path&&(k.path=this.path),this.scheme&&(k.scheme=this.scheme),this.authority&&(k.authority=this.authority),this.query&&(k.query=this.query),this.fragment&&(k.fragment=this.fragment),k}}let y={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function v(R,k,L){let A,I=-1;for(let M=0;M=97&&P<=122||P>=65&&P<=90||P>=48&&P<=57||P===45||P===46||P===95||P===126||k&&P===47||L&&P===91||L&&P===93||L&&P===58)I!==-1&&(A+=encodeURIComponent(R.substring(I,M)),I=-1),A!==void 0&&(A+=R.charAt(M));else{A===void 0&&(A=R.substr(0,M));let B=y[P];B!==void 0?(I!==-1&&(A+=encodeURIComponent(R.substring(I,M)),I=-1),A+=B):I===-1&&(I=M)}}return I!==-1&&(A+=encodeURIComponent(R.substring(I))),A!==void 0?A:R}o(v,"d");function x(R){let k;for(let L=0;L1&&R.scheme==="file"?`//${R.authority}${R.path}`:R.path.charCodeAt(0)===47&&(R.path.charCodeAt(1)>=65&&R.path.charCodeAt(1)<=90||R.path.charCodeAt(1)>=97&&R.path.charCodeAt(1)<=122)&&R.path.charCodeAt(2)===58?k?R.path.substr(1):R.path[1].toLowerCase()+R.path.substr(2):R.path,i&&(L=L.replace(/\//g,"\\")),L}o(b,"m");function T(R,k){let L=k?x:v,A="",{scheme:I,authority:M,path:P,query:B,fragment:F}=R;if(I&&(A+=I,A+=":"),(M||I==="file")&&(A+=f,A+=f),M){let z=M.indexOf("@");if(z!==-1){let $=M.substr(0,z);M=M.substr(z+1),z=$.lastIndexOf(":"),z===-1?A+=L($,!1,!1):(A+=L($.substr(0,z),!1,!1),A+=":",A+=L($.substr(z+1),!1,!0)),A+="@"}M=M.toLowerCase(),z=M.lastIndexOf(":"),z===-1?A+=L(M,!1,!0):(A+=L(M.substr(0,z),!1,!0),A+=M.substr(z))}if(P){if(P.length>=3&&P.charCodeAt(0)===47&&P.charCodeAt(2)===58){let z=P.charCodeAt(1);z>=65&&z<=90&&(P=`/${String.fromCharCode(z+32)}:${P.substr(3)}`)}else if(P.length>=2&&P.charCodeAt(1)===58){let z=P.charCodeAt(0);z>=65&&z<=90&&(P=`${String.fromCharCode(z+32)}:${P.substr(2)}`)}A+=L(P,!0,!1)}return B&&(A+="?",A+=L(B,!1,!1)),F&&(A+="#",A+=k?F:v(F,!1,!1)),A}o(T,"y");function S(R){try{return decodeURIComponent(R)}catch{return R.length>3?R.substr(0,3)+S(R.substr(3)):R}}o(S,"v");let w=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function E(R){return R.match(w)?R.replace(w,k=>S(k)):R}o(E,"C");var _=r(470);let C=_.posix||_,D="/";var O;(function(R){R.joinPath=function(k,...L){return k.with({path:C.join(k.path,...L)})},R.resolvePath=function(k,...L){let A=k.path,I=!1;A[0]!==D&&(A=D+A,I=!0);let M=C.resolve(A,...L);return I&&M[0]===D&&!k.authority&&(M=M.substring(1)),k.with({path:M})},R.dirname=function(k){if(k.path.length===0||k.path===D)return k;let L=C.dirname(k.path);return L.length===1&&L.charCodeAt(0)===46&&(L=""),k.with({path:L})},R.basename=function(k){return C.basename(k.path)},R.extname=function(k){return C.extname(k.path)}})(O||(O={}))})(),sue=n})();({URI:ms,Utils:x1}=sue)});var gs,Uc=N(()=>{"use strict";vI();(function(t){t.basename=x1.basename,t.dirname=x1.dirname,t.extname=x1.extname,t.joinPath=x1.joinPath,t.resolvePath=x1.resolvePath;function e(i,a){return i?.toString()===a?.toString()}o(e,"equals"),t.equals=e;function r(i,a){let s=typeof i=="string"?i:i.path,l=typeof a=="string"?a:a.path,u=s.split("/").filter(m=>m.length>0),h=l.split("/").filter(m=>m.length>0),f=0;for(;f{"use strict";aue();b1();Ko();Gs();Uc();(function(t){t[t.Changed=0]="Changed",t[t.Parsed=1]="Parsed",t[t.IndexedContent=2]="IndexedContent",t[t.ComputedScopes=3]="ComputedScopes",t[t.Linked=4]="Linked",t[t.IndexedReferences=5]="IndexedReferences",t[t.Validated=6]="Validated"})(kn||(kn={}));Vx=class{static{o(this,"DefaultLangiumDocumentFactory")}constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,r=yr.CancellationToken.None){let n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,r)}fromTextDocument(e,r,n){return r=r??ms.parse(e.uri),yr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromString(e,r,n){return yr.CancellationToken.is(n)?this.createAsync(r,e,n):this.create(r,e,n)}fromModel(e,r){return this.create(r,{$model:e})}create(e,r,n){if(typeof r=="string"){let i=this.parse(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else if("$model"in r){let i={value:r.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(i,e)}else{let i=this.parse(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}async createAsync(e,r,n){if(typeof r=="string"){let i=await this.parseAsync(e,r,n);return this.createLangiumDocument(i,e,void 0,r)}else{let i=await this.parseAsync(e,r.getText(),n);return this.createLangiumDocument(i,e,r)}}createLangiumDocument(e,r,n,i){let a;if(n)a={parseResult:e,uri:r,state:kn.Parsed,references:[],textDocument:n};else{let s=this.createTextDocumentGetter(r,i);a={parseResult:e,uri:r,state:kn.Parsed,references:[],get textDocument(){return s()}}}return e.value.$document=a,a}async update(e,r){var n,i;let a=(n=e.parseResult.value.$cstNode)===null||n===void 0?void 0:n.root.fullText,s=(i=this.textDocuments)===null||i===void 0?void 0:i.get(e.uri.toString()),l=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{let u=this.createTextDocumentGetter(e.uri,l);Object.defineProperty(e,"textDocument",{get:u})}return a!==l&&(e.parseResult=await this.parseAsync(e.uri,l,r),e.parseResult.value.$document=e),e.state=kn.Parsed,e}parse(e,r,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(r,n)}parseAsync(e,r,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(r,n)}createTextDocumentGetter(e,r){let n=this.serviceRegistry,i;return()=>i??(i=v1.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,r??""))}},Ux=class{static{o(this,"DefaultLangiumDocuments")}constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return en(this.documentMap.values())}addDocument(e){let r=e.uri.toString();if(this.documentMap.has(r))throw new Error(`A document with the URI '${r}' is already present.`);this.documentMap.set(r,e)}getDocument(e){let r=e.toString();return this.documentMap.get(r)}async getOrCreateDocument(e,r){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,r),this.addDocument(n),n)}createDocument(e,r,n){if(n)return this.langiumDocumentFactory.fromString(r,e,n).then(i=>(this.addDocument(i),i));{let i=this.langiumDocumentFactory.fromString(r,e);return this.addDocument(i),i}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=kn.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0),n}deleteDocument(e){let r=e.toString(),n=this.documentMap.get(r);return n&&(n.state=kn.Changed,this.documentMap.delete(r)),n}}});var xI,Hx,bI=N(()=>{"use strict";Ko();Il();cs();Qo();b1();xI=Symbol("ref_resolving"),Hx=class{static{o(this,"DefaultLinker")}constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,r=yr.CancellationToken.None){for(let n of jo(e.parseResult.value))await wi(r),Pg(n).forEach(i=>this.doLink(i,e))}doLink(e,r){var n;let i=e.reference;if(i._ref===void 0){i._ref=xI;try{let a=this.getCandidate(e);if(ap(a))i._ref=a;else if(i._nodeDescription=a,this.langiumDocuments().hasDocument(a.documentUri)){let s=this.loadAstNode(a);i._ref=s??this.createLinkingError(e,a)}else i._ref=void 0}catch(a){console.error(`An error occurred while resolving reference to '${i.$refText}':`,a);let s=(n=a.message)!==null&&n!==void 0?n:String(a);i._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${i.$refText}': ${s}`})}r.references.push(i)}}unlink(e){for(let r of e.references)delete r._ref,delete r._nodeDescription;e.references=[]}getCandidate(e){let n=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return n??this.createLinkingError(e)}buildReference(e,r,n,i){let a=this,s={$refNode:n,$refText:i,get ref(){var l;if(si(this._ref))return this._ref;if(sN(this._nodeDescription)){let u=a.loadAstNode(this._nodeDescription);this._ref=u??a.createLinkingError({reference:s,container:e,property:r},this._nodeDescription)}else if(this._ref===void 0){this._ref=xI;let u=ex(e).$document,h=a.getLinkedNode({reference:s,container:e,property:r});if(h.error&&u&&u.state{"use strict";Fl();o(oue,"isNamed");Wx=class{static{o(this,"DefaultNameProvider")}getName(e){if(oue(e))return e.name}getNameNode(e){return ox(e.$cstNode,"name")}}});var qx,wI=N(()=>{"use strict";Fl();Il();cs();Ol();Gs();Uc();qx=class{static{o(this,"DefaultReferences")}constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){let r=XN(e),n=e.astNode;if(r&&n){let i=n[r.feature];if(ya(i))return i.ref;if(Array.isArray(i)){for(let a of i)if(ya(a)&&a.$refNode&&a.$refNode.offset<=e.offset&&a.$refNode.end>=e.end)return a.ref}}if(n){let i=this.nameProvider.getNameNode(n);if(i&&(i===e||lN(e,i)))return n}}}findDeclarationNode(e){let r=this.findDeclaration(e);if(r?.$cstNode){let n=this.nameProvider.getNameNode(r);return n??r.$cstNode}}findReferences(e,r){let n=[];if(r.includeDeclaration){let a=this.getReferenceToSelf(e);a&&n.push(a)}let i=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return r.documentUri&&(i=i.filter(a=>gs.equals(a.sourceUri,r.documentUri))),n.push(...i),en(n)}getReferenceToSelf(e){let r=this.nameProvider.getNameNode(e);if(r){let n=$a(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:op(r),local:!0}}}}});var zl,_p,T1=N(()=>{"use strict";Gs();zl=class{static{o(this,"MultiMap")}constructor(e){if(this.map=new Map,e)for(let[r,n]of e)this.add(r,n)}get size(){return jm.sum(en(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,r){if(r===void 0)return this.map.delete(e);{let n=this.map.get(e);if(n){let i=n.indexOf(r);if(i>=0)return n.length===1?this.map.delete(e):n.splice(i,1),!0}return!1}}get(e){var r;return(r=this.map.get(e))!==null&&r!==void 0?r:[]}has(e,r){if(r===void 0)return this.map.has(e);{let n=this.map.get(e);return n?n.indexOf(r)>=0:!1}}add(e,r){return this.map.has(e)?this.map.get(e).push(r):this.map.set(e,[r]),this}addAll(e,r){return this.map.has(e)?this.map.get(e).push(...r):this.map.set(e,Array.from(r)),this}forEach(e){this.map.forEach((r,n)=>r.forEach(i=>e(i,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return en(this.map.entries()).flatMap(([e,r])=>r.map(n=>[e,n]))}keys(){return en(this.map.keys())}values(){return en(this.map.values()).flat()}entriesGroupedByKey(){return en(this.map.entries())}},_p=class{static{o(this,"BiMap")}get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(let[r,n]of e)this.set(r,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,r){return this.map.set(e,r),this.inverse.set(r,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){let r=this.map.get(e);return r!==void 0?(this.map.delete(e),this.inverse.delete(r),!0):!1}}});var Yx,kI=N(()=>{"use strict";Ko();cs();T1();Qo();Yx=class{static{o(this,"DefaultScopeComputation")}constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,r=yr.CancellationToken.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,r)}async computeExportsForNode(e,r,n=tx,i=yr.CancellationToken.None){let a=[];this.exportNode(e,a,r);for(let s of n(e))await wi(i),this.exportNode(s,a,r);return a}exportNode(e,r,n){let i=this.nameProvider.getName(e);i&&r.push(this.descriptions.createDescription(e,i,n))}async computeLocalScopes(e,r=yr.CancellationToken.None){let n=e.parseResult.value,i=new zl;for(let a of Bc(n))await wi(r),this.processNode(a,e,i);return i}processNode(e,r,n){let i=e.$container;if(i){let a=this.nameProvider.getName(e);a&&n.add(i,this.descriptions.createDescription(e,a,r))}}}});var w1,Xx,q$e,EI=N(()=>{"use strict";Gs();w1=class{static{o(this,"StreamScope")}constructor(e,r,n){var i;this.elements=e,this.outerScope=r,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){let r=this.caseInsensitive?this.elements.find(n=>n.name.toLowerCase()===e.toLowerCase()):this.elements.find(n=>n.name===e);if(r)return r;if(this.outerScope)return this.outerScope.getElement(e)}},Xx=class{static{o(this,"MapScope")}constructor(e,r,n){var i;this.elements=new Map,this.caseInsensitive=(i=n?.caseInsensitive)!==null&&i!==void 0?i:!1;for(let a of e){let s=this.caseInsensitive?a.name.toLowerCase():a.name;this.elements.set(s,a)}this.outerScope=r}getElement(e){let r=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(r);if(n)return n;if(this.outerScope)return this.outerScope.getElement(e)}getAllElements(){let e=en(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}},q$e={getElement(){},getAllElements(){return H2}}});var k1,jx,Dp,UE,E1,HE=N(()=>{"use strict";k1=class{static{o(this,"DisposableCache")}constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}},jx=class extends k1{static{o(this,"SimpleCache")}constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,r){this.throwIfDisposed(),this.cache.set(e,r)}get(e,r){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(r){let n=r();return this.cache.set(e,n),n}else return}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}},Dp=class extends k1{static{o(this,"ContextCache")}constructor(e){super(),this.cache=new Map,this.converter=e??(r=>r)}has(e,r){return this.throwIfDisposed(),this.cacheForContext(e).has(r)}set(e,r,n){this.throwIfDisposed(),this.cacheForContext(e).set(r,n)}get(e,r,n){this.throwIfDisposed();let i=this.cacheForContext(e);if(i.has(r))return i.get(r);if(n){let a=n();return i.set(r,a),a}else return}delete(e,r){return this.throwIfDisposed(),this.cacheForContext(e).delete(r)}clear(e){if(this.throwIfDisposed(),e){let r=this.converter(e);this.cache.delete(r)}else this.cache.clear()}cacheForContext(e){let r=this.converter(e),n=this.cache.get(r);return n||(n=new Map,this.cache.set(r,n)),n}},UE=class extends Dp{static{o(this,"DocumentCache")}constructor(e,r){super(n=>n.toString()),r?(this.toDispose.push(e.workspace.DocumentBuilder.onDocumentPhase(r,n=>{this.clear(n.uri.toString())})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{for(let a of i)this.clear(a)}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{let a=n.concat(i);for(let s of a)this.clear(s)}))}},E1=class extends jx{static{o(this,"WorkspaceCache")}constructor(e,r){super(),r?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(r,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((n,i)=>{i.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}});var Kx,SI=N(()=>{"use strict";EI();cs();Gs();HE();Kx=class{static{o(this,"DefaultScopeProvider")}constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new E1(e.shared)}getScope(e){let r=[],n=this.reflection.getReferenceType(e),i=$a(e.container).precomputedScopes;if(i){let s=e.container;do{let l=i.get(s);l.length>0&&r.push(en(l).filter(u=>this.reflection.isSubtype(u.type,n))),s=s.$container}while(s)}let a=this.getGlobalScope(n,e);for(let s=r.length-1;s>=0;s--)a=this.createScope(r[s],a);return a}createScope(e,r,n){return new w1(en(e),r,n)}createScopeForNodes(e,r,n){let i=en(e).map(a=>{let s=this.nameProvider.getName(a);if(s)return this.descriptions.createDescription(a,s)}).nonNullable();return new w1(i,r,n)}getGlobalScope(e,r){return this.globalScopeCache.get(e,()=>new Xx(this.indexManager.allElements(e)))}}});function CI(t){return typeof t.$comment=="string"}function lue(t){return typeof t=="object"&&!!t&&("$ref"in t||"$error"in t)}var Qx,WE=N(()=>{"use strict";vI();Il();cs();Fl();o(CI,"isAstNodeWithComment");o(lue,"isIntermediateReference");Qx=class{static{o(this,"DefaultJsonSerializer")}constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,r){let n=r??{},i=r?.replacer,a=o((l,u)=>this.replacer(l,u,n),"defaultReplacer"),s=i?(l,u)=>i(l,u,a):a;try{return this.currentDocument=$a(e),JSON.stringify(e,s,r?.space)}finally{this.currentDocument=void 0}}deserialize(e,r){let n=r??{},i=JSON.parse(e);return this.linkNode(i,i,n),i}replacer(e,r,{refText:n,sourceText:i,textRegions:a,comments:s,uriConverter:l}){var u,h,f,d;if(!this.ignoreProperties.has(e))if(ya(r)){let p=r.ref,m=n?r.$refText:void 0;if(p){let g=$a(p),y="";this.currentDocument&&this.currentDocument!==g&&(l?y=l(g.uri,r):y=g.uri.toString());let v=this.astNodeLocator.getAstNodePath(p);return{$ref:`${y}#${v}`,$refText:m}}else return{$error:(h=(u=r.error)===null||u===void 0?void 0:u.message)!==null&&h!==void 0?h:"Could not resolve reference",$refText:m}}else if(si(r)){let p;if(a&&(p=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},r)),(!e||r.$document)&&p?.$textRegion&&(p.$textRegion.documentURI=(f=this.currentDocument)===null||f===void 0?void 0:f.uri.toString())),i&&!e&&(p??(p=Object.assign({},r)),p.$sourceText=(d=r.$cstNode)===null||d===void 0?void 0:d.text),s){p??(p=Object.assign({},r));let m=this.commentProvider.getComment(r);m&&(p.$comment=m.replace(/\r/g,""))}return p??r}else return r}addAstNodeRegionWithAssignmentsTo(e){let r=o(n=>({offset:n.offset,end:n.end,length:n.length,range:n.range}),"createDocumentSegment");if(e.$cstNode){let n=e.$textRegion=r(e.$cstNode),i=n.assignments={};return Object.keys(e).filter(a=>!a.startsWith("$")).forEach(a=>{let s=HN(e.$cstNode,a).map(r);s.length!==0&&(i[a]=s)}),e}}linkNode(e,r,n,i,a,s){for(let[u,h]of Object.entries(e))if(Array.isArray(h))for(let f=0;f{"use strict";Uc();Zx=class{static{o(this,"DefaultServiceRegistry")}get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.textDocuments=e?.workspace.TextDocuments}register(e){let r=e.LanguageMetaData;for(let n of r.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${r.languageId}'.`),this.fileExtensionMap.set(n,e);this.languageIdMap.set(r.languageId,e),this.languageIdMap.size===1?this.singleton=e:this.singleton=void 0}getServices(e){var r,n;if(this.singleton!==void 0)return this.singleton;if(this.languageIdMap.size===0)throw new Error("The service registry is empty. Use `register` to register the services of a language.");let i=(n=(r=this.textDocuments)===null||r===void 0?void 0:r.get(e))===null||n===void 0?void 0:n.languageId;if(i!==void 0){let l=this.languageIdMap.get(i);if(l)return l}let a=gs.extname(e),s=this.fileExtensionMap.get(a);if(!s)throw i?new Error(`The service registry contains no services for the extension '${a}' for language '${i}'.`):new Error(`The service registry contains no services for the extension '${a}'.`);return s}hasServices(e){try{return this.getServices(e),!0}catch{return!1}}get all(){return Array.from(this.languageIdMap.values())}}});function Lp(t){return{code:t}}var S1,Jx,eb=N(()=>{"use strict";po();T1();Qo();Gs();o(Lp,"diagnosticData");(function(t){t.all=["fast","slow","built-in"]})(S1||(S1={}));Jx=class{static{o(this,"ValidationRegistry")}constructor(e){this.entries=new zl,this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,r=this,n="fast"){if(n==="built-in")throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(let[i,a]of Object.entries(e)){let s=a;if(Array.isArray(s))for(let l of s){let u={check:this.wrapValidationException(l,r),category:n};this.addEntry(i,u)}else if(typeof s=="function"){let l={check:this.wrapValidationException(s,r),category:n};this.addEntry(i,l)}else Oc(s)}}wrapValidationException(e,r){return async(n,i,a)=>{await this.handleException(()=>e.call(r,n,i,a),"An error occurred during validation",i,n)}}async handleException(e,r,n,i){try{await e()}catch(a){if(Vc(a))throw a;console.error(`${r}:`,a),a instanceof Error&&a.stack&&console.error(a.stack);let s=a instanceof Error?a.message:String(a);n("error",`${r}: ${s}`,{node:i})}}addEntry(e,r){if(e==="AstNode"){this.entries.add("AstNode",r);return}for(let n of this.reflection.getAllSubTypes(e))this.entries.add(n,r)}getChecks(e,r){let n=en(this.entries.get(e)).concat(this.entries.get("AstNode"));return r&&(n=n.filter(i=>r.includes(i.category))),n.map(i=>i.check)}registerBeforeDocument(e,r=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",r))}registerAfterDocument(e,r=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",r))}wrapPreparationException(e,r,n){return async(i,a,s,l)=>{await this.handleException(()=>e.call(n,i,a,s,l),r,a,i)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}});function cue(t){if(t.range)return t.range;let e;return typeof t.property=="string"?e=ox(t.node.$cstNode,t.property,t.index):typeof t.keyword=="string"&&(e=qN(t.node.$cstNode,t.keyword,t.index)),e??(e=t.node.$cstNode),e?e.range:{start:{line:0,character:0},end:{line:0,character:0}}}function qE(t){switch(t){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+t)}}function uue(t){switch(t){case"error":return Lp(Zo.LexingError);case"warning":return Lp(Zo.LexingWarning);case"info":return Lp(Zo.LexingInfo);case"hint":return Lp(Zo.LexingHint);default:throw new Error("Invalid diagnostic severity: "+t)}}var tb,Zo,_I=N(()=>{"use strict";Ko();Fl();cs();Ol();Qo();eb();tb=class{static{o(this,"DefaultDocumentValidator")}constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,r={},n=yr.CancellationToken.None){let i=e.parseResult,a=[];if(await wi(n),(!r.categories||r.categories.includes("built-in"))&&(this.processLexingErrors(i,a,r),r.stopAfterLexingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Zo.LexingError})||(this.processParsingErrors(i,a,r),r.stopAfterParsingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Zo.ParsingError}))||(this.processLinkingErrors(e,a,r),r.stopAfterLinkingErrors&&a.some(s=>{var l;return((l=s.data)===null||l===void 0?void 0:l.code)===Zo.LinkingError}))))return a;try{a.push(...await this.validateAst(i.value,r,n))}catch(s){if(Vc(s))throw s;console.error("An error occurred during validation:",s)}return await wi(n),a}processLexingErrors(e,r,n){var i,a,s;let l=[...e.lexerErrors,...(a=(i=e.lexerReport)===null||i===void 0?void 0:i.diagnostics)!==null&&a!==void 0?a:[]];for(let u of l){let h=(s=u.severity)!==null&&s!==void 0?s:"error",f={severity:qE(h),range:{start:{line:u.line-1,character:u.column-1},end:{line:u.line-1,character:u.column+u.length-1}},message:u.message,data:uue(h),source:this.getSource()};r.push(f)}}processParsingErrors(e,r,n){for(let i of e.parserErrors){let a;if(isNaN(i.token.startOffset)){if("previousToken"in i){let s=i.previousToken;if(isNaN(s.startOffset)){let l={line:0,character:0};a={start:l,end:l}}else{let l={line:s.endLine-1,character:s.endColumn};a={start:l,end:l}}}}else a=Km(i.token);if(a){let s={severity:qE("error"),range:a,message:i.message,data:Lp(Zo.ParsingError),source:this.getSource()};r.push(s)}}}processLinkingErrors(e,r,n){for(let i of e.references){let a=i.error;if(a){let s={node:a.container,property:a.property,index:a.index,data:{code:Zo.LinkingError,containerType:a.container.$type,property:a.property,refText:a.reference.$refText}};r.push(this.toDiagnostic("error",a.message,s))}}}async validateAst(e,r,n=yr.CancellationToken.None){let i=[],a=o((s,l,u)=>{i.push(this.toDiagnostic(s,l,u))},"acceptor");return await this.validateAstBefore(e,r,a,n),await this.validateAstNodes(e,r,a,n),await this.validateAstAfter(e,r,a,n),i}async validateAstBefore(e,r,n,i=yr.CancellationToken.None){var a;let s=this.validationRegistry.checksBefore;for(let l of s)await wi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}async validateAstNodes(e,r,n,i=yr.CancellationToken.None){await Promise.all(jo(e).map(async a=>{await wi(i);let s=this.validationRegistry.getChecks(a.$type,r.categories);for(let l of s)await l(a,n,i)}))}async validateAstAfter(e,r,n,i=yr.CancellationToken.None){var a;let s=this.validationRegistry.checksAfter;for(let l of s)await wi(i),await l(e,n,(a=r.categories)!==null&&a!==void 0?a:[],i)}toDiagnostic(e,r,n){return{message:r,range:cue(n),severity:qE(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}};o(cue,"getDiagnosticRange");o(qE,"toDiagnosticSeverity");o(uue,"toDiagnosticData");(function(t){t.LexingError="lexing-error",t.LexingWarning="lexing-warning",t.LexingInfo="lexing-info",t.LexingHint="lexing-hint",t.ParsingError="parsing-error",t.LinkingError="linking-error"})(Zo||(Zo={}))});var rb,nb,DI=N(()=>{"use strict";Ko();Il();cs();Ol();Qo();Uc();rb=class{static{o(this,"DefaultAstNodeDescriptionProvider")}constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,r,n){let i=n??$a(e);r??(r=this.nameProvider.getName(e));let a=this.astNodeLocator.getAstNodePath(e);if(!r)throw new Error(`Node at path ${a} has no name.`);let s,l=o(()=>{var u;return s??(s=op((u=this.nameProvider.getNameNode(e))!==null&&u!==void 0?u:e.$cstNode))},"nameSegmentGetter");return{node:e,name:r,get nameSegment(){return l()},selectionSegment:op(e.$cstNode),type:e.$type,documentUri:i.uri,path:a}}},nb=class{static{o(this,"DefaultReferenceDescriptionProvider")}constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,r=yr.CancellationToken.None){let n=[],i=e.parseResult.value;for(let a of jo(i))await wi(r),Pg(a).filter(s=>!ap(s)).forEach(s=>{let l=this.createDescription(s);l&&n.push(l)});return n}createDescription(e){let r=e.reference.$nodeDescription,n=e.reference.$refNode;if(!r||!n)return;let i=$a(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:r.documentUri,targetPath:r.path,segment:op(n),local:gs.equals(r.documentUri,i)}}}});var ib,LI=N(()=>{"use strict";ib=class{static{o(this,"DefaultAstNodeLocator")}constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){let r=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return r+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:r}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return r!==void 0?e+this.indexSeparator+r:e}getAstNode(e,r){return r.split(this.segmentSeparator).reduce((i,a)=>{if(!i||a.length===0)return i;let s=a.indexOf(this.indexSeparator);if(s>0){let l=a.substring(0,s),u=parseInt(a.substring(s+1)),h=i[l];return h?.[u]}return i[a]},e)}}});var Zn={};var YE=N(()=>{"use strict";Cr(Zn,Aa(dI(),1))});var ab,RI=N(()=>{"use strict";YE();Qo();ab=class{static{o(this,"DefaultConfigurationProvider")}constructor(e){this._ready=new ps,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new Zn.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var r,n;this.workspaceConfig=(n=(r=e.capabilities.workspace)===null||r===void 0?void 0:r.configuration)!==null&&n!==void 0?n:!1}async initialized(e){if(this.workspaceConfig){if(e.register){let r=this.serviceRegistry.all;e.register({section:r.map(n=>this.toSectionName(n.LanguageMetaData.languageId))})}if(e.fetchConfiguration){let r=this.serviceRegistry.all.map(i=>({section:this.toSectionName(i.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(r);r.forEach((i,a)=>{this.updateSectionConfiguration(i.section,n[a])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(r=>{let n=e.settings[r];this.updateSectionConfiguration(r,n),this.onConfigurationSectionUpdateEmitter.fire({section:r,configuration:n})})}updateSectionConfiguration(e,r){this.settings[e]=r}async getConfiguration(e,r){await this.ready;let n=this.toSectionName(e);if(this.settings[n])return this.settings[n][r]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}});var vf,NI=N(()=>{"use strict";(function(t){function e(r){return{dispose:o(async()=>await r(),"dispose")}}o(e,"create"),t.create=e})(vf||(vf={}))});var sb,MI=N(()=>{"use strict";Ko();NI();T1();Qo();Gs();eb();b1();sb=class{static{o(this,"DefaultDocumentBuilder")}constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new zl,this.documentPhaseListeners=new zl,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=kn.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,r={},n=yr.CancellationToken.None){var i,a;for(let s of e){let l=s.uri.toString();if(s.state===kn.Validated){if(typeof r.validation=="boolean"&&r.validation)s.state=kn.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(l);else if(typeof r.validation=="object"){let u=this.buildState.get(l),h=(i=u?.result)===null||i===void 0?void 0:i.validationChecks;if(h){let d=((a=r.validation.categories)!==null&&a!==void 0?a:S1.all).filter(p=>!h.includes(p));d.length>0&&(this.buildState.set(l,{completed:!1,options:{validation:Object.assign(Object.assign({},r.validation),{categories:d})},result:u.result}),s.state=kn.IndexedReferences)}}}else this.buildState.delete(l)}this.currentState=kn.Changed,await this.emitUpdate(e.map(s=>s.uri),[]),await this.buildDocuments(e,r,n)}async update(e,r,n=yr.CancellationToken.None){this.currentState=kn.Changed;for(let s of r)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(let s of e){if(!this.langiumDocuments.invalidateDocument(s)){let u=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);u.state=kn.Changed,this.langiumDocuments.addDocument(u)}this.buildState.delete(s.toString())}let i=en(e).concat(r).map(s=>s.toString()).toSet();this.langiumDocuments.all.filter(s=>!i.has(s.uri.toString())&&this.shouldRelink(s,i)).forEach(s=>{this.serviceRegistry.getServices(s.uri).references.Linker.unlink(s),s.state=Math.min(s.state,kn.ComputedScopes),s.diagnostics=void 0}),await this.emitUpdate(e,r),await wi(n);let a=this.sortDocuments(this.langiumDocuments.all.filter(s=>{var l;return s.staten(e,r)))}sortDocuments(e){let r=0,n=e.length-1;for(;r=0&&!this.hasTextDocument(e[n]);)n--;rn.error!==void 0)?!0:this.indexManager.isAffected(e,r)}onUpdate(e){return this.updateListeners.push(e),vf.create(()=>{let r=this.updateListeners.indexOf(e);r>=0&&this.updateListeners.splice(r,1)})}async buildDocuments(e,r,n){this.prepareBuild(e,r),await this.runCancelable(e,kn.Parsed,n,a=>this.langiumDocumentFactory.update(a,n)),await this.runCancelable(e,kn.IndexedContent,n,a=>this.indexManager.updateContent(a,n)),await this.runCancelable(e,kn.ComputedScopes,n,async a=>{let s=this.serviceRegistry.getServices(a.uri).references.ScopeComputation;a.precomputedScopes=await s.computeLocalScopes(a,n)}),await this.runCancelable(e,kn.Linked,n,a=>this.serviceRegistry.getServices(a.uri).references.Linker.link(a,n)),await this.runCancelable(e,kn.IndexedReferences,n,a=>this.indexManager.updateReferences(a,n));let i=e.filter(a=>this.shouldValidate(a));await this.runCancelable(i,kn.Validated,n,a=>this.validate(a,n));for(let a of e){let s=this.buildState.get(a.uri.toString());s&&(s.completed=!0)}}prepareBuild(e,r){for(let n of e){let i=n.uri.toString(),a=this.buildState.get(i);(!a||a.completed)&&this.buildState.set(i,{completed:!1,options:r,result:a?.result})}}async runCancelable(e,r,n,i){let a=e.filter(l=>l.statel.state===r);await this.notifyBuildPhase(s,r,n),this.currentState=r}onBuildPhase(e,r){return this.buildPhaseListeners.add(e,r),vf.create(()=>{this.buildPhaseListeners.delete(e,r)})}onDocumentPhase(e,r){return this.documentPhaseListeners.add(e,r),vf.create(()=>{this.documentPhaseListeners.delete(e,r)})}waitUntil(e,r,n){let i;if(r&&"path"in r?i=r:n=r,n??(n=yr.CancellationToken.None),i){let a=this.langiumDocuments.getDocument(i);if(a&&a.state>e)return Promise.resolve(i)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(Gc):new Promise((a,s)=>{let l=this.onBuildPhase(e,()=>{if(l.dispose(),u.dispose(),i){let h=this.langiumDocuments.getDocument(i);a(h?.uri)}else a(void 0)}),u=n.onCancellationRequested(()=>{l.dispose(),u.dispose(),s(Gc)})})}async notifyDocumentPhase(e,r,n){let a=this.documentPhaseListeners.get(r).slice();for(let s of a)try{await s(e,n)}catch(l){if(!Vc(l))throw l}}async notifyBuildPhase(e,r,n){if(e.length===0)return;let a=this.buildPhaseListeners.get(r).slice();for(let s of a)await wi(n),await s(e,n)}shouldValidate(e){return!!this.getBuildOptions(e).validation}async validate(e,r){var n,i;let a=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,l=typeof s=="object"?s:void 0,u=await a.validateDocument(e,l,r);e.diagnostics?e.diagnostics.push(...u):e.diagnostics=u;let h=this.buildState.get(e.uri.toString());if(h){(n=h.result)!==null&&n!==void 0||(h.result={});let f=(i=l?.categories)!==null&&i!==void 0?i:S1.all;h.result.validationChecks?h.result.validationChecks.push(...f):h.result.validationChecks=[...f]}}getBuildOptions(e){var r,n;return(n=(r=this.buildState.get(e.uri.toString()))===null||r===void 0?void 0:r.options)!==null&&n!==void 0?n:{}}}});var ob,II=N(()=>{"use strict";cs();HE();Ko();Gs();Uc();ob=class{static{o(this,"DefaultIndexManager")}constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Dp,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,r){let n=$a(e).uri,i=[];return this.referenceIndex.forEach(a=>{a.forEach(s=>{gs.equals(s.targetUri,n)&&s.targetPath===r&&i.push(s)})}),en(i)}allElements(e,r){let n=en(this.symbolIndex.keys());return r&&(n=n.filter(i=>!r||r.has(i))),n.map(i=>this.getFileDescriptions(i,e)).flat()}getFileDescriptions(e,r){var n;return r?this.symbolByTypeIndex.get(e,r,()=>{var a;return((a=this.symbolIndex.get(e))!==null&&a!==void 0?a:[]).filter(l=>this.astReflection.isSubtype(l.type,r))}):(n=this.symbolIndex.get(e))!==null&&n!==void 0?n:[]}remove(e){let r=e.toString();this.symbolIndex.delete(r),this.symbolByTypeIndex.clear(r),this.referenceIndex.delete(r)}async updateContent(e,r=yr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).references.ScopeComputation.computeExports(e,r),a=e.uri.toString();this.symbolIndex.set(a,i),this.symbolByTypeIndex.clear(a)}async updateReferences(e,r=yr.CancellationToken.None){let i=await this.serviceRegistry.getServices(e.uri).workspace.ReferenceDescriptionProvider.createDescriptions(e,r);this.referenceIndex.set(e.uri.toString(),i)}isAffected(e,r){let n=this.referenceIndex.get(e.uri.toString());return n?n.some(i=>!i.local&&r.has(i.targetUri.toString())):!1}}});var lb,OI=N(()=>{"use strict";Ko();Qo();Uc();lb=class{static{o(this,"DefaultWorkspaceManager")}constructor(e){this.initialBuildOptions={},this._ready=new ps,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var r;this.folders=(r=e.workspaceFolders)!==null&&r!==void 0?r:void 0}initialized(e){return this.mutex.write(r=>{var n;return this.initializeWorkspace((n=this.folders)!==null&&n!==void 0?n:[],r)})}async initializeWorkspace(e,r=yr.CancellationToken.None){let n=await this.performStartup(e);await wi(r),await this.documentBuilder.build(n,this.initialBuildOptions,r)}async performStartup(e){let r=this.serviceRegistry.all.flatMap(a=>a.LanguageMetaData.fileExtensions),n=[],i=o(a=>{n.push(a),this.langiumDocuments.hasDocument(a.uri)||this.langiumDocuments.addDocument(a)},"collector");return await this.loadAdditionalDocuments(e,i),await Promise.all(e.map(a=>[a,this.getRootFolder(a)]).map(async a=>this.traverseFolder(...a,r,i))),this._ready.resolve(),n}loadAdditionalDocuments(e,r){return Promise.resolve()}getRootFolder(e){return ms.parse(e.uri)}async traverseFolder(e,r,n,i){let a=await this.fileSystemProvider.readDirectory(r);await Promise.all(a.map(async s=>{if(this.includeEntry(e,s,n)){if(s.isDirectory)await this.traverseFolder(e,s.uri,n,i);else if(s.isFile){let l=await this.langiumDocuments.getOrCreateDocument(s.uri);i(l)}}}))}includeEntry(e,r,n){let i=gs.basename(r.uri);if(i.startsWith("."))return!1;if(r.isDirectory)return i!=="node_modules"&&i!=="out";if(r.isFile){let a=gs.extname(r.uri);return n.includes(a)}return!1}}});function jE(t){return Array.isArray(t)&&(t.length===0||"name"in t[0])}function BI(t){return t&&"modes"in t&&"defaultMode"in t}function PI(t){return!jE(t)&&!BI(t)}var cb,XE,Rp,KE=N(()=>{"use strict";mf();cb=class{static{o(this,"DefaultLexerErrorMessageProvider")}buildUnexpectedCharactersMessage(e,r,n,i,a){return Kg.buildUnexpectedCharactersMessage(e,r,n,i,a)}buildUnableToPopLexerModeMessage(e){return Kg.buildUnableToPopLexerModeMessage(e)}},XE={mode:"full"},Rp=class{static{o(this,"DefaultLexer")}constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;let r=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(r);let n=PI(r)?Object.values(r):r,i=e.LanguageMetaData.mode==="production";this.chevrotainLexer=new Kn(n,{positionTracking:"full",skipValidations:i,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,r=XE){var n,i,a;let s=this.chevrotainLexer.tokenize(e);return{tokens:s.tokens,errors:s.errors,hidden:(n=s.groups.hidden)!==null&&n!==void 0?n:[],report:(a=(i=this.tokenBuilder).flushLexingReport)===null||a===void 0?void 0:a.call(i,e)}}toTokenTypeDictionary(e){if(PI(e))return e;let r=BI(e)?Object.values(e.modes).flat():e,n={};return r.forEach(i=>n[i.name]=i),n}};o(jE,"isTokenTypeArray");o(BI,"isIMultiModeLexerDefinition");o(PI,"isTokenTypeDictionary")});function zI(t,e,r){let n,i;typeof t=="string"?(i=e,n=r):(i=t.range.start,n=e),i||(i=jr.create(0,0));let a=due(t),s=VI(n),l=X$e({lines:a,position:i,options:s});return J$e({index:0,tokens:l,position:i})}function GI(t,e){let r=VI(e),n=due(t);if(n.length===0)return!1;let i=n[0],a=n[n.length-1],s=r.start,l=r.end;return!!s?.exec(i)&&!!l?.exec(a)}function due(t){let e="";return typeof t=="string"?e=t:e=t.text,e.split(PN)}function X$e(t){var e,r,n;let i=[],a=t.position.line,s=t.position.character;for(let l=0;l=f.length){if(i.length>0){let m=jr.create(a,s);i.push({type:"break",content:"",range:Br.create(m,m)})}}else{hue.lastIndex=d;let m=hue.exec(f);if(m){let g=m[0],y=m[1],v=jr.create(a,s+d),x=jr.create(a,s+d+g.length);i.push({type:"tag",content:y,range:Br.create(v,x)}),d+=g.length,d=$I(f,d)}if(d0&&i[i.length-1].type==="break"?i.slice(0,-1):i}function j$e(t,e,r,n){let i=[];if(t.length===0){let a=jr.create(r,n),s=jr.create(r,n+e.length);i.push({type:"text",content:e,range:Br.create(a,s)})}else{let a=0;for(let l of t){let u=l.index,h=e.substring(a,u);h.length>0&&i.push({type:"text",content:e.substring(a,u),range:Br.create(jr.create(r,a+n),jr.create(r,u+n))});let f=h.length+1,d=l[1];if(i.push({type:"inline-tag",content:d,range:Br.create(jr.create(r,a+f+n),jr.create(r,a+f+d.length+n))}),f+=d.length,l.length===4){f+=l[2].length;let p=l[3];i.push({type:"text",content:p,range:Br.create(jr.create(r,a+f+n),jr.create(r,a+f+p.length+n))})}else i.push({type:"text",content:"",range:Br.create(jr.create(r,a+f+n),jr.create(r,a+f+n))});a=u+l[0].length}let s=e.substring(a);s.length>0&&i.push({type:"text",content:s,range:Br.create(jr.create(r,a+n),jr.create(r,a+n+s.length))})}return i}function $I(t,e){let r=t.substring(e).match(K$e);return r?e+r.index:t.length}function Z$e(t){let e=t.match(Q$e);if(e&&typeof e.index=="number")return e.index}function J$e(t){var e,r,n,i;let a=jr.create(t.position.line,t.position.character);if(t.tokens.length===0)return new QE([],Br.create(a,a));let s=[];for(;t.index0){let u=$I(e,a);s=e.substring(u),e=e.substring(0,a)}return(t==="linkcode"||t==="link"&&r.link==="code")&&(s=`\`${s}\``),(i=(n=r.renderLink)===null||n===void 0?void 0:n.call(r,e,s))!==null&&i!==void 0?i:ize(e,s)}}function ize(t,e){try{return ms.parse(t,!0),`[${e}](${t})`}catch{return t}}function fue(t){return t.endsWith(` -`)?` -`:` - -`}var hue,Y$e,K$e,Q$e,QE,ub,hb,ZE,UI=N(()=>{"use strict";ZM();$g();Uc();o(zI,"parseJSDoc");o(GI,"isJSDoc");o(due,"getLines");hue=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,Y$e=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;o(X$e,"tokenize");o(j$e,"buildInlineTokens");K$e=/\S/,Q$e=/\s*$/;o($I,"skipWhitespace");o(Z$e,"lastCharacter");o(J$e,"parseJSDocComment");o(eze,"parseJSDocElement");o(tze,"appendEmptyLine");o(pue,"parseJSDocText");o(rze,"parseJSDocInline");o(mue,"parseJSDocTag");o(gue,"parseJSDocLine");o(VI,"normalizeOptions");o(FI,"normalizeOption");QE=class{static{o(this,"JSDocCommentImpl")}constructor(e,r){this.elements=e,this.range=r}getTag(e){return this.getAllTags().find(r=>r.name===e)}getTags(e){return this.getAllTags().filter(r=>r.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(let r of this.elements)if(e.length===0)e=r.toString();else{let n=r.toString();e+=fue(e)+n}return e.trim()}toMarkdown(e){let r="";for(let n of this.elements)if(r.length===0)r=n.toMarkdown(e);else{let i=n.toMarkdown(e);r+=fue(r)+i}return r.trim()}},ub=class{static{o(this,"JSDocTagImpl")}constructor(e,r,n,i){this.name=e,this.content=r,this.inline=n,this.range=i}toString(){let e=`@${this.name}`,r=this.content.toString();return this.content.inlines.length===1?e=`${e} ${r}`:this.content.inlines.length>1&&(e=`${e} -${r}`),this.inline?`{${e}}`:e}toMarkdown(e){var r,n;return(n=(r=e?.renderTag)===null||r===void 0?void 0:r.call(e,this))!==null&&n!==void 0?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){let r=this.content.toMarkdown(e);if(this.inline){let a=nze(this.name,r,e??{});if(typeof a=="string")return a}let n="";e?.tag==="italic"||e?.tag===void 0?n="*":e?.tag==="bold"?n="**":e?.tag==="bold-italic"&&(n="***");let i=`${n}@${this.name}${n}`;return this.content.inlines.length===1?i=`${i} \u2014 ${r}`:this.content.inlines.length>1&&(i=`${i} -${r}`),this.inline?`{${i}}`:i}};o(nze,"renderInlineTag");o(ize,"renderLinkDefault");hb=class{static{o(this,"JSDocTextImpl")}constructor(e,r){this.inlines=e,this.range=r}toString(){let e="";for(let r=0;rn.range.start.line&&(e+=` -`)}return e}toMarkdown(e){let r="";for(let n=0;ni.range.start.line&&(r+=` -`)}return r}},ZE=class{static{o(this,"JSDocLineImpl")}constructor(e,r){this.text=e,this.range=r}toString(){return this.text}toMarkdown(){return this.text}};o(fue,"fillNewlines")});var fb,HI=N(()=>{"use strict";cs();UI();fb=class{static{o(this,"JSDocDocumentationProvider")}constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){let r=this.commentProvider.getComment(e);if(r&&GI(r))return zI(r).toMarkdown({renderLink:o((i,a)=>this.documentationLinkRenderer(e,i,a),"renderLink"),renderTag:o(i=>this.documentationTagRenderer(e,i),"renderTag")})}documentationLinkRenderer(e,r,n){var i;let a=(i=this.findNameInPrecomputedScopes(e,r))!==null&&i!==void 0?i:this.findNameInGlobalScope(e,r);if(a&&a.nameSegment){let s=a.nameSegment.range.start.line+1,l=a.nameSegment.range.start.character+1,u=a.documentUri.with({fragment:`L${s},${l}`});return`[${n}](${u.toString()})`}else return}documentationTagRenderer(e,r){}findNameInPrecomputedScopes(e,r){let i=$a(e).precomputedScopes;if(!i)return;let a=e;do{let l=i.get(a).find(u=>u.name===r);if(l)return l;a=a.$container}while(a)}findNameInGlobalScope(e,r){return this.indexManager.allElements().find(i=>i.name===r)}}});var db,WI=N(()=>{"use strict";WE();Ol();db=class{static{o(this,"DefaultCommentProvider")}constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var r;return CI(e)?e.$comment:(r=uN(e.$cstNode,this.grammarConfig().multilineCommentRules))===null||r===void 0?void 0:r.text}}});var pb,qI,YI,XI=N(()=>{"use strict";Qo();YE();pb=class{static{o(this,"DefaultAsyncParser")}constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,r){return Promise.resolve(this.syncParser.parse(e))}},qI=class{static{o(this,"AbstractThreadedAsyncParser")}constructor(e){this.threadCount=8,this.terminationDelay=200,this.workerPool=[],this.queue=[],this.hydrator=e.serializer.Hydrator}initializeWorkers(){for(;this.workerPool.length{if(this.queue.length>0){let r=this.queue.shift();r&&(e.lock(),r.resolve(e))}}),this.workerPool.push(e)}}async parse(e,r){let n=await this.acquireParserWorker(r),i=new ps,a,s=r.onCancellationRequested(()=>{a=setTimeout(()=>{this.terminateWorker(n)},this.terminationDelay)});return n.parse(e).then(l=>{let u=this.hydrator.hydrate(l);i.resolve(u)}).catch(l=>{i.reject(l)}).finally(()=>{s.dispose(),clearTimeout(a)}),i.promise}terminateWorker(e){e.terminate();let r=this.workerPool.indexOf(e);r>=0&&this.workerPool.splice(r,1)}async acquireParserWorker(e){this.initializeWorkers();for(let n of this.workerPool)if(n.ready)return n.lock(),n;let r=new ps;return e.onCancellationRequested(()=>{let n=this.queue.indexOf(r);n>=0&&this.queue.splice(n,1),r.reject(Gc)}),this.queue.push(r),r.promise}},YI=class{static{o(this,"ParserWorker")}get ready(){return this._ready}get onReady(){return this.onReadyEmitter.event}constructor(e,r,n,i){this.onReadyEmitter=new Zn.Emitter,this.deferred=new ps,this._ready=!0,this._parsing=!1,this.sendMessage=e,this._terminate=i,r(a=>{let s=a;this.deferred.resolve(s),this.unlock()}),n(a=>{this.deferred.reject(a),this.unlock()})}terminate(){this.deferred.reject(Gc),this._terminate()}lock(){this._ready=!1}unlock(){this._parsing=!1,this._ready=!0,this.onReadyEmitter.fire()}parse(e){if(this._parsing)throw new Error("Parser worker is busy");return this._parsing=!0,this.deferred=new ps,this.sendMessage(e),this.deferred.promise}}});var mb,jI=N(()=>{"use strict";Ko();Qo();mb=class{static{o(this,"DefaultWorkspaceLock")}constructor(){this.previousTokenSource=new yr.CancellationTokenSource,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();let r=GE();return this.previousTokenSource=r,this.enqueue(this.writeQueue,e,r.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,r,n=yr.CancellationToken.None){let i=new ps,a={action:r,deferred:i,cancellationToken:n};return e.push(a),this.performNextOperation(),i.promise}async performNextOperation(){if(!this.done)return;let e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else if(this.readQueue.length>0)e.push(...this.readQueue.splice(0,this.readQueue.length));else return;this.done=!1,await Promise.all(e.map(async({action:r,deferred:n,cancellationToken:i})=>{try{let a=await Promise.resolve().then(()=>r(i));n.resolve(a)}catch(a){Vc(a)?n.resolve(void 0):n.reject(a)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}});var gb,KI=N(()=>{"use strict";RE();Pc();Il();cs();T1();Ol();gb=class{static{o(this,"DefaultHydrator")}constructor(e){this.grammarElementIdMap=new _p,this.tokenTypeIdMap=new _p,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(r=>Object.assign(Object.assign({},r),{message:r.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){let r=new Map,n=new Map;for(let i of jo(e))r.set(i,{});if(e.$cstNode)for(let i of sp(e.$cstNode))n.set(i,{});return{astNodes:r,cstNodes:n}}dehydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode!==void 0&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,r));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)si(l)?s.push(this.dehydrateAstNode(l,r)):ya(l)?s.push(this.dehydrateReference(l,r)):s.push(l)}else si(a)?n[i]=this.dehydrateAstNode(a,r):ya(a)?n[i]=this.dehydrateReference(a,r):a!==void 0&&(n[i]=a);return n}dehydrateReference(e,r){let n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=r.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,r){let n=r.cstNodes.get(e);return U2(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=r.astNodes.get(e.astNode),Ml(e)?n.content=e.content.map(i=>this.dehydrateCstNode(i,r)):hf(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){let r=e.value,n=this.createHydrationContext(r);return"$cstNode"in r&&this.hydrateCstNode(r.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(r,n)}}createHydrationContext(e){let r=new Map,n=new Map;for(let a of jo(e))r.set(a,{});let i;if(e.$cstNode)for(let a of sp(e.$cstNode)){let s;"fullText"in a?(s=new p1(a.fullText),i=s):"content"in a?s=new Sp:"tokenType"in a&&(s=this.hydrateCstLeafNode(a)),s&&(n.set(a,s),s.root=i)}return{astNodes:r,cstNodes:n}}hydrateAstNode(e,r){let n=r.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=r.cstNodes.get(e.$cstNode));for(let[i,a]of Object.entries(e))if(!i.startsWith("$"))if(Array.isArray(a)){let s=[];n[i]=s;for(let l of a)si(l)?s.push(this.setParent(this.hydrateAstNode(l,r),n)):ya(l)?s.push(this.hydrateReference(l,n,i,r)):s.push(l)}else si(a)?n[i]=this.setParent(this.hydrateAstNode(a,r),n):ya(a)?n[i]=this.hydrateReference(a,n,i,r):a!==void 0&&(n[i]=a);return n}setParent(e,r){return e.$container=r,e}hydrateReference(e,r,n,i){return this.linker.buildReference(r,n,i.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,r,n=0){let i=r.cstNodes.get(e);if(typeof e.grammarSource=="number"&&(i.grammarSource=this.getGrammarElement(e.grammarSource)),i.astNode=r.astNodes.get(e.astNode),Ml(i))for(let a of e.content){let s=this.hydrateCstNode(a,r,n++);i.content.push(s)}return i}hydrateCstLeafNode(e){let r=this.getTokenType(e.tokenType),n=e.offset,i=e.length,a=e.startLine,s=e.startColumn,l=e.endLine,u=e.endColumn,h=e.hidden;return new Ep(n,i,{start:{line:a,character:s},end:{line:l,character:u}},r,h)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){return this.grammarElementIdMap.size===0&&this.createGrammarElementIdMap(),this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(let r of jo(this.grammar))Q2(r)&&this.grammarElementIdMap.set(r,e++)}}});function va(t){return{documentation:{CommentProvider:o(e=>new db(e),"CommentProvider"),DocumentationProvider:o(e=>new fb(e),"DocumentationProvider")},parser:{AsyncParser:o(e=>new pb(e),"AsyncParser"),GrammarConfig:o(e=>QN(e),"GrammarConfig"),LangiumParser:o(e=>aI(e),"LangiumParser"),CompletionParser:o(e=>nI(e),"CompletionParser"),ValueConverter:o(()=>new Ap,"ValueConverter"),TokenBuilder:o(()=>new ju,"TokenBuilder"),Lexer:o(e=>new Rp(e),"Lexer"),ParserErrorMessageProvider:o(()=>new m1,"ParserErrorMessageProvider"),LexerErrorMessageProvider:o(()=>new cb,"LexerErrorMessageProvider")},workspace:{AstNodeLocator:o(()=>new ib,"AstNodeLocator"),AstNodeDescriptionProvider:o(e=>new rb(e),"AstNodeDescriptionProvider"),ReferenceDescriptionProvider:o(e=>new nb(e),"ReferenceDescriptionProvider")},references:{Linker:o(e=>new Hx(e),"Linker"),NameProvider:o(()=>new Wx,"NameProvider"),ScopeProvider:o(e=>new Kx(e),"ScopeProvider"),ScopeComputation:o(e=>new Yx(e),"ScopeComputation"),References:o(e=>new qx(e),"References")},serializer:{Hydrator:o(e=>new gb(e),"Hydrator"),JsonSerializer:o(e=>new Qx(e),"JsonSerializer")},validation:{DocumentValidator:o(e=>new tb(e),"DocumentValidator"),ValidationRegistry:o(e=>new Jx(e),"ValidationRegistry")},shared:o(()=>t.shared,"shared")}}function xa(t){return{ServiceRegistry:o(e=>new Zx(e),"ServiceRegistry"),workspace:{LangiumDocuments:o(e=>new Ux(e),"LangiumDocuments"),LangiumDocumentFactory:o(e=>new Vx(e),"LangiumDocumentFactory"),DocumentBuilder:o(e=>new sb(e),"DocumentBuilder"),IndexManager:o(e=>new ob(e),"IndexManager"),WorkspaceManager:o(e=>new lb(e),"WorkspaceManager"),FileSystemProvider:o(e=>t.fileSystemProvider(e),"FileSystemProvider"),WorkspaceLock:o(()=>new mb,"WorkspaceLock"),ConfigurationProvider:o(e=>new ab(e),"ConfigurationProvider")}}}var QI=N(()=>{"use strict";ZN();iI();sI();PE();oI();bI();TI();wI();kI();SI();WE();AI();_I();eb();DI();LI();RI();MI();b1();II();OI();KE();HI();WI();zx();XI();jI();KI();o(va,"createDefaultCoreModule");o(xa,"createDefaultSharedCoreModule")});function Gn(t,e,r,n,i,a,s,l,u){let h=[t,e,r,n,i,a,s,l,u].reduce(JE,{});return Tue(h)}function bue(t){if(t&&t[xue])for(let e of Object.values(t))bue(e);return t}function Tue(t,e){let r=new Proxy({},{deleteProperty:o(()=>!1,"deleteProperty"),set:o(()=>{throw new Error("Cannot set property on injected service container")},"set"),get:o((n,i)=>i===xue?!0:vue(n,i,t,e||r),"get"),getOwnPropertyDescriptor:o((n,i)=>(vue(n,i,t,e||r),Object.getOwnPropertyDescriptor(n,i)),"getOwnPropertyDescriptor"),has:o((n,i)=>i in t,"has"),ownKeys:o(()=>[...Object.getOwnPropertyNames(t)],"ownKeys")});return r}function vue(t,e,r,n){if(e in t){if(t[e]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:t[e]});if(t[e]===yue)throw new Error('Cycle detected. Please make "'+String(e)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return t[e]}else if(e in r){let i=r[e];t[e]=yue;try{t[e]=typeof i=="function"?i(n):Tue(i,n)}catch(a){throw t[e]=a instanceof Error?a:void 0,a}return t[e]}else return}function JE(t,e){if(e){for(let[r,n]of Object.entries(e))if(n!==void 0){let i=t[r];i!==null&&n!==null&&typeof i=="object"&&typeof n=="object"?t[r]=JE(i,n):t[r]=n}}return t}var ZI,xue,yue,JI=N(()=>{"use strict";(function(t){t.merge=(e,r)=>JE(JE({},e),r)})(ZI||(ZI={}));o(Gn,"inject");xue=Symbol("isProxy");o(bue,"eagerLoad");o(Tue,"_inject");yue=Symbol();o(vue,"_resolve");o(JE,"_merge")});var wue=N(()=>{"use strict"});var kue=N(()=>{"use strict";WI();HI();UI()});var Eue=N(()=>{"use strict"});var Sue=N(()=>{"use strict";ZN();Eue()});var eO,Np,eS,tO,Cue=N(()=>{"use strict";mf();PE();KE();eO={indentTokenName:"INDENT",dedentTokenName:"DEDENT",whitespaceTokenName:"WS",ignoreIndentationDelimiters:[]};(function(t){t.REGULAR="indentation-sensitive",t.IGNORE_INDENTATION="ignore-indentation"})(Np||(Np={}));eS=class extends ju{static{o(this,"IndentationAwareTokenBuilder")}constructor(e=eO){super(),this.indentationStack=[0],this.whitespaceRegExp=/[ \t]+/y,this.options=Object.assign(Object.assign({},eO),e),this.indentTokenType=df({name:this.options.indentTokenName,pattern:this.indentMatcher.bind(this),line_breaks:!1}),this.dedentTokenType=df({name:this.options.dedentTokenName,pattern:this.dedentMatcher.bind(this),line_breaks:!1})}buildTokens(e,r){let n=super.buildTokens(e,r);if(!jE(n))throw new Error("Invalid tokens built by default builder");let{indentTokenName:i,dedentTokenName:a,whitespaceTokenName:s,ignoreIndentationDelimiters:l}=this.options,u,h,f,d=[];for(let p of n){for(let[m,g]of l)p.name===m?p.PUSH_MODE=Np.IGNORE_INDENTATION:p.name===g&&(p.POP_MODE=!0);p.name===a?u=p:p.name===i?h=p:p.name===s?f=p:d.push(p)}if(!u||!h||!f)throw new Error("Some indentation/whitespace tokens not found!");return l.length>0?{modes:{[Np.REGULAR]:[u,h,...d,f],[Np.IGNORE_INDENTATION]:[...d,f]},defaultMode:Np.REGULAR}:[u,h,f,...d]}flushLexingReport(e){let r=super.flushLexingReport(e);return Object.assign(Object.assign({},r),{remainingDedents:this.flushRemainingDedents(e)})}isStartOfLine(e,r){return r===0||`\r -`.includes(e[r-1])}matchWhitespace(e,r,n,i){var a;this.whitespaceRegExp.lastIndex=r;let s=this.whitespaceRegExp.exec(e);return{currIndentLevel:(a=s?.[0].length)!==null&&a!==void 0?a:0,prevIndentLevel:this.indentationStack.at(-1),match:s}}createIndentationTokenInstance(e,r,n,i){let a=this.getLineNumber(r,i);return Wu(e,n,i,i+n.length,a,a,1,n.length)}getLineNumber(e,r){return e.substring(0,r).split(/\r\n|\r|\n/).length}indentMatcher(e,r,n,i){if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:a,prevIndentLevel:s,match:l}=this.matchWhitespace(e,r,n,i);return a<=s?null:(this.indentationStack.push(a),l)}dedentMatcher(e,r,n,i){var a,s,l,u;if(!this.isStartOfLine(e,r))return null;let{currIndentLevel:h,prevIndentLevel:f,match:d}=this.matchWhitespace(e,r,n,i);if(h>=f)return null;let p=this.indentationStack.lastIndexOf(h);if(p===-1)return this.diagnostics.push({severity:"error",message:`Invalid dedent level ${h} at offset: ${r}. Current indentation stack: ${this.indentationStack}`,offset:r,length:(s=(a=d?.[0])===null||a===void 0?void 0:a.length)!==null&&s!==void 0?s:0,line:this.getLineNumber(e,r),column:1}),null;let m=this.indentationStack.length-p-1,g=(u=(l=e.substring(0,r).match(/[\r\n]+$/))===null||l===void 0?void 0:l[0].length)!==null&&u!==void 0?u:1;for(let y=0;y1;)r.push(this.createIndentationTokenInstance(this.dedentTokenType,e,"",e.length)),this.indentationStack.pop();return this.indentationStack=[0],r}},tO=class extends Rp{static{o(this,"IndentationAwareLexer")}constructor(e){if(super(e),e.parser.TokenBuilder instanceof eS)this.indentationTokenBuilder=e.parser.TokenBuilder;else throw new Error("IndentationAwareLexer requires an accompanying IndentationAwareTokenBuilder")}tokenize(e,r=XE){let n=super.tokenize(e),i=n.report;r?.mode==="full"&&n.tokens.push(...i.remainingDedents),i.remainingDedents=[];let{indentTokenType:a,dedentTokenType:s}=this.indentationTokenBuilder,l=a.tokenTypeIdx,u=s.tokenTypeIdx,h=[],f=n.tokens.length-1;for(let d=0;d=0&&h.push(n.tokens[f]),n.tokens=h,n}}});var Aue=N(()=>{"use strict"});var _ue=N(()=>{"use strict";XI();iI();RE();Cue();sI();zx();KE();OE();Aue();PE();oI()});var Due=N(()=>{"use strict";bI();TI();wI();EI();kI();SI()});var Lue=N(()=>{"use strict";KI();WE()});var tS,ba,rO=N(()=>{"use strict";tS=class{static{o(this,"EmptyFileSystemProvider")}readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}},ba={fileSystemProvider:o(()=>new tS,"fileSystemProvider")}});function oze(){let t=Gn(xa(ba),sze),e=Gn(va({shared:t}),aze);return t.ServiceRegistry.register(e),e}function Hc(t){var e;let r=oze(),n=r.serializer.JsonSerializer.deserialize(t);return r.shared.workspace.LangiumDocumentFactory.fromModel(n,ms.parse(`memory://${(e=n.name)!==null&&e!==void 0?e:"grammar"}.langium`)),n}var aze,sze,Rue=N(()=>{"use strict";QI();JI();Pc();rO();Uc();aze={Grammar:o(()=>{},"Grammar"),LanguageMetaData:o(()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"}),"LanguageMetaData")},sze={AstReflection:o(()=>new Og,"AstReflection")};o(oze,"createMinimalGrammarServices");o(Hc,"loadGrammarFromJson")});var Gr={};ur(Gr,{AstUtils:()=>Ik,BiMap:()=>_p,Cancellation:()=>yr,ContextCache:()=>Dp,CstUtils:()=>Ek,DONE_RESULT:()=>Ba,Deferred:()=>ps,Disposable:()=>vf,DisposableCache:()=>k1,DocumentCache:()=>UE,EMPTY_STREAM:()=>H2,ErrorWithLocation:()=>lp,GrammarUtils:()=>$k,MultiMap:()=>zl,OperationCancelled:()=>Gc,Reduction:()=>jm,RegExpUtils:()=>Bk,SimpleCache:()=>jx,StreamImpl:()=>co,TreeStreamImpl:()=>Mc,URI:()=>ms,UriUtils:()=>gs,WorkspaceCache:()=>E1,assertUnreachable:()=>Oc,delayNextTick:()=>gI,interruptAndCheck:()=>wi,isOperationCancelled:()=>Vc,loadGrammarFromJson:()=>Hc,setInterruptionPeriod:()=>tue,startCancelableOperation:()=>GE,stream:()=>en});var Nue=N(()=>{"use strict";HE();YE();Cr(Gr,Zn);T1();NI();Sk();Rue();Qo();Gs();Uc();cs();Ko();Ol();Fl();$g()});var Mue=N(()=>{"use strict";_I();eb()});var Iue=N(()=>{"use strict";DI();LI();RI();MI();b1();rO();II();jI();OI()});var Ta={};ur(Ta,{AbstractAstReflection:()=>ip,AbstractCstNode:()=>Px,AbstractLangiumParser:()=>Bx,AbstractParserErrorMessageProvider:()=>ME,AbstractThreadedAsyncParser:()=>qI,AstUtils:()=>Ik,BiMap:()=>_p,Cancellation:()=>yr,CompositeCstNodeImpl:()=>Sp,ContextCache:()=>Dp,CstNodeBuilder:()=>Ox,CstUtils:()=>Ek,DEFAULT_TOKENIZE_OPTIONS:()=>XE,DONE_RESULT:()=>Ba,DatatypeSymbol:()=>NE,DefaultAstNodeDescriptionProvider:()=>rb,DefaultAstNodeLocator:()=>ib,DefaultAsyncParser:()=>pb,DefaultCommentProvider:()=>db,DefaultConfigurationProvider:()=>ab,DefaultDocumentBuilder:()=>sb,DefaultDocumentValidator:()=>tb,DefaultHydrator:()=>gb,DefaultIndexManager:()=>ob,DefaultJsonSerializer:()=>Qx,DefaultLangiumDocumentFactory:()=>Vx,DefaultLangiumDocuments:()=>Ux,DefaultLexer:()=>Rp,DefaultLexerErrorMessageProvider:()=>cb,DefaultLinker:()=>Hx,DefaultNameProvider:()=>Wx,DefaultReferenceDescriptionProvider:()=>nb,DefaultReferences:()=>qx,DefaultScopeComputation:()=>Yx,DefaultScopeProvider:()=>Kx,DefaultServiceRegistry:()=>Zx,DefaultTokenBuilder:()=>ju,DefaultValueConverter:()=>Ap,DefaultWorkspaceLock:()=>mb,DefaultWorkspaceManager:()=>lb,Deferred:()=>ps,Disposable:()=>vf,DisposableCache:()=>k1,DocumentCache:()=>UE,DocumentState:()=>kn,DocumentValidator:()=>Zo,EMPTY_SCOPE:()=>q$e,EMPTY_STREAM:()=>H2,EmptyFileSystem:()=>ba,EmptyFileSystemProvider:()=>tS,ErrorWithLocation:()=>lp,GrammarAST:()=>J2,GrammarUtils:()=>$k,IndentationAwareLexer:()=>tO,IndentationAwareTokenBuilder:()=>eS,JSDocDocumentationProvider:()=>fb,LangiumCompletionParser:()=>$x,LangiumParser:()=>Fx,LangiumParserErrorMessageProvider:()=>m1,LeafCstNodeImpl:()=>Ep,LexingMode:()=>Np,MapScope:()=>Xx,Module:()=>ZI,MultiMap:()=>zl,OperationCancelled:()=>Gc,ParserWorker:()=>YI,Reduction:()=>jm,RegExpUtils:()=>Bk,RootCstNodeImpl:()=>p1,SimpleCache:()=>jx,StreamImpl:()=>co,StreamScope:()=>w1,TextDocument:()=>v1,TreeStreamImpl:()=>Mc,URI:()=>ms,UriUtils:()=>gs,ValidationCategory:()=>S1,ValidationRegistry:()=>Jx,ValueConverter:()=>zc,WorkspaceCache:()=>E1,assertUnreachable:()=>Oc,createCompletionParser:()=>nI,createDefaultCoreModule:()=>va,createDefaultSharedCoreModule:()=>xa,createGrammarConfig:()=>QN,createLangiumParser:()=>aI,createParser:()=>Gx,delayNextTick:()=>gI,diagnosticData:()=>Lp,eagerLoad:()=>bue,getDiagnosticRange:()=>cue,indentationBuilderDefaultOptions:()=>eO,inject:()=>Gn,interruptAndCheck:()=>wi,isAstNode:()=>si,isAstNodeDescription:()=>sN,isAstNodeWithComment:()=>CI,isCompositeCstNode:()=>Ml,isIMultiModeLexerDefinition:()=>BI,isJSDoc:()=>GI,isLeafCstNode:()=>hf,isLinkingError:()=>ap,isNamed:()=>oue,isOperationCancelled:()=>Vc,isReference:()=>ya,isRootCstNode:()=>U2,isTokenTypeArray:()=>jE,isTokenTypeDictionary:()=>PI,loadGrammarFromJson:()=>Hc,parseJSDoc:()=>zI,prepareLangiumParser:()=>Xce,setInterruptionPeriod:()=>tue,startCancelableOperation:()=>GE,stream:()=>en,toDiagnosticData:()=>uue,toDiagnosticSeverity:()=>qE});var po=N(()=>{"use strict";QI();JI();AI();wue();Il();kue();Sue();_ue();Due();Lue();Nue();Cr(Ta,Gr);Mue();Iue();Pc()});function Vue(t){return Gl.isInstance(t,yb)}function Uue(t){return Gl.isInstance(t,C1)}function Hue(t){return Gl.isInstance(t,A1)}function Wue(t){return Gl.isInstance(t,_1)}function que(t){return Gl.isInstance(t,vb)}function Yue(t){return Gl.isInstance(t,D1)}function Xue(t){return Gl.isInstance(t,xb)}function jue(t){return Gl.isInstance(t,bb)}function Kue(t){return Gl.isInstance(t,Tb)}function Que(t){return Gl.isInstance(t,wb)}function Zue(t){return Gl.isInstance(t,kb)}var lze,xt,fO,yb,rS,C1,nS,iS,nO,A1,iO,aO,sO,_1,oO,vb,aS,lO,D1,cO,xb,bb,Tb,wb,cS,uO,kb,hO,sS,oS,lS,Jue,Gl,Oue,cze,Pue,uze,Bue,hze,Fue,fze,$ue,dze,zue,pze,Gue,mze,gze,yze,vze,xze,bze,Tze,wze,ys,dO,pO,mO,gO,yO,vO,xO,kze,Eze,Sze,Cze,xf,Ku,Ga,Aze,Va=N(()=>{"use strict";po();po();po();po();lze=Object.defineProperty,xt=o((t,e)=>lze(t,"name",{value:e,configurable:!0}),"__name"),fO="Statement",yb="Architecture";o(Vue,"isArchitecture");xt(Vue,"isArchitecture");rS="Axis",C1="Branch";o(Uue,"isBranch");xt(Uue,"isBranch");nS="Checkout",iS="CherryPicking",nO="ClassDefStatement",A1="Commit";o(Hue,"isCommit");xt(Hue,"isCommit");iO="Curve",aO="Edge",sO="Entry",_1="GitGraph";o(Wue,"isGitGraph");xt(Wue,"isGitGraph");oO="Group",vb="Info";o(que,"isInfo");xt(que,"isInfo");aS="Item",lO="Junction",D1="Merge";o(Yue,"isMerge");xt(Yue,"isMerge");cO="Option",xb="Packet";o(Xue,"isPacket");xt(Xue,"isPacket");bb="PacketBlock";o(jue,"isPacketBlock");xt(jue,"isPacketBlock");Tb="Pie";o(Kue,"isPie");xt(Kue,"isPie");wb="PieSection";o(Que,"isPieSection");xt(Que,"isPieSection");cS="Radar",uO="Service",kb="Treemap";o(Zue,"isTreemap");xt(Zue,"isTreemap");hO="TreemapRow",sS="Direction",oS="Leaf",lS="Section",Jue=class extends ip{static{o(this,"MermaidAstReflection")}static{xt(this,"MermaidAstReflection")}getAllTypes(){return[yb,rS,C1,nS,iS,nO,A1,iO,sS,aO,sO,_1,oO,vb,aS,lO,oS,D1,cO,xb,bb,Tb,wb,cS,lS,uO,fO,kb,hO]}computeIsSubtype(t,e){switch(t){case C1:case nS:case iS:case A1:case D1:return this.isSubtype(fO,e);case sS:return this.isSubtype(_1,e);case oS:case lS:return this.isSubtype(aS,e);default:return!1}}getReferenceType(t){let e=`${t.container.$type}:${t.property}`;switch(e){case"Entry:axis":return rS;default:throw new Error(`${e} is not a valid reference id.`)}}getTypeMetaData(t){switch(t){case yb:return{name:yb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case rS:return{name:rS,properties:[{name:"label"},{name:"name"}]};case C1:return{name:C1,properties:[{name:"name"},{name:"order"}]};case nS:return{name:nS,properties:[{name:"branch"}]};case iS:return{name:iS,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case nO:return{name:nO,properties:[{name:"className"},{name:"styleText"}]};case A1:return{name:A1,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case iO:return{name:iO,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case aO:return{name:aO,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case sO:return{name:sO,properties:[{name:"axis"},{name:"value"}]};case _1:return{name:_1,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case oO:return{name:oO,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case vb:return{name:vb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case aS:return{name:aS,properties:[{name:"classSelector"},{name:"name"}]};case lO:return{name:lO,properties:[{name:"id"},{name:"in"}]};case D1:return{name:D1,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case cO:return{name:cO,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case xb:return{name:xb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case bb:return{name:bb,properties:[{name:"bits"},{name:"end"},{name:"label"},{name:"start"}]};case Tb:return{name:Tb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case wb:return{name:wb,properties:[{name:"label"},{name:"value"}]};case cS:return{name:cS,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case uO:return{name:uO,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case kb:return{name:kb,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"},{name:"TreemapRows",defaultValue:[]}]};case hO:return{name:hO,properties:[{name:"indent"},{name:"item"}]};case sS:return{name:sS,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};case oS:return{name:oS,properties:[{name:"classSelector"},{name:"name"},{name:"value"}]};case lS:return{name:lS,properties:[{name:"classSelector"},{name:"name"}]};default:return{name:t,properties:[]}}}},Gl=new Jue,cze=xt(()=>Oue??(Oue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"InfoGrammar"),uze=xt(()=>Pue??(Pue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"packet"},{"$type":"Keyword","value":"packet-beta"}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PacketGrammar"),hze=xt(()=>Bue??(Bue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"PieGrammar"),fze=xt(()=>Fue??(Fue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"ArchitectureGrammar"),dze=xt(()=>$ue??($ue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"GitGraph","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}`)),"GitGraphGrammar"),pze=xt(()=>zue??(zue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Radar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'([^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"types":[],"usedGrammars":[]}`)),"RadarGrammar"),mze=xt(()=>Gue??(Gue=Hc(`{"$type":"Grammar","isDeclared":true,"name":"Treemap","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","}},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|'[^']*'/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}`)),"TreemapGrammar"),gze={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},yze={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},vze={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},xze={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},bze={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},Tze={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},wze={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ys={AstReflection:xt(()=>new Jue,"AstReflection")},dO={Grammar:xt(()=>cze(),"Grammar"),LanguageMetaData:xt(()=>gze,"LanguageMetaData"),parser:{}},pO={Grammar:xt(()=>uze(),"Grammar"),LanguageMetaData:xt(()=>yze,"LanguageMetaData"),parser:{}},mO={Grammar:xt(()=>hze(),"Grammar"),LanguageMetaData:xt(()=>vze,"LanguageMetaData"),parser:{}},gO={Grammar:xt(()=>fze(),"Grammar"),LanguageMetaData:xt(()=>xze,"LanguageMetaData"),parser:{}},yO={Grammar:xt(()=>dze(),"Grammar"),LanguageMetaData:xt(()=>bze,"LanguageMetaData"),parser:{}},vO={Grammar:xt(()=>pze(),"Grammar"),LanguageMetaData:xt(()=>Tze,"LanguageMetaData"),parser:{}},xO={Grammar:xt(()=>mze(),"Grammar"),LanguageMetaData:xt(()=>wze,"LanguageMetaData"),parser:{}},kze=/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,Eze=/accTitle[\t ]*:([^\n\r]*)/,Sze=/title([\t ][^\n\r]*|)/,Cze={ACC_DESCR:kze,ACC_TITLE:Eze,TITLE:Sze},xf=class extends Ap{static{o(this,"AbstractMermaidValueConverter")}static{xt(this,"AbstractMermaidValueConverter")}runConverter(t,e,r){let n=this.runCommonConverter(t,e,r);return n===void 0&&(n=this.runCustomConverter(t,e,r)),n===void 0?super.runConverter(t,e,r):n}runCommonConverter(t,e,r){let n=Cze[t.name];if(n===void 0)return;let i=n.exec(e);if(i!==null){if(i[1]!==void 0)return i[1].trim().replace(/[\t ]{2,}/gm," ");if(i[2]!==void 0)return i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,` -`)}}},Ku=class extends xf{static{o(this,"CommonValueConverter")}static{xt(this,"CommonValueConverter")}runCustomConverter(t,e,r){}},Ga=class extends ju{static{o(this,"AbstractMermaidTokenBuilder")}static{xt(this,"AbstractMermaidTokenBuilder")}constructor(t){super(),this.keywords=new Set(t)}buildKeywordTokens(t,e,r){let n=super.buildKeywordTokens(t,e,r);return n.forEach(i=>{this.keywords.has(i.name)&&i.PATTERN!==void 0&&(i.PATTERN=new RegExp(i.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),n}},Aze=class extends Ga{static{o(this,"CommonTokenBuilder")}static{xt(this,"CommonTokenBuilder")}}});function hS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),yO,uS);return e.ServiceRegistry.register(r),{shared:e,GitGraph:r}}var _ze,uS,bO=N(()=>{"use strict";Va();po();_ze=class extends Ga{static{o(this,"GitGraphTokenBuilder")}static{xt(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},uS={parser:{TokenBuilder:xt(()=>new _ze,"TokenBuilder"),ValueConverter:xt(()=>new Ku,"ValueConverter")}};o(hS,"createGitGraphServices");xt(hS,"createGitGraphServices")});function dS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),dO,fS);return e.ServiceRegistry.register(r),{shared:e,Info:r}}var Dze,fS,TO=N(()=>{"use strict";Va();po();Dze=class extends Ga{static{o(this,"InfoTokenBuilder")}static{xt(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},fS={parser:{TokenBuilder:xt(()=>new Dze,"TokenBuilder"),ValueConverter:xt(()=>new Ku,"ValueConverter")}};o(dS,"createInfoServices");xt(dS,"createInfoServices")});function mS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),pO,pS);return e.ServiceRegistry.register(r),{shared:e,Packet:r}}var Lze,pS,wO=N(()=>{"use strict";Va();po();Lze=class extends Ga{static{o(this,"PacketTokenBuilder")}static{xt(this,"PacketTokenBuilder")}constructor(){super(["packet"])}},pS={parser:{TokenBuilder:xt(()=>new Lze,"TokenBuilder"),ValueConverter:xt(()=>new Ku,"ValueConverter")}};o(mS,"createPacketServices");xt(mS,"createPacketServices")});function yS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),mO,gS);return e.ServiceRegistry.register(r),{shared:e,Pie:r}}var Rze,Nze,gS,kO=N(()=>{"use strict";Va();po();Rze=class extends Ga{static{o(this,"PieTokenBuilder")}static{xt(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},Nze=class extends xf{static{o(this,"PieValueConverter")}static{xt(this,"PieValueConverter")}runCustomConverter(t,e,r){if(t.name==="PIE_SECTION_LABEL")return e.replace(/"/g,"").trim()}},gS={parser:{TokenBuilder:xt(()=>new Rze,"TokenBuilder"),ValueConverter:xt(()=>new Nze,"ValueConverter")}};o(yS,"createPieServices");xt(yS,"createPieServices")});function xS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),gO,vS);return e.ServiceRegistry.register(r),{shared:e,Architecture:r}}var Mze,Ize,vS,EO=N(()=>{"use strict";Va();po();Mze=class extends Ga{static{o(this,"ArchitectureTokenBuilder")}static{xt(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},Ize=class extends xf{static{o(this,"ArchitectureValueConverter")}static{xt(this,"ArchitectureValueConverter")}runCustomConverter(t,e,r){if(t.name==="ARCH_ICON")return e.replace(/[()]/g,"").trim();if(t.name==="ARCH_TEXT_ICON")return e.replace(/["()]/g,"");if(t.name==="ARCH_TITLE")return e.replace(/[[\]]/g,"").trim()}},vS={parser:{TokenBuilder:xt(()=>new Mze,"TokenBuilder"),ValueConverter:xt(()=>new Ize,"ValueConverter")}};o(xS,"createArchitectureServices");xt(xS,"createArchitectureServices")});function TS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),vO,bS);return e.ServiceRegistry.register(r),{shared:e,Radar:r}}var Oze,bS,SO=N(()=>{"use strict";Va();po();Oze=class extends Ga{static{o(this,"RadarTokenBuilder")}static{xt(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},bS={parser:{TokenBuilder:xt(()=>new Oze,"TokenBuilder"),ValueConverter:xt(()=>new Ku,"ValueConverter")}};o(TS,"createRadarServices");xt(TS,"createRadarServices")});function ehe(t){let e=t.validation.TreemapValidator,r=t.validation.ValidationRegistry;if(r){let n={Treemap:e.checkSingleRoot.bind(e)};r.register(n,e)}}function kS(t=ba){let e=Gn(xa(t),ys),r=Gn(va({shared:e}),xO,wS);return e.ServiceRegistry.register(r),ehe(r),{shared:e,Treemap:r}}var Pze,Bze,Fze,$ze,wS,CO=N(()=>{"use strict";Va();po();Pze=class extends Ga{static{o(this,"TreemapTokenBuilder")}static{xt(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},Bze=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,Fze=class extends xf{static{o(this,"TreemapValueConverter")}static{xt(this,"TreemapValueConverter")}runCustomConverter(t,e,r){if(t.name==="NUMBER2")return parseFloat(e.replace(/,/g,""));if(t.name==="SEPARATOR")return e.substring(1,e.length-1);if(t.name==="STRING2")return e.substring(1,e.length-1);if(t.name==="INDENTATION")return e.length;if(t.name==="ClassDef"){if(typeof e!="string")return e;let n=Bze.exec(e);if(n)return{$type:"ClassDefStatement",className:n[1],styleText:n[2]||void 0}}}};o(ehe,"registerValidationChecks");xt(ehe,"registerValidationChecks");$ze=class{static{o(this,"TreemapValidator")}static{xt(this,"TreemapValidator")}checkSingleRoot(t,e){let r;for(let n of t.TreemapRows)n.item&&(r===void 0&&n.indent===void 0?r=0:n.indent===void 0?e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}):r!==void 0&&r>=parseInt(n.indent,10)&&e("error","Multiple root nodes are not allowed in a treemap.",{node:n,property:"item"}))}},wS={parser:{TokenBuilder:xt(()=>new Pze,"TokenBuilder"),ValueConverter:xt(()=>new Fze,"ValueConverter")},validation:{TreemapValidator:xt(()=>new $ze,"TreemapValidator")}};o(kS,"createTreemapServices");xt(kS,"createTreemapServices")});var the={};ur(the,{InfoModule:()=>fS,createInfoServices:()=>dS});var rhe=N(()=>{"use strict";TO();Va()});var nhe={};ur(nhe,{PacketModule:()=>pS,createPacketServices:()=>mS});var ihe=N(()=>{"use strict";wO();Va()});var ahe={};ur(ahe,{PieModule:()=>gS,createPieServices:()=>yS});var she=N(()=>{"use strict";kO();Va()});var ohe={};ur(ohe,{ArchitectureModule:()=>vS,createArchitectureServices:()=>xS});var lhe=N(()=>{"use strict";EO();Va()});var che={};ur(che,{GitGraphModule:()=>uS,createGitGraphServices:()=>hS});var uhe=N(()=>{"use strict";bO();Va()});var hhe={};ur(hhe,{RadarModule:()=>bS,createRadarServices:()=>TS});var fhe=N(()=>{"use strict";SO();Va()});var dhe={};ur(dhe,{TreemapModule:()=>wS,createTreemapServices:()=>kS});var phe=N(()=>{"use strict";CO();Va()});async function vs(t,e){let r=zze[t];if(!r)throw new Error(`Unknown diagram type: ${t}`);Qu[t]||await r();let i=Qu[t].parse(e);if(i.lexerErrors.length>0||i.parserErrors.length>0)throw new Gze(i);return i.value}var Qu,zze,Gze,bf=N(()=>{"use strict";bO();TO();wO();kO();EO();SO();CO();Va();Qu={},zze={info:xt(async()=>{let{createInfoServices:t}=await Promise.resolve().then(()=>(rhe(),the)),e=t().Info.parser.LangiumParser;Qu.info=e},"info"),packet:xt(async()=>{let{createPacketServices:t}=await Promise.resolve().then(()=>(ihe(),nhe)),e=t().Packet.parser.LangiumParser;Qu.packet=e},"packet"),pie:xt(async()=>{let{createPieServices:t}=await Promise.resolve().then(()=>(she(),ahe)),e=t().Pie.parser.LangiumParser;Qu.pie=e},"pie"),architecture:xt(async()=>{let{createArchitectureServices:t}=await Promise.resolve().then(()=>(lhe(),ohe)),e=t().Architecture.parser.LangiumParser;Qu.architecture=e},"architecture"),gitGraph:xt(async()=>{let{createGitGraphServices:t}=await Promise.resolve().then(()=>(uhe(),che)),e=t().GitGraph.parser.LangiumParser;Qu.gitGraph=e},"gitGraph"),radar:xt(async()=>{let{createRadarServices:t}=await Promise.resolve().then(()=>(fhe(),hhe)),e=t().Radar.parser.LangiumParser;Qu.radar=e},"radar"),treemap:xt(async()=>{let{createTreemapServices:t}=await Promise.resolve().then(()=>(phe(),dhe)),e=t().Treemap.parser.LangiumParser;Qu.treemap=e},"treemap")};o(vs,"parse");xt(vs,"parse");Gze=class extends Error{static{o(this,"MermaidParseError")}constructor(t){let e=t.lexerErrors.map(n=>n.message).join(` -`),r=t.parserErrors.map(n=>n.message).join(` -`);super(`Parsing failed: ${e} ${r}`),this.result=t}static{xt(this,"MermaidParseError")}}});function Jo(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}var Mp=N(()=>{"use strict";o(Jo,"populateCommonDb")});var Kr,ES=N(()=>{"use strict";Kr={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4}});var Tf,SS=N(()=>{"use strict";Tf=class{constructor(e){this.init=e;this.records=this.init()}static{o(this,"ImperativeState")}reset(){this.records=this.init()}}});function AO(){return R9({length:7})}function Uze(t,e){let r=Object.create(null);return t.reduce((n,i)=>{let a=e(i);return r[a]||(r[a]=!0,n.push(i)),n},[])}function mhe(t,e,r){let n=t.indexOf(e);n===-1?t.push(r):t.splice(n,1,r)}function yhe(t){let e=t.reduce((i,a)=>i.seq>a.seq?i:a,t[0]),r="";t.forEach(function(i){i===e?r+=" *":r+=" |"});let n=[r,e.id,e.seq];for(let i in At.records.branches)At.records.branches.get(i)===e.id&&n.push(i);if(X.debug(n.join(" ")),e.parents&&e.parents.length==2&&e.parents[0]&&e.parents[1]){let i=At.records.commits.get(e.parents[0]);mhe(t,e,i),e.parents[1]&&t.push(At.records.commits.get(e.parents[1]))}else{if(e.parents.length==0)return;if(e.parents[0]){let i=At.records.commits.get(e.parents[0]);mhe(t,e,i)}}t=Uze(t,i=>i.id),yhe(t)}var Vze,Ip,At,Hze,Wze,qze,Yze,Xze,jze,Kze,ghe,Qze,Zze,Jze,eGe,tGe,vhe,rGe,nGe,iGe,CS,_O=N(()=>{"use strict";yt();er();mi();pr();ci();ES();SS();_a();Vze=or.gitGraph,Ip=o(()=>$n({...Vze,...tr().gitGraph}),"getConfig"),At=new Tf(()=>{let t=Ip(),e=t.mainBranchName,r=t.mainBranchOrder;return{mainBranchName:e,commits:new Map,head:null,branchConfig:new Map([[e,{name:e,order:r}]]),branches:new Map([[e,null]]),currBranch:e,direction:"LR",seq:0,options:{}}});o(AO,"getID");o(Uze,"uniqBy");Hze=o(function(t){At.records.direction=t},"setDirection"),Wze=o(function(t){X.debug("options str",t),t=t?.trim(),t=t||"{}";try{At.records.options=JSON.parse(t)}catch(e){X.error("error while parsing gitGraph options",e.message)}},"setOptions"),qze=o(function(){return At.records.options},"getOptions"),Yze=o(function(t){let e=t.msg,r=t.id,n=t.type,i=t.tags;X.info("commit",e,r,n,i),X.debug("Entering commit:",e,r,n,i);let a=Ip();r=Ze.sanitizeText(r,a),e=Ze.sanitizeText(e,a),i=i?.map(l=>Ze.sanitizeText(l,a));let s={id:r||At.records.seq+"-"+AO(),message:e,seq:At.records.seq++,type:n??Kr.NORMAL,tags:i??[],parents:At.records.head==null?[]:[At.records.head.id],branch:At.records.currBranch};At.records.head=s,X.info("main branch",a.mainBranchName),At.records.commits.has(s.id)&&X.warn(`Commit ID ${s.id} already exists`),At.records.commits.set(s.id,s),At.records.branches.set(At.records.currBranch,s.id),X.debug("in pushCommit "+s.id)},"commit"),Xze=o(function(t){let e=t.name,r=t.order;if(e=Ze.sanitizeText(e,Ip()),At.records.branches.has(e))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${e}")`);At.records.branches.set(e,At.records.head!=null?At.records.head.id:null),At.records.branchConfig.set(e,{name:e,order:r}),ghe(e),X.debug("in createBranch")},"branch"),jze=o(t=>{let e=t.branch,r=t.id,n=t.type,i=t.tags,a=Ip();e=Ze.sanitizeText(e,a),r&&(r=Ze.sanitizeText(r,a));let s=At.records.branches.get(At.records.currBranch),l=At.records.branches.get(e),u=s?At.records.commits.get(s):void 0,h=l?At.records.commits.get(l):void 0;if(u&&h&&u.branch===e)throw new Error(`Cannot merge branch '${e}' into itself.`);if(At.records.currBranch===e){let p=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(u===void 0||!u){let p=new Error(`Incorrect usage of "merge". Current branch (${At.records.currBranch})has no commits`);throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["commit"]},p}if(!At.records.branches.has(e)){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") does not exist");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:[`branch ${e}`]},p}if(h===void 0||!h){let p=new Error('Incorrect usage of "merge". Branch to be merged ('+e+") has no commits");throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:['"commit"']},p}if(u===h){let p=new Error('Incorrect usage of "merge". Both branches have same head');throw p.hash={text:`merge ${e}`,token:`merge ${e}`,expected:["branch abc"]},p}if(r&&At.records.commits.has(r)){let p=new Error('Incorrect usage of "merge". Commit with id:'+r+" already exists, use different custom id");throw p.hash={text:`merge ${e} ${r} ${n} ${i?.join(" ")}`,token:`merge ${e} ${r} ${n} ${i?.join(" ")}`,expected:[`merge ${e} ${r}_UNIQUE ${n} ${i?.join(" ")}`]},p}let f=l||"",d={id:r||`${At.records.seq}-${AO()}`,message:`merged branch ${e} into ${At.records.currBranch}`,seq:At.records.seq++,parents:At.records.head==null?[]:[At.records.head.id,f],branch:At.records.currBranch,type:Kr.MERGE,customType:n,customId:!!r,tags:i??[]};At.records.head=d,At.records.commits.set(d.id,d),At.records.branches.set(At.records.currBranch,d.id),X.debug(At.records.branches),X.debug("in mergeBranch")},"merge"),Kze=o(function(t){let e=t.id,r=t.targetId,n=t.tags,i=t.parent;X.debug("Entering cherryPick:",e,r,n);let a=Ip();if(e=Ze.sanitizeText(e,a),r=Ze.sanitizeText(r,a),n=n?.map(u=>Ze.sanitizeText(u,a)),i=Ze.sanitizeText(i,a),!e||!At.records.commits.has(e)){let u=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw u.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},u}let s=At.records.commits.get(e);if(s===void 0||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(i&&!(Array.isArray(s.parents)&&s.parents.includes(i)))throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.");let l=s.branch;if(s.type===Kr.MERGE&&!i)throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.");if(!r||!At.records.commits.has(r)){if(l===At.records.currBranch){let d=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let u=At.records.branches.get(At.records.currBranch);if(u===void 0||!u){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${At.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let h=At.records.commits.get(u);if(h===void 0||!h){let d=new Error(`Incorrect usage of "cherry-pick". Current branch (${At.records.currBranch})has no commits`);throw d.hash={text:`cherryPick ${e} ${r}`,token:`cherryPick ${e} ${r}`,expected:["cherry-pick abc"]},d}let f={id:At.records.seq+"-"+AO(),message:`cherry-picked ${s?.message} into ${At.records.currBranch}`,seq:At.records.seq++,parents:At.records.head==null?[]:[At.records.head.id,s.id],branch:At.records.currBranch,type:Kr.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===Kr.MERGE?`|parent:${i}`:""}`]};At.records.head=f,At.records.commits.set(f.id,f),At.records.branches.set(At.records.currBranch,f.id),X.debug(At.records.branches),X.debug("in cherryPick")}},"cherryPick"),ghe=o(function(t){if(t=Ze.sanitizeText(t,Ip()),At.records.branches.has(t)){At.records.currBranch=t;let e=At.records.branches.get(At.records.currBranch);e===void 0||!e?At.records.head=null:At.records.head=At.records.commits.get(e)??null}else{let e=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw e.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},e}},"checkout");o(mhe,"upsert");o(yhe,"prettyPrintCommitHistory");Qze=o(function(){X.debug(At.records.commits);let t=vhe()[0];yhe([t])},"prettyPrint"),Zze=o(function(){At.reset(),kr()},"clear"),Jze=o(function(){return[...At.records.branchConfig.values()].map((e,r)=>e.order!==null&&e.order!==void 0?e:{...e,order:parseFloat(`0.${r}`)}).sort((e,r)=>(e.order??0)-(r.order??0)).map(({name:e})=>({name:e}))},"getBranchesAsObjArray"),eGe=o(function(){return At.records.branches},"getBranches"),tGe=o(function(){return At.records.commits},"getCommits"),vhe=o(function(){let t=[...At.records.commits.values()];return t.forEach(function(e){X.debug(e.id)}),t.sort((e,r)=>e.seq-r.seq),t},"getCommitsArray"),rGe=o(function(){return At.records.currBranch},"getCurrentBranch"),nGe=o(function(){return At.records.direction},"getDirection"),iGe=o(function(){return At.records.head},"getHead"),CS={commitType:Kr,getConfig:Ip,setDirection:Hze,setOptions:Wze,getOptions:qze,commit:Yze,branch:Xze,merge:jze,cherryPick:Kze,checkout:ghe,prettyPrint:Qze,clear:Zze,getBranchesAsObjArray:Jze,getBranches:eGe,getCommits:tGe,getCommitsArray:vhe,getCurrentBranch:rGe,getDirection:nGe,getHead:iGe,setAccTitle:Ar,getAccTitle:Dr,getAccDescription:Rr,setAccDescription:Lr,setDiagramTitle:Or,getDiagramTitle:Nr}});var aGe,sGe,oGe,lGe,cGe,uGe,hGe,xhe,bhe=N(()=>{"use strict";bf();yt();Mp();_O();ES();aGe=o((t,e)=>{Jo(t,e),t.dir&&e.setDirection(t.dir);for(let r of t.statements)sGe(r,e)},"populate"),sGe=o((t,e)=>{let n={Commit:o(i=>e.commit(oGe(i)),"Commit"),Branch:o(i=>e.branch(lGe(i)),"Branch"),Merge:o(i=>e.merge(cGe(i)),"Merge"),Checkout:o(i=>e.checkout(uGe(i)),"Checkout"),CherryPicking:o(i=>e.cherryPick(hGe(i)),"CherryPicking")}[t.$type];n?n(t):X.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),oGe=o(t=>({id:t.id,msg:t.message??"",type:t.type!==void 0?Kr[t.type]:Kr.NORMAL,tags:t.tags??void 0}),"parseCommit"),lGe=o(t=>({name:t.name,order:t.order??0}),"parseBranch"),cGe=o(t=>({branch:t.branch,id:t.id??"",type:t.type!==void 0?Kr[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),uGe=o(t=>t.branch,"parseCheckout"),hGe=o(t=>({id:t.id,targetId:"",tags:t.tags?.length===0?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),xhe={parse:o(async t=>{let e=await vs("gitGraph",t);X.debug(e),aGe(e,CS)},"parse")}});var fGe,el,kf,Ef,Wc,Zu,Op,Hs,Ws,AS,Eb,_S,wf,Fr,dGe,whe,khe,pGe,mGe,gGe,yGe,vGe,xGe,bGe,TGe,wGe,kGe,EGe,SGe,The,CGe,Sb,AGe,_Ge,DGe,LGe,RGe,Ehe,She=N(()=>{"use strict";fr();Gt();yt();er();ES();fGe=me(),el=fGe?.gitGraph,kf=10,Ef=40,Wc=4,Zu=2,Op=8,Hs=new Map,Ws=new Map,AS=30,Eb=new Map,_S=[],wf=0,Fr="LR",dGe=o(()=>{Hs.clear(),Ws.clear(),Eb.clear(),wf=0,_S=[],Fr="LR"},"clear"),whe=o(t=>{let e=document.createElementNS("http://www.w3.org/2000/svg","text");return(typeof t=="string"?t.split(/\\n|\n|/gi):t).forEach(n=>{let i=document.createElementNS("http://www.w3.org/2000/svg","tspan");i.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),i.setAttribute("dy","1em"),i.setAttribute("x","0"),i.setAttribute("class","row"),i.textContent=n.trim(),e.appendChild(i)}),e},"drawText"),khe=o(t=>{let e,r,n;return Fr==="BT"?(r=o((i,a)=>i<=a,"comparisonFunc"),n=1/0):(r=o((i,a)=>i>=a,"comparisonFunc"),n=0),t.forEach(i=>{let a=Fr==="TB"||Fr=="BT"?Ws.get(i)?.y:Ws.get(i)?.x;a!==void 0&&r(a,n)&&(e=i,n=a)}),e},"findClosestParent"),pGe=o(t=>{let e="",r=1/0;return t.forEach(n=>{let i=Ws.get(n).y;i<=r&&(e=n,r=i)}),e||void 0},"findClosestParentBT"),mGe=o((t,e,r)=>{let n=r,i=r,a=[];t.forEach(s=>{let l=e.get(s);if(!l)throw new Error(`Commit not found for key ${s}`);l.parents.length?(n=yGe(l),i=Math.max(n,i)):a.push(l),vGe(l,n)}),n=i,a.forEach(s=>{xGe(s,n,r)}),t.forEach(s=>{let l=e.get(s);if(l?.parents.length){let u=pGe(l.parents);n=Ws.get(u).y-Ef,n<=i&&(i=n);let h=Hs.get(l.branch).pos,f=n-kf;Ws.set(l.id,{x:h,y:f})}})},"setParallelBTPos"),gGe=o(t=>{let e=khe(t.parents.filter(n=>n!==null));if(!e)throw new Error(`Closest parent not found for commit ${t.id}`);let r=Ws.get(e)?.y;if(r===void 0)throw new Error(`Closest parent position not found for commit ${t.id}`);return r},"findClosestParentPos"),yGe=o(t=>gGe(t)+Ef,"calculateCommitPosition"),vGe=o((t,e)=>{let r=Hs.get(t.branch);if(!r)throw new Error(`Branch not found for commit ${t.id}`);let n=r.pos,i=e+kf;return Ws.set(t.id,{x:n,y:i}),{x:n,y:i}},"setCommitPosition"),xGe=o((t,e,r)=>{let n=Hs.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);let i=e+r,a=n.pos;Ws.set(t.id,{x:a,y:i})},"setRootPosition"),bGe=o((t,e,r,n,i,a)=>{if(a===Kr.HIGHLIGHT)t.append("rect").attr("x",r.x-10).attr("y",r.y-10).attr("width",20).attr("height",20).attr("class",`commit ${e.id} commit-highlight${i%Op} ${n}-outer`),t.append("rect").attr("x",r.x-6).attr("y",r.y-6).attr("width",12).attr("height",12).attr("class",`commit ${e.id} commit${i%Op} ${n}-inner`);else if(a===Kr.CHERRY_PICK)t.append("circle").attr("cx",r.x).attr("cy",r.y).attr("r",10).attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x-3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("circle").attr("cx",r.x+3).attr("cy",r.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x+3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`),t.append("line").attr("x1",r.x-3).attr("y1",r.y+1).attr("x2",r.x).attr("y2",r.y-5).attr("stroke","#fff").attr("class",`commit ${e.id} ${n}`);else{let s=t.append("circle");if(s.attr("cx",r.x),s.attr("cy",r.y),s.attr("r",e.type===Kr.MERGE?9:10),s.attr("class",`commit ${e.id} commit${i%Op}`),a===Kr.MERGE){let l=t.append("circle");l.attr("cx",r.x),l.attr("cy",r.y),l.attr("r",6),l.attr("class",`commit ${n} ${e.id} commit${i%Op}`)}a===Kr.REVERSE&&t.append("path").attr("d",`M ${r.x-5},${r.y-5}L${r.x+5},${r.y+5}M${r.x-5},${r.y+5}L${r.x+5},${r.y-5}`).attr("class",`commit ${n} ${e.id} commit${i%Op}`)}},"drawCommitBullet"),TGe=o((t,e,r,n)=>{if(e.type!==Kr.CHERRY_PICK&&(e.customId&&e.type===Kr.MERGE||e.type!==Kr.MERGE)&&el?.showCommitLabel){let i=t.append("g"),a=i.insert("rect").attr("class","commit-label-bkg"),s=i.append("text").attr("x",n).attr("y",r.y+25).attr("class","commit-label").text(e.id),l=s.node()?.getBBox();if(l&&(a.attr("x",r.posWithOffset-l.width/2-Zu).attr("y",r.y+13.5).attr("width",l.width+2*Zu).attr("height",l.height+2*Zu),Fr==="TB"||Fr==="BT"?(a.attr("x",r.x-(l.width+4*Wc+5)).attr("y",r.y-12),s.attr("x",r.x-(l.width+4*Wc)).attr("y",r.y+l.height-12)):s.attr("x",r.posWithOffset-l.width/2),el.rotateCommitLabel))if(Fr==="TB"||Fr==="BT")s.attr("transform","rotate(-45, "+r.x+", "+r.y+")"),a.attr("transform","rotate(-45, "+r.x+", "+r.y+")");else{let u=-7.5-(l.width+10)/25*9.5,h=10+l.width/25*8.5;i.attr("transform","translate("+u+", "+h+") rotate(-45, "+n+", "+r.y+")")}}},"drawCommitLabel"),wGe=o((t,e,r,n)=>{if(e.tags.length>0){let i=0,a=0,s=0,l=[];for(let u of e.tags.reverse()){let h=t.insert("polygon"),f=t.append("circle"),d=t.append("text").attr("y",r.y-16-i).attr("class","tag-label").text(u),p=d.node()?.getBBox();if(!p)throw new Error("Tag bbox not found");a=Math.max(a,p.width),s=Math.max(s,p.height),d.attr("x",r.posWithOffset-p.width/2),l.push({tag:d,hole:f,rect:h,yOffset:i}),i+=20}for(let{tag:u,hole:h,rect:f,yOffset:d}of l){let p=s/2,m=r.y-19.2-d;if(f.attr("class","tag-label-bkg").attr("points",` - ${n-a/2-Wc/2},${m+Zu} - ${n-a/2-Wc/2},${m-Zu} - ${r.posWithOffset-a/2-Wc},${m-p-Zu} - ${r.posWithOffset+a/2+Wc},${m-p-Zu} - ${r.posWithOffset+a/2+Wc},${m+p+Zu} - ${r.posWithOffset-a/2-Wc},${m+p+Zu}`),h.attr("cy",m).attr("cx",n-a/2+Wc/2).attr("r",1.5).attr("class","tag-hole"),Fr==="TB"||Fr==="BT"){let g=n+d;f.attr("class","tag-label-bkg").attr("points",` - ${r.x},${g+2} - ${r.x},${g-2} - ${r.x+kf},${g-p-2} - ${r.x+kf+a+4},${g-p-2} - ${r.x+kf+a+4},${g+p+2} - ${r.x+kf},${g+p+2}`).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),h.attr("cx",r.x+Wc/2).attr("cy",g).attr("transform","translate(12,12) rotate(45, "+r.x+","+n+")"),u.attr("x",r.x+5).attr("y",g+3).attr("transform","translate(14,14) rotate(45, "+r.x+","+n+")")}}}},"drawCommitTags"),kGe=o(t=>{switch(t.customType??t.type){case Kr.NORMAL:return"commit-normal";case Kr.REVERSE:return"commit-reverse";case Kr.HIGHLIGHT:return"commit-highlight";case Kr.MERGE:return"commit-merge";case Kr.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),EGe=o((t,e,r,n)=>{let i={x:0,y:0};if(t.parents.length>0){let a=khe(t.parents);if(a){let s=n.get(a)??i;return e==="TB"?s.y+Ef:e==="BT"?(n.get(t.id)??i).y-Ef:s.x+Ef}}else return e==="TB"?AS:e==="BT"?(n.get(t.id)??i).y-Ef:0;return 0},"calculatePosition"),SGe=o((t,e,r)=>{let n=Fr==="BT"&&r?e:e+kf,i=Fr==="TB"||Fr==="BT"?n:Hs.get(t.branch)?.pos,a=Fr==="TB"||Fr==="BT"?Hs.get(t.branch)?.pos:n;if(a===void 0||i===void 0)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:i,posWithOffset:n}},"getCommitPosition"),The=o((t,e,r)=>{if(!el)throw new Error("GitGraph config not found");let n=t.append("g").attr("class","commit-bullets"),i=t.append("g").attr("class","commit-labels"),a=Fr==="TB"||Fr==="BT"?AS:0,s=[...e.keys()],l=el?.parallelCommits??!1,u=o((f,d)=>{let p=e.get(f)?.seq,m=e.get(d)?.seq;return p!==void 0&&m!==void 0?p-m:0},"sortKeys"),h=s.sort(u);Fr==="BT"&&(l&&mGe(h,e,a),h=h.reverse()),h.forEach(f=>{let d=e.get(f);if(!d)throw new Error(`Commit not found for key ${f}`);l&&(a=EGe(d,Fr,a,Ws));let p=SGe(d,a,l);if(r){let m=kGe(d),g=d.customType??d.type,y=Hs.get(d.branch)?.index??0;bGe(n,d,p,m,y,g),TGe(i,d,p,a),wGe(i,d,p,a)}Fr==="TB"||Fr==="BT"?Ws.set(d.id,{x:p.x,y:p.posWithOffset}):Ws.set(d.id,{x:p.posWithOffset,y:p.y}),a=Fr==="BT"&&l?a+Ef:a+Ef+kf,a>wf&&(wf=a)})},"drawCommits"),CGe=o((t,e,r,n,i)=>{let s=(Fr==="TB"||Fr==="BT"?r.xh.branch===s,"isOnBranchToGetCurve"),u=o(h=>h.seq>t.seq&&h.sequ(h)&&l(h))},"shouldRerouteArrow"),Sb=o((t,e,r=0)=>{let n=t+Math.abs(t-e)/2;if(r>5)return n;if(_S.every(s=>Math.abs(s-n)>=10))return _S.push(n),n;let a=Math.abs(t-e);return Sb(t,e-a/5,r+1)},"findLane"),AGe=o((t,e,r,n)=>{let i=Ws.get(e.id),a=Ws.get(r.id);if(i===void 0||a===void 0)throw new Error(`Commit positions not found for commits ${e.id} and ${r.id}`);let s=CGe(e,r,i,a,n),l="",u="",h=0,f=0,d=Hs.get(r.branch)?.index;r.type===Kr.MERGE&&e.id!==r.parents[0]&&(d=Hs.get(e.branch)?.index);let p;if(s){l="A 10 10, 0, 0, 0,",u="A 10 10, 0, 0, 1,",h=10,f=10;let m=i.ya.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y-h} ${u} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x+h} ${i.y} ${l} ${a.x} ${i.y+f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):Fr==="BT"?(i.xa.x&&(l="A 20 20, 0, 0, 0,",u="A 20 20, 0, 0, 1,",h=20,f=20,r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${l} ${i.x-f} ${a.y} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`),i.x===a.x&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`)):(i.ya.y&&(r.type===Kr.MERGE&&e.id!==r.parents[0]?p=`M ${i.x} ${i.y} L ${a.x-h} ${i.y} ${l} ${a.x} ${i.y-f} L ${a.x} ${a.y}`:p=`M ${i.x} ${i.y} L ${i.x} ${a.y+h} ${u} ${i.x+f} ${a.y} L ${a.x} ${a.y}`),i.y===a.y&&(p=`M ${i.x} ${i.y} L ${a.x} ${a.y}`));if(p===void 0)throw new Error("Line definition not found");t.append("path").attr("d",p).attr("class","arrow arrow"+d%Op)},"drawArrow"),_Ge=o((t,e)=>{let r=t.append("g").attr("class","commit-arrows");[...e.keys()].forEach(n=>{let i=e.get(n);i.parents&&i.parents.length>0&&i.parents.forEach(a=>{AGe(r,e.get(a),i,e)})})},"drawArrows"),DGe=o((t,e)=>{let r=t.append("g");e.forEach((n,i)=>{let a=i%Op,s=Hs.get(n.name)?.pos;if(s===void 0)throw new Error(`Position not found for branch ${n.name}`);let l=r.append("line");l.attr("x1",0),l.attr("y1",s),l.attr("x2",wf),l.attr("y2",s),l.attr("class","branch branch"+a),Fr==="TB"?(l.attr("y1",AS),l.attr("x1",s),l.attr("y2",wf),l.attr("x2",s)):Fr==="BT"&&(l.attr("y1",wf),l.attr("x1",s),l.attr("y2",AS),l.attr("x2",s)),_S.push(s);let u=n.name,h=whe(u),f=r.insert("rect"),p=r.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+a);p.node().appendChild(h);let m=h.getBBox();f.attr("class","branchLabelBkg label"+a).attr("rx",4).attr("ry",4).attr("x",-m.width-4-(el?.rotateCommitLabel===!0?30:0)).attr("y",-m.height/2+8).attr("width",m.width+18).attr("height",m.height+4),p.attr("transform","translate("+(-m.width-14-(el?.rotateCommitLabel===!0?30:0))+", "+(s-m.height/2-1)+")"),Fr==="TB"?(f.attr("x",s-m.width/2-10).attr("y",0),p.attr("transform","translate("+(s-m.width/2-5)+", 0)")):Fr==="BT"?(f.attr("x",s-m.width/2-10).attr("y",wf),p.attr("transform","translate("+(s-m.width/2-5)+", "+wf+")")):f.attr("transform","translate(-19, "+(s-m.height/2)+")")})},"drawBranches"),LGe=o(function(t,e,r,n,i){return Hs.set(t,{pos:e,index:r}),e+=50+(i?40:0)+(Fr==="TB"||Fr==="BT"?n.width/2:0),e},"setBranchPosition"),RGe=o(function(t,e,r,n){if(dGe(),X.debug("in gitgraph renderer",t+` -`,"id:",e,r),!el)throw new Error("GitGraph config not found");let i=el.rotateCommitLabel??!1,a=n.db;Eb=a.getCommits();let s=a.getBranchesAsObjArray();Fr=a.getDirection();let l=Ge(`[id="${e}"]`),u=0;s.forEach((h,f)=>{let d=whe(h.name),p=l.append("g"),m=p.insert("g").attr("class","branchLabel"),g=m.insert("g").attr("class","label branch-label");g.node()?.appendChild(d);let y=d.getBBox();u=LGe(h.name,u,f,y,i),g.remove(),m.remove(),p.remove()}),The(l,Eb,!1),el.showBranches&&DGe(l,s),_Ge(l,Eb),The(l,Eb,!0),Vt.insertTitle(l,"gitTitleText",el.titleTopMargin??0,a.getDiagramTitle()),AA(void 0,l,el.diagramPadding,el.useMaxWidth)},"draw"),Ehe={draw:RGe}});var NGe,Che,Ahe=N(()=>{"use strict";NGe=o(t=>` - .commit-id, - .commit-msg, - .branch-label { - fill: lightgrey; - color: lightgrey; - font-family: 'trebuchet ms', verdana, arial, sans-serif; - font-family: var(--mermaid-font-family); - } - ${[0,1,2,3,4,5,6,7].map(e=>` - .branch-label${e} { fill: ${t["gitBranchLabel"+e]}; } - .commit${e} { stroke: ${t["git"+e]}; fill: ${t["git"+e]}; } - .commit-highlight${e} { stroke: ${t["gitInv"+e]}; fill: ${t["gitInv"+e]}; } - .label${e} { fill: ${t["git"+e]}; } - .arrow${e} { stroke: ${t["git"+e]}; } - `).join(` -`)} - - .branch { - stroke-width: 1; - stroke: ${t.lineColor}; - stroke-dasharray: 2; - } - .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};} - .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; } - .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};} - .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; } - .tag-hole { fill: ${t.textColor}; } - - .commit-merge { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - } - .commit-reverse { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - stroke-width: 3; - } - .commit-highlight-outer { - } - .commit-highlight-inner { - stroke: ${t.primaryColor}; - fill: ${t.primaryColor}; - } - - .arrow { stroke-width: 8; stroke-linecap: round; fill: none} - .gitTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } -`,"getStyles"),Che=NGe});var _he={};ur(_he,{diagram:()=>MGe});var MGe,Dhe=N(()=>{"use strict";bhe();_O();She();Ahe();MGe={parser:xhe,db:CS,renderer:Ehe,styles:Che}});var DO,Nhe,Mhe=N(()=>{"use strict";DO=function(){var t=o(function(L,A,I,M){for(I=I||{},M=L.length;M--;I[L[M]]=A);return I},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],r=[1,26],n=[1,27],i=[1,28],a=[1,29],s=[1,30],l=[1,31],u=[1,32],h=[1,33],f=[1,34],d=[1,9],p=[1,10],m=[1,11],g=[1,12],y=[1,13],v=[1,14],x=[1,15],b=[1,16],T=[1,19],S=[1,20],w=[1,21],E=[1,22],_=[1,23],C=[1,25],D=[1,35],O={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:o(function(A,I,M,P,B,F,z){var $=F.length-1;switch(B){case 1:return F[$-1];case 2:this.$=[];break;case 3:F[$-1].push(F[$]),this.$=F[$-1];break;case 4:case 5:this.$=F[$];break;case 6:case 7:this.$=[];break;case 8:P.setWeekday("monday");break;case 9:P.setWeekday("tuesday");break;case 10:P.setWeekday("wednesday");break;case 11:P.setWeekday("thursday");break;case 12:P.setWeekday("friday");break;case 13:P.setWeekday("saturday");break;case 14:P.setWeekday("sunday");break;case 15:P.setWeekend("friday");break;case 16:P.setWeekend("saturday");break;case 17:P.setDateFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 18:P.enableInclusiveEndDates(),this.$=F[$].substr(18);break;case 19:P.TopAxis(),this.$=F[$].substr(8);break;case 20:P.setAxisFormat(F[$].substr(11)),this.$=F[$].substr(11);break;case 21:P.setTickInterval(F[$].substr(13)),this.$=F[$].substr(13);break;case 22:P.setExcludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 23:P.setIncludes(F[$].substr(9)),this.$=F[$].substr(9);break;case 24:P.setTodayMarker(F[$].substr(12)),this.$=F[$].substr(12);break;case 27:P.setDiagramTitle(F[$].substr(6)),this.$=F[$].substr(6);break;case 28:this.$=F[$].trim(),P.setAccTitle(this.$);break;case 29:case 30:this.$=F[$].trim(),P.setAccDescription(this.$);break;case 31:P.addSection(F[$].substr(8)),this.$=F[$].substr(8);break;case 33:P.addTask(F[$-1],F[$]),this.$="task";break;case 34:this.$=F[$-1],P.setClickEvent(F[$-1],F[$],null);break;case 35:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],F[$]);break;case 36:this.$=F[$-2],P.setClickEvent(F[$-2],F[$-1],null),P.setLink(F[$-2],F[$]);break;case 37:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-2],F[$-1]),P.setLink(F[$-3],F[$]);break;case 38:this.$=F[$-2],P.setClickEvent(F[$-2],F[$],null),P.setLink(F[$-2],F[$-1]);break;case 39:this.$=F[$-3],P.setClickEvent(F[$-3],F[$-1],F[$]),P.setLink(F[$-3],F[$-2]);break;case 40:this.$=F[$-1],P.setLink(F[$-1],F[$]);break;case 41:case 47:this.$=F[$-1]+" "+F[$];break;case 42:case 43:case 45:this.$=F[$-2]+" "+F[$-1]+" "+F[$];break;case 44:case 46:this.$=F[$-3]+" "+F[$-2]+" "+F[$-1]+" "+F[$];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:E,36:_,37:24,38:C,40:D},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:r,13:n,14:i,15:a,16:s,17:l,18:u,19:18,20:h,21:f,22:d,23:p,24:m,25:g,26:y,27:v,28:x,29:b,30:T,31:S,33:w,35:E,36:_,37:24,38:C,40:D},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:o(function(A,I){if(I.recoverable)this.trace(A);else{var M=new Error(A);throw M.hash=I,M}},"parseError"),parse:o(function(A){var I=this,M=[0],P=[],B=[null],F=[],z=this.table,$="",U=0,K=0,ee=0,Y=2,ce=1,Z=F.slice.call(arguments,1),ue=Object.create(this.lexer),Q={yy:{}};for(var j in this.yy)Object.prototype.hasOwnProperty.call(this.yy,j)&&(Q.yy[j]=this.yy[j]);ue.setInput(A,Q.yy),Q.yy.lexer=ue,Q.yy.parser=this,typeof ue.yylloc>"u"&&(ue.yylloc={});var ne=ue.yylloc;F.push(ne);var te=ue.options&&ue.options.ranges;typeof Q.yy.parseError=="function"?this.parseError=Q.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function he(q){M.length=M.length-2*q,B.length=B.length-q,F.length=F.length-q}o(he,"popStack");function le(){var q;return q=P.pop()||ue.lex()||ce,typeof q!="number"&&(q instanceof Array&&(P=q,q=P.pop()),q=I.symbols_[q]||q),q}o(le,"lex");for(var J,Se,se,ae,Oe,ye,Be={},He,ze,Le,Ie;;){if(se=M[M.length-1],this.defaultActions[se]?ae=this.defaultActions[se]:((J===null||typeof J>"u")&&(J=le()),ae=z[se]&&z[se][J]),typeof ae>"u"||!ae.length||!ae[0]){var xe="";Ie=[];for(He in z[se])this.terminals_[He]&&He>Y&&Ie.push("'"+this.terminals_[He]+"'");ue.showPosition?xe="Parse error on line "+(U+1)+`: -`+ue.showPosition()+` -Expecting `+Ie.join(", ")+", got '"+(this.terminals_[J]||J)+"'":xe="Parse error on line "+(U+1)+": Unexpected "+(J==ce?"end of input":"'"+(this.terminals_[J]||J)+"'"),this.parseError(xe,{text:ue.match,token:this.terminals_[J]||J,line:ue.yylineno,loc:ne,expected:Ie})}if(ae[0]instanceof Array&&ae.length>1)throw new Error("Parse Error: multiple actions possible at state: "+se+", token: "+J);switch(ae[0]){case 1:M.push(J),B.push(ue.yytext),F.push(ue.yylloc),M.push(ae[1]),J=null,Se?(J=Se,Se=null):(K=ue.yyleng,$=ue.yytext,U=ue.yylineno,ne=ue.yylloc,ee>0&&ee--);break;case 2:if(ze=this.productions_[ae[1]][1],Be.$=B[B.length-ze],Be._$={first_line:F[F.length-(ze||1)].first_line,last_line:F[F.length-1].last_line,first_column:F[F.length-(ze||1)].first_column,last_column:F[F.length-1].last_column},te&&(Be._$.range=[F[F.length-(ze||1)].range[0],F[F.length-1].range[1]]),ye=this.performAction.apply(Be,[$,K,U,Q.yy,ae[1],B,F].concat(Z)),typeof ye<"u")return ye;ze&&(M=M.slice(0,-1*ze*2),B=B.slice(0,-1*ze),F=F.slice(0,-1*ze)),M.push(this.productions_[ae[1]][0]),B.push(Be.$),F.push(Be._$),Le=z[M[M.length-2]][M[M.length-1]],M.push(Le);break;case 3:return!0}}return!0},"parse")},R=function(){var L={EOF:1,parseError:o(function(I,M){if(this.yy.parser)this.yy.parser.parseError(I,M);else throw new Error(I)},"parseError"),setInput:o(function(A,I){return this.yy=I||this.yy||{},this._input=A,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var A=this._input[0];this.yytext+=A,this.yyleng++,this.offset++,this.match+=A,this.matched+=A;var I=A.match(/(?:\r\n?|\n).*/g);return I?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),A},"input"),unput:o(function(A){var I=A.length,M=A.split(/(?:\r\n?|\n)/g);this._input=A+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-I),this.offset-=I;var P=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),M.length-1&&(this.yylineno-=M.length-1);var B=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:M?(M.length===P.length?this.yylloc.first_column:0)+P[P.length-M.length].length-M[0].length:this.yylloc.first_column-I},this.options.ranges&&(this.yylloc.range=[B[0],B[0]+this.yyleng-I]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(A){this.unput(this.match.slice(A))},"less"),pastInput:o(function(){var A=this.matched.substr(0,this.matched.length-this.match.length);return(A.length>20?"...":"")+A.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var A=this.match;return A.length<20&&(A+=this._input.substr(0,20-A.length)),(A.substr(0,20)+(A.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var A=this.pastInput(),I=new Array(A.length+1).join("-");return A+this.upcomingInput()+` -`+I+"^"},"showPosition"),test_match:o(function(A,I){var M,P,B;if(this.options.backtrack_lexer&&(B={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(B.yylloc.range=this.yylloc.range.slice(0))),P=A[0].match(/(?:\r\n?|\n).*/g),P&&(this.yylineno+=P.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:P?P[P.length-1].length-P[P.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+A[0].length},this.yytext+=A[0],this.match+=A[0],this.matches=A,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(A[0].length),this.matched+=A[0],M=this.performAction.call(this,this.yy,this,I,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),M)return M;if(this._backtrack){for(var F in B)this[F]=B[F];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var A,I,M,P;this._more||(this.yytext="",this.match="");for(var B=this._currentRules(),F=0;FI[0].length)){if(I=M,P=F,this.options.backtrack_lexer){if(A=this.test_match(M,B[F]),A!==!1)return A;if(this._backtrack){I=!1;continue}else return!1}else if(!this.options.flex)break}return I?(A=this.test_match(I,B[P]),A!==!1?A:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var I=this.next();return I||this.lex()},"lex"),begin:o(function(I){this.conditionStack.push(I)},"begin"),popState:o(function(){var I=this.conditionStack.length-1;return I>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(I){return I=this.conditionStack.length-1-Math.abs(I||0),I>=0?this.conditionStack[I]:"INITIAL"},"topState"),pushState:o(function(I){this.begin(I)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(I,M,P,B){var F=B;switch(P){case 0:return this.begin("open_directive"),"open_directive";break;case 1:return this.begin("acc_title"),31;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),33;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:break;case 9:break;case 10:break;case 11:return 10;case 12:break;case 13:break;case 14:this.begin("href");break;case 15:this.popState();break;case 16:return 43;case 17:this.begin("callbackname");break;case 18:this.popState();break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 21:this.popState();break;case 22:return 42;case 23:this.begin("click");break;case 24:this.popState();break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}};return L}();O.lexer=R;function k(){this.yy={}}return o(k,"Parser"),k.prototype=O,O.Parser=k,new k}();DO.parser=DO;Nhe=DO});var Ihe=Pi((LO,RO)=>{"use strict";(function(t,e){typeof LO=="object"&&typeof RO<"u"?RO.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_isoWeek=e()})(LO,function(){"use strict";var t="day";return function(e,r,n){var i=o(function(l){return l.add(4-l.isoWeekday(),t)},"a"),a=r.prototype;a.isoWeekYear=function(){return i(this).year()},a.isoWeek=function(l){if(!this.$utils().u(l))return this.add(7*(l-this.isoWeek()),t);var u,h,f,d,p=i(this),m=(u=this.isoWeekYear(),h=this.$u,f=(h?n.utc:n)().year(u).startOf("year"),d=4-f.isoWeekday(),f.isoWeekday()>4&&(d+=7),f.add(d,t));return p.diff(m,"week")+1},a.isoWeekday=function(l){return this.$utils().u(l)?this.day()||7:this.day(this.day()%7?l:l-7)};var s=a.startOf;a.startOf=function(l,u){var h=this.$utils(),f=!!h.u(u)||u;return h.p(l)==="isoweek"?f?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):s.bind(this)(l,u)}}})});var Ohe=Pi((NO,MO)=>{"use strict";(function(t,e){typeof NO=="object"&&typeof MO<"u"?MO.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_customParseFormat=e()})(NO,function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,r=/\d/,n=/\d\d/,i=/\d\d?/,a=/\d*[^-_:/,()\s\d]+/,s={},l=o(function(g){return(g=+g)+(g>68?1900:2e3)},"a"),u=o(function(g){return function(y){this[g]=+y}},"f"),h=[/[+-]\d\d:?(\d\d)?|Z/,function(g){(this.zone||(this.zone={})).offset=function(y){if(!y||y==="Z")return 0;var v=y.match(/([+-]|\d\d)/g),x=60*v[1]+(+v[2]||0);return x===0?0:v[0]==="+"?-x:x}(g)}],f=o(function(g){var y=s[g];return y&&(y.indexOf?y:y.s.concat(y.f))},"u"),d=o(function(g,y){var v,x=s.meridiem;if(x){for(var b=1;b<=24;b+=1)if(g.indexOf(x(b,0,y))>-1){v=b>12;break}}else v=g===(y?"pm":"PM");return v},"d"),p={A:[a,function(g){this.afternoon=d(g,!1)}],a:[a,function(g){this.afternoon=d(g,!0)}],Q:[r,function(g){this.month=3*(g-1)+1}],S:[r,function(g){this.milliseconds=100*+g}],SS:[n,function(g){this.milliseconds=10*+g}],SSS:[/\d{3}/,function(g){this.milliseconds=+g}],s:[i,u("seconds")],ss:[i,u("seconds")],m:[i,u("minutes")],mm:[i,u("minutes")],H:[i,u("hours")],h:[i,u("hours")],HH:[i,u("hours")],hh:[i,u("hours")],D:[i,u("day")],DD:[n,u("day")],Do:[a,function(g){var y=s.ordinal,v=g.match(/\d+/);if(this.day=v[0],y)for(var x=1;x<=31;x+=1)y(x).replace(/\[|\]/g,"")===g&&(this.day=x)}],w:[i,u("week")],ww:[n,u("week")],M:[i,u("month")],MM:[n,u("month")],MMM:[a,function(g){var y=f("months"),v=(f("monthsShort")||y.map(function(x){return x.slice(0,3)})).indexOf(g)+1;if(v<1)throw new Error;this.month=v%12||v}],MMMM:[a,function(g){var y=f("months").indexOf(g)+1;if(y<1)throw new Error;this.month=y%12||y}],Y:[/[+-]?\d+/,u("year")],YY:[n,function(g){this.year=l(g)}],YYYY:[/\d{4}/,u("year")],Z:h,ZZ:h};function m(g){var y,v;y=g,v=s&&s.formats;for(var x=(g=y.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(C,D,O){var R=O&&O.toUpperCase();return D||v[O]||t[O]||v[R].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(k,L,A){return L||A.slice(1)})})).match(e),b=x.length,T=0;T-1)return new Date((M==="X"?1e3:1)*I);var F=m(M)(I),z=F.year,$=F.month,U=F.day,K=F.hours,ee=F.minutes,Y=F.seconds,ce=F.milliseconds,Z=F.zone,ue=F.week,Q=new Date,j=U||(z||$?1:Q.getDate()),ne=z||Q.getFullYear(),te=0;z&&!$||(te=$>0?$-1:Q.getMonth());var he,le=K||0,J=ee||0,Se=Y||0,se=ce||0;return Z?new Date(Date.UTC(ne,te,j,le,J,Se,se+60*Z.offset*1e3)):P?new Date(Date.UTC(ne,te,j,le,J,Se,se)):(he=new Date(ne,te,j,le,J,Se,se),ue&&(he=B(he).week(ue).toDate()),he)}catch{return new Date("")}}(S,_,w,v),this.init(),R&&R!==!0&&(this.$L=this.locale(R).$L),O&&S!=this.format(_)&&(this.$d=new Date("")),s={}}else if(_ instanceof Array)for(var k=_.length,L=1;L<=k;L+=1){E[1]=_[L-1];var A=v.apply(this,E);if(A.isValid()){this.$d=A.$d,this.$L=A.$L,this.init();break}L===k&&(this.$d=new Date(""))}else b.call(this,T)}}})});var Phe=Pi((IO,OO)=>{"use strict";(function(t,e){typeof IO=="object"&&typeof OO<"u"?OO.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs_plugin_advancedFormat=e()})(IO,function(){"use strict";return function(t,e){var r=e.prototype,n=r.format;r.format=function(i){var a=this,s=this.$locale();if(!this.isValid())return n.bind(this)(i);var l=this.$utils(),u=(i||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(h){switch(h){case"Q":return Math.ceil((a.$M+1)/3);case"Do":return s.ordinal(a.$D);case"gggg":return a.weekYear();case"GGGG":return a.isoWeekYear();case"wo":return s.ordinal(a.week(),"W");case"w":case"ww":return l.s(a.week(),h==="w"?1:2,"0");case"W":case"WW":return l.s(a.isoWeek(),h==="W"?1:2,"0");case"k":case"kk":return l.s(String(a.$H===0?24:a.$H),h==="k"?1:2,"0");case"X":return Math.floor(a.$d.getTime()/1e3);case"x":return a.$d.getTime();case"z":return"["+a.offsetName()+"]";case"zzz":return"["+a.offsetName("long")+"]";default:return h}});return n.bind(this)(u)}}})});function Zhe(t,e,r){let n=!0;for(;n;)n=!1,r.forEach(function(i){let a="^\\s*"+i+"\\s*$",s=new RegExp(a);t[0].match(s)&&(e[i]=!0,t.shift(1),n=!0)})}var $he,mo,zhe,Ghe,Vhe,Bhe,qc,$O,zO,GO,Cb,Ab,VO,UO,RS,R1,HO,Uhe,WO,_b,qO,YO,NS,PO,BGe,FGe,$Ge,zGe,GGe,VGe,UGe,HGe,WGe,qGe,YGe,XGe,jGe,KGe,QGe,ZGe,JGe,eVe,tVe,rVe,nVe,iVe,aVe,Hhe,sVe,oVe,lVe,Whe,cVe,BO,qhe,Yhe,DS,L1,uVe,hVe,FO,LS,Ui,Xhe,fVe,Pp,dVe,Fhe,pVe,jhe,mVe,Khe,gVe,yVe,Qhe,Jhe=N(()=>{"use strict";$he=Aa(Z0(),1),mo=Aa(U4(),1),zhe=Aa(Ihe(),1),Ghe=Aa(Ohe(),1),Vhe=Aa(Phe(),1);yt();Gt();er();ci();mo.default.extend(zhe.default);mo.default.extend(Ghe.default);mo.default.extend(Vhe.default);Bhe={friday:5,saturday:6},qc="",$O="",GO="",Cb=[],Ab=[],VO=new Map,UO=[],RS=[],R1="",HO="",Uhe=["active","done","crit","milestone","vert"],WO=[],_b=!1,qO=!1,YO="sunday",NS="saturday",PO=0,BGe=o(function(){UO=[],RS=[],R1="",WO=[],DS=0,FO=void 0,LS=void 0,Ui=[],qc="",$O="",HO="",zO=void 0,GO="",Cb=[],Ab=[],_b=!1,qO=!1,PO=0,VO=new Map,kr(),YO="sunday",NS="saturday"},"clear"),FGe=o(function(t){$O=t},"setAxisFormat"),$Ge=o(function(){return $O},"getAxisFormat"),zGe=o(function(t){zO=t},"setTickInterval"),GGe=o(function(){return zO},"getTickInterval"),VGe=o(function(t){GO=t},"setTodayMarker"),UGe=o(function(){return GO},"getTodayMarker"),HGe=o(function(t){qc=t},"setDateFormat"),WGe=o(function(){_b=!0},"enableInclusiveEndDates"),qGe=o(function(){return _b},"endDatesAreInclusive"),YGe=o(function(){qO=!0},"enableTopAxis"),XGe=o(function(){return qO},"topAxisEnabled"),jGe=o(function(t){HO=t},"setDisplayMode"),KGe=o(function(){return HO},"getDisplayMode"),QGe=o(function(){return qc},"getDateFormat"),ZGe=o(function(t){Cb=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),JGe=o(function(){return Cb},"getIncludes"),eVe=o(function(t){Ab=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),tVe=o(function(){return Ab},"getExcludes"),rVe=o(function(){return VO},"getLinks"),nVe=o(function(t){R1=t,UO.push(t)},"addSection"),iVe=o(function(){return UO},"getSections"),aVe=o(function(){let t=Fhe(),e=10,r=0;for(;!t&&r[\d\w- ]+)/.exec(r);if(i!==null){let s=null;for(let u of i.groups.ids.split(" ")){let h=Pp(u);h!==void 0&&(!s||h.endTime>s.endTime)&&(s=h)}if(s)return s.endTime;let l=new Date;return l.setHours(0,0,0,0),l}let a=(0,mo.default)(r,e.trim(),!0);if(a.isValid())return a.toDate();{X.debug("Invalid date:"+r),X.debug("With date format:"+e.trim());let s=new Date(r);if(s===void 0||isNaN(s.getTime())||s.getFullYear()<-1e4||s.getFullYear()>1e4)throw new Error("Invalid date:"+r);return s}},"getStartDate"),qhe=o(function(t){let e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return e!==null?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),Yhe=o(function(t,e,r,n=!1){r=r.trim();let a=/^until\s+(?[\d\w- ]+)/.exec(r);if(a!==null){let f=null;for(let p of a.groups.ids.split(" ")){let m=Pp(p);m!==void 0&&(!f||m.startTime{window.open(r,"_self")}),VO.set(n,r))}),jhe(t,"clickable")},"setLink"),jhe=o(function(t,e){t.split(",").forEach(function(r){let n=Pp(r);n!==void 0&&n.classes.push(e)})},"setClass"),mVe=o(function(t,e,r){if(me().securityLevel!=="loose"||e===void 0)return;let n=[];if(typeof r=="string"){n=r.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let a=0;a{Vt.runFunc(e,...n)})},"setClickFun"),Khe=o(function(t,e){WO.push(function(){let r=document.querySelector(`[id="${t}"]`);r!==null&&r.addEventListener("click",function(){e()})},function(){let r=document.querySelector(`[id="${t}-text"]`);r!==null&&r.addEventListener("click",function(){e()})})},"pushFun"),gVe=o(function(t,e,r){t.split(",").forEach(function(n){mVe(n,e,r)}),jhe(t,"clickable")},"setClickEvent"),yVe=o(function(t){WO.forEach(function(e){e(t)})},"bindFunctions"),Qhe={getConfig:o(()=>me().gantt,"getConfig"),clear:BGe,setDateFormat:HGe,getDateFormat:QGe,enableInclusiveEndDates:WGe,endDatesAreInclusive:qGe,enableTopAxis:YGe,topAxisEnabled:XGe,setAxisFormat:FGe,getAxisFormat:$Ge,setTickInterval:zGe,getTickInterval:GGe,setTodayMarker:VGe,getTodayMarker:UGe,setAccTitle:Ar,getAccTitle:Dr,setDiagramTitle:Or,getDiagramTitle:Nr,setDisplayMode:jGe,getDisplayMode:KGe,setAccDescription:Lr,getAccDescription:Rr,addSection:nVe,getSections:iVe,getTasks:aVe,addTask:fVe,findTaskById:Pp,addTaskOrg:dVe,setIncludes:ZGe,getIncludes:JGe,setExcludes:eVe,getExcludes:tVe,setClickEvent:gVe,setLink:pVe,getLinks:rVe,bindFunctions:yVe,parseDuration:qhe,isInvalidDate:Hhe,setWeekday:sVe,getWeekday:oVe,setWeekend:lVe};o(Zhe,"getTaskTags")});var MS,vVe,efe,xVe,Ju,bVe,tfe,rfe=N(()=>{"use strict";MS=Aa(U4(),1);yt();fr();pr();Gt();xi();vVe=o(function(){X.debug("Something is calling, setConf, remove the call")},"setConf"),efe={monday:Nh,tuesday:I5,wednesday:O5,thursday:fc,friday:P5,saturday:B5,sunday:wl},xVe=o((t,e)=>{let r=[...t].map(()=>-1/0),n=[...t].sort((a,s)=>a.startTime-s.startTime||a.order-s.order),i=0;for(let a of n)for(let s=0;s=r[s]){r[s]=a.endTime,a.order=s+e,s>i&&(i=s);break}return i},"getMaxIntersections"),bVe=o(function(t,e,r,n){let i=me().gantt,a=me().securityLevel,s;a==="sandbox"&&(s=Ge("#i"+e));let l=a==="sandbox"?Ge(s.nodes()[0].contentDocument.body):Ge("body"),u=a==="sandbox"?s.nodes()[0].contentDocument:document,h=u.getElementById(e);Ju=h.parentElement.offsetWidth,Ju===void 0&&(Ju=1200),i.useWidth!==void 0&&(Ju=i.useWidth);let f=n.db.getTasks(),d=[];for(let C of f)d.push(C.type);d=_(d);let p={},m=2*i.topPadding;if(n.db.getDisplayMode()==="compact"||i.displayMode==="compact"){let C={};for(let O of f)C[O.section]===void 0?C[O.section]=[O]:C[O.section].push(O);let D=0;for(let O of Object.keys(C)){let R=xVe(C[O],D)+1;D+=R,m+=R*(i.barHeight+i.barGap),p[O]=R}}else{m+=f.length*(i.barHeight+i.barGap);for(let C of d)p[C]=f.filter(D=>D.type===C).length}h.setAttribute("viewBox","0 0 "+Ju+" "+m);let g=l.select(`[id="${e}"]`),y=z5().domain([W3(f,function(C){return C.startTime}),H3(f,function(C){return C.endTime})]).rangeRound([0,Ju-i.leftPadding-i.rightPadding]);function v(C,D){let O=C.startTime,R=D.startTime,k=0;return O>R?k=1:Oz.vert===$.vert?0:z.vert?1:-1);let M=[...new Set(C.map(z=>z.order))].map(z=>C.find($=>$.order===z));g.append("g").selectAll("rect").data(M).enter().append("rect").attr("x",0).attr("y",function(z,$){return $=z.order,$*D+O-2}).attr("width",function(){return A-i.rightPadding/2}).attr("height",D).attr("class",function(z){for(let[$,U]of d.entries())if(z.type===U)return"section section"+$%i.numberSectionStyles;return"section section0"}).enter();let P=g.append("g").selectAll("rect").data(C).enter(),B=n.db.getLinks();if(P.append("rect").attr("id",function(z){return z.id}).attr("rx",3).attr("ry",3).attr("x",function(z){return z.milestone?y(z.startTime)+R+.5*(y(z.endTime)-y(z.startTime))-.5*k:y(z.startTime)+R}).attr("y",function(z,$){return $=z.order,z.vert?i.gridLineStartPadding:$*D+O}).attr("width",function(z){return z.milestone?k:z.vert?.08*k:y(z.renderEndTime||z.endTime)-y(z.startTime)}).attr("height",function(z){return z.vert?f.length*(i.barHeight+i.barGap)+i.barHeight*2:k}).attr("transform-origin",function(z,$){return $=z.order,(y(z.startTime)+R+.5*(y(z.endTime)-y(z.startTime))).toString()+"px "+($*D+O+.5*k).toString()+"px"}).attr("class",function(z){let $="task",U="";z.classes.length>0&&(U=z.classes.join(" "));let K=0;for(let[Y,ce]of d.entries())z.type===ce&&(K=Y%i.numberSectionStyles);let ee="";return z.active?z.crit?ee+=" activeCrit":ee=" active":z.done?z.crit?ee=" doneCrit":ee=" done":z.crit&&(ee+=" crit"),ee.length===0&&(ee=" task"),z.milestone&&(ee=" milestone "+ee),z.vert&&(ee=" vert "+ee),ee+=K,ee+=" "+U,$+ee}),P.append("text").attr("id",function(z){return z.id+"-text"}).text(function(z){return z.task}).attr("font-size",i.fontSize).attr("x",function(z){let $=y(z.startTime),U=y(z.renderEndTime||z.endTime);if(z.milestone&&($+=.5*(y(z.endTime)-y(z.startTime))-.5*k,U=$+k),z.vert)return y(z.startTime)+R;let K=this.getBBox().width;return K>U-$?U+K+1.5*i.leftPadding>A?$+R-5:U+R+5:(U-$)/2+$+R}).attr("y",function(z,$){return z.vert?i.gridLineStartPadding+f.length*(i.barHeight+i.barGap)+60:($=z.order,$*D+i.barHeight/2+(i.fontSize/2-2)+O)}).attr("text-height",k).attr("class",function(z){let $=y(z.startTime),U=y(z.endTime);z.milestone&&(U=$+k);let K=this.getBBox().width,ee="";z.classes.length>0&&(ee=z.classes.join(" "));let Y=0;for(let[Z,ue]of d.entries())z.type===ue&&(Y=Z%i.numberSectionStyles);let ce="";return z.active&&(z.crit?ce="activeCritText"+Y:ce="activeText"+Y),z.done?z.crit?ce=ce+" doneCritText"+Y:ce=ce+" doneText"+Y:z.crit&&(ce=ce+" critText"+Y),z.milestone&&(ce+=" milestoneText"),z.vert&&(ce+=" vertText"),K>U-$?U+K+1.5*i.leftPadding>A?ee+" taskTextOutsideLeft taskTextOutside"+Y+" "+ce:ee+" taskTextOutsideRight taskTextOutside"+Y+" "+ce+" width-"+K:ee+" taskText taskText"+Y+" "+ce+" width-"+K}),me().securityLevel==="sandbox"){let z;z=Ge("#i"+e);let $=z.nodes()[0].contentDocument;P.filter(function(U){return B.has(U.id)}).each(function(U){var K=$.querySelector("#"+U.id),ee=$.querySelector("#"+U.id+"-text");let Y=K.parentNode;var ce=$.createElement("a");ce.setAttribute("xlink:href",B.get(U.id)),ce.setAttribute("target","_top"),Y.appendChild(ce),ce.appendChild(K),ce.appendChild(ee)})}}o(b,"drawRects");function T(C,D,O,R,k,L,A,I){if(A.length===0&&I.length===0)return;let M,P;for(let{startTime:K,endTime:ee}of L)(M===void 0||KP)&&(P=ee);if(!M||!P)return;if((0,MS.default)(P).diff((0,MS.default)(M),"year")>5){X.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");return}let B=n.db.getDateFormat(),F=[],z=null,$=(0,MS.default)(M);for(;$.valueOf()<=P;)n.db.isInvalidDate($,B,A,I)?z?z.end=$:z={start:$,end:$}:z&&(F.push(z),z=null),$=$.add(1,"d");g.append("g").selectAll("rect").data(F).enter().append("rect").attr("id",function(K){return"exclude-"+K.start.format("YYYY-MM-DD")}).attr("x",function(K){return y(K.start)+O}).attr("y",i.gridLineStartPadding).attr("width",function(K){let ee=K.end.add(1,"day");return y(ee)-y(K.start)}).attr("height",k-D-i.gridLineStartPadding).attr("transform-origin",function(K,ee){return(y(K.start)+O+.5*(y(K.end)-y(K.start))).toString()+"px "+(ee*C+.5*k).toString()+"px"}).attr("class","exclude-range")}o(T,"drawExcludeDays");function S(C,D,O,R){let k=zA(y).tickSize(-R+D+i.gridLineStartPadding).tickFormat(Ld(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d")),A=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(n.db.getTickInterval()||i.tickInterval);if(A!==null){let I=A[1],M=A[2],P=n.db.getWeekday()||i.weekday;switch(M){case"millisecond":k.ticks(uc.every(I));break;case"second":k.ticks(eo.every(I));break;case"minute":k.ticks(wu.every(I));break;case"hour":k.ticks(ku.every(I));break;case"day":k.ticks(Ro.every(I));break;case"week":k.ticks(efe[P].every(I));break;case"month":k.ticks(Eu.every(I));break}}if(g.append("g").attr("class","grid").attr("transform","translate("+C+", "+(R-50)+")").call(k).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),n.db.topAxisEnabled()||i.topAxis){let I=$A(y).tickSize(-R+D+i.gridLineStartPadding).tickFormat(Ld(n.db.getAxisFormat()||i.axisFormat||"%Y-%m-%d"));if(A!==null){let M=A[1],P=A[2],B=n.db.getWeekday()||i.weekday;switch(P){case"millisecond":I.ticks(uc.every(M));break;case"second":I.ticks(eo.every(M));break;case"minute":I.ticks(wu.every(M));break;case"hour":I.ticks(ku.every(M));break;case"day":I.ticks(Ro.every(M));break;case"week":I.ticks(efe[B].every(M));break;case"month":I.ticks(Eu.every(M));break}}g.append("g").attr("class","grid").attr("transform","translate("+C+", "+D+")").call(I).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}o(S,"makeGrid");function w(C,D){let O=0,R=Object.keys(p).map(k=>[k,p[k]]);g.append("g").selectAll("text").data(R).enter().append(function(k){let L=k[0].split(Ze.lineBreakRegex),A=-(L.length-1)/2,I=u.createElementNS("http://www.w3.org/2000/svg","text");I.setAttribute("dy",A+"em");for(let[M,P]of L.entries()){let B=u.createElementNS("http://www.w3.org/2000/svg","tspan");B.setAttribute("alignment-baseline","central"),B.setAttribute("x","10"),M>0&&B.setAttribute("dy","1em"),B.textContent=P,I.appendChild(B)}return I}).attr("x",10).attr("y",function(k,L){if(L>0)for(let A=0;A{"use strict";TVe=o(t=>` - .mermaid-main-font { - font-family: ${t.fontFamily}; - } - - .exclude-range { - fill: ${t.excludeBkgColor}; - } - - .section { - stroke: none; - opacity: 0.2; - } - - .section0 { - fill: ${t.sectionBkgColor}; - } - - .section2 { - fill: ${t.sectionBkgColor2}; - } - - .section1, - .section3 { - fill: ${t.altSectionBkgColor}; - opacity: 0.2; - } - - .sectionTitle0 { - fill: ${t.titleColor}; - } - - .sectionTitle1 { - fill: ${t.titleColor}; - } - - .sectionTitle2 { - fill: ${t.titleColor}; - } - - .sectionTitle3 { - fill: ${t.titleColor}; - } - - .sectionTitle { - text-anchor: start; - font-family: ${t.fontFamily}; - } - - - /* Grid and axis */ - - .grid .tick { - stroke: ${t.gridColor}; - opacity: 0.8; - shape-rendering: crispEdges; - } - - .grid .tick text { - font-family: ${t.fontFamily}; - fill: ${t.textColor}; - } - - .grid path { - stroke-width: 0; - } - - - /* Today line */ - - .today { - fill: none; - stroke: ${t.todayLineColor}; - stroke-width: 2px; - } - - - /* Task styling */ - - /* Default task */ - - .task { - stroke-width: 2; - } - - .taskText { - text-anchor: middle; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideRight { - fill: ${t.taskTextDarkColor}; - text-anchor: start; - font-family: ${t.fontFamily}; - } - - .taskTextOutsideLeft { - fill: ${t.taskTextDarkColor}; - text-anchor: end; - } - - - /* Special case clickable */ - - .task.clickable { - cursor: pointer; - } - - .taskText.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideLeft.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - .taskTextOutsideRight.clickable { - cursor: pointer; - fill: ${t.taskTextClickableColor} !important; - font-weight: bold; - } - - - /* Specific task settings for the sections*/ - - .taskText0, - .taskText1, - .taskText2, - .taskText3 { - fill: ${t.taskTextColor}; - } - - .task0, - .task1, - .task2, - .task3 { - fill: ${t.taskBkgColor}; - stroke: ${t.taskBorderColor}; - } - - .taskTextOutside0, - .taskTextOutside2 - { - fill: ${t.taskTextOutsideColor}; - } - - .taskTextOutside1, - .taskTextOutside3 { - fill: ${t.taskTextOutsideColor}; - } - - - /* Active task */ - - .active0, - .active1, - .active2, - .active3 { - fill: ${t.activeTaskBkgColor}; - stroke: ${t.activeTaskBorderColor}; - } - - .activeText0, - .activeText1, - .activeText2, - .activeText3 { - fill: ${t.taskTextDarkColor} !important; - } - - - /* Completed task */ - - .done0, - .done1, - .done2, - .done3 { - stroke: ${t.doneTaskBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - } - - .doneText0, - .doneText1, - .doneText2, - .doneText3 { - fill: ${t.taskTextDarkColor} !important; - } - - - /* Tasks on the critical line */ - - .crit0, - .crit1, - .crit2, - .crit3 { - stroke: ${t.critBorderColor}; - fill: ${t.critBkgColor}; - stroke-width: 2; - } - - .activeCrit0, - .activeCrit1, - .activeCrit2, - .activeCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.activeTaskBkgColor}; - stroke-width: 2; - } - - .doneCrit0, - .doneCrit1, - .doneCrit2, - .doneCrit3 { - stroke: ${t.critBorderColor}; - fill: ${t.doneTaskBkgColor}; - stroke-width: 2; - cursor: pointer; - shape-rendering: crispEdges; - } - - .milestone { - transform: rotate(45deg) scale(0.8,0.8); - } - - .milestoneText { - font-style: italic; - } - .doneCritText0, - .doneCritText1, - .doneCritText2, - .doneCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - .vert { - stroke: ${t.vertLineColor}; - } - - .vertText { - font-size: 15px; - text-anchor: middle; - fill: ${t.vertLineColor} !important; - } - - .activeCritText0, - .activeCritText1, - .activeCritText2, - .activeCritText3 { - fill: ${t.taskTextDarkColor} !important; - } - - .titleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.titleColor||t.textColor}; - font-family: ${t.fontFamily}; - } -`,"getStyles"),nfe=TVe});var afe={};ur(afe,{diagram:()=>wVe});var wVe,sfe=N(()=>{"use strict";Mhe();Jhe();rfe();ife();wVe={parser:Nhe,db:Qhe,renderer:tfe,styles:nfe}});var cfe,ufe=N(()=>{"use strict";bf();yt();cfe={parse:o(async t=>{let e=await vs("info",t);X.debug(e)},"parse")}});var Db,XO=N(()=>{Db={name:"mermaid",version:"11.9.0",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",type:"module",module:"./dist/mermaid.core.mjs",types:"./dist/mermaid.d.ts",exports:{".":{types:"./dist/mermaid.d.ts",import:"./dist/mermaid.core.mjs",default:"./dist/mermaid.core.mjs"},"./*":"./*"},keywords:["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph","mindmap","packet diagram","c4 diagram","er diagram","pie chart","pie diagram","quadrant chart","requirement diagram","graph"],scripts:{clean:"rimraf dist",dev:"pnpm -w dev","docs:code":"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup","docs:build":"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts","docs:verify":"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify","docs:pre:vitepress":"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts","docs:build:vitepress":"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing","docs:dev":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:dev:docker":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:serve":"pnpm docs:build:vitepress && vitepress serve src/vitepress","docs:spellcheck":'cspell "src/docs/**/*.md"',"docs:release-version":"tsx scripts/update-release-version.mts","docs:verify-version":"tsx scripts/update-release-version.mts --verify","types:build-config":"tsx scripts/create-types-from-json-schema.mts","types:verify-config":"tsx scripts/create-types-from-json-schema.mts --verify",checkCircle:"npx madge --circular ./src",prepublishOnly:"pnpm docs:verify-version"},repository:{type:"git",url:"https://github.com/mermaid-js/mermaid"},author:"Knut Sveidqvist",license:"MIT",standard:{ignore:["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],globals:["page"]},dependencies:{"@braintree/sanitize-url":"^7.0.4","@iconify/utils":"^2.1.33","@mermaid-js/parser":"workspace:^","@types/d3":"^7.4.3",cytoscape:"^3.29.3","cytoscape-cose-bilkent":"^4.1.0","cytoscape-fcose":"^2.2.0",d3:"^7.9.0","d3-sankey":"^0.12.3","dagre-d3-es":"7.0.11",dayjs:"^1.11.13",dompurify:"^3.2.5",katex:"^0.16.22",khroma:"^2.1.0","lodash-es":"^4.17.21",marked:"^16.0.0",roughjs:"^4.6.6",stylis:"^4.3.6","ts-dedent":"^2.2.0",uuid:"^11.1.0"},devDependencies:{"@adobe/jsonschema2md":"^8.0.2","@iconify/types":"^2.0.0","@types/cytoscape":"^3.21.9","@types/cytoscape-fcose":"^2.2.4","@types/d3-sankey":"^0.12.4","@types/d3-scale":"^4.0.9","@types/d3-scale-chromatic":"^3.1.0","@types/d3-selection":"^3.0.11","@types/d3-shape":"^3.1.7","@types/jsdom":"^21.1.7","@types/katex":"^0.16.7","@types/lodash-es":"^4.17.12","@types/micromatch":"^4.0.9","@types/stylis":"^4.2.7","@types/uuid":"^10.0.0",ajv:"^8.17.1",canvas:"^3.1.0",chokidar:"3.6.0",concurrently:"^9.1.2","csstree-validator":"^4.0.1",globby:"^14.0.2",jison:"^0.4.18","js-base64":"^3.7.7",jsdom:"^26.1.0","json-schema-to-typescript":"^15.0.4",micromatch:"^4.0.8","path-browserify":"^1.0.1",prettier:"^3.5.2",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1",rimraf:"^6.0.1","start-server-and-test":"^2.0.10","type-fest":"^4.35.0",typedoc:"^0.27.8","typedoc-plugin-markdown":"^4.4.2",typescript:"~5.7.3","unist-util-flatmap":"^1.0.0","unist-util-visit":"^5.0.0",vitepress:"^1.0.2","vitepress-plugin-search":"1.0.4-alpha.22"},files:["dist/","README.md"],publishConfig:{access:"public"}}});var AVe,_Ve,hfe,ffe=N(()=>{"use strict";XO();AVe={version:Db.version+""},_Ve=o(()=>AVe.version,"getVersion"),hfe={getVersion:_Ve}});var Li,Vl=N(()=>{"use strict";fr();Gt();Li=o(t=>{let{securityLevel:e}=me(),r=Ge("body");if(e==="sandbox"){let a=Ge(`#i${t}`).node()?.contentDocument??document;r=Ge(a.body)}return r.select(`#${t}`)},"selectSvgElement")});var DVe,dfe,pfe=N(()=>{"use strict";yt();Vl();xi();DVe=o((t,e,r)=>{X.debug(`rendering info diagram -`+t);let n=Li(e);fn(n,100,400,!0),n.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw"),dfe={draw:DVe}});var mfe={};ur(mfe,{diagram:()=>LVe});var LVe,gfe=N(()=>{"use strict";ufe();ffe();pfe();LVe={parser:cfe,db:hfe,renderer:dfe}});var xfe,jO,IS,KO,MVe,IVe,OVe,PVe,BVe,FVe,$Ve,OS,QO=N(()=>{"use strict";yt();ci();_a();xfe=or.pie,jO={sections:new Map,showData:!1,config:xfe},IS=jO.sections,KO=jO.showData,MVe=structuredClone(xfe),IVe=o(()=>structuredClone(MVe),"getConfig"),OVe=o(()=>{IS=new Map,KO=jO.showData,kr()},"clear"),PVe=o(({label:t,value:e})=>{IS.has(t)||(IS.set(t,e),X.debug(`added new section: ${t}, with value: ${e}`))},"addSection"),BVe=o(()=>IS,"getSections"),FVe=o(t=>{KO=t},"setShowData"),$Ve=o(()=>KO,"getShowData"),OS={getConfig:IVe,clear:OVe,setDiagramTitle:Or,getDiagramTitle:Nr,setAccTitle:Ar,getAccTitle:Dr,setAccDescription:Lr,getAccDescription:Rr,addSection:PVe,getSections:BVe,setShowData:FVe,getShowData:$Ve}});var zVe,bfe,Tfe=N(()=>{"use strict";bf();yt();Mp();QO();zVe=o((t,e)=>{Jo(t,e),e.setShowData(t.showData),t.sections.map(e.addSection)},"populateDb"),bfe={parse:o(async t=>{let e=await vs("pie",t);X.debug(e),zVe(e,OS)},"parse")}});var GVe,wfe,kfe=N(()=>{"use strict";GVe=o(t=>` - .pieCircle{ - stroke: ${t.pieStrokeColor}; - stroke-width : ${t.pieStrokeWidth}; - opacity : ${t.pieOpacity}; - } - .pieOuterCircle{ - stroke: ${t.pieOuterStrokeColor}; - stroke-width: ${t.pieOuterStrokeWidth}; - fill: none; - } - .pieTitleText { - text-anchor: middle; - font-size: ${t.pieTitleTextSize}; - fill: ${t.pieTitleTextColor}; - font-family: ${t.fontFamily}; - } - .slice { - font-family: ${t.fontFamily}; - fill: ${t.pieSectionTextColor}; - font-size:${t.pieSectionTextSize}; - // fill: white; - } - .legend text { - fill: ${t.pieLegendTextColor}; - font-family: ${t.fontFamily}; - font-size: ${t.pieLegendTextSize}; - } -`,"getStyles"),wfe=GVe});var VVe,UVe,Efe,Sfe=N(()=>{"use strict";fr();Gt();yt();Vl();xi();er();VVe=o(t=>{let e=[...t.entries()].map(n=>({label:n[0],value:n[1]})).sort((n,i)=>i.value-n.value);return q5().value(n=>n.value)(e)},"createPieArcs"),UVe=o((t,e,r,n)=>{X.debug(`rendering pie chart -`+t);let i=n.db,a=me(),s=$n(i.getConfig(),a.pie),l=40,u=18,h=4,f=450,d=f,p=Li(e),m=p.append("g");m.attr("transform","translate("+d/2+","+f/2+")");let{themeVariables:g}=a,[y]=zo(g.pieOuterStrokeWidth);y??=2;let v=s.textPosition,x=Math.min(d,f)/2-l,b=Sl().innerRadius(0).outerRadius(x),T=Sl().innerRadius(x*v).outerRadius(x*v);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+y/2).attr("class","pieOuterCircle");let S=i.getSections(),w=VVe(S),E=[g.pie1,g.pie2,g.pie3,g.pie4,g.pie5,g.pie6,g.pie7,g.pie8,g.pie9,g.pie10,g.pie11,g.pie12],_=Js(E);m.selectAll("mySlices").data(w).enter().append("path").attr("d",b).attr("fill",k=>_(k.data.label)).attr("class","pieCircle");let C=0;S.forEach(k=>{C+=k}),m.selectAll("mySlices").data(w).enter().append("text").text(k=>(k.data.value/C*100).toFixed(0)+"%").attr("transform",k=>"translate("+T.centroid(k)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(i.getDiagramTitle()).attr("x",0).attr("y",-(f-50)/2).attr("class","pieTitleText");let D=m.selectAll(".legend").data(_.domain()).enter().append("g").attr("class","legend").attr("transform",(k,L)=>{let A=u+h,I=A*_.domain().length/2,M=12*u,P=L*A-I;return"translate("+M+","+P+")"});D.append("rect").attr("width",u).attr("height",u).style("fill",_).style("stroke",_),D.data(w).append("text").attr("x",u+h).attr("y",u-h).text(k=>{let{label:L,value:A}=k.data;return i.getShowData()?`${L} [${A}]`:L});let O=Math.max(...D.selectAll("text").nodes().map(k=>k?.getBoundingClientRect().width??0)),R=d+l+u+h+O;p.attr("viewBox",`0 0 ${R} ${f}`),fn(p,f,R,s.useMaxWidth)},"draw"),Efe={draw:UVe}});var Cfe={};ur(Cfe,{diagram:()=>HVe});var HVe,Afe=N(()=>{"use strict";Tfe();QO();kfe();Sfe();HVe={parser:bfe,db:OS,renderer:Efe,styles:wfe}});var ZO,Lfe,Rfe=N(()=>{"use strict";ZO=function(){var t=o(function(Te,W,pe,ve){for(pe=pe||{},ve=Te.length;ve--;pe[Te[ve]]=W);return pe},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[1,7],s=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],u=[55,56,57],h=[2,36],f=[1,37],d=[1,36],p=[1,38],m=[1,35],g=[1,43],y=[1,41],v=[1,14],x=[1,23],b=[1,18],T=[1,19],S=[1,20],w=[1,21],E=[1,22],_=[1,24],C=[1,25],D=[1,26],O=[1,27],R=[1,28],k=[1,29],L=[1,32],A=[1,33],I=[1,34],M=[1,39],P=[1,40],B=[1,42],F=[1,44],z=[1,62],$=[1,61],U=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],K=[1,65],ee=[1,66],Y=[1,67],ce=[1,68],Z=[1,69],ue=[1,70],Q=[1,71],j=[1,72],ne=[1,73],te=[1,74],he=[1,75],le=[1,76],J=[4,5,6,7,8,9,10,11,12,13,14,15,18],Se=[1,90],se=[1,91],ae=[1,92],Oe=[1,99],ye=[1,93],Be=[1,96],He=[1,94],ze=[1,95],Le=[1,97],Ie=[1,98],xe=[1,102],q=[10,55,56,57],de=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ie={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:o(function(W,pe,ve,Pe,_e,be,Ve){var De=be.length-1;switch(_e){case 23:this.$=be[De];break;case 24:this.$=be[De-1]+""+be[De];break;case 26:this.$=be[De-1]+be[De];break;case 27:this.$=[be[De].trim()];break;case 28:be[De-2].push(be[De].trim()),this.$=be[De-2];break;case 29:this.$=be[De-4],Pe.addClass(be[De-2],be[De]);break;case 37:this.$=[];break;case 42:this.$=be[De].trim(),Pe.setDiagramTitle(this.$);break;case 43:this.$=be[De].trim(),Pe.setAccTitle(this.$);break;case 44:case 45:this.$=be[De].trim(),Pe.setAccDescription(this.$);break;case 46:Pe.addSection(be[De].substr(8)),this.$=be[De].substr(8);break;case 47:Pe.addPoint(be[De-3],"",be[De-1],be[De],[]);break;case 48:Pe.addPoint(be[De-4],be[De-3],be[De-1],be[De],[]);break;case 49:Pe.addPoint(be[De-4],"",be[De-2],be[De-1],be[De]);break;case 50:Pe.addPoint(be[De-5],be[De-4],be[De-2],be[De-1],be[De]);break;case 51:Pe.setXAxisLeftText(be[De-2]),Pe.setXAxisRightText(be[De]);break;case 52:be[De-1].text+=" \u27F6 ",Pe.setXAxisLeftText(be[De-1]);break;case 53:Pe.setXAxisLeftText(be[De]);break;case 54:Pe.setYAxisBottomText(be[De-2]),Pe.setYAxisTopText(be[De]);break;case 55:be[De-1].text+=" \u27F6 ",Pe.setYAxisBottomText(be[De-1]);break;case 56:Pe.setYAxisBottomText(be[De]);break;case 57:Pe.setQuadrant1Text(be[De]);break;case 58:Pe.setQuadrant2Text(be[De]);break;case 59:Pe.setQuadrant3Text(be[De]);break;case 60:Pe.setQuadrant4Text(be[De]);break;case 64:this.$={text:be[De],type:"text"};break;case 65:this.$={text:be[De-1].text+""+be[De],type:be[De-1].type};break;case 66:this.$={text:be[De],type:"text"};break;case 67:this.$={text:be[De],type:"markdown"};break;case 68:this.$=be[De];break;case 69:this.$=be[De-1]+""+be[De];break}},"anonymous"),table:[{18:e,26:1,27:2,28:r,55:n,56:i,57:a},{1:[3]},{18:e,26:8,27:2,28:r,55:n,56:i,57:a},{18:e,26:9,27:2,28:r,55:n,56:i,57:a},t(s,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(u,h,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:E,48:_,50:C,51:D,52:O,53:R,54:k,60:L,61:A,63:I,64:M,65:P,66:B,67:F}),t(s,[2,34]),{27:45,55:n,56:i,57:a},t(u,[2,37]),t(u,h,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:f,5:d,10:p,12:m,13:g,14:y,18:v,25:x,35:b,37:T,39:S,41:w,42:E,48:_,50:C,51:D,52:O,53:R,54:k,60:L,61:A,63:I,64:M,65:P,66:B,67:F}),t(u,[2,39]),t(u,[2,40]),t(u,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(u,[2,45]),t(u,[2,46]),{18:[1,50]},{4:f,5:d,10:p,12:m,13:g,14:y,43:51,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:52,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:53,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:54,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:55,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,10:p,12:m,13:g,14:y,43:56,58:31,60:L,61:A,63:I,64:M,65:P,66:B,67:F},{4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,44:[1,57],47:[1,58],58:60,59:59,63:I,64:M,65:P,66:B,67:F},t(U,[2,64]),t(U,[2,66]),t(U,[2,67]),t(U,[2,70]),t(U,[2,71]),t(U,[2,72]),t(U,[2,73]),t(U,[2,74]),t(U,[2,75]),t(U,[2,76]),t(U,[2,77]),t(U,[2,78]),t(U,[2,79]),t(U,[2,80]),t(s,[2,35]),t(u,[2,38]),t(u,[2,42]),t(u,[2,43]),t(u,[2,44]),{3:64,4:K,5:ee,6:Y,7:ce,8:Z,9:ue,10:Q,11:j,12:ne,13:te,14:he,15:le,21:63},t(u,[2,53],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,49:[1,77],63:I,64:M,65:P,66:B,67:F}),t(u,[2,56],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,49:[1,78],63:I,64:M,65:P,66:B,67:F}),t(u,[2,57],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),t(u,[2,58],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),t(u,[2,59],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),t(u,[2,60],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),{45:[1,79]},{44:[1,80]},t(U,[2,65]),t(U,[2,81]),t(U,[2,82]),t(U,[2,83]),{3:82,4:K,5:ee,6:Y,7:ce,8:Z,9:ue,10:Q,11:j,12:ne,13:te,14:he,15:le,18:[1,81]},t(J,[2,23]),t(J,[2,1]),t(J,[2,2]),t(J,[2,3]),t(J,[2,4]),t(J,[2,5]),t(J,[2,6]),t(J,[2,7]),t(J,[2,8]),t(J,[2,9]),t(J,[2,10]),t(J,[2,11]),t(J,[2,12]),t(u,[2,52],{58:31,43:83,4:f,5:d,10:p,12:m,13:g,14:y,60:L,61:A,63:I,64:M,65:P,66:B,67:F}),t(u,[2,55],{58:31,43:84,4:f,5:d,10:p,12:m,13:g,14:y,60:L,61:A,63:I,64:M,65:P,66:B,67:F}),{46:[1,85]},{45:[1,86]},{4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,16:89,17:He,18:ze,19:Le,20:Ie,22:88,23:87},t(J,[2,24]),t(u,[2,51],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),t(u,[2,54],{59:59,58:60,4:f,5:d,8:z,10:p,12:m,13:g,14:y,18:$,63:I,64:M,65:P,66:B,67:F}),t(u,[2,47],{22:88,16:89,23:100,4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,17:He,18:ze,19:Le,20:Ie}),{46:[1,101]},t(u,[2,29],{10:xe}),t(q,[2,27],{16:103,4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,17:He,18:ze,19:Le,20:Ie}),t(de,[2,25]),t(de,[2,13]),t(de,[2,14]),t(de,[2,15]),t(de,[2,16]),t(de,[2,17]),t(de,[2,18]),t(de,[2,19]),t(de,[2,20]),t(de,[2,21]),t(de,[2,22]),t(u,[2,49],{10:xe}),t(u,[2,48],{22:88,16:89,23:104,4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,17:He,18:ze,19:Le,20:Ie}),{4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,16:89,17:He,18:ze,19:Le,20:Ie,22:105},t(de,[2,26]),t(u,[2,50],{10:xe}),t(q,[2,28],{16:103,4:Se,5:se,6:ae,8:Oe,11:ye,13:Be,17:He,18:ze,19:Le,20:Ie})],defaultActions:{8:[2,30],9:[2,31]},parseError:o(function(W,pe){if(pe.recoverable)this.trace(W);else{var ve=new Error(W);throw ve.hash=pe,ve}},"parseError"),parse:o(function(W){var pe=this,ve=[0],Pe=[],_e=[null],be=[],Ve=this.table,De="",qe=0,at=0,Rt=0,st=2,Ue=1,ct=be.slice.call(arguments,1),We=Object.create(this.lexer),ot={yy:{}};for(var Yt in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Yt)&&(ot.yy[Yt]=this.yy[Yt]);We.setInput(W,ot.yy),ot.yy.lexer=We,ot.yy.parser=this,typeof We.yylloc>"u"&&(We.yylloc={});var Tt=We.yylloc;be.push(Tt);var Mt=We.options&&We.options.ranges;typeof ot.yy.parseError=="function"?this.parseError=ot.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function bt(Ce){ve.length=ve.length-2*Ce,_e.length=_e.length-Ce,be.length=be.length-Ce}o(bt,"popStack");function ut(){var Ce;return Ce=Pe.pop()||We.lex()||Ue,typeof Ce!="number"&&(Ce instanceof Array&&(Pe=Ce,Ce=Pe.pop()),Ce=pe.symbols_[Ce]||Ce),Ce}o(ut,"lex");for(var St,ft,vt,nt,pn,kt,On={},tn,Mr,Ir,Pn;;){if(vt=ve[ve.length-1],this.defaultActions[vt]?nt=this.defaultActions[vt]:((St===null||typeof St>"u")&&(St=ut()),nt=Ve[vt]&&Ve[vt][St]),typeof nt>"u"||!nt.length||!nt[0]){var Dt="";Pn=[];for(tn in Ve[vt])this.terminals_[tn]&&tn>st&&Pn.push("'"+this.terminals_[tn]+"'");We.showPosition?Dt="Parse error on line "+(qe+1)+`: -`+We.showPosition()+` -Expecting `+Pn.join(", ")+", got '"+(this.terminals_[St]||St)+"'":Dt="Parse error on line "+(qe+1)+": Unexpected "+(St==Ue?"end of input":"'"+(this.terminals_[St]||St)+"'"),this.parseError(Dt,{text:We.match,token:this.terminals_[St]||St,line:We.yylineno,loc:Tt,expected:Pn})}if(nt[0]instanceof Array&&nt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+vt+", token: "+St);switch(nt[0]){case 1:ve.push(St),_e.push(We.yytext),be.push(We.yylloc),ve.push(nt[1]),St=null,ft?(St=ft,ft=null):(at=We.yyleng,De=We.yytext,qe=We.yylineno,Tt=We.yylloc,Rt>0&&Rt--);break;case 2:if(Mr=this.productions_[nt[1]][1],On.$=_e[_e.length-Mr],On._$={first_line:be[be.length-(Mr||1)].first_line,last_line:be[be.length-1].last_line,first_column:be[be.length-(Mr||1)].first_column,last_column:be[be.length-1].last_column},Mt&&(On._$.range=[be[be.length-(Mr||1)].range[0],be[be.length-1].range[1]]),kt=this.performAction.apply(On,[De,at,qe,ot.yy,nt[1],_e,be].concat(ct)),typeof kt<"u")return kt;Mr&&(ve=ve.slice(0,-1*Mr*2),_e=_e.slice(0,-1*Mr),be=be.slice(0,-1*Mr)),ve.push(this.productions_[nt[1]][0]),_e.push(On.$),be.push(On._$),Ir=Ve[ve[ve.length-2]][ve[ve.length-1]],ve.push(Ir);break;case 3:return!0}}return!0},"parse")},oe=function(){var Te={EOF:1,parseError:o(function(pe,ve){if(this.yy.parser)this.yy.parser.parseError(pe,ve);else throw new Error(pe)},"parseError"),setInput:o(function(W,pe){return this.yy=pe||this.yy||{},this._input=W,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var W=this._input[0];this.yytext+=W,this.yyleng++,this.offset++,this.match+=W,this.matched+=W;var pe=W.match(/(?:\r\n?|\n).*/g);return pe?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),W},"input"),unput:o(function(W){var pe=W.length,ve=W.split(/(?:\r\n?|\n)/g);this._input=W+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-pe),this.offset-=pe;var Pe=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),ve.length-1&&(this.yylineno-=ve.length-1);var _e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:ve?(ve.length===Pe.length?this.yylloc.first_column:0)+Pe[Pe.length-ve.length].length-ve[0].length:this.yylloc.first_column-pe},this.options.ranges&&(this.yylloc.range=[_e[0],_e[0]+this.yyleng-pe]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(W){this.unput(this.match.slice(W))},"less"),pastInput:o(function(){var W=this.matched.substr(0,this.matched.length-this.match.length);return(W.length>20?"...":"")+W.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var W=this.match;return W.length<20&&(W+=this._input.substr(0,20-W.length)),(W.substr(0,20)+(W.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var W=this.pastInput(),pe=new Array(W.length+1).join("-");return W+this.upcomingInput()+` -`+pe+"^"},"showPosition"),test_match:o(function(W,pe){var ve,Pe,_e;if(this.options.backtrack_lexer&&(_e={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(_e.yylloc.range=this.yylloc.range.slice(0))),Pe=W[0].match(/(?:\r\n?|\n).*/g),Pe&&(this.yylineno+=Pe.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:Pe?Pe[Pe.length-1].length-Pe[Pe.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+W[0].length},this.yytext+=W[0],this.match+=W[0],this.matches=W,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(W[0].length),this.matched+=W[0],ve=this.performAction.call(this,this.yy,this,pe,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),ve)return ve;if(this._backtrack){for(var be in _e)this[be]=_e[be];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var W,pe,ve,Pe;this._more||(this.yytext="",this.match="");for(var _e=this._currentRules(),be=0;be<_e.length;be++)if(ve=this._input.match(this.rules[_e[be]]),ve&&(!pe||ve[0].length>pe[0].length)){if(pe=ve,Pe=be,this.options.backtrack_lexer){if(W=this.test_match(ve,_e[be]),W!==!1)return W;if(this._backtrack){pe=!1;continue}else return!1}else if(!this.options.flex)break}return pe?(W=this.test_match(pe,_e[Pe]),W!==!1?W:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var pe=this.next();return pe||this.lex()},"lex"),begin:o(function(pe){this.conditionStack.push(pe)},"begin"),popState:o(function(){var pe=this.conditionStack.length-1;return pe>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(pe){return pe=this.conditionStack.length-1-Math.abs(pe||0),pe>=0?this.conditionStack[pe]:"INITIAL"},"topState"),pushState:o(function(pe){this.begin(pe)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(pe,ve,Pe,_e){var be=_e;switch(Pe){case 0:break;case 1:break;case 2:return 55;case 3:break;case 4:return this.begin("title"),35;break;case 5:return this.popState(),"title_value";break;case 6:return this.begin("acc_title"),37;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),39;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 23:this.popState();break;case 24:this.begin("string");break;case 25:this.popState();break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;break;case 29:return this.begin("point_start"),44;break;case 30:return this.begin("point_x"),45;break;case 31:this.popState();break;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;break;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:return 65;case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}};return Te}();ie.lexer=oe;function V(){this.yy={}}return o(V,"Parser"),V.prototype=ie,ie.Parser=V,new V}();ZO.parser=ZO;Lfe=ZO});var xs,PS,Nfe=N(()=>{"use strict";fr();_a();yt();By();xs=dh(),PS=class{constructor(){this.classes=new Map;this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{o(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:or.quadrantChart?.chartWidth||500,chartWidth:or.quadrantChart?.chartHeight||500,titlePadding:or.quadrantChart?.titlePadding||10,titleFontSize:or.quadrantChart?.titleFontSize||20,quadrantPadding:or.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:or.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:or.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:or.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:or.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:or.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:or.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:or.quadrantChart?.pointTextPadding||5,pointLabelFontSize:or.quadrantChart?.pointLabelFontSize||12,pointRadius:or.quadrantChart?.pointRadius||5,xAxisPosition:or.quadrantChart?.xAxisPosition||"top",yAxisPosition:or.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:or.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:or.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:xs.quadrant1Fill,quadrant2Fill:xs.quadrant2Fill,quadrant3Fill:xs.quadrant3Fill,quadrant4Fill:xs.quadrant4Fill,quadrant1TextFill:xs.quadrant1TextFill,quadrant2TextFill:xs.quadrant2TextFill,quadrant3TextFill:xs.quadrant3TextFill,quadrant4TextFill:xs.quadrant4TextFill,quadrantPointFill:xs.quadrantPointFill,quadrantPointTextFill:xs.quadrantPointTextFill,quadrantXAxisTextFill:xs.quadrantXAxisTextFill,quadrantYAxisTextFill:xs.quadrantYAxisTextFill,quadrantTitleFill:xs.quadrantTitleFill,quadrantInternalBorderStrokeFill:xs.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:xs.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,X.info("clear called")}setData(e){this.data={...this.data,...e}}addPoints(e){this.data.points=[...e,...this.data.points]}addClass(e,r){this.classes.set(e,r)}setConfig(e){X.trace("setConfig called with: ",e),this.config={...this.config,...e}}setThemeConfig(e){X.trace("setThemeConfig called with: ",e),this.themeConfig={...this.themeConfig,...e}}calculateSpace(e,r,n,i){let a=this.config.xAxisLabelPadding*2+this.config.xAxisLabelFontSize,s={top:e==="top"&&r?a:0,bottom:e==="bottom"&&r?a:0},l=this.config.yAxisLabelPadding*2+this.config.yAxisLabelFontSize,u={left:this.config.yAxisPosition==="left"&&n?l:0,right:this.config.yAxisPosition==="right"&&n?l:0},h=this.config.titleFontSize+this.config.titlePadding*2,f={top:i?h:0},d=this.config.quadrantPadding+u.left,p=this.config.quadrantPadding+s.top+f.top,m=this.config.chartWidth-this.config.quadrantPadding*2-u.left-u.right,g=this.config.chartHeight-this.config.quadrantPadding*2-s.top-s.bottom-f.top,y=m/2,v=g/2;return{xAxisSpace:s,yAxisSpace:u,titleSpace:f,quadrantSpace:{quadrantLeft:d,quadrantTop:p,quadrantWidth:m,quadrantHalfWidth:y,quadrantHeight:g,quadrantHalfHeight:v}}}getAxisLabels(e,r,n,i){let{quadrantSpace:a,titleSpace:s}=i,{quadrantHalfHeight:l,quadrantHeight:u,quadrantLeft:h,quadrantHalfWidth:f,quadrantTop:d,quadrantWidth:p}=a,m=!!this.data.xAxisRightText,g=!!this.data.yAxisTopText,y=[];return this.data.xAxisLeftText&&r&&y.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&r&&y.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:h+f+(m?f/2:0),y:e==="top"?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+d+u+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:m?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&n&&y.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+u-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&n&&y.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:this.config.yAxisPosition==="left"?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+h+p+this.config.quadrantPadding,y:d+l-(g?l/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:g?"center":"left",horizontalPos:"top",rotation:-90}),y}getQuadrants(e){let{quadrantSpace:r}=e,{quadrantHalfHeight:n,quadrantLeft:i,quadrantHalfWidth:a,quadrantTop:s}=r,l=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s,width:a,height:n,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s,width:a,height:n,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:i+a,y:s+n,width:a,height:n,fill:this.themeConfig.quadrant4Fill}];for(let u of l)u.text.x=u.x+u.width/2,this.data.points.length===0?(u.text.y=u.y+u.height/2,u.text.horizontalPos="middle"):(u.text.y=u.y+this.config.quadrantTextTopPadding,u.text.horizontalPos="top");return l}getQuadrantPoints(e){let{quadrantSpace:r}=e,{quadrantHeight:n,quadrantLeft:i,quadrantTop:a,quadrantWidth:s}=r,l=Tl().domain([0,1]).range([i,s+i]),u=Tl().domain([0,1]).range([n+a,a]);return this.data.points.map(f=>{let d=this.classes.get(f.className);return d&&(f={...d,...f}),{x:l(f.x),y:u(f.y),fill:f.color??this.themeConfig.quadrantPointFill,radius:f.radius??this.config.pointRadius,text:{text:f.text,fill:this.themeConfig.quadrantPointTextFill,x:l(f.x),y:u(f.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:f.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:f.strokeWidth??"0px"}})}getBorders(e){let r=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:n}=e,{quadrantHalfHeight:i,quadrantHeight:a,quadrantLeft:s,quadrantHalfWidth:l,quadrantTop:u,quadrantWidth:h}=n;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u,x2:s+h+r,y2:u},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+h,y1:u+r,x2:s+h,y2:u+a-r},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-r,y1:u+a,x2:s+h+r,y2:u+a},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:u+r,x2:s,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+l,y1:u+r,x2:s+l,y2:u+a-r},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:u+i,x2:s+h-r,y2:u+i}]}getTitle(e){if(e)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){let e=this.config.showXAxis&&!!(this.data.xAxisLeftText||this.data.xAxisRightText),r=this.config.showYAxis&&!!(this.data.yAxisTopText||this.data.yAxisBottomText),n=this.config.showTitle&&!!this.data.titleText,i=this.data.points.length>0?"bottom":this.config.xAxisPosition,a=this.calculateSpace(i,e,r,n);return{points:this.getQuadrantPoints(a),quadrants:this.getQuadrants(a),axisLabels:this.getAxisLabels(i,e,r,a),borderLines:this.getBorders(a),title:this.getTitle(n)}}}});function JO(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function Mfe(t){return!/^\d+$/.test(t)}function Ife(t){return!/^\d+px$/.test(t)}var Bp,Ofe=N(()=>{"use strict";Bp=class extends Error{static{o(this,"InvalidStyleError")}constructor(e,r,n){super(`value for ${e} ${r} is invalid, please use a valid ${n}`),this.name="InvalidStyleError"}};o(JO,"validateHexCode");o(Mfe,"validateNumber");o(Ife,"validateSizeInPixels")});function eh(t){return wr(t.trim(),YVe)}function XVe(t){wa.setData({quadrant1Text:eh(t.text)})}function jVe(t){wa.setData({quadrant2Text:eh(t.text)})}function KVe(t){wa.setData({quadrant3Text:eh(t.text)})}function QVe(t){wa.setData({quadrant4Text:eh(t.text)})}function ZVe(t){wa.setData({xAxisLeftText:eh(t.text)})}function JVe(t){wa.setData({xAxisRightText:eh(t.text)})}function eUe(t){wa.setData({yAxisTopText:eh(t.text)})}function tUe(t){wa.setData({yAxisBottomText:eh(t.text)})}function eP(t){let e={};for(let r of t){let[n,i]=r.trim().split(/\s*:\s*/);if(n==="radius"){if(Mfe(i))throw new Bp(n,i,"number");e.radius=parseInt(i)}else if(n==="color"){if(JO(i))throw new Bp(n,i,"hex code");e.color=i}else if(n==="stroke-color"){if(JO(i))throw new Bp(n,i,"hex code");e.strokeColor=i}else if(n==="stroke-width"){if(Ife(i))throw new Bp(n,i,"number of pixels (eg. 10px)");e.strokeWidth=i}else throw new Error(`style named ${n} is not supported.`)}return e}function rUe(t,e,r,n,i){let a=eP(i);wa.addPoints([{x:r,y:n,text:eh(t.text),className:e,...a}])}function nUe(t,e){wa.addClass(t,eP(e))}function iUe(t){wa.setConfig({chartWidth:t})}function aUe(t){wa.setConfig({chartHeight:t})}function sUe(){let t=me(),{themeVariables:e,quadrantChart:r}=t;return r&&wa.setConfig(r),wa.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),wa.setData({titleText:Nr()}),wa.build()}var YVe,wa,oUe,Pfe,Bfe=N(()=>{"use strict";Gt();pr();ci();Nfe();Ofe();YVe=me();o(eh,"textSanitizer");wa=new PS;o(XVe,"setQuadrant1Text");o(jVe,"setQuadrant2Text");o(KVe,"setQuadrant3Text");o(QVe,"setQuadrant4Text");o(ZVe,"setXAxisLeftText");o(JVe,"setXAxisRightText");o(eUe,"setYAxisTopText");o(tUe,"setYAxisBottomText");o(eP,"parseStyles");o(rUe,"addPoint");o(nUe,"addClass");o(iUe,"setWidth");o(aUe,"setHeight");o(sUe,"getQuadrantData");oUe=o(function(){wa.clear(),kr()},"clear"),Pfe={setWidth:iUe,setHeight:aUe,setQuadrant1Text:XVe,setQuadrant2Text:jVe,setQuadrant3Text:KVe,setQuadrant4Text:QVe,setXAxisLeftText:ZVe,setXAxisRightText:JVe,setYAxisTopText:eUe,setYAxisBottomText:tUe,parseStyles:eP,addPoint:rUe,addClass:nUe,getQuadrantData:sUe,clear:oUe,setAccTitle:Ar,getAccTitle:Dr,setDiagramTitle:Or,getDiagramTitle:Nr,getAccDescription:Rr,setAccDescription:Lr}});var lUe,Ffe,$fe=N(()=>{"use strict";fr();Gt();yt();xi();lUe=o((t,e,r,n)=>{function i(C){return C==="top"?"hanging":"middle"}o(i,"getDominantBaseLine");function a(C){return C==="left"?"start":"middle"}o(a,"getTextAnchor");function s(C){return`translate(${C.x}, ${C.y}) rotate(${C.rotation||0})`}o(s,"getTransformation");let l=me();X.debug(`Rendering quadrant chart -`+t);let u=l.securityLevel,h;u==="sandbox"&&(h=Ge("#i"+e));let d=(u==="sandbox"?Ge(h.nodes()[0].contentDocument.body):Ge("body")).select(`[id="${e}"]`),p=d.append("g").attr("class","main"),m=l.quadrantChart?.chartWidth??500,g=l.quadrantChart?.chartHeight??500;fn(d,g,m,l.quadrantChart?.useMaxWidth??!0),d.attr("viewBox","0 0 "+m+" "+g),n.db.setHeight(g),n.db.setWidth(m);let y=n.db.getQuadrantData(),v=p.append("g").attr("class","quadrants"),x=p.append("g").attr("class","border"),b=p.append("g").attr("class","data-points"),T=p.append("g").attr("class","labels"),S=p.append("g").attr("class","title");y.title&&S.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",i(y.title.horizontalPos)).attr("text-anchor",a(y.title.verticalPos)).attr("transform",s(y.title)).text(y.title.text),y.borderLines&&x.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",C=>C.x1).attr("y1",C=>C.y1).attr("x2",C=>C.x2).attr("y2",C=>C.y2).style("stroke",C=>C.strokeFill).style("stroke-width",C=>C.strokeWidth);let w=v.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");w.append("rect").attr("x",C=>C.x).attr("y",C=>C.y).attr("width",C=>C.width).attr("height",C=>C.height).attr("fill",C=>C.fill),w.append("text").attr("x",0).attr("y",0).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text)).text(C=>C.text.text),T.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(C=>C.text).attr("fill",C=>C.fill).attr("font-size",C=>C.fontSize).attr("dominant-baseline",C=>i(C.horizontalPos)).attr("text-anchor",C=>a(C.verticalPos)).attr("transform",C=>s(C));let _=b.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");_.append("circle").attr("cx",C=>C.x).attr("cy",C=>C.y).attr("r",C=>C.radius).attr("fill",C=>C.fill).attr("stroke",C=>C.strokeColor).attr("stroke-width",C=>C.strokeWidth),_.append("text").attr("x",0).attr("y",0).text(C=>C.text.text).attr("fill",C=>C.text.fill).attr("font-size",C=>C.text.fontSize).attr("dominant-baseline",C=>i(C.text.horizontalPos)).attr("text-anchor",C=>a(C.text.verticalPos)).attr("transform",C=>s(C.text))},"draw"),Ffe={draw:lUe}});var zfe={};ur(zfe,{diagram:()=>cUe});var cUe,Gfe=N(()=>{"use strict";Rfe();Bfe();$fe();cUe={parser:Lfe,db:Pfe,renderer:Ffe,styles:o(()=>"","styles")}});var tP,Hfe,Wfe=N(()=>{"use strict";tP=function(){var t=o(function(I,M,P,B){for(P=P||{},B=I.length;B--;P[I[B]]=M);return P},"o"),e=[1,10,12,14,16,18,19,21,23],r=[2,6],n=[1,3],i=[1,5],a=[1,6],s=[1,7],l=[1,5,10,12,14,16,18,19,21,23,34,35,36],u=[1,25],h=[1,26],f=[1,28],d=[1,29],p=[1,30],m=[1,31],g=[1,32],y=[1,33],v=[1,34],x=[1,35],b=[1,36],T=[1,37],S=[1,43],w=[1,42],E=[1,47],_=[1,50],C=[1,10,12,14,16,18,19,21,23,34,35,36],D=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],O=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],R=[1,64],k={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:o(function(M,P,B,F,z,$,U){var K=$.length-1;switch(z){case 5:F.setOrientation($[K]);break;case 9:F.setDiagramTitle($[K].text.trim());break;case 12:F.setLineData({text:"",type:"text"},$[K]);break;case 13:F.setLineData($[K-1],$[K]);break;case 14:F.setBarData({text:"",type:"text"},$[K]);break;case 15:F.setBarData($[K-1],$[K]);break;case 16:this.$=$[K].trim(),F.setAccTitle(this.$);break;case 17:case 18:this.$=$[K].trim(),F.setAccDescription(this.$);break;case 19:this.$=$[K-1];break;case 20:this.$=[Number($[K-2]),...$[K]];break;case 21:this.$=[Number($[K])];break;case 22:F.setXAxisTitle($[K]);break;case 23:F.setXAxisTitle($[K-1]);break;case 24:F.setXAxisTitle({type:"text",text:""});break;case 25:F.setXAxisBand($[K]);break;case 26:F.setXAxisRangeData(Number($[K-2]),Number($[K]));break;case 27:this.$=$[K-1];break;case 28:this.$=[$[K-2],...$[K]];break;case 29:this.$=[$[K]];break;case 30:F.setYAxisTitle($[K]);break;case 31:F.setYAxisTitle($[K-1]);break;case 32:F.setYAxisTitle({type:"text",text:""});break;case 33:F.setYAxisRangeData(Number($[K-2]),Number($[K]));break;case 37:this.$={text:$[K],type:"text"};break;case 38:this.$={text:$[K],type:"text"};break;case 39:this.$={text:$[K],type:"markdown"};break;case 40:this.$=$[K];break;case 41:this.$=$[K-1]+""+$[K];break}},"anonymous"),table:[t(e,r,{3:1,4:2,7:4,5:n,34:i,35:a,36:s}),{1:[3]},t(e,r,{4:2,7:4,3:8,5:n,34:i,35:a,36:s}),t(e,r,{4:2,7:4,6:9,3:10,5:n,8:[1,11],34:i,35:a,36:s}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(l,[2,34]),t(l,[2,35]),t(l,[2,36]),{1:[2,1]},t(e,r,{4:2,7:4,3:21,5:n,34:i,35:a,36:s}),{1:[2,3]},t(l,[2,5]),t(e,[2,7],{4:22,34:i,35:a,36:s}),{11:23,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:39,13:38,24:S,27:w,29:40,30:41,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:45,15:44,27:E,33:46,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:49,17:48,24:_,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{11:52,17:51,24:_,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},{20:[1,53]},{22:[1,54]},t(C,[2,18]),{1:[2,2]},t(C,[2,8]),t(C,[2,9]),t(D,[2,37],{40:55,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T}),t(D,[2,38]),t(D,[2,39]),t(O,[2,40]),t(O,[2,42]),t(O,[2,43]),t(O,[2,44]),t(O,[2,45]),t(O,[2,46]),t(O,[2,47]),t(O,[2,48]),t(O,[2,49]),t(O,[2,50]),t(O,[2,51]),t(C,[2,10]),t(C,[2,22],{30:41,29:56,24:S,27:w}),t(C,[2,24]),t(C,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,11]),t(C,[2,30],{33:60,27:E}),t(C,[2,32]),{31:[1,61]},t(C,[2,12]),{17:62,24:_},{25:63,27:R},t(C,[2,14]),{17:65,24:_},t(C,[2,16]),t(C,[2,17]),t(O,[2,41]),t(C,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(C,[2,31]),{27:[1,69]},t(C,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(C,[2,15]),t(C,[2,26]),t(C,[2,27]),{11:59,32:72,37:24,38:u,39:h,40:27,41:f,42:d,43:p,44:m,45:g,46:y,47:v,48:x,49:b,50:T},t(C,[2,33]),t(C,[2,19]),{25:73,27:R},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:o(function(M,P){if(P.recoverable)this.trace(M);else{var B=new Error(M);throw B.hash=P,B}},"parseError"),parse:o(function(M){var P=this,B=[0],F=[],z=[null],$=[],U=this.table,K="",ee=0,Y=0,ce=0,Z=2,ue=1,Q=$.slice.call(arguments,1),j=Object.create(this.lexer),ne={yy:{}};for(var te in this.yy)Object.prototype.hasOwnProperty.call(this.yy,te)&&(ne.yy[te]=this.yy[te]);j.setInput(M,ne.yy),ne.yy.lexer=j,ne.yy.parser=this,typeof j.yylloc>"u"&&(j.yylloc={});var he=j.yylloc;$.push(he);var le=j.options&&j.options.ranges;typeof ne.yy.parseError=="function"?this.parseError=ne.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function J(ie){B.length=B.length-2*ie,z.length=z.length-ie,$.length=$.length-ie}o(J,"popStack");function Se(){var ie;return ie=F.pop()||j.lex()||ue,typeof ie!="number"&&(ie instanceof Array&&(F=ie,ie=F.pop()),ie=P.symbols_[ie]||ie),ie}o(Se,"lex");for(var se,ae,Oe,ye,Be,He,ze={},Le,Ie,xe,q;;){if(Oe=B[B.length-1],this.defaultActions[Oe]?ye=this.defaultActions[Oe]:((se===null||typeof se>"u")&&(se=Se()),ye=U[Oe]&&U[Oe][se]),typeof ye>"u"||!ye.length||!ye[0]){var de="";q=[];for(Le in U[Oe])this.terminals_[Le]&&Le>Z&&q.push("'"+this.terminals_[Le]+"'");j.showPosition?de="Parse error on line "+(ee+1)+`: -`+j.showPosition()+` -Expecting `+q.join(", ")+", got '"+(this.terminals_[se]||se)+"'":de="Parse error on line "+(ee+1)+": Unexpected "+(se==ue?"end of input":"'"+(this.terminals_[se]||se)+"'"),this.parseError(de,{text:j.match,token:this.terminals_[se]||se,line:j.yylineno,loc:he,expected:q})}if(ye[0]instanceof Array&&ye.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Oe+", token: "+se);switch(ye[0]){case 1:B.push(se),z.push(j.yytext),$.push(j.yylloc),B.push(ye[1]),se=null,ae?(se=ae,ae=null):(Y=j.yyleng,K=j.yytext,ee=j.yylineno,he=j.yylloc,ce>0&&ce--);break;case 2:if(Ie=this.productions_[ye[1]][1],ze.$=z[z.length-Ie],ze._$={first_line:$[$.length-(Ie||1)].first_line,last_line:$[$.length-1].last_line,first_column:$[$.length-(Ie||1)].first_column,last_column:$[$.length-1].last_column},le&&(ze._$.range=[$[$.length-(Ie||1)].range[0],$[$.length-1].range[1]]),He=this.performAction.apply(ze,[K,Y,ee,ne.yy,ye[1],z,$].concat(Q)),typeof He<"u")return He;Ie&&(B=B.slice(0,-1*Ie*2),z=z.slice(0,-1*Ie),$=$.slice(0,-1*Ie)),B.push(this.productions_[ye[1]][0]),z.push(ze.$),$.push(ze._$),xe=U[B[B.length-2]][B[B.length-1]],B.push(xe);break;case 3:return!0}}return!0},"parse")},L=function(){var I={EOF:1,parseError:o(function(P,B){if(this.yy.parser)this.yy.parser.parseError(P,B);else throw new Error(P)},"parseError"),setInput:o(function(M,P){return this.yy=P||this.yy||{},this._input=M,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var M=this._input[0];this.yytext+=M,this.yyleng++,this.offset++,this.match+=M,this.matched+=M;var P=M.match(/(?:\r\n?|\n).*/g);return P?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),M},"input"),unput:o(function(M){var P=M.length,B=M.split(/(?:\r\n?|\n)/g);this._input=M+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-P),this.offset-=P;var F=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),B.length-1&&(this.yylineno-=B.length-1);var z=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:B?(B.length===F.length?this.yylloc.first_column:0)+F[F.length-B.length].length-B[0].length:this.yylloc.first_column-P},this.options.ranges&&(this.yylloc.range=[z[0],z[0]+this.yyleng-P]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(M){this.unput(this.match.slice(M))},"less"),pastInput:o(function(){var M=this.matched.substr(0,this.matched.length-this.match.length);return(M.length>20?"...":"")+M.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var M=this.match;return M.length<20&&(M+=this._input.substr(0,20-M.length)),(M.substr(0,20)+(M.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var M=this.pastInput(),P=new Array(M.length+1).join("-");return M+this.upcomingInput()+` -`+P+"^"},"showPosition"),test_match:o(function(M,P){var B,F,z;if(this.options.backtrack_lexer&&(z={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(z.yylloc.range=this.yylloc.range.slice(0))),F=M[0].match(/(?:\r\n?|\n).*/g),F&&(this.yylineno+=F.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:F?F[F.length-1].length-F[F.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+M[0].length},this.yytext+=M[0],this.match+=M[0],this.matches=M,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(M[0].length),this.matched+=M[0],B=this.performAction.call(this,this.yy,this,P,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),B)return B;if(this._backtrack){for(var $ in z)this[$]=z[$];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var M,P,B,F;this._more||(this.yytext="",this.match="");for(var z=this._currentRules(),$=0;$P[0].length)){if(P=B,F=$,this.options.backtrack_lexer){if(M=this.test_match(B,z[$]),M!==!1)return M;if(this._backtrack){P=!1;continue}else return!1}else if(!this.options.flex)break}return P?(M=this.test_match(P,z[F]),M!==!1?M:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var P=this.next();return P||this.lex()},"lex"),begin:o(function(P){this.conditionStack.push(P)},"begin"),popState:o(function(){var P=this.conditionStack.length-1;return P>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(P){return P=this.conditionStack.length-1-Math.abs(P||0),P>=0?this.conditionStack[P]:"INITIAL"},"topState"),pushState:o(function(P){this.begin(P)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(P,B,F,z){var $=z;switch(F){case 0:break;case 1:break;case 2:return this.popState(),34;break;case 3:return this.popState(),34;break;case 4:return 34;case 5:break;case 6:return 10;case 7:return this.pushState("acc_title"),19;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.pushState("acc_descr"),21;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.pushState("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";break;case 17:return this.pushState("axis_data"),"Y_AXIS";break;case 18:return this.pushState("axis_band_data"),24;break;case 19:return 31;case 20:return this.pushState("data"),16;break;case 21:return this.pushState("data"),18;break;case 22:return this.pushState("data_inner"),24;break;case 23:return 27;case 24:return this.popState(),26;break;case 25:this.popState();break;case 26:this.pushState("string");break;case 27:this.popState();break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 43:break;case 44:return 35;case 45:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}};return I}();k.lexer=L;function A(){this.yy={}}return o(A,"Parser"),A.prototype=k,k.Parser=A,new A}();tP.parser=tP;Hfe=tP});function rP(t){return t.type==="bar"}function BS(t){return t.type==="band"}function N1(t){return t.type==="linear"}var FS=N(()=>{"use strict";o(rP,"isBarPlot");o(BS,"isBandAxisData");o(N1,"isLinearAxisData")});var M1,nP=N(()=>{"use strict";ao();M1=class{constructor(e){this.parentGroup=e}static{o(this,"TextDimensionCalculatorWithFont")}getMaxDimension(e,r){if(!this.parentGroup)return{width:e.reduce((a,s)=>Math.max(s.length,a),0)*r,height:r};let n={width:0,height:0},i=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",r);for(let a of e){let s=wQ(i,1,a),l=s?s.width:a.length*r,u=s?s.height:r;n.width=Math.max(n.width,l),n.height=Math.max(n.height,u)}return i.remove(),n}}});var I1,iP=N(()=>{"use strict";I1=class{constructor(e,r,n,i){this.axisConfig=e;this.title=r;this.textDimensionCalculator=n;this.axisThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0};this.axisPosition="left";this.showTitle=!1;this.showLabel=!1;this.showTick=!1;this.showAxisLine=!1;this.outerPadding=0;this.titleTextHeight=0;this.labelTextHeight=0;this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{o(this,"BaseAxis")}setRange(e){this.range=e,this.axisPosition==="left"||this.axisPosition==="right"?this.boundingRect.height=e[1]-e[0]:this.boundingRect.width=e[1]-e[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(e){this.axisPosition=e,this.setRange(this.range)}getTickDistance(){let e=this.getRange();return Math.abs(e[0]-e[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(e=>e.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>this.outerPadding*2&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(e){let r=e.height;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.width;this.outerPadding=Math.min(n.width/2,i);let a=n.height+this.axisConfig.labelPadding*2;this.labelTextHeight=n.height,a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width,this.boundingRect.height=e.height-r}calculateSpaceIfDrawnVertical(e){let r=e.width;if(this.axisConfig.showAxisLine&&r>this.axisConfig.axisLineWidth&&(r-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){let n=this.getLabelDimension(),i=.2*e.height;this.outerPadding=Math.min(n.height/2,i);let a=n.width+this.axisConfig.labelPadding*2;a<=r&&(r-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&r>=this.axisConfig.tickLength&&(this.showTick=!0,r-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){let n=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),i=n.height+this.axisConfig.titlePadding*2;this.titleTextHeight=n.height,i<=r&&(r-=i,this.showTitle=!0)}this.boundingRect.width=e.width-r,this.boundingRect.height=e.height}calculateSpace(e){return this.axisPosition==="left"||this.axisPosition==="right"?this.calculateSpaceIfDrawnVertical(e):this.calculateSpaceIfDrawnHorizontally(e),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}getDrawableElementsForLeftAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${r},${this.boundingRect.y} L ${r},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(r),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){let r=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${r},${this.getScaleValue(n)} L ${r-this.axisConfig.tickLength},${this.getScaleValue(n)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForBottomAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);e.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r} L ${this.getScaleValue(n)},${r+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElementsForTopAxis(){let e=[];if(this.showAxisLine){let r=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;e.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${r} L ${this.boundingRect.x+this.boundingRect.width},${r}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&e.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(r=>({text:r.toString(),x:this.getScaleValue(r),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+this.axisConfig.titlePadding*2:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){let r=this.boundingRect.y;e.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(n=>({path:`M ${this.getScaleValue(n)},${r+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(n)},${r+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&e.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),e}getDrawableElements(){if(this.axisPosition==="left")return this.getDrawableElementsForLeftAxis();if(this.axisPosition==="right")throw Error("Drawing of right axis is not implemented");return this.axisPosition==="bottom"?this.getDrawableElementsForBottomAxis():this.axisPosition==="top"?this.getDrawableElementsForTopAxis():[]}}});var $S,qfe=N(()=>{"use strict";fr();yt();iP();$S=class extends I1{static{o(this,"BandAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.categories=n,this.scale=V0().domain(this.categories).range(this.getRange())}setRange(e){super.setRange(e)}recalculateScale(){this.scale=V0().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),X.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(e){return this.scale(e)??this.getRange()[0]}}});var zS,Yfe=N(()=>{"use strict";fr();iP();zS=class extends I1{static{o(this,"LinearAxis")}constructor(e,r,n,i,a){super(e,i,a,r),this.domain=n,this.scale=Tl().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){let e=[...this.domain];this.axisPosition==="left"&&e.reverse(),this.scale=Tl().domain(e).range(this.getRange())}getScaleValue(e){return this.scale(e)}}});function aP(t,e,r,n){let i=new M1(n);return BS(t)?new $S(e,r,t.categories,t.title,i):new zS(e,r,[t.min,t.max],t.title,i)}var Xfe=N(()=>{"use strict";FS();nP();qfe();Yfe();o(aP,"getAxis")});function jfe(t,e,r,n){let i=new M1(n);return new sP(i,t,e,r)}var sP,Kfe=N(()=>{"use strict";nP();sP=class{constructor(e,r,n,i){this.textDimensionCalculator=e;this.chartConfig=r;this.chartData=n;this.chartThemeConfig=i;this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{o(this,"ChartTitle")}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){let r=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),n=Math.max(r.width,e.width),i=r.height+2*this.chartConfig.titlePadding;return r.width<=n&&r.height<=i&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=n,this.boundingRect.height=i,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){let e=[];return this.showChartTitle&&e.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),e}};o(jfe,"getChartTitleComponent")});var GS,Qfe=N(()=>{"use strict";fr();GS=class{constructor(e,r,n,i,a){this.plotData=e;this.xAxis=r;this.yAxis=n;this.orientation=i;this.plotIndex=a}static{o(this,"LinePlot")}getDrawableElement(){let e=this.plotData.data.map(n=>[this.xAxis.getScaleValue(n[0]),this.yAxis.getScaleValue(n[1])]),r;return this.orientation==="horizontal"?r=Cl().y(n=>n[0]).x(n=>n[1])(e):r=Cl().x(n=>n[0]).y(n=>n[1])(e),r?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:r,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}}});var VS,Zfe=N(()=>{"use strict";VS=class{constructor(e,r,n,i,a,s){this.barData=e;this.boundingRect=r;this.xAxis=n;this.yAxis=i;this.orientation=a;this.plotIndex=s}static{o(this,"BarPlot")}getDrawableElement(){let e=this.barData.data.map(a=>[this.xAxis.getScaleValue(a[0]),this.yAxis.getScaleValue(a[1])]),n=Math.min(this.xAxis.getAxisOuterPadding()*2,this.xAxis.getTickDistance())*(1-.05),i=n/2;return this.orientation==="horizontal"?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:this.boundingRect.x,y:a[0]-i,height:n,width:a[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:e.map(a=>({x:a[0]-i,y:a[1],width:n,height:this.boundingRect.y+this.boundingRect.height-a[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}}});function Jfe(t,e,r){return new oP(t,e,r)}var oP,ede=N(()=>{"use strict";Qfe();Zfe();oP=class{constructor(e,r,n){this.chartConfig=e;this.chartData=r;this.chartThemeConfig=n;this.boundingRect={x:0,y:0,width:0,height:0}}static{o(this,"BasePlot")}setAxes(e,r){this.xAxis=e,this.yAxis=r}setBoundingBoxXY(e){this.boundingRect.x=e.x,this.boundingRect.y=e.y}calculateSpace(e){return this.boundingRect.width=e.width,this.boundingRect.height=e.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!(this.xAxis&&this.yAxis))throw Error("Axes must be passed to render Plots");let e=[];for(let[r,n]of this.chartData.plots.entries())switch(n.type){case"line":{let i=new GS(n,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break;case"bar":{let i=new VS(n,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,r);e.push(...i.getDrawableElement())}break}return e}};o(Jfe,"getPlotComponent")});var US,tde=N(()=>{"use strict";Xfe();Kfe();ede();FS();US=class{constructor(e,r,n,i){this.chartConfig=e;this.chartData=r;this.componentStore={title:jfe(e,r,n,i),plot:Jfe(e,r,n),xAxis:aP(r.xAxis,e.xAxis,{titleColor:n.xAxisTitleColor,labelColor:n.xAxisLabelColor,tickColor:n.xAxisTickColor,axisLineColor:n.xAxisLineColor},i),yAxis:aP(r.yAxis,e.yAxis,{titleColor:n.yAxisTitleColor,labelColor:n.yAxisLabelColor,tickColor:n.yAxisTickColor,axisLineColor:n.yAxisLineColor},i)}}static{o(this,"Orchestrator")}calculateVerticalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),s=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),l=this.componentStore.plot.calculateSpace({width:a,height:s});e-=l.width,r-=l.height,l=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),i=l.height,r-=l.height,this.componentStore.xAxis.setAxisPosition("bottom"),l=this.componentStore.xAxis.calculateSpace({width:e,height:r}),r-=l.height,this.componentStore.yAxis.setAxisPosition("left"),l=this.componentStore.yAxis.calculateSpace({width:e,height:r}),n=l.width,e-=l.width,e>0&&(a+=e,e=0),r>0&&(s+=r,r=0),this.componentStore.plot.calculateSpace({width:a,height:s}),this.componentStore.plot.setBoundingBoxXY({x:n,y:i}),this.componentStore.xAxis.setRange([n,n+a]),this.componentStore.xAxis.setBoundingBoxXY({x:n,y:i+s}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:i}),this.chartData.plots.some(u=>rP(u))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let e=this.chartConfig.width,r=this.chartConfig.height,n=0,i=0,a=0,s=Math.floor(e*this.chartConfig.plotReservedSpacePercent/100),l=Math.floor(r*this.chartConfig.plotReservedSpacePercent/100),u=this.componentStore.plot.calculateSpace({width:s,height:l});e-=u.width,r-=u.height,u=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:r}),n=u.height,r-=u.height,this.componentStore.xAxis.setAxisPosition("left"),u=this.componentStore.xAxis.calculateSpace({width:e,height:r}),e-=u.width,i=u.width,this.componentStore.yAxis.setAxisPosition("top"),u=this.componentStore.yAxis.calculateSpace({width:e,height:r}),r-=u.height,a=n+u.height,e>0&&(s+=e,e=0),r>0&&(l+=r,r=0),this.componentStore.plot.calculateSpace({width:s,height:l}),this.componentStore.plot.setBoundingBoxXY({x:i,y:a}),this.componentStore.yAxis.setRange([i,i+s]),this.componentStore.yAxis.setBoundingBoxXY({x:i,y:n}),this.componentStore.xAxis.setRange([a,a+l]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(h=>rP(h))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){this.chartConfig.chartOrientation==="horizontal"?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();let e=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(let r of Object.values(this.componentStore))e.push(...r.getDrawableElements());return e}}});var HS,rde=N(()=>{"use strict";tde();HS=class{static{o(this,"XYChartBuilder")}static build(e,r,n,i){return new US(e,r,n,i).getDrawableElement()}}});function ide(){let t=dh(),e=tr();return $n(t.xyChart,e.themeVariables.xyChart)}function ade(){let t=tr();return $n(or.xyChart,t.xyChart)}function sde(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function uP(t){let e=tr();return wr(t.trim(),e)}function dUe(t){nde=t}function pUe(t){t==="horizontal"?Rb.chartOrientation="horizontal":Rb.chartOrientation="vertical"}function mUe(t){cn.xAxis.title=uP(t.text)}function ode(t,e){cn.xAxis={type:"linear",title:cn.xAxis.title,min:t,max:e},WS=!0}function gUe(t){cn.xAxis={type:"band",title:cn.xAxis.title,categories:t.map(e=>uP(e.text))},WS=!0}function yUe(t){cn.yAxis.title=uP(t.text)}function vUe(t,e){cn.yAxis={type:"linear",title:cn.yAxis.title,min:t,max:e},cP=!0}function xUe(t){let e=Math.min(...t),r=Math.max(...t),n=N1(cn.yAxis)?cn.yAxis.min:1/0,i=N1(cn.yAxis)?cn.yAxis.max:-1/0;cn.yAxis={type:"linear",title:cn.yAxis.title,min:Math.min(n,e),max:Math.max(i,r)}}function lde(t){let e=[];if(t.length===0)return e;if(!WS){let r=N1(cn.xAxis)?cn.xAxis.min:1/0,n=N1(cn.xAxis)?cn.xAxis.max:-1/0;ode(Math.min(r,1),Math.max(n,t.length))}if(cP||xUe(t),BS(cn.xAxis)&&(e=cn.xAxis.categories.map((r,n)=>[r,t[n]])),N1(cn.xAxis)){let r=cn.xAxis.min,n=cn.xAxis.max,i=(n-r)/(t.length-1),a=[];for(let s=r;s<=n;s+=i)a.push(`${s}`);e=a.map((s,l)=>[s,t[l]])}return e}function cde(t){return lP[t===0?0:t%lP.length]}function bUe(t,e){let r=lde(e);cn.plots.push({type:"line",strokeFill:cde(Lb),strokeWidth:2,data:r}),Lb++}function TUe(t,e){let r=lde(e);cn.plots.push({type:"bar",fill:cde(Lb),data:r}),Lb++}function wUe(){if(cn.plots.length===0)throw Error("No Plot to render, please provide a plot with some data");return cn.title=Nr(),HS.build(Rb,cn,Nb,nde)}function kUe(){return Nb}function EUe(){return Rb}function SUe(){return cn}var Lb,nde,Rb,Nb,cn,lP,WS,cP,CUe,ude,hde=N(()=>{"use strict";mi();_a();By();er();pr();ci();rde();FS();Lb=0,Rb=ade(),Nb=ide(),cn=sde(),lP=Nb.plotColorPalette.split(",").map(t=>t.trim()),WS=!1,cP=!1;o(ide,"getChartDefaultThemeConfig");o(ade,"getChartDefaultConfig");o(sde,"getChartDefaultData");o(uP,"textSanitizer");o(dUe,"setTmpSVGG");o(pUe,"setOrientation");o(mUe,"setXAxisTitle");o(ode,"setXAxisRangeData");o(gUe,"setXAxisBand");o(yUe,"setYAxisTitle");o(vUe,"setYAxisRangeData");o(xUe,"setYAxisRangeFromPlotData");o(lde,"transformDataWithoutCategory");o(cde,"getPlotColorFromPalette");o(bUe,"setLineData");o(TUe,"setBarData");o(wUe,"getDrawableElem");o(kUe,"getChartThemeConfig");o(EUe,"getChartConfig");o(SUe,"getXYChartData");CUe=o(function(){kr(),Lb=0,Rb=ade(),cn=sde(),Nb=ide(),lP=Nb.plotColorPalette.split(",").map(t=>t.trim()),WS=!1,cP=!1},"clear"),ude={getDrawableElem:wUe,clear:CUe,setAccTitle:Ar,getAccTitle:Dr,setDiagramTitle:Or,getDiagramTitle:Nr,getAccDescription:Rr,setAccDescription:Lr,setOrientation:pUe,setXAxisTitle:mUe,setXAxisRangeData:ode,setXAxisBand:gUe,setYAxisTitle:yUe,setYAxisRangeData:vUe,setLineData:bUe,setBarData:TUe,setTmpSVGG:dUe,getChartThemeConfig:kUe,getChartConfig:EUe,getXYChartData:SUe}});var AUe,fde,dde=N(()=>{"use strict";yt();Vl();xi();AUe=o((t,e,r,n)=>{let i=n.db,a=i.getChartThemeConfig(),s=i.getChartConfig(),l=i.getXYChartData().plots[0].data.map(T=>T[1]);function u(T){return T==="top"?"text-before-edge":"middle"}o(u,"getDominantBaseLine");function h(T){return T==="left"?"start":T==="right"?"end":"middle"}o(h,"getTextAnchor");function f(T){return`translate(${T.x}, ${T.y}) rotate(${T.rotation||0})`}o(f,"getTextTransformation"),X.debug(`Rendering xychart chart -`+t);let d=Li(e),p=d.append("g").attr("class","main"),m=p.append("rect").attr("width",s.width).attr("height",s.height).attr("class","background");fn(d,s.height,s.width,!0),d.attr("viewBox",`0 0 ${s.width} ${s.height}`),m.attr("fill",a.backgroundColor),i.setTmpSVGG(d.append("g").attr("class","mermaid-tmp-group"));let g=i.getDrawableElem(),y={};function v(T){let S=p,w="";for(let[E]of T.entries()){let _=p;E>0&&y[w]&&(_=y[w]),w+=T[E],S=y[w],S||(S=y[w]=_.append("g").attr("class",T[E]))}return S}o(v,"getGroup");for(let T of g){if(T.data.length===0)continue;let S=v(T.groupTexts);switch(T.type){case"rect":if(S.selectAll("rect").data(T.data).enter().append("rect").attr("x",w=>w.x).attr("y",w=>w.y).attr("width",w=>w.width).attr("height",w=>w.height).attr("fill",w=>w.fill).attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth),s.showDataLabel)if(s.chartOrientation==="horizontal"){let _=function(O,R){let{data:k,label:L}=O;return R*L.length*.7<=k.width-10};var x=_;o(_,"fitsHorizontally");let w=.7,E=T.data.map((O,R)=>({data:O,label:l[R].toString()})).filter(O=>O.data.width>0&&O.data.height>0),C=E.map(O=>{let{data:R}=O,k=R.height*.7;for(;!_(O,k)&&k>0;)k-=1;return k}),D=Math.floor(Math.min(...C));S.selectAll("text").data(E).enter().append("text").attr("x",O=>O.data.x+O.data.width-10).attr("y",O=>O.data.y+O.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${D}px`).text(O=>O.label)}else{let _=function(O,R,k){let{data:L,label:A}=O,M=R*A.length*.7,P=L.x+L.width/2,B=P-M/2,F=P+M/2,z=B>=L.x&&F<=L.x+L.width,$=L.y+k+R<=L.y+L.height;return z&&$};var b=_;o(_,"fitsInBar");let w=10,E=T.data.map((O,R)=>({data:O,label:l[R].toString()})).filter(O=>O.data.width>0&&O.data.height>0),C=E.map(O=>{let{data:R,label:k}=O,L=R.width/(k.length*.7);for(;!_(O,L,10)&&L>0;)L-=1;return L}),D=Math.floor(Math.min(...C));S.selectAll("text").data(E).enter().append("text").attr("x",O=>O.data.x+O.data.width/2).attr("y",O=>O.data.y+10).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${D}px`).text(O=>O.label)}break;case"text":S.selectAll("text").data(T.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",w=>w.fill).attr("font-size",w=>w.fontSize).attr("dominant-baseline",w=>u(w.verticalPos)).attr("text-anchor",w=>h(w.horizontalPos)).attr("transform",w=>f(w)).text(w=>w.text);break;case"path":S.selectAll("path").data(T.data).enter().append("path").attr("d",w=>w.path).attr("fill",w=>w.fill?w.fill:"none").attr("stroke",w=>w.strokeFill).attr("stroke-width",w=>w.strokeWidth);break}}},"draw"),fde={draw:AUe}});var pde={};ur(pde,{diagram:()=>_Ue});var _Ue,mde=N(()=>{"use strict";Wfe();hde();dde();_Ue={parser:Hfe,db:ude,renderer:fde}});var hP,vde,xde=N(()=>{"use strict";hP=function(){var t=o(function(ie,oe,V,Te){for(V=V||{},Te=ie.length;Te--;V[ie[Te]]=oe);return V},"o"),e=[1,3],r=[1,4],n=[1,5],i=[1,6],a=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],s=[1,22],l=[2,7],u=[1,26],h=[1,27],f=[1,28],d=[1,29],p=[1,33],m=[1,34],g=[1,35],y=[1,36],v=[1,37],x=[1,38],b=[1,24],T=[1,31],S=[1,32],w=[1,30],E=[1,39],_=[1,40],C=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],D=[1,61],O=[89,90],R=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],k=[27,29],L=[1,70],A=[1,71],I=[1,72],M=[1,73],P=[1,74],B=[1,75],F=[1,76],z=[1,83],$=[1,80],U=[1,84],K=[1,85],ee=[1,86],Y=[1,87],ce=[1,88],Z=[1,89],ue=[1,90],Q=[1,91],j=[1,92],ne=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],te=[63,64],he=[1,101],le=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],J=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Se=[1,110],se=[1,106],ae=[1,107],Oe=[1,108],ye=[1,109],Be=[1,111],He=[1,116],ze=[1,117],Le=[1,114],Ie=[1,115],xe={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:o(function(oe,V,Te,W,pe,ve,Pe){var _e=ve.length-1;switch(pe){case 4:this.$=ve[_e].trim(),W.setAccTitle(this.$);break;case 5:case 6:this.$=ve[_e].trim(),W.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:W.setDirection("TB");break;case 18:W.setDirection("BT");break;case 19:W.setDirection("RL");break;case 20:W.setDirection("LR");break;case 21:W.addRequirement(ve[_e-3],ve[_e-4]);break;case 22:W.addRequirement(ve[_e-5],ve[_e-6]),W.setClass([ve[_e-5]],ve[_e-3]);break;case 23:W.setNewReqId(ve[_e-2]);break;case 24:W.setNewReqText(ve[_e-2]);break;case 25:W.setNewReqRisk(ve[_e-2]);break;case 26:W.setNewReqVerifyMethod(ve[_e-2]);break;case 29:this.$=W.RequirementType.REQUIREMENT;break;case 30:this.$=W.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=W.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=W.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=W.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=W.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=W.RiskLevel.LOW_RISK;break;case 36:this.$=W.RiskLevel.MED_RISK;break;case 37:this.$=W.RiskLevel.HIGH_RISK;break;case 38:this.$=W.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=W.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=W.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=W.VerifyType.VERIFY_TEST;break;case 42:W.addElement(ve[_e-3]);break;case 43:W.addElement(ve[_e-5]),W.setClass([ve[_e-5]],ve[_e-3]);break;case 44:W.setNewElementType(ve[_e-2]);break;case 45:W.setNewElementDocRef(ve[_e-2]);break;case 48:W.addRelationship(ve[_e-2],ve[_e],ve[_e-4]);break;case 49:W.addRelationship(ve[_e-2],ve[_e-4],ve[_e]);break;case 50:this.$=W.Relationships.CONTAINS;break;case 51:this.$=W.Relationships.COPIES;break;case 52:this.$=W.Relationships.DERIVES;break;case 53:this.$=W.Relationships.SATISFIES;break;case 54:this.$=W.Relationships.VERIFIES;break;case 55:this.$=W.Relationships.REFINES;break;case 56:this.$=W.Relationships.TRACES;break;case 57:this.$=ve[_e-2],W.defineClass(ve[_e-1],ve[_e]);break;case 58:W.setClass(ve[_e-1],ve[_e]);break;case 59:W.setClass([ve[_e-2]],ve[_e]);break;case 60:case 62:this.$=[ve[_e]];break;case 61:case 63:this.$=ve[_e-2].concat([ve[_e]]);break;case 64:this.$=ve[_e-2],W.setCssStyle(ve[_e-1],ve[_e]);break;case 65:this.$=[ve[_e]];break;case 66:ve[_e-2].push(ve[_e]),this.$=ve[_e-2];break;case 68:this.$=ve[_e-1]+ve[_e];break}},"anonymous"),table:[{3:1,4:2,6:e,9:r,11:n,13:i},{1:[3]},{3:8,4:2,5:[1,7],6:e,9:r,11:n,13:i},{5:[1,9]},{10:[1,10]},{12:[1,11]},t(a,[2,6]),{3:12,4:2,6:e,9:r,11:n,13:i},{1:[2,2]},{4:17,5:s,7:13,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},t(a,[2,4]),t(a,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:s,7:42,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:43,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:44,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:45,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:46,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:47,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:48,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:49,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{4:17,5:s,7:50,8:l,9:r,11:n,13:i,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:u,22:h,23:f,24:d,25:23,33:25,41:p,42:m,43:g,44:y,45:v,46:x,54:b,72:T,74:S,77:w,89:E,90:_},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},t(C,[2,17]),t(C,[2,18]),t(C,[2,19]),t(C,[2,20]),{30:60,33:62,75:D,89:E,90:_},{30:63,33:62,75:D,89:E,90:_},{30:64,33:62,75:D,89:E,90:_},t(O,[2,29]),t(O,[2,30]),t(O,[2,31]),t(O,[2,32]),t(O,[2,33]),t(O,[2,34]),t(R,[2,81]),t(R,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},t(k,[2,79]),t(k,[2,80]),{27:[1,67],29:[1,68]},t(k,[2,85]),t(k,[2,86]),{62:69,65:L,66:A,67:I,68:M,69:P,70:B,71:F},{62:77,65:L,66:A,67:I,68:M,69:P,70:B,71:F},{30:78,33:62,75:D,89:E,90:_},{73:79,75:z,76:$,78:81,79:82,80:U,81:K,82:ee,83:Y,84:ce,85:Z,86:ue,87:Q,88:j},t(ne,[2,60]),t(ne,[2,62]),{73:93,75:z,76:$,78:81,79:82,80:U,81:K,82:ee,83:Y,84:ce,85:Z,86:ue,87:Q,88:j},{30:94,33:62,75:D,76:$,89:E,90:_},{5:[1,95]},{30:96,33:62,75:D,89:E,90:_},{5:[1,97]},{30:98,33:62,75:D,89:E,90:_},{63:[1,99]},t(te,[2,50]),t(te,[2,51]),t(te,[2,52]),t(te,[2,53]),t(te,[2,54]),t(te,[2,55]),t(te,[2,56]),{64:[1,100]},t(C,[2,59],{76:$}),t(C,[2,64],{76:he}),{33:103,75:[1,102],89:E,90:_},t(le,[2,65],{79:104,75:z,80:U,81:K,82:ee,83:Y,84:ce,85:Z,86:ue,87:Q,88:j}),t(J,[2,67]),t(J,[2,69]),t(J,[2,70]),t(J,[2,71]),t(J,[2,72]),t(J,[2,73]),t(J,[2,74]),t(J,[2,75]),t(J,[2,76]),t(J,[2,77]),t(J,[2,78]),t(C,[2,57],{76:he}),t(C,[2,58],{76:$}),{5:Se,28:105,31:se,34:ae,36:Oe,38:ye,40:Be},{27:[1,112],76:$},{5:He,40:ze,56:113,57:Le,59:Ie},{27:[1,118],76:$},{33:119,89:E,90:_},{33:120,89:E,90:_},{75:z,78:121,79:82,80:U,81:K,82:ee,83:Y,84:ce,85:Z,86:ue,87:Q,88:j},t(ne,[2,61]),t(ne,[2,63]),t(J,[2,68]),t(C,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:Se,28:126,31:se,34:ae,36:Oe,38:ye,40:Be},t(C,[2,28]),{5:[1,127]},t(C,[2,42]),{32:[1,128]},{32:[1,129]},{5:He,40:ze,56:130,57:Le,59:Ie},t(C,[2,47]),{5:[1,131]},t(C,[2,48]),t(C,[2,49]),t(le,[2,66],{79:104,75:z,80:U,81:K,82:ee,83:Y,84:ce,85:Z,86:ue,87:Q,88:j}),{33:132,89:E,90:_},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},t(C,[2,27]),{5:Se,28:145,31:se,34:ae,36:Oe,38:ye,40:Be},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},t(C,[2,46]),{5:He,40:ze,56:152,57:Le,59:Ie},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},t(C,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},t(C,[2,43]),{5:Se,28:159,31:se,34:ae,36:Oe,38:ye,40:Be},{5:Se,28:160,31:se,34:ae,36:Oe,38:ye,40:Be},{5:Se,28:161,31:se,34:ae,36:Oe,38:ye,40:Be},{5:Se,28:162,31:se,34:ae,36:Oe,38:ye,40:Be},{5:He,40:ze,56:163,57:Le,59:Ie},{5:He,40:ze,56:164,57:Le,59:Ie},t(C,[2,23]),t(C,[2,24]),t(C,[2,25]),t(C,[2,26]),t(C,[2,44]),t(C,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:o(function(oe,V){if(V.recoverable)this.trace(oe);else{var Te=new Error(oe);throw Te.hash=V,Te}},"parseError"),parse:o(function(oe){var V=this,Te=[0],W=[],pe=[null],ve=[],Pe=this.table,_e="",be=0,Ve=0,De=0,qe=2,at=1,Rt=ve.slice.call(arguments,1),st=Object.create(this.lexer),Ue={yy:{}};for(var ct in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ct)&&(Ue.yy[ct]=this.yy[ct]);st.setInput(oe,Ue.yy),Ue.yy.lexer=st,Ue.yy.parser=this,typeof st.yylloc>"u"&&(st.yylloc={});var We=st.yylloc;ve.push(We);var ot=st.options&&st.options.ranges;typeof Ue.yy.parseError=="function"?this.parseError=Ue.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Yt(Ir){Te.length=Te.length-2*Ir,pe.length=pe.length-Ir,ve.length=ve.length-Ir}o(Yt,"popStack");function Tt(){var Ir;return Ir=W.pop()||st.lex()||at,typeof Ir!="number"&&(Ir instanceof Array&&(W=Ir,Ir=W.pop()),Ir=V.symbols_[Ir]||Ir),Ir}o(Tt,"lex");for(var Mt,bt,ut,St,ft,vt,nt={},pn,kt,On,tn;;){if(ut=Te[Te.length-1],this.defaultActions[ut]?St=this.defaultActions[ut]:((Mt===null||typeof Mt>"u")&&(Mt=Tt()),St=Pe[ut]&&Pe[ut][Mt]),typeof St>"u"||!St.length||!St[0]){var Mr="";tn=[];for(pn in Pe[ut])this.terminals_[pn]&&pn>qe&&tn.push("'"+this.terminals_[pn]+"'");st.showPosition?Mr="Parse error on line "+(be+1)+`: -`+st.showPosition()+` -Expecting `+tn.join(", ")+", got '"+(this.terminals_[Mt]||Mt)+"'":Mr="Parse error on line "+(be+1)+": Unexpected "+(Mt==at?"end of input":"'"+(this.terminals_[Mt]||Mt)+"'"),this.parseError(Mr,{text:st.match,token:this.terminals_[Mt]||Mt,line:st.yylineno,loc:We,expected:tn})}if(St[0]instanceof Array&&St.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ut+", token: "+Mt);switch(St[0]){case 1:Te.push(Mt),pe.push(st.yytext),ve.push(st.yylloc),Te.push(St[1]),Mt=null,bt?(Mt=bt,bt=null):(Ve=st.yyleng,_e=st.yytext,be=st.yylineno,We=st.yylloc,De>0&&De--);break;case 2:if(kt=this.productions_[St[1]][1],nt.$=pe[pe.length-kt],nt._$={first_line:ve[ve.length-(kt||1)].first_line,last_line:ve[ve.length-1].last_line,first_column:ve[ve.length-(kt||1)].first_column,last_column:ve[ve.length-1].last_column},ot&&(nt._$.range=[ve[ve.length-(kt||1)].range[0],ve[ve.length-1].range[1]]),vt=this.performAction.apply(nt,[_e,Ve,be,Ue.yy,St[1],pe,ve].concat(Rt)),typeof vt<"u")return vt;kt&&(Te=Te.slice(0,-1*kt*2),pe=pe.slice(0,-1*kt),ve=ve.slice(0,-1*kt)),Te.push(this.productions_[St[1]][0]),pe.push(nt.$),ve.push(nt._$),On=Pe[Te[Te.length-2]][Te[Te.length-1]],Te.push(On);break;case 3:return!0}}return!0},"parse")},q=function(){var ie={EOF:1,parseError:o(function(V,Te){if(this.yy.parser)this.yy.parser.parseError(V,Te);else throw new Error(V)},"parseError"),setInput:o(function(oe,V){return this.yy=V||this.yy||{},this._input=oe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var oe=this._input[0];this.yytext+=oe,this.yyleng++,this.offset++,this.match+=oe,this.matched+=oe;var V=oe.match(/(?:\r\n?|\n).*/g);return V?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),oe},"input"),unput:o(function(oe){var V=oe.length,Te=oe.split(/(?:\r\n?|\n)/g);this._input=oe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-V),this.offset-=V;var W=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),Te.length-1&&(this.yylineno-=Te.length-1);var pe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:Te?(Te.length===W.length?this.yylloc.first_column:0)+W[W.length-Te.length].length-Te[0].length:this.yylloc.first_column-V},this.options.ranges&&(this.yylloc.range=[pe[0],pe[0]+this.yyleng-V]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(oe){this.unput(this.match.slice(oe))},"less"),pastInput:o(function(){var oe=this.matched.substr(0,this.matched.length-this.match.length);return(oe.length>20?"...":"")+oe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var oe=this.match;return oe.length<20&&(oe+=this._input.substr(0,20-oe.length)),(oe.substr(0,20)+(oe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var oe=this.pastInput(),V=new Array(oe.length+1).join("-");return oe+this.upcomingInput()+` -`+V+"^"},"showPosition"),test_match:o(function(oe,V){var Te,W,pe;if(this.options.backtrack_lexer&&(pe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(pe.yylloc.range=this.yylloc.range.slice(0))),W=oe[0].match(/(?:\r\n?|\n).*/g),W&&(this.yylineno+=W.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:W?W[W.length-1].length-W[W.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+oe[0].length},this.yytext+=oe[0],this.match+=oe[0],this.matches=oe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(oe[0].length),this.matched+=oe[0],Te=this.performAction.call(this,this.yy,this,V,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),Te)return Te;if(this._backtrack){for(var ve in pe)this[ve]=pe[ve];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var oe,V,Te,W;this._more||(this.yytext="",this.match="");for(var pe=this._currentRules(),ve=0;veV[0].length)){if(V=Te,W=ve,this.options.backtrack_lexer){if(oe=this.test_match(Te,pe[ve]),oe!==!1)return oe;if(this._backtrack){V=!1;continue}else return!1}else if(!this.options.flex)break}return V?(oe=this.test_match(V,pe[W]),oe!==!1?oe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var V=this.next();return V||this.lex()},"lex"),begin:o(function(V){this.conditionStack.push(V)},"begin"),popState:o(function(){var V=this.conditionStack.length-1;return V>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(V){return V=this.conditionStack.length-1-Math.abs(V||0),V>=0?this.conditionStack[V]:"INITIAL"},"topState"),pushState:o(function(V){this.begin(V)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(V,Te,W,pe){var ve=pe;switch(W){case 0:return"title";case 1:return this.begin("acc_title"),9;break;case 2:return this.popState(),"acc_title_value";break;case 3:return this.begin("acc_descr"),11;break;case 4:return this.popState(),"acc_descr_value";break;case 5:this.begin("acc_descr_multiline");break;case 6:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:break;case 14:break;case 15:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;break;case 50:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 56:break;case 57:this.begin("string");break;case 58:this.popState();break;case 59:return this.begin("style"),72;break;case 60:return this.begin("style"),74;break;case 61:return 61;case 62:return 64;case 63:return 63;case 64:this.begin("string");break;case 65:this.popState();break;case 66:return"qString";case 67:return Te.yytext=Te.yytext.trim(),89;break;case 68:return 75;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}};return ie}();xe.lexer=q;function de(){this.yy={}}return o(de,"Parser"),de.prototype=xe,xe.Parser=de,new de}();hP.parser=hP;vde=hP});var qS,bde=N(()=>{"use strict";Gt();yt();ci();qS=class{constructor(){this.relations=[];this.latestRequirement=this.getInitialRequirement();this.requirements=new Map;this.latestElement=this.getInitialElement();this.elements=new Map;this.classes=new Map;this.direction="TB";this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"};this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"};this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"};this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"};this.setAccTitle=Ar;this.getAccTitle=Dr;this.setAccDescription=Lr;this.getAccDescription=Rr;this.setDiagramTitle=Or;this.getDiagramTitle=Nr;this.getConfig=o(()=>me().requirement,"getConfig");this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{o(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,r){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:r,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){this.latestRequirement!==void 0&&(this.latestRequirement.requirementId=e)}setNewReqText(e){this.latestRequirement!==void 0&&(this.latestRequirement.text=e)}setNewReqRisk(e){this.latestRequirement!==void 0&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){this.latestRequirement!==void 0&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),X.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){this.latestElement!==void 0&&(this.latestElement.type=e)}setNewElementDocRef(e){this.latestElement!==void 0&&(this.latestElement.docRef=e)}addRelationship(e,r,n){this.relations.push({type:e,src:r,dst:n})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,kr()}setCssStyle(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(!r||!i)return;for(let a of r)a.includes(",")?i.cssStyles.push(...a.split(",")):i.cssStyles.push(a)}}setClass(e,r){for(let n of e){let i=this.requirements.get(n)??this.elements.get(n);if(i)for(let a of r){i.classes.push(a);let s=this.classes.get(a)?.styles;s&&i.cssStyles.push(...s)}}}defineClass(e,r){for(let n of e){let i=this.classes.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.classes.set(n,i)),r&&r.forEach(function(a){if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.requirements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))}),this.elements.forEach(a=>{a.classes.includes(n)&&a.cssStyles.push(...r.flatMap(s=>s.split(",")))})}}getClasses(){return this.classes}getData(){let e=me(),r=[],n=[];for(let i of this.requirements.values()){let a=i;a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),a.shape="requirementBox",a.look=e.look,r.push(a)}for(let i of this.elements.values()){let a=i;a.shape="requirementBox",a.look=e.look,a.id=i.name,a.cssStyles=i.cssStyles,a.cssClasses=i.classes.join(" "),r.push(a)}for(let i of this.relations){let a=0,s=i.type===this.Relationships.CONTAINS,l={id:`${i.src}-${i.dst}-${a}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",s?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:s?"normal":"dashed",arrowTypeStart:s?"requirement_contains":"",arrowTypeEnd:s?"":"requirement_arrow",look:e.look};n.push(l),a++}return{nodes:r,edges:n,other:{},config:e,direction:this.getDirection()}}}});var NUe,Tde,wde=N(()=>{"use strict";NUe=o(t=>` - - marker { - fill: ${t.relationColor}; - stroke: ${t.relationColor}; - } - - marker.cross { - stroke: ${t.lineColor}; - } - - svg { - font-family: ${t.fontFamily}; - font-size: ${t.fontSize}; - } - - .reqBox { - fill: ${t.requirementBackground}; - fill-opacity: 1.0; - stroke: ${t.requirementBorderColor}; - stroke-width: ${t.requirementBorderSize}; - } - - .reqTitle, .reqLabel{ - fill: ${t.requirementTextColor}; - } - .reqLabelBox { - fill: ${t.relationLabelBackground}; - fill-opacity: 1.0; - } - - .req-title-line { - stroke: ${t.requirementBorderColor}; - stroke-width: ${t.requirementBorderSize}; - } - .relationshipLine { - stroke: ${t.relationColor}; - stroke-width: 1; - } - .relationshipLabel { - fill: ${t.relationLabelColor}; - } - .divider { - stroke: ${t.nodeBorder}; - stroke-width: 1; - } - .label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .label text,span { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - .labelBkg { - background-color: ${t.edgeLabelBackground}; - } - -`,"getStyles"),Tde=NUe});var fP={};ur(fP,{draw:()=>MUe});var MUe,kde=N(()=>{"use strict";Gt();yt();Sm();rp();np();er();MUe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing requirement diagram (unified)",e);let{securityLevel:i,state:a,layout:s}=me(),l=n.db.getData(),u=wc(e,i);l.type=n.type,l.layoutAlgorithm=uf(s),l.nodeSpacing=a?.nodeSpacing??50,l.rankSpacing=a?.rankSpacing??50,l.markers=["requirement_contains","requirement_arrow"],l.diagramId=e,await Rc(l,u);let h=8;Vt.insertTitle(u,"requirementDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Yo(u,h,"requirementDiagram",a?.useMaxWidth??!0)},"draw")});var Ede={};ur(Ede,{diagram:()=>IUe});var IUe,Sde=N(()=>{"use strict";xde();bde();wde();kde();IUe={parser:vde,get db(){return new qS},renderer:fP,styles:Tde}});var dP,_de,Dde=N(()=>{"use strict";dP=function(){var t=o(function(Q,j,ne,te){for(ne=ne||{},te=Q.length;te--;ne[Q[te]]=j);return ne},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,13],u=[1,14],h=[1,16],f=[1,17],d=[1,18],p=[1,24],m=[1,25],g=[1,26],y=[1,27],v=[1,28],x=[1,29],b=[1,30],T=[1,31],S=[1,32],w=[1,33],E=[1,34],_=[1,35],C=[1,36],D=[1,37],O=[1,38],R=[1,39],k=[1,41],L=[1,42],A=[1,43],I=[1,44],M=[1,45],P=[1,46],B=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],F=[4,5,16,50,52,53],z=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],U=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],K=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],ee=[68,69,70],Y=[1,122],ce={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:o(function(j,ne,te,he,le,J,Se){var se=J.length-1;switch(le){case 3:return he.apply(J[se]),J[se];break;case 4:case 9:this.$=[];break;case 5:case 10:J[se-1].push(J[se]),this.$=J[se-1];break;case 6:case 7:case 11:case 12:this.$=J[se];break;case 8:case 13:this.$=[];break;case 15:J[se].type="createParticipant",this.$=J[se];break;case 16:J[se-1].unshift({type:"boxStart",boxData:he.parseBoxData(J[se-2])}),J[se-1].push({type:"boxEnd",boxText:J[se-2]}),this.$=J[se-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(J[se-2]),sequenceIndexStep:Number(J[se-1]),sequenceVisible:!0,signalType:he.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(J[se-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:he.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:he.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:he.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:he.LINETYPE.ACTIVE_START,actor:J[se-1].actor};break;case 23:this.$={type:"activeEnd",signalType:he.LINETYPE.ACTIVE_END,actor:J[se-1].actor};break;case 29:he.setDiagramTitle(J[se].substring(6)),this.$=J[se].substring(6);break;case 30:he.setDiagramTitle(J[se].substring(7)),this.$=J[se].substring(7);break;case 31:this.$=J[se].trim(),he.setAccTitle(this.$);break;case 32:case 33:this.$=J[se].trim(),he.setAccDescription(this.$);break;case 34:J[se-1].unshift({type:"loopStart",loopText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.LOOP_START}),J[se-1].push({type:"loopEnd",loopText:J[se-2],signalType:he.LINETYPE.LOOP_END}),this.$=J[se-1];break;case 35:J[se-1].unshift({type:"rectStart",color:he.parseMessage(J[se-2]),signalType:he.LINETYPE.RECT_START}),J[se-1].push({type:"rectEnd",color:he.parseMessage(J[se-2]),signalType:he.LINETYPE.RECT_END}),this.$=J[se-1];break;case 36:J[se-1].unshift({type:"optStart",optText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.OPT_START}),J[se-1].push({type:"optEnd",optText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.OPT_END}),this.$=J[se-1];break;case 37:J[se-1].unshift({type:"altStart",altText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.ALT_START}),J[se-1].push({type:"altEnd",signalType:he.LINETYPE.ALT_END}),this.$=J[se-1];break;case 38:J[se-1].unshift({type:"parStart",parText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.PAR_START}),J[se-1].push({type:"parEnd",signalType:he.LINETYPE.PAR_END}),this.$=J[se-1];break;case 39:J[se-1].unshift({type:"parStart",parText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.PAR_OVER_START}),J[se-1].push({type:"parEnd",signalType:he.LINETYPE.PAR_END}),this.$=J[se-1];break;case 40:J[se-1].unshift({type:"criticalStart",criticalText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.CRITICAL_START}),J[se-1].push({type:"criticalEnd",signalType:he.LINETYPE.CRITICAL_END}),this.$=J[se-1];break;case 41:J[se-1].unshift({type:"breakStart",breakText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.BREAK_START}),J[se-1].push({type:"breakEnd",optText:he.parseMessage(J[se-2]),signalType:he.LINETYPE.BREAK_END}),this.$=J[se-1];break;case 43:this.$=J[se-3].concat([{type:"option",optionText:he.parseMessage(J[se-1]),signalType:he.LINETYPE.CRITICAL_OPTION},J[se]]);break;case 45:this.$=J[se-3].concat([{type:"and",parText:he.parseMessage(J[se-1]),signalType:he.LINETYPE.PAR_AND},J[se]]);break;case 47:this.$=J[se-3].concat([{type:"else",altText:he.parseMessage(J[se-1]),signalType:he.LINETYPE.ALT_ELSE},J[se]]);break;case 48:J[se-3].draw="participant",J[se-3].type="addParticipant",J[se-3].description=he.parseMessage(J[se-1]),this.$=J[se-3];break;case 49:J[se-1].draw="participant",J[se-1].type="addParticipant",this.$=J[se-1];break;case 50:J[se-3].draw="actor",J[se-3].type="addParticipant",J[se-3].description=he.parseMessage(J[se-1]),this.$=J[se-3];break;case 51:J[se-1].draw="actor",J[se-1].type="addParticipant",this.$=J[se-1];break;case 52:J[se-1].type="destroyParticipant",this.$=J[se-1];break;case 53:this.$=[J[se-1],{type:"addNote",placement:J[se-2],actor:J[se-1].actor,text:J[se]}];break;case 54:J[se-2]=[].concat(J[se-1],J[se-1]).slice(0,2),J[se-2][0]=J[se-2][0].actor,J[se-2][1]=J[se-2][1].actor,this.$=[J[se-1],{type:"addNote",placement:he.PLACEMENT.OVER,actor:J[se-2].slice(0,2),text:J[se]}];break;case 55:this.$=[J[se-1],{type:"addLinks",actor:J[se-1].actor,text:J[se]}];break;case 56:this.$=[J[se-1],{type:"addALink",actor:J[se-1].actor,text:J[se]}];break;case 57:this.$=[J[se-1],{type:"addProperties",actor:J[se-1].actor,text:J[se]}];break;case 58:this.$=[J[se-1],{type:"addDetails",actor:J[se-1].actor,text:J[se]}];break;case 61:this.$=[J[se-2],J[se]];break;case 62:this.$=J[se];break;case 63:this.$=he.PLACEMENT.LEFTOF;break;case 64:this.$=he.PLACEMENT.RIGHTOF;break;case 65:this.$=[J[se-4],J[se-1],{type:"addMessage",from:J[se-4].actor,to:J[se-1].actor,signalType:J[se-3],msg:J[se],activate:!0},{type:"activeStart",signalType:he.LINETYPE.ACTIVE_START,actor:J[se-1].actor}];break;case 66:this.$=[J[se-4],J[se-1],{type:"addMessage",from:J[se-4].actor,to:J[se-1].actor,signalType:J[se-3],msg:J[se]},{type:"activeEnd",signalType:he.LINETYPE.ACTIVE_END,actor:J[se-4].actor}];break;case 67:this.$=[J[se-3],J[se-1],{type:"addMessage",from:J[se-3].actor,to:J[se-1].actor,signalType:J[se-2],msg:J[se]}];break;case 68:this.$={type:"addParticipant",actor:J[se]};break;case 69:this.$=he.LINETYPE.SOLID_OPEN;break;case 70:this.$=he.LINETYPE.DOTTED_OPEN;break;case 71:this.$=he.LINETYPE.SOLID;break;case 72:this.$=he.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=he.LINETYPE.DOTTED;break;case 74:this.$=he.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=he.LINETYPE.SOLID_CROSS;break;case 76:this.$=he.LINETYPE.DOTTED_CROSS;break;case 77:this.$=he.LINETYPE.SOLID_POINT;break;case 78:this.$=he.LINETYPE.DOTTED_POINT;break;case 79:this.$=he.parseMessage(J[se].trim().substring(1));break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},t(B,[2,5]),{9:47,12:12,13:l,14:u,17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},t(B,[2,7]),t(B,[2,8]),t(B,[2,14]),{12:48,50:D,52:O,53:R},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:P},{22:55,70:P},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(B,[2,29]),t(B,[2,30]),{32:[1,61]},{34:[1,62]},t(B,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:P},{22:72,70:P},{22:73,70:P},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:P},{22:90,70:P},{22:91,70:P},{22:92,70:P},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(B,[2,6]),t(B,[2,15]),t(F,[2,9],{10:93}),t(B,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(B,[2,21]),{5:[1,97]},{5:[1,98]},t(B,[2,24]),t(B,[2,25]),t(B,[2,26]),t(B,[2,27]),t(B,[2,28]),t(B,[2,31]),t(B,[2,32]),t(z,i,{7:99}),t(z,i,{7:100}),t(z,i,{7:101}),t($,i,{40:102,7:103}),t(U,i,{42:104,7:105}),t(U,i,{7:105,42:106}),t(K,i,{45:107,7:108}),t(z,i,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:P},t(ee,[2,69]),t(ee,[2,70]),t(ee,[2,71]),t(ee,[2,72]),t(ee,[2,73]),t(ee,[2,74]),t(ee,[2,75]),t(ee,[2,76]),t(ee,[2,77]),t(ee,[2,78]),{22:118,70:P},{22:120,58:119,70:P},{70:[2,63]},{70:[2,64]},{56:121,81:Y},{56:123,81:Y},{56:124,81:Y},{56:125,81:Y},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:D,52:O,53:R},{5:[1,131]},t(B,[2,19]),t(B,[2,20]),t(B,[2,22]),t(B,[2,23]),{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,132],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,133],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,134],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{16:[1,135]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,46],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,49:[1,136],50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{16:[1,137]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,44],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,48:[1,138],50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{16:[1,139]},{16:[1,140]},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[2,42],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,47:[1,141],50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{4:a,5:s,8:8,9:10,12:12,13:l,14:u,16:[1,142],17:15,18:h,21:f,22:40,23:d,24:19,25:20,26:21,27:22,28:23,29:p,30:m,31:g,33:y,35:v,36:x,37:b,38:T,39:S,41:w,43:E,44:_,46:C,50:D,52:O,53:R,54:k,59:L,60:A,61:I,62:M,70:P},{15:[1,143]},t(B,[2,49]),{15:[1,144]},t(B,[2,51]),t(B,[2,52]),{22:145,70:P},{22:146,70:P},{56:147,81:Y},{56:148,81:Y},{56:149,81:Y},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(B,[2,16]),t(F,[2,10]),{12:151,50:D,52:O,53:R},t(F,[2,12]),t(F,[2,13]),t(B,[2,18]),t(B,[2,34]),t(B,[2,35]),t(B,[2,36]),t(B,[2,37]),{15:[1,152]},t(B,[2,38]),{15:[1,153]},t(B,[2,39]),t(B,[2,40]),{15:[1,154]},t(B,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:Y},{56:158,81:Y},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:P},t(F,[2,11]),t($,i,{7:103,40:160}),t(U,i,{7:105,42:161}),t(K,i,{7:108,45:162}),t(B,[2,48]),t(B,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:o(function(j,ne){if(ne.recoverable)this.trace(j);else{var te=new Error(j);throw te.hash=ne,te}},"parseError"),parse:o(function(j){var ne=this,te=[0],he=[],le=[null],J=[],Se=this.table,se="",ae=0,Oe=0,ye=0,Be=2,He=1,ze=J.slice.call(arguments,1),Le=Object.create(this.lexer),Ie={yy:{}};for(var xe in this.yy)Object.prototype.hasOwnProperty.call(this.yy,xe)&&(Ie.yy[xe]=this.yy[xe]);Le.setInput(j,Ie.yy),Ie.yy.lexer=Le,Ie.yy.parser=this,typeof Le.yylloc>"u"&&(Le.yylloc={});var q=Le.yylloc;J.push(q);var de=Le.options&&Le.options.ranges;typeof Ie.yy.parseError=="function"?this.parseError=Ie.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ie(Rt){te.length=te.length-2*Rt,le.length=le.length-Rt,J.length=J.length-Rt}o(ie,"popStack");function oe(){var Rt;return Rt=he.pop()||Le.lex()||He,typeof Rt!="number"&&(Rt instanceof Array&&(he=Rt,Rt=he.pop()),Rt=ne.symbols_[Rt]||Rt),Rt}o(oe,"lex");for(var V,Te,W,pe,ve,Pe,_e={},be,Ve,De,qe;;){if(W=te[te.length-1],this.defaultActions[W]?pe=this.defaultActions[W]:((V===null||typeof V>"u")&&(V=oe()),pe=Se[W]&&Se[W][V]),typeof pe>"u"||!pe.length||!pe[0]){var at="";qe=[];for(be in Se[W])this.terminals_[be]&&be>Be&&qe.push("'"+this.terminals_[be]+"'");Le.showPosition?at="Parse error on line "+(ae+1)+`: -`+Le.showPosition()+` -Expecting `+qe.join(", ")+", got '"+(this.terminals_[V]||V)+"'":at="Parse error on line "+(ae+1)+": Unexpected "+(V==He?"end of input":"'"+(this.terminals_[V]||V)+"'"),this.parseError(at,{text:Le.match,token:this.terminals_[V]||V,line:Le.yylineno,loc:q,expected:qe})}if(pe[0]instanceof Array&&pe.length>1)throw new Error("Parse Error: multiple actions possible at state: "+W+", token: "+V);switch(pe[0]){case 1:te.push(V),le.push(Le.yytext),J.push(Le.yylloc),te.push(pe[1]),V=null,Te?(V=Te,Te=null):(Oe=Le.yyleng,se=Le.yytext,ae=Le.yylineno,q=Le.yylloc,ye>0&&ye--);break;case 2:if(Ve=this.productions_[pe[1]][1],_e.$=le[le.length-Ve],_e._$={first_line:J[J.length-(Ve||1)].first_line,last_line:J[J.length-1].last_line,first_column:J[J.length-(Ve||1)].first_column,last_column:J[J.length-1].last_column},de&&(_e._$.range=[J[J.length-(Ve||1)].range[0],J[J.length-1].range[1]]),Pe=this.performAction.apply(_e,[se,Oe,ae,Ie.yy,pe[1],le,J].concat(ze)),typeof Pe<"u")return Pe;Ve&&(te=te.slice(0,-1*Ve*2),le=le.slice(0,-1*Ve),J=J.slice(0,-1*Ve)),te.push(this.productions_[pe[1]][0]),le.push(_e.$),J.push(_e._$),De=Se[te[te.length-2]][te[te.length-1]],te.push(De);break;case 3:return!0}}return!0},"parse")},Z=function(){var Q={EOF:1,parseError:o(function(ne,te){if(this.yy.parser)this.yy.parser.parseError(ne,te);else throw new Error(ne)},"parseError"),setInput:o(function(j,ne){return this.yy=ne||this.yy||{},this._input=j,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var j=this._input[0];this.yytext+=j,this.yyleng++,this.offset++,this.match+=j,this.matched+=j;var ne=j.match(/(?:\r\n?|\n).*/g);return ne?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),j},"input"),unput:o(function(j){var ne=j.length,te=j.split(/(?:\r\n?|\n)/g);this._input=j+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-ne),this.offset-=ne;var he=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),te.length-1&&(this.yylineno-=te.length-1);var le=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:te?(te.length===he.length?this.yylloc.first_column:0)+he[he.length-te.length].length-te[0].length:this.yylloc.first_column-ne},this.options.ranges&&(this.yylloc.range=[le[0],le[0]+this.yyleng-ne]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(j){this.unput(this.match.slice(j))},"less"),pastInput:o(function(){var j=this.matched.substr(0,this.matched.length-this.match.length);return(j.length>20?"...":"")+j.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var j=this.match;return j.length<20&&(j+=this._input.substr(0,20-j.length)),(j.substr(0,20)+(j.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var j=this.pastInput(),ne=new Array(j.length+1).join("-");return j+this.upcomingInput()+` -`+ne+"^"},"showPosition"),test_match:o(function(j,ne){var te,he,le;if(this.options.backtrack_lexer&&(le={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(le.yylloc.range=this.yylloc.range.slice(0))),he=j[0].match(/(?:\r\n?|\n).*/g),he&&(this.yylineno+=he.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:he?he[he.length-1].length-he[he.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+j[0].length},this.yytext+=j[0],this.match+=j[0],this.matches=j,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(j[0].length),this.matched+=j[0],te=this.performAction.call(this,this.yy,this,ne,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),te)return te;if(this._backtrack){for(var J in le)this[J]=le[J];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var j,ne,te,he;this._more||(this.yytext="",this.match="");for(var le=this._currentRules(),J=0;Jne[0].length)){if(ne=te,he=J,this.options.backtrack_lexer){if(j=this.test_match(te,le[J]),j!==!1)return j;if(this._backtrack){ne=!1;continue}else return!1}else if(!this.options.flex)break}return ne?(j=this.test_match(ne,le[he]),j!==!1?j:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var ne=this.next();return ne||this.lex()},"lex"),begin:o(function(ne){this.conditionStack.push(ne)},"begin"),popState:o(function(){var ne=this.conditionStack.length-1;return ne>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(ne){return ne=this.conditionStack.length-1-Math.abs(ne||0),ne>=0?this.conditionStack[ne]:"INITIAL"},"topState"),pushState:o(function(ne){this.begin(ne)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(ne,te,he,le){var J=le;switch(he){case 0:return 5;case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;break;case 8:return this.begin("ID"),50;break;case 9:return this.begin("ID"),52;break;case 10:return 13;case 11:return this.begin("ID"),53;break;case 12:return te.yytext=te.yytext.trim(),this.begin("ALIAS"),70;break;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;break;case 14:return this.popState(),this.popState(),5;break;case 15:return this.begin("LINE"),36;break;case 16:return this.begin("LINE"),37;break;case 17:return this.begin("LINE"),38;break;case 18:return this.begin("LINE"),39;break;case 19:return this.begin("LINE"),49;break;case 20:return this.begin("LINE"),41;break;case 21:return this.begin("LINE"),43;break;case 22:return this.begin("LINE"),48;break;case 23:return this.begin("LINE"),44;break;case 24:return this.begin("LINE"),47;break;case 25:return this.begin("LINE"),46;break;case 26:return this.popState(),15;break;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;break;case 37:return this.begin("ID"),23;break;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;break;case 41:return this.popState(),"acc_title_value";break;case 42:return this.begin("acc_descr"),33;break;case 43:return this.popState(),"acc_descr_value";break;case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 51:return 5;case 52:return te.yytext=te.yytext.trim(),70;break;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:return 81;case 64:return 81;case 65:return 68;case 66:return 69;case 67:return 5;case 68:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\<->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\<->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68],inclusive:!0}}};return Q}();ce.lexer=Z;function ue(){this.yy={}}return o(ue,"Parser"),ue.prototype=ce,ce.Parser=ue,new ue}();dP.parser=dP;_de=dP});var FUe,$Ue,zUe,YS,Lde=N(()=>{"use strict";Gt();yt();SS();pr();ci();FUe={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},$Ue={FILLED:0,OPEN:1},zUe={LEFTOF:0,RIGHTOF:1,OVER:2},YS=class{constructor(){this.state=new Tf(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}));this.setAccTitle=Ar;this.setAccDescription=Lr;this.setDiagramTitle=Or;this.getAccTitle=Dr;this.getAccDescription=Rr;this.getDiagramTitle=Nr;this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap(me().wrap),this.LINETYPE=FUe,this.ARROWTYPE=$Ue,this.PLACEMENT=zUe}static{o(this,"SequenceDB")}addBox(e){this.state.records.boxes.push({name:e.text,wrap:e.wrap??this.autoWrap(),fill:e.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(e,r,n,i){let a=this.state.records.currentBox,s=this.state.records.actors.get(e);if(s){if(this.state.records.currentBox&&s.box&&this.state.records.currentBox!==s.box)throw new Error(`A same participant should only be defined in one Box: ${s.name} can't be in '${s.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(a=s.box?s.box:this.state.records.currentBox,s.box=a,s&&r===s.name&&n==null)return}if(n?.text==null&&(n={text:r,type:i}),(i==null||n.text==null)&&(n={text:r,type:i}),this.state.records.actors.set(e,{box:a,name:r,description:n.text,wrap:n.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:i??"participant"}),this.state.records.prevActor){let l=this.state.records.actors.get(this.state.records.prevActor);l&&(l.nextActor=e)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(e),this.state.records.prevActor=e}activationCount(e){let r,n=0;if(!e)return 0;for(r=0;r>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},l}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:e,to:r,message:n?.text??"",wrap:n?.wrap??this.autoWrap(),type:i,activate:a}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(e=>e.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(e){return this.state.records.actors.get(e)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(e){this.state.records.wrapEnabled=e}extractWrap(e){if(e===void 0)return{};e=e.trim();let r=/^:?wrap:/.exec(e)!==null?!0:/^:?nowrap:/.exec(e)!==null?!1:void 0;return{cleanedText:(r===void 0?e:e.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:r}}autoWrap(){return this.state.records.wrapEnabled!==void 0?this.state.records.wrapEnabled:me().sequence?.wrap??!1}clear(){this.state.reset(),kr()}parseMessage(e){let r=e.trim(),{wrap:n,cleanedText:i}=this.extractWrap(r),a={text:i,wrap:n};return X.debug(`parseMessage: ${JSON.stringify(a)}`),a}parseBoxData(e){let r=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(e),n=r?.[1]?r[1].trim():"transparent",i=r?.[2]?r[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",n)||(n="transparent",i=e.trim());else{let l=new Option().style;l.color=n,l.color!==n&&(n="transparent",i=e.trim())}let{wrap:a,cleanedText:s}=this.extractWrap(i);return{text:s?wr(s,me()):void 0,color:n,wrap:a}}addNote(e,r,n){let i={actor:e,placement:r,message:n.text,wrap:n.wrap??this.autoWrap()},a=[].concat(e,e);this.state.records.notes.push(i),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:a[0],to:a[1],message:n.text,wrap:n.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:r})}addLinks(e,r){let n=this.getActor(e);try{let i=wr(r.text,me());i=i.replace(/=/g,"="),i=i.replace(/&/g,"&");let a=JSON.parse(i);this.insertLinks(n,a)}catch(i){X.error("error while parsing actor link text",i)}}addALink(e,r){let n=this.getActor(e);try{let i={},a=wr(r.text,me()),s=a.indexOf("@");a=a.replace(/=/g,"="),a=a.replace(/&/g,"&");let l=a.slice(0,s-1).trim(),u=a.slice(s+1).trim();i[l]=u,this.insertLinks(n,i)}catch(i){X.error("error while parsing actor link text",i)}}insertLinks(e,r){if(e.links==null)e.links=r;else for(let n in r)e.links[n]=r[n]}addProperties(e,r){let n=this.getActor(e);try{let i=wr(r.text,me()),a=JSON.parse(i);this.insertProperties(n,a)}catch(i){X.error("error while parsing actor properties text",i)}}insertProperties(e,r){if(e.properties==null)e.properties=r;else for(let n in r)e.properties[n]=r[n]}boxEnd(){this.state.records.currentBox=void 0}addDetails(e,r){let n=this.getActor(e),i=document.getElementById(r.text);try{let a=i.innerHTML,s=JSON.parse(a);s.properties&&this.insertProperties(n,s.properties),s.links&&this.insertLinks(n,s.links)}catch(a){X.error("error while parsing actor details text",a)}}getActorProperty(e,r){if(e?.properties!==void 0)return e.properties[r]}apply(e){if(Array.isArray(e))e.forEach(r=>{this.apply(r)});else switch(e.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:e.sequenceIndex,step:e.sequenceIndexStep,visible:e.sequenceVisible},wrap:!1,type:e.signalType});break;case"addParticipant":this.addActor(e.actor,e.actor,e.description,e.draw);break;case"createParticipant":if(this.state.records.actors.has(e.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=e.actor,this.addActor(e.actor,e.actor,e.description,e.draw),this.state.records.createdActors.set(e.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=e.actor,this.state.records.destroyedActors.set(e.actor,this.state.records.messages.length);break;case"activeStart":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"activeEnd":this.addSignal(e.actor,void 0,void 0,e.signalType);break;case"addNote":this.addNote(e.actor,e.placement,e.text);break;case"addLinks":this.addLinks(e.actor,e.text);break;case"addALink":this.addALink(e.actor,e.text);break;case"addProperties":this.addProperties(e.actor,e.text);break;case"addDetails":this.addDetails(e.actor,e.text);break;case"addMessage":if(this.state.records.lastCreated){if(e.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(e.to!==this.state.records.lastDestroyed&&e.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(e.from,e.to,e.msg,e.signalType,e.activate);break;case"boxStart":this.addBox(e.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,e.loopText,e.signalType);break;case"loopEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"rectStart":this.addSignal(void 0,void 0,e.color,e.signalType);break;case"rectEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"optStart":this.addSignal(void 0,void 0,e.optText,e.signalType);break;case"optEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"altStart":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"else":this.addSignal(void 0,void 0,e.altText,e.signalType);break;case"altEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"setAccTitle":Ar(e.text);break;case"parStart":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"and":this.addSignal(void 0,void 0,e.parText,e.signalType);break;case"parEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,e.criticalText,e.signalType);break;case"option":this.addSignal(void 0,void 0,e.optionText,e.signalType);break;case"criticalEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break;case"breakStart":this.addSignal(void 0,void 0,e.breakText,e.signalType);break;case"breakEnd":this.addSignal(void 0,void 0,void 0,e.signalType);break}}getConfig(){return me().sequence}}});var GUe,Rde,Nde=N(()=>{"use strict";GUe=o(t=>`.actor { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - } - - text.actor > tspan { - fill: ${t.actorTextColor}; - stroke: none; - } - - .actor-line { - stroke: ${t.actorLineColor}; - } - - .messageLine0 { - stroke-width: 1.5; - stroke-dasharray: none; - stroke: ${t.signalColor}; - } - - .messageLine1 { - stroke-width: 1.5; - stroke-dasharray: 2, 2; - stroke: ${t.signalColor}; - } - - #arrowhead path { - fill: ${t.signalColor}; - stroke: ${t.signalColor}; - } - - .sequenceNumber { - fill: ${t.sequenceNumberColor}; - } - - #sequencenumber { - fill: ${t.signalColor}; - } - - #crosshead path { - fill: ${t.signalColor}; - stroke: ${t.signalColor}; - } - - .messageText { - fill: ${t.signalTextColor}; - stroke: none; - } - - .labelBox { - stroke: ${t.labelBoxBorderColor}; - fill: ${t.labelBoxBkgColor}; - } - - .labelText, .labelText > tspan { - fill: ${t.labelTextColor}; - stroke: none; - } - - .loopText, .loopText > tspan { - fill: ${t.loopTextColor}; - stroke: none; - } - - .loopLine { - stroke-width: 2px; - stroke-dasharray: 2, 2; - stroke: ${t.labelBoxBorderColor}; - fill: ${t.labelBoxBorderColor}; - } - - .note { - //stroke: #decc93; - stroke: ${t.noteBorderColor}; - fill: ${t.noteBkgColor}; - } - - .noteText, .noteText > tspan { - fill: ${t.noteTextColor}; - stroke: none; - } - - .activation0 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .activation1 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .activation2 { - fill: ${t.activationBkgColor}; - stroke: ${t.activationBorderColor}; - } - - .actorPopupMenu { - position: absolute; - } - - .actorPopupMenuPanel { - position: absolute; - fill: ${t.actorBkg}; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4)); -} - .actor-man line { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - } - .actor-man circle, line { - stroke: ${t.actorBorder}; - fill: ${t.actorBkg}; - stroke-width: 2px; - } -`,"getStyles"),Rde=GUe});var pP,Sf,Ide,Ode,VUe,Mde,mP,UUe,HUe,Mb,Fp,Pde,Yc,gP,WUe,qUe,YUe,XUe,jUe,KUe,QUe,Bde,ZUe,JUe,eHe,tHe,rHe,nHe,iHe,Fde,aHe,yP,sHe,di,$de=N(()=>{"use strict";pr();t2();er();pP=Aa(Z0(),1);mi();Sf=18*2,Ide="actor-top",Ode="actor-bottom",VUe="actor-box",Mde="actor-man",mP=o(function(t,e){return Nd(t,e)},"drawRect"),UUe=o(function(t,e,r,n,i){if(e.links===void 0||e.links===null||Object.keys(e.links).length===0)return{height:0,width:0};let a=e.links,s=e.actorCnt,l=e.rectData;var u="none";i&&(u="block !important");let h=t.append("g");h.attr("id","actor"+s+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",u);var f="";l.class!==void 0&&(f=" "+l.class);let d=l.width>r?l.width:r,p=h.append("rect");if(p.attr("class","actorPopupMenuPanel"+f),p.attr("x",l.x),p.attr("y",l.height),p.attr("fill",l.fill),p.attr("stroke",l.stroke),p.attr("width",d),p.attr("height",l.height),p.attr("rx",l.rx),p.attr("ry",l.ry),a!=null){var m=20;for(let v in a){var g=h.append("a"),y=(0,pP.sanitizeUrl)(a[v]);g.attr("xlink:href",y),g.attr("target","_blank"),sHe(n)(v,g,l.x+10,l.height+m,d,20,{class:"actor"},n),m+=30}}return p.attr("height",m),{height:l.height+m,width:d}},"drawPopup"),HUe=o(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),Mb=o(async function(t,e,r=null){let n=t.append("foreignObject"),i=await Th(e.text,tr()),s=n.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(i).node().getBoundingClientRect();if(n.attr("height",Math.round(s.height)).attr("width",Math.round(s.width)),e.class==="noteText"){let l=t.node().firstChild;l.setAttribute("height",s.height+2*e.textMargin);let u=l.getBBox();n.attr("x",Math.round(u.x+u.width/2-s.width/2)).attr("y",Math.round(u.y+u.height/2-s.height/2))}else if(r){let{startx:l,stopx:u,starty:h}=r;if(l>u){let f=l;l=u,u=f}n.attr("x",Math.round(l+Math.abs(l-u)/2-s.width/2)),e.class==="loopText"?n.attr("y",Math.round(h)):n.attr("y",Math.round(h-s.height))}return[n]},"drawKatex"),Fp=o(function(t,e){let r=0,n=0,i=e.text.split(Ze.lineBreakRegex),[a,s]=zo(e.fontSize),l=[],u=0,h=o(()=>e.y,"yfunc");if(e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0)switch(e.valign){case"top":case"start":h=o(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":h=o(()=>Math.round(e.y+(r+n+e.textMargin)/2),"yfunc");break;case"bottom":case"end":h=o(()=>Math.round(e.y+(r+n+2*e.textMargin)-e.textMargin),"yfunc");break}if(e.anchor!==void 0&&e.textMargin!==void 0&&e.width!==void 0)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle";break}for(let[f,d]of i.entries()){e.textMargin!==void 0&&e.textMargin===0&&a!==void 0&&(u=f*a);let p=t.append("text");p.attr("x",e.x),p.attr("y",h()),e.anchor!==void 0&&p.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),e.fontFamily!==void 0&&p.style("font-family",e.fontFamily),s!==void 0&&p.style("font-size",s),e.fontWeight!==void 0&&p.style("font-weight",e.fontWeight),e.fill!==void 0&&p.attr("fill",e.fill),e.class!==void 0&&p.attr("class",e.class),e.dy!==void 0?p.attr("dy",e.dy):u!==0&&p.attr("dy",u);let m=d||C9;if(e.tspan){let g=p.append("tspan");g.attr("x",e.x),e.fill!==void 0&&g.attr("fill",e.fill),g.text(m)}else p.text(m);e.valign!==void 0&&e.textMargin!==void 0&&e.textMargin>0&&(n+=(p._groups||p)[0][0].getBBox().height,r=n),l.push(p)}return l},"drawText"),Pde=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");return n.attr("points",r(e.x,e.y,e.width,e.height,7)),n.attr("class","labelBox"),e.y=e.y+e.height/2,Fp(t,e),n},"drawLabel"),Yc=-1,gP=o((t,e,r,n)=>{t.select&&r.forEach(i=>{let a=e.get(i),s=t.select("#actor"+a.actorCnt);!n.mirrorActors&&a.stopy?s.attr("y2",a.stopy+a.height/2):n.mirrorActors&&s.attr("y2",a.stopy)})},"fixLifeLineHeights"),WUe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+e.height,l=t.append("g").lower();var u=l;n||(Yc++,Object.keys(e.links||{}).length&&!r.forceMenus&&u.attr("onclick",HUe(`actor${Yc}_popup`)).attr("cursor","pointer"),u.append("line").attr("id","actor"+Yc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),u=l.append("g"),e.actorCnt=Yc,e.links!=null&&u.attr("id","root-"+Yc));let h=Al();var f="actor";e.properties?.class?f=e.properties.class:h.fill="#eaeaea",n?f+=` ${Ode}`:f+=` ${Ide}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=f,h.rx=3,h.ry=3,h.name=e.name;let d=mP(u,h);if(e.rectData=h,e.properties?.icon){let m=e.properties.icon.trim();m.charAt(0)==="@"?KY(u,h.x+h.width-20,h.y+10,m.substr(1)):jY(u,h.x+h.width-20,h.y+10,m)}yP(r,yi(e.description))(e.description,u,h.x,h.y,h.width,h.height,{class:`actor ${VUe}`},r);let p=e.height;if(d.node){let m=d.node().getBBox();e.height=m.height,p=m.height}return p},"drawActorTypeParticipant"),qUe=o(function(t,e,r,n){let i=n?e.stopy:e.starty,a=e.x+e.width/2,s=i+80,l=t.append("g").lower();n||(Yc++,l.append("line").attr("id","actor"+Yc).attr("x1",a).attr("y1",s).attr("x2",a).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=Yc);let u=t.append("g"),h=Mde;n?h+=` ${Ode}`:h+=` ${Ide}`,u.attr("class",h),u.attr("name",e.name);let f=Al();f.x=e.x,f.y=i,f.fill="#eaeaea",f.width=e.width,f.height=e.height,f.class="actor",f.rx=3,f.ry=3,u.append("line").attr("id","actor-man-torso"+Yc).attr("x1",a).attr("y1",i+25).attr("x2",a).attr("y2",i+45),u.append("line").attr("id","actor-man-arms"+Yc).attr("x1",a-Sf/2).attr("y1",i+33).attr("x2",a+Sf/2).attr("y2",i+33),u.append("line").attr("x1",a-Sf/2).attr("y1",i+60).attr("x2",a).attr("y2",i+45),u.append("line").attr("x1",a).attr("y1",i+45).attr("x2",a+Sf/2-2).attr("y2",i+60);let d=u.append("circle");d.attr("cx",e.x+e.width/2),d.attr("cy",i+10),d.attr("r",15),d.attr("width",e.width),d.attr("height",e.height);let p=u.node().getBBox();return e.height=p.height,yP(r,yi(e.description))(e.description,u,f.x,f.y+35,f.width,f.height,{class:`actor ${Mde}`},r),e.height},"drawActorTypeActor"),YUe=o(async function(t,e,r,n){switch(e.type){case"actor":return await qUe(t,e,r,n);case"participant":return await WUe(t,e,r,n)}},"drawActor"),XUe=o(function(t,e,r){let i=t.append("g");Bde(i,e),e.name&&yP(r)(e.name,i,e.x,e.y+r.boxTextMargin+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},r),i.lower()},"drawBox"),jUe=o(function(t){return t.append("g")},"anchorElement"),KUe=o(function(t,e,r,n,i){let a=Al(),s=e.anchored;a.x=e.startx,a.y=e.starty,a.class="activation"+i%3,a.width=e.stopx-e.startx,a.height=r-e.starty,mP(s,a)},"drawActivation"),QUe=o(async function(t,e,r,n){let{boxMargin:i,boxTextMargin:a,labelBoxHeight:s,labelBoxWidth:l,messageFontFamily:u,messageFontSize:h,messageFontWeight:f}=n,d=t.append("g"),p=o(function(y,v,x,b){return d.append("line").attr("x1",y).attr("y1",v).attr("x2",x).attr("y2",b).attr("class","loopLine")},"drawLoopLine");p(e.startx,e.starty,e.stopx,e.starty),p(e.stopx,e.starty,e.stopx,e.stopy),p(e.startx,e.stopy,e.stopx,e.stopy),p(e.startx,e.starty,e.startx,e.stopy),e.sections!==void 0&&e.sections.forEach(function(y){p(e.startx,y.y,e.stopx,y.y).style("stroke-dasharray","3, 3")});let m=e2();m.text=r,m.x=e.startx,m.y=e.starty,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.anchor="middle",m.valign="middle",m.tspan=!1,m.width=l||50,m.height=s||20,m.textMargin=a,m.class="labelText",Pde(d,m),m=Fde(),m.text=e.title,m.x=e.startx+l/2+(e.stopx-e.startx)/2,m.y=e.starty+i+a,m.anchor="middle",m.valign="middle",m.textMargin=a,m.class="loopText",m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=!0;let g=yi(m.text)?await Mb(d,m,e):Fp(d,m);if(e.sectionTitles!==void 0){for(let[y,v]of Object.entries(e.sectionTitles))if(v.message){m.text=v.message,m.x=e.startx+(e.stopx-e.startx)/2,m.y=e.sections[y].y+i+a,m.class="loopText",m.anchor="middle",m.valign="middle",m.tspan=!1,m.fontFamily=u,m.fontSize=h,m.fontWeight=f,m.wrap=e.wrap,yi(m.text)?(e.starty=e.sections[y].y,await Mb(d,m,e)):Fp(d,m);let x=Math.round(g.map(b=>(b._groups||b)[0][0].getBBox().height).reduce((b,T)=>b+T));e.sections[y].height+=x-(i+a)}}return e.height=Math.round(e.stopy-e.starty),d},"drawLoop"),Bde=o(function(t,e){iT(t,e)},"drawBackgroundRect"),ZUe=o(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),JUe=o(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),eHe=o(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),tHe=o(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),rHe=o(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),nHe=o(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),iHe=o(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),Fde=o(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),aHe=o(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),yP=function(){function t(a,s,l,u,h,f,d){let p=s.append("text").attr("x",l+h/2).attr("y",u+f/2+5).style("text-anchor","middle").text(a);i(p,d)}o(t,"byText");function e(a,s,l,u,h,f,d,p){let{actorFontSize:m,actorFontFamily:g,actorFontWeight:y}=p,[v,x]=zo(m),b=a.split(Ze.lineBreakRegex);for(let T=0;T{let s=$p(Ne),l=a.actorKeys.reduce((f,d)=>f+=t.get(d).width+(t.get(d).margin||0),0);l-=2*Ne.boxTextMargin,a.wrap&&(a.name=Vt.wrapLabel(a.name,l-2*Ne.wrapPadding,s));let u=Vt.calculateTextDimensions(a.name,s);i=Ze.getMax(u.height,i);let h=Ze.getMax(l,u.width+2*Ne.wrapPadding);if(a.margin=Ne.boxTextMargin,la.textMaxHeight=i),Ze.getMax(n,Ne.height)}var Ne,rt,oHe,$p,O1,vP,cHe,uHe,xP,Gde,Vde,XS,zde,fHe,pHe,gHe,yHe,vHe,Ude,Hde=N(()=>{"use strict";fr();$de();yt();pr();pr();t2();Gt();g0();er();xi();Ne={},rt={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:o(function(){return Math.max.apply(null,this.actors.length===0?[0]:this.actors.map(t=>t.height||0))+(this.loops.length===0?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.messages.length===0?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(this.notes.length===0?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:o(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:o(function(t){this.boxes.push(t)},"addBox"),addActor:o(function(t){this.actors.push(t)},"addActor"),addLoop:o(function(t){this.loops.push(t)},"addLoop"),addMessage:o(function(t){this.messages.push(t)},"addMessage"),addNote:o(function(t){this.notes.push(t)},"addNote"),lastActor:o(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:o(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:o(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:o(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:o(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,Vde(me())},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=this,a=0;function s(l){return o(function(h){a++;let f=i.sequenceItems.length-a+1;i.updateVal(h,"starty",e-f*Ne.boxMargin,Math.min),i.updateVal(h,"stopy",n+f*Ne.boxMargin,Math.max),i.updateVal(rt.data,"startx",t-f*Ne.boxMargin,Math.min),i.updateVal(rt.data,"stopx",r+f*Ne.boxMargin,Math.max),l!=="activation"&&(i.updateVal(h,"startx",t-f*Ne.boxMargin,Math.min),i.updateVal(h,"stopx",r+f*Ne.boxMargin,Math.max),i.updateVal(rt.data,"starty",e-f*Ne.boxMargin,Math.min),i.updateVal(rt.data,"stopy",n+f*Ne.boxMargin,Math.max))},"updateItemBounds")}o(s,"updateFn"),this.sequenceItems.forEach(s()),this.activations.forEach(s("activation"))},"updateBounds"),insert:o(function(t,e,r,n){let i=Ze.getMin(t,r),a=Ze.getMax(t,r),s=Ze.getMin(e,n),l=Ze.getMax(e,n);this.updateVal(rt.data,"startx",i,Math.min),this.updateVal(rt.data,"starty",s,Math.min),this.updateVal(rt.data,"stopx",a,Math.max),this.updateVal(rt.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),newActivation:o(function(t,e,r){let n=r.get(t.from),i=XS(t.from).length||0,a=n.x+n.width/2+(i-1)*Ne.activationWidth/2;this.activations.push({startx:a,starty:this.verticalPos+2,stopx:a+Ne.activationWidth,stopy:void 0,actor:t.from,anchored:di.anchorElement(e)})},"newActivation"),endActivation:o(function(t){let e=this.activations.map(function(r){return r.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:o(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:o(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:o(function(){return this.sequenceItems.length?this.sequenceItems[this.sequenceItems.length-1].overlap:!1},"isLoopOverlap"),addSectionToLoop:o(function(t){let e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:rt.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:o(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:o(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=Ze.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return{bounds:this.data,models:this.models}},"getBounds")},oHe=o(async function(t,e){rt.bumpVerticalPos(Ne.boxMargin),e.height=Ne.boxMargin,e.starty=rt.getVerticalPos();let r=Al();r.x=e.startx,r.y=e.starty,r.width=e.width||Ne.width,r.class="note";let n=t.append("g"),i=di.drawRect(n,r),a=e2();a.x=e.startx,a.y=e.starty,a.width=r.width,a.dy="1em",a.text=e.message,a.class="noteText",a.fontFamily=Ne.noteFontFamily,a.fontSize=Ne.noteFontSize,a.fontWeight=Ne.noteFontWeight,a.anchor=Ne.noteAlign,a.textMargin=Ne.noteMargin,a.valign="center";let s=yi(a.text)?await Mb(n,a):Fp(n,a),l=Math.round(s.map(u=>(u._groups||u)[0][0].getBBox().height).reduce((u,h)=>u+h));i.attr("height",l+2*Ne.noteMargin),e.height+=l+2*Ne.noteMargin,rt.bumpVerticalPos(l+2*Ne.noteMargin),e.stopy=e.starty+l+2*Ne.noteMargin,e.stopx=e.startx+r.width,rt.insert(e.startx,e.starty,e.stopx,e.stopy),rt.models.addNote(e)},"drawNote"),$p=o(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),O1=o(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),vP=o(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");o(lHe,"boundMessage");cHe=o(async function(t,e,r,n){let{startx:i,stopx:a,starty:s,message:l,type:u,sequenceIndex:h,sequenceVisible:f}=e,d=Vt.calculateTextDimensions(l,$p(Ne)),p=e2();p.x=i,p.y=s+10,p.width=a-i,p.class="messageText",p.dy="1em",p.text=l,p.fontFamily=Ne.messageFontFamily,p.fontSize=Ne.messageFontSize,p.fontWeight=Ne.messageFontWeight,p.anchor=Ne.messageAlign,p.valign="center",p.textMargin=Ne.wrapPadding,p.tspan=!1,yi(p.text)?await Mb(t,p,{startx:i,stopx:a,starty:r}):Fp(t,p);let m=d.width,g;i===a?Ne.rightAngles?g=t.append("path").attr("d",`M ${i},${r} H ${i+Ze.getMax(Ne.width/2,m/2)} V ${r+25} H ${i}`):g=t.append("path").attr("d","M "+i+","+r+" C "+(i+60)+","+(r-10)+" "+(i+60)+","+(r+30)+" "+i+","+(r+20)):(g=t.append("line"),g.attr("x1",i),g.attr("y1",r),g.attr("x2",a),g.attr("y2",r)),u===n.db.LINETYPE.DOTTED||u===n.db.LINETYPE.DOTTED_CROSS||u===n.db.LINETYPE.DOTTED_POINT||u===n.db.LINETYPE.DOTTED_OPEN||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED?(g.style("stroke-dasharray","3, 3"),g.attr("class","messageLine1")):g.attr("class","messageLine0");let y="";Ne.arrowMarkerAbsolute&&(y=mu(!0)),g.attr("stroke-width",2),g.attr("stroke","none"),g.style("fill","none"),(u===n.db.LINETYPE.SOLID||u===n.db.LINETYPE.DOTTED)&&g.attr("marker-end","url("+y+"#arrowhead)"),(u===n.db.LINETYPE.BIDIRECTIONAL_SOLID||u===n.db.LINETYPE.BIDIRECTIONAL_DOTTED)&&(g.attr("marker-start","url("+y+"#arrowhead)"),g.attr("marker-end","url("+y+"#arrowhead)")),(u===n.db.LINETYPE.SOLID_POINT||u===n.db.LINETYPE.DOTTED_POINT)&&g.attr("marker-end","url("+y+"#filled-head)"),(u===n.db.LINETYPE.SOLID_CROSS||u===n.db.LINETYPE.DOTTED_CROSS)&&g.attr("marker-end","url("+y+"#crosshead)"),(f||Ne.showSequenceNumbers)&&(g.attr("marker-start","url("+y+"#sequencenumber)"),t.append("text").attr("x",i).attr("y",r+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(h))},"drawMessage"),uHe=o(function(t,e,r,n,i,a,s){let l=0,u=0,h,f=0;for(let d of n){let p=e.get(d),m=p.box;h&&h!=m&&(s||rt.models.addBox(h),u+=Ne.boxMargin+h.margin),m&&m!=h&&(s||(m.x=l+u,m.y=i),u+=m.margin),p.width=p.width||Ne.width,p.height=Ze.getMax(p.height||Ne.height,Ne.height),p.margin=p.margin||Ne.actorMargin,f=Ze.getMax(f,p.height),r.get(p.name)&&(u+=p.width/2),p.x=l+u,p.starty=rt.getVerticalPos(),rt.insert(p.x,i,p.x+p.width,p.height),l+=p.width+u,p.box&&(p.box.width=l+m.margin-p.box.x),u=p.margin,h=p.box,rt.models.addActor(p)}h&&!s&&rt.models.addBox(h),rt.bumpVerticalPos(f)},"addActorRenderingData"),xP=o(async function(t,e,r,n){if(n){let i=0;rt.bumpVerticalPos(Ne.boxMargin*2);for(let a of r){let s=e.get(a);s.stopy||(s.stopy=rt.getVerticalPos());let l=await di.drawActor(t,s,Ne,!0);i=Ze.getMax(i,l)}rt.bumpVerticalPos(i+Ne.boxMargin)}else for(let i of r){let a=e.get(i);await di.drawActor(t,a,Ne,!1)}},"drawActors"),Gde=o(function(t,e,r,n){let i=0,a=0;for(let s of r){let l=e.get(s),u=pHe(l),h=di.drawPopup(t,l,u,Ne,Ne.forceMenus,n);h.height>i&&(i=h.height),h.width+l.x>a&&(a=h.width+l.x)}return{maxHeight:i,maxWidth:a}},"drawActorsPopup"),Vde=o(function(t){Un(Ne,t),t.fontFamily&&(Ne.actorFontFamily=Ne.noteFontFamily=Ne.messageFontFamily=t.fontFamily),t.fontSize&&(Ne.actorFontSize=Ne.noteFontSize=Ne.messageFontSize=t.fontSize),t.fontWeight&&(Ne.actorFontWeight=Ne.noteFontWeight=Ne.messageFontWeight=t.fontWeight)},"setConf"),XS=o(function(t){return rt.activations.filter(function(e){return e.actor===t})},"actorActivations"),zde=o(function(t,e){let r=e.get(t),n=XS(t),i=n.reduce(function(s,l){return Ze.getMin(s,l.startx)},r.x+r.width/2-1),a=n.reduce(function(s,l){return Ze.getMax(s,l.stopx)},r.x+r.width/2+1);return[i,a]},"activationBounds");o(Xc,"adjustLoopHeightForWrap");o(hHe,"adjustCreatedDestroyedData");fHe=o(async function(t,e,r,n){let{securityLevel:i,sequence:a}=me();Ne=a;let s;i==="sandbox"&&(s=Ge("#i"+e));let l=i==="sandbox"?Ge(s.nodes()[0].contentDocument.body):Ge("body"),u=i==="sandbox"?s.nodes()[0].contentDocument:document;rt.init(),X.debug(n.db);let h=i==="sandbox"?l.select(`[id="${e}"]`):Ge(`[id="${e}"]`),f=n.db.getActors(),d=n.db.getCreatedActors(),p=n.db.getDestroyedActors(),m=n.db.getBoxes(),g=n.db.getActorKeys(),y=n.db.getMessages(),v=n.db.getDiagramTitle(),x=n.db.hasAtLeastOneBox(),b=n.db.hasAtLeastOneBoxWithTitle(),T=await dHe(f,y,n);if(Ne.height=await mHe(f,T,m),di.insertComputerIcon(h),di.insertDatabaseIcon(h),di.insertClockIcon(h),x&&(rt.bumpVerticalPos(Ne.boxMargin),b&&rt.bumpVerticalPos(m[0].textMaxHeight)),Ne.hideUnusedParticipants===!0){let B=new Set;y.forEach(F=>{B.add(F.from),B.add(F.to)}),g=g.filter(F=>B.has(F))}uHe(h,f,d,g,0,y,!1);let S=await vHe(y,f,T,n);di.insertArrowHead(h),di.insertArrowCrossHead(h),di.insertArrowFilledHead(h),di.insertSequenceNumber(h);function w(B,F){let z=rt.endActivation(B);z.starty+18>F&&(z.starty=F-6,F+=12),di.drawActivation(h,z,F,Ne,XS(B.from).length),rt.insert(z.startx,F-10,z.stopx,F)}o(w,"activeEnd");let E=1,_=1,C=[],D=[],O=0;for(let B of y){let F,z,$;switch(B.type){case n.db.LINETYPE.NOTE:rt.resetVerticalPos(),z=B.noteModel,await oHe(h,z);break;case n.db.LINETYPE.ACTIVE_START:rt.newActivation(B,h,f);break;case n.db.LINETYPE.ACTIVE_END:w(B,rt.getVerticalPos());break;case n.db.LINETYPE.LOOP_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U));break;case n.db.LINETYPE.LOOP_END:F=rt.endLoop(),await di.drawLoop(h,F,"loop",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;case n.db.LINETYPE.RECT_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin,U=>rt.newLoop(void 0,U.message));break;case n.db.LINETYPE.RECT_END:F=rt.endLoop(),D.push(F),rt.models.addLoop(F),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos());break;case n.db.LINETYPE.OPT_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U));break;case n.db.LINETYPE.OPT_END:F=rt.endLoop(),await di.drawLoop(h,F,"opt",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;case n.db.LINETYPE.ALT_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U));break;case n.db.LINETYPE.ALT_ELSE:Xc(S,B,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,U=>rt.addSectionToLoop(U));break;case n.db.LINETYPE.ALT_END:F=rt.endLoop(),await di.drawLoop(h,F,"alt",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U)),rt.saveVerticalPos();break;case n.db.LINETYPE.PAR_AND:Xc(S,B,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,U=>rt.addSectionToLoop(U));break;case n.db.LINETYPE.PAR_END:F=rt.endLoop(),await di.drawLoop(h,F,"par",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;case n.db.LINETYPE.AUTONUMBER:E=B.message.start||E,_=B.message.step||_,B.message.visible?n.db.enableSequenceNumbers():n.db.disableSequenceNumbers();break;case n.db.LINETYPE.CRITICAL_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U));break;case n.db.LINETYPE.CRITICAL_OPTION:Xc(S,B,Ne.boxMargin+Ne.boxTextMargin,Ne.boxMargin,U=>rt.addSectionToLoop(U));break;case n.db.LINETYPE.CRITICAL_END:F=rt.endLoop(),await di.drawLoop(h,F,"critical",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;case n.db.LINETYPE.BREAK_START:Xc(S,B,Ne.boxMargin,Ne.boxMargin+Ne.boxTextMargin,U=>rt.newLoop(U));break;case n.db.LINETYPE.BREAK_END:F=rt.endLoop(),await di.drawLoop(h,F,"break",Ne),rt.bumpVerticalPos(F.stopy-rt.getVerticalPos()),rt.models.addLoop(F);break;default:try{$=B.msgModel,$.starty=rt.getVerticalPos(),$.sequenceIndex=E,$.sequenceVisible=n.db.showSequenceNumbers();let U=await lHe(h,$);hHe(B,$,U,O,f,d,p),C.push({messageModel:$,lineStartY:U}),rt.models.addMessage($)}catch(U){X.error("error while drawing message",U)}}[n.db.LINETYPE.SOLID_OPEN,n.db.LINETYPE.DOTTED_OPEN,n.db.LINETYPE.SOLID,n.db.LINETYPE.DOTTED,n.db.LINETYPE.SOLID_CROSS,n.db.LINETYPE.DOTTED_CROSS,n.db.LINETYPE.SOLID_POINT,n.db.LINETYPE.DOTTED_POINT,n.db.LINETYPE.BIDIRECTIONAL_SOLID,n.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(B.type)&&(E=E+_),O++}X.debug("createdActors",d),X.debug("destroyedActors",p),await xP(h,f,g,!1);for(let B of C)await cHe(h,B.messageModel,B.lineStartY,n);Ne.mirrorActors&&await xP(h,f,g,!0),D.forEach(B=>di.drawBackgroundRect(h,B)),gP(h,f,g,Ne);for(let B of rt.models.boxes)B.height=rt.getVerticalPos()-B.y,rt.insert(B.x,B.y,B.x+B.width,B.height),B.startx=B.x,B.starty=B.y,B.stopx=B.startx+B.width,B.stopy=B.starty+B.height,B.stroke="rgb(0,0,0, 0.5)",di.drawBox(h,B,Ne);x&&rt.bumpVerticalPos(Ne.boxMargin);let R=Gde(h,f,g,u),{bounds:k}=rt.getBounds();k.startx===void 0&&(k.startx=0),k.starty===void 0&&(k.starty=0),k.stopx===void 0&&(k.stopx=0),k.stopy===void 0&&(k.stopy=0);let L=k.stopy-k.starty;L2,d=o(y=>l?-y:y,"adjustValue");t.from===t.to?h=u:(t.activate&&!f&&(h+=d(Ne.activationWidth/2-1)),[r.db.LINETYPE.SOLID_OPEN,r.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=d(3)),[r.db.LINETYPE.BIDIRECTIONAL_SOLID,r.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(u-=d(3)));let p=[n,i,a,s],m=Math.abs(u-h);t.wrap&&t.message&&(t.message=Vt.wrapLabel(t.message,Ze.getMax(m+2*Ne.wrapPadding,Ne.width),$p(Ne)));let g=Vt.calculateTextDimensions(t.message,$p(Ne));return{width:Ze.getMax(t.wrap?0:g.width+2*Ne.wrapPadding,m+2*Ne.wrapPadding,Ne.width),height:0,startx:u,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,p),toBounds:Math.max.apply(null,p)}},"buildMessageModel"),vHe=o(async function(t,e,r,n){let i={},a=[],s,l,u;for(let h of t){switch(h.type){case n.db.LINETYPE.LOOP_START:case n.db.LINETYPE.ALT_START:case n.db.LINETYPE.OPT_START:case n.db.LINETYPE.PAR_START:case n.db.LINETYPE.PAR_OVER_START:case n.db.LINETYPE.CRITICAL_START:case n.db.LINETYPE.BREAK_START:a.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case n.db.LINETYPE.ALT_ELSE:case n.db.LINETYPE.PAR_AND:case n.db.LINETYPE.CRITICAL_OPTION:h.message&&(s=a.pop(),i[s.id]=s,i[h.id]=s,a.push(s));break;case n.db.LINETYPE.LOOP_END:case n.db.LINETYPE.ALT_END:case n.db.LINETYPE.OPT_END:case n.db.LINETYPE.PAR_END:case n.db.LINETYPE.CRITICAL_END:case n.db.LINETYPE.BREAK_END:s=a.pop(),i[s.id]=s;break;case n.db.LINETYPE.ACTIVE_START:{let d=e.get(h.from?h.from:h.to.actor),p=XS(h.from?h.from:h.to.actor).length,m=d.x+d.width/2+(p-1)*Ne.activationWidth/2,g={startx:m,stopx:m+Ne.activationWidth,actor:h.from,enabled:!0};rt.activations.push(g)}break;case n.db.LINETYPE.ACTIVE_END:{let d=rt.activations.map(p=>p.actor).lastIndexOf(h.from);rt.activations.splice(d,1).splice(0,1)}break}h.placement!==void 0?(l=await gHe(h,e,n),h.noteModel=l,a.forEach(d=>{s=d,s.from=Ze.getMin(s.from,l.startx),s.to=Ze.getMax(s.to,l.startx+l.width),s.width=Ze.getMax(s.width,Math.abs(s.from-s.to))-Ne.labelBoxWidth})):(u=yHe(h,e,n),h.msgModel=u,u.startx&&u.stopx&&a.length>0&&a.forEach(d=>{if(s=d,u.startx===u.stopx){let p=e.get(h.from),m=e.get(h.to);s.from=Ze.getMin(p.x-u.width/2,p.x-p.width/2,s.from),s.to=Ze.getMax(m.x+u.width/2,m.x+p.width/2,s.to),s.width=Ze.getMax(s.width,Math.abs(s.to-s.from))-Ne.labelBoxWidth}else s.from=Ze.getMin(u.startx,s.from),s.to=Ze.getMax(u.stopx,s.to),s.width=Ze.getMax(s.width,u.width)-Ne.labelBoxWidth}))}return rt.activations=[],X.debug("Loop type widths:",i),i},"calculateLoopBounds"),Ude={bounds:rt,drawActors:xP,drawActorsPopup:Gde,setConf:Vde,draw:fHe}});var Wde={};ur(Wde,{diagram:()=>xHe});var xHe,qde=N(()=>{"use strict";Dde();Lde();Nde();Gt();Hde();xHe={parser:_de,get db(){return new YS},renderer:Ude,styles:Rde,init:o(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,nv({sequence:{wrap:t.wrap}}))},"init")}});var bP,jS,TP=N(()=>{"use strict";bP=function(){var t=o(function(Ie,xe,q,de){for(q=q||{},de=Ie.length;de--;q[Ie[de]]=xe);return q},"o"),e=[1,18],r=[1,19],n=[1,20],i=[1,41],a=[1,42],s=[1,26],l=[1,24],u=[1,25],h=[1,32],f=[1,33],d=[1,34],p=[1,45],m=[1,35],g=[1,36],y=[1,37],v=[1,38],x=[1,27],b=[1,28],T=[1,29],S=[1,30],w=[1,31],E=[1,44],_=[1,46],C=[1,43],D=[1,47],O=[1,9],R=[1,8,9],k=[1,58],L=[1,59],A=[1,60],I=[1,61],M=[1,62],P=[1,63],B=[1,64],F=[1,8,9,41],z=[1,76],$=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],U=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],K=[13,58,84,99,101,102],ee=[13,58,71,72,84,99,101,102],Y=[13,58,66,67,68,69,70,84,99,101,102],ce=[1,98],Z=[1,115],ue=[1,107],Q=[1,113],j=[1,108],ne=[1,109],te=[1,110],he=[1,111],le=[1,112],J=[1,114],Se=[22,58,59,80,84,85,86,87,88,89],se=[1,8,9,39,41,44],ae=[1,8,9,22],Oe=[1,143],ye=[1,8,9,59],Be=[1,8,9,22,58,59,80,84,85,86,87,88,89],He={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,DOT:17,className:18,classLiteralName:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,6],[43,2],[43,3],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:o(function(xe,q,de,ie,oe,V,Te){var W=V.length-1;switch(oe){case 8:this.$=V[W-1];break;case 9:case 12:case 14:this.$=V[W];break;case 10:case 13:this.$=V[W-2]+"."+V[W];break;case 11:case 15:this.$=V[W-1]+V[W];break;case 16:case 17:this.$=V[W-1]+"~"+V[W]+"~";break;case 18:ie.addRelation(V[W]);break;case 19:V[W-1].title=ie.cleanupLabel(V[W]),ie.addRelation(V[W-1]);break;case 30:this.$=V[W].trim(),ie.setAccTitle(this.$);break;case 31:case 32:this.$=V[W].trim(),ie.setAccDescription(this.$);break;case 33:ie.addClassesToNamespace(V[W-3],V[W-1]);break;case 34:ie.addClassesToNamespace(V[W-4],V[W-1]);break;case 35:this.$=V[W],ie.addNamespace(V[W]);break;case 36:this.$=[V[W]];break;case 37:this.$=[V[W-1]];break;case 38:V[W].unshift(V[W-2]),this.$=V[W];break;case 40:ie.setCssClass(V[W-2],V[W]);break;case 41:ie.addMembers(V[W-3],V[W-1]);break;case 42:ie.setCssClass(V[W-5],V[W-3]),ie.addMembers(V[W-5],V[W-1]);break;case 43:this.$=V[W],ie.addClass(V[W]);break;case 44:this.$=V[W-1],ie.addClass(V[W-1]),ie.setClassLabel(V[W-1],V[W]);break;case 45:ie.addAnnotation(V[W],V[W-2]);break;case 46:case 59:this.$=[V[W]];break;case 47:V[W].push(V[W-1]),this.$=V[W];break;case 48:break;case 49:ie.addMember(V[W-1],ie.cleanupLabel(V[W]));break;case 50:break;case 51:break;case 52:this.$={id1:V[W-2],id2:V[W],relation:V[W-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:V[W-3],id2:V[W],relation:V[W-1],relationTitle1:V[W-2],relationTitle2:"none"};break;case 54:this.$={id1:V[W-3],id2:V[W],relation:V[W-2],relationTitle1:"none",relationTitle2:V[W-1]};break;case 55:this.$={id1:V[W-4],id2:V[W],relation:V[W-2],relationTitle1:V[W-3],relationTitle2:V[W-1]};break;case 56:ie.addNote(V[W],V[W-1]);break;case 57:ie.addNote(V[W]);break;case 58:this.$=V[W-2],ie.defineClass(V[W-1],V[W]);break;case 60:this.$=V[W-2].concat([V[W]]);break;case 61:ie.setDirection("TB");break;case 62:ie.setDirection("BT");break;case 63:ie.setDirection("RL");break;case 64:ie.setDirection("LR");break;case 65:this.$={type1:V[W-2],type2:V[W],lineType:V[W-1]};break;case 66:this.$={type1:"none",type2:V[W],lineType:V[W-1]};break;case 67:this.$={type1:V[W-1],type2:"none",lineType:V[W]};break;case 68:this.$={type1:"none",type2:"none",lineType:V[W]};break;case 69:this.$=ie.relationType.AGGREGATION;break;case 70:this.$=ie.relationType.EXTENSION;break;case 71:this.$=ie.relationType.COMPOSITION;break;case 72:this.$=ie.relationType.DEPENDENCY;break;case 73:this.$=ie.relationType.LOLLIPOP;break;case 74:this.$=ie.lineType.LINE;break;case 75:this.$=ie.lineType.DOTTED_LINE;break;case 76:case 82:this.$=V[W-2],ie.setClickEvent(V[W-1],V[W]);break;case 77:case 83:this.$=V[W-3],ie.setClickEvent(V[W-2],V[W-1]),ie.setTooltip(V[W-2],V[W]);break;case 78:this.$=V[W-2],ie.setLink(V[W-1],V[W]);break;case 79:this.$=V[W-3],ie.setLink(V[W-2],V[W-1],V[W]);break;case 80:this.$=V[W-3],ie.setLink(V[W-2],V[W-1]),ie.setTooltip(V[W-2],V[W]);break;case 81:this.$=V[W-4],ie.setLink(V[W-3],V[W-2],V[W]),ie.setTooltip(V[W-3],V[W-1]);break;case 84:this.$=V[W-3],ie.setClickEvent(V[W-2],V[W-1],V[W]);break;case 85:this.$=V[W-4],ie.setClickEvent(V[W-3],V[W-2],V[W-1]),ie.setTooltip(V[W-3],V[W]);break;case 86:this.$=V[W-3],ie.setLink(V[W-2],V[W]);break;case 87:this.$=V[W-4],ie.setLink(V[W-3],V[W-1],V[W]);break;case 88:this.$=V[W-4],ie.setLink(V[W-3],V[W-1]),ie.setTooltip(V[W-3],V[W]);break;case 89:this.$=V[W-5],ie.setLink(V[W-4],V[W-2],V[W]),ie.setTooltip(V[W-4],V[W-1]);break;case 90:this.$=V[W-2],ie.setCssStyle(V[W-1],V[W]);break;case 91:ie.setCssClass(V[W-1],V[W]);break;case 92:this.$=[V[W]];break;case 93:V[W-2].push(V[W]),this.$=V[W-2];break;case 95:this.$=V[W-1]+V[W];break}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:T,80:S,81:w,84:E,99:_,101:C,102:D},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(O,[2,5],{8:[1,48]}),{8:[1,49]},t(R,[2,18],{22:[1,50]}),t(R,[2,20]),t(R,[2,21]),t(R,[2,22]),t(R,[2,23]),t(R,[2,24]),t(R,[2,25]),t(R,[2,26]),t(R,[2,27]),t(R,[2,28]),t(R,[2,29]),{34:[1,51]},{36:[1,52]},t(R,[2,32]),t(R,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:k,67:L,68:A,69:I,70:M,71:P,72:B}),{39:[1,65]},t(F,[2,39],{39:[1,67],44:[1,66]}),t(R,[2,50]),t(R,[2,51]),{16:68,58:p,84:E,99:_,101:C},{16:39,18:69,19:40,58:p,84:E,99:_,101:C,102:D},{16:39,18:70,19:40,58:p,84:E,99:_,101:C,102:D},{16:39,18:71,19:40,58:p,84:E,99:_,101:C,102:D},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:p,84:E,99:_,101:C,102:D},{13:z,53:75},{56:77,58:[1,78]},t(R,[2,61]),t(R,[2,62]),t(R,[2,63]),t(R,[2,64]),t($,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:p,84:E,99:_,101:C,102:D}),t($,[2,14],{20:[1,82]}),{15:83,16:84,58:p,84:E,99:_,101:C},{16:39,18:85,19:40,58:p,84:E,99:_,101:C,102:D},t(U,[2,118]),t(U,[2,119]),t(U,[2,120]),t(U,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(O,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:r,37:n,42:i,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:T,80:S,81:w,84:E,99:_,101:C,102:D}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:r,37:n,38:22,42:i,43:23,46:a,47:s,49:l,50:u,52:h,54:f,55:d,58:p,60:m,61:g,62:y,63:v,73:x,74:b,76:T,80:S,81:w,84:E,99:_,101:C,102:D},t(R,[2,19]),t(R,[2,30]),t(R,[2,31]),{13:[1,89],16:39,18:88,19:40,58:p,84:E,99:_,101:C,102:D},{51:90,64:56,65:57,66:k,67:L,68:A,69:I,70:M,71:P,72:B},t(R,[2,49]),{65:91,71:P,72:B},t(K,[2,68],{64:92,66:k,67:L,68:A,69:I,70:M}),t(ee,[2,69]),t(ee,[2,70]),t(ee,[2,71]),t(ee,[2,72]),t(ee,[2,73]),t(Y,[2,74]),t(Y,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:p,84:E,99:_,101:C},{45:97,49:ce},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:Z,57:104,58:ue,80:Q,82:105,83:106,84:j,85:ne,86:te,87:he,88:le,89:J},{58:[1,116]},{13:z,53:117},t(R,[2,57]),t(R,[2,123]),{22:Z,57:118,58:ue,59:[1,119],80:Q,82:105,83:106,84:j,85:ne,86:te,87:he,88:le,89:J},t(Se,[2,59]),{16:39,18:120,19:40,58:p,84:E,99:_,101:C,102:D},t($,[2,15]),t($,[2,16]),t($,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:p,84:E,99:_,101:C},t(se,[2,43],{11:123,12:[1,124]}),t(O,[2,7]),{9:[1,125]},t(ae,[2,52]),{16:39,18:126,19:40,58:p,84:E,99:_,101:C,102:D},{13:[1,128],16:39,18:127,19:40,58:p,84:E,99:_,101:C,102:D},t(K,[2,67],{64:129,66:k,67:L,68:A,69:I,70:M}),t(K,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(F,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:ce},{16:39,18:136,19:40,58:p,84:E,99:_,101:C,102:D},t(R,[2,76],{13:[1,137]}),t(R,[2,78],{13:[1,139],75:[1,138]}),t(R,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(R,[2,90],{59:Oe}),t(ye,[2,92],{83:144,22:Z,58:ue,80:Q,84:j,85:ne,86:te,87:he,88:le,89:J}),t(Be,[2,94]),t(Be,[2,96]),t(Be,[2,97]),t(Be,[2,98]),t(Be,[2,99]),t(Be,[2,100]),t(Be,[2,101]),t(Be,[2,102]),t(Be,[2,103]),t(Be,[2,104]),t(R,[2,91]),t(R,[2,56]),t(R,[2,58],{59:Oe}),{58:[1,145]},t($,[2,13]),{15:146,16:84,58:p,84:E,99:_,101:C},{39:[2,11]},t(se,[2,44]),{13:[1,147]},{1:[2,4]},t(ae,[2,54]),t(ae,[2,53]),{16:39,18:148,19:40,58:p,84:E,99:_,101:C,102:D},t(K,[2,65]),t(R,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:ce},t(F,[2,41]),{41:[2,47]},t(R,[2,45]),t(R,[2,77]),t(R,[2,79]),t(R,[2,80],{75:[1,152]}),t(R,[2,83]),t(R,[2,84],{13:[1,153]}),t(R,[2,86],{13:[1,155],75:[1,154]}),{22:Z,58:ue,80:Q,82:156,83:106,84:j,85:ne,86:te,87:he,88:le,89:J},t(Be,[2,95]),t(Se,[2,60]),{39:[2,10]},{14:[1,157]},t(ae,[2,55]),t(R,[2,34]),{41:[2,38]},{41:[1,158]},t(R,[2,81]),t(R,[2,85]),t(R,[2,87]),t(R,[2,88],{75:[1,159]}),t(ye,[2,93],{83:144,22:Z,58:ue,80:Q,84:j,85:ne,86:te,87:he,88:le,89:J}),t(se,[2,8]),t(F,[2,42]),t(R,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:o(function(xe,q){if(q.recoverable)this.trace(xe);else{var de=new Error(xe);throw de.hash=q,de}},"parseError"),parse:o(function(xe){var q=this,de=[0],ie=[],oe=[null],V=[],Te=this.table,W="",pe=0,ve=0,Pe=0,_e=2,be=1,Ve=V.slice.call(arguments,1),De=Object.create(this.lexer),qe={yy:{}};for(var at in this.yy)Object.prototype.hasOwnProperty.call(this.yy,at)&&(qe.yy[at]=this.yy[at]);De.setInput(xe,qe.yy),qe.yy.lexer=De,qe.yy.parser=this,typeof De.yylloc>"u"&&(De.yylloc={});var Rt=De.yylloc;V.push(Rt);var st=De.options&&De.options.ranges;typeof qe.yy.parseError=="function"?this.parseError=qe.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Ue(kt){de.length=de.length-2*kt,oe.length=oe.length-kt,V.length=V.length-kt}o(Ue,"popStack");function ct(){var kt;return kt=ie.pop()||De.lex()||be,typeof kt!="number"&&(kt instanceof Array&&(ie=kt,kt=ie.pop()),kt=q.symbols_[kt]||kt),kt}o(ct,"lex");for(var We,ot,Yt,Tt,Mt,bt,ut={},St,ft,vt,nt;;){if(Yt=de[de.length-1],this.defaultActions[Yt]?Tt=this.defaultActions[Yt]:((We===null||typeof We>"u")&&(We=ct()),Tt=Te[Yt]&&Te[Yt][We]),typeof Tt>"u"||!Tt.length||!Tt[0]){var pn="";nt=[];for(St in Te[Yt])this.terminals_[St]&&St>_e&&nt.push("'"+this.terminals_[St]+"'");De.showPosition?pn="Parse error on line "+(pe+1)+`: -`+De.showPosition()+` -Expecting `+nt.join(", ")+", got '"+(this.terminals_[We]||We)+"'":pn="Parse error on line "+(pe+1)+": Unexpected "+(We==be?"end of input":"'"+(this.terminals_[We]||We)+"'"),this.parseError(pn,{text:De.match,token:this.terminals_[We]||We,line:De.yylineno,loc:Rt,expected:nt})}if(Tt[0]instanceof Array&&Tt.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Yt+", token: "+We);switch(Tt[0]){case 1:de.push(We),oe.push(De.yytext),V.push(De.yylloc),de.push(Tt[1]),We=null,ot?(We=ot,ot=null):(ve=De.yyleng,W=De.yytext,pe=De.yylineno,Rt=De.yylloc,Pe>0&&Pe--);break;case 2:if(ft=this.productions_[Tt[1]][1],ut.$=oe[oe.length-ft],ut._$={first_line:V[V.length-(ft||1)].first_line,last_line:V[V.length-1].last_line,first_column:V[V.length-(ft||1)].first_column,last_column:V[V.length-1].last_column},st&&(ut._$.range=[V[V.length-(ft||1)].range[0],V[V.length-1].range[1]]),bt=this.performAction.apply(ut,[W,ve,pe,qe.yy,Tt[1],oe,V].concat(Ve)),typeof bt<"u")return bt;ft&&(de=de.slice(0,-1*ft*2),oe=oe.slice(0,-1*ft),V=V.slice(0,-1*ft)),de.push(this.productions_[Tt[1]][0]),oe.push(ut.$),V.push(ut._$),vt=Te[de[de.length-2]][de[de.length-1]],de.push(vt);break;case 3:return!0}}return!0},"parse")},ze=function(){var Ie={EOF:1,parseError:o(function(q,de){if(this.yy.parser)this.yy.parser.parseError(q,de);else throw new Error(q)},"parseError"),setInput:o(function(xe,q){return this.yy=q||this.yy||{},this._input=xe,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var xe=this._input[0];this.yytext+=xe,this.yyleng++,this.offset++,this.match+=xe,this.matched+=xe;var q=xe.match(/(?:\r\n?|\n).*/g);return q?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),xe},"input"),unput:o(function(xe){var q=xe.length,de=xe.split(/(?:\r\n?|\n)/g);this._input=xe+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-q),this.offset-=q;var ie=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),de.length-1&&(this.yylineno-=de.length-1);var oe=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:de?(de.length===ie.length?this.yylloc.first_column:0)+ie[ie.length-de.length].length-de[0].length:this.yylloc.first_column-q},this.options.ranges&&(this.yylloc.range=[oe[0],oe[0]+this.yyleng-q]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(xe){this.unput(this.match.slice(xe))},"less"),pastInput:o(function(){var xe=this.matched.substr(0,this.matched.length-this.match.length);return(xe.length>20?"...":"")+xe.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var xe=this.match;return xe.length<20&&(xe+=this._input.substr(0,20-xe.length)),(xe.substr(0,20)+(xe.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var xe=this.pastInput(),q=new Array(xe.length+1).join("-");return xe+this.upcomingInput()+` -`+q+"^"},"showPosition"),test_match:o(function(xe,q){var de,ie,oe;if(this.options.backtrack_lexer&&(oe={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(oe.yylloc.range=this.yylloc.range.slice(0))),ie=xe[0].match(/(?:\r\n?|\n).*/g),ie&&(this.yylineno+=ie.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:ie?ie[ie.length-1].length-ie[ie.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+xe[0].length},this.yytext+=xe[0],this.match+=xe[0],this.matches=xe,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(xe[0].length),this.matched+=xe[0],de=this.performAction.call(this,this.yy,this,q,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),de)return de;if(this._backtrack){for(var V in oe)this[V]=oe[V];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var xe,q,de,ie;this._more||(this.yytext="",this.match="");for(var oe=this._currentRules(),V=0;Vq[0].length)){if(q=de,ie=V,this.options.backtrack_lexer){if(xe=this.test_match(de,oe[V]),xe!==!1)return xe;if(this._backtrack){q=!1;continue}else return!1}else if(!this.options.flex)break}return q?(xe=this.test_match(q,oe[ie]),xe!==!1?xe:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var q=this.next();return q||this.lex()},"lex"),begin:o(function(q){this.conditionStack.push(q)},"begin"),popState:o(function(){var q=this.conditionStack.length-1;return q>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(q){return q=this.conditionStack.length-1-Math.abs(q||0),q>=0?this.conditionStack[q]:"INITIAL"},"topState"),pushState:o(function(q){this.begin(q)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(q,de,ie,oe){var V=oe;switch(ie){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:break;case 5:break;case 6:return this.begin("acc_title"),33;break;case 7:return this.popState(),"acc_title_value";break;case 8:return this.begin("acc_descr"),35;break;case 9:return this.popState(),"acc_descr_value";break;case 10:this.begin("acc_descr_multiline");break;case 11:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 8;case 14:break;case 15:return 7;case 16:return 7;case 17:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 19:this.popState();break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 22:this.popState();break;case 23:return 78;case 24:this.popState();break;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;break;case 30:return this.popState(),8;break;case 31:break;case 32:return this.begin("namespace-body"),39;break;case 33:return this.popState(),41;break;case 34:return"EOF_IN_STRUCT";case 35:return 8;case 36:break;case 37:return"EDGE_STATE";case 38:return this.begin("class"),46;break;case 39:return this.popState(),8;break;case 40:break;case 41:return this.popState(),this.popState(),41;break;case 42:return this.begin("class-body"),39;break;case 43:return this.popState(),41;break;case 44:return"EOF_IN_STRUCT";case 45:return"EDGE_STATE";case 46:return"OPEN_IN_STRUCT";case 47:break;case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 58:this.popState();break;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 61:this.popState();break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:return 75;case 65:return 75;case 66:return 75;case 67:return 75;case 68:return 67;case 69:return 67;case 70:return 69;case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:return 88;case 85:return 88;case 86:return 89;case 87:return"EQUALS";case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:return 87;case 96:return 87;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}};return Ie}();He.lexer=ze;function Le(){this.yy={}}return o(Le,"Parser"),Le.prototype=He,He.Parser=Le,new Le}();bP.parser=bP;jS=bP});var jde,Ib,Kde=N(()=>{"use strict";Gt();pr();jde=["#","+","~","-",""],Ib=class{static{o(this,"ClassMember")}constructor(e,r){this.memberType=r,this.visibility="",this.classifier="",this.text="";let n=wr(e,me());this.parseMember(n)}getDisplayDetails(){let e=this.visibility+ic(this.id);this.memberType==="method"&&(e+=`(${ic(this.parameters.trim())})`,this.returnType&&(e+=" : "+ic(this.returnType))),e=e.trim();let r=this.parseClassifier();return{displayText:e,cssStyle:r}}parseMember(e){let r="";if(this.memberType==="method"){let a=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(e);if(a){let s=a[1]?a[1].trim():"";if(jde.includes(s)&&(this.visibility=s),this.id=a[2],this.parameters=a[3]?a[3].trim():"",r=a[4]?a[4].trim():"",this.returnType=a[5]?a[5].trim():"",r===""){let l=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(l)&&(r=l,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{let i=e.length,a=e.substring(0,1),s=e.substring(i-1);jde.includes(a)&&(this.visibility=a),/[$*]/.exec(s)&&(r=s),this.id=e.substring(this.visibility===""?0:1,r===""?i:i-1)}this.classifier=r,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();let n=`${this.visibility?"\\"+this.visibility:""}${ic(this.id)}${this.memberType==="method"?`(${ic(this.parameters)})${this.returnType?" : "+ic(this.returnType):""}`:""}`;this.text=n.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}}});var KS,Qde,zp,P1,wP=N(()=>{"use strict";fr();yt();Gt();pr();er();ci();Kde();KS="classId-",Qde=0,zp=o(t=>Ze.sanitizeText(t,me()),"sanitizeText"),P1=class{constructor(){this.relations=[];this.classes=new Map;this.styleClasses=new Map;this.notes=[];this.interfaces=[];this.namespaces=new Map;this.namespaceCounter=0;this.functions=[];this.lineType={LINE:0,DOTTED_LINE:1};this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4};this.setupToolTips=o(e=>{let r=Ge(".mermaidTooltip");(r._groups||r)[0][0]===null&&(r=Ge("body").append("div").attr("class","mermaidTooltip").style("opacity",0)),Ge(e).select("svg").selectAll("g.node").on("mouseover",a=>{let s=Ge(a.currentTarget);if(s.attr("title")===null)return;let u=this.getBoundingClientRect();r.transition().duration(200).style("opacity",".9"),r.text(s.attr("title")).style("left",window.scrollX+u.left+(u.right-u.left)/2+"px").style("top",window.scrollY+u.top-14+document.body.scrollTop+"px"),r.html(r.html().replace(/<br\/>/g,"
    ")),s.classed("hover",!0)}).on("mouseout",a=>{r.transition().duration(500).style("opacity",0),Ge(a.currentTarget).classed("hover",!1)})},"setupToolTips");this.direction="TB";this.setAccTitle=Ar;this.getAccTitle=Dr;this.setAccDescription=Lr;this.getAccDescription=Rr;this.setDiagramTitle=Or;this.getDiagramTitle=Nr;this.getConfig=o(()=>me().class,"getConfig");this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{o(this,"ClassDB")}splitClassNameAndType(e){let r=Ze.sanitizeText(e,me()),n="",i=r;if(r.indexOf("~")>0){let a=r.split("~");i=zp(a[0]),n=zp(a[1])}return{className:i,type:n}}setClassLabel(e,r){let n=Ze.sanitizeText(e,me());r&&(r=zp(r));let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).label=r,this.classes.get(i).text=`${r}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(e){let r=Ze.sanitizeText(e,me()),{className:n,type:i}=this.splitClassNameAndType(r);if(this.classes.has(n))return;let a=Ze.sanitizeText(n,me());this.classes.set(a,{id:a,type:i,label:a,text:`${a}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:KS+a+"-"+Qde}),Qde++}addInterface(e,r){let n={id:`interface${this.interfaces.length}`,label:e,classId:r};this.interfaces.push(n)}lookUpDomId(e){let r=Ze.sanitizeText(e,me());if(this.classes.has(r))return this.classes.get(r).domId;throw new Error("Class not found: "+r)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",kr()}getClass(e){return this.classes.get(e)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(e){X.debug("Adding relation: "+JSON.stringify(e));let r=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];e.relation.type1===this.relationType.LOLLIPOP&&!r.includes(e.relation.type2)?(this.addClass(e.id2),this.addInterface(e.id1,e.id2),e.id1=`interface${this.interfaces.length-1}`):e.relation.type2===this.relationType.LOLLIPOP&&!r.includes(e.relation.type1)?(this.addClass(e.id1),this.addInterface(e.id2,e.id1),e.id2=`interface${this.interfaces.length-1}`):(this.addClass(e.id1),this.addClass(e.id2)),e.id1=this.splitClassNameAndType(e.id1).className,e.id2=this.splitClassNameAndType(e.id2).className,e.relationTitle1=Ze.sanitizeText(e.relationTitle1.trim(),me()),e.relationTitle2=Ze.sanitizeText(e.relationTitle2.trim(),me()),this.relations.push(e)}addAnnotation(e,r){let n=this.splitClassNameAndType(e).className;this.classes.get(n).annotations.push(r)}addMember(e,r){this.addClass(e);let n=this.splitClassNameAndType(e).className,i=this.classes.get(n);if(typeof r=="string"){let a=r.trim();a.startsWith("<<")&&a.endsWith(">>")?i.annotations.push(zp(a.substring(2,a.length-2))):a.indexOf(")")>0?i.methods.push(new Ib(a,"method")):a&&i.members.push(new Ib(a,"attribute"))}}addMembers(e,r){Array.isArray(r)&&(r.reverse(),r.forEach(n=>this.addMember(e,n)))}addNote(e,r){let n={id:`note${this.notes.length}`,class:r,text:e};this.notes.push(n)}cleanupLabel(e){return e.startsWith(":")&&(e=e.substring(1)),zp(e.trim())}setCssClass(e,r){e.split(",").forEach(n=>{let i=n;/\d/.exec(n[0])&&(i=KS+i);let a=this.classes.get(i);a&&(a.cssClasses+=" "+r)})}defineClass(e,r){for(let n of e){let i=this.styleClasses.get(n);i===void 0&&(i={id:n,styles:[],textStyles:[]},this.styleClasses.set(n,i)),r&&r.forEach(a=>{if(/color/.exec(a)){let s=a.replace("fill","bgFill");i.textStyles.push(s)}i.styles.push(a)}),this.classes.forEach(a=>{a.cssClasses.includes(n)&&a.styles.push(...r.flatMap(s=>s.split(",")))})}}setTooltip(e,r){e.split(",").forEach(n=>{r!==void 0&&(this.classes.get(n).tooltip=zp(r))})}getTooltip(e,r){return r&&this.namespaces.has(r)?this.namespaces.get(r).classes.get(e).tooltip:this.classes.get(e).tooltip}setLink(e,r,n){let i=me();e.split(",").forEach(a=>{let s=a;/\d/.exec(a[0])&&(s=KS+s);let l=this.classes.get(s);l&&(l.link=Vt.formatUrl(r,i),i.securityLevel==="sandbox"?l.linkTarget="_top":typeof n=="string"?l.linkTarget=zp(n):l.linkTarget="_blank")}),this.setCssClass(e,"clickable")}setClickEvent(e,r,n){e.split(",").forEach(i=>{this.setClickFunc(i,r,n),this.classes.get(i).haveCallback=!0}),this.setCssClass(e,"clickable")}setClickFunc(e,r,n){let i=Ze.sanitizeText(e,me());if(me().securityLevel!=="loose"||r===void 0)return;let s=i;if(this.classes.has(s)){let l=this.lookUpDomId(s),u=[];if(typeof n=="string"){u=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let h=0;h{let h=document.querySelector(`[id="${l}"]`);h!==null&&h.addEventListener("click",()=>{Vt.runFunc(r,...u)},!1)})}}bindFunctions(e){this.functions.forEach(r=>{r(e)})}getDirection(){return this.direction}setDirection(e){this.direction=e}addNamespace(e){this.namespaces.has(e)||(this.namespaces.set(e,{id:e,classes:new Map,children:{},domId:KS+e+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(e){return this.namespaces.get(e)}getNamespaces(){return this.namespaces}addClassesToNamespace(e,r){if(this.namespaces.has(e))for(let n of r){let{className:i}=this.splitClassNameAndType(n);this.classes.get(i).parent=e,this.namespaces.get(e).classes.set(i,this.classes.get(i))}}setCssStyle(e,r){let n=this.classes.get(e);if(!(!r||!n))for(let i of r)i.includes(",")?n.styles.push(...i.split(",")):n.styles.push(i)}getArrowMarker(e){let r;switch(e){case 0:r="aggregation";break;case 1:r="extension";break;case 2:r="composition";break;case 3:r="dependency";break;case 4:r="lollipop";break;default:r="none"}return r}getData(){let e=[],r=[],n=me();for(let a of this.namespaces.keys()){let s=this.namespaces.get(a);if(s){let l={id:s.id,label:s.id,isGroup:!0,padding:n.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:n.look};e.push(l)}}for(let a of this.classes.keys()){let s=this.classes.get(a);if(s){let l=s;l.parentId=s.parent,l.look=n.look,e.push(l)}}let i=0;for(let a of this.notes){i++;let s={id:a.id,label:a.text,isGroup:!1,shape:"note",padding:n.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${n.themeVariables.noteBkgColor}`,`stroke: ${n.themeVariables.noteBorderColor}`],look:n.look};e.push(s);let l=this.classes.get(a.class)?.id??"";if(l){let u={id:`edgeNote${i}`,start:a.id,end:l,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:n.look};r.push(u)}}for(let a of this.interfaces){let s={id:a.id,label:a.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:n.look};e.push(s)}i=0;for(let a of this.relations){i++;let s={id:Wh(a.id1,a.id2,{prefix:"id",counter:i}),start:a.id1,end:a.id2,type:"normal",label:a.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(a.relation.type1),arrowTypeEnd:this.getArrowMarker(a.relation.type2),startLabelRight:a.relationTitle1==="none"?"":a.relationTitle1,endLabelLeft:a.relationTitle2==="none"?"":a.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:a.style||"",pattern:a.relation.lineType==1?"dashed":"solid",look:n.look};r.push(s)}return{nodes:e,edges:r,other:{},config:n,direction:this.getDirection()}}}});var kHe,QS,kP=N(()=>{"use strict";Xm();kHe=o(t=>`g.classGroup text { - fill: ${t.nodeBorder||t.classText}; - stroke: none; - font-family: ${t.fontFamily}; - font-size: 10px; - - .title { - font-weight: bolder; - } - -} - -.nodeLabel, .edgeLabel { - color: ${t.classText}; -} -.edgeLabel .label rect { - fill: ${t.mainBkg}; -} -.label text { - fill: ${t.classText}; -} - -.labelBkg { - background: ${t.mainBkg}; -} -.edgeLabel .label span { - background: ${t.mainBkg}; -} - -.classTitle { - font-weight: bolder; -} -.node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - -.divider { - stroke: ${t.nodeBorder}; - stroke-width: 1; -} - -g.clickable { - cursor: pointer; -} - -g.classGroup rect { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; -} - -g.classGroup line { - stroke: ${t.nodeBorder}; - stroke-width: 1; -} - -.classLabel .box { - stroke: none; - stroke-width: 0; - fill: ${t.mainBkg}; - opacity: 0.5; -} - -.classLabel .label { - fill: ${t.nodeBorder}; - font-size: 10px; -} - -.relation { - stroke: ${t.lineColor}; - stroke-width: 1; - fill: none; -} - -.dashed-line{ - stroke-dasharray: 3; -} - -.dotted-line{ - stroke-dasharray: 1 2; -} - -#compositionStart, .composition { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#compositionEnd, .composition { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#dependencyStart, .dependency { - fill: ${t.lineColor} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#extensionStart, .extension { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#extensionEnd, .extension { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#aggregationStart, .aggregation { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#aggregationEnd, .aggregation { - fill: transparent !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#lollipopStart, .lollipop { - fill: ${t.mainBkg} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -#lollipopEnd, .lollipop { - fill: ${t.mainBkg} !important; - stroke: ${t.lineColor} !important; - stroke-width: 1; -} - -.edgeTerminals { - font-size: 11px; - line-height: initial; -} - -.classTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; -} - ${Nc()} -`,"getStyles"),QS=kHe});var EHe,SHe,CHe,ZS,EP=N(()=>{"use strict";Gt();yt();Sm();rp();np();er();EHe=o((t,e="TB")=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),SHe=o(function(t,e){return e.db.getClasses()},"getClasses"),CHe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing class diagram (v3)",e);let{securityLevel:i,state:a,layout:s}=me(),l=n.db.getData(),u=wc(e,i);l.type=n.type,l.layoutAlgorithm=uf(s),l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["aggregation","extension","composition","dependency","lollipop"],l.diagramId=e,await Rc(l,u);let h=8;Vt.insertTitle(u,"classDiagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Yo(u,h,"classDiagram",a?.useMaxWidth??!0)},"draw"),ZS={getClasses:SHe,draw:CHe,getDir:EHe}});var Zde={};ur(Zde,{diagram:()=>AHe});var AHe,Jde=N(()=>{"use strict";TP();wP();kP();EP();AHe={parser:jS,get db(){return new P1},renderer:ZS,styles:QS,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var rpe={};ur(rpe,{diagram:()=>RHe});var RHe,npe=N(()=>{"use strict";TP();wP();kP();EP();RHe={parser:jS,get db(){return new P1},renderer:ZS,styles:QS,init:o(t=>{t.class||(t.class={}),t.class.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var SP,JS,CP=N(()=>{"use strict";SP=function(){var t=o(function(F,z,$,U){for($=$||{},U=F.length;U--;$[F[U]]=z);return $},"o"),e=[1,2],r=[1,3],n=[1,4],i=[2,4],a=[1,9],s=[1,11],l=[1,16],u=[1,17],h=[1,18],f=[1,19],d=[1,33],p=[1,20],m=[1,21],g=[1,22],y=[1,23],v=[1,24],x=[1,26],b=[1,27],T=[1,28],S=[1,29],w=[1,30],E=[1,31],_=[1,32],C=[1,35],D=[1,36],O=[1,37],R=[1,38],k=[1,34],L=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],A=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],I=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],M={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"-->":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:o(function(z,$,U,K,ee,Y,ce){var Z=Y.length-1;switch(ee){case 3:return K.setRootDoc(Y[Z]),Y[Z];break;case 4:this.$=[];break;case 5:Y[Z]!="nl"&&(Y[Z-1].push(Y[Z]),this.$=Y[Z-1]);break;case 6:case 7:this.$=Y[Z];break;case 8:this.$="nl";break;case 12:this.$=Y[Z];break;case 13:let ne=Y[Z-1];ne.description=K.trimColon(Y[Z]),this.$=ne;break;case 14:this.$={stmt:"relation",state1:Y[Z-2],state2:Y[Z]};break;case 15:let te=K.trimColon(Y[Z]);this.$={stmt:"relation",state1:Y[Z-3],state2:Y[Z-1],description:te};break;case 19:this.$={stmt:"state",id:Y[Z-3],type:"default",description:"",doc:Y[Z-1]};break;case 20:var ue=Y[Z],Q=Y[Z-2].trim();if(Y[Z].match(":")){var j=Y[Z].split(":");ue=j[0],Q=[Q,j[1]]}this.$={stmt:"state",id:ue,type:"default",description:Q};break;case 21:this.$={stmt:"state",id:Y[Z-3],type:"default",description:Y[Z-5],doc:Y[Z-1]};break;case 22:this.$={stmt:"state",id:Y[Z],type:"fork"};break;case 23:this.$={stmt:"state",id:Y[Z],type:"join"};break;case 24:this.$={stmt:"state",id:Y[Z],type:"choice"};break;case 25:this.$={stmt:"state",id:K.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:Y[Z-1].trim(),note:{position:Y[Z-2].trim(),text:Y[Z].trim()}};break;case 29:this.$=Y[Z].trim(),K.setAccTitle(this.$);break;case 30:case 31:this.$=Y[Z].trim(),K.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:Y[Z-3],url:Y[Z-2],tooltip:Y[Z-1]};break;case 33:this.$={stmt:"click",id:Y[Z-3],url:Y[Z-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:Y[Z-1].trim(),classes:Y[Z].trim()};break;case 36:this.$={stmt:"style",id:Y[Z-1].trim(),styleClass:Y[Z].trim()};break;case 37:this.$={stmt:"applyClass",id:Y[Z-1].trim(),styleClass:Y[Z].trim()};break;case 38:K.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:K.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:K.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:K.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:Y[Z].trim(),type:"default",description:""};break;case 46:this.$={stmt:"state",id:Y[Z-2].trim(),classes:[Y[Z].trim()],type:"default",description:""};break;case 47:this.$={stmt:"state",id:Y[Z-2].trim(),classes:[Y[Z].trim()],type:"default",description:""};break}},"anonymous"),table:[{3:1,4:e,5:r,6:n},{1:[3]},{3:5,4:e,5:r,6:n},{3:6,4:e,5:r,6:n},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],i,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:E,48:_,51:C,52:D,53:O,54:R,57:k},t(L,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:l,17:u,19:h,22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:E,48:_,51:C,52:D,53:O,54:R,57:k},t(L,[2,7]),t(L,[2,8]),t(L,[2,9]),t(L,[2,10]),t(L,[2,11]),t(L,[2,12],{14:[1,40],15:[1,41]}),t(L,[2,16]),{18:[1,42]},t(L,[2,18],{20:[1,43]}),{23:[1,44]},t(L,[2,22]),t(L,[2,23]),t(L,[2,24]),t(L,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(L,[2,28]),{34:[1,49]},{36:[1,50]},t(L,[2,31]),{13:51,24:d,57:k},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(A,[2,44],{58:[1,56]}),t(A,[2,45],{58:[1,57]}),t(L,[2,38]),t(L,[2,39]),t(L,[2,40]),t(L,[2,41]),t(L,[2,6]),t(L,[2,13]),{13:58,24:d,57:k},t(L,[2,17]),t(I,i,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(L,[2,29]),t(L,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(L,[2,14],{14:[1,71]}),{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,72],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:E,48:_,51:C,52:D,53:O,54:R,57:k},t(L,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(L,[2,34]),t(L,[2,35]),t(L,[2,36]),t(L,[2,37]),t(A,[2,46]),t(A,[2,47]),t(L,[2,15]),t(L,[2,19]),t(I,i,{7:78}),t(L,[2,26]),t(L,[2,27]),{5:[1,79]},{5:[1,80]},{4:a,5:s,8:8,9:10,10:12,11:13,12:14,13:15,16:l,17:u,19:h,21:[1,81],22:f,24:d,25:p,26:m,27:g,28:y,29:v,32:25,33:x,35:b,37:T,38:S,41:w,45:E,48:_,51:C,52:D,53:O,54:R,57:k},t(L,[2,32]),t(L,[2,33]),t(L,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:o(function(z,$){if($.recoverable)this.trace(z);else{var U=new Error(z);throw U.hash=$,U}},"parseError"),parse:o(function(z){var $=this,U=[0],K=[],ee=[null],Y=[],ce=this.table,Z="",ue=0,Q=0,j=0,ne=2,te=1,he=Y.slice.call(arguments,1),le=Object.create(this.lexer),J={yy:{}};for(var Se in this.yy)Object.prototype.hasOwnProperty.call(this.yy,Se)&&(J.yy[Se]=this.yy[Se]);le.setInput(z,J.yy),J.yy.lexer=le,J.yy.parser=this,typeof le.yylloc>"u"&&(le.yylloc={});var se=le.yylloc;Y.push(se);var ae=le.options&&le.options.ranges;typeof J.yy.parseError=="function"?this.parseError=J.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Oe(W){U.length=U.length-2*W,ee.length=ee.length-W,Y.length=Y.length-W}o(Oe,"popStack");function ye(){var W;return W=K.pop()||le.lex()||te,typeof W!="number"&&(W instanceof Array&&(K=W,W=K.pop()),W=$.symbols_[W]||W),W}o(ye,"lex");for(var Be,He,ze,Le,Ie,xe,q={},de,ie,oe,V;;){if(ze=U[U.length-1],this.defaultActions[ze]?Le=this.defaultActions[ze]:((Be===null||typeof Be>"u")&&(Be=ye()),Le=ce[ze]&&ce[ze][Be]),typeof Le>"u"||!Le.length||!Le[0]){var Te="";V=[];for(de in ce[ze])this.terminals_[de]&&de>ne&&V.push("'"+this.terminals_[de]+"'");le.showPosition?Te="Parse error on line "+(ue+1)+`: -`+le.showPosition()+` -Expecting `+V.join(", ")+", got '"+(this.terminals_[Be]||Be)+"'":Te="Parse error on line "+(ue+1)+": Unexpected "+(Be==te?"end of input":"'"+(this.terminals_[Be]||Be)+"'"),this.parseError(Te,{text:le.match,token:this.terminals_[Be]||Be,line:le.yylineno,loc:se,expected:V})}if(Le[0]instanceof Array&&Le.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ze+", token: "+Be);switch(Le[0]){case 1:U.push(Be),ee.push(le.yytext),Y.push(le.yylloc),U.push(Le[1]),Be=null,He?(Be=He,He=null):(Q=le.yyleng,Z=le.yytext,ue=le.yylineno,se=le.yylloc,j>0&&j--);break;case 2:if(ie=this.productions_[Le[1]][1],q.$=ee[ee.length-ie],q._$={first_line:Y[Y.length-(ie||1)].first_line,last_line:Y[Y.length-1].last_line,first_column:Y[Y.length-(ie||1)].first_column,last_column:Y[Y.length-1].last_column},ae&&(q._$.range=[Y[Y.length-(ie||1)].range[0],Y[Y.length-1].range[1]]),xe=this.performAction.apply(q,[Z,Q,ue,J.yy,Le[1],ee,Y].concat(he)),typeof xe<"u")return xe;ie&&(U=U.slice(0,-1*ie*2),ee=ee.slice(0,-1*ie),Y=Y.slice(0,-1*ie)),U.push(this.productions_[Le[1]][0]),ee.push(q.$),Y.push(q._$),oe=ce[U[U.length-2]][U[U.length-1]],U.push(oe);break;case 3:return!0}}return!0},"parse")},P=function(){var F={EOF:1,parseError:o(function($,U){if(this.yy.parser)this.yy.parser.parseError($,U);else throw new Error($)},"parseError"),setInput:o(function(z,$){return this.yy=$||this.yy||{},this._input=z,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var z=this._input[0];this.yytext+=z,this.yyleng++,this.offset++,this.match+=z,this.matched+=z;var $=z.match(/(?:\r\n?|\n).*/g);return $?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),z},"input"),unput:o(function(z){var $=z.length,U=z.split(/(?:\r\n?|\n)/g);this._input=z+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-$),this.offset-=$;var K=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),U.length-1&&(this.yylineno-=U.length-1);var ee=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:U?(U.length===K.length?this.yylloc.first_column:0)+K[K.length-U.length].length-U[0].length:this.yylloc.first_column-$},this.options.ranges&&(this.yylloc.range=[ee[0],ee[0]+this.yyleng-$]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(z){this.unput(this.match.slice(z))},"less"),pastInput:o(function(){var z=this.matched.substr(0,this.matched.length-this.match.length);return(z.length>20?"...":"")+z.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var z=this.match;return z.length<20&&(z+=this._input.substr(0,20-z.length)),(z.substr(0,20)+(z.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var z=this.pastInput(),$=new Array(z.length+1).join("-");return z+this.upcomingInput()+` -`+$+"^"},"showPosition"),test_match:o(function(z,$){var U,K,ee;if(this.options.backtrack_lexer&&(ee={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(ee.yylloc.range=this.yylloc.range.slice(0))),K=z[0].match(/(?:\r\n?|\n).*/g),K&&(this.yylineno+=K.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:K?K[K.length-1].length-K[K.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+z[0].length},this.yytext+=z[0],this.match+=z[0],this.matches=z,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(z[0].length),this.matched+=z[0],U=this.performAction.call(this,this.yy,this,$,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),U)return U;if(this._backtrack){for(var Y in ee)this[Y]=ee[Y];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var z,$,U,K;this._more||(this.yytext="",this.match="");for(var ee=this._currentRules(),Y=0;Y$[0].length)){if($=U,K=Y,this.options.backtrack_lexer){if(z=this.test_match(U,ee[Y]),z!==!1)return z;if(this._backtrack){$=!1;continue}else return!1}else if(!this.options.flex)break}return $?(z=this.test_match($,ee[K]),z!==!1?z:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var $=this.next();return $||this.lex()},"lex"),begin:o(function($){this.conditionStack.push($)},"begin"),popState:o(function(){var $=this.conditionStack.length-1;return $>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function($){return $=this.conditionStack.length-1-Math.abs($||0),$>=0?this.conditionStack[$]:"INITIAL"},"topState"),pushState:o(function($){this.begin($)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function($,U,K,ee){var Y=ee;switch(K){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:return 51;case 5:return 52;case 6:return 53;case 7:return 54;case 8:break;case 9:break;case 10:return 5;case 11:break;case 12:break;case 13:break;case 14:break;case 15:return this.pushState("SCALE"),17;break;case 16:return 18;case 17:this.popState();break;case 18:return this.begin("acc_title"),33;break;case 19:return this.popState(),"acc_title_value";break;case 20:return this.begin("acc_descr"),35;break;case 21:return this.popState(),"acc_descr_value";break;case 22:this.begin("acc_descr_multiline");break;case 23:this.popState();break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;break;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 27:return this.popState(),this.pushState("CLASSDEFID"),42;break;case 28:return this.popState(),43;break;case 29:return this.pushState("CLASS"),48;break;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;break;case 31:return this.popState(),50;break;case 32:return this.pushState("STYLE"),45;break;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;break;case 34:return this.popState(),47;break;case 35:return this.pushState("SCALE"),17;break;case 36:return 18;case 37:this.popState();break;case 38:this.pushState("STATE");break;case 39:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 40:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 41:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 42:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),25;break;case 43:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),26;break;case 44:return this.popState(),U.yytext=U.yytext.slice(0,-10).trim(),27;break;case 45:return 51;case 46:return 52;case 47:return 53;case 48:return 54;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";break;case 51:return this.popState(),"ID";break;case 52:this.popState();break;case 53:return"STATE_DESCR";case 54:return 19;case 55:this.popState();break;case 56:return this.popState(),this.pushState("struct"),20;break;case 57:break;case 58:return this.popState(),21;break;case 59:break;case 60:return this.begin("NOTE"),29;break;case 61:return this.popState(),this.pushState("NOTE_ID"),59;break;case 62:return this.popState(),this.pushState("NOTE_ID"),60;break;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";break;case 65:break;case 66:return"NOTE_TEXT";case 67:return this.popState(),"ID";break;case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;break;case 69:return this.popState(),U.yytext=U.yytext.substr(2).trim(),31;break;case 70:return this.popState(),U.yytext=U.yytext.slice(0,-8).trim(),31;break;case 71:return 6;case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return U.yytext=U.yytext.trim(),14;break;case 77:return 15;case 78:return 28;case 79:return 58;case 80:return 5;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}};return F}();M.lexer=P;function B(){this.yy={}}return o(B,"Parser"),B.prototype=M,M.Parser=B,new B}();SP.parser=SP;JS=SP});var spe,e6,AP,Cf,Gp,Ob,ope,lpe,cpe,Vp,t6,_P,DP,LP,RP,NP,r6,n6,upe,hpe,MP,IP,fpe,dpe,B1,OHe,ppe,OP,PHe,BHe,mpe,gpe,FHe,ype,$He,vpe,PP,BP,xpe,i6,bpe,FP,a6=N(()=>{"use strict";spe="TB",e6="TB",AP="dir",Cf="state",Gp="root",Ob="relation",ope="classDef",lpe="style",cpe="applyClass",Vp="default",t6="divider",_P="fill:none",DP="fill: #333",LP="c",RP="text",NP="normal",r6="rect",n6="rectWithTitle",upe="stateStart",hpe="stateEnd",MP="divider",IP="roundedWithTitle",fpe="note",dpe="noteGroup",B1="statediagram",OHe="state",ppe=`${B1}-${OHe}`,OP="transition",PHe="note",BHe="note-edge",mpe=`${OP} ${BHe}`,gpe=`${B1}-${PHe}`,FHe="cluster",ype=`${B1}-${FHe}`,$He="cluster-alt",vpe=`${B1}-${$He}`,PP="parent",BP="note",xpe="state",i6="----",bpe=`${i6}${BP}`,FP=`${i6}${PP}`});function $P(t="",e=0,r="",n=i6){let i=r!==null&&r.length>0?`${n}${r}`:"";return`${xpe}-${t}${i}-${e}`}function s6(t,e,r){if(!e.id||e.id===""||e.id==="")return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(i=>{let a=r.get(i);a&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...a.styles])}));let n=t.find(i=>i.id===e.id);n?Object.assign(n,e):t.push(e)}function GHe(t){return t?.classes?.join(" ")??""}function VHe(t){return t?.styles??[]}var o6,Af,zHe,Tpe,F1,wpe,kpe=N(()=>{"use strict";Gt();yt();pr();a6();o6=new Map,Af=0;o($P,"stateDomId");zHe=o((t,e,r,n,i,a,s,l)=>{X.trace("items",e),e.forEach(u=>{switch(u.stmt){case Cf:F1(t,u,r,n,i,a,s,l);break;case Vp:F1(t,u,r,n,i,a,s,l);break;case Ob:{F1(t,u.state1,r,n,i,a,s,l),F1(t,u.state2,r,n,i,a,s,l);let h={id:"edge"+Af,start:u.state1.id,end:u.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:_P,labelStyle:"",label:Ze.sanitizeText(u.description??"",me()),arrowheadStyle:DP,labelpos:LP,labelType:RP,thickness:NP,classes:OP,look:s};i.push(h),Af++}break}})},"setupDoc"),Tpe=o((t,e=e6)=>{let r=e;if(t.doc)for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir");o(s6,"insertOrUpdateNode");o(GHe,"getClassesFromDbInfo");o(VHe,"getStylesFromDbInfo");F1=o((t,e,r,n,i,a,s,l)=>{let u=e.id,h=r.get(u),f=GHe(h),d=VHe(h),p=me();if(X.info("dataFetcher parsedItem",e,h,d),u!=="root"){let m=r6;e.start===!0?m=upe:e.start===!1&&(m=hpe),e.type!==Vp&&(m=e.type),o6.get(u)||o6.set(u,{id:u,shape:m,description:Ze.sanitizeText(u,p),cssClasses:`${f} ${ppe}`,cssStyles:d});let g=o6.get(u);e.description&&(Array.isArray(g.description)?(g.shape=n6,g.description.push(e.description)):g.description?.length&&g.description.length>0?(g.shape=n6,g.description===u?g.description=[e.description]:g.description=[g.description,e.description]):(g.shape=r6,g.description=e.description),g.description=Ze.sanitizeTextOrArray(g.description,p)),g.description?.length===1&&g.shape===n6&&(g.type==="group"?g.shape=IP:g.shape=r6),!g.type&&e.doc&&(X.info("Setting cluster for XCX",u,Tpe(e)),g.type="group",g.isGroup=!0,g.dir=Tpe(e),g.shape=e.type===t6?MP:IP,g.cssClasses=`${g.cssClasses} ${ype} ${a?vpe:""}`);let y={labelStyle:"",shape:g.shape,label:g.description,cssClasses:g.cssClasses,cssCompiledStyles:[],cssStyles:g.cssStyles,id:u,dir:g.dir,domId:$P(u,Af),type:g.type,isGroup:g.type==="group",padding:8,rx:10,ry:10,look:s};if(y.shape===MP&&(y.label=""),t&&t.id!=="root"&&(X.trace("Setting node ",u," to be child of its parent ",t.id),y.parentId=t.id),y.centerLabel=!0,e.note){let v={labelStyle:"",shape:fpe,label:e.note.text,cssClasses:gpe,cssStyles:[],cssCompiledStyles:[],id:u+bpe+"-"+Af,domId:$P(u,Af,BP),type:g.type,isGroup:g.type==="group",padding:p.flowchart?.padding,look:s,position:e.note.position},x=u+FP,b={labelStyle:"",shape:dpe,label:e.note.text,cssClasses:g.cssClasses,cssStyles:[],id:u+FP,domId:$P(u,Af,PP),type:"group",isGroup:!0,padding:16,look:s,position:e.note.position};Af++,b.id=x,v.parentId=x,s6(n,b,l),s6(n,v,l),s6(n,y,l);let T=u,S=v.id;e.note.position==="left of"&&(T=v.id,S=u),i.push({id:T+"-"+S,start:T,end:S,arrowhead:"none",arrowTypeEnd:"",style:_P,labelStyle:"",classes:mpe,arrowheadStyle:DP,labelpos:LP,labelType:RP,thickness:NP,look:s})}else s6(n,y,l)}e.doc&&(X.trace("Adding nodes children "),zHe(e,e.doc,r,n,i,!a,s,l))},"dataFetcher"),wpe=o(()=>{o6.clear(),Af=0},"reset")});var zP,UHe,HHe,Epe,GP=N(()=>{"use strict";Gt();yt();Sm();rp();np();er();a6();zP=o((t,e=e6)=>{if(!t.doc)return e;let r=e;for(let n of t.doc)n.stmt==="dir"&&(r=n.value);return r},"getDir"),UHe=o(function(t,e){return e.db.getClasses()},"getClasses"),HHe=o(async function(t,e,r,n){X.info("REF0:"),X.info("Drawing state diagram (v2)",e);let{securityLevel:i,state:a,layout:s}=me();n.db.extract(n.db.getRootDocV2());let l=n.db.getData(),u=wc(e,i);l.type=n.type,l.layoutAlgorithm=s,l.nodeSpacing=a?.nodeSpacing||50,l.rankSpacing=a?.rankSpacing||50,l.markers=["barb"],l.diagramId=e,await Rc(l,u);let h=8;try{(typeof n.db.getLinks=="function"?n.db.getLinks():new Map).forEach((d,p)=>{let m=typeof p=="string"?p:typeof p?.id=="string"?p.id:"";if(!m){X.warn("\u26A0\uFE0F Invalid or missing stateId from key:",JSON.stringify(p));return}let g=u.node()?.querySelectorAll("g"),y;if(g?.forEach(T=>{T.textContent?.trim()===m&&(y=T)}),!y){X.warn("\u26A0\uFE0F Could not find node matching text:",m);return}let v=y.parentNode;if(!v){X.warn("\u26A0\uFE0F Node has no parent, cannot wrap:",m);return}let x=document.createElementNS("http://www.w3.org/2000/svg","a"),b=d.url.replace(/^"+|"+$/g,"");if(x.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",b),x.setAttribute("target","_blank"),d.tooltip){let T=d.tooltip.replace(/^"+|"+$/g,"");x.setAttribute("title",T)}v.replaceChild(x,y),x.appendChild(y),X.info("\u{1F517} Wrapped node in
    tag for:",m,d.url)})}catch(f){X.error("\u274C Error injecting clickable links:",f)}Vt.insertTitle(u,"statediagramTitleText",a?.titleTopMargin??25,n.db.getDiagramTitle()),Yo(u,h,B1,a?.useMaxWidth??!0)},"draw"),Epe={getClasses:UHe,draw:HHe,getDir:zP}});var bs,Spe,Cpe,l6,tl,c6=N(()=>{"use strict";Gt();yt();er();pr();ci();kpe();GP();a6();bs={START_NODE:"[*]",START_TYPE:"start",END_NODE:"[*]",END_TYPE:"end",COLOR_KEYWORD:"color",FILL_KEYWORD:"fill",BG_FILL:"bgFill",STYLECLASS_SEP:","},Spe=o(()=>new Map,"newClassesList"),Cpe=o(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),l6=o(t=>JSON.parse(JSON.stringify(t)),"clone"),tl=class{constructor(e){this.version=e;this.nodes=[];this.edges=[];this.rootDoc=[];this.classes=Spe();this.documents={root:Cpe()};this.currentDocument=this.documents.root;this.startEndCount=0;this.dividerCnt=0;this.links=new Map;this.getAccTitle=Dr;this.setAccTitle=Ar;this.getAccDescription=Rr;this.setAccDescription=Lr;this.setDiagramTitle=Or;this.getDiagramTitle=Nr;this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{o(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(e){this.clear(!0);for(let i of Array.isArray(e)?e:e.doc)switch(i.stmt){case Cf:this.addState(i.id.trim(),i.type,i.doc,i.description,i.note);break;case Ob:this.addRelation(i.state1,i.state2,i.description);break;case ope:this.addStyleClass(i.id.trim(),i.classes);break;case lpe:this.handleStyleDef(i);break;case cpe:this.setCssClass(i.id.trim(),i.styleClass);break;case"click":this.addLink(i.id,i.url,i.tooltip);break}let r=this.getStates(),n=me();wpe(),F1(void 0,this.getRootDocV2(),r,this.nodes,this.edges,!0,n.look,this.classes);for(let i of this.nodes)if(Array.isArray(i.label)){if(i.description=i.label.slice(1),i.isGroup&&i.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${i.id}]`);i.label=i.label[0]}}handleStyleDef(e){let r=e.id.trim().split(","),n=e.styleClass.split(",");for(let i of r){let a=this.getState(i);if(!a){let s=i.trim();this.addState(s),a=this.getState(s)}a&&(a.styles=n.map(s=>s.replace(/;/g,"")?.trim()))}}setRootDoc(e){X.info("Setting root doc",e),this.rootDoc=e,this.version===1?this.extract(e):this.extract(this.getRootDocV2())}docTranslator(e,r,n){if(r.stmt===Ob){this.docTranslator(e,r.state1,!0),this.docTranslator(e,r.state2,!1);return}if(r.stmt===Cf&&(r.id===bs.START_NODE?(r.id=e.id+(n?"_start":"_end"),r.start=n):r.id=r.id.trim()),r.stmt!==Gp&&r.stmt!==Cf||!r.doc)return;let i=[],a=[];for(let s of r.doc)if(s.type===t6){let l=l6(s);l.doc=l6(a),i.push(l),a=[]}else a.push(s);if(i.length>0&&a.length>0){let s={stmt:Cf,id:L9(),type:"divider",doc:l6(a)};i.push(l6(s)),r.doc=i}r.doc.forEach(s=>this.docTranslator(r,s,!0))}getRootDocV2(){return this.docTranslator({id:Gp,stmt:Gp},{id:Gp,stmt:Gp,doc:this.rootDoc},!0),{id:Gp,doc:this.rootDoc}}addState(e,r=Vp,n=void 0,i=void 0,a=void 0,s=void 0,l=void 0,u=void 0){let h=e?.trim();if(!this.currentDocument.states.has(h))X.info("Adding state ",h,i),this.currentDocument.states.set(h,{stmt:Cf,id:h,descriptions:[],type:r,doc:n,note:a,classes:[],styles:[],textStyles:[]});else{let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.doc||(f.doc=n),f.type||(f.type=r)}if(i&&(X.info("Setting state description",h,i),(Array.isArray(i)?i:[i]).forEach(d=>this.addDescription(h,d.trim()))),a){let f=this.currentDocument.states.get(h);if(!f)throw new Error(`State not found: ${h}`);f.note=a,f.note.text=Ze.sanitizeText(f.note.text,me())}s&&(X.info("Setting state classes",h,s),(Array.isArray(s)?s:[s]).forEach(d=>this.setCssClass(h,d.trim()))),l&&(X.info("Setting state styles",h,l),(Array.isArray(l)?l:[l]).forEach(d=>this.setStyle(h,d.trim()))),u&&(X.info("Setting state styles",h,l),(Array.isArray(u)?u:[u]).forEach(d=>this.setTextStyle(h,d.trim())))}clear(e){this.nodes=[],this.edges=[],this.documents={root:Cpe()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=Spe(),e||(this.links=new Map,kr())}getState(e){return this.currentDocument.states.get(e)}getStates(){return this.currentDocument.states}logDocuments(){X.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(e,r,n){this.links.set(e,{url:r,tooltip:n}),X.warn("Adding link",e,r,n)}getLinks(){return this.links}startIdIfNeeded(e=""){return e===bs.START_NODE?(this.startEndCount++,`${bs.START_TYPE}${this.startEndCount}`):e}startTypeIfNeeded(e="",r=Vp){return e===bs.START_NODE?bs.START_TYPE:r}endIdIfNeeded(e=""){return e===bs.END_NODE?(this.startEndCount++,`${bs.END_TYPE}${this.startEndCount}`):e}endTypeIfNeeded(e="",r=Vp){return e===bs.END_NODE?bs.END_TYPE:r}addRelationObjs(e,r,n=""){let i=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type),s=this.startIdIfNeeded(r.id.trim()),l=this.startTypeIfNeeded(r.id.trim(),r.type);this.addState(i,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.addState(s,l,r.doc,r.description,r.note,r.classes,r.styles,r.textStyles),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:Ze.sanitizeText(n,me())})}addRelation(e,r,n){if(typeof e=="object"&&typeof r=="object")this.addRelationObjs(e,r,n);else if(typeof e=="string"&&typeof r=="string"){let i=this.startIdIfNeeded(e.trim()),a=this.startTypeIfNeeded(e),s=this.endIdIfNeeded(r.trim()),l=this.endTypeIfNeeded(r);this.addState(i,a),this.addState(s,l),this.currentDocument.relations.push({id1:i,id2:s,relationTitle:n?Ze.sanitizeText(n,me()):void 0})}}addDescription(e,r){let n=this.currentDocument.states.get(e),i=r.startsWith(":")?r.replace(":","").trim():r;n?.descriptions?.push(Ze.sanitizeText(i,me()))}cleanupLabel(e){return e.startsWith(":")?e.slice(2).trim():e.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(e,r=""){this.classes.has(e)||this.classes.set(e,{id:e,styles:[],textStyles:[]});let n=this.classes.get(e);r&&n&&r.split(bs.STYLECLASS_SEP).forEach(i=>{let a=i.replace(/([^;]*);/,"$1").trim();if(RegExp(bs.COLOR_KEYWORD).exec(i)){let l=a.replace(bs.FILL_KEYWORD,bs.BG_FILL).replace(bs.COLOR_KEYWORD,bs.FILL_KEYWORD);n.textStyles.push(l)}n.styles.push(a)})}getClasses(){return this.classes}setCssClass(e,r){e.split(",").forEach(n=>{let i=this.getState(n);if(!i){let a=n.trim();this.addState(a),i=this.getState(a)}i?.classes?.push(r)})}setStyle(e,r){this.getState(e)?.styles?.push(r)}setTextStyle(e,r){this.getState(e)?.textStyles?.push(r)}getDirectionStatement(){return this.rootDoc.find(e=>e.stmt===AP)}getDirection(){return this.getDirectionStatement()?.value??spe}setDirection(e){let r=this.getDirectionStatement();r?r.value=e:this.rootDoc.unshift({stmt:AP,value:e})}trimColon(e){return e.startsWith(":")?e.slice(1).trim():e.trim()}getData(){let e=me();return{nodes:this.nodes,edges:this.edges,other:{},config:e,direction:zP(this.getRootDocV2())}}getConfig(){return me().state}}});var WHe,u6,VP=N(()=>{"use strict";WHe=o(t=>` -defs #statediagram-barbEnd { - fill: ${t.transitionColor}; - stroke: ${t.transitionColor}; - } -g.stateGroup text { - fill: ${t.nodeBorder}; - stroke: none; - font-size: 10px; -} -g.stateGroup text { - fill: ${t.textColor}; - stroke: none; - font-size: 10px; - -} -g.stateGroup .state-title { - font-weight: bolder; - fill: ${t.stateLabelColor}; -} - -g.stateGroup rect { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; -} - -g.stateGroup line { - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.transition { - stroke: ${t.transitionColor}; - stroke-width: 1; - fill: none; -} - -.stateGroup .composit { - fill: ${t.background}; - border-bottom: 1px -} - -.stateGroup .alt-composit { - fill: #e0e0e0; - border-bottom: 1px -} - -.state-note { - stroke: ${t.noteBorderColor}; - fill: ${t.noteBkgColor}; - - text { - fill: ${t.noteTextColor}; - stroke: none; - font-size: 10px; - } -} - -.stateLabel .box { - stroke: none; - stroke-width: 0; - fill: ${t.mainBkg}; - opacity: 0.5; -} - -.edgeLabel .label rect { - fill: ${t.labelBackgroundColor}; - opacity: 0.5; -} -.edgeLabel { - background-color: ${t.edgeLabelBackground}; - p { - background-color: ${t.edgeLabelBackground}; - } - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; -} -.edgeLabel .label text { - fill: ${t.transitionLabelColor||t.tertiaryTextColor}; -} -.label div .edgeLabel { - color: ${t.transitionLabelColor||t.tertiaryTextColor}; -} - -.stateLabel text { - fill: ${t.stateLabelColor}; - font-size: 10px; - font-weight: bold; -} - -.node circle.state-start { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node .fork-join { - fill: ${t.specialStateColor}; - stroke: ${t.specialStateColor}; -} - -.node circle.state-end { - fill: ${t.innerEndBackground}; - stroke: ${t.background}; - stroke-width: 1.5 -} -.end-state-inner { - fill: ${t.compositeBackground||t.background}; - // stroke: ${t.background}; - stroke-width: 1.5 -} - -.node rect { - fill: ${t.stateBkg||t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} -.node polygon { - fill: ${t.mainBkg}; - stroke: ${t.stateBorder||t.nodeBorder};; - stroke-width: 1px; -} -#statediagram-barbEnd { - fill: ${t.lineColor}; -} - -.statediagram-cluster rect { - fill: ${t.compositeTitleBackground}; - stroke: ${t.stateBorder||t.nodeBorder}; - stroke-width: 1px; -} - -.cluster-label, .nodeLabel { - color: ${t.stateLabelColor}; - // line-height: 1; -} - -.statediagram-cluster rect.outer { - rx: 5px; - ry: 5px; -} -.statediagram-state .divider { - stroke: ${t.stateBorder||t.nodeBorder}; -} - -.statediagram-state .title-state { - rx: 5px; - ry: 5px; -} -.statediagram-cluster.statediagram-cluster .inner { - fill: ${t.compositeBackground||t.background}; -} -.statediagram-cluster.statediagram-cluster-alt .inner { - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.statediagram-cluster .inner { - rx:0; - ry:0; -} - -.statediagram-state rect.basic { - rx: 5px; - ry: 5px; -} -.statediagram-state rect.divider { - stroke-dasharray: 10,10; - fill: ${t.altBackground?t.altBackground:"#efefef"}; -} - -.note-edge { - stroke-dasharray: 5; -} - -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} -.statediagram-note rect { - fill: ${t.noteBkgColor}; - stroke: ${t.noteBorderColor}; - stroke-width: 1px; - rx: 0; - ry: 0; -} - -.statediagram-note text { - fill: ${t.noteTextColor}; -} - -.statediagram-note .nodeLabel { - color: ${t.noteTextColor}; -} -.statediagram .edgeLabel { - color: red; // ${t.noteTextColor}; -} - -#dependencyStart, #dependencyEnd { - fill: ${t.lineColor}; - stroke: ${t.lineColor}; - stroke-width: 1; -} - -.statediagramTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; -} -`,"getStyles"),u6=WHe});var qHe,YHe,XHe,jHe,_pe,KHe,QHe,ZHe,JHe,UP,Ape,Dpe,Lpe=N(()=>{"use strict";fr();c6();er();pr();Gt();yt();qHe=o(t=>t.append("circle").attr("class","start-state").attr("r",me().state.sizeUnit).attr("cx",me().state.padding+me().state.sizeUnit).attr("cy",me().state.padding+me().state.sizeUnit),"drawStartState"),YHe=o(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",me().state.textHeight).attr("class","divider").attr("x2",me().state.textHeight*2).attr("y1",0).attr("y2",0),"drawDivider"),XHe=o((t,e)=>{let r=t.append("text").attr("x",2*me().state.padding).attr("y",me().state.textHeight+2*me().state.padding).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.id),n=r.node().getBBox();return t.insert("rect",":first-child").attr("x",me().state.padding).attr("y",me().state.padding).attr("width",n.width+2*me().state.padding).attr("height",n.height+2*me().state.padding).attr("rx",me().state.radius),r},"drawSimpleState"),jHe=o((t,e)=>{let r=o(function(p,m,g){let y=p.append("tspan").attr("x",2*me().state.padding).text(m);g||y.attr("dy",me().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*me().state.padding).attr("y",me().state.textHeight+1.3*me().state.padding).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),a=i.height,s=t.append("text").attr("x",me().state.padding).attr("y",a+me().state.padding*.4+me().state.dividerMargin+me().state.textHeight).attr("class","state-description"),l=!0,u=!0;e.descriptions.forEach(function(p){l||(r(s,p,u),u=!1),l=!1});let h=t.append("line").attr("x1",me().state.padding).attr("y1",me().state.padding+a+me().state.dividerMargin/2).attr("y2",me().state.padding+a+me().state.dividerMargin/2).attr("class","descr-divider"),f=s.node().getBBox(),d=Math.max(f.width,i.width);return h.attr("x2",d+3*me().state.padding),t.insert("rect",":first-child").attr("x",me().state.padding).attr("y",me().state.padding).attr("width",d+2*me().state.padding).attr("height",f.height+a+2*me().state.padding).attr("rx",me().state.radius),t},"drawDescrState"),_pe=o((t,e,r)=>{let n=me().state.padding,i=2*me().state.padding,a=t.node().getBBox(),s=a.width,l=a.x,u=t.append("text").attr("x",0).attr("y",me().state.titleShift).attr("font-size",me().state.fontSize).attr("class","state-title").text(e.id),f=u.node().getBBox().width+i,d=Math.max(f,s);d===s&&(d=d+i);let p,m=t.node().getBBox();e.doc,p=l-n,f>s&&(p=(s-d)/2+n),Math.abs(l-m.x)s&&(p=l-(f-s)/2);let g=1-me().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",g).attr("class",r?"alt-composit":"composit").attr("width",d).attr("height",m.height+me().state.textHeight+me().state.titleShift+1).attr("rx","0"),u.attr("x",p+n),f<=s&&u.attr("x",l+(d-i)/2-f/2+n),t.insert("rect",":first-child").attr("x",p).attr("y",me().state.titleShift-me().state.textHeight-me().state.padding).attr("width",d).attr("height",me().state.textHeight*3).attr("rx",me().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",me().state.titleShift-me().state.textHeight-me().state.padding).attr("width",d).attr("height",m.height+3+2*me().state.textHeight).attr("rx",me().state.radius),t},"addTitleAndBox"),KHe=o(t=>(t.append("circle").attr("class","end-state-outer").attr("r",me().state.sizeUnit+me().state.miniPadding).attr("cx",me().state.padding+me().state.sizeUnit+me().state.miniPadding).attr("cy",me().state.padding+me().state.sizeUnit+me().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",me().state.sizeUnit).attr("cx",me().state.padding+me().state.sizeUnit+2).attr("cy",me().state.padding+me().state.sizeUnit+2)),"drawEndState"),QHe=o((t,e)=>{let r=me().state.forkWidth,n=me().state.forkHeight;if(e.parentId){let i=r;r=n,n=i}return t.append("rect").style("stroke","black").style("fill","black").attr("width",r).attr("height",n).attr("x",me().state.padding).attr("y",me().state.padding)},"drawForkJoinState"),ZHe=o((t,e,r,n)=>{let i=0,a=n.append("text");a.style("text-anchor","start"),a.attr("class","noteText");let s=t.replace(/\r\n/g,"
    ");s=s.replace(/\n/g,"
    ");let l=s.split(Ze.lineBreakRegex),u=1.25*me().state.noteMargin;for(let h of l){let f=h.trim();if(f.length>0){let d=a.append("tspan");if(d.text(f),u===0){let p=d.node().getBBox();u+=p.height}i+=u,d.attr("x",e+me().state.noteMargin),d.attr("y",r+i+1.25*me().state.noteMargin)}}return{textWidth:a.node().getBBox().width,textHeight:i}},"_drawLongText"),JHe=o((t,e)=>{e.attr("class","state-note");let r=e.append("rect").attr("x",0).attr("y",me().state.padding),n=e.append("g"),{textWidth:i,textHeight:a}=ZHe(t,0,0,n);return r.attr("height",a+2*me().state.noteMargin),r.attr("width",i+me().state.noteMargin*2),r},"drawNote"),UP=o(function(t,e){let r=e.id,n={id:r,label:e.id,width:0,height:0},i=t.append("g").attr("id",r).attr("class","stateGroup");e.type==="start"&&qHe(i),e.type==="end"&&KHe(i),(e.type==="fork"||e.type==="join")&&QHe(i,e),e.type==="note"&&JHe(e.note.text,i),e.type==="divider"&&YHe(i),e.type==="default"&&e.descriptions.length===0&&XHe(i,e),e.type==="default"&&e.descriptions.length>0&&jHe(i,e);let a=i.node().getBBox();return n.width=a.width+2*me().state.padding,n.height=a.height+2*me().state.padding,n},"drawState"),Ape=0,Dpe=o(function(t,e,r){let n=o(function(u){switch(u){case tl.relationType.AGGREGATION:return"aggregation";case tl.relationType.EXTENSION:return"extension";case tl.relationType.COMPOSITION:return"composition";case tl.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(u=>!Number.isNaN(u.y));let i=e.points,a=Cl().x(function(u){return u.x}).y(function(u){return u.y}).curve(No),s=t.append("path").attr("d",a(i)).attr("id","edge"+Ape).attr("class","transition"),l="";if(me().state.arrowMarkerAbsolute&&(l=mu(!0)),s.attr("marker-end","url("+l+"#"+n(tl.relationType.DEPENDENCY)+"End)"),r.title!==void 0){let u=t.append("g").attr("class","stateLabel"),{x:h,y:f}=Vt.calcLabelPosition(e.points),d=Ze.getRows(r.title),p=0,m=[],g=0,y=0;for(let b=0;b<=d.length;b++){let T=u.append("text").attr("text-anchor","middle").text(d[b]).attr("x",h).attr("y",f+p),S=T.node().getBBox();g=Math.max(g,S.width),y=Math.min(y,S.x),X.info(S.x,h,f+p),p===0&&(p=T.node().getBBox().height,X.info("Title height",p,f)),m.push(T)}let v=p*d.length;if(d.length>1){let b=(d.length-1)*p*.5;m.forEach((T,S)=>T.attr("y",f+S*p-b)),v=p*d.length}let x=u.node().getBBox();u.insert("rect",":first-child").attr("class","box").attr("x",h-g/2-me().state.padding/2).attr("y",f-v/2-me().state.padding/2-3.5).attr("width",g+me().state.padding).attr("height",v+me().state.padding),X.info(x)}Ape++},"drawEdge")});var go,HP,eWe,tWe,rWe,nWe,Rpe,Npe,Mpe=N(()=>{"use strict";fr();JR();Wo();yt();pr();Lpe();Gt();xi();HP={},eWe=o(function(){},"setConf"),tWe=o(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),rWe=o(function(t,e,r,n){go=me().state;let i=me().securityLevel,a;i==="sandbox"&&(a=Ge("#i"+e));let s=i==="sandbox"?Ge(a.nodes()[0].contentDocument.body):Ge("body"),l=i==="sandbox"?a.nodes()[0].contentDocument:document;X.debug("Rendering diagram "+t);let u=s.select(`[id='${e}']`);tWe(u);let h=n.db.getRootDoc();Rpe(h,u,void 0,!1,s,l,n);let f=go.padding,d=u.node().getBBox(),p=d.width+f*2,m=d.height+f*2,g=p*1.75;fn(u,m,g,go.useMaxWidth),u.attr("viewBox",`${d.x-go.padding} ${d.y-go.padding} `+p+" "+m)},"draw"),nWe=o(t=>t?t.length*go.fontSizeFactor:1,"getLabelWidth"),Rpe=o((t,e,r,n,i,a,s)=>{let l=new sn({compound:!0,multigraph:!0}),u,h=!0;for(u=0;u{let w=S.parentElement,E=0,_=0;w&&(w.parentElement&&(E=w.parentElement.getBBox().width),_=parseInt(w.getAttribute("data-x-shift"),10),Number.isNaN(_)&&(_=0)),S.setAttribute("x1",0-_+8),S.setAttribute("x2",E-_-8)})):X.debug("No Node "+b+": "+JSON.stringify(l.node(b)))});let v=y.getBBox();l.edges().forEach(function(b){b!==void 0&&l.edge(b)!==void 0&&(X.debug("Edge "+b.v+" -> "+b.w+": "+JSON.stringify(l.edge(b))),Dpe(e,l.edge(b),l.edge(b).relation))}),v=y.getBBox();let x={id:r||"root",label:r||"root",width:0,height:0};return x.width=v.width+2*go.padding,x.height=v.height+2*go.padding,X.debug("Doc rendered",x,l),x},"renderDoc"),Npe={setConf:eWe,draw:rWe}});var Ipe={};ur(Ipe,{diagram:()=>iWe});var iWe,Ope=N(()=>{"use strict";CP();c6();VP();Mpe();iWe={parser:JS,get db(){return new tl(1)},renderer:Npe,styles:u6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var Fpe={};ur(Fpe,{diagram:()=>lWe});var lWe,$pe=N(()=>{"use strict";CP();c6();VP();GP();lWe={parser:JS,get db(){return new tl(2)},renderer:Epe,styles:u6,init:o(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}});var WP,Vpe,Upe=N(()=>{"use strict";WP=function(){var t=o(function(d,p,m,g){for(m=m||{},g=d.length;g--;m[d[g]]=p);return m},"o"),e=[6,8,10,11,12,14,16,17,18],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,14],u={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:o(function(p,m,g,y,v,x,b){var T=x.length-1;switch(v){case 1:return x[T-1];case 2:this.$=[];break;case 3:x[T-1].push(x[T]),this.$=x[T-1];break;case 4:case 5:this.$=x[T];break;case 6:case 7:this.$=[];break;case 8:y.setDiagramTitle(x[T].substr(6)),this.$=x[T].substr(6);break;case 9:this.$=x[T].trim(),y.setAccTitle(this.$);break;case 10:case 11:this.$=x[T].trim(),y.setAccDescription(this.$);break;case 12:y.addSection(x[T].substr(8)),this.$=x[T].substr(8);break;case 13:y.addTask(x[T-1],x[T]),this.$="task";break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:r,12:n,14:i,16:a,17:s,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:o(function(p,m){if(m.recoverable)this.trace(p);else{var g=new Error(p);throw g.hash=m,g}},"parseError"),parse:o(function(p){var m=this,g=[0],y=[],v=[null],x=[],b=this.table,T="",S=0,w=0,E=0,_=2,C=1,D=x.slice.call(arguments,1),O=Object.create(this.lexer),R={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(R.yy[k]=this.yy[k]);O.setInput(p,R.yy),R.yy.lexer=O,R.yy.parser=this,typeof O.yylloc>"u"&&(O.yylloc={});var L=O.yylloc;x.push(L);var A=O.options&&O.options.ranges;typeof R.yy.parseError=="function"?this.parseError=R.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function I(Q){g.length=g.length-2*Q,v.length=v.length-Q,x.length=x.length-Q}o(I,"popStack");function M(){var Q;return Q=y.pop()||O.lex()||C,typeof Q!="number"&&(Q instanceof Array&&(y=Q,Q=y.pop()),Q=m.symbols_[Q]||Q),Q}o(M,"lex");for(var P,B,F,z,$,U,K={},ee,Y,ce,Z;;){if(F=g[g.length-1],this.defaultActions[F]?z=this.defaultActions[F]:((P===null||typeof P>"u")&&(P=M()),z=b[F]&&b[F][P]),typeof z>"u"||!z.length||!z[0]){var ue="";Z=[];for(ee in b[F])this.terminals_[ee]&&ee>_&&Z.push("'"+this.terminals_[ee]+"'");O.showPosition?ue="Parse error on line "+(S+1)+`: -`+O.showPosition()+` -Expecting `+Z.join(", ")+", got '"+(this.terminals_[P]||P)+"'":ue="Parse error on line "+(S+1)+": Unexpected "+(P==C?"end of input":"'"+(this.terminals_[P]||P)+"'"),this.parseError(ue,{text:O.match,token:this.terminals_[P]||P,line:O.yylineno,loc:L,expected:Z})}if(z[0]instanceof Array&&z.length>1)throw new Error("Parse Error: multiple actions possible at state: "+F+", token: "+P);switch(z[0]){case 1:g.push(P),v.push(O.yytext),x.push(O.yylloc),g.push(z[1]),P=null,B?(P=B,B=null):(w=O.yyleng,T=O.yytext,S=O.yylineno,L=O.yylloc,E>0&&E--);break;case 2:if(Y=this.productions_[z[1]][1],K.$=v[v.length-Y],K._$={first_line:x[x.length-(Y||1)].first_line,last_line:x[x.length-1].last_line,first_column:x[x.length-(Y||1)].first_column,last_column:x[x.length-1].last_column},A&&(K._$.range=[x[x.length-(Y||1)].range[0],x[x.length-1].range[1]]),U=this.performAction.apply(K,[T,w,S,R.yy,z[1],v,x].concat(D)),typeof U<"u")return U;Y&&(g=g.slice(0,-1*Y*2),v=v.slice(0,-1*Y),x=x.slice(0,-1*Y)),g.push(this.productions_[z[1]][0]),v.push(K.$),x.push(K._$),ce=b[g[g.length-2]][g[g.length-1]],g.push(ce);break;case 3:return!0}}return!0},"parse")},h=function(){var d={EOF:1,parseError:o(function(m,g){if(this.yy.parser)this.yy.parser.parseError(m,g);else throw new Error(m)},"parseError"),setInput:o(function(p,m){return this.yy=m||this.yy||{},this._input=p,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var p=this._input[0];this.yytext+=p,this.yyleng++,this.offset++,this.match+=p,this.matched+=p;var m=p.match(/(?:\r\n?|\n).*/g);return m?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),p},"input"),unput:o(function(p){var m=p.length,g=p.split(/(?:\r\n?|\n)/g);this._input=p+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-m),this.offset-=m;var y=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),g.length-1&&(this.yylineno-=g.length-1);var v=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:g?(g.length===y.length?this.yylloc.first_column:0)+y[y.length-g.length].length-g[0].length:this.yylloc.first_column-m},this.options.ranges&&(this.yylloc.range=[v[0],v[0]+this.yyleng-m]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(p){this.unput(this.match.slice(p))},"less"),pastInput:o(function(){var p=this.matched.substr(0,this.matched.length-this.match.length);return(p.length>20?"...":"")+p.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var p=this.match;return p.length<20&&(p+=this._input.substr(0,20-p.length)),(p.substr(0,20)+(p.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var p=this.pastInput(),m=new Array(p.length+1).join("-");return p+this.upcomingInput()+` -`+m+"^"},"showPosition"),test_match:o(function(p,m){var g,y,v;if(this.options.backtrack_lexer&&(v={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(v.yylloc.range=this.yylloc.range.slice(0))),y=p[0].match(/(?:\r\n?|\n).*/g),y&&(this.yylineno+=y.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:y?y[y.length-1].length-y[y.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+p[0].length},this.yytext+=p[0],this.match+=p[0],this.matches=p,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(p[0].length),this.matched+=p[0],g=this.performAction.call(this,this.yy,this,m,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),g)return g;if(this._backtrack){for(var x in v)this[x]=v[x];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var p,m,g,y;this._more||(this.yytext="",this.match="");for(var v=this._currentRules(),x=0;xm[0].length)){if(m=g,y=x,this.options.backtrack_lexer){if(p=this.test_match(g,v[x]),p!==!1)return p;if(this._backtrack){m=!1;continue}else return!1}else if(!this.options.flex)break}return m?(p=this.test_match(m,v[y]),p!==!1?p:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var m=this.next();return m||this.lex()},"lex"),begin:o(function(m){this.conditionStack.push(m)},"begin"),popState:o(function(){var m=this.conditionStack.length-1;return m>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(m){return m=this.conditionStack.length-1-Math.abs(m||0),m>=0?this.conditionStack[m]:"INITIAL"},"topState"),pushState:o(function(m){this.begin(m)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(m,g,y,v){var x=v;switch(y){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}};return d}();u.lexer=h;function f(){this.yy={}}return o(f,"Parser"),f.prototype=u,u.Parser=f,new f}();WP.parser=WP;Vpe=WP});var $1,qP,Pb,Bb,fWe,dWe,pWe,mWe,gWe,yWe,vWe,Hpe,xWe,YP,Wpe=N(()=>{"use strict";Gt();ci();$1="",qP=[],Pb=[],Bb=[],fWe=o(function(){qP.length=0,Pb.length=0,$1="",Bb.length=0,kr()},"clear"),dWe=o(function(t){$1=t,qP.push(t)},"addSection"),pWe=o(function(){return qP},"getSections"),mWe=o(function(){let t=Hpe(),e=100,r=0;for(;!t&&r{r.people&&t.push(...r.people)}),[...new Set(t)].sort()},"updateActors"),yWe=o(function(t,e){let r=e.substr(1).split(":"),n=0,i=[];r.length===1?(n=Number(r[0]),i=[]):(n=Number(r[0]),i=r[1].split(","));let a=i.map(l=>l.trim()),s={section:$1,type:$1,people:a,task:t,score:n};Bb.push(s)},"addTask"),vWe=o(function(t){let e={section:$1,type:$1,description:t,task:t,classes:[]};Pb.push(e)},"addTaskOrg"),Hpe=o(function(){let t=o(function(r){return Bb[r].processed},"compileTask"),e=!0;for(let[r,n]of Bb.entries())t(r),e=e&&n.processed;return e},"compileTasks"),xWe=o(function(){return gWe()},"getActors"),YP={getConfig:o(()=>me().journey,"getConfig"),clear:fWe,setDiagramTitle:Or,getDiagramTitle:Nr,setAccTitle:Ar,getAccTitle:Dr,setAccDescription:Lr,getAccDescription:Rr,addSection:dWe,getSections:pWe,getTasks:mWe,addTask:yWe,addTaskOrg:vWe,getActors:xWe}});var bWe,qpe,Ype=N(()=>{"use strict";Xm();bWe=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.textColor}; - } - .mouth { - stroke: #666; - } - - line { - stroke: ${t.textColor} - } - - .legend { - fill: ${t.textColor}; - font-family: ${t.fontFamily}; - } - - .label text { - fill: #333; - } - .label { - color: ${t.textColor} - } - - .face { - ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"}; - stroke: #999; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 1.5px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - rect { - opacity: 0.5; - } - text-align: center; - } - - .cluster rect { - } - - .cluster text { - fill: ${t.titleColor}; - } - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .task-type-0, .section-type-0 { - ${t.fillType0?`fill: ${t.fillType0}`:""}; - } - .task-type-1, .section-type-1 { - ${t.fillType0?`fill: ${t.fillType1}`:""}; - } - .task-type-2, .section-type-2 { - ${t.fillType0?`fill: ${t.fillType2}`:""}; - } - .task-type-3, .section-type-3 { - ${t.fillType0?`fill: ${t.fillType3}`:""}; - } - .task-type-4, .section-type-4 { - ${t.fillType0?`fill: ${t.fillType4}`:""}; - } - .task-type-5, .section-type-5 { - ${t.fillType0?`fill: ${t.fillType5}`:""}; - } - .task-type-6, .section-type-6 { - ${t.fillType0?`fill: ${t.fillType6}`:""}; - } - .task-type-7, .section-type-7 { - ${t.fillType0?`fill: ${t.fillType7}`:""}; - } - - .actor-0 { - ${t.actor0?`fill: ${t.actor0}`:""}; - } - .actor-1 { - ${t.actor1?`fill: ${t.actor1}`:""}; - } - .actor-2 { - ${t.actor2?`fill: ${t.actor2}`:""}; - } - .actor-3 { - ${t.actor3?`fill: ${t.actor3}`:""}; - } - .actor-4 { - ${t.actor4?`fill: ${t.actor4}`:""}; - } - .actor-5 { - ${t.actor5?`fill: ${t.actor5}`:""}; - } - ${Nc()} -`,"getStyles"),qpe=bWe});var XP,TWe,jpe,Kpe,wWe,kWe,Xpe,EWe,SWe,Qpe,CWe,z1,Zpe=N(()=>{"use strict";fr();t2();XP=o(function(t,e){return Nd(t,e)},"drawRect"),TWe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),jpe=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),Kpe=o(function(t,e){return XY(t,e)},"drawText"),wWe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,Kpe(t,e)},"drawLabel"),kWe=o(function(t,e,r){let n=t.append("g"),i=Al();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width*e.taskCount+r.diagramMarginX*(e.taskCount-1),i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,XP(n,i),Qpe(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),Xpe=-1,EWe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");Xpe++;let a=300+5*30;i.append("line").attr("id","task"+Xpe).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),TWe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=Al();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,XP(i,s);let l=e.x+14;e.people.forEach(u=>{let h=e.actors[u].color,f={cx:l,cy:e.y,r:7,fill:h,stroke:"#000",title:u,pos:e.actors[u].position};jpe(i,f),l+=10}),Qpe(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),SWe=o(function(t,e){iT(t,e)},"drawBackgroundRect"),Qpe=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{let a=th[i].color,s={cx:20,cy:n,r:7,fill:a,stroke:"#000",pos:th[i].position};z1.drawCircle(t,s);let l=t.append("text").attr("visibility","hidden").text(i),u=l.node().getBoundingClientRect().width;l.remove();let h=[];if(u<=r)h=[i];else{let f=i.split(" "),d="";l=t.append("text").attr("visibility","hidden"),f.forEach(p=>{let m=d?`${d} ${p}`:p;if(l.text(m),l.node().getBoundingClientRect().width>r){if(d&&h.push(d),d=p,l.text(p),l.node().getBoundingClientRect().width>r){let y="";for(let v of p)y+=v,l.text(y+"-"),l.node().getBoundingClientRect().width>r&&(h.push(y.slice(0,-1)+"-"),y=v);d=y}}else d=m}),d&&h.push(d),l.remove()}h.forEach((f,d)=>{let p={x:40,y:n+7+d*20,fill:"#666",text:f,textMargin:e.boxTextMargin??5},g=z1.drawText(t,p).node().getBoundingClientRect().width;g>h6&&g>e.leftMargin-g&&(h6=g)}),n+=Math.max(20,h.length*20)})}var AWe,th,h6,Ul,_f,DWe,rl,jP,Jpe,LWe,KP,e0e=N(()=>{"use strict";fr();Zpe();Gt();xi();AWe=o(function(t){Object.keys(t).forEach(function(r){Ul[r]=t[r]})},"setConf"),th={},h6=0;o(_We,"drawActorLegend");Ul=me().journey,_f=0,DWe=o(function(t,e,r,n){let i=me(),a=i.journey.titleColor,s=i.journey.titleFontSize,l=i.journey.titleFontFamily,u=i.securityLevel,h;u==="sandbox"&&(h=Ge("#i"+e));let f=u==="sandbox"?Ge(h.nodes()[0].contentDocument.body):Ge("body");rl.init();let d=f.select("#"+e);z1.initGraphics(d);let p=n.db.getTasks(),m=n.db.getDiagramTitle(),g=n.db.getActors();for(let S in th)delete th[S];let y=0;g.forEach(S=>{th[S]={color:Ul.actorColours[y%Ul.actorColours.length],position:y},y++}),_We(d),_f=Ul.leftMargin+h6,rl.insert(0,0,_f,Object.keys(th).length*50),LWe(d,p,0);let v=rl.getBounds();m&&d.append("text").text(m).attr("x",_f).attr("font-size",s).attr("font-weight","bold").attr("y",25).attr("fill",a).attr("font-family",l);let x=v.stopy-v.starty+2*Ul.diagramMarginY,b=_f+v.stopx+2*Ul.diagramMarginX;fn(d,x,b,Ul.useMaxWidth),d.append("line").attr("x1",_f).attr("y1",Ul.height*4).attr("x2",b-_f-4).attr("y2",Ul.height*4).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");let T=m?70:0;d.attr("viewBox",`${v.startx} -25 ${b} ${x+T}`),d.attr("preserveAspectRatio","xMinYMin meet"),d.attr("height",x+T+25)},"draw"),rl={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:o(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:o(function(t,e,r,n){t[e]===void 0?t[e]=r:t[e]=n(r,t[e])},"updateVal"),updateBounds:o(function(t,e,r,n){let i=me().journey,a=this,s=0;function l(u){return o(function(f){s++;let d=a.sequenceItems.length-s+1;a.updateVal(f,"starty",e-d*i.boxMargin,Math.min),a.updateVal(f,"stopy",n+d*i.boxMargin,Math.max),a.updateVal(rl.data,"startx",t-d*i.boxMargin,Math.min),a.updateVal(rl.data,"stopx",r+d*i.boxMargin,Math.max),u!=="activation"&&(a.updateVal(f,"startx",t-d*i.boxMargin,Math.min),a.updateVal(f,"stopx",r+d*i.boxMargin,Math.max),a.updateVal(rl.data,"starty",e-d*i.boxMargin,Math.min),a.updateVal(rl.data,"stopy",n+d*i.boxMargin,Math.max))},"updateItemBounds")}o(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:o(function(t,e,r,n){let i=Math.min(t,r),a=Math.max(t,r),s=Math.min(e,n),l=Math.max(e,n);this.updateVal(rl.data,"startx",i,Math.min),this.updateVal(rl.data,"starty",s,Math.min),this.updateVal(rl.data,"stopx",a,Math.max),this.updateVal(rl.data,"stopy",l,Math.max),this.updateBounds(i,s,a,l)},"insert"),bumpVerticalPos:o(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:o(function(){return this.verticalPos},"getVerticalPos"),getBounds:o(function(){return this.data},"getBounds")},jP=Ul.sectionFills,Jpe=Ul.sectionColours,LWe=o(function(t,e,r){let n=me().journey,i="",a=n.height*2+n.diagramMarginY,s=r+a,l=0,u="#CCC",h="black",f=0;for(let[d,p]of e.entries()){if(i!==p.section){u=jP[l%jP.length],f=l%jP.length,h=Jpe[l%Jpe.length];let g=0,y=p.section;for(let x=d;x(th[y]&&(g[y]=th[y]),g),{});p.x=d*n.taskMargin+d*n.width+_f,p.y=s,p.width=n.diagramMarginX,p.height=n.diagramMarginY,p.colour=h,p.fill=u,p.num=f,p.actors=m,z1.drawTask(t,p,n),rl.insert(p.x,p.y,p.x+p.width+n.taskMargin,300+5*30)}},"drawTasks"),KP={setConf:AWe,draw:DWe}});var t0e={};ur(t0e,{diagram:()=>RWe});var RWe,r0e=N(()=>{"use strict";Upe();Wpe();Ype();e0e();RWe={parser:Vpe,db:YP,renderer:KP,styles:qpe,init:o(t=>{KP.setConf(t.journey),YP.clear()},"init")}});var ZP,c0e,u0e=N(()=>{"use strict";ZP=function(){var t=o(function(p,m,g,y){for(g=g||{},y=p.length;y--;g[p[y]]=m);return g},"o"),e=[6,8,10,11,12,14,16,17,20,21],r=[1,9],n=[1,10],i=[1,11],a=[1,12],s=[1,13],l=[1,16],u=[1,17],h={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:o(function(m,g,y,v,x,b,T){var S=b.length-1;switch(x){case 1:return b[S-1];case 2:this.$=[];break;case 3:b[S-1].push(b[S]),this.$=b[S-1];break;case 4:case 5:this.$=b[S];break;case 6:case 7:this.$=[];break;case 8:v.getCommonDb().setDiagramTitle(b[S].substr(6)),this.$=b[S].substr(6);break;case 9:this.$=b[S].trim(),v.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=b[S].trim(),v.getCommonDb().setAccDescription(this.$);break;case 12:v.addSection(b[S].substr(8)),this.$=b[S].substr(8);break;case 15:v.addTask(b[S],0,""),this.$=b[S];break;case 16:v.addEvent(b[S].substr(2)),this.$=b[S];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:r,12:n,14:i,16:a,17:s,18:14,19:15,20:l,21:u},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:o(function(m,g){if(g.recoverable)this.trace(m);else{var y=new Error(m);throw y.hash=g,y}},"parseError"),parse:o(function(m){var g=this,y=[0],v=[],x=[null],b=[],T=this.table,S="",w=0,E=0,_=0,C=2,D=1,O=b.slice.call(arguments,1),R=Object.create(this.lexer),k={yy:{}};for(var L in this.yy)Object.prototype.hasOwnProperty.call(this.yy,L)&&(k.yy[L]=this.yy[L]);R.setInput(m,k.yy),k.yy.lexer=R,k.yy.parser=this,typeof R.yylloc>"u"&&(R.yylloc={});var A=R.yylloc;b.push(A);var I=R.options&&R.options.ranges;typeof k.yy.parseError=="function"?this.parseError=k.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function M(j){y.length=y.length-2*j,x.length=x.length-j,b.length=b.length-j}o(M,"popStack");function P(){var j;return j=v.pop()||R.lex()||D,typeof j!="number"&&(j instanceof Array&&(v=j,j=v.pop()),j=g.symbols_[j]||j),j}o(P,"lex");for(var B,F,z,$,U,K,ee={},Y,ce,Z,ue;;){if(z=y[y.length-1],this.defaultActions[z]?$=this.defaultActions[z]:((B===null||typeof B>"u")&&(B=P()),$=T[z]&&T[z][B]),typeof $>"u"||!$.length||!$[0]){var Q="";ue=[];for(Y in T[z])this.terminals_[Y]&&Y>C&&ue.push("'"+this.terminals_[Y]+"'");R.showPosition?Q="Parse error on line "+(w+1)+`: -`+R.showPosition()+` -Expecting `+ue.join(", ")+", got '"+(this.terminals_[B]||B)+"'":Q="Parse error on line "+(w+1)+": Unexpected "+(B==D?"end of input":"'"+(this.terminals_[B]||B)+"'"),this.parseError(Q,{text:R.match,token:this.terminals_[B]||B,line:R.yylineno,loc:A,expected:ue})}if($[0]instanceof Array&&$.length>1)throw new Error("Parse Error: multiple actions possible at state: "+z+", token: "+B);switch($[0]){case 1:y.push(B),x.push(R.yytext),b.push(R.yylloc),y.push($[1]),B=null,F?(B=F,F=null):(E=R.yyleng,S=R.yytext,w=R.yylineno,A=R.yylloc,_>0&&_--);break;case 2:if(ce=this.productions_[$[1]][1],ee.$=x[x.length-ce],ee._$={first_line:b[b.length-(ce||1)].first_line,last_line:b[b.length-1].last_line,first_column:b[b.length-(ce||1)].first_column,last_column:b[b.length-1].last_column},I&&(ee._$.range=[b[b.length-(ce||1)].range[0],b[b.length-1].range[1]]),K=this.performAction.apply(ee,[S,E,w,k.yy,$[1],x,b].concat(O)),typeof K<"u")return K;ce&&(y=y.slice(0,-1*ce*2),x=x.slice(0,-1*ce),b=b.slice(0,-1*ce)),y.push(this.productions_[$[1]][0]),x.push(ee.$),b.push(ee._$),Z=T[y[y.length-2]][y[y.length-1]],y.push(Z);break;case 3:return!0}}return!0},"parse")},f=function(){var p={EOF:1,parseError:o(function(g,y){if(this.yy.parser)this.yy.parser.parseError(g,y);else throw new Error(g)},"parseError"),setInput:o(function(m,g){return this.yy=g||this.yy||{},this._input=m,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var m=this._input[0];this.yytext+=m,this.yyleng++,this.offset++,this.match+=m,this.matched+=m;var g=m.match(/(?:\r\n?|\n).*/g);return g?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),m},"input"),unput:o(function(m){var g=m.length,y=m.split(/(?:\r\n?|\n)/g);this._input=m+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-g),this.offset-=g;var v=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),y.length-1&&(this.yylineno-=y.length-1);var x=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:y?(y.length===v.length?this.yylloc.first_column:0)+v[v.length-y.length].length-y[0].length:this.yylloc.first_column-g},this.options.ranges&&(this.yylloc.range=[x[0],x[0]+this.yyleng-g]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(m){this.unput(this.match.slice(m))},"less"),pastInput:o(function(){var m=this.matched.substr(0,this.matched.length-this.match.length);return(m.length>20?"...":"")+m.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var m=this.match;return m.length<20&&(m+=this._input.substr(0,20-m.length)),(m.substr(0,20)+(m.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var m=this.pastInput(),g=new Array(m.length+1).join("-");return m+this.upcomingInput()+` -`+g+"^"},"showPosition"),test_match:o(function(m,g){var y,v,x;if(this.options.backtrack_lexer&&(x={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(x.yylloc.range=this.yylloc.range.slice(0))),v=m[0].match(/(?:\r\n?|\n).*/g),v&&(this.yylineno+=v.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:v?v[v.length-1].length-v[v.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+m[0].length},this.yytext+=m[0],this.match+=m[0],this.matches=m,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(m[0].length),this.matched+=m[0],y=this.performAction.call(this,this.yy,this,g,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),y)return y;if(this._backtrack){for(var b in x)this[b]=x[b];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var m,g,y,v;this._more||(this.yytext="",this.match="");for(var x=this._currentRules(),b=0;bg[0].length)){if(g=y,v=b,this.options.backtrack_lexer){if(m=this.test_match(y,x[b]),m!==!1)return m;if(this._backtrack){g=!1;continue}else return!1}else if(!this.options.flex)break}return g?(m=this.test_match(g,x[v]),m!==!1?m:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var g=this.next();return g||this.lex()},"lex"),begin:o(function(g){this.conditionStack.push(g)},"begin"),popState:o(function(){var g=this.conditionStack.length-1;return g>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(g){return g=this.conditionStack.length-1-Math.abs(g||0),g>=0?this.conditionStack[g]:"INITIAL"},"topState"),pushState:o(function(g){this.begin(g)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(g,y,v,x){var b=x;switch(v){case 0:break;case 1:break;case 2:return 10;case 3:break;case 4:break;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;break;case 8:return this.popState(),"acc_title_value";break;case 9:return this.begin("acc_descr"),14;break;case 10:return this.popState(),"acc_descr_value";break;case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}};return p}();h.lexer=f;function d(){this.yy={}}return o(d,"Parser"),d.prototype=h,h.Parser=d,new d}();ZP.parser=ZP;c0e=ZP});var eB={};ur(eB,{addEvent:()=>x0e,addSection:()=>m0e,addTask:()=>v0e,addTaskOrg:()=>b0e,clear:()=>p0e,default:()=>zWe,getCommonDb:()=>d0e,getSections:()=>g0e,getTasks:()=>y0e});var G1,f0e,JP,f6,V1,d0e,p0e,m0e,g0e,y0e,v0e,x0e,b0e,h0e,zWe,T0e=N(()=>{"use strict";ci();G1="",f0e=0,JP=[],f6=[],V1=[],d0e=o(()=>rv,"getCommonDb"),p0e=o(function(){JP.length=0,f6.length=0,G1="",V1.length=0,kr()},"clear"),m0e=o(function(t){G1=t,JP.push(t)},"addSection"),g0e=o(function(){return JP},"getSections"),y0e=o(function(){let t=h0e(),e=100,r=0;for(;!t&&rr.id===f0e-1).events.push(t)},"addEvent"),b0e=o(function(t){let e={section:G1,type:G1,description:t,task:t,classes:[]};f6.push(e)},"addTaskOrg"),h0e=o(function(){let t=o(function(r){return V1[r].processed},"compileTask"),e=!0;for(let[r,n]of V1.entries())t(r),e=e&&n.processed;return e},"compileTasks"),zWe={clear:p0e,getCommonDb:d0e,addSection:m0e,getSections:g0e,getTasks:y0e,addTask:v0e,addTaskOrg:b0e,addEvent:x0e}});function S0e(t,e){t.each(function(){var r=Ge(this),n=r.text().split(/(\s+|
    )/).reverse(),i,a=[],s=1.1,l=r.attr("y"),u=parseFloat(r.attr("dy")),h=r.text(null).append("tspan").attr("x",0).attr("y",l).attr("dy",u+"em");for(let f=0;fe||i==="
    ")&&(a.pop(),h.text(a.join(" ").trim()),i==="
    "?a=[""]:a=[i],h=r.append("tspan").attr("x",0).attr("y",l).attr("dy",s+"em").text(i))})}var GWe,d6,VWe,UWe,k0e,HWe,WWe,w0e,qWe,YWe,XWe,tB,E0e,jWe,KWe,QWe,ZWe,Df,C0e=N(()=>{"use strict";fr();GWe=12,d6=o(function(t,e){let r=t.append("rect");return r.attr("x",e.x),r.attr("y",e.y),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("width",e.width),r.attr("height",e.height),r.attr("rx",e.rx),r.attr("ry",e.ry),e.class!==void 0&&r.attr("class",e.class),r},"drawRect"),VWe=o(function(t,e){let n=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",15).attr("stroke-width",2).attr("overflow","visible"),i=t.append("g");i.append("circle").attr("cx",e.cx-15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),i.append("circle").attr("cx",e.cx+15/3).attr("cy",e.cy-15/3).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666");function a(u){let h=Sl().startAngle(Math.PI/2).endAngle(3*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}o(a,"smile");function s(u){let h=Sl().startAngle(3*Math.PI/2).endAngle(5*(Math.PI/2)).innerRadius(7.5).outerRadius(6.8181818181818175);u.append("path").attr("class","mouth").attr("d",h).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}o(s,"sad");function l(u){u.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return o(l,"ambivalent"),e.score>3?a(i):e.score<3?s(i):l(i),n},"drawFace"),UWe=o(function(t,e){let r=t.append("circle");return r.attr("cx",e.cx),r.attr("cy",e.cy),r.attr("class","actor-"+e.pos),r.attr("fill",e.fill),r.attr("stroke",e.stroke),r.attr("r",e.r),r.class!==void 0&&r.attr("class",r.class),e.title!==void 0&&r.append("title").text(e.title),r},"drawCircle"),k0e=o(function(t,e){let r=e.text.replace(//gi," "),n=t.append("text");n.attr("x",e.x),n.attr("y",e.y),n.attr("class","legend"),n.style("text-anchor",e.anchor),e.class!==void 0&&n.attr("class",e.class);let i=n.append("tspan");return i.attr("x",e.x+e.textMargin*2),i.text(r),n},"drawText"),HWe=o(function(t,e){function r(i,a,s,l,u){return i+","+a+" "+(i+s)+","+a+" "+(i+s)+","+(a+l-u)+" "+(i+s-u*1.2)+","+(a+l)+" "+i+","+(a+l)}o(r,"genPoints");let n=t.append("polygon");n.attr("points",r(e.x,e.y,50,20,7)),n.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,k0e(t,e)},"drawLabel"),WWe=o(function(t,e,r){let n=t.append("g"),i=tB();i.x=e.x,i.y=e.y,i.fill=e.fill,i.width=r.width,i.height=r.height,i.class="journey-section section-type-"+e.num,i.rx=3,i.ry=3,d6(n,i),E0e(r)(e.text,n,i.x,i.y,i.width,i.height,{class:"journey-section section-type-"+e.num},r,e.colour)},"drawSection"),w0e=-1,qWe=o(function(t,e,r){let n=e.x+r.width/2,i=t.append("g");w0e++;let a=300+5*30;i.append("line").attr("id","task"+w0e).attr("x1",n).attr("y1",e.y).attr("x2",n).attr("y2",a).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),VWe(i,{cx:n,cy:300+(5-e.score)*30,score:e.score});let s=tB();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=r.width,s.height=r.height,s.class="task task-type-"+e.num,s.rx=3,s.ry=3,d6(i,s),E0e(r)(e.task,i,s.x,s.y,s.width,s.height,{class:"task"},r,e.colour)},"drawTask"),YWe=o(function(t,e){d6(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),XWe=o(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),tB=o(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),E0e=function(){function t(i,a,s,l,u,h,f,d){let p=a.append("text").attr("x",s+u/2).attr("y",l+h/2+5).style("font-color",d).style("text-anchor","middle").text(i);n(p,f)}o(t,"byText");function e(i,a,s,l,u,h,f,d,p){let{taskFontSize:m,taskFontFamily:g}=d,y=i.split(//gi);for(let v=0;v{"use strict";fr();C0e();yt();Gt();xi();JWe=o(function(t,e,r,n){let i=me(),a=i.timeline?.leftMargin??50;X.debug("timeline",n.db);let s=i.securityLevel,l;s==="sandbox"&&(l=Ge("#i"+e));let h=(s==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body")).select("#"+e);h.append("g");let f=n.db.getTasks(),d=n.db.getCommonDb().getDiagramTitle();X.debug("task",f),Df.initGraphics(h);let p=n.db.getSections();X.debug("sections",p);let m=0,g=0,y=0,v=0,x=50+a,b=50;v=50;let T=0,S=!0;p.forEach(function(D){let O={number:T,descr:D,section:T,width:150,padding:20,maxHeight:m},R=Df.getVirtualNodeHeight(h,O,i);X.debug("sectionHeight before draw",R),m=Math.max(m,R+20)});let w=0,E=0;X.debug("tasks.length",f.length);for(let[D,O]of f.entries()){let R={number:D,descr:O,section:O.section,width:150,padding:20,maxHeight:g},k=Df.getVirtualNodeHeight(h,R,i);X.debug("taskHeight before draw",k),g=Math.max(g,k+20),w=Math.max(w,O.events.length);let L=0;for(let A of O.events){let I={descr:A,section:O.section,number:O.section,width:150,padding:20,maxHeight:50};L+=Df.getVirtualNodeHeight(h,I,i)}O.events.length>0&&(L+=(O.events.length-1)*10),E=Math.max(E,L)}X.debug("maxSectionHeight before draw",m),X.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(D=>{let O=f.filter(A=>A.section===D),R={number:T,descr:D,section:T,width:200*Math.max(O.length,1)-50,padding:20,maxHeight:m};X.debug("sectionNode",R);let k=h.append("g"),L=Df.drawNode(k,R,T,i);X.debug("sectionNode output",L),k.attr("transform",`translate(${x}, ${v})`),b+=m+50,O.length>0&&A0e(h,O,T,x,b,g,i,w,E,m,!1),x+=200*Math.max(O.length,1),b=v,T++}):(S=!1,A0e(h,f,T,x,b,g,i,w,E,m,!0));let _=h.node().getBBox();X.debug("bounds",_),d&&h.append("text").text(d).attr("x",_.width/2-a).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),y=S?m+g+150:g+100,h.append("g").attr("class","lineWrapper").append("line").attr("x1",a).attr("y1",y).attr("x2",_.width+3*a).attr("y2",y).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),Lo(void 0,h,i.timeline?.padding??50,i.timeline?.useMaxWidth??!1)},"draw"),A0e=o(function(t,e,r,n,i,a,s,l,u,h,f){for(let d of e){let p={descr:d.task,section:r,number:r,width:150,padding:20,maxHeight:a};X.debug("taskNode",p);let m=t.append("g").attr("class","taskWrapper"),y=Df.drawNode(m,p,r,s).height;if(X.debug("taskHeight after draw",y),m.attr("transform",`translate(${n}, ${i})`),a=Math.max(a,y),d.events){let v=t.append("g").attr("class","lineWrapper"),x=a;i+=100,x=x+eqe(t,d.events,r,n,i,s),i-=100,v.append("line").attr("x1",n+190/2).attr("y1",i+a).attr("x2",n+190/2).attr("y2",i+a+100+u+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}n=n+200,f&&!s.timeline?.disableMulticolor&&r++}i=i-10},"drawTasks"),eqe=o(function(t,e,r,n,i,a){let s=0,l=i;i=i+100;for(let u of e){let h={descr:u,section:r,number:r,width:150,padding:20,maxHeight:50};X.debug("eventNode",h);let f=t.append("g").attr("class","eventWrapper"),p=Df.drawNode(f,h,r,a).height;s=s+p,f.attr("transform",`translate(${n}, ${i})`),i=i+10+p}return i=l,s},"drawEvents"),_0e={setConf:o(()=>{},"setConf"),draw:JWe}});var tqe,rqe,L0e,R0e=N(()=>{"use strict";Ks();tqe=o(t=>{let e="";for(let r=0;r` - .edge { - stroke-width: 3; - } - ${tqe(t)} - .section-root rect, .section-root path, .section-root circle { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .eventWrapper { - filter: brightness(120%); - } -`,"getStyles"),L0e=rqe});var N0e={};ur(N0e,{diagram:()=>nqe});var nqe,M0e=N(()=>{"use strict";u0e();T0e();D0e();R0e();nqe={db:eB,renderer:_0e,parser:c0e,styles:L0e}});var rB,P0e,B0e=N(()=>{"use strict";rB=function(){var t=o(function(S,w,E,_){for(E=E||{},_=S.length;_--;E[S[_]]=w);return E},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,6,13,15,16,19,22],g=[1,33],y=[1,34],v=[1,6,7,11,13,15,16,19,22],x={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:o(function(w,E,_,C,D,O,R){var k=O.length-1;switch(D){case 6:case 7:return C;case 8:C.getLogger().trace("Stop NL ");break;case 9:C.getLogger().trace("Stop EOF ");break;case 11:C.getLogger().trace("Stop NL2 ");break;case 12:C.getLogger().trace("Stop EOF2 ");break;case 15:C.getLogger().info("Node: ",O[k].id),C.addNode(O[k-1].length,O[k].id,O[k].descr,O[k].type);break;case 16:C.getLogger().trace("Icon: ",O[k]),C.decorateNode({icon:O[k]});break;case 17:case 21:C.decorateNode({class:O[k]});break;case 18:C.getLogger().trace("SPACELIST");break;case 19:C.getLogger().trace("Node: ",O[k].id),C.addNode(0,O[k].id,O[k].descr,O[k].type);break;case 20:C.decorateNode({icon:O[k]});break;case 25:C.getLogger().trace("node found ..",O[k-2]),this.$={id:O[k-1],descr:O[k-1],type:C.getType(O[k-2],O[k])};break;case 26:this.$={id:O[k],descr:O[k],type:C.nodeType.DEFAULT};break;case 27:C.getLogger().trace("node found ..",O[k-3]),this.$={id:O[k-3],descr:O[k-1],type:C.getType(O[k-2],O[k])};break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:r,9:22,12:11,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},{6:h,7:f,10:23,11:d},t(p,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:s,22:l}),t(p,[2,18]),t(p,[2,19]),t(p,[2,20]),t(p,[2,21]),t(p,[2,23]),t(p,[2,24]),t(p,[2,26],{19:[1,30]}),{20:[1,31]},{6:h,7:f,10:32,11:d},{1:[2,7],6:r,12:21,13:n,14:14,15:i,16:a,17:17,18:18,19:s,22:l},t(m,[2,14],{7:g,11:y}),t(v,[2,8]),t(v,[2,9]),t(v,[2,10]),t(p,[2,15]),t(p,[2,16]),t(p,[2,17]),{20:[1,35]},{21:[1,36]},t(m,[2,13],{7:g,11:y}),t(v,[2,11]),t(v,[2,12]),{21:[1,37]},t(p,[2,25]),t(p,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(w,E){if(E.recoverable)this.trace(w);else{var _=new Error(w);throw _.hash=E,_}},"parseError"),parse:o(function(w){var E=this,_=[0],C=[],D=[null],O=[],R=this.table,k="",L=0,A=0,I=0,M=2,P=1,B=O.slice.call(arguments,1),F=Object.create(this.lexer),z={yy:{}};for(var $ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,$)&&(z.yy[$]=this.yy[$]);F.setInput(w,z.yy),z.yy.lexer=F,z.yy.parser=this,typeof F.yylloc>"u"&&(F.yylloc={});var U=F.yylloc;O.push(U);var K=F.options&&F.options.ranges;typeof z.yy.parseError=="function"?this.parseError=z.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function ee(ae){_.length=_.length-2*ae,D.length=D.length-ae,O.length=O.length-ae}o(ee,"popStack");function Y(){var ae;return ae=C.pop()||F.lex()||P,typeof ae!="number"&&(ae instanceof Array&&(C=ae,ae=C.pop()),ae=E.symbols_[ae]||ae),ae}o(Y,"lex");for(var ce,Z,ue,Q,j,ne,te={},he,le,J,Se;;){if(ue=_[_.length-1],this.defaultActions[ue]?Q=this.defaultActions[ue]:((ce===null||typeof ce>"u")&&(ce=Y()),Q=R[ue]&&R[ue][ce]),typeof Q>"u"||!Q.length||!Q[0]){var se="";Se=[];for(he in R[ue])this.terminals_[he]&&he>M&&Se.push("'"+this.terminals_[he]+"'");F.showPosition?se="Parse error on line "+(L+1)+`: -`+F.showPosition()+` -Expecting `+Se.join(", ")+", got '"+(this.terminals_[ce]||ce)+"'":se="Parse error on line "+(L+1)+": Unexpected "+(ce==P?"end of input":"'"+(this.terminals_[ce]||ce)+"'"),this.parseError(se,{text:F.match,token:this.terminals_[ce]||ce,line:F.yylineno,loc:U,expected:Se})}if(Q[0]instanceof Array&&Q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ue+", token: "+ce);switch(Q[0]){case 1:_.push(ce),D.push(F.yytext),O.push(F.yylloc),_.push(Q[1]),ce=null,Z?(ce=Z,Z=null):(A=F.yyleng,k=F.yytext,L=F.yylineno,U=F.yylloc,I>0&&I--);break;case 2:if(le=this.productions_[Q[1]][1],te.$=D[D.length-le],te._$={first_line:O[O.length-(le||1)].first_line,last_line:O[O.length-1].last_line,first_column:O[O.length-(le||1)].first_column,last_column:O[O.length-1].last_column},K&&(te._$.range=[O[O.length-(le||1)].range[0],O[O.length-1].range[1]]),ne=this.performAction.apply(te,[k,A,L,z.yy,Q[1],D,O].concat(B)),typeof ne<"u")return ne;le&&(_=_.slice(0,-1*le*2),D=D.slice(0,-1*le),O=O.slice(0,-1*le)),_.push(this.productions_[Q[1]][0]),D.push(te.$),O.push(te._$),J=R[_[_.length-2]][_[_.length-1]],_.push(J);break;case 3:return!0}}return!0},"parse")},b=function(){var S={EOF:1,parseError:o(function(E,_){if(this.yy.parser)this.yy.parser.parseError(E,_);else throw new Error(E)},"parseError"),setInput:o(function(w,E){return this.yy=E||this.yy||{},this._input=w,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var w=this._input[0];this.yytext+=w,this.yyleng++,this.offset++,this.match+=w,this.matched+=w;var E=w.match(/(?:\r\n?|\n).*/g);return E?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),w},"input"),unput:o(function(w){var E=w.length,_=w.split(/(?:\r\n?|\n)/g);this._input=w+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-E),this.offset-=E;var C=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),_.length-1&&(this.yylineno-=_.length-1);var D=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:_?(_.length===C.length?this.yylloc.first_column:0)+C[C.length-_.length].length-_[0].length:this.yylloc.first_column-E},this.options.ranges&&(this.yylloc.range=[D[0],D[0]+this.yyleng-E]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(w){this.unput(this.match.slice(w))},"less"),pastInput:o(function(){var w=this.matched.substr(0,this.matched.length-this.match.length);return(w.length>20?"...":"")+w.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var w=this.match;return w.length<20&&(w+=this._input.substr(0,20-w.length)),(w.substr(0,20)+(w.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var w=this.pastInput(),E=new Array(w.length+1).join("-");return w+this.upcomingInput()+` -`+E+"^"},"showPosition"),test_match:o(function(w,E){var _,C,D;if(this.options.backtrack_lexer&&(D={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(D.yylloc.range=this.yylloc.range.slice(0))),C=w[0].match(/(?:\r\n?|\n).*/g),C&&(this.yylineno+=C.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:C?C[C.length-1].length-C[C.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+w[0].length},this.yytext+=w[0],this.match+=w[0],this.matches=w,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(w[0].length),this.matched+=w[0],_=this.performAction.call(this,this.yy,this,E,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),_)return _;if(this._backtrack){for(var O in D)this[O]=D[O];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var w,E,_,C;this._more||(this.yytext="",this.match="");for(var D=this._currentRules(),O=0;OE[0].length)){if(E=_,C=O,this.options.backtrack_lexer){if(w=this.test_match(_,D[O]),w!==!1)return w;if(this._backtrack){E=!1;continue}else return!1}else if(!this.options.flex)break}return E?(w=this.test_match(E,D[C]),w!==!1?w:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var E=this.next();return E||this.lex()},"lex"),begin:o(function(E){this.conditionStack.push(E)},"begin"),popState:o(function(){var E=this.conditionStack.length-1;return E>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(E){return E=this.conditionStack.length-1-Math.abs(E||0),E>=0?this.conditionStack[E]:"INITIAL"},"topState"),pushState:o(function(E){this.begin(E)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(E,_,C,D){var O=D;switch(C){case 0:return E.getLogger().trace("Found comment",_.yytext),6;break;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;break;case 4:this.popState();break;case 5:E.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return E.getLogger().trace("SPACELINE"),6;break;case 7:return 7;case 8:return 15;case 9:E.getLogger().trace("end icon"),this.popState();break;case 10:return E.getLogger().trace("Exploding node"),this.begin("NODE"),19;break;case 11:return E.getLogger().trace("Cloud"),this.begin("NODE"),19;break;case 12:return E.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;break;case 13:return E.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;break;case 14:return this.begin("NODE"),19;break;case 15:return this.begin("NODE"),19;break;case 16:return this.begin("NODE"),19;break;case 17:return this.begin("NODE"),19;break;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 23:this.popState();break;case 24:E.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return E.getLogger().trace("description:",_.yytext),"NODE_DESCR";break;case 26:this.popState();break;case 27:return this.popState(),E.getLogger().trace("node end ))"),"NODE_DEND";break;case 28:return this.popState(),E.getLogger().trace("node end )"),"NODE_DEND";break;case 29:return this.popState(),E.getLogger().trace("node end ...",_.yytext),"NODE_DEND";break;case 30:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 31:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 32:return this.popState(),E.getLogger().trace("node end (-"),"NODE_DEND";break;case 33:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 34:return this.popState(),E.getLogger().trace("node end (("),"NODE_DEND";break;case 35:return E.getLogger().trace("Long description:",_.yytext),20;break;case 36:return E.getLogger().trace("Long description:",_.yytext),20;break}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}};return S}();x.lexer=b;function T(){this.yy={}}return o(T,"Parser"),T.prototype=x,x.Parser=T,new T}();rB.parser=rB;P0e=rB});var oqe,p6,F0e=N(()=>{"use strict";Gt();pr();yt();_a();oqe={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},p6=class{constructor(){this.nodes=[];this.count=0;this.elements={};this.getLogger=this.getLogger.bind(this),this.nodeType=oqe,this.clear(),this.getType=this.getType.bind(this),this.getMindmap=this.getMindmap.bind(this),this.getElementById=this.getElementById.bind(this),this.getParent=this.getParent.bind(this),this.getMindmap=this.getMindmap.bind(this),this.addNode=this.addNode.bind(this),this.decorateNode=this.decorateNode.bind(this)}static{o(this,"MindmapDB")}clear(){this.nodes=[],this.count=0,this.elements={}}getParent(e){for(let r=this.nodes.length-1;r>=0;r--)if(this.nodes[r].level0?this.nodes[0]:null}addNode(e,r,n,i){X.info("addNode",e,r,n,i);let a=me(),s=a.mindmap?.padding??or.mindmap.padding;switch(i){case this.nodeType.ROUNDED_RECT:case this.nodeType.RECT:case this.nodeType.HEXAGON:s*=2;break}let l={id:this.count++,nodeId:wr(r,a),level:e,descr:wr(n,a),type:i,children:[],width:a.mindmap?.maxNodeWidth??or.mindmap.maxNodeWidth,padding:s},u=this.getParent(e);if(u)u.children.push(l),this.nodes.push(l);else if(this.nodes.length===0)this.nodes.push(l);else throw new Error(`There can be only one root. No parent could be found for ("${l.descr}")`)}getType(e,r){switch(X.debug("In get type",e,r),e){case"[":return this.nodeType.RECT;case"(":return r===")"?this.nodeType.ROUNDED_RECT:this.nodeType.CLOUD;case"((":return this.nodeType.CIRCLE;case")":return this.nodeType.CLOUD;case"))":return this.nodeType.BANG;case"{{":return this.nodeType.HEXAGON;default:return this.nodeType.DEFAULT}}setElementForId(e,r){this.elements[e]=r}getElementById(e){return this.elements[e]}decorateNode(e){if(!e)return;let r=me(),n=this.nodes[this.nodes.length-1];e.icon&&(n.icon=wr(e.icon,r)),e.class&&(n.class=wr(e.class,r))}type2Str(e){switch(e){case this.nodeType.DEFAULT:return"no-border";case this.nodeType.RECT:return"rect";case this.nodeType.ROUNDED_RECT:return"rounded-rect";case this.nodeType.CIRCLE:return"circle";case this.nodeType.CLOUD:return"cloud";case this.nodeType.BANG:return"bang";case this.nodeType.HEXAGON:return"hexgon";default:return"no-border"}}getLogger(){return X}}});function qi(t){"@babel/helpers - typeof";return qi=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},qi(t)}function Vf(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function $0e(t,e){for(var r=0;rt.length)&&(e=t.length);for(var r=0,n=new Array(e);r=t.length?{done:!0}:{done:!1,value:t[n++]}},"n"),e:o(function(u){throw u},"e"),f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. -In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a=!0,s=!1,l;return{s:o(function(){r=r.call(t)},"s"),n:o(function(){var u=r.next();return a=u.done,u},"n"),e:o(function(u){s=!0,l=u},"e"),f:o(function(){try{!a&&r.return!=null&&r.return()}finally{if(s)throw l}},"f")}}function Pqe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}function Bqe(t,e){return e={exports:{}},t(e,e.exports),e.exports}function Hqe(t){for(var e=t.length;e--&&Uqe.test(t.charAt(e)););return e}function Yqe(t){return t&&t.slice(0,Wqe(t)+1).replace(qqe,"")}function Zqe(t){var e=Kqe.call(t,Fb),r=t[Fb];try{t[Fb]=void 0;var n=!0}catch{}var i=Qqe.call(t);return n&&(e?t[Fb]=r:delete t[Fb]),i}function rYe(t){return tYe.call(t)}function sYe(t){return t==null?t===void 0?aYe:iYe:V0e&&V0e in Object(t)?Jqe(t):nYe(t)}function oYe(t){return t!=null&&typeof t=="object"}function uYe(t){return typeof t=="symbol"||lYe(t)&&mge(t)==cYe}function mYe(t){if(typeof t=="number")return t;if(d4(t))return U0e;if(Kp(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Kp(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Xqe(t);var r=fYe.test(t);return r||dYe.test(t)?pYe(t.slice(2),r?2:8):hYe.test(t)?U0e:+t}function xYe(t,e,r){var n,i,a,s,l,u,h=0,f=!1,d=!1,p=!0;if(typeof t!="function")throw new TypeError(gYe);e=H0e(e)||0,Kp(r)&&(f=!!r.leading,d="maxWait"in r,a=d?yYe(H0e(r.maxWait)||0,e):a,p="trailing"in r?!!r.trailing:p);function m(E){var _=n,C=i;return n=i=void 0,h=E,s=t.apply(C,_),s}o(m,"invokeFunc");function g(E){return h=E,l=setTimeout(x,e),f?m(E):s}o(g,"leadingEdge");function y(E){var _=E-u,C=E-h,D=e-_;return d?vYe(D,a-C):D}o(y,"remainingWait");function v(E){var _=E-u,C=E-h;return u===void 0||_>=e||_<0||d&&C>=a}o(v,"shouldInvoke");function x(){var E=nB();if(v(E))return b(E);l=setTimeout(x,y(E))}o(x,"timerExpired");function b(E){return l=void 0,p&&n?m(E):(n=i=void 0,s)}o(b,"trailingEdge");function T(){l!==void 0&&clearTimeout(l),h=0,n=u=i=l=void 0}o(T,"cancel");function S(){return l===void 0?s:b(nB())}o(S,"flush");function w(){var E=nB(),_=v(E);if(n=arguments,i=this,u=E,_){if(l===void 0)return g(u);if(d)return clearTimeout(l),l=setTimeout(x,e),m(u)}return l===void 0&&(l=setTimeout(x,e)),s}return o(w,"debounced"),w.cancel=T,w.flush=S,w}function eC(t,e,r,n,i,a){var s;return li(t)?s=t:s=ny[t]||ny.euclidean,e===0&&li(t)?s(i,a):s(e,r,n,i,a)}function hje(t,e){if(tC(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||d4(t)?!0:uje.test(t)||!cje.test(t)||e!=null&&t in Object(e)}function yje(t){if(!Kp(t))return!1;var e=mge(t);return e==pje||e==mje||e==dje||e==gje}function bje(t){return!!ume&&ume in t}function Eje(t){if(t!=null){try{return kje.call(t)}catch{}try{return t+""}catch{}}return""}function Mje(t){if(!Kp(t)||Tje(t))return!1;var e=vje(t)?Nje:Aje;return e.test(Sje(t))}function Oje(t,e){return t?.[e]}function Bje(t,e){var r=Pje(t,e);return Ije(r)?r:void 0}function $je(){this.__data__=s4?s4(null):{},this.size=0}function Gje(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}function qje(t){var e=this.__data__;if(s4){var r=e[t];return r===Uje?void 0:r}return Wje.call(e,t)?e[t]:void 0}function Kje(t){var e=this.__data__;return s4?e[t]!==void 0:jje.call(e,t)}function Jje(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=s4&&e===void 0?Zje:e,this}function oy(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1}function dKe(t,e){var r=this.__data__,n=rC(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this}function ly(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e-1&&t%1==0&&t0;){var f=i.shift();e(f),a.add(f.id()),l&&n(i,a,f)}return t}function Xge(t,e,r){if(r.isParent())for(var n=r._private.children,i=0;i0&&arguments[0]!==void 0?arguments[0]:QQe,e=arguments.length>1?arguments[1]:void 0,r=0;r0?k=A:R=A;while(Math.abs(L)>s&&++I=a?b(O,I):M===0?I:S(O,R,R+h)}o(w,"getTForX");var E=!1;function _(){E=!0,(t!==e||r!==n)&&T()}o(_,"precompute");var C=o(function(R){return E||_(),t===e&&r===n?R:R===0?0:R===1?1:v(w(R),e,n)},"f");C.getControlPoints=function(){return[{x:t,y:e},{x:r,y:n}]};var D="generateBezier("+[t,e,r,n]+")";return C.toString=function(){return D},C}function Dme(t,e,r,n,i){if(n===1||e===r)return r;var a=i(e,r,n);return t==null||((t.roundValue||t.color)&&(a=Math.round(a)),t.min!==void 0&&(a=Math.max(a,t.min)),t.max!==void 0&&(a=Math.min(a,t.max))),a}function Lme(t,e){return t.pfValue!=null||t.value!=null?t.pfValue!=null&&(e==null||e.type.units!=="%")?t.pfValue:t.value:t}function W1(t,e,r,n,i){var a=i!=null?i.type:null;r<0?r=0:r>1&&(r=1);var s=Lme(t,i),l=Lme(e,i);if(_t(s)&&_t(l))return Dme(a,s,l,r,n);if(En(s)&&En(l)){for(var u=[],h=0;h0?(m==="spring"&&g.push(s.duration),s.easingImpl=M6[m].apply(null,g)):s.easingImpl=M6[m]}var y=s.easingImpl,v;if(s.duration===0?v=1:v=(r-u)/s.duration,s.applying&&(v=s.progress),v<0?v=0:v>1&&(v=1),s.delay==null){var x=s.startPosition,b=s.position;if(b&&i&&!t.locked()){var T={};Vb(x.x,b.x)&&(T.x=W1(x.x,b.x,v,y)),Vb(x.y,b.y)&&(T.y=W1(x.y,b.y,v,y)),t.position(T)}var S=s.startPan,w=s.pan,E=a.pan,_=w!=null&&n;_&&(Vb(S.x,w.x)&&(E.x=W1(S.x,w.x,v,y)),Vb(S.y,w.y)&&(E.y=W1(S.y,w.y,v,y)),t.emit("pan"));var C=s.startZoom,D=s.zoom,O=D!=null&&n;O&&(Vb(C,D)&&(a.zoom=i4(a.minZoom,W1(C,D,v,y),a.maxZoom)),t.emit("zoom")),(_||O)&&t.emit("viewport");var R=s.style;if(R&&R.length>0&&i){for(var k=0;k=0;_--){var C=E[_];C()}E.splice(0,E.length)},"callbacks"),b=m.length-1;b>=0;b--){var T=m[b],S=T._private;if(S.stopped){m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.frames);continue}!S.playing&&!S.applying||(S.playing&&S.applying&&(S.applying=!1),S.started||hZe(f,T,t),uZe(f,T,t,d),S.applying&&(S.applying=!1),x(S.frames),S.step!=null&&S.step(t),T.completed()&&(m.splice(b,1),S.hooked=!1,S.playing=!1,S.started=!1,x(S.completes)),y=!0)}return!d&&m.length===0&&g.length===0&&n.push(f),y}o(i,"stepOne");for(var a=!1,s=0;s0?e.notify("draw",r):e.notify("draw")),r.unmerge(n),e.emit("step")}function h1e(t){this.options=ir({},xZe,bZe,t)}function f1e(t){this.options=ir({},TZe,t)}function d1e(t){this.options=ir({},wZe,t)}function uC(t){this.options=ir({},kZe,t),this.options.layout=this;var e=this.options.eles.nodes(),r=this.options.eles.edges(),n=r.filter(function(i){var a=i.source().data("id"),s=i.target().data("id"),l=e.some(function(h){return h.data("id")===a}),u=e.some(function(h){return h.data("id")===s});return!l||!u});this.options.eles=this.options.eles.not(n)}function m1e(t){this.options=ir({},zZe,t)}function eF(t){this.options=ir({},GZe,t)}function g1e(t){this.options=ir({},VZe,t)}function y1e(t){this.options=ir({},UZe,t)}function v1e(t){this.options=t,this.notifications=0}function T1e(t,e){e.radius===0?t.lineTo(e.cx,e.cy):t.arc(e.cx,e.cy,e.radius,e.startAngle,e.endAngle,e.counterClockwise)}function rF(t,e,r,n){var i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0;return n===0||e.radius===0?{cx:e.x,cy:e.y,radius:0,startX:e.x,startY:e.y,stopX:e.x,stopY:e.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(qZe(t,e,r,n,i),{cx:_B,cy:DB,radius:Yp,startX:x1e,startY:b1e,stopX:LB,stopY:RB,startAngle:Kc.ang+Math.PI/2*Xp,endAngle:nl.ang-Math.PI/2*Xp,counterClockwise:P6})}function w1e(t){var e=[];if(t!=null){for(var r=0;r5&&arguments[5]!==void 0?arguments[5]:5,s=arguments.length>6?arguments[6]:void 0;t.beginPath(),t.moveTo(e+a,r),t.lineTo(e+n-a,r),t.quadraticCurveTo(e+n,r,e+n,r+a),t.lineTo(e+n,r+i-a),t.quadraticCurveTo(e+n,r+i,e+n-a,r+i),t.lineTo(e+a,r+i),t.quadraticCurveTo(e,r+i,e,r+i-a),t.lineTo(e,r+a),t.quadraticCurveTo(e,r,e+a,r),t.closePath(),s?t.stroke():t.fill()}function Kme(t,e,r){var n=t.createShader(e);if(t.shaderSource(n,r),t.compileShader(n),!t.getShaderParameter(n,t.COMPILE_STATUS))throw new Error(t.getShaderInfoLog(n));return n}function MJe(t,e,r){var n=Kme(t,t.VERTEX_SHADER,e),i=Kme(t,t.FRAGMENT_SHADER,r),a=t.createProgram();if(t.attachShader(a,n),t.attachShader(a,i),t.linkProgram(a),!t.getProgramParameter(a,t.LINK_STATUS))throw new Error("Could not initialize shaders");return a}function IJe(t,e,r){r===void 0&&(r=e);var n=t.makeOffscreenCanvas(e,r),i=n.context=n.getContext("2d");return n.clear=function(){return i.clearRect(0,0,n.width,n.height)},n.clear(),n}function aF(t){var e=t.pixelRatio,r=t.cy.zoom(),n=t.cy.pan();return{zoom:r*e,pan:{x:n.x*e,y:n.y*e}}}function gB(t,e,r,n,i){var a=n*r+e.x,s=i*r+e.y;return s=Math.round(t.canvasHeight-s),[a,s]}function A6(t,e,r){var n=t[0]/255,i=t[1]/255,a=t[2]/255,s=e,l=r||new Array(4);return l[0]=n*s,l[1]=i*s,l[2]=a*s,l[3]=s,l}function _6(t,e){var r=e||new Array(4);return r[0]=(t>>0&255)/255,r[1]=(t>>8&255)/255,r[2]=(t>>16&255)/255,r[3]=(t>>24&255)/255,r}function OJe(t){return t[0]+(t[1]<<8)+(t[2]<<16)+(t[3]<<24)}function PJe(t,e){var r=t.createTexture();return r.buffer=function(n){t.bindTexture(t.TEXTURE_2D,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.LINEAR),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.LINEAR_MIPMAP_NEAREST),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,n),t.generateMipmap(t.TEXTURE_2D),t.bindTexture(t.TEXTURE_2D,null)},r.deleteTexture=function(){t.deleteTexture(r)},r}function O1e(t,e){switch(e){case"float":return[1,t.FLOAT,4];case"vec2":return[2,t.FLOAT,4];case"vec3":return[3,t.FLOAT,4];case"vec4":return[4,t.FLOAT,4];case"int":return[1,t.INT,4];case"ivec2":return[2,t.INT,4]}}function P1e(t,e,r){switch(e){case t.FLOAT:return new Float32Array(r);case t.INT:return new Int32Array(r)}}function BJe(t,e,r,n,i,a){switch(e){case t.FLOAT:return new Float32Array(r.buffer,a*n,i);case t.INT:return new Int32Array(r.buffer,a*n,i)}}function FJe(t,e,r,n){var i=O1e(t,e),a=Ri(i,2),s=a[0],l=a[1],u=P1e(t,l,n),h=t.createBuffer();return t.bindBuffer(t.ARRAY_BUFFER,h),t.bufferData(t.ARRAY_BUFFER,u,t.STATIC_DRAW),l===t.FLOAT?t.vertexAttribPointer(r,s,l,!1,0,0):l===t.INT&&t.vertexAttribIPointer(r,s,l,0,0),t.enableVertexAttribArray(r),t.bindBuffer(t.ARRAY_BUFFER,null),h}function yo(t,e,r,n){var i=O1e(t,r),a=Ri(i,3),s=a[0],l=a[1],u=a[2],h=P1e(t,l,e*s),f=s*u,d=t.createBuffer();t.bindBuffer(t.ARRAY_BUFFER,d),t.bufferData(t.ARRAY_BUFFER,e*f,t.DYNAMIC_DRAW),t.enableVertexAttribArray(n),l===t.FLOAT?t.vertexAttribPointer(n,s,l,!1,f,0):l===t.INT&&t.vertexAttribIPointer(n,s,l,f,0),t.vertexAttribDivisor(n,1),t.bindBuffer(t.ARRAY_BUFFER,null);for(var p=new Array(e),m=0;mL1e?(KJe(t),e.call(t,a)):(QJe(t),G1e(t,a,Jb.SCREEN)))}}{var r=t.matchCanvasSize;t.matchCanvasSize=function(a){r.call(t,a),t.pickingFrameBuffer.setFramebufferAttachmentSizes(t.canvasWidth,t.canvasHeight),t.pickingFrameBuffer.needsDraw=!0}}t.findNearestElements=function(a,s,l,u){return net(t,a,s)};{var n=t.invalidateCachedZSortedEles;t.invalidateCachedZSortedEles=function(){n.call(t),t.pickingFrameBuffer.needsDraw=!0}}{var i=t.notify;t.notify=function(a,s){i.call(t,a,s),a==="viewport"||a==="bounds"?t.pickingFrameBuffer.needsDraw=!0:a==="background"&&t.eleDrawing.invalidate(s,{type:"node-body"})}}}function KJe(t){var e=t.data.contexts[t.WEBGL];e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT)}function QJe(t){var e=o(function(n){n.save(),n.setTransform(1,0,0,1,0,0),n.clearRect(0,0,t.canvasWidth,t.canvasHeight),n.restore()},"clear");e(t.data.contexts[t.NODE]),e(t.data.contexts[t.DRAG])}function ZJe(t){var e=t.canvasWidth,r=t.canvasHeight,n=aF(t),i=n.pan,a=n.zoom,s=Zb();j6(s,s,[i.x,i.y]),sF(s,s,[a,a]);var l=Zb();GJe(l,e,r);var u=Zb();return zJe(u,l,s),u}function z1e(t,e){var r=t.canvasWidth,n=t.canvasHeight,i=aF(t),a=i.pan,s=i.zoom;e.setTransform(1,0,0,1,0,0),e.clearRect(0,0,r,n),e.translate(a.x,a.y),e.scale(s,s)}function JJe(t,e){t.drawSelectionRectangle(e,function(r){return z1e(t,r)})}function eet(t){var e=t.data.contexts[t.NODE];e.save(),z1e(t,e),e.strokeStyle="rgba(0, 0, 0, 0.3)",e.beginPath(),e.moveTo(-1e3,0),e.lineTo(1e3,0),e.stroke(),e.beginPath(),e.moveTo(0,-1e3),e.lineTo(0,1e3),e.stroke(),e.restore()}function tet(t){var e=o(function(i,a,s){for(var l=i.atlasManager.getRenderTypeOpts(a),u=t.data.contexts[t.NODE],h=.125,f=l.atlasCollection.atlases,d=0;d=0&&k.add(I)}return k}function net(t,e,r){var n=ret(t,e,r),i=t.getCachedZSortedEles(),a,s,l=vo(n),u;try{for(l.s();!(u=l.n()).done;){var h=u.value,f=i[h];if(!a&&f.isNode()&&(a=f),!s&&f.isEdge()&&(s=f),a&&s)break}}catch(d){l.e(d)}finally{l.f()}return[a,s].filter(Boolean)}function G1e(t,e,r){var n,i;t.webglDebug&&(i=[],n=performance.now());var a=t.eleDrawing,s=0;if(r.screen&&t.data.canvasNeedsRedraw[t.SELECT_BOX]&&JJe(t,e),t.data.canvasNeedsRedraw[t.NODE]||r.picking){var l=o(function(k,L){L+=1,k.isNode()?(a.drawTexture(k,L,"node-underlay"),a.drawTexture(k,L,"node-body"),a.drawTexture(k,L,"node-label"),a.drawTexture(k,L,"node-overlay")):(a.drawEdgeLine(k,L),a.drawEdgeArrow(k,L,"source"),a.drawEdgeArrow(k,L,"target"),a.drawTexture(k,L,"edge-label"))},"draw"),u=t.data.contexts[t.WEBGL];r.screen?(u.clearColor(0,0,0,0),u.enable(u.BLEND),u.blendFunc(u.ONE,u.ONE_MINUS_SRC_ALPHA)):u.disable(u.BLEND),u.clear(u.COLOR_BUFFER_BIT|u.DEPTH_BUFFER_BIT),u.viewport(0,0,u.canvas.width,u.canvas.height);var h=ZJe(t),f=t.getCachedZSortedEles();if(s=f.length,a.startFrame(h,i,r),r.screen){for(var d=0;d{"use strict";o(qi,"_typeof");o(Vf,"_classCallCheck");o($0e,"_defineProperties");o(Uf,"_createClass");o(ige,"_defineProperty$1");o(Ri,"_slicedToArray");o(age,"_toConsumableArray");o(lqe,"_arrayWithoutHoles");o(cqe,"_arrayWithHoles");o(uqe,"_iterableToArray");o(hqe,"_iterableToArrayLimit");o(PB,"_unsupportedIterableToArray");o(xB,"_arrayLikeToArray");o(fqe,"_nonIterableSpread");o(dqe,"_nonIterableRest");o(vo,"_createForOfIteratorHelper");Hi=typeof window>"u"?null:window,z0e=Hi?Hi.navigator:null;Hi&&Hi.document;pqe=qi(""),sge=qi({}),mqe=qi(function(){}),gqe=typeof HTMLElement>"u"?"undefined":qi(HTMLElement),h4=o(function(e){return e&&e.instanceString&&li(e.instanceString)?e.instanceString():null},"instanceStr"),Zt=o(function(e){return e!=null&&qi(e)==pqe},"string"),li=o(function(e){return e!=null&&qi(e)===mqe},"fn"),En=o(function(e){return!xo(e)&&(Array.isArray?Array.isArray(e):e!=null&&e instanceof Array)},"array"),Ur=o(function(e){return e!=null&&qi(e)===sge&&!En(e)&&e.constructor===Object},"plainObject"),yqe=o(function(e){return e!=null&&qi(e)===sge},"object"),_t=o(function(e){return e!=null&&qi(e)===qi(1)&&!isNaN(e)},"number"),vqe=o(function(e){return _t(e)&&Math.floor(e)===e},"integer"),F6=o(function(e){if(gqe!=="undefined")return e!=null&&e instanceof HTMLElement},"htmlElement"),xo=o(function(e){return f4(e)||oge(e)},"elementOrCollection"),f4=o(function(e){return h4(e)==="collection"&&e._private.single},"element"),oge=o(function(e){return h4(e)==="collection"&&!e._private.single},"collection"),BB=o(function(e){return h4(e)==="core"},"core"),lge=o(function(e){return h4(e)==="stylesheet"},"stylesheet"),xqe=o(function(e){return h4(e)==="event"},"event"),Pf=o(function(e){return e==null?!0:!!(e===""||e.match(/^\s+$/))},"emptyString"),bqe=o(function(e){return typeof HTMLElement>"u"?!1:e instanceof HTMLElement},"domElement"),Tqe=o(function(e){return Ur(e)&&_t(e.x1)&&_t(e.x2)&&_t(e.y1)&&_t(e.y2)},"boundingBox"),wqe=o(function(e){return yqe(e)&&li(e.then)},"promise"),kqe=o(function(){return z0e&&z0e.userAgent.match(/msie|trident|edge/i)},"ms"),e4=o(function(e,r){r||(r=o(function(){if(arguments.length===1)return arguments[0];if(arguments.length===0)return"undefined";for(var a=[],s=0;sr?1:0},"ascending"),Lqe=o(function(e,r){return-1*uge(e,r)},"descending"),ir=Object.assign!=null?Object.assign.bind(Object):function(t){for(var e=arguments,r=1;r1&&(v-=1),v<1/6?g+(y-g)*6*v:v<1/2?y:v<2/3?g+(y-g)*(2/3-v)*6:g}o(f,"hue2rgb");var d=new RegExp("^"+Cqe+"$").exec(e);if(d){if(n=parseInt(d[1]),n<0?n=(360- -1*n%360)%360:n>360&&(n=n%360),n/=360,i=parseFloat(d[2]),i<0||i>100||(i=i/100,a=parseFloat(d[3]),a<0||a>100)||(a=a/100,s=d[4],s!==void 0&&(s=parseFloat(s),s<0||s>1)))return;if(i===0)l=u=h=Math.round(a*255);else{var p=a<.5?a*(1+i):a+i-a*i,m=2*a-p;l=Math.round(255*f(m,p,n+1/3)),u=Math.round(255*f(m,p,n)),h=Math.round(255*f(m,p,n-1/3))}r=[l,u,h,s]}return r},"hsl2tuple"),Mqe=o(function(e){var r,n=new RegExp("^"+Eqe+"$").exec(e);if(n){r=[];for(var i=[],a=1;a<=3;a++){var s=n[a];if(s[s.length-1]==="%"&&(i[a]=!0),s=parseFloat(s),i[a]&&(s=s/100*255),s<0||s>255)return;r.push(Math.floor(s))}var l=i[1]||i[2]||i[3],u=i[1]&&i[2]&&i[3];if(l&&!u)return;var h=n[4];if(h!==void 0){if(h=parseFloat(h),h<0||h>1)return;r.push(h)}}return r},"rgb2tuple"),Iqe=o(function(e){return Oqe[e.toLowerCase()]},"colorname2tuple"),hge=o(function(e){return(En(e)?e:null)||Iqe(e)||Rqe(e)||Mqe(e)||Nqe(e)},"color2tuple"),Oqe={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},fge=o(function(e){for(var r=e.map,n=e.keys,i=n.length,a=0;a1&&arguments[1]!==void 0?arguments[1]:X1,n=r,i;i=e.next(),!i.done;)n=n*yge+i.value|0;return n},"hashIterableInts"),t4=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:X1;return r*yge+e|0},"hashInt"),r4=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:qb;return(r<<5)+r+e|0},"hashIntAlt"),TYe=o(function(e,r){return e*2097152+r},"combineHashes"),Lf=o(function(e){return e[0]*2097152+e[1]},"combineHashesArray"),m6=o(function(e,r){return[t4(e[0],r[0]),r4(e[1],r[1])]},"hashArrays"),wYe=o(function(e,r){var n={value:0,done:!1},i=0,a=e.length,s={next:o(function(){return i=0&&!(e[i]===r&&(e.splice(i,1),n));i--);},"removeFromArray"),GB=o(function(e){e.splice(0,e.length)},"clearArray"),DYe=o(function(e,r){for(var n=0;n"u"?"undefined":qi(Set))!==RYe?Set:NYe,Z6=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;if(e===void 0||r===void 0||!BB(e)){oi("An element must have a core reference and parameters set");return}var i=r.group;if(i==null&&(r.data&&r.data.source!=null&&r.data.target!=null?i="edges":i="nodes"),i!=="nodes"&&i!=="edges"){oi("An element must be of type `nodes` or `edges`; you specified `"+i+"`");return}this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:r.data||{},position:r.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:i,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!r.selected,selectable:r.selectable===void 0?!0:!!r.selectable,locked:!!r.locked,grabbed:!1,grabbable:r.grabbable===void 0?!0:!!r.grabbable,pannable:r.pannable===void 0?i==="edges":!!r.pannable,active:!1,classes:new ay,animation:{current:[],queue:[]},rscratch:{},scratch:r.scratch||{},edges:[],children:[],parent:r.parent&&r.parent.isNode()?r.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(a.position.x==null&&(a.position.x=0),a.position.y==null&&(a.position.y=0),r.renderedPosition){var s=r.renderedPosition,l=e.pan(),u=e.zoom();a.position={x:(s.x-l.x)/u,y:(s.y-l.y)/u}}var h=[];En(r.classes)?h=r.classes:Zt(r.classes)&&(h=r.classes.split(/\s+/));for(var f=0,d=h.length;fb?1:0},"defaultCmp"),f=o(function(x,b,T,S,w){var E;if(T==null&&(T=0),w==null&&(w=n),T<0)throw new Error("lo must be non-negative");for(S==null&&(S=x.length);TO;0<=O?D++:D--)C.push(D);return C}.apply(this).reverse(),_=[],S=0,w=E.length;SR;0<=R?++C:--C)k.push(s(x,T));return k},"nsmallest"),y=o(function(x,b,T,S){var w,E,_;for(S==null&&(S=n),w=x[T];T>b;){if(_=T-1>>1,E=x[_],S(w,E)<0){x[T]=E,T=_;continue}break}return x[T]=w},"_siftdown"),v=o(function(x,b,T){var S,w,E,_,C;for(T==null&&(T=n),w=x.length,C=b,E=x[b],S=2*b+1;S0;){var E=b.pop(),_=v(E),C=E.id();if(p[C]=_,_!==1/0)for(var D=E.neighborhood().intersect(g),O=0;O0)for(B.unshift(P);d[z];){var $=d[z];B.unshift($.edge),B.unshift($.node),F=$.node,z=F.id()}return l.spawn(B)},"pathTo")}},"dijkstra")},PYe={kruskal:o(function(e){e=e||function(T){return 1};for(var r=this.byGroup(),n=r.nodes,i=r.edges,a=n.length,s=new Array(a),l=n,u=o(function(S){for(var w=0;w0;){if(w(),_++,S===f){for(var C=[],D=a,O=f,R=x[O];C.unshift(D),R!=null&&C.unshift(R),D=v[O],D!=null;)O=D.id(),R=x[O];return{found:!0,distance:d[S],path:this.spawn(C),steps:_}}m[S]=!0;for(var k=T._private.edges,L=0;LR&&(g[O]=R,b[O]=D,T[O]=w),!a){var k=D*f+C;!a&&g[k]>R&&(g[k]=R,b[k]=C,T[k]=w)}}}for(var L=0;L1&&arguments[1]!==void 0?arguments[1]:s,ye=T(ae),Be=[],He=ye;;){if(He==null)return r.spawn();var ze=b(He),Le=ze.edge,Ie=ze.pred;if(Be.unshift(He[0]),He.same(Oe)&&Be.length>0)break;Le!=null&&Be.unshift(Le),He=Ie}return u.spawn(Be)},"pathTo"),E=0;E=0;f--){var d=h[f],p=d[1],m=d[2];(r[p]===l&&r[m]===u||r[p]===u&&r[m]===l)&&h.splice(f,1)}for(var g=0;gi;){var a=Math.floor(Math.random()*r.length);r=HYe(a,e,r),n--}return r},"contractUntil"),WYe={kargerStein:o(function(){var e=this,r=this.byGroup(),n=r.nodes,i=r.edges;i.unmergeBy(function(B){return B.isLoop()});var a=n.length,s=i.length,l=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),u=Math.floor(a/UYe);if(a<2){oi("At least 2 nodes are required for Karger-Stein algorithm");return}for(var h=[],f=0;f1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=-1/0,a=r;a1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=0,a=0,s=r;s1&&arguments[1]!==void 0?arguments[1]:0,n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:e.length,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,a=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0;i?e=e.slice(r,n):(n0&&e.splice(0,r));for(var l=0,u=e.length-1;u>=0;u--){var h=e[u];s?isFinite(h)||(e[u]=-1/0,l++):e.splice(u,1)}a&&e.sort(function(p,m){return p-m});var f=e.length,d=Math.floor(f/2);return f%2!==0?e[d+1+l]:(e[d-1+l]+e[d+l])/2},"median"),QYe=o(function(e){return Math.PI*e/180},"deg2rad"),g6=o(function(e,r){return Math.atan2(r,e)-Math.PI/2},"getAngleFromDisp"),VB=Math.log2||function(t){return Math.log(t)/Math.log(2)},Sge=o(function(e){return e>0?1:e<0?-1:0},"signum"),Qp=o(function(e,r){return Math.sqrt(Wp(e,r))},"dist"),Wp=o(function(e,r){var n=r.x-e.x,i=r.y-e.y;return n*n+i*i},"sqdist"),ZYe=o(function(e){for(var r=e.length,n=0,i=0;i=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(e.w!=null&&e.h!=null&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},"makeBoundingBox"),eXe=o(function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}},"copyBoundingBox"),tXe=o(function(e){e.x1=1/0,e.y1=1/0,e.x2=-1/0,e.y2=-1/0,e.w=0,e.h=0},"clearBoundingBox"),rXe=o(function(e,r,n){return{x1:e.x1+r,x2:e.x2+r,y1:e.y1+n,y2:e.y2+n,w:e.w,h:e.h}},"shiftBoundingBox"),Cge=o(function(e,r){e.x1=Math.min(e.x1,r.x1),e.x2=Math.max(e.x2,r.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,r.y1),e.y2=Math.max(e.y2,r.y2),e.h=e.y2-e.y1},"updateBoundingBox"),nXe=o(function(e,r,n){e.x1=Math.min(e.x1,r),e.x2=Math.max(e.x2,r),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},"expandBoundingBoxByPoint"),D6=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return e.x1-=r,e.x2+=r,e.y1-=r,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBox"),L6=o(function(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[0],n,i,a,s;if(r.length===1)n=i=a=s=r[0];else if(r.length===2)n=a=r[0],s=i=r[1];else if(r.length===4){var l=Ri(r,4);n=l[0],i=l[1],a=l[2],s=l[3]}return e.x1-=s,e.x2+=i,e.y1-=n,e.y2+=a,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},"expandBoundingBoxSides"),X0e=o(function(e,r){e.x1=r.x1,e.y1=r.y1,e.x2=r.x2,e.y2=r.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},"assignBoundingBox"),UB=o(function(e,r){return!(e.x1>r.x2||r.x1>e.x2||e.x2r.y2||r.y1>e.y2)},"boundingBoxesIntersect"),ry=o(function(e,r,n){return e.x1<=r&&r<=e.x2&&e.y1<=n&&n<=e.y2},"inBoundingBox"),iXe=o(function(e,r){return ry(e,r.x,r.y)},"pointInBoundingBox"),Age=o(function(e,r){return ry(e,r.x1,r.y1)&&ry(e,r.x2,r.y2)},"boundingBoxInBoundingBox"),_ge=o(function(e,r,n,i,a,s,l){var u=arguments.length>7&&arguments[7]!==void 0?arguments[7]:"auto",h=u==="auto"?Zp(a,s):u,f=a/2,d=s/2;h=Math.min(h,f,d);var p=h!==f,m=h!==d,g;if(p){var y=n-f+h-l,v=i-d-l,x=n+f-h+l,b=v;if(g=Mf(e,r,n,i,y,v,x,b,!1),g.length>0)return g}if(m){var T=n+f+l,S=i-d+h-l,w=T,E=i+d-h+l;if(g=Mf(e,r,n,i,T,S,w,E,!1),g.length>0)return g}if(p){var _=n-f+h-l,C=i+d+l,D=n+f-h+l,O=C;if(g=Mf(e,r,n,i,_,C,D,O,!1),g.length>0)return g}if(m){var R=n-f-l,k=i-d+h-l,L=R,A=i+d-h+l;if(g=Mf(e,r,n,i,R,k,L,A,!1),g.length>0)return g}var I;{var M=n-f+h,P=i-d+h;if(I=Yb(e,r,n,i,M,P,h+l),I.length>0&&I[0]<=M&&I[1]<=P)return[I[0],I[1]]}{var B=n+f-h,F=i-d+h;if(I=Yb(e,r,n,i,B,F,h+l),I.length>0&&I[0]>=B&&I[1]<=F)return[I[0],I[1]]}{var z=n+f-h,$=i+d-h;if(I=Yb(e,r,n,i,z,$,h+l),I.length>0&&I[0]>=z&&I[1]>=$)return[I[0],I[1]]}{var U=n-f+h,K=i+d-h;if(I=Yb(e,r,n,i,U,K,h+l),I.length>0&&I[0]<=U&&I[1]>=K)return[I[0],I[1]]}return[]},"roundRectangleIntersectLine"),aXe=o(function(e,r,n,i,a,s,l){var u=l,h=Math.min(n,a),f=Math.max(n,a),d=Math.min(i,s),p=Math.max(i,s);return h-u<=e&&e<=f+u&&d-u<=r&&r<=p+u},"inLineVicinity"),sXe=o(function(e,r,n,i,a,s,l,u,h){var f={x1:Math.min(n,l,a)-h,x2:Math.max(n,l,a)+h,y1:Math.min(i,u,s)-h,y2:Math.max(i,u,s)+h};return!(ef.x2||rf.y2)},"inBezierVicinity"),oXe=o(function(e,r,n,i){n-=i;var a=r*r-4*e*n;if(a<0)return[];var s=Math.sqrt(a),l=2*e,u=(-r+s)/l,h=(-r-s)/l;return[u,h]},"solveQuadratic"),lXe=o(function(e,r,n,i,a){var s=1e-5;e===0&&(e=s),r/=e,n/=e,i/=e;var l,u,h,f,d,p,m,g;if(u=(3*n-r*r)/9,h=-(27*i)+r*(9*n-2*(r*r)),h/=54,l=u*u*u+h*h,a[1]=0,m=r/3,l>0){d=h+Math.sqrt(l),d=d<0?-Math.pow(-d,1/3):Math.pow(d,1/3),p=h-Math.sqrt(l),p=p<0?-Math.pow(-p,1/3):Math.pow(p,1/3),a[0]=-m+d+p,m+=(d+p)/2,a[4]=a[2]=-m,m=Math.sqrt(3)*(-p+d)/2,a[3]=m,a[5]=-m;return}if(a[5]=a[3]=0,l===0){g=h<0?-Math.pow(-h,1/3):Math.pow(h,1/3),a[0]=-m+2*g,a[4]=a[2]=-(g+m);return}u=-u,f=u*u*u,f=Math.acos(h/Math.sqrt(f)),g=2*Math.sqrt(u),a[0]=-m+g*Math.cos(f/3),a[2]=-m+g*Math.cos((f+2*Math.PI)/3),a[4]=-m+g*Math.cos((f+4*Math.PI)/3)},"solveCubic"),cXe=o(function(e,r,n,i,a,s,l,u){var h=1*n*n-4*n*a+2*n*l+4*a*a-4*a*l+l*l+i*i-4*i*s+2*i*u+4*s*s-4*s*u+u*u,f=1*9*n*a-3*n*n-3*n*l-6*a*a+3*a*l+9*i*s-3*i*i-3*i*u-6*s*s+3*s*u,d=1*3*n*n-6*n*a+n*l-n*e+2*a*a+2*a*e-l*e+3*i*i-6*i*s+i*u-i*r+2*s*s+2*s*r-u*r,p=1*n*a-n*n+n*e-a*e+i*s-i*i+i*r-s*r,m=[];lXe(h,f,d,p,m);for(var g=1e-7,y=[],v=0;v<6;v+=2)Math.abs(m[v+1])=0&&m[v]<=1&&y.push(m[v]);y.push(1),y.push(0);for(var x=-1,b,T,S,w=0;w=0?Sh?(e-a)*(e-a)+(r-s)*(r-s):f-p},"sqdistToFiniteLine"),qs=o(function(e,r,n){for(var i,a,s,l,u,h=0,f=0;f=e&&e>=s||i<=e&&e<=s)u=(e-i)/(s-i)*(l-a)+a,u>r&&h++;else continue;return h%2!==0},"pointInsidePolygonPoints"),ih=o(function(e,r,n,i,a,s,l,u,h){var f=new Array(n.length),d;u[0]!=null?(d=Math.atan(u[1]/u[0]),u[0]<0?d=d+Math.PI/2:d=-d-Math.PI/2):d=u;for(var p=Math.cos(-d),m=Math.sin(-d),g=0;g0){var v=V6(f,-h);y=G6(v)}else y=f;return qs(e,r,y)},"pointInsidePolygon"),hXe=o(function(e,r,n,i,a,s,l,u){for(var h=new Array(n.length*2),f=0;f=0&&v<=1&&b.push(v),x>=0&&x<=1&&b.push(x),b.length===0)return[];var T=b[0]*u[0]+e,S=b[0]*u[1]+r;if(b.length>1){if(b[0]==b[1])return[T,S];var w=b[1]*u[0]+e,E=b[1]*u[1]+r;return[T,S,w,E]}else return[T,S]},"intersectLineCircle"),sB=o(function(e,r,n){return r<=e&&e<=n||n<=e&&e<=r?e:e<=r&&r<=n||n<=r&&r<=e?r:n},"midOfThree"),Mf=o(function(e,r,n,i,a,s,l,u,h){var f=e-a,d=n-e,p=l-a,m=r-s,g=i-r,y=u-s,v=p*m-y*f,x=d*m-g*f,b=y*d-p*g;if(b!==0){var T=v/b,S=x/b,w=.001,E=0-w,_=1+w;return E<=T&&T<=_&&E<=S&&S<=_?[e+T*d,r+T*g]:h?[e+T*d,r+T*g]:[]}else return v===0||x===0?sB(e,n,l)===l?[l,u]:sB(e,n,a)===a?[a,s]:sB(a,l,n)===n?[n,i]:[]:[]},"finiteLinesIntersect"),a4=o(function(e,r,n,i,a,s,l,u){var h=[],f,d=new Array(n.length),p=!0;s==null&&(p=!1);var m;if(p){for(var g=0;g0){var y=V6(d,-u);m=G6(y)}else m=d}else m=n;for(var v,x,b,T,S=0;S2){for(var g=[f[0],f[1]],y=Math.pow(g[0]-e,2)+Math.pow(g[1]-r,2),v=1;vf&&(f=S)},"set"),get:o(function(T){return h[T]},"get")},p=0;p0?M=I.edgesTo(A)[0]:M=A.edgesTo(I)[0];var P=i(M);A=A.id(),C[A]>C[k]+P&&(C[A]=C[k]+P,D.nodes.indexOf(A)<0?D.push(A):D.updateItem(A),_[A]=0,E[A]=[]),C[A]==C[k]+P&&(_[A]=_[A]+_[k],E[A].push(k))}else for(var B=0;B0;){for(var U=w.pop(),K=0;K0&&l.push(n[u]);l.length!==0&&a.push(i.collection(l))}return a},"assign"),AXe=o(function(e,r){for(var n=0;n5&&arguments[5]!==void 0?arguments[5]:LXe,l=i,u,h,f=0;f=2?$b(e,r,n,0,J0e,RXe):$b(e,r,n,0,Z0e)},"euclidean"),squaredEuclidean:o(function(e,r,n){return $b(e,r,n,0,J0e)},"squaredEuclidean"),manhattan:o(function(e,r,n){return $b(e,r,n,0,Z0e)},"manhattan"),max:o(function(e,r,n){return $b(e,r,n,-1/0,NXe)},"max")};ny["squared-euclidean"]=ny.squaredEuclidean;ny.squaredeuclidean=ny.squaredEuclidean;o(eC,"clusteringDistance");MXe=oa({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),WB=o(function(e){return MXe(e)},"setOptions"),U6=o(function(e,r,n,i,a){var s=a!=="kMedoids",l=s?function(d){return n[d]}:function(d){return i[d](n)},u=o(function(p){return i[p](r)},"getQ"),h=n,f=r;return eC(e,i.length,l,u,h,f)},"getDist"),oB=o(function(e,r,n){for(var i=n.length,a=new Array(i),s=new Array(i),l=new Array(r),u=null,h=0;hn)return!1}return!0},"haveMatricesConverged"),PXe=o(function(e,r,n){for(var i=0;il&&(l=r[h][f],u=f);a[u].push(e[h])}for(var d=0;d=a.threshold||a.mode==="dendrogram"&&e.length===1)return!1;var g=r[s],y=r[i[s]],v;a.mode==="dendrogram"?v={left:g,right:y,key:g.key}:v={value:g.value.concat(y.value),key:g.key},e[g.index]=v,e.splice(y.index,1),r[g.key]=v;for(var x=0;xn[y.key][b.key]&&(u=n[y.key][b.key])):a.linkage==="max"?(u=n[g.key][b.key],n[g.key][b.key]0&&i.push(a);return i},"findExemplars"),ame=o(function(e,r,n){for(var i=[],a=0;al&&(s=h,l=r[a*e+h])}s>0&&i.push(s)}for(var f=0;fh&&(u=f,h=d)}n[a]=s[u]}return i=ame(e,r,n),i},"assign"),sme=o(function(e){for(var r=this.cy(),n=this.nodes(),i=KXe(e),a={},s=0;s=R?(k=R,R=A,L=I):A>k&&(k=A);for(var M=0;M0?1:0;_[D%i.minIterations*l+U]=K,$+=K}if($>0&&(D>=i.minIterations-1||D==i.maxIterations-1)){for(var ee=0,Y=0;Y1||E>1)&&(l=!0),d[T]=[],b.outgoers().forEach(function(C){C.isEdge()&&d[T].push(C.id())})}else p[T]=[void 0,b.target().id()]}):s.forEach(function(b){var T=b.id();if(b.isNode()){var S=b.degree(!0);S%2&&(u?h?l=!0:h=T:u=T),d[T]=[],b.connectedEdges().forEach(function(w){return d[T].push(w.id())})}else p[T]=[b.source().id(),b.target().id()]});var m={found:!1,trail:void 0};if(l)return m;if(h&&u)if(a){if(f&&h!=f)return m;f=h}else{if(f&&h!=f&&u!=f)return m;f||(f=h)}else f||(f=s[0].id());var g=o(function(T){for(var S=T,w=[T],E,_,C;d[S].length;)E=d[S].shift(),_=p[E][0],C=p[E][1],S!=C?(d[C]=d[C].filter(function(D){return D!=E}),S=C):!a&&S!=_&&(d[_]=d[_].filter(function(D){return D!=E}),S=_),w.unshift(E),w.unshift(S);return w},"walk"),y=[],v=[];for(v=g(f);v.length!=1;)d[v[0]].length==0?(y.unshift(s.getElementById(v.shift())),y.unshift(s.getElementById(v.shift()))):v=g(v.shift()).concat(v);y.unshift(s.getElementById(v.shift()));for(var x in d)if(d[x].length)return m;return m.found=!0,m.trail=this.spawn(y,!0),m},"hierholzer")},x6=o(function(){var e=this,r={},n=0,i=0,a=[],s=[],l={},u=o(function(p,m){for(var g=s.length-1,y=[],v=e.spawn();s[g].x!=p||s[g].y!=m;)y.push(s.pop().edge),g--;y.push(s.pop().edge),y.forEach(function(x){var b=x.connectedNodes().intersection(e);v.merge(x),b.forEach(function(T){var S=T.id(),w=T.connectedEdges().intersection(e);v.merge(T),r[S].cutVertex?v.merge(w.filter(function(E){return E.isLoop()})):v.merge(w)})}),a.push(v)},"buildComponent"),h=o(function d(p,m,g){p===g&&(i+=1),r[m]={id:n,low:n++,cutVertex:!1};var y=e.getElementById(m).connectedEdges().intersection(e);if(y.size()===0)a.push(e.spawn(e.getElementById(m)));else{var v,x,b,T;y.forEach(function(S){v=S.source().id(),x=S.target().id(),b=v===m?x:v,b!==g&&(T=S.id(),l[T]||(l[T]=!0,s.push({x:m,y:b,edge:S})),b in r?r[m].low=Math.min(r[m].low,r[b].id):(d(p,b,m),r[m].low=Math.min(r[m].low,r[b].low),r[m].id<=r[b].low&&(r[m].cutVertex=!0,u(m,b))))})}},"biconnectedSearch");e.forEach(function(d){if(d.isNode()){var p=d.id();p in r||(i=0,h(p,p),r[p].cutVertex=i>1)}});var f=Object.keys(r).filter(function(d){return r[d].cutVertex}).map(function(d){return e.getElementById(d)});return{cut:e.spawn(f),components:a}},"hopcroftTarjanBiconnected"),ije={hopcroftTarjanBiconnected:x6,htbc:x6,htb:x6,hopcroftTarjanBiconnectedComponents:x6},b6=o(function(){var e=this,r={},n=0,i=[],a=[],s=e.spawn(e),l=o(function u(h){a.push(h),r[h]={index:n,low:n++,explored:!1};var f=e.getElementById(h).connectedEdges().intersection(e);if(f.forEach(function(y){var v=y.target().id();v!==h&&(v in r||u(v),r[v].explored||(r[h].low=Math.min(r[h].low,r[v].low)))}),r[h].index===r[h].low){for(var d=e.spawn();;){var p=a.pop();if(d.merge(e.getElementById(p)),r[p].low=r[h].index,r[p].explored=!0,p===h)break}var m=d.edgesWith(d),g=d.merge(m);i.push(g),s=s.difference(g)}},"stronglyConnectedSearch");return e.forEach(function(u){if(u.isNode()){var h=u.id();h in r||l(h)}}),{cut:s,components:i}},"tarjanStronglyConnected"),aje={tarjanStronglyConnected:b6,tsc:b6,tscc:b6,tarjanStronglyConnectedComponents:b6},Oge={};[n4,OYe,PYe,FYe,zYe,VYe,WYe,gXe,Z1,J1,wB,DXe,VXe,XXe,tje,nje,ije,aje].forEach(function(t){ir(Oge,t)});Pge=0,Bge=1,Fge=2,ah=o(function t(e){if(!(this instanceof t))return new t(e);this.id="Thenable/1.0.7",this.state=Pge,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},typeof e=="function"&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))},"api");ah.prototype={fulfill:o(function(e){return ome(this,Bge,"fulfillValue",e)},"fulfill"),reject:o(function(e){return ome(this,Fge,"rejectReason",e)},"reject"),then:o(function(e,r){var n=this,i=new ah;return n.onFulfilled.push(cme(e,i,"fulfill")),n.onRejected.push(cme(r,i,"reject")),$ge(n),i.proxy},"then")};ome=o(function(e,r,n,i){return e.state===Pge&&(e.state=r,e[n]=i,$ge(e)),e},"deliver"),$ge=o(function(e){e.state===Bge?lme(e,"onFulfilled",e.fulfillValue):e.state===Fge&&lme(e,"onRejected",e.rejectReason)},"execute"),lme=o(function(e,r,n){if(e[r].length!==0){var i=e[r];e[r]=[];var a=o(function(){for(var l=0;l0},"animatedImpl")},"animated"),clearQueue:o(function(){return o(function(){var r=this,n=r.length!==void 0,i=n?r:[r],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var s=0;s0&&this.spawn(i).updateStyle().emit("class"),r},"classes"),addClass:o(function(e){return this.toggleClass(e,!0)},"addClass"),hasClass:o(function(e){var r=this[0];return r!=null&&r._private.classes.has(e)},"hasClass"),toggleClass:o(function(e,r){En(e)||(e=e.match(/\S+/g)||[]);for(var n=this,i=r===void 0,a=[],s=0,l=n.length;s0&&this.spawn(a).updateStyle().emit("class"),n},"toggleClass"),removeClass:o(function(e){return this.toggleClass(e,!1)},"removeClass"),flashClass:o(function(e,r){var n=this;if(r==null)r=250;else if(r===0)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},r),n},"flashClass")};R6.className=R6.classNames=R6.classes;Vr={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:`"(?:\\\\"|[^"])*"|'(?:\\\\'|[^'])*'`,number:Wi,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Vr.variable="(?:[\\w-.]|(?:\\\\"+Vr.metaChar+"))+";Vr.className="(?:[\\w-]|(?:\\\\"+Vr.metaChar+"))+";Vr.value=Vr.string+"|"+Vr.number;Vr.id=Vr.variable;(function(){var t,e,r;for(t=Vr.comparatorOp.split("|"),r=0;r=0)&&e!=="="&&(Vr.comparatorOp+="|\\!"+e)})();gn=o(function(){return{checks:[]}},"newQuery"),$t={GROUP:0,COLLECTION:1,FILTER:2,DATA_COMPARE:3,DATA_EXIST:4,DATA_BOOL:5,META_COMPARE:6,STATE:7,ID:8,CLASS:9,UNDIRECTED_EDGE:10,DIRECTED_EDGE:11,NODE_SOURCE:12,NODE_TARGET:13,NODE_NEIGHBOR:14,CHILD:15,DESCENDANT:16,PARENT:17,ANCESTOR:18,COMPOUND_SPLIT:19,TRUE:20},EB=[{selector:":selected",matches:o(function(e){return e.selected()},"matches")},{selector:":unselected",matches:o(function(e){return!e.selected()},"matches")},{selector:":selectable",matches:o(function(e){return e.selectable()},"matches")},{selector:":unselectable",matches:o(function(e){return!e.selectable()},"matches")},{selector:":locked",matches:o(function(e){return e.locked()},"matches")},{selector:":unlocked",matches:o(function(e){return!e.locked()},"matches")},{selector:":visible",matches:o(function(e){return e.visible()},"matches")},{selector:":hidden",matches:o(function(e){return!e.visible()},"matches")},{selector:":transparent",matches:o(function(e){return e.transparent()},"matches")},{selector:":grabbed",matches:o(function(e){return e.grabbed()},"matches")},{selector:":free",matches:o(function(e){return!e.grabbed()},"matches")},{selector:":removed",matches:o(function(e){return e.removed()},"matches")},{selector:":inside",matches:o(function(e){return!e.removed()},"matches")},{selector:":grabbable",matches:o(function(e){return e.grabbable()},"matches")},{selector:":ungrabbable",matches:o(function(e){return!e.grabbable()},"matches")},{selector:":animated",matches:o(function(e){return e.animated()},"matches")},{selector:":unanimated",matches:o(function(e){return!e.animated()},"matches")},{selector:":parent",matches:o(function(e){return e.isParent()},"matches")},{selector:":childless",matches:o(function(e){return e.isChildless()},"matches")},{selector:":child",matches:o(function(e){return e.isChild()},"matches")},{selector:":orphan",matches:o(function(e){return e.isOrphan()},"matches")},{selector:":nonorphan",matches:o(function(e){return e.isChild()},"matches")},{selector:":compound",matches:o(function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()},"matches")},{selector:":loop",matches:o(function(e){return e.isLoop()},"matches")},{selector:":simple",matches:o(function(e){return e.isSimple()},"matches")},{selector:":active",matches:o(function(e){return e.active()},"matches")},{selector:":inactive",matches:o(function(e){return!e.active()},"matches")},{selector:":backgrounding",matches:o(function(e){return e.backgrounding()},"matches")},{selector:":nonbackgrounding",matches:o(function(e){return!e.backgrounding()},"matches")}].sort(function(t,e){return Lqe(t.selector,e.selector)}),vQe=function(){for(var t={},e,r=0;r0&&f.edgeCount>0)return hn("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(f.edgeCount>1)return hn("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;f.edgeCount===1&&hn("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},"parse"),EQe=o(function(){if(this.toStringCache!=null)return this.toStringCache;for(var e=o(function(f){return f??""},"clean"),r=o(function(f){return Zt(f)?'"'+f+'"':e(f)},"cleanVal"),n=o(function(f){return" "+f+" "},"space"),i=o(function(f,d){var p=f.type,m=f.value;switch(p){case $t.GROUP:{var g=e(m);return g.substring(0,g.length-1)}case $t.DATA_COMPARE:{var y=f.field,v=f.operator;return"["+y+n(e(v))+r(m)+"]"}case $t.DATA_BOOL:{var x=f.operator,b=f.field;return"["+e(x)+b+"]"}case $t.DATA_EXIST:{var T=f.field;return"["+T+"]"}case $t.META_COMPARE:{var S=f.operator,w=f.field;return"[["+w+n(e(S))+r(m)+"]]"}case $t.STATE:return m;case $t.ID:return"#"+m;case $t.CLASS:return"."+m;case $t.PARENT:case $t.CHILD:return a(f.parent,d)+n(">")+a(f.child,d);case $t.ANCESTOR:case $t.DESCENDANT:return a(f.ancestor,d)+" "+a(f.descendant,d);case $t.COMPOUND_SPLIT:{var E=a(f.left,d),_=a(f.subject,d),C=a(f.right,d);return E+(E.length>0?" ":"")+_+C}case $t.TRUE:return""}},"checkToString"),a=o(function(f,d){return f.checks.reduce(function(p,m,g){return p+(d===f&&g===0?"$":"")+i(m,d)},"")},"queryToString"),s="",l=0;l1&&l=0&&(r=r.replace("!",""),d=!0),r.indexOf("@")>=0&&(r=r.replace("@",""),f=!0),(a||l||f)&&(u=!a&&!s?"":""+e,h=""+n),f&&(e=u=u.toLowerCase(),n=h=h.toLowerCase()),r){case"*=":i=u.indexOf(h)>=0;break;case"$=":i=u.indexOf(h,u.length-h.length)>=0;break;case"^=":i=u.indexOf(h)===0;break;case"=":i=e===n;break;case">":p=!0,i=e>n;break;case">=":p=!0,i=e>=n;break;case"<":p=!0,i=e1&&arguments[1]!==void 0?arguments[1]:!0;return KB(this,t,e,Xge)};o(jge,"addParent");iy.forEachUp=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return KB(this,t,e,jge)};o(NQe,"addParentAndChildren");iy.forEachUpAndDown=function(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return KB(this,t,e,NQe)};iy.ancestors=iy.parents;o4=Kge={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:un.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:un.removeData({field:"rscratch",triggerEvent:!1}),id:o(function(){var e=this[0];if(e)return e._private.data.id},"id")};o4.attr=o4.data;o4.removeAttr=o4.removeData;MQe=Kge,iC={};o(cB,"defineDegreeFunction");ir(iC,{degree:cB(function(t,e){return e.source().same(e.target())?2:1}),indegree:cB(function(t,e){return e.target().same(t)?1:0}),outdegree:cB(function(t,e){return e.source().same(t)?1:0})});o(H1,"defineDegreeBoundsFunction");ir(iC,{minDegree:H1("degree",function(t,e){return te}),minIndegree:H1("indegree",function(t,e){return te}),minOutdegree:H1("outdegree",function(t,e){return te})});ir(iC,{totalDegree:o(function(e){for(var r=0,n=this.nodes(),i=0;i0,p=d;d&&(f=f[0]);var m=p?f.position():{x:0,y:0};r!==void 0?h.position(e,r+m[e]):a!==void 0&&h.position({x:a.x+m.x,y:a.y+m.y})}else{var g=n.position(),y=l?n.parent():null,v=y&&y.length>0,x=v;v&&(y=y[0]);var b=x?y.position():{x:0,y:0};return a={x:g.x-b.x,y:g.y-b.y},e===void 0?a:a[e]}else if(!s)return;return this},"relativePosition")};ql.modelPosition=ql.point=ql.position;ql.modelPositions=ql.points=ql.positions;ql.renderedPoint=ql.renderedPosition;ql.relativePoint=ql.relativePosition;IQe=Qge;ey=Hf={};Hf.renderedBoundingBox=function(t){var e=this.boundingBox(t),r=this.cy(),n=r.zoom(),i=r.pan(),a=e.x1*n+i.x,s=e.x2*n+i.x,l=e.y1*n+i.y,u=e.y2*n+i.y;return{x1:a,x2:s,y1:l,y2:u,w:s-a,h:u-l}};Hf.dirtyCompoundBoundsCache=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();return!e.styleEnabled()||!e.hasCompoundNodes()?this:(this.forEachUp(function(r){if(r.isParent()){var n=r._private;n.compoundBoundsClean=!1,n.bbCache=null,t||r.emitAndNotify("bounds")}}),this)};Hf.updateCompoundBounds=function(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,e=this.cy();if(!e.styleEnabled()||!e.hasCompoundNodes())return this;if(!t&&e.batching())return this;function r(s){if(!s.isParent())return;var l=s._private,u=s.children(),h=s.pstyle("compound-sizing-wrt-labels").value==="include",f={width:{val:s.pstyle("min-width").pfValue,left:s.pstyle("min-width-bias-left"),right:s.pstyle("min-width-bias-right")},height:{val:s.pstyle("min-height").pfValue,top:s.pstyle("min-height-bias-top"),bottom:s.pstyle("min-height-bias-bottom")}},d=u.boundingBox({includeLabels:h,includeOverlays:!1,useCache:!1}),p=l.position;(d.w===0||d.h===0)&&(d={w:s.pstyle("width").pfValue,h:s.pstyle("height").pfValue},d.x1=p.x-d.w/2,d.x2=p.x+d.w/2,d.y1=p.y-d.h/2,d.y2=p.y+d.h/2);function m(D,O,R){var k=0,L=0,A=O+R;return D>0&&A>0&&(k=O/A*D,L=R/A*D),{biasDiff:k,biasComplementDiff:L}}o(m,"computeBiasValues");function g(D,O,R,k){if(R.units==="%")switch(k){case"width":return D>0?R.pfValue*D:0;case"height":return O>0?R.pfValue*O:0;case"average":return D>0&&O>0?R.pfValue*(D+O)/2:0;case"min":return D>0&&O>0?D>O?R.pfValue*O:R.pfValue*D:0;case"max":return D>0&&O>0?D>O?R.pfValue*D:R.pfValue*O:0;default:return 0}else return R.units==="px"?R.pfValue:0}o(g,"computePaddingValues");var y=f.width.left.value;f.width.left.units==="px"&&f.width.val>0&&(y=y*100/f.width.val);var v=f.width.right.value;f.width.right.units==="px"&&f.width.val>0&&(v=v*100/f.width.val);var x=f.height.top.value;f.height.top.units==="px"&&f.height.val>0&&(x=x*100/f.height.val);var b=f.height.bottom.value;f.height.bottom.units==="px"&&f.height.val>0&&(b=b*100/f.height.val);var T=m(f.width.val-d.w,y,v),S=T.biasDiff,w=T.biasComplementDiff,E=m(f.height.val-d.h,x,b),_=E.biasDiff,C=E.biasComplementDiff;l.autoPadding=g(d.w,d.h,s.pstyle("padding"),s.pstyle("padding-relative-to").value),l.autoWidth=Math.max(d.w,f.width.val),p.x=(-S+d.x1+d.x2+w)/2,l.autoHeight=Math.max(d.h,f.height.val),p.y=(-_+d.y1+d.y2+C)/2}o(r,"update");for(var n=0;ne.x2?i:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},"updateBounds"),qp=o(function(e,r){return r==null?e:Hl(e,r.x1,r.y1,r.x2,r.y2)},"updateBoundsFromBox"),zb=o(function(e,r,n){return Wl(e,r,n)},"prefixedProperty"),T6=o(function(e,r,n){if(!r.cy().headless()){var i=r._private,a=i.rstyle,s=a.arrowWidth/2,l=r.pstyle(n+"-arrow-shape").value,u,h;if(l!=="none"){n==="source"?(u=a.srcX,h=a.srcY):n==="target"?(u=a.tgtX,h=a.tgtY):(u=a.midX,h=a.midY);var f=i.arrowBounds=i.arrowBounds||{},d=f[n]=f[n]||{};d.x1=u-s,d.y1=h-s,d.x2=u+s,d.y2=h+s,d.w=d.x2-d.x1,d.h=d.y2-d.y1,D6(d,1),Hl(e,d.x1,d.y1,d.x2,d.y2)}}},"updateBoundsFromArrow"),uB=o(function(e,r,n){if(!r.cy().headless()){var i;n?i=n+"-":i="";var a=r._private,s=a.rstyle,l=r.pstyle(i+"label").strValue;if(l){var u=r.pstyle("text-halign"),h=r.pstyle("text-valign"),f=zb(s,"labelWidth",n),d=zb(s,"labelHeight",n),p=zb(s,"labelX",n),m=zb(s,"labelY",n),g=r.pstyle(i+"text-margin-x").pfValue,y=r.pstyle(i+"text-margin-y").pfValue,v=r.isEdge(),x=r.pstyle(i+"text-rotation"),b=r.pstyle("text-outline-width").pfValue,T=r.pstyle("text-border-width").pfValue,S=T/2,w=r.pstyle("text-background-padding").pfValue,E=2,_=d,C=f,D=C/2,O=_/2,R,k,L,A;if(v)R=p-D,k=p+D,L=m-O,A=m+O;else{switch(u.value){case"left":R=p-C,k=p;break;case"center":R=p-D,k=p+D;break;case"right":R=p,k=p+C;break}switch(h.value){case"top":L=m-_,A=m;break;case"center":L=m-O,A=m+O;break;case"bottom":L=m,A=m+_;break}}var I=g-Math.max(b,S)-w-E,M=g+Math.max(b,S)+w+E,P=y-Math.max(b,S)-w-E,B=y+Math.max(b,S)+w+E;R+=I,k+=M,L+=P,A+=B;var F=n||"main",z=a.labelBounds,$=z[F]=z[F]||{};$.x1=R,$.y1=L,$.x2=k,$.y2=A,$.w=k-R,$.h=A-L,$.leftPad=I,$.rightPad=M,$.topPad=P,$.botPad=B;var U=v&&x.strValue==="autorotate",K=x.pfValue!=null&&x.pfValue!==0;if(U||K){var ee=U?zb(a.rstyle,"labelAngle",n):x.pfValue,Y=Math.cos(ee),ce=Math.sin(ee),Z=(R+k)/2,ue=(L+A)/2;if(!v){switch(u.value){case"left":Z=k;break;case"right":Z=R;break}switch(h.value){case"top":ue=A;break;case"bottom":ue=L;break}}var Q=o(function(se,ae){return se=se-Z,ae=ae-ue,{x:se*Y-ae*ce+Z,y:se*ce+ae*Y+ue}},"rotate"),j=Q(R,L),ne=Q(R,A),te=Q(k,L),he=Q(k,A);R=Math.min(j.x,ne.x,te.x,he.x),k=Math.max(j.x,ne.x,te.x,he.x),L=Math.min(j.y,ne.y,te.y,he.y),A=Math.max(j.y,ne.y,te.y,he.y)}var le=F+"Rot",J=z[le]=z[le]||{};J.x1=R,J.y1=L,J.x2=k,J.y2=A,J.w=k-R,J.h=A-L,Hl(e,R,L,k,A),Hl(a.labelBounds.all,R,L,k,A)}return e}},"updateBoundsFromLabel"),OQe=o(function(e,r){if(!r.cy().headless()){var n=r.pstyle("outline-opacity").value,i=r.pstyle("outline-width").value;if(n>0&&i>0){var a=r.pstyle("outline-offset").value,s=r.pstyle("shape").value,l=i+a,u=(e.w+l*2)/e.w,h=(e.h+l*2)/e.h,f=0,d=0;["diamond","pentagon","round-triangle"].includes(s)?(u=(e.w+l*2.4)/e.w,d=-l/3.6):["concave-hexagon","rhomboid","right-rhomboid"].includes(s)?u=(e.w+l*2.4)/e.w:s==="star"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.6)/e.h,d=-l/3.8):s==="triangle"?(u=(e.w+l*2.8)/e.w,h=(e.h+l*2.4)/e.h,d=-l/1.4):s==="vee"&&(u=(e.w+l*4.4)/e.w,h=(e.h+l*3.8)/e.h,d=-l*.5);var p=e.h*h-e.h,m=e.w*u-e.w;if(L6(e,[Math.ceil(p/2),Math.ceil(m/2)]),f!=0||d!==0){var g=rXe(e,f,d);Cge(e,g)}}}},"updateBoundsFromOutline"),PQe=o(function(e,r){var n=e._private.cy,i=n.styleEnabled(),a=n.headless(),s=Ys(),l=e._private,u=e.isNode(),h=e.isEdge(),f,d,p,m,g,y,v=l.rstyle,x=u&&i?e.pstyle("bounds-expansion").pfValue:[0],b=o(function(Se){return Se.pstyle("display").value!=="none"},"isDisplayed"),T=!i||b(e)&&(!h||b(e.source())&&b(e.target()));if(T){var S=0,w=0;i&&r.includeOverlays&&(S=e.pstyle("overlay-opacity").value,S!==0&&(w=e.pstyle("overlay-padding").value));var E=0,_=0;i&&r.includeUnderlays&&(E=e.pstyle("underlay-opacity").value,E!==0&&(_=e.pstyle("underlay-padding").value));var C=Math.max(w,_),D=0,O=0;if(i&&(D=e.pstyle("width").pfValue,O=D/2),u&&r.includeNodes){var R=e.position();g=R.x,y=R.y;var k=e.outerWidth(),L=k/2,A=e.outerHeight(),I=A/2;f=g-L,d=g+L,p=y-I,m=y+I,Hl(s,f,p,d,m),i&&r.includeOutlines&&OQe(s,e)}else if(h&&r.includeEdges)if(i&&!a){var M=e.pstyle("curve-style").strValue;if(f=Math.min(v.srcX,v.midX,v.tgtX),d=Math.max(v.srcX,v.midX,v.tgtX),p=Math.min(v.srcY,v.midY,v.tgtY),m=Math.max(v.srcY,v.midY,v.tgtY),f-=O,d+=O,p-=O,m+=O,Hl(s,f,p,d,m),M==="haystack"){var P=v.haystackPts;if(P&&P.length===2){if(f=P[0].x,p=P[0].y,d=P[1].x,m=P[1].y,f>d){var B=f;f=d,d=B}if(p>m){var F=p;p=m,m=F}Hl(s,f-O,p-O,d+O,m+O)}}else if(M==="bezier"||M==="unbundled-bezier"||M.endsWith("segments")||M.endsWith("taxi")){var z;switch(M){case"bezier":case"unbundled-bezier":z=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":z=v.linePts;break}if(z!=null)for(var $=0;$d){var Z=f;f=d,d=Z}if(p>m){var ue=p;p=m,m=ue}f-=O,d+=O,p-=O,m+=O,Hl(s,f,p,d,m)}if(i&&r.includeEdges&&h&&(T6(s,e,"mid-source"),T6(s,e,"mid-target"),T6(s,e,"source"),T6(s,e,"target")),i){var Q=e.pstyle("ghost").value==="yes";if(Q){var j=e.pstyle("ghost-offset-x").pfValue,ne=e.pstyle("ghost-offset-y").pfValue;Hl(s,s.x1+j,s.y1+ne,s.x2+j,s.y2+ne)}}var te=l.bodyBounds=l.bodyBounds||{};X0e(te,s),L6(te,x),D6(te,1),i&&(f=s.x1,d=s.x2,p=s.y1,m=s.y2,Hl(s,f-C,p-C,d+C,m+C));var he=l.overlayBounds=l.overlayBounds||{};X0e(he,s),L6(he,x),D6(he,1);var le=l.labelBounds=l.labelBounds||{};le.all!=null?tXe(le.all):le.all=Ys(),i&&r.includeLabels&&(r.includeMainLabels&&uB(s,e,null),h&&(r.includeSourceLabels&&uB(s,e,"source"),r.includeTargetLabels&&uB(s,e,"target")))}return s.x1=il(s.x1),s.y1=il(s.y1),s.x2=il(s.x2),s.y2=il(s.y2),s.w=il(s.x2-s.x1),s.h=il(s.y2-s.y1),s.w>0&&s.h>0&&T&&(L6(s,x),D6(s,1)),s},"boundingBoxImpl"),Jge=o(function(e){var r=0,n=o(function(s){return(s?1:0)<=0;l--)s(l);return this};Gf.removeAllListeners=function(){return this.removeListener("*")};Gf.emit=Gf.trigger=function(t,e,r){var n=this.listeners,i=n.length;return this.emitting++,En(e)||(e=[e]),ZQe(this,function(a,s){r!=null&&(n=[{event:s.event,type:s.type,namespace:s.namespace,callback:r}],i=n.length);for(var l=o(function(f){var d=n[f];if(d.type===s.type&&(!d.namespace||d.namespace===s.namespace||d.namespace===KQe)&&a.eventMatches(a.context,d,s)){var p=[s];e!=null&&DYe(p,e),a.beforeEmit(a.context,d,s),d.conf&&d.conf.one&&(a.listeners=a.listeners.filter(function(y){return y!==d}));var m=a.callbackContext(a.context,d,s),g=d.callback.apply(m,p);a.afterEmit(a.context,d,s),g===!1&&(s.stopPropagation(),s.preventDefault())}},"_loop2"),u=0;u1&&!s){var l=this.length-1,u=this[l],h=u._private.data.id;this[l]=void 0,this[e]=u,a.set(h,{ele:u,index:e})}return this.length--,this},"unmergeAt"),unmergeOne:o(function(e){e=e[0];var r=this._private,n=e._private.data.id,i=r.map,a=i.get(n);if(!a)return this;var s=a.index;return this.unmergeAt(s),this},"unmergeOne"),unmerge:o(function(e){var r=this._private.cy;if(!e)return this;if(e&&Zt(e)){var n=e;e=r.mutableElements().filter(n)}for(var i=0;i=0;r--){var n=this[r];e(n)&&this.unmergeAt(r)}return this},"unmergeBy"),map:o(function(e,r){for(var n=[],i=this,a=0;an&&(n=u,i=l)}return{value:n,ele:i}},"max"),min:o(function(e,r){for(var n=1/0,i,a=this,s=0;s=0&&a"u"?"undefined":qi(Symbol))!=e&&qi(Symbol.iterator)!=e;r&&(H6[Symbol.iterator]=function(){var n=this,i={value:void 0,done:!1},a=0,s=this.length;return ige({next:o(function(){return a1&&arguments[1]!==void 0?arguments[1]:!0,n=this[0],i=n.cy();if(i.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,i.style().apply(n));var a=n._private.style[e];return a??(r?i.style().getDefaultProperty(e):null)}},"parsedStyle"),numericStyle:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r){var n=r.pstyle(e);return n.pfValue!==void 0?n.pfValue:n.value}},"numericStyle"),numericStyleUnits:o(function(e){var r=this[0];if(r.cy().styleEnabled()&&r)return r.pstyle(e).units},"numericStyleUnits"),renderedStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=this[0];if(n)return r.style().getRenderedStyle(n,e)},"renderedStyle"),style:o(function(e,r){var n=this.cy();if(!n.styleEnabled())return this;var i=!1,a=n.style();if(Ur(e)){var s=e;a.applyBypass(this,s,i),this.emitAndNotify("style")}else if(Zt(e))if(r===void 0){var l=this[0];return l?a.getStylePropertyValue(l,e):void 0}else a.applyBypass(this,e,r,i),this.emitAndNotify("style");else if(e===void 0){var u=this[0];return u?a.getRawStyle(u):void 0}return this},"style"),removeStyle:o(function(e){var r=this.cy();if(!r.styleEnabled())return this;var n=!1,i=r.style(),a=this;if(e===void 0)for(var s=0;s0&&e.push(f[0]),e.push(l[0])}return this.spawn(e,!0).filter(t)},"neighborhood"),closedNeighborhood:o(function(e){return this.neighborhood().add(this).filter(e)},"closedNeighborhood"),openNeighborhood:o(function(e){return this.neighborhood(e)},"openNeighborhood")});Ha.neighbourhood=Ha.neighborhood;Ha.closedNeighbourhood=Ha.closedNeighborhood;Ha.openNeighbourhood=Ha.openNeighborhood;ir(Ha,{source:al(o(function(e){var r=this[0],n;return r&&(n=r._private.source||r.cy().collection()),n&&e?n.filter(e):n},"sourceImpl"),"source"),target:al(o(function(e){var r=this[0],n;return r&&(n=r._private.target||r.cy().collection()),n&&e?n.filter(e):n},"targetImpl"),"target"),sources:Cme({attr:"source"}),targets:Cme({attr:"target"})});o(Cme,"defineSourceFunction");ir(Ha,{edgesWith:al(Ame(),"edgesWith"),edgesTo:al(Ame({thisIsSrc:!0}),"edgesTo")});o(Ame,"defineEdgesWithFunction");ir(Ha,{connectedEdges:al(function(t){for(var e=[],r=this,n=0;n0);return s},"components"),component:o(function(){var e=this[0];return e.cy().mutableElements().components(e)[0]},"component")});Ha.componentsOf=Ha.components;Sa=o(function(e,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(e===void 0){oi("A collection must have a reference to the core");return}var a=new Zc,s=!1;if(!r)r=[];else if(r.length>0&&Ur(r[0])&&!f4(r[0])){s=!0;for(var l=[],u=new ay,h=0,f=r.length;h0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=r.cy(),i=n._private,a=[],s=[],l,u=0,h=r.length;u0){for(var F=l.length===r.length?r:new Sa(n,l),z=0;z0&&arguments[0]!==void 0?arguments[0]:!0,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,r=this,n=[],i={},a=r._private.cy;function s(A){for(var I=A._private.edges,M=0;M0&&(t?R.emitAndNotify("remove"):e&&R.emit("remove"));for(var k=0;kf&&Math.abs(g.v)>f;);return p?function(y){return u[y*(u.length-1)|0]}:h},"springRK4Factory")}(),Nn=o(function(e,r,n,i){var a=lZe(e,r,n,i);return function(s,l,u){return s+(l-s)*a(u)}},"cubicBezier"),M6={linear:o(function(e,r,n){return e+(r-e)*n},"linear"),ease:Nn(.25,.1,.25,1),"ease-in":Nn(.42,0,1,1),"ease-out":Nn(0,0,.58,1),"ease-in-out":Nn(.42,0,.58,1),"ease-in-sine":Nn(.47,0,.745,.715),"ease-out-sine":Nn(.39,.575,.565,1),"ease-in-out-sine":Nn(.445,.05,.55,.95),"ease-in-quad":Nn(.55,.085,.68,.53),"ease-out-quad":Nn(.25,.46,.45,.94),"ease-in-out-quad":Nn(.455,.03,.515,.955),"ease-in-cubic":Nn(.55,.055,.675,.19),"ease-out-cubic":Nn(.215,.61,.355,1),"ease-in-out-cubic":Nn(.645,.045,.355,1),"ease-in-quart":Nn(.895,.03,.685,.22),"ease-out-quart":Nn(.165,.84,.44,1),"ease-in-out-quart":Nn(.77,0,.175,1),"ease-in-quint":Nn(.755,.05,.855,.06),"ease-out-quint":Nn(.23,1,.32,1),"ease-in-out-quint":Nn(.86,0,.07,1),"ease-in-expo":Nn(.95,.05,.795,.035),"ease-out-expo":Nn(.19,1,.22,1),"ease-in-out-expo":Nn(1,0,0,1),"ease-in-circ":Nn(.6,.04,.98,.335),"ease-out-circ":Nn(.075,.82,.165,1),"ease-in-out-circ":Nn(.785,.135,.15,.86),spring:o(function(e,r,n){if(n===0)return M6.linear;var i=cZe(e,r,n);return function(a,s,l){return a+(s-a)*i(l)}},"spring"),"cubic-bezier":Nn};o(Dme,"getEasedValue");o(Lme,"getValue");o(W1,"ease");o(uZe,"step$1");o(Vb,"valid");o(hZe,"startAnimation");o(Rme,"stepAll");fZe={animate:un.animate(),animation:un.animation(),animated:un.animated(),clearQueue:un.clearQueue(),delay:un.delay(),delayAnimation:un.delayAnimation(),stop:un.stop(),addToAnimationPool:o(function(e){var r=this;r.styleEnabled()&&r._private.aniEles.merge(e)},"addToAnimationPool"),stopAnimationLoop:o(function(){this._private.animationsRunning=!1},"stopAnimationLoop"),startAnimationLoop:o(function(){var e=this;if(e._private.animationsRunning=!0,!e.styleEnabled())return;function r(){e._private.animationsRunning&&$6(o(function(a){Rme(a,e),r()},"animationStep"))}o(r,"headlessStep");var n=e.renderer();n&&n.beforeRender?n.beforeRender(o(function(a,s){Rme(s,e)},"rendererAnimationStep"),n.beforeRenderPriorities.animations):r()},"startAnimationLoop")},dZe={qualifierCompare:o(function(e,r){return e==null||r==null?e==null&&r==null:e.sameText(r)},"qualifierCompare"),eventMatches:o(function(e,r,n){var i=r.qualifier;return i!=null?e!==n.target&&f4(n.target)&&i.matches(n.target):!0},"eventMatches"),addEventFields:o(function(e,r){r.cy=e,r.target=e},"addEventFields"),callbackContext:o(function(e,r,n){return r.qualifier!=null?n.target:e},"callbackContext")},E6=o(function(e){return Zt(e)?new $f(e):e},"argSelector"),u1e={createEmitter:o(function(){var e=this._private;return e.emitter||(e.emitter=new aC(dZe,this)),this},"createEmitter"),emitter:o(function(){return this._private.emitter},"emitter"),on:o(function(e,r,n){return this.emitter().on(e,E6(r),n),this},"on"),removeListener:o(function(e,r,n){return this.emitter().removeListener(e,E6(r),n),this},"removeListener"),removeAllListeners:o(function(){return this.emitter().removeAllListeners(),this},"removeAllListeners"),one:o(function(e,r,n){return this.emitter().one(e,E6(r),n),this},"one"),once:o(function(e,r,n){return this.emitter().one(e,E6(r),n),this},"once"),emit:o(function(e,r){return this.emitter().emit(e,r),this},"emit"),emitAndNotify:o(function(e,r){return this.emit(e),this.notify(e,r),this},"emitAndNotify")};un.eventAliasesOn(u1e);CB={png:o(function(e){var r=this._private.renderer;return e=e||{},r.png(e)},"png"),jpg:o(function(e){var r=this._private.renderer;return e=e||{},e.bg=e.bg||"#fff",r.jpg(e)},"jpg")};CB.jpeg=CB.jpg;I6={layout:o(function(e){var r=this;if(e==null){oi("Layout options must be specified to make a layout");return}if(e.name==null){oi("A `name` must be specified to make a layout");return}var n=e.name,i=r.extension("layout",n);if(i==null){oi("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?");return}var a;Zt(e.eles)?a=r.$(e.eles):a=e.eles!=null?e.eles:r.$();var s=new i(ir({},e,{cy:r,eles:a}));return s},"layout")};I6.createLayout=I6.makeLayout=I6.layout;pZe={notify:o(function(e,r){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var i=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();r!=null&&i.merge(r);return}if(n.notificationsEnabled){var a=this.renderer();this.destroyed()||!a||a.notify(e,r)}},"notify"),notifications:o(function(e){var r=this._private;return e===void 0?r.notificationsEnabled:(r.notificationsEnabled=!!e,this)},"notifications"),noNotifications:o(function(e){this.notifications(!1),e(),this.notifications(!0)},"noNotifications"),batching:o(function(){return this._private.batchCount>0},"batching"),startBatch:o(function(){var e=this._private;return e.batchCount==null&&(e.batchCount=0),e.batchCount===0&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},"startBatch"),endBatch:o(function(){var e=this._private;if(e.batchCount===0)return this;if(e.batchCount--,e.batchCount===0){e.batchStyleEles.updateStyle();var r=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var i=e.batchNotifications[n];i.empty()?r.notify(n):r.notify(n,i)})}return this},"endBatch"),batch:o(function(e){return this.startBatch(),e(),this.endBatch(),this},"batch"),batchData:o(function(e){var r=this;return this.batch(function(){for(var n=Object.keys(e),i=0;i0;)r.removeChild(r.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(n){var i=n._private;i.rscratch={},i.rstyle={},i.animation.current=[],i.animation.queue=[]})},"destroyRenderer"),onRender:o(function(e){return this.on("render",e)},"onRender"),offRender:o(function(e){return this.off("render",e)},"offRender")};AB.invalidateDimensions=AB.resize;O6={collection:o(function(e,r){return Zt(e)?this.$(e):xo(e)?e.collection():En(e)?(r||(r={}),new Sa(this,e,r.unique,r.removed)):new Sa(this)},"collection"),nodes:o(function(e){var r=this.$(function(n){return n.isNode()});return e?r.filter(e):r},"nodes"),edges:o(function(e){var r=this.$(function(n){return n.isEdge()});return e?r.filter(e):r},"edges"),$:o(function(e){var r=this._private.elements;return e?r.filter(e):r.spawnSelf()},"$"),mutableElements:o(function(){return this._private.elements},"mutableElements")};O6.elements=O6.filter=O6.$;qa={},Kb="t",gZe="f";qa.apply=function(t){for(var e=this,r=e._private,n=r.cy,i=n.collection(),a=0;a0;if(p||d&&m){var g=void 0;p&&m||p?g=h.properties:m&&(g=h.mappedProperties);for(var y=0;y1&&(S=1),l.color){var E=n.valueMin[0],_=n.valueMax[0],C=n.valueMin[1],D=n.valueMax[1],O=n.valueMin[2],R=n.valueMax[2],k=n.valueMin[3]==null?1:n.valueMin[3],L=n.valueMax[3]==null?1:n.valueMax[3],A=[Math.round(E+(_-E)*S),Math.round(C+(D-C)*S),Math.round(O+(R-O)*S),Math.round(k+(L-k)*S)];a={bypass:n.bypass,name:n.name,value:A,strValue:"rgb("+A[0]+", "+A[1]+", "+A[2]+")"}}else if(l.number){var I=n.valueMin+(n.valueMax-n.valueMin)*S;a=this.parse(n.name,I,n.bypass,p)}else return!1;if(!a)return y(),!1;a.mapping=n,n=a;break}case s.data:{for(var M=n.field.split("."),P=d.data,B=0;B0&&a>0){for(var l={},u=!1,h=0;h0?t.delayAnimation(s).play().promise().then(T):T()}).then(function(){return t.animation({style:l,duration:a,easing:t.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){r.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1})}else n.transitioning&&(this.removeBypasses(t,i),t.emitAndNotify("style"),n.transitioning=!1)};qa.checkTrigger=function(t,e,r,n,i,a){var s=this.properties[e],l=i(s);l!=null&&l(r,n)&&a(s)};qa.checkZOrderTrigger=function(t,e,r,n){var i=this;this.checkTrigger(t,e,r,n,function(a){return a.triggersZOrder},function(){i._private.cy.notify("zorder",t)})};qa.checkBoundsTrigger=function(t,e,r,n){this.checkTrigger(t,e,r,n,function(i){return i.triggersBounds},function(i){t.dirtyCompoundBoundsCache(),t.dirtyBoundingBoxCache(),i.triggersBoundsOfParallelBeziers&&e==="curve-style"&&(r==="bezier"||n==="bezier")&&t.parallelEdges().forEach(function(a){a.dirtyBoundingBoxCache()}),i.triggersBoundsOfConnectedEdges&&e==="display"&&(r==="none"||n==="none")&&t.connectedEdges().forEach(function(a){a.dirtyBoundingBoxCache()})})};qa.checkTriggers=function(t,e,r,n){t.dirtyStyleCache(),this.checkZOrderTrigger(t,e,r,n),this.checkBoundsTrigger(t,e,r,n)};y4={};y4.applyBypass=function(t,e,r,n){var i=this,a=[],s=!0;if(e==="*"||e==="**"){if(r!==void 0)for(var l=0;li.length?n=n.substr(i.length):n=""}o(l,"removeSelAndBlockFromRemaining");function u(){a.length>s.length?a=a.substr(s.length):a=""}for(o(u,"removePropAndValFromRem");;){var h=n.match(/^\s*$/);if(h)break;var f=n.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!f){hn("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+n);break}i=f[0];var d=f[1];if(d!=="core"){var p=new $f(d);if(p.invalid){hn("Skipping parsing of block: Invalid selector found in string stylesheet: "+d),l();continue}}var m=f[2],g=!1;a=m;for(var y=[];;){var v=a.match(/^\s*$/);if(v)break;var x=a.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!x){hn("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+m),g=!0;break}s=x[0];var b=x[1],T=x[2],S=e.properties[b];if(!S){hn("Skipping property: Invalid property name in: "+s),u();continue}var w=r.parse(b,T);if(!w){hn("Skipping property: Invalid property definition in: "+s),u();continue}y.push({name:b,val:T}),u()}if(g){l();break}r.selector(d);for(var E=0;E=7&&e[0]==="d"&&(f=new RegExp(l.data.regex).exec(e))){if(r)return!1;var p=l.data;return{name:t,value:f,strValue:""+e,mapped:p,field:f[1],bypass:r}}else if(e.length>=10&&e[0]==="m"&&(d=new RegExp(l.mapData.regex).exec(e))){if(r||h.multiple)return!1;var m=l.mapData;if(!(h.color||h.number))return!1;var g=this.parse(t,d[4]);if(!g||g.mapped)return!1;var y=this.parse(t,d[5]);if(!y||y.mapped)return!1;if(g.pfValue===y.pfValue||g.strValue===y.strValue)return hn("`"+t+": "+e+"` is not a valid mapper because the output range is zero; converting to `"+t+": "+g.strValue+"`"),this.parse(t,g.strValue);if(h.color){var v=g.value,x=y.value,b=v[0]===x[0]&&v[1]===x[1]&&v[2]===x[2]&&(v[3]===x[3]||(v[3]==null||v[3]===1)&&(x[3]==null||x[3]===1));if(b)return!1}return{name:t,value:d,strValue:""+e,mapped:m,field:d[1],fieldMin:parseFloat(d[2]),fieldMax:parseFloat(d[3]),valueMin:g.value,valueMax:y.value,bypass:r}}}if(h.multiple&&n!=="multiple"){var T;if(u?T=e.split(/\s+/):En(e)?T=e:T=[e],h.evenMultiple&&T.length%2!==0)return null;for(var S=[],w=[],E=[],_="",C=!1,D=0;D0?" ":"")+O.strValue}return h.validate&&!h.validate(S,w)?null:h.singleEnum&&C?S.length===1&&Zt(S[0])?{name:t,value:S[0],strValue:S[0],bypass:r}:null:{name:t,value:S,pfValue:E,strValue:_,bypass:r,units:w}}var R=o(function(){for(var Q=0;Qh.max||h.strictMax&&e===h.max))return null;var M={name:t,value:e,strValue:""+e+(k||""),units:k,bypass:r};return h.unitless||k!=="px"&&k!=="em"?M.pfValue=e:M.pfValue=k==="px"||!k?e:this.getEmSizeInPixels()*e,(k==="ms"||k==="s")&&(M.pfValue=k==="ms"?e:1e3*e),(k==="deg"||k==="rad")&&(M.pfValue=k==="rad"?e:QYe(e)),k==="%"&&(M.pfValue=e/100),M}else if(h.propList){var P=[],B=""+e;if(B!=="none"){for(var F=B.split(/\s*,\s*|\s+/),z=0;z0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0){u=Math.min((s-2*r)/n.w,(l-2*r)/n.h),u=u>this._private.maxZoom?this._private.maxZoom:u,u=u=n.minZoom&&(n.maxZoom=r),this},"zoomRange"),minZoom:o(function(e){return e===void 0?this._private.minZoom:this.zoomRange({min:e})},"minZoom"),maxZoom:o(function(e){return e===void 0?this._private.maxZoom:this.zoomRange({max:e})},"maxZoom"),getZoomedViewport:o(function(e){var r=this._private,n=r.pan,i=r.zoom,a,s,l=!1;if(r.zoomingEnabled||(l=!0),_t(e)?s=e:Ur(e)&&(s=e.level,e.position!=null?a=J6(e.position,i,n):e.renderedPosition!=null&&(a=e.renderedPosition),a!=null&&!r.panningEnabled&&(l=!0)),s=s>r.maxZoom?r.maxZoom:s,s=sr.maxZoom||!r.zoomingEnabled?s=!0:(r.zoom=u,a.push("zoom"))}if(i&&(!s||!e.cancelOnFailedZoom)&&r.panningEnabled){var h=e.pan;_t(h.x)&&(r.pan.x=h.x,l=!1),_t(h.y)&&(r.pan.y=h.y,l=!1),l||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},"viewport"),center:o(function(e){var r=this.getCenterPan(e);return r&&(this._private.pan=r,this.emit("pan viewport"),this.notify("viewport")),this},"center"),getCenterPan:o(function(e,r){if(this._private.panningEnabled){if(Zt(e)){var n=e;e=this.mutableElements().filter(n)}else xo(e)||(e=this.mutableElements());if(e.length!==0){var i=e.boundingBox(),a=this.width(),s=this.height();r=r===void 0?this._private.zoom:r;var l={x:(a-r*(i.x1+i.x2))/2,y:(s-r*(i.y1+i.y2))/2};return l}}},"getCenterPan"),reset:o(function(){return!this._private.panningEnabled||!this._private.zoomingEnabled?this:(this.viewport({pan:{x:0,y:0},zoom:1}),this)},"reset"),invalidateSize:o(function(){this._private.sizeCache=null},"invalidateSize"),size:o(function(){var e=this._private,r=e.container,n=this;return e.sizeCache=e.sizeCache||(r?function(){var i=n.window().getComputedStyle(r),a=o(function(l){return parseFloat(i.getPropertyValue(l))},"val");return{width:r.clientWidth-a("padding-left")-a("padding-right"),height:r.clientHeight-a("padding-top")-a("padding-bottom")}}():{width:1,height:1})},"size"),width:o(function(){return this.size().width},"width"),height:o(function(){return this.size().height},"height"),extent:o(function(){var e=this._private.pan,r=this._private.zoom,n=this.renderedExtent(),i={x1:(n.x1-e.x)/r,x2:(n.x2-e.x)/r,y1:(n.y1-e.y)/r,y2:(n.y2-e.y)/r};return i.w=i.x2-i.x1,i.h=i.y2-i.y1,i},"extent"),renderedExtent:o(function(){var e=this.width(),r=this.height();return{x1:0,y1:0,x2:e,y2:r,w:e,h:r}},"renderedExtent"),multiClickDebounceTime:o(function(e){if(e)this._private.multiClickDebounceTime=e;else return this._private.multiClickDebounceTime;return this},"multiClickDebounceTime")};e0.centre=e0.center;e0.autolockNodes=e0.autolock;e0.autoungrabifyNodes=e0.autoungrabify;c4={data:un.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:un.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:un.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:un.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};c4.attr=c4.data;c4.removeAttr=c4.removeData;u4=o(function(e){var r=this;e=ir({},e);var n=e.container;n&&!F6(n)&&F6(n[0])&&(n=n[0]);var i=n?n._cyreg:null;i=i||{},i&&i.cy&&(i.cy.destroy(),i={});var a=i.readies=i.readies||[];n&&(n._cyreg=i),i.cy=r;var s=Hi!==void 0&&n!==void 0&&!e.headless,l=e;l.layout=ir({name:s?"grid":"null"},l.layout),l.renderer=ir({name:s?"canvas":"null"},l.renderer);var u=o(function(g,y,v){return y!==void 0?y:v!==void 0?v:g},"defVal"),h=this._private={container:n,ready:!1,options:l,elements:new Sa(this),listeners:[],aniEles:new Sa(this),data:l.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:u(!0,l.zoomingEnabled),userZoomingEnabled:u(!0,l.userZoomingEnabled),panningEnabled:u(!0,l.panningEnabled),userPanningEnabled:u(!0,l.userPanningEnabled),boxSelectionEnabled:u(!0,l.boxSelectionEnabled),autolock:u(!1,l.autolock,l.autolockNodes),autoungrabify:u(!1,l.autoungrabify,l.autoungrabifyNodes),autounselectify:u(!1,l.autounselectify),styleEnabled:l.styleEnabled===void 0?s:l.styleEnabled,zoom:_t(l.zoom)?l.zoom:1,pan:{x:Ur(l.pan)&&_t(l.pan.x)?l.pan.x:0,y:Ur(l.pan)&&_t(l.pan.y)?l.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:u(250,l.multiClickDebounceTime)};this.createEmitter(),this.selectionType(l.selectionType),this.zoomRange({min:l.minZoom,max:l.maxZoom});var f=o(function(g,y){var v=g.some(wqe);if(v)return sy.all(g).then(y);y(g)},"loadExtData");h.styleEnabled&&r.setStyle([]);var d=ir({},l,l.renderer);r.initRenderer(d);var p=o(function(g,y,v){r.notifications(!1);var x=r.mutableElements();x.length>0&&x.remove(),g!=null&&(Ur(g)||En(g))&&r.add(g),r.one("layoutready",function(T){r.notifications(!0),r.emit(T),r.one("load",y),r.emitAndNotify("load")}).one("layoutstop",function(){r.one("done",v),r.emit("done")});var b=ir({},r._private.options.layout);b.eles=r.elements(),r.layout(b).run()},"setElesAndLayout");f([l.style,l.elements],function(m){var g=m[0],y=m[1];h.styleEnabled&&r.style().append(g),p(y,function(){r.startAnimationLoop(),h.ready=!0,li(l.ready)&&r.on("ready",l.ready);for(var v=0;v0,l=!!t.boundingBox,u=e.extent(),h=Ys(l?t.boundingBox:{x1:u.x1,y1:u.y1,w:u.w,h:u.h}),f;if(xo(t.roots))f=t.roots;else if(En(t.roots)){for(var d=[],p=0;p0;){var I=A(),M=O(I,k);if(M)I.outgoers().filter(function(ae){return ae.isNode()&&r.has(ae)}).forEach(L);else if(M===null){hn("Detected double maximal shift for node `"+I.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var P=0;if(t.avoidOverlap)for(var B=0;B0&&b[0].length<=3?ze/2:0),Ie=2*Math.PI/b[Be].length*He;return Be===0&&b[0].length===1&&(Le=1),{x:he.x+Le*Math.cos(Ie),y:he.y+Le*Math.sin(Ie)}}else{var xe=b[Be].length,q=Math.max(xe===1?0:l?(h.w-t.padding*2-le.w)/((t.grid?Se:xe)-1):(h.w-t.padding*2-le.w)/((t.grid?Se:xe)+1),P),de={x:he.x+(He+1-(xe+1)/2)*q,y:he.y+(Be+1-(ce+1)/2)*J};return de}},"getPosition");return r.nodes().layoutPositions(this,t,se),this};TZe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(f1e,"CircleLayout");f1e.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,a=n.nodes().not(":parent");e.sort&&(a=a.sort(e.sort));for(var s=Ys(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=e.sweep===void 0?2*Math.PI-2*Math.PI/a.length:e.sweep,h=u/Math.max(1,a.length-1),f,d=0,p=0;p1&&e.avoidOverlap){d*=1.75;var x=Math.cos(h)-Math.cos(0),b=Math.sin(h)-Math.sin(0),T=Math.sqrt(d*d/(x*x+b*b));f=Math.max(T,f)}var S=o(function(E,_){var C=e.startAngle+_*h*(i?1:-1),D=f*Math.cos(C),O=f*Math.sin(C),R={x:l.x+D,y:l.y+O};return R},"getPos");return n.nodes().layoutPositions(this,e,S),this};wZe={fit:!0,padding:30,startAngle:3/2*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:o(function(e){return e.degree()},"concentric"),levelWidth:o(function(e){return e.maxDegree()/4},"levelWidth"),animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(d1e,"ConcentricLayout");d1e.prototype.run=function(){for(var t=this.options,e=t,r=e.counterclockwise!==void 0?!e.counterclockwise:e.clockwise,n=t.cy,i=e.eles,a=i.nodes().not(":parent"),s=Ys(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l={x:s.x1+s.w/2,y:s.y1+s.h/2},u=[],h=0,f=0;f0){var w=Math.abs(b[0].value-S.value);w>=v&&(b=[],x.push(b))}b.push(S)}var E=h+e.minNodeSpacing;if(!e.avoidOverlap){var _=x.length>0&&x[0].length>1,C=Math.min(s.w,s.h)/2-E,D=C/(x.length+_?1:0);E=Math.min(E,D)}for(var O=0,R=0;R1&&e.avoidOverlap){var I=Math.cos(A)-Math.cos(0),M=Math.sin(A)-Math.sin(0),P=Math.sqrt(E*E/(I*I+M*M));O=Math.max(P,O)}k.r=O,O+=E}if(e.equidistant){for(var B=0,F=0,z=0;z=t.numIter||(LZe(n,t),n.temperature=n.temperature*t.coolingFactor,n.temperature=t.animationThreshold&&a(),$6(d)}},"frame");f()}else{for(;h;)h=s(u),u++;Ime(n,t),l()}return this};uC.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this};uC.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};EZe=o(function(e,r,n){for(var i=n.eles.edges(),a=n.eles.nodes(),s=Ys(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),l={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:i.size(),temperature:n.initialTemp,clientWidth:s.w,clientHeight:s.h,boundingBox:s},u=n.eles.components(),h={},f=0;f0){l.graphSet.push(C);for(var f=0;fi.count?0:i.graph},"findLCA"),CZe=o(function t(e,r,n,i){var a=i.graphSet[n];if(-10)var d=i.nodeOverlap*f,p=Math.sqrt(l*l+u*u),m=d*l/p,g=d*u/p;else var y=q6(e,l,u),v=q6(r,-1*l,-1*u),x=v.x-y.x,b=v.y-y.y,T=x*x+b*b,p=Math.sqrt(T),d=(e.nodeRepulsion+r.nodeRepulsion)/T,m=d*x/p,g=d*b/p;e.isLocked||(e.offsetX-=m,e.offsetY-=g),r.isLocked||(r.offsetX+=m,r.offsetY+=g)}},"nodeRepulsion"),MZe=o(function(e,r,n,i){if(n>0)var a=e.maxX-r.minX;else var a=r.maxX-e.minX;if(i>0)var s=e.maxY-r.minY;else var s=r.maxY-e.minY;return a>=0&&s>=0?Math.sqrt(a*a+s*s):0},"nodesOverlap"),q6=o(function(e,r,n){var i=e.positionX,a=e.positionY,s=e.height||1,l=e.width||1,u=n/r,h=s/l,f={};return r===0&&0n?(f.x=i,f.y=a+s/2,f):0r&&-1*h<=u&&u<=h?(f.x=i-l/2,f.y=a-l*n/2/r,f):0=h)?(f.x=i+s*r/2/n,f.y=a+s/2,f):(0>n&&(u<=-1*h||u>=h)&&(f.x=i-s*r/2/n,f.y=a-s/2),f)},"findClippingPoint"),IZe=o(function(e,r){for(var n=0;nn){var v=r.gravity*m/y,x=r.gravity*g/y;p.offsetX+=v,p.offsetY+=x}}}}},"calculateGravityForces"),PZe=o(function(e,r){var n=[],i=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;i<=a;){var s=n[i++],l=e.idToIndex[s],u=e.layoutNodes[l],h=u.children;if(0n)var a={x:n*e/i,y:n*r/i};else var a={x:e,y:r};return a},"limitForce"),$Ze=o(function t(e,r){var n=e.parentId;if(n!=null){var i=r.layoutNodes[r.idToIndex[n]],a=!1;if((i.maxX==null||e.maxX+i.padRight>i.maxX)&&(i.maxX=e.maxX+i.padRight,a=!0),(i.minX==null||e.minX-i.padLefti.maxY)&&(i.maxY=e.maxY+i.padBottom,a=!0),(i.minY==null||e.minY-i.padTopx&&(g+=v+r.componentSpacing,m=0,y=0,v=0)}}},"separateComponents"),zZe={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:o(function(e){},"position"),sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:o(function(e,r){return!0},"animateFilter"),ready:void 0,stop:void 0,transform:o(function(e,r){return r},"transform")};o(m1e,"GridLayout");m1e.prototype.run=function(){var t=this.options,e=t,r=t.cy,n=e.eles,i=n.nodes().not(":parent");e.sort&&(i=i.sort(e.sort));var a=Ys(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()});if(a.h===0||a.w===0)n.nodes().layoutPositions(this,e,function(K){return{x:a.x1,y:a.y1}});else{var s=i.size(),l=Math.sqrt(s*a.h/a.w),u=Math.round(l),h=Math.round(a.w/a.h*l),f=o(function(ee){if(ee==null)return Math.min(u,h);var Y=Math.min(u,h);Y==u?u=ee:h=ee},"small"),d=o(function(ee){if(ee==null)return Math.max(u,h);var Y=Math.max(u,h);Y==u?u=ee:h=ee},"large"),p=e.rows,m=e.cols!=null?e.cols:e.columns;if(p!=null&&m!=null)u=p,h=m;else if(p!=null&&m==null)u=p,h=Math.ceil(s/u);else if(p==null&&m!=null)h=m,u=Math.ceil(s/h);else if(h*u>s){var g=f(),y=d();(g-1)*y>=s?f(g-1):(y-1)*g>=s&&d(y-1)}else for(;h*u=s?d(x+1):f(v+1)}var b=a.w/h,T=a.h/u;if(e.condense&&(b=0,T=0),e.avoidOverlap)for(var S=0;S=h&&(I=0,A++)},"moveToNextCell"),P={},B=0;B(I=uXe(t,e,M[P],M[P+1],M[P+2],M[P+3])))return v(_,I),!0}else if(D.edgeType==="bezier"||D.edgeType==="multibezier"||D.edgeType==="self"||D.edgeType==="compound"){for(var M=D.allpts,P=0;P+5(I=cXe(t,e,M[P],M[P+1],M[P+2],M[P+3],M[P+4],M[P+5])))return v(_,I),!0}for(var B=B||C.source,F=F||C.target,z=i.getArrowWidth(O,R),$=[{name:"source",x:D.arrowStartX,y:D.arrowStartY,angle:D.srcArrowAngle},{name:"target",x:D.arrowEndX,y:D.arrowEndY,angle:D.tgtArrowAngle},{name:"mid-source",x:D.midX,y:D.midY,angle:D.midsrcArrowAngle},{name:"mid-target",x:D.midX,y:D.midY,angle:D.midtgtArrowAngle}],P=0;P<$.length;P++){var U=$[P],K=a.arrowShapes[_.pstyle(U.name+"-arrow-shape").value],ee=_.pstyle("width").pfValue;if(K.roughCollide(t,e,z,U.angle,{x:U.x,y:U.y},ee,f)&&K.collide(t,e,z,U.angle,{x:U.x,y:U.y},ee,f))return v(_),!0}h&&l.length>0&&(x(B),x(F))}o(b,"checkEdge");function T(_,C,D){return Wl(_,C,D)}o(T,"preprop");function S(_,C){var D=_._private,O=p,R;C?R=C+"-":R="",_.boundingBox();var k=D.labelBounds[C||"main"],L=_.pstyle(R+"label").value,A=_.pstyle("text-events").strValue==="yes";if(!(!A||!L)){var I=T(D.rscratch,"labelX",C),M=T(D.rscratch,"labelY",C),P=T(D.rscratch,"labelAngle",C),B=_.pstyle(R+"text-margin-x").pfValue,F=_.pstyle(R+"text-margin-y").pfValue,z=k.x1-O-B,$=k.x2+O-B,U=k.y1-O-F,K=k.y2+O-F;if(P){var ee=Math.cos(P),Y=Math.sin(P),ce=o(function(he,le){return he=he-I,le=le-M,{x:he*ee-le*Y+I,y:he*Y+le*ee+M}},"rotate"),Z=ce(z,U),ue=ce(z,K),Q=ce($,U),j=ce($,K),ne=[Z.x+B,Z.y+F,Q.x+B,Q.y+F,j.x+B,j.y+F,ue.x+B,ue.y+F];if(qs(t,e,ne))return v(_),!0}else if(ry(k,t,e))return v(_),!0}}o(S,"checkLabel");for(var w=s.length-1;w>=0;w--){var E=s[w];E.isNode()?x(E)||S(E):b(E)||S(E)||S(E,"source")||S(E,"target")}return l};r0.getAllInBox=function(t,e,r,n){var i=this.getCachedZSortedEles().interactive,a=[],s=Math.min(t,r),l=Math.max(t,r),u=Math.min(e,n),h=Math.max(e,n);t=s,r=l,e=u,n=h;for(var f=Ys({x1:t,y1:e,x2:r,y2:n}),d=0;d0?-(Math.PI-e.ang):Math.PI+e.ang},"invertVec"),qZe=o(function(e,r,n,i,a){if(e!==$me?zme(r,e,Kc):WZe(nl,Kc),zme(r,n,nl),Bme=Kc.nx*nl.ny-Kc.ny*nl.nx,Fme=Kc.nx*nl.nx-Kc.ny*-nl.ny,rh=Math.asin(Math.max(-1,Math.min(1,Bme))),Math.abs(rh)<1e-6){_B=r.x,DB=r.y,Yp=Y1=0;return}Xp=1,P6=!1,Fme<0?rh<0?rh=Math.PI+rh:(rh=Math.PI-rh,Xp=-1,P6=!0):rh>0&&(Xp=-1,P6=!0),r.radius!==void 0?Y1=r.radius:Y1=i,Up=rh/2,S6=Math.min(Kc.len/2,nl.len/2),a?(jc=Math.abs(Math.cos(Up)*Y1/Math.sin(Up)),jc>S6?(jc=S6,Yp=Math.abs(jc*Math.sin(Up)/Math.cos(Up))):Yp=Y1):(jc=Math.min(S6,Y1),Yp=Math.abs(jc*Math.sin(Up)/Math.cos(Up))),LB=r.x+nl.nx*jc,RB=r.y+nl.ny*jc,_B=LB-nl.ny*Yp*Xp,DB=RB+nl.nx*Yp*Xp,x1e=r.x+Kc.nx*jc,b1e=r.y+Kc.ny*jc,$me=r},"calcCornerArc");o(T1e,"drawPreparedRoundCorner");o(rF,"getRoundCorner");Ya={};Ya.findMidptPtsEtc=function(t,e){var r=e.posPts,n=e.intersectionPts,i=e.vectorNormInverse,a,s=t.pstyle("source-endpoint"),l=t.pstyle("target-endpoint"),u=s.units!=null&&l.units!=null,h=o(function(w,E,_,C){var D=C-E,O=_-w,R=Math.sqrt(O*O+D*D);return{x:-D/R,y:O/R}},"recalcVectorNormInverse"),f=t.pstyle("edge-distances").value;switch(f){case"node-position":a=r;break;case"intersection":a=n;break;case"endpoints":{if(u){var d=this.manualEndptToPx(t.source()[0],s),p=Ri(d,2),m=p[0],g=p[1],y=this.manualEndptToPx(t.target()[0],l),v=Ri(y,2),x=v[0],b=v[1],T={x1:m,y1:g,x2:x,y2:b};i=h(m,g,x,b),a=T}else hn("Edge ".concat(t.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),a=n;break}}return{midptPts:a,vectorNormInverse:i}};Ya.findHaystackPoints=function(t){for(var e=0;e0?Math.max(W-pe,0):Math.min(W+pe,0)},"subDWH"),L=k(O,C),A=k(R,D),I=!1;b===h?x=Math.abs(L)>Math.abs(A)?i:n:b===u||b===l?(x=n,I=!0):(b===a||b===s)&&(x=i,I=!0);var M=x===n,P=M?A:L,B=M?R:O,F=Sge(B),z=!1;!(I&&(S||E))&&(b===l&&B<0||b===u&&B>0||b===a&&B>0||b===s&&B<0)&&(F*=-1,P=F*Math.abs(P),z=!0);var $;if(S){var U=w<0?1+w:w;$=U*P}else{var K=w<0?P:0;$=K+w*F}var ee=o(function(W){return Math.abs(W)<_||Math.abs(W)>=Math.abs(P)},"getIsTooClose"),Y=ee($),ce=ee(Math.abs(P)-Math.abs($)),Z=Y||ce;if(Z&&!z)if(M){var ue=Math.abs(B)<=p/2,Q=Math.abs(O)<=m/2;if(ue){var j=(f.x1+f.x2)/2,ne=f.y1,te=f.y2;r.segpts=[j,ne,j,te]}else if(Q){var he=(f.y1+f.y2)/2,le=f.x1,J=f.x2;r.segpts=[le,he,J,he]}else r.segpts=[f.x1,f.y2]}else{var Se=Math.abs(B)<=d/2,se=Math.abs(R)<=g/2;if(Se){var ae=(f.y1+f.y2)/2,Oe=f.x1,ye=f.x2;r.segpts=[Oe,ae,ye,ae]}else if(se){var Be=(f.x1+f.x2)/2,He=f.y1,ze=f.y2;r.segpts=[Be,He,Be,ze]}else r.segpts=[f.x2,f.y1]}else if(M){var Le=f.y1+$+(v?p/2*F:0),Ie=f.x1,xe=f.x2;r.segpts=[Ie,Le,xe,Le]}else{var q=f.x1+$+(v?d/2*F:0),de=f.y1,ie=f.y2;r.segpts=[q,de,q,ie]}if(r.isRound){var oe=t.pstyle("taxi-radius").value,V=t.pstyle("radius-type").value[0]==="arc-radius";r.radii=new Array(r.segpts.length/2).fill(oe),r.isArcRadius=new Array(r.segpts.length/2).fill(V)}};Ya.tryToCorrectInvalidPoints=function(t,e){var r=t._private.rscratch;if(r.edgeType==="bezier"){var n=e.srcPos,i=e.tgtPos,a=e.srcW,s=e.srcH,l=e.tgtW,u=e.tgtH,h=e.srcShape,f=e.tgtShape,d=e.srcCornerRadius,p=e.tgtCornerRadius,m=e.srcRs,g=e.tgtRs,y=!_t(r.startX)||!_t(r.startY),v=!_t(r.arrowStartX)||!_t(r.arrowStartY),x=!_t(r.endX)||!_t(r.endY),b=!_t(r.arrowEndX)||!_t(r.arrowEndY),T=3,S=this.getArrowWidth(t.pstyle("width").pfValue,t.pstyle("arrow-scale").value)*this.arrowShapeWidth,w=T*S,E=Qp({x:r.ctrlpts[0],y:r.ctrlpts[1]},{x:r.startX,y:r.startY}),_=EA.poolIndex()){var I=L;L=A,A=I}var M=D.srcPos=L.position(),P=D.tgtPos=A.position(),B=D.srcW=L.outerWidth(),F=D.srcH=L.outerHeight(),z=D.tgtW=A.outerWidth(),$=D.tgtH=A.outerHeight(),U=D.srcShape=r.nodeShapes[e.getNodeShape(L)],K=D.tgtShape=r.nodeShapes[e.getNodeShape(A)],ee=D.srcCornerRadius=L.pstyle("corner-radius").value==="auto"?"auto":L.pstyle("corner-radius").pfValue,Y=D.tgtCornerRadius=A.pstyle("corner-radius").value==="auto"?"auto":A.pstyle("corner-radius").pfValue,ce=D.tgtRs=A._private.rscratch,Z=D.srcRs=L._private.rscratch;D.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var ue=0;ue0){var te=a,he=Wp(te,j1(r)),le=Wp(te,j1(ne)),J=he;if(le2){var Se=Wp(te,{x:ne[2],y:ne[3]});Se0){var ie=s,oe=Wp(ie,j1(r)),V=Wp(ie,j1(de)),Te=oe;if(V2){var W=Wp(ie,{x:de[2],y:de[3]});W=g||_){v={cp:S,segment:E};break}}if(v)break}var C=v.cp,D=v.segment,O=(g-x)/D.length,R=D.t1-D.t0,k=m?D.t0+R*O:D.t1-R*O;k=i4(0,k,1),e=Q1(C.p0,C.p1,C.p2,k),p=XZe(C.p0,C.p1,C.p2,k);break}case"straight":case"segments":case"haystack":{for(var L=0,A,I,M,P,B=n.allpts.length,F=0;F+3=g));F+=2);var z=g-I,$=z/A;$=i4(0,$,1),e=JYe(M,P,$),p=E1e(M,P);break}}s("labelX",d,e.x),s("labelY",d,e.y),s("labelAutoAngle",d,p)}},"calculateEndProjection");h("source"),h("target"),this.applyLabelDimensions(t)}};eu.applyLabelDimensions=function(t){this.applyPrefixedLabelDimensions(t),t.isEdge()&&(this.applyPrefixedLabelDimensions(t,"source"),this.applyPrefixedLabelDimensions(t,"target"))};eu.applyPrefixedLabelDimensions=function(t,e){var r=t._private,n=this.getLabelText(t,e),i=this.calculateLabelDimensions(t,n),a=t.pstyle("line-height").pfValue,s=t.pstyle("text-wrap").strValue,l=Wl(r.rscratch,"labelWrapCachedLines",e)||[],u=s!=="wrap"?1:Math.max(l.length,1),h=i.height/u,f=h*a,d=i.width,p=i.height+(u-1)*(a-1)*h;Nf(r.rstyle,"labelWidth",e,d),Nf(r.rscratch,"labelWidth",e,d),Nf(r.rstyle,"labelHeight",e,p),Nf(r.rscratch,"labelHeight",e,p),Nf(r.rscratch,"labelLineHeight",e,f)};eu.getLabelText=function(t,e){var r=t._private,n=e?e+"-":"",i=t.pstyle(n+"label").strValue,a=t.pstyle("text-transform").value,s=o(function(K,ee){return ee?(Nf(r.rscratch,K,e,ee),ee):Wl(r.rscratch,K,e)},"rscratch");if(!i)return"";a=="none"||(a=="uppercase"?i=i.toUpperCase():a=="lowercase"&&(i=i.toLowerCase()));var l=t.pstyle("text-wrap").value;if(l==="wrap"){var u=s("labelKey");if(u!=null&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var h="\u200B",f=i.split(` -`),d=t.pstyle("text-max-width").pfValue,p=t.pstyle("text-overflow-wrap").value,m=p==="anywhere",g=[],y=/[\s\u200b]+|$/g,v=0;vd){var w=x.matchAll(y),E="",_=0,C=vo(w),D;try{for(C.s();!(D=C.n()).done;){var O=D.value,R=O[0],k=x.substring(_,O.index);_=O.index+R.length;var L=E.length===0?k:E+k+R,A=this.calculateLabelDimensions(t,L),I=A.width;I<=d?E+=k+R:(E&&g.push(E),E=k+R)}}catch(U){C.e(U)}finally{C.f()}E.match(/^[\s\u200b]+$/)||g.push(E)}else g.push(x)}s("labelWrapCachedLines",g),i=s("labelWrapCachedText",g.join(` -`)),s("labelWrapKey",u)}else if(l==="ellipsis"){var M=t.pstyle("text-max-width").pfValue,P="",B="\u2026",F=!1;if(this.calculateLabelDimensions(t,i).widthM)break;P+=i[z],z===i.length-1&&(F=!0)}return F||(P+=B),P}return i};eu.getLabelJustification=function(t){var e=t.pstyle("text-justification").strValue,r=t.pstyle("text-halign").strValue;if(e==="auto")if(t.isNode())switch(r){case"left":return"right";case"right":return"left";default:return"center"}else return"center";else return e};eu.calculateLabelDimensions=function(t,e){var r=this,n=r.cy.window(),i=n.document,a=Bf(e,t._private.labelDimsKey),s=r.labelDimCache||(r.labelDimCache=[]),l=s[a];if(l!=null)return l;var u=0,h=t.pstyle("font-style").strValue,f=t.pstyle("font-size").pfValue,d=t.pstyle("font-family").strValue,p=t.pstyle("font-weight").strValue,m=this.labelCalcCanvas,g=this.labelCalcCanvasContext;if(!m){m=this.labelCalcCanvas=i.createElement("canvas"),g=this.labelCalcCanvasContext=m.getContext("2d");var y=m.style;y.position="absolute",y.left="-9999px",y.top="-9999px",y.zIndex="-1",y.visibility="hidden",y.pointerEvents="none"}g.font="".concat(h," ").concat(p," ").concat(f,"px ").concat(d);for(var v=0,x=0,b=e.split(` -`),T=0;T1&&arguments[1]!==void 0?arguments[1]:!0;if(e.merge(s),l)for(var u=0;u=t.desktopTapThreshold2}var ot=a(q);at&&(t.hoverData.tapholdCancelled=!0);var Yt=o(function(){var kt=t.hoverData.dragDelta=t.hoverData.dragDelta||[];kt.length===0?(kt.push(De[0]),kt.push(De[1])):(kt[0]+=De[0],kt[1]+=De[1])},"updateDragDelta");ie=!0,i(_e,["mousemove","vmousemove","tapdrag"],q,{x:W[0],y:W[1]});var Tt=o(function(){t.data.bgActivePosistion=void 0,t.hoverData.selecting||oe.emit({originalEvent:q,type:"boxstart",position:{x:W[0],y:W[1]}}),Pe[4]=1,t.hoverData.selecting=!0,t.redrawHint("select",!0),t.redraw()},"goIntoBoxMode");if(t.hoverData.which===3){if(at){var Mt={originalEvent:q,type:"cxtdrag",position:{x:W[0],y:W[1]}};Ve?Ve.emit(Mt):oe.emit(Mt),t.hoverData.cxtDragged=!0,(!t.hoverData.cxtOver||_e!==t.hoverData.cxtOver)&&(t.hoverData.cxtOver&&t.hoverData.cxtOver.emit({originalEvent:q,type:"cxtdragout",position:{x:W[0],y:W[1]}}),t.hoverData.cxtOver=_e,_e&&_e.emit({originalEvent:q,type:"cxtdragover",position:{x:W[0],y:W[1]}}))}}else if(t.hoverData.dragging){if(ie=!0,oe.panningEnabled()&&oe.userPanningEnabled()){var bt;if(t.hoverData.justStartedPan){var ut=t.hoverData.mdownPos;bt={x:(W[0]-ut[0])*V,y:(W[1]-ut[1])*V},t.hoverData.justStartedPan=!1}else bt={x:De[0]*V,y:De[1]*V};oe.panBy(bt),oe.emit("dragpan"),t.hoverData.dragged=!0}W=t.projectIntoViewport(q.clientX,q.clientY)}else if(Pe[4]==1&&(Ve==null||Ve.pannable())){if(at){if(!t.hoverData.dragging&&oe.boxSelectionEnabled()&&(ot||!oe.panningEnabled()||!oe.userPanningEnabled()))Tt();else if(!t.hoverData.selecting&&oe.panningEnabled()&&oe.userPanningEnabled()){var St=s(Ve,t.hoverData.downs);St&&(t.hoverData.dragging=!0,t.hoverData.justStartedPan=!0,Pe[4]=0,t.data.bgActivePosistion=j1(pe),t.redrawHint("select",!0),t.redraw())}Ve&&Ve.pannable()&&Ve.active()&&Ve.unactivate()}}else{if(Ve&&Ve.pannable()&&Ve.active()&&Ve.unactivate(),(!Ve||!Ve.grabbed())&&_e!=be&&(be&&i(be,["mouseout","tapdragout"],q,{x:W[0],y:W[1]}),_e&&i(_e,["mouseover","tapdragover"],q,{x:W[0],y:W[1]}),t.hoverData.last=_e),Ve)if(at){if(oe.boxSelectionEnabled()&&ot)Ve&&Ve.grabbed()&&(x(qe),Ve.emit("freeon"),qe.emit("free"),t.dragData.didDrag&&(Ve.emit("dragfreeon"),qe.emit("dragfree"))),Tt();else if(Ve&&Ve.grabbed()&&t.nodeIsDraggable(Ve)){var ft=!t.dragData.didDrag;ft&&t.redrawHint("eles",!0),t.dragData.didDrag=!0,t.hoverData.draggingEles||y(qe,{inDragLayer:!0});var vt={x:0,y:0};if(_t(De[0])&&_t(De[1])&&(vt.x+=De[0],vt.y+=De[1],ft)){var nt=t.hoverData.dragDelta;nt&&_t(nt[0])&&_t(nt[1])&&(vt.x+=nt[0],vt.y+=nt[1])}t.hoverData.draggingEles=!0,qe.silentShift(vt).emit("position drag"),t.redrawHint("drag",!0),t.redraw()}}else Yt();ie=!0}if(Pe[2]=W[0],Pe[3]=W[1],ie)return q.stopPropagation&&q.stopPropagation(),q.preventDefault&&q.preventDefault(),!1}},"mousemoveHandler"),!1);var k,L,A;t.registerBinding(e,"mouseup",o(function(q){if(!(t.hoverData.which===1&&q.which!==1&&t.hoverData.capture)){var de=t.hoverData.capture;if(de){t.hoverData.capture=!1;var ie=t.cy,oe=t.projectIntoViewport(q.clientX,q.clientY),V=t.selection,Te=t.findNearestElement(oe[0],oe[1],!0,!1),W=t.dragData.possibleDragElements,pe=t.hoverData.down,ve=a(q);if(t.data.bgActivePosistion&&(t.redrawHint("select",!0),t.redraw()),t.hoverData.tapholdCancelled=!0,t.data.bgActivePosistion=void 0,pe&&pe.unactivate(),t.hoverData.which===3){var Pe={originalEvent:q,type:"cxttapend",position:{x:oe[0],y:oe[1]}};if(pe?pe.emit(Pe):ie.emit(Pe),!t.hoverData.cxtDragged){var _e={originalEvent:q,type:"cxttap",position:{x:oe[0],y:oe[1]}};pe?pe.emit(_e):ie.emit(_e)}t.hoverData.cxtDragged=!1,t.hoverData.which=null}else if(t.hoverData.which===1){if(i(Te,["mouseup","tapend","vmouseup"],q,{x:oe[0],y:oe[1]}),!t.dragData.didDrag&&!t.hoverData.dragged&&!t.hoverData.selecting&&!t.hoverData.isOverThresholdDrag&&(i(pe,["click","tap","vclick"],q,{x:oe[0],y:oe[1]}),L=!1,q.timeStamp-A<=ie.multiClickDebounceTime()?(k&&clearTimeout(k),L=!0,A=null,i(pe,["dblclick","dbltap","vdblclick"],q,{x:oe[0],y:oe[1]})):(k=setTimeout(function(){L||i(pe,["oneclick","onetap","voneclick"],q,{x:oe[0],y:oe[1]})},ie.multiClickDebounceTime()),A=q.timeStamp)),pe==null&&!t.dragData.didDrag&&!t.hoverData.selecting&&!t.hoverData.dragged&&!a(q)&&(ie.$(r).unselect(["tapunselect"]),W.length>0&&t.redrawHint("eles",!0),t.dragData.possibleDragElements=W=ie.collection()),Te==pe&&!t.dragData.didDrag&&!t.hoverData.selecting&&Te!=null&&Te._private.selectable&&(t.hoverData.dragging||(ie.selectionType()==="additive"||ve?Te.selected()?Te.unselect(["tapunselect"]):Te.select(["tapselect"]):ve||(ie.$(r).unmerge(Te).unselect(["tapunselect"]),Te.select(["tapselect"]))),t.redrawHint("eles",!0)),t.hoverData.selecting){var be=ie.collection(t.getAllInBox(V[0],V[1],V[2],V[3]));t.redrawHint("select",!0),be.length>0&&t.redrawHint("eles",!0),ie.emit({type:"boxend",originalEvent:q,position:{x:oe[0],y:oe[1]}});var Ve=o(function(at){return at.selectable()&&!at.selected()},"eleWouldBeSelected");ie.selectionType()==="additive"||ve||ie.$(r).unmerge(be).unselect(),be.emit("box").stdFilter(Ve).select().emit("boxselect"),t.redraw()}if(t.hoverData.dragging&&(t.hoverData.dragging=!1,t.redrawHint("select",!0),t.redrawHint("eles",!0),t.redraw()),!V[4]){t.redrawHint("drag",!0),t.redrawHint("eles",!0);var De=pe&&pe.grabbed();x(W),De&&(pe.emit("freeon"),W.emit("free"),t.dragData.didDrag&&(pe.emit("dragfreeon"),W.emit("dragfree")))}}V[4]=0,t.hoverData.down=null,t.hoverData.cxtStarted=!1,t.hoverData.draggingEles=!1,t.hoverData.selecting=!1,t.hoverData.isOverThresholdDrag=!1,t.dragData.didDrag=!1,t.hoverData.dragged=!1,t.hoverData.dragDelta=[],t.hoverData.mdownPos=null,t.hoverData.mdownGPos=null,t.hoverData.which=null}}},"mouseupHandler"),!1);var I=o(function(q){if(!t.scrollingPage){var de=t.cy,ie=de.zoom(),oe=de.pan(),V=t.projectIntoViewport(q.clientX,q.clientY),Te=[V[0]*ie+oe.x,V[1]*ie+oe.y];if(t.hoverData.draggingEles||t.hoverData.dragging||t.hoverData.cxtStarted||D()){q.preventDefault();return}if(de.panningEnabled()&&de.userPanningEnabled()&&de.zoomingEnabled()&&de.userZoomingEnabled()){q.preventDefault(),t.data.wheelZooming=!0,clearTimeout(t.data.wheelTimeout),t.data.wheelTimeout=setTimeout(function(){t.data.wheelZooming=!1,t.redrawHint("eles",!0),t.redraw()},150);var W;q.deltaY!=null?W=q.deltaY/-250:q.wheelDeltaY!=null?W=q.wheelDeltaY/1e3:W=q.wheelDelta/1e3,W=W*t.wheelSensitivity;var pe=q.deltaMode===1;pe&&(W*=33);var ve=de.zoom()*Math.pow(10,W);q.type==="gesturechange"&&(ve=t.gestureStartZoom*q.scale),de.zoom({level:ve,renderedPosition:{x:Te[0],y:Te[1]}}),de.emit(q.type==="gesturechange"?"pinchzoom":"scrollzoom")}}},"wheelHandler");t.registerBinding(t.container,"wheel",I,!0),t.registerBinding(e,"scroll",o(function(q){t.scrollingPage=!0,clearTimeout(t.scrollingPageTimeout),t.scrollingPageTimeout=setTimeout(function(){t.scrollingPage=!1},250)},"scrollHandler"),!0),t.registerBinding(t.container,"gesturestart",o(function(q){t.gestureStartZoom=t.cy.zoom(),t.hasTouchStarted||q.preventDefault()},"gestureStartHandler"),!0),t.registerBinding(t.container,"gesturechange",function(xe){t.hasTouchStarted||I(xe)},!0),t.registerBinding(t.container,"mouseout",o(function(q){var de=t.projectIntoViewport(q.clientX,q.clientY);t.cy.emit({originalEvent:q,type:"mouseout",position:{x:de[0],y:de[1]}})},"mouseOutHandler"),!1),t.registerBinding(t.container,"mouseover",o(function(q){var de=t.projectIntoViewport(q.clientX,q.clientY);t.cy.emit({originalEvent:q,type:"mouseover",position:{x:de[0],y:de[1]}})},"mouseOverHandler"),!1);var M,P,B,F,z,$,U,K,ee,Y,ce,Z,ue,Q=o(function(q,de,ie,oe){return Math.sqrt((ie-q)*(ie-q)+(oe-de)*(oe-de))},"distance"),j=o(function(q,de,ie,oe){return(ie-q)*(ie-q)+(oe-de)*(oe-de)},"distanceSq"),ne;t.registerBinding(t.container,"touchstart",ne=o(function(q){if(t.hasTouchStarted=!0,!!O(q)){T(),t.touchData.capture=!0,t.data.bgActivePosistion=void 0;var de=t.cy,ie=t.touchData.now,oe=t.touchData.earlier;if(q.touches[0]){var V=t.projectIntoViewport(q.touches[0].clientX,q.touches[0].clientY);ie[0]=V[0],ie[1]=V[1]}if(q.touches[1]){var V=t.projectIntoViewport(q.touches[1].clientX,q.touches[1].clientY);ie[2]=V[0],ie[3]=V[1]}if(q.touches[2]){var V=t.projectIntoViewport(q.touches[2].clientX,q.touches[2].clientY);ie[4]=V[0],ie[5]=V[1]}if(q.touches[1]){t.touchData.singleTouchMoved=!0,x(t.dragData.touchDragEles);var Te=t.findContainerClientCoords();ee=Te[0],Y=Te[1],ce=Te[2],Z=Te[3],M=q.touches[0].clientX-ee,P=q.touches[0].clientY-Y,B=q.touches[1].clientX-ee,F=q.touches[1].clientY-Y,ue=0<=M&&M<=ce&&0<=B&&B<=ce&&0<=P&&P<=Z&&0<=F&&F<=Z;var W=de.pan(),pe=de.zoom();z=Q(M,P,B,F),$=j(M,P,B,F),U=[(M+B)/2,(P+F)/2],K=[(U[0]-W.x)/pe,(U[1]-W.y)/pe];var ve=200,Pe=ve*ve;if($=1){for(var st=t.touchData.startPosition=[null,null,null,null,null,null],Ue=0;Ue=t.touchTapThreshold2}if(de&&t.touchData.cxt){q.preventDefault();var st=q.touches[0].clientX-ee,Ue=q.touches[0].clientY-Y,ct=q.touches[1].clientX-ee,We=q.touches[1].clientY-Y,ot=j(st,Ue,ct,We),Yt=ot/$,Tt=150,Mt=Tt*Tt,bt=1.5,ut=bt*bt;if(Yt>=ut||ot>=Mt){t.touchData.cxt=!1,t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var St={originalEvent:q,type:"cxttapend",position:{x:V[0],y:V[1]}};t.touchData.start?(t.touchData.start.unactivate().emit(St),t.touchData.start=null):oe.emit(St)}}if(de&&t.touchData.cxt){var St={originalEvent:q,type:"cxtdrag",position:{x:V[0],y:V[1]}};t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.touchData.start?t.touchData.start.emit(St):oe.emit(St),t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxtDragged=!0;var ft=t.findNearestElement(V[0],V[1],!0,!0);(!t.touchData.cxtOver||ft!==t.touchData.cxtOver)&&(t.touchData.cxtOver&&t.touchData.cxtOver.emit({originalEvent:q,type:"cxtdragout",position:{x:V[0],y:V[1]}}),t.touchData.cxtOver=ft,ft&&ft.emit({originalEvent:q,type:"cxtdragover",position:{x:V[0],y:V[1]}}))}else if(de&&q.touches[2]&&oe.boxSelectionEnabled())q.preventDefault(),t.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,t.touchData.selecting||oe.emit({originalEvent:q,type:"boxstart",position:{x:V[0],y:V[1]}}),t.touchData.selecting=!0,t.touchData.didSelect=!0,ie[4]=1,!ie||ie.length===0||ie[0]===void 0?(ie[0]=(V[0]+V[2]+V[4])/3,ie[1]=(V[1]+V[3]+V[5])/3,ie[2]=(V[0]+V[2]+V[4])/3+1,ie[3]=(V[1]+V[3]+V[5])/3+1):(ie[2]=(V[0]+V[2]+V[4])/3,ie[3]=(V[1]+V[3]+V[5])/3),t.redrawHint("select",!0),t.redraw();else if(de&&q.touches[1]&&!t.touchData.didSelect&&oe.zoomingEnabled()&&oe.panningEnabled()&&oe.userZoomingEnabled()&&oe.userPanningEnabled()){q.preventDefault(),t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var vt=t.dragData.touchDragEles;if(vt){t.redrawHint("drag",!0);for(var nt=0;nt0&&!t.hoverData.draggingEles&&!t.swipePanning&&t.data.bgActivePosistion!=null&&(t.data.bgActivePosistion=void 0,t.redrawHint("select",!0),t.redraw())}},"touchmoveHandler"),!1);var he;t.registerBinding(e,"touchcancel",he=o(function(q){var de=t.touchData.start;t.touchData.capture=!1,de&&de.unactivate()},"touchcancelHandler"));var le,J,Se,se;if(t.registerBinding(e,"touchend",le=o(function(q){var de=t.touchData.start,ie=t.touchData.capture;if(ie)q.touches.length===0&&(t.touchData.capture=!1),q.preventDefault();else return;var oe=t.selection;t.swipePanning=!1,t.hoverData.draggingEles=!1;var V=t.cy,Te=V.zoom(),W=t.touchData.now,pe=t.touchData.earlier;if(q.touches[0]){var ve=t.projectIntoViewport(q.touches[0].clientX,q.touches[0].clientY);W[0]=ve[0],W[1]=ve[1]}if(q.touches[1]){var ve=t.projectIntoViewport(q.touches[1].clientX,q.touches[1].clientY);W[2]=ve[0],W[3]=ve[1]}if(q.touches[2]){var ve=t.projectIntoViewport(q.touches[2].clientX,q.touches[2].clientY);W[4]=ve[0],W[5]=ve[1]}de&&de.unactivate();var Pe;if(t.touchData.cxt){if(Pe={originalEvent:q,type:"cxttapend",position:{x:W[0],y:W[1]}},de?de.emit(Pe):V.emit(Pe),!t.touchData.cxtDragged){var _e={originalEvent:q,type:"cxttap",position:{x:W[0],y:W[1]}};de?de.emit(_e):V.emit(_e)}t.touchData.start&&(t.touchData.start._private.grabbed=!1),t.touchData.cxt=!1,t.touchData.start=null,t.redraw();return}if(!q.touches[2]&&V.boxSelectionEnabled()&&t.touchData.selecting){t.touchData.selecting=!1;var be=V.collection(t.getAllInBox(oe[0],oe[1],oe[2],oe[3]));oe[0]=void 0,oe[1]=void 0,oe[2]=void 0,oe[3]=void 0,oe[4]=0,t.redrawHint("select",!0),V.emit({type:"boxend",originalEvent:q,position:{x:W[0],y:W[1]}});var Ve=o(function(Mt){return Mt.selectable()&&!Mt.selected()},"eleWouldBeSelected");be.emit("box").stdFilter(Ve).select().emit("boxselect"),be.nonempty()&&t.redrawHint("eles",!0),t.redraw()}if(de?.unactivate(),q.touches[2])t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);else if(!q.touches[1]){if(!q.touches[0]){if(!q.touches[0]){t.data.bgActivePosistion=void 0,t.redrawHint("select",!0);var De=t.dragData.touchDragEles;if(de!=null){var qe=de._private.grabbed;x(De),t.redrawHint("drag",!0),t.redrawHint("eles",!0),qe&&(de.emit("freeon"),De.emit("free"),t.dragData.didDrag&&(de.emit("dragfreeon"),De.emit("dragfree"))),i(de,["touchend","tapend","vmouseup","tapdragout"],q,{x:W[0],y:W[1]}),de.unactivate(),t.touchData.start=null}else{var at=t.findNearestElement(W[0],W[1],!0,!0);i(at,["touchend","tapend","vmouseup","tapdragout"],q,{x:W[0],y:W[1]})}var Rt=t.touchData.startPosition[0]-W[0],st=Rt*Rt,Ue=t.touchData.startPosition[1]-W[1],ct=Ue*Ue,We=st+ct,ot=We*Te*Te;t.touchData.singleTouchMoved||(de||V.$(":selected").unselect(["tapunselect"]),i(de,["tap","vclick"],q,{x:W[0],y:W[1]}),J=!1,q.timeStamp-se<=V.multiClickDebounceTime()?(Se&&clearTimeout(Se),J=!0,se=null,i(de,["dbltap","vdblclick"],q,{x:W[0],y:W[1]})):(Se=setTimeout(function(){J||i(de,["onetap","voneclick"],q,{x:W[0],y:W[1]})},V.multiClickDebounceTime()),se=q.timeStamp)),de!=null&&!t.dragData.didDrag&&de._private.selectable&&ot"u"){var ae=[],Oe=o(function(q){return{clientX:q.clientX,clientY:q.clientY,force:1,identifier:q.pointerId,pageX:q.pageX,pageY:q.pageY,radiusX:q.width/2,radiusY:q.height/2,screenX:q.screenX,screenY:q.screenY,target:q.target}},"makeTouch"),ye=o(function(q){return{event:q,touch:Oe(q)}},"makePointer"),Be=o(function(q){ae.push(ye(q))},"addPointer"),He=o(function(q){for(var de=0;de0)return U[0]}return null},"getCurveT"),g=Object.keys(p),y=0;y0?m:_ge(a,s,e,r,n,i,l,u)},"intersectLine"),checkPoint:o(function(e,r,n,i,a,s,l,u){u=u==="auto"?Zp(i,a):u;var h=2*u;if(ih(e,r,this.points,s,l,i,a-h,[0,-1],n)||ih(e,r,this.points,s,l,i-h,a,[0,-1],n))return!0;var f=i/2+2*n,d=a/2+2*n,p=[s-f,l-d,s-f,l,s+f,l,s+f,l-d];return!!(qs(e,r,p)||jp(e,r,h,h,s+i/2-u,l+a/2-u,n)||jp(e,r,h,h,s-i/2+u,l+a/2-u,n))},"checkPoint")}};sh.registerNodeShapes=function(){var t=this.nodeShapes={},e=this;this.generateEllipse(),this.generatePolygon("triangle",Ts(3,0)),this.generateRoundPolygon("round-triangle",Ts(3,0)),this.generatePolygon("rectangle",Ts(4,0)),t.square=t.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();{var r=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",r),this.generateRoundPolygon("round-diamond",r)}this.generatePolygon("pentagon",Ts(5,0)),this.generateRoundPolygon("round-pentagon",Ts(5,0)),this.generatePolygon("hexagon",Ts(6,0)),this.generateRoundPolygon("round-hexagon",Ts(6,0)),this.generatePolygon("heptagon",Ts(7,0)),this.generateRoundPolygon("round-heptagon",Ts(7,0)),this.generatePolygon("octagon",Ts(8,0)),this.generateRoundPolygon("round-octagon",Ts(8,0));var n=new Array(20);{var i=bB(5,0),a=bB(5,Math.PI/5),s=.5*(3-Math.sqrt(5));s*=1.57;for(var l=0;l=e.deqFastCost*S)break}else if(h){if(b>=e.deqCost*m||b>=e.deqAvgCost*p)break}else if(T>=e.deqNoDrawCost*dB)break;var w=e.deq(n,v,y);if(w.length>0)for(var E=0;E0&&(e.onDeqd(n,g),!h&&e.shouldRedraw(n,g,v,y)&&a())},"dequeue"),l=e.priority||zB;i.beforeRender(s,l(n))}},"setupDequeueingImpl")},"setupDequeueing")},KZe=function(){function t(e){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:z6;Vf(this,t),this.idsByKey=new Zc,this.keyForId=new Zc,this.cachesByLvl=new Zc,this.lvls=[],this.getKey=e,this.doesEleInvalidateKey=r}return o(t,"ElementTextureCacheLookup"),Uf(t,[{key:"getIdsFor",value:o(function(r){r==null&&oi("Can not get id list for null key");var n=this.idsByKey,i=this.idsByKey.get(r);return i||(i=new ay,n.set(r,i)),i},"getIdsFor")},{key:"addIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).add(n)},"addIdForKey")},{key:"deleteIdForKey",value:o(function(r,n){r!=null&&this.getIdsFor(r).delete(n)},"deleteIdForKey")},{key:"getNumberOfIdsForKey",value:o(function(r){return r==null?0:this.getIdsFor(r).size},"getNumberOfIdsForKey")},{key:"updateKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);this.deleteIdForKey(i,n),this.addIdForKey(a,n),this.keyForId.set(n,a)},"updateKeyMappingFor")},{key:"deleteKeyMappingFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteIdForKey(i,n),this.keyForId.delete(n)},"deleteKeyMappingFor")},{key:"keyHasChangedFor",value:o(function(r){var n=r.id(),i=this.keyForId.get(n),a=this.getKey(r);return i!==a},"keyHasChangedFor")},{key:"isInvalid",value:o(function(r){return this.keyHasChangedFor(r)||this.doesEleInvalidateKey(r)},"isInvalid")},{key:"getCachesAt",value:o(function(r){var n=this.cachesByLvl,i=this.lvls,a=n.get(r);return a||(a=new Zc,n.set(r,a),i.push(r)),a},"getCachesAt")},{key:"getCache",value:o(function(r,n){return this.getCachesAt(n).get(r)},"getCache")},{key:"get",value:o(function(r,n){var i=this.getKey(r),a=this.getCache(i,n);return a!=null&&this.updateKeyMappingFor(r),a},"get")},{key:"getForCachedKey",value:o(function(r,n){var i=this.keyForId.get(r.id()),a=this.getCache(i,n);return a},"getForCachedKey")},{key:"hasCache",value:o(function(r,n){return this.getCachesAt(n).has(r)},"hasCache")},{key:"has",value:o(function(r,n){var i=this.getKey(r);return this.hasCache(i,n)},"has")},{key:"setCache",value:o(function(r,n,i){i.key=r,this.getCachesAt(n).set(r,i)},"setCache")},{key:"set",value:o(function(r,n,i){var a=this.getKey(r);this.setCache(a,n,i),this.updateKeyMappingFor(r)},"set")},{key:"deleteCache",value:o(function(r,n){this.getCachesAt(n).delete(r)},"deleteCache")},{key:"delete",value:o(function(r,n){var i=this.getKey(r);this.deleteCache(i,n)},"_delete")},{key:"invalidateKey",value:o(function(r){var n=this;this.lvls.forEach(function(i){return n.deleteCache(r,i)})},"invalidateKey")},{key:"invalidate",value:o(function(r){var n=r.id(),i=this.keyForId.get(n);this.deleteKeyMappingFor(r);var a=this.doesEleInvalidateKey(r);return a&&this.invalidateKey(i),a||this.getNumberOfIdsForKey(i)===0},"invalidate")}]),t}(),Hme=25,C6=50,B6=-4,NB=3,L1e=7.99,QZe=8,ZZe=1024,JZe=1024,eJe=1024,tJe=.2,rJe=.8,nJe=10,iJe=.15,aJe=.1,sJe=.9,oJe=.9,lJe=100,cJe=1,K1={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},uJe=oa({getKey:null,doesEleInvalidateKey:z6,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:bge,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),jb=o(function(e,r){var n=this;n.renderer=e,n.onDequeues=[];var i=uJe(r);ir(n,i),n.lookup=new KZe(i.getKey,i.doesEleInvalidateKey),n.setupDequeueing()},"ElementTextureCache"),Yi=jb.prototype;Yi.reasons=K1;Yi.getTextureQueue=function(t){var e=this;return e.eleImgCaches=e.eleImgCaches||{},e.eleImgCaches[t]=e.eleImgCaches[t]||[]};Yi.getRetiredTextureQueue=function(t){var e=this,r=e.eleImgCaches.retired=e.eleImgCaches.retired||{},n=r[t]=r[t]||[];return n};Yi.getElementQueue=function(){var t=this,e=t.eleCacheQueue=t.eleCacheQueue||new m4(function(r,n){return n.reqs-r.reqs});return e};Yi.getElementKeyToQueue=function(){var t=this,e=t.eleKeyToCacheQueue=t.eleKeyToCacheQueue||{};return e};Yi.getElement=function(t,e,r,n,i){var a=this,s=this.renderer,l=s.cy.zoom(),u=this.lookup;if(!e||e.w===0||e.h===0||isNaN(e.w)||isNaN(e.h)||!t.visible()||t.removed()||!a.allowEdgeTxrCaching&&t.isEdge()||!a.allowParentTxrCaching&&t.isParent())return null;if(n==null&&(n=Math.ceil(VB(l*r))),n=L1e||n>NB)return null;var h=Math.pow(2,n),f=e.h*h,d=e.w*h,p=s.eleTextBiggerThanMin(t,h);if(!this.isVisible(t,p))return null;var m=u.get(t,n);if(m&&m.invalidated&&(m.invalidated=!1,m.texture.invalidatedWidth-=m.width),m)return m;var g;if(f<=Hme?g=Hme:f<=C6?g=C6:g=Math.ceil(f/C6)*C6,f>eJe||d>JZe)return null;var y=a.getTextureQueue(g),v=y[y.length-2],x=o(function(){return a.recycleTexture(g,d)||a.addTexture(g,d)},"addNewTxr");v||(v=y[y.length-1]),v||(v=x()),v.width-v.usedWidthn;R--)D=a.getElement(t,e,r,R,K1.downscale);O()}else return a.queueElement(t,E.level-1),E;else{var k;if(!T&&!S&&!w)for(var L=n-1;L>=B6;L--){var A=u.get(t,L);if(A){k=A;break}}if(b(k))return a.queueElement(t,n),k;v.context.translate(v.usedWidth,0),v.context.scale(h,h),this.drawElement(v.context,t,e,p,!1),v.context.scale(1/h,1/h),v.context.translate(-v.usedWidth,0)}return m={x:v.usedWidth,texture:v,level:n,scale:h,width:d,height:f,scaledLabelShown:p},v.usedWidth+=Math.ceil(d+QZe),v.eleCaches.push(m),u.set(t,n,m),a.checkTextureFullness(v),m};Yi.invalidateElements=function(t){for(var e=0;e=tJe*t.width&&this.retireTexture(t)};Yi.checkTextureFullness=function(t){var e=this,r=e.getTextureQueue(t.height);t.usedWidth/t.width>rJe&&t.fullnessChecks>=nJe?Ff(r,t):t.fullnessChecks++};Yi.retireTexture=function(t){var e=this,r=t.height,n=e.getTextureQueue(r),i=this.lookup;Ff(n,t),t.retired=!0;for(var a=t.eleCaches,s=0;s=e)return s.retired=!1,s.usedWidth=0,s.invalidatedWidth=0,s.fullnessChecks=0,GB(s.eleCaches),s.context.setTransform(1,0,0,1,0,0),s.context.clearRect(0,0,s.width,s.height),Ff(i,s),n.push(s),s}};Yi.queueElement=function(t,e){var r=this,n=r.getElementQueue(),i=r.getElementKeyToQueue(),a=this.getKey(t),s=i[a];if(s)s.level=Math.max(s.level,e),s.eles.merge(t),s.reqs++,n.updateItem(s);else{var l={eles:t.spawn().merge(t),level:e,reqs:1,key:a};n.push(l),i[a]=l}};Yi.dequeue=function(t){for(var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=[],a=e.lookup,s=0;s0;s++){var l=r.pop(),u=l.key,h=l.eles[0],f=a.hasCache(h,l.level);if(n[u]=null,f)continue;i.push(l);var d=e.getBoundingBox(h);e.getElement(h,d,t,l.level,K1.dequeue)}return i};Yi.removeFromQueue=function(t){var e=this,r=e.getElementQueue(),n=e.getElementKeyToQueue(),i=this.getKey(t),a=n[i];a!=null&&(a.eles.length===1?(a.reqs=$B,r.updateItem(a),r.pop(),n[i]=null):a.eles.unmerge(t))};Yi.onDequeue=function(t){this.onDequeues.push(t)};Yi.offDequeue=function(t){Ff(this.onDequeues,t)};Yi.setupDequeueing=D1e.setupDequeueing({deqRedrawThreshold:lJe,deqCost:iJe,deqAvgCost:aJe,deqNoDrawCost:sJe,deqFastCost:oJe,deq:o(function(e,r,n){return e.dequeue(r,n)},"deq"),onDeqd:o(function(e,r){for(var n=0;n=fJe||r>X6)return null}n.validateLayersElesOrdering(r,t);var u=n.layersByLevel,h=Math.pow(2,r),f=u[r]=u[r]||[],d,p=n.levelIsComplete(r,t),m,g=o(function(){var O=o(function(I){if(n.validateLayersElesOrdering(I,t),n.levelIsComplete(I,t))return m=u[I],!0},"canUseAsTmpLvl"),R=o(function(I){if(!m)for(var M=r+I;Qb<=M&&M<=X6&&!O(M);M+=I);},"checkLvls");R(1),R(-1);for(var k=f.length-1;k>=0;k--){var L=f[k];L.invalid&&Ff(f,L)}},"checkTempLevels");if(!p)g();else return f;var y=o(function(){if(!d){d=Ys();for(var O=0;Oqme||L>qme)return null;var A=k*L;if(A>bJe)return null;var I=n.makeLayer(d,r);if(R!=null){var M=f.indexOf(R)+1;f.splice(M,0,I)}else(O.insert===void 0||O.insert)&&f.unshift(I);return I},"makeLayer");if(n.skipping&&!l)return null;for(var x=null,b=t.length/hJe,T=!l,S=0;S=b||!Age(x.bb,w.boundingBox()))&&(x=v({insert:!0,after:x}),!x))return null;m||T?n.queueLayer(x,w):n.drawEleInLayer(x,w,r,e),x.eles.push(w),_[r]=x}return m||(T?null:f)};Ca.getEleLevelForLayerLevel=function(t,e){return t};Ca.drawEleInLayer=function(t,e,r,n){var i=this,a=this.renderer,s=t.context,l=e.boundingBox();l.w===0||l.h===0||!e.visible()||(r=i.getEleLevelForLayerLevel(r,n),a.setImgSmoothing(s,!1),a.drawCachedElement(s,e,null,null,r,TJe),a.setImgSmoothing(s,!0))};Ca.levelIsComplete=function(t,e){var r=this,n=r.layersByLevel[t];if(!n||n.length===0)return!1;for(var i=0,a=0;a0||s.invalid)return!1;i+=s.eles.length}return i===e.length};Ca.validateLayersElesOrdering=function(t,e){var r=this.layersByLevel[t];if(r)for(var n=0;n0){e=!0;break}}return e};Ca.invalidateElements=function(t){var e=this;t.length!==0&&(e.lastInvalidationTime=nh(),!(t.length===0||!e.haveLayers())&&e.updateElementsInLayers(t,o(function(n,i,a){e.invalidateLayer(n)},"invalAssocLayers")))};Ca.invalidateLayer=function(t){if(this.lastInvalidationTime=nh(),!t.invalid){var e=t.level,r=t.eles,n=this.layersByLevel[e];Ff(n,t),t.elesQueue=[],t.invalid=!0,t.replacement&&(t.replacement.invalid=!0);for(var i=0;i3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l=e._private.rscratch;if(!(a&&!e.visible())&&!(l.badLine||l.allpts==null||isNaN(l.allpts[0]))){var u;r&&(u=r,t.translate(-u.x1,-u.y1));var h=a?e.pstyle("opacity").value:1,f=a?e.pstyle("line-opacity").value:1,d=e.pstyle("curve-style").value,p=e.pstyle("line-style").value,m=e.pstyle("width").pfValue,g=e.pstyle("line-cap").value,y=e.pstyle("line-outline-width").value,v=e.pstyle("line-outline-color").value,x=h*f,b=h*f,T=o(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;d==="straight-triangle"?(s.eleStrokeStyle(t,e,I),s.drawEdgeTrianglePath(e,t,l.allpts)):(t.lineWidth=m,t.lineCap=g,s.eleStrokeStyle(t,e,I),s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLine"),S=o(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:x;if(t.lineWidth=m+y,t.lineCap=g,y>0)s.colorStrokeStyle(t,v[0],v[1],v[2],I);else{t.lineCap="butt";return}d==="straight-triangle"?s.drawEdgeTrianglePath(e,t,l.allpts):(s.drawEdgePath(e,t,l.allpts,p),t.lineCap="butt")},"drawLineOutline"),w=o(function(){i&&s.drawEdgeOverlay(t,e)},"drawOverlay"),E=o(function(){i&&s.drawEdgeUnderlay(t,e)},"drawUnderlay"),_=o(function(){var I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:b;s.drawArrowheads(t,e,I)},"drawArrows"),C=o(function(){s.drawElementText(t,e,null,n)},"drawText");t.lineJoin="round";var D=e.pstyle("ghost").value==="yes";if(D){var O=e.pstyle("ghost-offset-x").pfValue,R=e.pstyle("ghost-offset-y").pfValue,k=e.pstyle("ghost-opacity").value,L=x*k;t.translate(O,R),T(L),_(L),t.translate(-O,-R)}else S();E(),T(),_(),w(),C(),r&&t.translate(u.x1,u.y1)}};M1e=o(function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(r,n){if(n.visible()){var i=n.pstyle("".concat(e,"-opacity")).value;if(i!==0){var a=this,s=a.usePaths(),l=n._private.rscratch,u=n.pstyle("".concat(e,"-padding")).pfValue,h=2*u,f=n.pstyle("".concat(e,"-color")).value;r.lineWidth=h,l.edgeType==="self"&&!s?r.lineCap="butt":r.lineCap="round",a.colorStrokeStyle(r,f[0],f[1],f[2],i),a.drawEdgePath(n,r,l.allpts,"solid")}}}},"drawEdgeOverlayUnderlay");oh.drawEdgeOverlay=M1e("overlay");oh.drawEdgeUnderlay=M1e("underlay");oh.drawEdgePath=function(t,e,r,n){var i=t._private.rscratch,a=e,s,l=!1,u=this.usePaths(),h=t.pstyle("line-dash-pattern").pfValue,f=t.pstyle("line-dash-offset").pfValue;if(u){var d=r.join("$"),p=i.pathCacheKey&&i.pathCacheKey===d;p?(s=e=i.pathCache,l=!0):(s=e=new Path2D,i.pathCacheKey=d,i.pathCache=s)}if(a.setLineDash)switch(n){case"dotted":a.setLineDash([1,1]);break;case"dashed":a.setLineDash(h),a.lineDashOffset=f;break;case"solid":a.setLineDash([]);break}if(!l&&!i.badLine)switch(e.beginPath&&e.beginPath(),e.moveTo(r[0],r[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var m=2;m+35&&arguments[5]!==void 0?arguments[5]:!0,s=this;if(n==null){if(a&&!s.eleTextBiggerThanMin(e))return}else if(n===!1)return;if(e.isNode()){var l=e.pstyle("label");if(!l||!l.value)return;var u=s.getLabelJustification(e);t.textAlign=u,t.textBaseline="bottom"}else{var h=e.element()._private.rscratch.badLine,f=e.pstyle("label"),d=e.pstyle("source-label"),p=e.pstyle("target-label");if(h||(!f||!f.value)&&(!d||!d.value)&&(!p||!p.value))return;t.textAlign="center",t.textBaseline="bottom"}var m=!r,g;r&&(g=r,t.translate(-g.x1,-g.y1)),i==null?(s.drawText(t,e,null,m,a),e.isEdge()&&(s.drawText(t,e,"source",m,a),s.drawText(t,e,"target",m,a))):s.drawText(t,e,i,m,a),r&&t.translate(g.x1,g.y1)};n0.getFontCache=function(t){var e;this.fontCaches=this.fontCaches||[];for(var r=0;r2&&arguments[2]!==void 0?arguments[2]:!0,n=e.pstyle("font-style").strValue,i=e.pstyle("font-size").pfValue+"px",a=e.pstyle("font-family").strValue,s=e.pstyle("font-weight").strValue,l=r?e.effectiveOpacity()*e.pstyle("text-opacity").value:1,u=e.pstyle("text-outline-opacity").value*l,h=e.pstyle("color").value,f=e.pstyle("text-outline-color").value;t.font=n+" "+s+" "+i+" "+a,t.lineJoin="round",this.colorFillStyle(t,h[0],h[1],h[2],l),this.colorStrokeStyle(t,f[0],f[1],f[2],u)};o(mB,"roundRect");n0.getTextAngle=function(t,e){var r,n=t._private,i=n.rscratch,a=e?e+"-":"",s=t.pstyle(a+"text-rotation");if(s.strValue==="autorotate"){var l=Wl(i,"labelAngle",e);r=t.isEdge()?l:0}else s.strValue==="none"?r=0:r=s.pfValue;return r};n0.drawText=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=e._private,s=a.rscratch,l=i?e.effectiveOpacity():1;if(!(i&&(l===0||e.pstyle("text-opacity").value===0))){r==="main"&&(r=null);var u=Wl(s,"labelX",r),h=Wl(s,"labelY",r),f,d,p=this.getLabelText(e,r);if(p!=null&&p!==""&&!isNaN(u)&&!isNaN(h)){this.setupTextStyle(t,e,i);var m=r?r+"-":"",g=Wl(s,"labelWidth",r),y=Wl(s,"labelHeight",r),v=e.pstyle(m+"text-margin-x").pfValue,x=e.pstyle(m+"text-margin-y").pfValue,b=e.isEdge(),T=e.pstyle("text-halign").value,S=e.pstyle("text-valign").value;b&&(T="center",S="center"),u+=v,h+=x;var w;switch(n?w=this.getTextAngle(e,r):w=0,w!==0&&(f=u,d=h,t.translate(f,d),t.rotate(w),u=0,h=0),S){case"top":break;case"center":h+=y/2;break;case"bottom":h+=y;break}var E=e.pstyle("text-background-opacity").value,_=e.pstyle("text-border-opacity").value,C=e.pstyle("text-border-width").pfValue,D=e.pstyle("text-background-padding").pfValue,O=e.pstyle("text-background-shape").strValue,R=O.indexOf("round")===0,k=2;if(E>0||C>0&&_>0){var L=u-D;switch(T){case"left":L-=g;break;case"center":L-=g/2;break}var A=h-y-D,I=g+2*D,M=y+2*D;if(E>0){var P=t.fillStyle,B=e.pstyle("text-background-color").value;t.fillStyle="rgba("+B[0]+","+B[1]+","+B[2]+","+E*l+")",R?mB(t,L,A,I,M,k):t.fillRect(L,A,I,M),t.fillStyle=P}if(C>0&&_>0){var F=t.strokeStyle,z=t.lineWidth,$=e.pstyle("text-border-color").value,U=e.pstyle("text-border-style").value;if(t.strokeStyle="rgba("+$[0]+","+$[1]+","+$[2]+","+_*l+")",t.lineWidth=C,t.setLineDash)switch(U){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"double":t.lineWidth=C/4,t.setLineDash([]);break;case"solid":t.setLineDash([]);break}if(R?mB(t,L,A,I,M,k,"stroke"):t.strokeRect(L,A,I,M),U==="double"){var K=C/2;R?mB(t,L+K,A+K,I-K*2,M-K*2,k,"stroke"):t.strokeRect(L+K,A+K,I-K*2,M-K*2)}t.setLineDash&&t.setLineDash([]),t.lineWidth=z,t.strokeStyle=F}}var ee=2*e.pstyle("text-outline-width").pfValue;if(ee>0&&(t.lineWidth=ee),e.pstyle("text-wrap").value==="wrap"){var Y=Wl(s,"labelWrapCachedLines",r),ce=Wl(s,"labelLineHeight",r),Z=g/2,ue=this.getLabelJustification(e);switch(ue==="auto"||(T==="left"?ue==="left"?u+=-g:ue==="center"&&(u+=-Z):T==="center"?ue==="left"?u+=-Z:ue==="right"&&(u+=Z):T==="right"&&(ue==="center"?u+=Z:ue==="right"&&(u+=g))),S){case"top":h-=(Y.length-1)*ce;break;case"center":case"bottom":h-=(Y.length-1)*ce;break}for(var Q=0;Q0&&t.strokeText(Y[Q],u,h),t.fillText(Y[Q],u,h),h+=ce}else ee>0&&t.strokeText(p,u,h),t.fillText(p,u,h);w!==0&&(t.rotate(-w),t.translate(-f,-d))}}};py={};py.drawNode=function(t,e,r){var n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,a=arguments.length>5&&arguments[5]!==void 0?arguments[5]:!0,s=this,l,u,h=e._private,f=h.rscratch,d=e.position();if(!(!_t(d.x)||!_t(d.y))&&!(a&&!e.visible())){var p=a?e.effectiveOpacity():1,m=s.usePaths(),g,y=!1,v=e.padding();l=e.width()+2*v,u=e.height()+2*v;var x;r&&(x=r,t.translate(-x.x1,-x.y1));for(var b=e.pstyle("background-image"),T=b.value,S=new Array(T.length),w=new Array(T.length),E=0,_=0;_0&&arguments[0]!==void 0?arguments[0]:L;s.eleFillStyle(t,e,oe)},"setupShapeColor"),Q=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:$;s.colorStrokeStyle(t,A[0],A[1],A[2],oe)},"setupBorderColor"),j=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Y;s.colorStrokeStyle(t,K[0],K[1],K[2],oe)},"setupOutlineColor"),ne=o(function(oe,V,Te,W){var pe=s.nodePathCache=s.nodePathCache||[],ve=xge(Te==="polygon"?Te+","+W.join(","):Te,""+V,""+oe,""+Z),Pe=pe[ve],_e,be=!1;return Pe!=null?(_e=Pe,be=!0,f.pathCache=_e):(_e=new Path2D,pe[ve]=f.pathCache=_e),{path:_e,cacheHit:be}},"getPath"),te=e.pstyle("shape").strValue,he=e.pstyle("shape-polygon-points").pfValue;if(m){t.translate(d.x,d.y);var le=ne(l,u,te,he);g=le.path,y=le.cacheHit}var J=o(function(){if(!y){var oe=d;m&&(oe={x:0,y:0}),s.nodeShapes[s.getNodeShape(e)].draw(g||t,oe.x,oe.y,l,u,Z,f)}m?t.fill(g):t.fill()},"drawShape"),Se=o(function(){for(var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,V=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,Te=h.backgrounding,W=0,pe=0;pe0&&arguments[0]!==void 0?arguments[0]:!1,V=arguments.length>1&&arguments[1]!==void 0?arguments[1]:p;s.hasPie(e)&&(s.drawPie(t,e,V),oe&&(m||s.nodeShapes[s.getNodeShape(e)].draw(t,d.x,d.y,l,u,Z,f)))},"drawPie"),ae=o(function(){var oe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:p,V=(R>0?R:-R)*oe,Te=R>0?0:255;R!==0&&(s.colorFillStyle(t,Te,Te,Te,V),m?t.fill(g):t.fill())},"darken"),Oe=o(function(){if(k>0){if(t.lineWidth=k,t.lineCap=P,t.lineJoin=M,t.setLineDash)switch(I){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash(F),t.lineDashOffset=z;break;case"solid":case"double":t.setLineDash([]);break}if(B!=="center"){if(t.save(),t.lineWidth*=2,B==="inside")m?t.clip(g):t.clip();else{var oe=new Path2D;oe.rect(-l/2-k,-u/2-k,l+2*k,u+2*k),oe.addPath(g),t.clip(oe,"evenodd")}m?t.stroke(g):t.stroke(),t.restore()}else m?t.stroke(g):t.stroke();if(I==="double"){t.lineWidth=k/3;var V=t.globalCompositeOperation;t.globalCompositeOperation="destination-out",m?t.stroke(g):t.stroke(),t.globalCompositeOperation=V}t.setLineDash&&t.setLineDash([])}},"drawBorder"),ye=o(function(){if(U>0){if(t.lineWidth=U,t.lineCap="butt",t.setLineDash)switch(ee){case"dotted":t.setLineDash([1,1]);break;case"dashed":t.setLineDash([4,2]);break;case"solid":case"double":t.setLineDash([]);break}var oe=d;m&&(oe={x:0,y:0});var V=s.getNodeShape(e),Te=k;B==="inside"&&(Te=0),B==="outside"&&(Te*=2);var W=(l+Te+(U+ce))/l,pe=(u+Te+(U+ce))/u,ve=l*W,Pe=u*pe,_e=s.nodeShapes[V].points,be;if(m){var Ve=ne(ve,Pe,V,_e);be=Ve.path}if(V==="ellipse")s.drawEllipsePath(be||t,oe.x,oe.y,ve,Pe);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(V)){var De=0,qe=0,at=0;V==="round-diamond"?De=(Te+ce+U)*1.4:V==="round-heptagon"?(De=(Te+ce+U)*1.075,at=-(Te/2+ce+U)/35):V==="round-hexagon"?De=(Te+ce+U)*1.12:V==="round-pentagon"?(De=(Te+ce+U)*1.13,at=-(Te/2+ce+U)/15):V==="round-tag"?(De=(Te+ce+U)*1.12,qe=(Te/2+U+ce)*.07):V==="round-triangle"&&(De=(Te+ce+U)*(Math.PI/2),at=-(Te+ce/2+U)/Math.PI),De!==0&&(W=(l+De)/l,ve=l*W,["round-hexagon","round-tag"].includes(V)||(pe=(u+De)/u,Pe=u*pe)),Z=Z==="auto"?Lge(ve,Pe):Z;for(var Rt=ve/2,st=Pe/2,Ue=Z+(Te+U+ce)/2,ct=new Array(_e.length/2),We=new Array(_e.length/2),ot=0;ot<_e.length/2;ot++)ct[ot]={x:oe.x+qe+Rt*_e[ot*2],y:oe.y+at+st*_e[ot*2+1]};var Yt,Tt,Mt,bt,ut=ct.length;for(Tt=ct[ut-1],Yt=0;Yt0){if(i=i||n.position(),a==null||s==null){var m=n.padding();a=n.width()+2*m,s=n.height()+2*m}l.colorFillStyle(r,f[0],f[1],f[2],h),l.nodeShapes[d].draw(r,i.x,i.y,a+u*2,s+u*2,p),r.fill()}}}},"drawNodeOverlayUnderlay");py.drawNodeOverlay=I1e("overlay");py.drawNodeUnderlay=I1e("underlay");py.hasPie=function(t){return t=t[0],t._private.hasPie};py.drawPie=function(t,e,r,n){e=e[0],n=n||e.position();var i=e.cy().style(),a=e.pstyle("pie-size"),s=n.x,l=n.y,u=e.width(),h=e.height(),f=Math.min(u,h)/2,d=0,p=this.usePaths();p&&(s=0,l=0),a.units==="%"?f=f*a.pfValue:a.pfValue!==void 0&&(f=a.pfValue/2);for(var m=1;m<=i.pieBackgroundN;m++){var g=e.pstyle("pie-"+m+"-background-size").value,y=e.pstyle("pie-"+m+"-background-color").value,v=e.pstyle("pie-"+m+"-background-opacity").value*r,x=g/100;x+d>1&&(x=1-d);var b=1.5*Math.PI+2*Math.PI*d,T=2*Math.PI*x,S=b+T;g===0||d>=1||d+x>1||(t.beginPath(),t.moveTo(s,l),t.arc(s,l,f,b,S),t.closePath(),this.colorFillStyle(t,y[0],y[1],y[2],v),t.fill(),d+=x)}};ws={},NJe=100;ws.getPixelRatio=function(){var t=this.data.contexts[0];if(this.forcedPixelRatio!=null)return this.forcedPixelRatio;var e=this.cy.window(),r=t.backingStorePixelRatio||t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return(e.devicePixelRatio||1)/r};ws.paintCache=function(t){for(var e=this.paintCaches=this.paintCaches||[],r=!0,n,i=0;ie.minMbLowQualFrames&&(e.motionBlurPxRatio=e.mbPxRBlurry)),e.clearingMotionBlur&&(e.motionBlurPxRatio=1),e.textureDrawLastFrame&&!d&&(f[e.NODE]=!0,f[e.SELECT_BOX]=!0);var b=r.style(),T=r.zoom(),S=s!==void 0?s:T,w=r.pan(),E={x:w.x,y:w.y},_={zoom:T,pan:{x:w.x,y:w.y}},C=e.prevViewport,D=C===void 0||_.zoom!==C.zoom||_.pan.x!==C.pan.x||_.pan.y!==C.pan.y;!D&&!(y&&!g)&&(e.motionBlurPxRatio=1),l&&(E=l),S*=u,E.x*=u,E.y*=u;var O=e.getCachedZSortedEles();function R(Q,j,ne,te,he){var le=Q.globalCompositeOperation;Q.globalCompositeOperation="destination-out",e.colorFillStyle(Q,255,255,255,e.motionBlurTransparency),Q.fillRect(j,ne,te,he),Q.globalCompositeOperation=le}o(R,"mbclear");function k(Q,j){var ne,te,he,le;!e.clearingMotionBlur&&(Q===h.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]||Q===h.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG])?(ne={x:w.x*m,y:w.y*m},te=T*m,he=e.canvasWidth*m,le=e.canvasHeight*m):(ne=E,te=S,he=e.canvasWidth,le=e.canvasHeight),Q.setTransform(1,0,0,1,0,0),j==="motionBlur"?R(Q,0,0,he,le):!n&&(j===void 0||j)&&Q.clearRect(0,0,he,le),i||(Q.translate(ne.x,ne.y),Q.scale(te,te)),l&&Q.translate(l.x,l.y),s&&Q.scale(s,s)}if(o(k,"setContextTransform"),d||(e.textureDrawLastFrame=!1),d){if(e.textureDrawLastFrame=!0,!e.textureCache){e.textureCache={},e.textureCache.bb=r.mutableElements().boundingBox(),e.textureCache.texture=e.data.bufferCanvases[e.TEXTURE_BUFFER];var L=e.data.bufferContexts[e.TEXTURE_BUFFER];L.setTransform(1,0,0,1,0,0),L.clearRect(0,0,e.canvasWidth*e.textureMult,e.canvasHeight*e.textureMult),e.render({forcedContext:L,drawOnlyNodeLayer:!0,forcedPxRatio:u*e.textureMult});var _=e.textureCache.viewport={zoom:r.zoom(),pan:r.pan(),width:e.canvasWidth,height:e.canvasHeight};_.mpan={x:(0-_.pan.x)/_.zoom,y:(0-_.pan.y)/_.zoom}}f[e.DRAG]=!1,f[e.NODE]=!1;var A=h.contexts[e.NODE],I=e.textureCache.texture,_=e.textureCache.viewport;A.setTransform(1,0,0,1,0,0),p?R(A,0,0,_.width,_.height):A.clearRect(0,0,_.width,_.height);var M=b.core("outside-texture-bg-color").value,P=b.core("outside-texture-bg-opacity").value;e.colorFillStyle(A,M[0],M[1],M[2],P),A.fillRect(0,0,_.width,_.height);var T=r.zoom();k(A,!1),A.clearRect(_.mpan.x,_.mpan.y,_.width/_.zoom/u,_.height/_.zoom/u),A.drawImage(I,_.mpan.x,_.mpan.y,_.width/_.zoom/u,_.height/_.zoom/u)}else e.textureOnViewport&&!n&&(e.textureCache=null);var B=r.extent(),F=e.pinching||e.hoverData.dragging||e.swipePanning||e.data.wheelZooming||e.hoverData.draggingEles||e.cy.animated(),z=e.hideEdgesOnViewport&&F,$=[];if($[e.NODE]=!f[e.NODE]&&p&&!e.clearedForMotionBlur[e.NODE]||e.clearingMotionBlur,$[e.NODE]&&(e.clearedForMotionBlur[e.NODE]=!0),$[e.DRAG]=!f[e.DRAG]&&p&&!e.clearedForMotionBlur[e.DRAG]||e.clearingMotionBlur,$[e.DRAG]&&(e.clearedForMotionBlur[e.DRAG]=!0),f[e.NODE]||i||a||$[e.NODE]){var U=p&&!$[e.NODE]&&m!==1,A=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_NODE]:h.contexts[e.NODE]),K=p&&!U?"motionBlur":void 0;k(A,K),z?e.drawCachedNodes(A,O.nondrag,u,B):e.drawLayeredElements(A,O.nondrag,u,B),e.debug&&e.drawDebugPoints(A,O.nondrag),!i&&!p&&(f[e.NODE]=!1)}if(!a&&(f[e.DRAG]||i||$[e.DRAG])){var U=p&&!$[e.DRAG]&&m!==1,A=n||(U?e.data.bufferContexts[e.MOTIONBLUR_BUFFER_DRAG]:h.contexts[e.DRAG]);k(A,p&&!U?"motionBlur":void 0),z?e.drawCachedNodes(A,O.drag,u,B):e.drawCachedElements(A,O.drag,u,B),e.debug&&e.drawDebugPoints(A,O.drag),!i&&!p&&(f[e.DRAG]=!1)}if(this.drawSelectionRectangle(t,k),p&&m!==1){var ee=h.contexts[e.NODE],Y=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_NODE],ce=h.contexts[e.DRAG],Z=e.data.bufferCanvases[e.MOTIONBLUR_BUFFER_DRAG],ue=o(function(j,ne,te){j.setTransform(1,0,0,1,0,0),te||!x?j.clearRect(0,0,e.canvasWidth,e.canvasHeight):R(j,0,0,e.canvasWidth,e.canvasHeight);var he=m;j.drawImage(ne,0,0,e.canvasWidth*he,e.canvasHeight*he,0,0,e.canvasWidth,e.canvasHeight)},"drawMotionBlur");(f[e.NODE]||$[e.NODE])&&(ue(ee,Y,$[e.NODE]),f[e.NODE]=!1),(f[e.DRAG]||$[e.DRAG])&&(ue(ce,Z,$[e.DRAG]),f[e.DRAG]=!1)}e.prevViewport=_,e.clearingMotionBlur&&(e.clearingMotionBlur=!1,e.motionBlurCleared=!0,e.motionBlur=!0),p&&(e.motionBlurTimeout=setTimeout(function(){e.motionBlurTimeout=null,e.clearedForMotionBlur[e.NODE]=!1,e.clearedForMotionBlur[e.DRAG]=!1,e.motionBlur=!1,e.clearingMotionBlur=!d,e.mbFrames=0,f[e.NODE]=!0,f[e.DRAG]=!0,e.redraw()},NJe)),n||r.emit("render")};ws.drawSelectionRectangle=function(t,e){var r=this,n=r.cy,i=r.data,a=n.style(),s=t.drawOnlyNodeLayer,l=t.drawAllLayers,u=i.canvasNeedsRedraw,h=t.forcedContext;if(r.showFps||!s&&u[r.SELECT_BOX]&&!l){var f=h||i.contexts[r.SELECT_BOX];if(e(f),r.selection[4]==1&&(r.hoverData.selecting||r.touchData.selecting)){var d=r.cy.zoom(),p=a.core("selection-box-border-width").value/d;f.lineWidth=p,f.fillStyle="rgba("+a.core("selection-box-color").value[0]+","+a.core("selection-box-color").value[1]+","+a.core("selection-box-color").value[2]+","+a.core("selection-box-opacity").value+")",f.fillRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]),p>0&&(f.strokeStyle="rgba("+a.core("selection-box-border-color").value[0]+","+a.core("selection-box-border-color").value[1]+","+a.core("selection-box-border-color").value[2]+","+a.core("selection-box-opacity").value+")",f.strokeRect(r.selection[0],r.selection[1],r.selection[2]-r.selection[0],r.selection[3]-r.selection[1]))}if(i.bgActivePosistion&&!r.hoverData.selecting){var d=r.cy.zoom(),m=i.bgActivePosistion;f.fillStyle="rgba("+a.core("active-bg-color").value[0]+","+a.core("active-bg-color").value[1]+","+a.core("active-bg-color").value[2]+","+a.core("active-bg-opacity").value+")",f.beginPath(),f.arc(m.x,m.y,a.core("active-bg-size").pfValue/d,0,2*Math.PI),f.fill()}var g=r.lastRedrawTime;if(r.showFps&&g){g=Math.round(g);var y=Math.round(1e3/g),v="1 frame = "+g+" ms = "+y+" fps";if(f.setTransform(1,0,0,1,0,0),f.fillStyle="rgba(255, 0, 0, 0.75)",f.strokeStyle="rgba(255, 0, 0, 0.75)",f.font="30px Arial",!Ub){var x=f.measureText(v);Ub=x.actualBoundingBoxAscent}f.fillText(v,0,Ub);var b=60;f.strokeRect(0,Ub+10,250,20),f.fillRect(0,Ub+10,250*Math.min(y/b,1),20)}l||(u[r.SELECT_BOX]=!1)}};o(Kme,"compileShader");o(MJe,"createProgram");o(IJe,"createTextureCanvas");o(aF,"getEffectivePanZoom");o(gB,"modelToRenderedPosition");o(A6,"toWebGLColor");o(_6,"indexToVec4");o(OJe,"vec4ToIndex");o(PJe,"createTexture");o(O1e,"getTypeInfo");o(P1e,"createTypedArray");o(BJe,"createTypedArrayView");o(FJe,"createBufferStaticDraw");o(yo,"createBufferDynamicDraw");o($Je,"createPickingFrameBuffer");Qme=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var t=0,e=arguments.length;e--;)t+=arguments[e]*arguments[e];return Math.sqrt(t)});o(Zb,"create");o(B1e,"identity");o(zJe,"multiply");o(j6,"translate");o(F1e,"rotate");o(sF,"scale");o(GJe,"projection");Jb={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},Hb=oa({getKey:null,drawElement:null,getBoundingBox:null,getRotation:null,getRotationPoint:null,getRotationOffset:null,isVisible:null,getPadding:null}),VJe=function(){function t(e,r){Vf(this,t),this.debugID=Math.floor(Math.random()*1e4),this.r=e,this.atlasSize=r.webglTexSize,this.rows=r.webglTexRows,this.enableWrapping=r.enableWrapping,this.texHeight=Math.floor(this.atlasSize/this.rows),this.maxTexWidth=this.atlasSize,this.texture=null,this.canvas=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=r.createTextureCanvas(e,this.atlasSize,this.atlasSize),this.scratch=r.createTextureCanvas(e,this.atlasSize,this.texHeight,"scratch")}return o(t,"Atlas"),Uf(t,[{key:"getKeys",value:o(function(){return new Set(this.keyToLocation.keys())},"getKeys")},{key:"getScale",value:o(function(r){var n=r.w,i=r.h,a=this.texHeight,s=this.maxTexWidth,l=a/i,u=n*l,h=i*l;return u>s&&(l=s/n,u=n*l,h=i*l),{scale:l,texW:u,texH:h}},"getScale")},{key:"draw",value:o(function(r,n,i){var a=this,s=this.atlasSize,l=this.rows,u=this.texHeight,h=this.getScale(n),f=h.scale,d=h.texW,p=h.texH,m=[null,null],g=o(function(T,S){if(i&&S){var w=S.context,E=T.x,_=T.row,C=E,D=u*_;w.save(),w.translate(C,D),w.scale(f,f),i(w,n),w.restore()}},"drawAt"),y=o(function(){g(a.freePointer,a.canvas),m[0]={x:a.freePointer.x,y:a.freePointer.row*u,w:d,h:p},m[1]={x:a.freePointer.x+d,y:a.freePointer.row*u,w:0,h:p},a.freePointer.x+=d,a.freePointer.x==s&&(a.freePointer.x=0,a.freePointer.row++)},"drawNormal"),v=o(function(){var T=a.scratch,S=a.canvas;T.clear(),g({x:0,row:0},T);var w=s-a.freePointer.x,E=d-w,_=u;{var C=a.freePointer.x,D=a.freePointer.row*u,O=w;S.context.drawImage(T,0,0,O,_,C,D,O,_),m[0]={x:C,y:D,w:O,h:p}}{var R=w,k=(a.freePointer.row+1)*u,L=E;S&&S.context.drawImage(T,R,0,L,_,0,k,L,_),m[1]={x:0,y:k,w:L,h:p}}a.freePointer.x=E,a.freePointer.row++},"drawWrapped"),x=o(function(){a.freePointer.x=0,a.freePointer.row++},"moveToStartOfNextRow");if(this.freePointer.x+d<=s)y();else{if(this.freePointer.row>=l-1)return!1;this.freePointer.x===s?(x(),y()):this.enableWrapping?v():(x(),y())}return this.keyToLocation.set(r,m),this.needsBuffer=!0,m},"draw")},{key:"getOffsets",value:o(function(r){return this.keyToLocation.get(r)},"getOffsets")},{key:"isEmpty",value:o(function(){return this.freePointer.x===0&&this.freePointer.row===0},"isEmpty")},{key:"canFit",value:o(function(r){var n=this.atlasSize,i=this.rows,a=this.getScale(r),s=a.texW;return this.freePointer.x+s>n?this.freePointer.row1&&arguments[1]!==void 0?arguments[1]:{},i=n.forceRedraw,a=i===void 0?!1:i,s=n.filterEle,l=s===void 0?function(){return!0}:s,u=n.filterType,h=u===void 0?function(){return!0}:u,f=!1,d=vo(r),p;try{for(d.s();!(p=d.n()).done;){var m=p.value;if(l(m)){var g=m.id(),y=vo(this.getRenderTypes()),v;try{for(y.s();!(v=y.n()).done;){var x=v.value;if(h(x.type)){var b=x.getKey(m);a?(x.atlasCollection.deleteKey(g,b),x.atlasCollection.styleKeyNeedsRedraw.add(b),f=!0):f|=x.atlasCollection.checkKeyIsInvalid(g,b)}}}catch(T){y.e(T)}finally{y.f()}}}}catch(T){d.e(T)}finally{d.f()}return f},"invalidate")},{key:"gc",value:o(function(){var r=vo(this.getRenderTypes()),n;try{for(r.s();!(n=r.n()).done;){var i=n.value;i.atlasCollection.gc()}}catch(a){r.e(a)}finally{r.f()}},"gc")},{key:"isRenderable",value:o(function(r,n){var i=this.getRenderTypeOpts(n);return i&&i.isVisible(r)},"isRenderable")},{key:"startBatch",value:o(function(){this.batchAtlases=[]},"startBatch")},{key:"getAtlasCount",value:o(function(){return this.batchAtlases.length},"getAtlasCount")},{key:"getAtlases",value:o(function(){return this.batchAtlases},"getAtlases")},{key:"getOrCreateAtlas",value:o(function(r,n,i){var a=this.renderTypes.get(i),s=a.getKey(r),l=r.id();return a.atlasCollection.draw(l,s,n,function(u){a.drawElement(u,r,n,!0,!0)})},"getOrCreateAtlas")},{key:"getAtlasIndexForBatch",value:o(function(r){var n=this.batchAtlases.indexOf(r);if(n<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)return;this.batchAtlases.push(r),n=this.batchAtlases.length-1}return n},"getAtlasIndexForBatch")},{key:"getIndexArray",value:o(function(){return Array.from({length:this.maxAtlases},function(r,n){return n})},"getIndexArray")},{key:"getAtlasInfo",value:o(function(r,n){var i=this.renderTypes.get(n),a=i.getBoundingBox(r),s=this.getOrCreateAtlas(r,a,n),l=this.getAtlasIndexForBatch(s);if(l!==void 0){var u=i.getKey(r),h=s.getOffsets(u),f=Ri(h,2),d=f[0],p=f[1];return{atlasID:l,tex:d,tex1:d,tex2:p,bb:a,type:n,styleKey:u}}},"getAtlasInfo")},{key:"canAddToCurrentBatch",value:o(function(r,n){if(this.batchAtlases.length===this.maxAtlasesPerBatch){var i=this.renderTypes.get(n),a=i.getKey(r),s=i.atlasCollection.getAtlas(a);return s&&this.batchAtlases.includes(s)}return!0},"canAddToCurrentBatch")},{key:"setTransformMatrix",value:o(function(r,n,i){var a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!0,s=n.bb,l=n.type,u=n.tex1,h=n.tex2,f=this.getRenderTypeOpts(l),d=f.getPadding?f.getPadding(i):0,p=u.w/(u.w+h.w);a||(p=1-p);var m=this.getAdjustedBB(s,d,a,p),g,y;B1e(r);var v=f.getRotation?f.getRotation(i):0;if(v!==0){var x=f.getRotationPoint(i),b=x.x,T=x.y;j6(r,r,[b,T]),F1e(r,r,v);var S=f.getRotationOffset(i);g=S.x+m.xOffset,y=S.y}else g=m.x1,y=m.y1;j6(r,r,[g,y]),sF(r,r,[m.w,m.h])},"setTransformMatrix")},{key:"getTransformMatrix",value:o(function(r,n){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,a=Zb();return this.setTransformMatrix(a,r,n,i),a},"getTransformMatrix")},{key:"getAdjustedBB",value:o(function(r,n,i,a){var s=r.x1,l=r.y1,u=r.w,h=r.h;n&&(s-=n,l-=n,u+=2*n,h+=2*n);var f=0,d=u*a;return i&&a<1?u=d:!i&&a<1&&(f=u-d,s+=f,u=d),{x1:s,y1:l,w:u,h,xOffset:f}},"getAdjustedBB")},{key:"getDebugInfo",value:o(function(){var r=[],n=vo(this.renderTypes),i;try{for(n.s();!(i=n.n()).done;){var a=Ri(i.value,2),s=a[0],l=a[1],u=l.atlasCollection.getCounts(),h=u.keyCount,f=u.atlasCount;r.push({type:s,keyCount:h,atlasCount:f})}}catch(d){n.e(d)}finally{n.f()}return r},"getDebugInfo")}]),t}(),yB=0,Zme=1,Jme=2,vB=3,qJe=function(){function t(e,r,n){Vf(this,t),this.r=e,this.gl=r,this.maxInstances=n.webglBatchSize,this.maxAtlases=n.webglTexPerBatch,this.atlasSize=n.webglTexSize,this.bgColor=n.bgColor,n.enableWrapping=!0,n.createTextureCanvas=IJe,this.atlasManager=new WJe(e,n),this.program=this.createShaderProgram(Jb.SCREEN),this.pickingProgram=this.createShaderProgram(Jb.PICKING),this.vao=this.createVAO(),this.debugInfo=[]}return o(t,"ElementDrawingWebGL"),Uf(t,[{key:"addTextureRenderType",value:o(function(r,n){this.atlasManager.addRenderType(r,n)},"addTextureRenderType")},{key:"invalidate",value:o(function(r){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=n.type,a=this.atlasManager;return i?a.invalidate(r,{filterType:o(function(l){return l===i},"filterType"),forceRedraw:!0}):a.invalidate(r)},"invalidate")},{key:"gc",value:o(function(){this.atlasManager.gc()},"gc")},{key:"createShaderProgram",value:o(function(r){var n=this.gl,i=`#version 300 es - precision highp float; - - uniform mat3 uPanZoomMatrix; - uniform int uAtlasSize; - - // instanced - in vec2 aPosition; - - // what are we rendering? - in int aVertType; - - // for picking - in vec4 aIndex; - - // For textures - in int aAtlasId; // which shader unit/atlas to use - in vec4 aTex1; // x/y/w/h of texture in atlas - in vec4 aTex2; - - // for any transforms that are needed - in vec4 aScaleRotate1; // vectors use fewer attributes than matrices - in vec2 aTranslate1; - in vec4 aScaleRotate2; - in vec2 aTranslate2; - - // for edges - in vec4 aPointAPointB; - in vec4 aPointCPointD; - in float aLineWidth; - in vec4 aEdgeColor; - - out vec2 vTexCoord; - out vec4 vEdgeColor; - flat out int vAtlasId; - flat out vec4 vIndex; - flat out int vVertType; - - void main(void) { - int vid = gl_VertexID; - vec2 position = aPosition; - - if(aVertType == `.concat(yB,`) { - float texX; - float texY; - float texW; - float texH; - mat3 texMatrix; - - int vid = gl_VertexID; - if(vid <= 5) { - texX = aTex1.x; - texY = aTex1.y; - texW = aTex1.z; - texH = aTex1.w; - texMatrix = mat3( - vec3(aScaleRotate1.xy, 0.0), - vec3(aScaleRotate2.zw, 0.0), - vec3(aTranslate1, 1.0) - ); - } else { - texX = aTex2.x; - texY = aTex2.y; - texW = aTex2.z; - texH = aTex2.w; - texMatrix = mat3( - vec3(aScaleRotate2.xy, 0.0), - vec3(aScaleRotate2.zw, 0.0), - vec3(aTranslate2, 1.0) - ); - } - - if(vid == 1 || vid == 2 || vid == 4 || vid == 7 || vid == 8 || vid == 10) { - texX += texW; - } - if(vid == 2 || vid == 4 || vid == 5 || vid == 8 || vid == 10 || vid == 11) { - texY += texH; - } - - float d = float(uAtlasSize); - vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1 - - gl_Position = vec4(uPanZoomMatrix * texMatrix * vec3(position, 1.0), 1.0); - } - else if(aVertType == `).concat(Zme,` && vid < 6) { - vec2 source = aPointAPointB.xy; - vec2 target = aPointAPointB.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - vec2 xBasis = target - source; - vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x)); - vec2 point = source + xBasis * position.x + yBasis * aLineWidth * position.y; - - gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0); - vEdgeColor = aEdgeColor; - } - else if(aVertType == `).concat(Jme,` && vid < 6) { - vec2 pointA = aPointAPointB.xy; - vec2 pointB = aPointAPointB.zw; - vec2 pointC = aPointCPointD.xy; - vec2 pointD = aPointCPointD.zw; - - // adjust the geometry so that the line is centered on the edge - position.y = position.y - 0.5; - - vec2 p0 = pointA; - vec2 p1 = pointB; - vec2 p2 = pointC; - vec2 pos = position; - if(position.x == 1.0) { - p0 = pointD; - p1 = pointC; - p2 = pointB; - pos = vec2(0.0, -position.y); - } - - vec2 p01 = p1 - p0; - vec2 p12 = p2 - p1; - vec2 p21 = p1 - p2; - - // Find the normal vector. - vec2 tangent = normalize(normalize(p12) + normalize(p01)); - vec2 normal = vec2(-tangent.y, tangent.x); - - // Find the vector perpendicular to p0 -> p1. - vec2 p01Norm = normalize(vec2(-p01.y, p01.x)); - - // Determine the bend direction. - float sigma = sign(dot(p01 + p21, normal)); - float width = aLineWidth; - - if(sign(pos.y) == -sigma) { - // This is an intersecting vertex. Adjust the position so that there's no overlap. - vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } else { - // This is a non-intersecting vertex. Treat it like a mitre join. - vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm); - gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0); - } - - vEdgeColor = aEdgeColor; - } - else if(aVertType == `).concat(vB,` && vid < 3) { - // massage the first triangle into an edge arrow - if(vid == 0) - position = vec2(-0.15, -0.3); - if(vid == 1) - position = vec2( 0.0, 0.0); - if(vid == 2) - position = vec2( 0.15, -0.3); - - mat3 transform = mat3( - vec3(aScaleRotate1.xy, 0.0), - vec3(aScaleRotate1.zw, 0.0), - vec3(aTranslate1, 1.0) - ); - gl_Position = vec4(uPanZoomMatrix * transform * vec3(position, 1.0), 1.0); - vEdgeColor = aEdgeColor; - } else { - gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space - } - - vAtlasId = aAtlasId; - vIndex = aIndex; - vVertType = aVertType; - } - `),a=this.atlasManager.getIndexArray(),s=`#version 300 es - precision highp float; - - // define texture unit for each node in the batch - `.concat(a.map(function(h){return"uniform sampler2D uTexture".concat(h,";")}).join(` - `),` - - uniform vec4 uBGColor; - - in vec2 vTexCoord; - in vec4 vEdgeColor; - flat in int vAtlasId; - flat in vec4 vIndex; - flat in int vVertType; - - out vec4 outColor; - - void main(void) { - if(vVertType == `).concat(yB,`) { - `).concat(a.map(function(h){return"if(vAtlasId == ".concat(h,") outColor = texture(uTexture").concat(h,", vTexCoord);")}).join(` - else `),` - } else if(vVertType == `).concat(vB,`) { - // blend arrow color with background (using premultiplied alpha) - outColor.rgb = vEdgeColor.rgb + (uBGColor.rgb * (1.0 - vEdgeColor.a)); - outColor.a = 1.0; // make opaque, masks out line under arrow - } else { - outColor = vEdgeColor; - } - - `).concat(r.picking?`if(outColor.a == 0.0) discard; - else outColor = vIndex;`:"",` - } - `),l=MJe(n,i,s);l.aPosition=n.getAttribLocation(l,"aPosition"),l.aIndex=n.getAttribLocation(l,"aIndex"),l.aVertType=n.getAttribLocation(l,"aVertType"),l.aAtlasId=n.getAttribLocation(l,"aAtlasId"),l.aTex1=n.getAttribLocation(l,"aTex1"),l.aTex2=n.getAttribLocation(l,"aTex2"),l.aScaleRotate1=n.getAttribLocation(l,"aScaleRotate1"),l.aTranslate1=n.getAttribLocation(l,"aTranslate1"),l.aScaleRotate2=n.getAttribLocation(l,"aScaleRotate2"),l.aTranslate2=n.getAttribLocation(l,"aTranslate2"),l.aPointAPointB=n.getAttribLocation(l,"aPointAPointB"),l.aPointCPointD=n.getAttribLocation(l,"aPointCPointD"),l.aLineWidth=n.getAttribLocation(l,"aLineWidth"),l.aEdgeColor=n.getAttribLocation(l,"aEdgeColor"),l.uPanZoomMatrix=n.getUniformLocation(l,"uPanZoomMatrix"),l.uAtlasSize=n.getUniformLocation(l,"uAtlasSize"),l.uBGColor=n.getUniformLocation(l,"uBGColor"),l.uTextures=[];for(var u=0;u2&&arguments[2]!==void 0?arguments[2]:Jb.SCREEN;this.panZoomMatrix=r,this.debugInfo=n,this.renderTarget=i,this.startBatch()},"startFrame")},{key:"startBatch",value:o(function(){this.instanceCount=0,this.atlasManager.startBatch()},"startBatch")},{key:"endFrame",value:o(function(){this.endBatch()},"endFrame")},{key:"getTempMatrix",value:o(function(){return this.tempMatrix=this.tempMatrix||Zb()},"getTempMatrix")},{key:"drawTexture",value:o(function(r,n,i){var a=this.atlasManager;if(a.isRenderable(r,i)){a.canAddToCurrentBatch(r,i)||this.endBatch();var s=this.instanceCount;this.vertTypeBuffer.getView(s)[0]=yB;var l=this.indexBuffer.getView(s);_6(n,l);var u=a.getAtlasInfo(r,i,u),h=u.atlasID,f=u.tex1,d=u.tex2,p=this.atlasIdBuffer.getView(s);p[0]=h;var m=this.tex1Buffer.getView(s);m[0]=f.x,m[1]=f.y,m[2]=f.w,m[3]=f.h;var g=this.tex2Buffer.getView(s);g[0]=d.x,g[1]=d.y,g[2]=d.w,g[3]=d.h;for(var y=this.getTempMatrix(),v=0,x=[1,2];v=this.maxInstances&&this.endBatch()}},"drawTexture")},{key:"drawEdgeArrow",value:o(function(r,n,i){var a=r._private.rscratch,s,l,u;if(i==="source"?(s=a.arrowStartX,l=a.arrowStartY,u=a.srcArrowAngle):(s=a.arrowEndX,l=a.arrowEndY,u=a.tgtArrowAngle),!(isNaN(s)||s==null||isNaN(l)||l==null||isNaN(u)||u==null)){var h=r.pstyle(i+"-arrow-shape").value;if(h!=="none"){var f=r.pstyle(i+"-arrow-color").value,d=r.pstyle("opacity").value,p=r.pstyle("line-opacity").value,m=d*p,g=r.pstyle("width").pfValue,y=r.pstyle("arrow-scale").value,v=this.r.getArrowWidth(g,y),x=this.getTempMatrix();B1e(x),j6(x,x,[s,l]),sF(x,x,[v,v]),F1e(x,x,u);var b=this.instanceCount;this.vertTypeBuffer.getView(b)[0]=vB;var T=this.indexBuffer.getView(b);_6(n,T);var S=this.edgeColorBuffer.getView(b);A6(f,m,S);var w=this.scaleRotate1Buffer.getView(b);w[0]=x[0],w[1]=x[1],w[2]=x[3],w[3]=x[4];var E=this.translate1Buffer.getView(b);E[0]=x[6],E[1]=x[7],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}},"drawEdgeArrow")},{key:"drawEdgeLine",value:o(function(r,n){var i=r.pstyle("opacity").value,a=r.pstyle("line-opacity").value,s=r.pstyle("width").pfValue,l=r.pstyle("line-color").value,u=i*a,h=this.getEdgePoints(r);if(h.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),h.length==4){var f=this.instanceCount;this.vertTypeBuffer.getView(f)[0]=Zme;var d=this.indexBuffer.getView(f);_6(n,d);var p=this.edgeColorBuffer.getView(f);A6(l,u,p);var m=this.lineWidthBuffer.getView(f);m[0]=s;var g=this.pointAPointBBuffer.getView(f);g[0]=h[0],g[1]=h[1],g[2]=h[2],g[3]=h[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var y=0;y=this.maxInstances&&this.endBatch()}},"drawEdgeLine")},{key:"getEdgePoints",value:o(function(r){var n=r._private.rscratch,i=n.allpts;if(i.length==4)return i;var a=this.getNumSegments(r);return this.getCurveSegmentPoints(i,a)},"getEdgePoints")},{key:"getNumSegments",value:o(function(r){var n=15;return Math.min(Math.max(n,5),this.maxInstances)},"getNumSegments")},{key:"getCurveSegmentPoints",value:o(function(r,n){if(r.length==4)return r;for(var i=Array((n+1)*2),a=0;a<=n;a++)if(a==0)i[0]=r[0],i[1]=r[1];else if(a==n)i[a*2]=r[r.length-2],i[a*2+1]=r[r.length-1];else{var s=a/n;this.setCurvePoint(r,s,i,a*2)}return i},"getCurveSegmentPoints")},{key:"setCurvePoint",value:o(function(r,n,i,a){if(r.length<=2)i[a]=r[0],i[a+1]=r[1];else{for(var s=Array(r.length-2),l=0;l0},"isVisible")},{key:"getStyle",value:o(function(r,n){var i=n.pstyle("".concat(r,"-opacity")).value,a=n.pstyle("".concat(r,"-color")).value,s=n.pstyle("".concat(r,"-shape")).value;return{opacity:i,color:a,shape:s}},"getStyle")},{key:"getPadding",value:o(function(r,n){return n.pstyle("".concat(r,"-padding")).pfValue},"getPadding")},{key:"draw",value:o(function(r,n,i,a){if(this.isVisible(r,i)){var s=this.r,l=a.w,u=a.h,h=l/2,f=u/2,d=this.getStyle(r,i),p=d.shape,m=d.color,g=d.opacity;n.save(),n.fillStyle=ege(m,g),p==="round-rectangle"||p==="roundrectangle"?s.drawRoundRectanglePath(n,h,f,l,u,"auto"):p==="ellipse"&&s.drawEllipsePath(n,h,f,l,u),n.fill(),n.restore()}},"draw")}]),t}();o(XJe,"getBGColor");$1e={};$1e.initWebgl=function(t,e){var r=this,n=r.data.contexts[r.WEBGL],i=t.cy.container();t.bgColor=XJe(i),t.webglTexSize=Math.min(t.webglTexSize,n.getParameter(n.MAX_TEXTURE_SIZE)),t.webglTexRows=Math.min(t.webglTexRows,54),t.webglBatchSize=Math.min(t.webglBatchSize,16384),t.webglTexPerBatch=Math.min(t.webglTexPerBatch,n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS)),r.webglDebug=t.webglDebug,r.webglDebugShowAtlases=t.webglDebugShowAtlases,console.log("max texture units",n.getParameter(n.MAX_TEXTURE_IMAGE_UNITS)),console.log("max texture size",n.getParameter(n.MAX_TEXTURE_SIZE)),console.log("webgl options",t),r.pickingFrameBuffer=$Je(n),r.pickingFrameBuffer.needsDraw=!0;var a=o(function(f){return r.getTextAngle(f,null)},"getLabelRotation"),s=o(function(f){var d=f.pstyle("label");return d&&d.value},"isLabelVisible");r.eleDrawing=new qJe(r,n,t);var l=new YJe(r);r.eleDrawing.addTextureRenderType("node-body",Hb({getKey:e.getStyleKey,getBoundingBox:e.getElementBox,drawElement:e.drawElement,isVisible:o(function(f){return f.visible()},"isVisible")})),r.eleDrawing.addTextureRenderType("node-label",Hb({getKey:e.getLabelKey,getBoundingBox:e.getLabelBox,drawElement:e.drawLabel,getRotation:a,getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:s})),r.eleDrawing.addTextureRenderType("node-overlay",Hb({getBoundingBox:e.getElementBox,getKey:o(function(f){return l.getStyleKey("overlay",f)},"getKey"),drawElement:o(function(f,d,p){return l.draw("overlay",f,d,p)},"drawElement"),isVisible:o(function(f){return l.isVisible("overlay",f)},"isVisible"),getPadding:o(function(f){return l.getPadding("overlay",f)},"getPadding")})),r.eleDrawing.addTextureRenderType("node-underlay",Hb({getBoundingBox:e.getElementBox,getKey:o(function(f){return l.getStyleKey("underlay",f)},"getKey"),drawElement:o(function(f,d,p){return l.draw("underlay",f,d,p)},"drawElement"),isVisible:o(function(f){return l.isVisible("underlay",f)},"isVisible"),getPadding:o(function(f){return l.getPadding("underlay",f)},"getPadding")})),r.eleDrawing.addTextureRenderType("edge-label",Hb({getKey:e.getLabelKey,getBoundingBox:e.getLabelBox,drawElement:e.drawLabel,getRotation:a,getRotationPoint:e.getLabelRotationPoint,getRotationOffset:e.getLabelRotationOffset,isVisible:s}));var u=p4(function(){console.log("garbage collect flag set"),r.data.gc=!0},1e4);r.onUpdateEleCalcs(function(h,f){var d=!1;f&&f.length>0&&(d|=r.eleDrawing.invalidate(f)),d&&u()}),jJe(r)};o(jJe,"overrideCanvasRendererFunctions");o(KJe,"clearWebgl");o(QJe,"clearCanvas");o(ZJe,"createPanZoomMatrix");o(z1e,"setContextTransform");o(JJe,"drawSelectionRectangle");o(eet,"drawAxes");o(tet,"drawAtlases");o(ret,"getPickingIndexes");o(net,"findNearestElementsWebgl");o(G1e,"renderWebgl");Wf={};Wf.drawPolygonPath=function(t,e,r,n,i,a){var s=n/2,l=i/2;t.beginPath&&t.beginPath(),t.moveTo(e+s*a[0],r+l*a[1]);for(var u=1;u0&&s>0){m.clearRect(0,0,a,s),m.globalCompositeOperation="source-over";var g=this.getCachedZSortedEles();if(t.full)m.translate(-n.x1*h,-n.y1*h),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(n.x1*h,n.y1*h);else{var y=e.pan(),v={x:y.x*h,y:y.y*h};h*=e.zoom(),m.translate(v.x,v.y),m.scale(h,h),this.drawElements(m,g),m.scale(1/h,1/h),m.translate(-v.x,-v.y)}t.bg&&(m.globalCompositeOperation="destination-over",m.fillStyle=t.bg,m.rect(0,0,a,s),m.fill())}return p};o(iet,"b64ToBlob");o(nge,"b64UriToB64");o(U1e,"output");b4.png=function(t){return U1e(t,this.bufferCanvasImage(t),"image/png")};b4.jpg=function(t){return U1e(t,this.bufferCanvasImage(t),"image/jpeg")};H1e={};H1e.nodeShapeImpl=function(t,e,r,n,i,a,s,l){switch(t){case"ellipse":return this.drawEllipsePath(e,r,n,i,a);case"polygon":return this.drawPolygonPath(e,r,n,i,a,s);case"round-polygon":return this.drawRoundPolygonPath(e,r,n,i,a,s,l);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(e,r,n,i,a,l);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(e,r,n,i,a,s,l);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(e,r,n,i,a,l);case"barrel":return this.drawBarrelPath(e,r,n,i,a)}};aet=W1e,Sr=W1e.prototype;Sr.CANVAS_LAYERS=3;Sr.SELECT_BOX=0;Sr.DRAG=1;Sr.NODE=2;Sr.WEBGL=3;Sr.CANVAS_TYPES=["2d","2d","2d","webgl2"];Sr.BUFFER_COUNT=3;Sr.TEXTURE_BUFFER=0;Sr.MOTIONBLUR_BUFFER_NODE=1;Sr.MOTIONBLUR_BUFFER_DRAG=2;o(W1e,"CanvasRenderer");Sr.redrawHint=function(t,e){var r=this;switch(t){case"eles":r.data.canvasNeedsRedraw[Sr.NODE]=e;break;case"drag":r.data.canvasNeedsRedraw[Sr.DRAG]=e;break;case"select":r.data.canvasNeedsRedraw[Sr.SELECT_BOX]=e;break;case"gc":r.data.gc=!0;break}};set=typeof Path2D<"u";Sr.path2dEnabled=function(t){if(t===void 0)return this.pathsEnabled;this.pathsEnabled=!!t};Sr.usePaths=function(){return set&&this.pathsEnabled};Sr.setImgSmoothing=function(t,e){t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled=e:(t.webkitImageSmoothingEnabled=e,t.mozImageSmoothingEnabled=e,t.msImageSmoothingEnabled=e)};Sr.getImgSmoothing=function(t){return t.imageSmoothingEnabled!=null?t.imageSmoothingEnabled:t.webkitImageSmoothingEnabled||t.mozImageSmoothingEnabled||t.msImageSmoothingEnabled};Sr.makeOffscreenCanvas=function(t,e){var r;if((typeof OffscreenCanvas>"u"?"undefined":qi(OffscreenCanvas))!=="undefined")r=new OffscreenCanvas(t,e);else{var n=this.cy.window(),i=n.document;r=i.createElement("canvas"),r.width=t,r.height=e}return r};[N1e,tu,oh,iF,n0,py,ws,$1e,Wf,b4,H1e].forEach(function(t){ir(Sr,t)});oet=[{name:"null",impl:v1e},{name:"base",impl:_1e},{name:"canvas",impl:aet}],cet=[{type:"layout",extensions:HZe},{type:"renderer",extensions:oet}],q1e={},Y1e={};o(X1e,"setExtension");o(j1e,"getExtension");o(uet,"setModule");o(het,"getModule");OB=o(function(){if(arguments.length===2)return j1e.apply(null,arguments);if(arguments.length===3)return X1e.apply(null,arguments);if(arguments.length===4)return het.apply(null,arguments);if(arguments.length===5)return uet.apply(null,arguments);oi("Invalid extension access syntax")},"extension");u4.prototype.extension=OB;cet.forEach(function(t){t.extensions.forEach(function(e){X1e(t.type,e.name,e.impl)})});K1e=o(function t(){if(!(this instanceof t))return new t;this.length=0},"Stylesheet"),t0=K1e.prototype;t0.instanceString=function(){return"stylesheet"};t0.selector=function(t){var e=this.length++;return this[e]={selector:t,properties:[]},this};t0.css=function(t,e){var r=this.length-1;if(Zt(t))this[r].properties.push({name:t,value:e});else if(Ur(t))for(var n=t,i=Object.keys(n),a=0;a{"use strict";o(function(e,r){typeof T4=="object"&&typeof lF=="object"?lF.exports=r():typeof define=="function"&&define.amd?define([],r):typeof T4=="object"?T4.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(T4,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=26)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(4);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp&&(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)),this.labelHeight>m&&(this.labelPos=="center"?this.rect.y-=(this.labelHeight-m)/2:this.labelPos=="top"&&(this.rect.y-=this.labelHeight-m),this.setHeight(this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(6),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(E,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,E,_,C=this.nodes,D=C.length,O=0;OT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var D=0;v.forEach(function(O){O.owner==g&&D++}),D==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(5),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):A===M&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-I===M?f>u?(l[2]=_,l[3]=C,L=!0):(l[2]=E,l[3]=w,L=!0):I===M&&(f>u?(l[2]=S,l[3]=w,L=!0):(l[2]=D,l[3]=C,L=!0)),k&&L)return!1;if(u>f?h>d?(P=this.getCardinalDirection(A,M,4),B=this.getCardinalDirection(I,M,2)):(P=this.getCardinalDirection(-A,M,3),B=this.getCardinalDirection(-I,M,1)):h>d?(P=this.getCardinalDirection(-A,M,1),B=this.getCardinalDirection(-I,M,3)):(P=this.getCardinalDirection(A,M,2),B=this.getCardinalDirection(I,M,4)),!k)switch(P){case 1:z=m,F=u+-T/M,l[0]=F,l[1]=z;break;case 2:F=x,z=h+b*M,l[0]=F,l[1]=z;break;case 3:z=v,F=u+T/M,l[0]=F,l[1]=z;break;case 4:F=y,z=h+-b*M,l[0]=F,l[1]=z;break}if(!L)switch(B){case 1:U=w,$=f+-R/M,l[2]=$,l[3]=U;break;case 2:$=D,U=d+O*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+R/M,l[2]=$,l[3]=U;break;case 4:$=_,U=d+-O*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,E=void 0,_=void 0,C=void 0,D=void 0;return T=p-f,w=h-d,_=d*f-h*p,S=v-g,E=m-y,C=y*g-m*v,D=T*E-S*w,D===0?null:(x=(w*C-E*_)/D,b=(S*_-T*C)/D,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var E=T[0];T.splice(0,1),b.add(E);for(var _=E.getEdges(),x=0;x<_.length;x++){var C=_[x].getOtherEnd(E);if(S.get(E)!=C)if(!b.has(C))T.push(C),S.set(C,E);else{g=!1;break}}}if(!g)m=[];else{var D=[].concat(n(b));m.push(D);for(var x=0;x-1&&w.splice(R,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var D=S.getNeighborsList();D.forEach(function(k){if(y.indexOf(k)<0){var L=v.get(k),A=L-1;A==1&&E.push(k),v.set(k,A)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(4);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof w4=="object"&&typeof uF=="object"?uF.exports=r(cF()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof w4=="object"?w4.coseBase=r(cF()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(w4,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=7)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).FDLayoutConstants;function a(){}o(a,"CoSEConstants");for(var s in i)a[s]=i[s];a.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,a.DEFAULT_RADIAL_SEPARATION=i.DEFAULT_EDGE_LENGTH,a.DEFAULT_COMPONENT_SEPERATION=60,a.TILE=!0,a.TILING_PADDING_VERTICAL=10,a.TILING_PADDING_HORIZONTAL=10,a.TREE_REDUCTION_ON_INCREMENTAL=!1,e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutEdge;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEEdge"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraph;function a(l,u,h){i.call(this,l,u,h)}o(a,"CoSEGraph"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).LGraphManager;function a(l){i.call(this,l)}o(a,"CoSEGraphManager"),a.prototype=Object.create(i.prototype);for(var s in i)a[s]=i[s];e.exports=a},function(e,r,n){"use strict";var i=n(0).FDLayoutNode,a=n(0).IMath;function s(u,h,f,d){i.call(this,u,h,f,d)}o(s,"CoSENode"),s.prototype=Object.create(i.prototype);for(var l in i)s[l]=i[l];s.prototype.move=function(){var u=this.graphManager.getLayout();this.displacementX=u.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=u.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementX=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementX)),Math.abs(this.displacementY)>u.coolingFactor*u.maxNodeDisplacement&&(this.displacementY=u.coolingFactor*u.maxNodeDisplacement*a.sign(this.displacementY)),this.child==null?this.moveBy(this.displacementX,this.displacementY):this.child.getNodes().length==0?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),u.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},s.prototype.propogateDisplacementToChildren=function(u,h){for(var f=this.getChild().getNodes(),d,p=0;p0)this.positionNodesRadially(w);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var E=new Set(this.getAllNodes()),_=this.nodesWithGravity.filter(function(C){return E.has(C)});this.graphManager.setAllNodesToApplyGravitation(_),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%f.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var w=new Set(this.getAllNodes()),E=this.nodesWithGravity.filter(function(D){return w.has(D)});this.graphManager.setAllNodesToApplyGravitation(E),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=f.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var _=!this.isTreeGrowing&&!this.isGrowthFinished,C=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(_,C),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var w=this.graphManager.getAllNodes(),E={},_=0;_1){var k;for(k=0;kC&&(C=Math.floor(R.y)),O=Math.floor(R.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new m(d.WORLD_CENTER_X-R.x/2,d.WORLD_CENTER_Y-R.y/2))},T.radialLayout=function(w,E,_){var C=Math.max(this.maxDiagonalInTree(w),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(E,null,0,359,0,C);var D=x.calculateBounds(w),O=new b;O.setDeviceOrgX(D.getMinX()),O.setDeviceOrgY(D.getMinY()),O.setWorldOrgX(_.x),O.setWorldOrgY(_.y);for(var R=0;R1;){var K=U[0];U.splice(0,1);var ee=P.indexOf(K);ee>=0&&P.splice(ee,1),z--,B--}E!=null?$=(P.indexOf(U[0])+1)%z:$=0;for(var Y=Math.abs(C-_)/B,ce=$;F!=B;ce=++ce%z){var Z=P[ce].getOtherEnd(w);if(Z!=E){var ue=(_+F*Y)%360,Q=(ue+Y)%360;T.branchRadialLayout(Z,w,ue,Q,D+O,O),F++}}},T.maxDiagonalInTree=function(w){for(var E=y.MIN_VALUE,_=0;_E&&(E=D)}return E},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var w=this,E={};this.memberGroups={},this.idToDummyNode={};for(var _=[],C=this.graphManager.getAllNodes(),D=0;D"u"&&(E[k]=[]),E[k]=E[k].concat(O)}Object.keys(E).forEach(function(L){if(E[L].length>1){var A="DummyCompound_"+L;w.memberGroups[A]=E[L];var I=E[L][0].getParent(),M=new l(w.graphManager);M.id=A,M.paddingLeft=I.paddingLeft||0,M.paddingRight=I.paddingRight||0,M.paddingBottom=I.paddingBottom||0,M.paddingTop=I.paddingTop||0,w.idToDummyNode[A]=M;var P=w.getGraphManager().add(w.newGraph(),M),B=I.getChild();B.add(M);for(var F=0;F=0;w--){var E=this.compoundOrder[w],_=E.id,C=E.paddingLeft,D=E.paddingTop;this.adjustLocations(this.tiledMemberPack[_],E.rect.x,E.rect.y,C,D)}},T.prototype.repopulateZeroDegreeMembers=function(){var w=this,E=this.tiledZeroDegreePack;Object.keys(E).forEach(function(_){var C=w.idToDummyNode[_],D=C.paddingLeft,O=C.paddingTop;w.adjustLocations(E[_],C.rect.x,C.rect.y,D,O)})},T.prototype.getToBeTiled=function(w){var E=w.id;if(this.toBeTiled[E]!=null)return this.toBeTiled[E];var _=w.getChild();if(_==null)return this.toBeTiled[E]=!1,!1;for(var C=_.getNodes(),D=0;D0)return this.toBeTiled[E]=!1,!1;if(O.getChild()==null){this.toBeTiled[O.id]=!1;continue}if(!this.getToBeTiled(O))return this.toBeTiled[E]=!1,!1}return this.toBeTiled[E]=!0,!0},T.prototype.getNodeDegree=function(w){for(var E=w.id,_=w.getEdges(),C=0,D=0;D<_.length;D++){var O=_[D];O.getSource().id!==O.getTarget().id&&(C=C+1)}return C},T.prototype.getNodeDegreeWithChildren=function(w){var E=this.getNodeDegree(w);if(w.getChild()==null)return E;for(var _=w.getChild().getNodes(),C=0;C<_.length;C++){var D=_[C];E+=this.getNodeDegreeWithChildren(D)}return E},T.prototype.performDFSOnCompounds=function(){this.compoundOrder=[],this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes())},T.prototype.fillCompexOrderByDFS=function(w){for(var E=0;EL&&(L=I.rect.height)}_+=L+w.verticalPadding}},T.prototype.tileCompoundMembers=function(w,E){var _=this;this.tiledMemberPack=[],Object.keys(w).forEach(function(C){var D=E[C];_.tiledMemberPack[C]=_.tileNodes(w[C],D.paddingLeft+D.paddingRight),D.rect.width=_.tiledMemberPack[C].width,D.rect.height=_.tiledMemberPack[C].height})},T.prototype.tileNodes=function(w,E){var _=h.TILING_PADDING_VERTICAL,C=h.TILING_PADDING_HORIZONTAL,D={rows:[],rowWidth:[],rowHeight:[],width:0,height:E,verticalPadding:_,horizontalPadding:C};w.sort(function(k,L){return k.rect.width*k.rect.height>L.rect.width*L.rect.height?-1:k.rect.width*k.rect.height0&&(R+=w.horizontalPadding),w.rowWidth[_]=R,w.width0&&(k+=w.verticalPadding);var L=0;k>w.rowHeight[_]&&(L=w.rowHeight[_],w.rowHeight[_]=k,L=w.rowHeight[_]-L),w.height+=L,w.rows[_].push(E)},T.prototype.getShortestRowIndex=function(w){for(var E=-1,_=Number.MAX_VALUE,C=0;C_&&(E=C,_=w.rowWidth[C]);return E},T.prototype.canAddHorizontal=function(w,E,_){var C=this.getShortestRowIndex(w);if(C<0)return!0;var D=w.rowWidth[C];if(D+w.horizontalPadding+E<=w.width)return!0;var O=0;w.rowHeight[C]<_&&C>0&&(O=_+w.verticalPadding-w.rowHeight[C]);var R;w.width-D>=E+w.horizontalPadding?R=(w.height+O)/(D+E+w.horizontalPadding):R=(w.height+O)/w.width,O=_+w.verticalPadding;var k;return w.widthO&&E!=_){C.splice(-1,1),w.rows[_].push(D),w.rowWidth[E]=w.rowWidth[E]-O,w.rowWidth[_]=w.rowWidth[_]+O,w.width=w.rowWidth[instance.getLongestRowIndex(w)];for(var R=Number.MIN_VALUE,k=0;kR&&(R=C[k].height);E>0&&(R+=w.verticalPadding);var L=w.rowHeight[E]+w.rowHeight[_];w.rowHeight[E]=R,w.rowHeight[_]0)for(var B=D;B<=O;B++)P[0]+=this.grid[B][R-1].length+this.grid[B][R].length-1;if(O0)for(var B=R;B<=k;B++)P[3]+=this.grid[D-1][B].length+this.grid[D][B].length-1;for(var F=y.MAX_VALUE,z,$,U=0;U{"use strict";o(function(e,r){typeof k4=="object"&&typeof fF=="object"?fF.exports=r(hF()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof k4=="object"?k4.cytoscapeCoseBilkent=r(hF()):e.cytoscapeCoseBilkent=r(e.coseBase)},"webpackUniversalModuleDefinition")(k4,function(t){return function(e){var r={};function n(i){if(r[i])return r[i].exports;var a=r[i]={i,l:!1,exports:{}};return e[i].call(a.exports,a,a.exports,n),a.l=!0,a.exports}return o(n,"__webpack_require__"),n.m=e,n.c=r,n.i=function(i){return i},n.d=function(i,a,s){n.o(i,a)||Object.defineProperty(i,a,{configurable:!1,enumerable:!0,get:s})},n.n=function(i){var a=i&&i.__esModule?o(function(){return i.default},"getDefault"):o(function(){return i},"getModuleExports");return n.d(a,"a",a),a},n.o=function(i,a){return Object.prototype.hasOwnProperty.call(i,a)},n.p="",n(n.s=1)}([function(e,r){e.exports=t},function(e,r,n){"use strict";var i=n(0).layoutBase.LayoutConstants,a=n(0).layoutBase.FDLayoutConstants,s=n(0).CoSEConstants,l=n(0).CoSELayout,u=n(0).CoSENode,h=n(0).layoutBase.PointD,f=n(0).layoutBase.DimensionD,d={ready:o(function(){},"ready"),stop:o(function(){},"stop"),quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function p(v,x){var b={};for(var T in v)b[T]=v[T];for(var T in x)b[T]=x[T];return b}o(p,"extend");function m(v){this.options=p(d,v),g(this.options)}o(m,"_CoSELayout");var g=o(function(x){x.nodeRepulsion!=null&&(s.DEFAULT_REPULSION_STRENGTH=a.DEFAULT_REPULSION_STRENGTH=x.nodeRepulsion),x.idealEdgeLength!=null&&(s.DEFAULT_EDGE_LENGTH=a.DEFAULT_EDGE_LENGTH=x.idealEdgeLength),x.edgeElasticity!=null&&(s.DEFAULT_SPRING_STRENGTH=a.DEFAULT_SPRING_STRENGTH=x.edgeElasticity),x.nestingFactor!=null&&(s.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=a.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=x.nestingFactor),x.gravity!=null&&(s.DEFAULT_GRAVITY_STRENGTH=a.DEFAULT_GRAVITY_STRENGTH=x.gravity),x.numIter!=null&&(s.MAX_ITERATIONS=a.MAX_ITERATIONS=x.numIter),x.gravityRange!=null&&(s.DEFAULT_GRAVITY_RANGE_FACTOR=a.DEFAULT_GRAVITY_RANGE_FACTOR=x.gravityRange),x.gravityCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_STRENGTH=a.DEFAULT_COMPOUND_GRAVITY_STRENGTH=x.gravityCompound),x.gravityRangeCompound!=null&&(s.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=a.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=x.gravityRangeCompound),x.initialEnergyOnIncremental!=null&&(s.DEFAULT_COOLING_FACTOR_INCREMENTAL=a.DEFAULT_COOLING_FACTOR_INCREMENTAL=x.initialEnergyOnIncremental),x.quality=="draft"?i.QUALITY=0:x.quality=="proof"?i.QUALITY=2:i.QUALITY=1,s.NODE_DIMENSIONS_INCLUDE_LABELS=a.NODE_DIMENSIONS_INCLUDE_LABELS=i.NODE_DIMENSIONS_INCLUDE_LABELS=x.nodeDimensionsIncludeLabels,s.DEFAULT_INCREMENTAL=a.DEFAULT_INCREMENTAL=i.DEFAULT_INCREMENTAL=!x.randomize,s.ANIMATE=a.ANIMATE=i.ANIMATE=x.animate,s.TILE=x.tile,s.TILING_PADDING_VERTICAL=typeof x.tilingPaddingVertical=="function"?x.tilingPaddingVertical.call():x.tilingPaddingVertical,s.TILING_PADDING_HORIZONTAL=typeof x.tilingPaddingHorizontal=="function"?x.tilingPaddingHorizontal.call():x.tilingPaddingHorizontal},"getUserOptions");m.prototype.run=function(){var v,x,b=this.options,T=this.idToLNode={},S=this.layout=new l,w=this;w.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var E=S.newGraphManager();this.gm=E;var _=this.options.eles.nodes(),C=this.options.eles.edges();this.root=E.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(_),S);for(var D=0;D0){var k;k=b.getGraphManager().add(b.newGraph(),_),this.processChildrenList(k,E,b)}}},m.prototype.stop=function(){return this.stopped=!0,this};var y=o(function(x){x("layout","cose-bilkent",m)},"register");typeof cytoscape<"u"&&y(cytoscape),e.exports=y}])})});function xet(t,e,r,n,i){return t.insert("polygon",":first-child").attr("points",n.map(function(a){return a.x+","+a.y}).join(" ")).attr("transform","translate("+(i.width-e)/2+", "+r+")")}var det,pet,met,get,yet,vet,bet,Tet,Z1e,J1e,eye=N(()=>{"use strict";ao();er();det=12,pet=o(function(t,e,r,n){e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 ${r.height-5} v${-r.height+2*5} q0,-5 5,-5 h${r.width-2*5} q5,0 5,5 v${r.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",r.height).attr("x2",r.width).attr("y2",r.height)},"defaultBkg"),met=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("width",r.width)},"rectBkg"),get=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n,s=.25*n,l=.35*n,u=.2*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 0 0,1 ${n*.25},${-1*n*.1} - a${l},${l} 1 0,1 ${n*.4},${-1*n*.1} - a${s},${s} 1 0,1 ${n*.35},${1*n*.2} - - a${a},${a} 1 0,1 ${n*.15},${1*i*.35} - a${u},${u} 1 0,1 ${-1*n*.15},${1*i*.65} - - a${s},${a} 1 0,1 ${-1*n*.25},${n*.15} - a${l},${l} 1 0,1 ${-1*n*.5},0 - a${a},${a} 1 0,1 ${-1*n*.25},${-1*n*.15} - - a${a},${a} 1 0,1 ${-1*n*.1},${-1*i*.35} - a${u},${u} 1 0,1 ${n*.1},${-1*i*.65} - - H0 V0 Z`)},"cloudBkg"),yet=o(function(t,e,r){let n=r.width,i=r.height,a=.15*n;e.append("path").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("d",`M0 0 a${a},${a} 1 0,0 ${n*.25},${-1*i*.1} - a${a},${a} 1 0,0 ${n*.25},0 - a${a},${a} 1 0,0 ${n*.25},0 - a${a},${a} 1 0,0 ${n*.25},${1*i*.1} - - a${a},${a} 1 0,0 ${n*.15},${1*i*.33} - a${a*.8},${a*.8} 1 0,0 0,${1*i*.34} - a${a},${a} 1 0,0 ${-1*n*.15},${1*i*.33} - - a${a},${a} 1 0,0 ${-1*n*.25},${i*.15} - a${a},${a} 1 0,0 ${-1*n*.25},0 - a${a},${a} 1 0,0 ${-1*n*.25},0 - a${a},${a} 1 0,0 ${-1*n*.25},${-1*i*.15} - - a${a},${a} 1 0,0 ${-1*n*.1},${-1*i*.33} - a${a*.8},${a*.8} 1 0,0 0,${-1*i*.34} - a${a},${a} 1 0,0 ${n*.1},${-1*i*.33} - - H0 V0 Z`)},"bangBkg"),vet=o(function(t,e,r){e.append("circle").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("r",r.width/2)},"circleBkg");o(xet,"insertPolygonShape");bet=o(function(t,e,r){let n=r.height,a=n/4,s=r.width-r.padding+2*a,l=[{x:a,y:0},{x:s-a,y:0},{x:s,y:-n/2},{x:s-a,y:-n},{x:a,y:-n},{x:0,y:-n/2}];xet(e,s,n,l,r)},"hexagonBkg"),Tet=o(function(t,e,r){e.append("rect").attr("id","node-"+r.id).attr("class","node-bkg node-"+t.type2Str(r.type)).attr("height",r.height).attr("rx",r.padding).attr("ry",r.padding).attr("width",r.width)},"roundedRectBkg"),Z1e=o(async function(t,e,r,n,i){let a=i.htmlLabels,s=n%(det-1),l=e.append("g");r.section=s;let u="section-"+s;s<0&&(u+=" section-root"),l.attr("class",(r.class?r.class+" ":"")+"mindmap-node "+u);let h=l.append("g"),f=l.append("g"),d=r.descr.replace(/()/g,` -`);await qn(f,d,{useHtmlLabels:a,width:r.width,classes:"mindmap-node-label"},i),a||f.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");let p=f.node().getBBox(),[m]=zo(i.fontSize);if(r.height=p.height+m*1.1*.5+r.padding,r.width=p.width+2*r.padding,r.icon)if(r.type===t.nodeType.CIRCLE)r.height+=50,r.width+=50,l.append("foreignObject").attr("height","50px").attr("width",r.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+r.width/2+", "+(r.height/2-1.5*r.padding)+")");else{r.width+=50;let g=r.height;r.height=Math.max(g,60);let y=Math.abs(r.height-g);l.append("foreignObject").attr("width","60px").attr("height",r.height).attr("style","text-align: center;margin-top:"+y/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+s+" "+r.icon),f.attr("transform","translate("+(25+r.width/2)+", "+(y/2+r.padding/2)+")")}else if(a){let g=(r.width-p.width)/2,y=(r.height-p.height)/2;f.attr("transform","translate("+g+", "+y+")")}else{let g=r.width/2,y=r.padding/2;f.attr("transform","translate("+g+", "+y+")")}switch(r.type){case t.nodeType.DEFAULT:pet(t,h,r,s);break;case t.nodeType.ROUNDED_RECT:Tet(t,h,r,s);break;case t.nodeType.RECT:met(t,h,r,s);break;case t.nodeType.CIRCLE:h.attr("transform","translate("+r.width/2+", "+ +r.height/2+")"),vet(t,h,r,s);break;case t.nodeType.CLOUD:get(t,h,r,s);break;case t.nodeType.BANG:yet(t,h,r,s);break;case t.nodeType.HEXAGON:bet(t,h,r,s);break}return t.setElementForId(r.id,l),r.height},"drawNode"),J1e=o(function(t,e){let r=t.getElementById(e.id),n=e.x||0,i=e.y||0;r.attr("transform","translate("+n+","+i+")")},"positionNode")});async function rye(t,e,r,n,i){await Z1e(t,e,r,n,i),r.children&&await Promise.all(r.children.map((a,s)=>rye(t,e,a,n<0?s:n,i)))}function wet(t,e){e.edges().map((r,n)=>{let i=r.data();if(r[0]._private.bodyBounds){let a=r[0]._private.rscratch;X.trace("Edge: ",n,i),t.insert("path").attr("d",`M ${a.startX},${a.startY} L ${a.midX},${a.midY} L${a.endX},${a.endY} `).attr("class","edge section-edge-"+i.section+" edge-depth-"+i.depth)}})}function nye(t,e,r,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach(i=>{nye(i,e,r,n+1),e.add({group:"edges",data:{id:`${t.id}_${i.id}`,source:t.id,target:i.id,depth:n,section:i.section}})})}function ket(t,e){return new Promise(r=>{let n=Ge("body").append("div").attr("id","cy").attr("style","display:none"),i=sl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),nye(t,i,e,0),i.nodes().forEach(function(a){a.layoutDimensions=()=>{let s=a.data();return{w:s.width,h:s.height}}}),i.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),i.ready(a=>{X.info("Ready",a),r(i)})})}function Eet(t,e){e.nodes().map((r,n)=>{let i=r.data();i.x=r.position().x,i.y=r.position().y,J1e(t,i);let a=t.getElementById(i.nodeId);X.info("id:",n,"Position: (",r.position().x,", ",r.position().y,")",i),a.attr("transform",`translate(${r.position().x-i.width/2}, ${r.position().y-i.height/2})`),a.attr("attr",`apa-${n})`)})}var tye,Cet,iye,aye=N(()=>{"use strict";oF();tye=Aa(Q1e(),1);fr();Gt();yt();Vl();xi();eye();_a();sl.use(tye.default);o(rye,"drawNodes");o(wet,"drawEdges");o(nye,"addNodes");o(ket,"layoutMindmap");o(Eet,"positionNodes");Cet=o(async(t,e,r,n)=>{X.debug(`Rendering mindmap diagram -`+t);let i=n.db,a=i.getMindmap();if(!a)return;let s=me();s.htmlLabels=!1;let l=Li(e),u=l.append("g");u.attr("class","mindmap-edges");let h=l.append("g");h.attr("class","mindmap-nodes"),await rye(i,h,a,-1,s);let f=await ket(a,s);wet(u,f),Eet(i,f),Lo(void 0,l,s.mindmap?.padding??or.mindmap.padding,s.mindmap?.useMaxWidth??or.mindmap.useMaxWidth)},"draw"),iye={draw:Cet}});var Aet,_et,sye,oye=N(()=>{"use strict";Ks();Aet=o(t=>{let e="";for(let r=0;r` - .edge { - stroke-width: 3; - } - ${Aet(t)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .mindmap-node-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } -`,"getStyles"),sye=_et});var lye={};ur(lye,{diagram:()=>Det});var Det,cye=N(()=>{"use strict";B0e();F0e();aye();oye();Det={get db(){return new p6},renderer:iye,parser:P0e,styles:sye}});var dF,fye,dye=N(()=>{"use strict";dF=function(){var t=o(function(_,C,D,O){for(D=D||{},O=_.length;O--;D[_[O]]=C);return D},"o"),e=[1,4],r=[1,13],n=[1,12],i=[1,15],a=[1,16],s=[1,20],l=[1,19],u=[6,7,8],h=[1,26],f=[1,24],d=[1,25],p=[6,7,11],m=[1,31],g=[6,7,11,24],y=[1,6,13,16,17,20,23],v=[1,35],x=[1,36],b=[1,6,7,11,13,16,17,20,23],T=[1,38],S={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:o(function(C,D,O,R,k,L,A){var I=L.length-1;switch(k){case 6:case 7:return R;case 8:R.getLogger().trace("Stop NL ");break;case 9:R.getLogger().trace("Stop EOF ");break;case 11:R.getLogger().trace("Stop NL2 ");break;case 12:R.getLogger().trace("Stop EOF2 ");break;case 15:R.getLogger().info("Node: ",L[I-1].id),R.addNode(L[I-2].length,L[I-1].id,L[I-1].descr,L[I-1].type,L[I]);break;case 16:R.getLogger().info("Node: ",L[I].id),R.addNode(L[I-1].length,L[I].id,L[I].descr,L[I].type);break;case 17:R.getLogger().trace("Icon: ",L[I]),R.decorateNode({icon:L[I]});break;case 18:case 23:R.decorateNode({class:L[I]});break;case 19:R.getLogger().trace("SPACELIST");break;case 20:R.getLogger().trace("Node: ",L[I-1].id),R.addNode(0,L[I-1].id,L[I-1].descr,L[I-1].type,L[I]);break;case 21:R.getLogger().trace("Node: ",L[I].id),R.addNode(0,L[I].id,L[I].descr,L[I].type);break;case 22:R.decorateNode({icon:L[I]});break;case 27:R.getLogger().trace("node found ..",L[I-2]),this.$={id:L[I-1],descr:L[I-1],type:R.getType(L[I-2],L[I])};break;case 28:this.$={id:L[I],descr:L[I],type:0};break;case 29:R.getLogger().trace("node found ..",L[I-3]),this.$={id:L[I-3],descr:L[I-1],type:R.getType(L[I-2],L[I])};break;case 30:this.$=L[I-1]+L[I];break;case 31:this.$=L[I];break}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:r,7:[1,10],9:9,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(u,[2,3]),{1:[2,2]},t(u,[2,4]),t(u,[2,5]),{1:[2,6],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:r,9:22,12:11,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},{6:h,7:f,10:23,11:d},t(p,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:s,23:l}),t(p,[2,19]),t(p,[2,21],{15:30,24:m}),t(p,[2,22]),t(p,[2,23]),t(g,[2,25]),t(g,[2,26]),t(g,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:f,10:34,11:d},{1:[2,7],6:r,12:21,13:n,14:14,16:i,17:a,18:17,19:18,20:s,23:l},t(y,[2,14],{7:v,11:x}),t(b,[2,8]),t(b,[2,9]),t(b,[2,10]),t(p,[2,16],{15:37,24:m}),t(p,[2,17]),t(p,[2,18]),t(p,[2,20],{24:T}),t(g,[2,31]),{21:[1,39]},{22:[1,40]},t(y,[2,13],{7:v,11:x}),t(b,[2,11]),t(b,[2,12]),t(p,[2,15],{24:T}),t(g,[2,30]),{22:[1,41]},t(g,[2,27]),t(g,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:o(function(C,D){if(D.recoverable)this.trace(C);else{var O=new Error(C);throw O.hash=D,O}},"parseError"),parse:o(function(C){var D=this,O=[0],R=[],k=[null],L=[],A=this.table,I="",M=0,P=0,B=0,F=2,z=1,$=L.slice.call(arguments,1),U=Object.create(this.lexer),K={yy:{}};for(var ee in this.yy)Object.prototype.hasOwnProperty.call(this.yy,ee)&&(K.yy[ee]=this.yy[ee]);U.setInput(C,K.yy),K.yy.lexer=U,K.yy.parser=this,typeof U.yylloc>"u"&&(U.yylloc={});var Y=U.yylloc;L.push(Y);var ce=U.options&&U.options.ranges;typeof K.yy.parseError=="function"?this.parseError=K.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function Z(Be){O.length=O.length-2*Be,k.length=k.length-Be,L.length=L.length-Be}o(Z,"popStack");function ue(){var Be;return Be=R.pop()||U.lex()||z,typeof Be!="number"&&(Be instanceof Array&&(R=Be,Be=R.pop()),Be=D.symbols_[Be]||Be),Be}o(ue,"lex");for(var Q,j,ne,te,he,le,J={},Se,se,ae,Oe;;){if(ne=O[O.length-1],this.defaultActions[ne]?te=this.defaultActions[ne]:((Q===null||typeof Q>"u")&&(Q=ue()),te=A[ne]&&A[ne][Q]),typeof te>"u"||!te.length||!te[0]){var ye="";Oe=[];for(Se in A[ne])this.terminals_[Se]&&Se>F&&Oe.push("'"+this.terminals_[Se]+"'");U.showPosition?ye="Parse error on line "+(M+1)+`: -`+U.showPosition()+` -Expecting `+Oe.join(", ")+", got '"+(this.terminals_[Q]||Q)+"'":ye="Parse error on line "+(M+1)+": Unexpected "+(Q==z?"end of input":"'"+(this.terminals_[Q]||Q)+"'"),this.parseError(ye,{text:U.match,token:this.terminals_[Q]||Q,line:U.yylineno,loc:Y,expected:Oe})}if(te[0]instanceof Array&&te.length>1)throw new Error("Parse Error: multiple actions possible at state: "+ne+", token: "+Q);switch(te[0]){case 1:O.push(Q),k.push(U.yytext),L.push(U.yylloc),O.push(te[1]),Q=null,j?(Q=j,j=null):(P=U.yyleng,I=U.yytext,M=U.yylineno,Y=U.yylloc,B>0&&B--);break;case 2:if(se=this.productions_[te[1]][1],J.$=k[k.length-se],J._$={first_line:L[L.length-(se||1)].first_line,last_line:L[L.length-1].last_line,first_column:L[L.length-(se||1)].first_column,last_column:L[L.length-1].last_column},ce&&(J._$.range=[L[L.length-(se||1)].range[0],L[L.length-1].range[1]]),le=this.performAction.apply(J,[I,P,M,K.yy,te[1],k,L].concat($)),typeof le<"u")return le;se&&(O=O.slice(0,-1*se*2),k=k.slice(0,-1*se),L=L.slice(0,-1*se)),O.push(this.productions_[te[1]][0]),k.push(J.$),L.push(J._$),ae=A[O[O.length-2]][O[O.length-1]],O.push(ae);break;case 3:return!0}}return!0},"parse")},w=function(){var _={EOF:1,parseError:o(function(D,O){if(this.yy.parser)this.yy.parser.parseError(D,O);else throw new Error(D)},"parseError"),setInput:o(function(C,D){return this.yy=D||this.yy||{},this._input=C,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var C=this._input[0];this.yytext+=C,this.yyleng++,this.offset++,this.match+=C,this.matched+=C;var D=C.match(/(?:\r\n?|\n).*/g);return D?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),C},"input"),unput:o(function(C){var D=C.length,O=C.split(/(?:\r\n?|\n)/g);this._input=C+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-D),this.offset-=D;var R=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),O.length-1&&(this.yylineno-=O.length-1);var k=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:O?(O.length===R.length?this.yylloc.first_column:0)+R[R.length-O.length].length-O[0].length:this.yylloc.first_column-D},this.options.ranges&&(this.yylloc.range=[k[0],k[0]+this.yyleng-D]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(C){this.unput(this.match.slice(C))},"less"),pastInput:o(function(){var C=this.matched.substr(0,this.matched.length-this.match.length);return(C.length>20?"...":"")+C.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var C=this.match;return C.length<20&&(C+=this._input.substr(0,20-C.length)),(C.substr(0,20)+(C.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var C=this.pastInput(),D=new Array(C.length+1).join("-");return C+this.upcomingInput()+` -`+D+"^"},"showPosition"),test_match:o(function(C,D){var O,R,k;if(this.options.backtrack_lexer&&(k={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(k.yylloc.range=this.yylloc.range.slice(0))),R=C[0].match(/(?:\r\n?|\n).*/g),R&&(this.yylineno+=R.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:R?R[R.length-1].length-R[R.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+C[0].length},this.yytext+=C[0],this.match+=C[0],this.matches=C,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(C[0].length),this.matched+=C[0],O=this.performAction.call(this,this.yy,this,D,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),O)return O;if(this._backtrack){for(var L in k)this[L]=k[L];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var C,D,O,R;this._more||(this.yytext="",this.match="");for(var k=this._currentRules(),L=0;LD[0].length)){if(D=O,R=L,this.options.backtrack_lexer){if(C=this.test_match(O,k[L]),C!==!1)return C;if(this._backtrack){D=!1;continue}else return!1}else if(!this.options.flex)break}return D?(C=this.test_match(D,k[R]),C!==!1?C:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var D=this.next();return D||this.lex()},"lex"),begin:o(function(D){this.conditionStack.push(D)},"begin"),popState:o(function(){var D=this.conditionStack.length-1;return D>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(D){return D=this.conditionStack.length-1-Math.abs(D||0),D>=0?this.conditionStack[D]:"INITIAL"},"topState"),pushState:o(function(D){this.begin(D)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(D,O,R,k){var L=k;switch(R){case 0:return this.pushState("shapeData"),O.yytext="",24;break;case 1:return this.pushState("shapeDataStr"),24;break;case 2:return this.popState(),24;break;case 3:let A=/\n\s*/g;return O.yytext=O.yytext.replace(A,"
    "),24;break;case 4:return 24;case 5:this.popState();break;case 6:return D.getLogger().trace("Found comment",O.yytext),6;break;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;break;case 10:this.popState();break;case 11:D.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return D.getLogger().trace("SPACELINE"),6;break;case 13:return 7;case 14:return 16;case 15:D.getLogger().trace("end icon"),this.popState();break;case 16:return D.getLogger().trace("Exploding node"),this.begin("NODE"),20;break;case 17:return D.getLogger().trace("Cloud"),this.begin("NODE"),20;break;case 18:return D.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;break;case 19:return D.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;break;case 20:return this.begin("NODE"),20;break;case 21:return this.begin("NODE"),20;break;case 22:return this.begin("NODE"),20;break;case 23:return this.begin("NODE"),20;break;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 29:this.popState();break;case 30:D.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return D.getLogger().trace("description:",O.yytext),"NODE_DESCR";break;case 32:this.popState();break;case 33:return this.popState(),D.getLogger().trace("node end ))"),"NODE_DEND";break;case 34:return this.popState(),D.getLogger().trace("node end )"),"NODE_DEND";break;case 35:return this.popState(),D.getLogger().trace("node end ...",O.yytext),"NODE_DEND";break;case 36:return this.popState(),D.getLogger().trace("node end (("),"NODE_DEND";break;case 37:return this.popState(),D.getLogger().trace("node end (-"),"NODE_DEND";break;case 38:return this.popState(),D.getLogger().trace("node end (-"),"NODE_DEND";break;case 39:return this.popState(),D.getLogger().trace("node end (("),"NODE_DEND";break;case 40:return this.popState(),D.getLogger().trace("node end (("),"NODE_DEND";break;case 41:return D.getLogger().trace("Long description:",O.yytext),21;break;case 42:return D.getLogger().trace("Long description:",O.yytext),21;break}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}};return _}();S.lexer=w;function E(){this.yy={}}return o(E,"Parser"),E.prototype=S,S.Parser=E,new E}();dF.parser=dF;fye=dF});var ol,mF,pF,gF,Met,Iet,pye,Oet,Pet,Xi,Bet,Fet,$et,zet,Get,Vet,Uet,mye,gye=N(()=>{"use strict";Gt();pr();yt();_a();PT();ol=[],mF=[],pF=0,gF={},Met=o(()=>{ol=[],mF=[],pF=0,gF={}},"clear"),Iet=o(t=>{if(ol.length===0)return null;let e=ol[0].level,r=null;for(let n=ol.length-1;n>=0;n--)if(ol[n].level===e&&!r&&(r=ol[n]),ol[n].levell.parentId===i.id);for(let l of s){let u={id:l.id,parentId:i.id,label:wr(l.label??"",n),isGroup:!1,ticket:l?.ticket,priority:l?.priority,assigned:l?.assigned,icon:l?.icon,shape:"kanbanItem",level:l.level,rx:5,ry:5,cssStyles:["text-align: left"]};e.push(u)}}return{nodes:e,edges:t,other:{},config:me()}},"getData"),Pet=o((t,e,r,n,i)=>{let a=me(),s=a.mindmap?.padding??or.mindmap.padding;switch(n){case Xi.ROUNDED_RECT:case Xi.RECT:case Xi.HEXAGON:s*=2}let l={id:wr(e,a)||"kbn"+pF++,level:t,label:wr(r,a),width:a.mindmap?.maxNodeWidth??or.mindmap.maxNodeWidth,padding:s,isGroup:!1};if(i!==void 0){let h;i.includes(` -`)?h=i+` -`:h=`{ -`+i+` -}`;let f=Tm(h,{schema:bm});if(f.shape&&(f.shape!==f.shape.toLowerCase()||f.shape.includes("_")))throw new Error(`No such shape: ${f.shape}. Shape names should be lowercase.`);f?.shape&&f.shape==="kanbanItem"&&(l.shape=f?.shape),f?.label&&(l.label=f?.label),f?.icon&&(l.icon=f?.icon.toString()),f?.assigned&&(l.assigned=f?.assigned.toString()),f?.ticket&&(l.ticket=f?.ticket.toString()),f?.priority&&(l.priority=f?.priority)}let u=Iet(t);u?l.parentId=u.id||"kbn"+pF++:mF.push(l),ol.push(l)},"addNode"),Xi={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},Bet=o((t,e)=>{switch(X.debug("In get type",t,e),t){case"[":return Xi.RECT;case"(":return e===")"?Xi.ROUNDED_RECT:Xi.CLOUD;case"((":return Xi.CIRCLE;case")":return Xi.CLOUD;case"))":return Xi.BANG;case"{{":return Xi.HEXAGON;default:return Xi.DEFAULT}},"getType"),Fet=o((t,e)=>{gF[t]=e},"setElementForId"),$et=o(t=>{if(!t)return;let e=me(),r=ol[ol.length-1];t.icon&&(r.icon=wr(t.icon,e)),t.class&&(r.cssClasses=wr(t.class,e))},"decorateNode"),zet=o(t=>{switch(t){case Xi.DEFAULT:return"no-border";case Xi.RECT:return"rect";case Xi.ROUNDED_RECT:return"rounded-rect";case Xi.CIRCLE:return"circle";case Xi.CLOUD:return"cloud";case Xi.BANG:return"bang";case Xi.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),Get=o(()=>X,"getLogger"),Vet=o(t=>gF[t],"getElementById"),Uet={clear:Met,addNode:Pet,getSections:pye,getData:Oet,nodeType:Xi,getType:Bet,setElementForId:Fet,decorateNode:$et,type2Str:zet,getLogger:Get,getElementById:Vet},mye=Uet});var Het,yye,vye=N(()=>{"use strict";Gt();yt();Vl();xi();_a();aw();mw();Het=o(async(t,e,r,n)=>{X.debug(`Rendering kanban diagram -`+t);let a=n.db.getData(),s=me();s.htmlLabels=!1;let l=Li(e),u=l.append("g");u.attr("class","sections");let h=l.append("g");h.attr("class","items");let f=a.nodes.filter(v=>v.isGroup),d=0,p=10,m=[],g=25;for(let v of f){let x=s?.kanban?.sectionWidth||200;d=d+1,v.x=x*d+(d-1)*p/2,v.width=x,v.y=0,v.height=x*3,v.rx=5,v.ry=5,v.cssClasses=v.cssClasses+" section-"+d;let b=await Cm(u,v);g=Math.max(g,b?.labelBBox?.height),m.push(b)}let y=0;for(let v of f){let x=m[y];y=y+1;let b=s?.kanban?.sectionWidth||200,T=-b*3/2+g,S=T,w=a.nodes.filter(C=>C.parentId===v.id);for(let C of w){if(C.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");C.x=v.x,C.width=b-1.5*p;let O=(await Am(h,C,{config:s})).node().getBBox();C.y=S+O.height/2,await M2(C),S=C.y+O.height/2+p/2}let E=x.cluster.select("rect"),_=Math.max(S-T+3*p,50)+(g-25);E.attr("height",_)}Lo(void 0,l,s.mindmap?.padding??or.kanban.padding,s.mindmap?.useMaxWidth??or.kanban.useMaxWidth)},"draw"),yye={draw:Het}});var Wet,qet,xye,bye=N(()=>{"use strict";Ks();Xm();Wet=o(t=>{let e="";for(let n=0;nt.darkMode?Ot(n,i):Lt(n,i),"adjuster");for(let n=0;n` - .edge { - stroke-width: 3; - } - ${Wet(t)} - .section-root rect, .section-root path, .section-root circle, .section-root polygon { - fill: ${t.git0}; - } - .section-root text { - fill: ${t.gitBranchLabel0}; - } - .icon-container { - height:100%; - display: flex; - justify-content: center; - align-items: center; - } - .edge { - fill: none; - } - .cluster-label, .label { - color: ${t.textColor}; - fill: ${t.textColor}; - } - .kanban-label { - dy: 1em; - alignment-baseline: middle; - text-anchor: middle; - dominant-baseline: middle; - text-align: center; - } - ${Nc()} -`,"getStyles"),xye=qet});var Tye={};ur(Tye,{diagram:()=>Yet});var Yet,wye=N(()=>{"use strict";dye();gye();vye();bye();Yet={db:mye,renderer:yye,parser:fye,styles:xye}});var yF,E4,Sye=N(()=>{"use strict";yF=function(){var t=o(function(l,u,h,f){for(h=h||{},f=l.length;f--;h[l[f]]=u);return h},"o"),e=[1,9],r=[1,10],n=[1,5,10,12],i={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:o(function(u,h,f,d,p,m,g){var y=m.length-1;switch(p){case 7:let v=d.findOrCreateNode(m[y-4].trim().replaceAll('""','"')),x=d.findOrCreateNode(m[y-2].trim().replaceAll('""','"')),b=parseFloat(m[y].trim());d.addLink(v,x,b);break;case 8:case 9:case 11:this.$=m[y];break;case 10:this.$=m[y-1];break}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:e,20:r},{1:[2,6],7:11,10:[1,12]},t(r,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(n,[2,8]),t(n,[2,9]),{19:[1,16]},t(n,[2,11]),{1:[2,1]},{1:[2,5]},t(r,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:e,20:r},{15:18,16:7,17:8,18:e,20:r},{18:[1,19]},t(r,[2,3]),{12:[1,20]},t(n,[2,10]),{15:21,16:7,17:8,18:e,20:r},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:o(function(u,h){if(h.recoverable)this.trace(u);else{var f=new Error(u);throw f.hash=h,f}},"parseError"),parse:o(function(u){var h=this,f=[0],d=[],p=[null],m=[],g=this.table,y="",v=0,x=0,b=0,T=2,S=1,w=m.slice.call(arguments,1),E=Object.create(this.lexer),_={yy:{}};for(var C in this.yy)Object.prototype.hasOwnProperty.call(this.yy,C)&&(_.yy[C]=this.yy[C]);E.setInput(u,_.yy),_.yy.lexer=E,_.yy.parser=this,typeof E.yylloc>"u"&&(E.yylloc={});var D=E.yylloc;m.push(D);var O=E.options&&E.options.ranges;typeof _.yy.parseError=="function"?this.parseError=_.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function R(Y){f.length=f.length-2*Y,p.length=p.length-Y,m.length=m.length-Y}o(R,"popStack");function k(){var Y;return Y=d.pop()||E.lex()||S,typeof Y!="number"&&(Y instanceof Array&&(d=Y,Y=d.pop()),Y=h.symbols_[Y]||Y),Y}o(k,"lex");for(var L,A,I,M,P,B,F={},z,$,U,K;;){if(I=f[f.length-1],this.defaultActions[I]?M=this.defaultActions[I]:((L===null||typeof L>"u")&&(L=k()),M=g[I]&&g[I][L]),typeof M>"u"||!M.length||!M[0]){var ee="";K=[];for(z in g[I])this.terminals_[z]&&z>T&&K.push("'"+this.terminals_[z]+"'");E.showPosition?ee="Parse error on line "+(v+1)+`: -`+E.showPosition()+` -Expecting `+K.join(", ")+", got '"+(this.terminals_[L]||L)+"'":ee="Parse error on line "+(v+1)+": Unexpected "+(L==S?"end of input":"'"+(this.terminals_[L]||L)+"'"),this.parseError(ee,{text:E.match,token:this.terminals_[L]||L,line:E.yylineno,loc:D,expected:K})}if(M[0]instanceof Array&&M.length>1)throw new Error("Parse Error: multiple actions possible at state: "+I+", token: "+L);switch(M[0]){case 1:f.push(L),p.push(E.yytext),m.push(E.yylloc),f.push(M[1]),L=null,A?(L=A,A=null):(x=E.yyleng,y=E.yytext,v=E.yylineno,D=E.yylloc,b>0&&b--);break;case 2:if($=this.productions_[M[1]][1],F.$=p[p.length-$],F._$={first_line:m[m.length-($||1)].first_line,last_line:m[m.length-1].last_line,first_column:m[m.length-($||1)].first_column,last_column:m[m.length-1].last_column},O&&(F._$.range=[m[m.length-($||1)].range[0],m[m.length-1].range[1]]),B=this.performAction.apply(F,[y,x,v,_.yy,M[1],p,m].concat(w)),typeof B<"u")return B;$&&(f=f.slice(0,-1*$*2),p=p.slice(0,-1*$),m=m.slice(0,-1*$)),f.push(this.productions_[M[1]][0]),p.push(F.$),m.push(F._$),U=g[f[f.length-2]][f[f.length-1]],f.push(U);break;case 3:return!0}}return!0},"parse")},a=function(){var l={EOF:1,parseError:o(function(h,f){if(this.yy.parser)this.yy.parser.parseError(h,f);else throw new Error(h)},"parseError"),setInput:o(function(u,h){return this.yy=h||this.yy||{},this._input=u,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var u=this._input[0];this.yytext+=u,this.yyleng++,this.offset++,this.match+=u,this.matched+=u;var h=u.match(/(?:\r\n?|\n).*/g);return h?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),u},"input"),unput:o(function(u){var h=u.length,f=u.split(/(?:\r\n?|\n)/g);this._input=u+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-h),this.offset-=h;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),f.length-1&&(this.yylineno-=f.length-1);var p=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:f?(f.length===d.length?this.yylloc.first_column:0)+d[d.length-f.length].length-f[0].length:this.yylloc.first_column-h},this.options.ranges&&(this.yylloc.range=[p[0],p[0]+this.yyleng-h]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(u){this.unput(this.match.slice(u))},"less"),pastInput:o(function(){var u=this.matched.substr(0,this.matched.length-this.match.length);return(u.length>20?"...":"")+u.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var u=this.match;return u.length<20&&(u+=this._input.substr(0,20-u.length)),(u.substr(0,20)+(u.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var u=this.pastInput(),h=new Array(u.length+1).join("-");return u+this.upcomingInput()+` -`+h+"^"},"showPosition"),test_match:o(function(u,h){var f,d,p;if(this.options.backtrack_lexer&&(p={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(p.yylloc.range=this.yylloc.range.slice(0))),d=u[0].match(/(?:\r\n?|\n).*/g),d&&(this.yylineno+=d.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:d?d[d.length-1].length-d[d.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+u[0].length},this.yytext+=u[0],this.match+=u[0],this.matches=u,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(u[0].length),this.matched+=u[0],f=this.performAction.call(this,this.yy,this,h,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),f)return f;if(this._backtrack){for(var m in p)this[m]=p[m];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var u,h,f,d;this._more||(this.yytext="",this.match="");for(var p=this._currentRules(),m=0;mh[0].length)){if(h=f,d=m,this.options.backtrack_lexer){if(u=this.test_match(f,p[m]),u!==!1)return u;if(this._backtrack){h=!1;continue}else return!1}else if(!this.options.flex)break}return h?(u=this.test_match(h,p[d]),u!==!1?u:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var h=this.next();return h||this.lex()},"lex"),begin:o(function(h){this.conditionStack.push(h)},"begin"),popState:o(function(){var h=this.conditionStack.length-1;return h>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(h){return h=this.conditionStack.length-1-Math.abs(h||0),h>=0?this.conditionStack[h]:"INITIAL"},"topState"),pushState:o(function(h){this.begin(h)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:o(function(h,f,d,p){var m=p;switch(d){case 0:return this.pushState("csv"),4;break;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;break;case 5:return 20;case 6:return this.popState("escaped_text"),18;break;case 7:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}};return l}();i.lexer=a;function s(){this.yy={}}return o(s,"Parser"),s.prototype=i,i.Parser=s,new s}();yF.parser=yF;E4=yF});var pC,mC,dC,Qet,vF,Zet,xF,Jet,ett,ttt,rtt,Cye,Aye=N(()=>{"use strict";Gt();pr();ci();pC=[],mC=[],dC=new Map,Qet=o(()=>{pC=[],mC=[],dC=new Map,kr()},"clear"),vF=class{constructor(e,r,n=0){this.source=e;this.target=r;this.value=n}static{o(this,"SankeyLink")}},Zet=o((t,e,r)=>{pC.push(new vF(t,e,r))},"addLink"),xF=class{constructor(e){this.ID=e}static{o(this,"SankeyNode")}},Jet=o(t=>{t=Ze.sanitizeText(t,me());let e=dC.get(t);return e===void 0&&(e=new xF(t),dC.set(t,e),mC.push(e)),e},"findOrCreateNode"),ett=o(()=>mC,"getNodes"),ttt=o(()=>pC,"getLinks"),rtt=o(()=>({nodes:mC.map(t=>({id:t.ID})),links:pC.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),Cye={nodesMap:dC,getConfig:o(()=>me().sankey,"getConfig"),getNodes:ett,getLinks:ttt,getGraph:rtt,addLink:Zet,findOrCreateNode:Jet,getAccTitle:Dr,setAccTitle:Ar,getAccDescription:Rr,setAccDescription:Lr,getDiagramTitle:Nr,setDiagramTitle:Or,clear:Qet}});function S4(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r=i)&&(r=i)}return r}var _ye=N(()=>{"use strict";o(S4,"max")});function my(t,e){let r;if(e===void 0)for(let n of t)n!=null&&(r>n||r===void 0&&n>=n)&&(r=n);else{let n=-1;for(let i of t)(i=e(i,++n,t))!=null&&(r>i||r===void 0&&i>=i)&&(r=i)}return r}var Dye=N(()=>{"use strict";o(my,"min")});function gy(t,e){let r=0;if(e===void 0)for(let n of t)(n=+n)&&(r+=n);else{let n=-1;for(let i of t)(i=+e(i,++n,t))&&(r+=i)}return r}var Lye=N(()=>{"use strict";o(gy,"sum")});var bF=N(()=>{"use strict";_ye();Dye();Lye()});function ntt(t){return t.target.depth}function TF(t){return t.depth}function wF(t,e){return e-1-t.height}function C4(t,e){return t.sourceLinks.length?t.depth:e-1}function kF(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?my(t.sourceLinks,ntt)-1:0}var EF=N(()=>{"use strict";bF();o(ntt,"targetDepth");o(TF,"left");o(wF,"right");o(C4,"justify");o(kF,"center")});function yy(t){return function(){return t}}var Rye=N(()=>{"use strict";o(yy,"constant")});function Nye(t,e){return gC(t.source,e.source)||t.index-e.index}function Mye(t,e){return gC(t.target,e.target)||t.index-e.index}function gC(t,e){return t.y0-e.y0}function SF(t){return t.value}function itt(t){return t.index}function att(t){return t.nodes}function stt(t){return t.links}function Iye(t,e){let r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function Oye({nodes:t}){for(let e of t){let r=e.y0,n=r;for(let i of e.sourceLinks)i.y0=r+i.width/2,r+=i.width;for(let i of e.targetLinks)i.y1=n+i.width/2,n+=i.width}}function yC(){let t=0,e=0,r=1,n=1,i=24,a=8,s,l=itt,u=C4,h,f,d=att,p=stt,m=6;function g(){let I={nodes:d.apply(null,arguments),links:p.apply(null,arguments)};return y(I),v(I),x(I),b(I),w(I),Oye(I),I}o(g,"sankey"),g.update=function(I){return Oye(I),I},g.nodeId=function(I){return arguments.length?(l=typeof I=="function"?I:yy(I),g):l},g.nodeAlign=function(I){return arguments.length?(u=typeof I=="function"?I:yy(I),g):u},g.nodeSort=function(I){return arguments.length?(h=I,g):h},g.nodeWidth=function(I){return arguments.length?(i=+I,g):i},g.nodePadding=function(I){return arguments.length?(a=s=+I,g):a},g.nodes=function(I){return arguments.length?(d=typeof I=="function"?I:yy(I),g):d},g.links=function(I){return arguments.length?(p=typeof I=="function"?I:yy(I),g):p},g.linkSort=function(I){return arguments.length?(f=I,g):f},g.size=function(I){return arguments.length?(t=e=0,r=+I[0],n=+I[1],g):[r-t,n-e]},g.extent=function(I){return arguments.length?(t=+I[0][0],r=+I[1][0],e=+I[0][1],n=+I[1][1],g):[[t,e],[r,n]]},g.iterations=function(I){return arguments.length?(m=+I,g):m};function y({nodes:I,links:M}){for(let[B,F]of I.entries())F.index=B,F.sourceLinks=[],F.targetLinks=[];let P=new Map(I.map((B,F)=>[l(B,F,I),B]));for(let[B,F]of M.entries()){F.index=B;let{source:z,target:$}=F;typeof z!="object"&&(z=F.source=Iye(P,z)),typeof $!="object"&&($=F.target=Iye(P,$)),z.sourceLinks.push(F),$.targetLinks.push(F)}if(f!=null)for(let{sourceLinks:B,targetLinks:F}of I)B.sort(f),F.sort(f)}o(y,"computeNodeLinks");function v({nodes:I}){for(let M of I)M.value=M.fixedValue===void 0?Math.max(gy(M.sourceLinks,SF),gy(M.targetLinks,SF)):M.fixedValue}o(v,"computeNodeValues");function x({nodes:I}){let M=I.length,P=new Set(I),B=new Set,F=0;for(;P.size;){for(let z of P){z.depth=F;for(let{target:$}of z.sourceLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(x,"computeNodeDepths");function b({nodes:I}){let M=I.length,P=new Set(I),B=new Set,F=0;for(;P.size;){for(let z of P){z.height=F;for(let{source:$}of z.targetLinks)B.add($)}if(++F>M)throw new Error("circular link");P=B,B=new Set}}o(b,"computeNodeHeights");function T({nodes:I}){let M=S4(I,F=>F.depth)+1,P=(r-t-i)/(M-1),B=new Array(M);for(let F of I){let z=Math.max(0,Math.min(M-1,Math.floor(u.call(null,F,M))));F.layer=z,F.x0=t+z*P,F.x1=F.x0+i,B[z]?B[z].push(F):B[z]=[F]}if(h)for(let F of B)F.sort(h);return B}o(T,"computeNodeLayers");function S(I){let M=my(I,P=>(n-e-(P.length-1)*s)/gy(P,SF));for(let P of I){let B=e;for(let F of P){F.y0=B,F.y1=B+F.value*M,B=F.y1+s;for(let z of F.sourceLinks)z.width=z.value*M}B=(n-B+s)/(P.length+1);for(let F=0;FP.length)-1)),S(M);for(let P=0;P0))continue;let ee=(U/K-$.y0)*M;$.y0+=ee,$.y1+=ee,R($)}h===void 0&&z.sort(gC),C(z,P)}}o(E,"relaxLeftToRight");function _(I,M,P){for(let B=I.length,F=B-2;F>=0;--F){let z=I[F];for(let $ of z){let U=0,K=0;for(let{target:Y,value:ce}of $.sourceLinks){let Z=ce*(Y.layer-$.layer);U+=A($,Y)*Z,K+=Z}if(!(K>0))continue;let ee=(U/K-$.y0)*M;$.y0+=ee,$.y1+=ee,R($)}h===void 0&&z.sort(gC),C(z,P)}}o(_,"relaxRightToLeft");function C(I,M){let P=I.length>>1,B=I[P];O(I,B.y0-s,P-1,M),D(I,B.y1+s,P+1,M),O(I,n,I.length-1,M),D(I,e,0,M)}o(C,"resolveCollisions");function D(I,M,P,B){for(;P1e-6&&(F.y0+=z,F.y1+=z),M=F.y1+s}}o(D,"resolveCollisionsTopToBottom");function O(I,M,P,B){for(;P>=0;--P){let F=I[P],z=(F.y1-M)*B;z>1e-6&&(F.y0-=z,F.y1-=z),M=F.y0-s}}o(O,"resolveCollisionsBottomToTop");function R({sourceLinks:I,targetLinks:M}){if(f===void 0){for(let{source:{sourceLinks:P}}of M)P.sort(Mye);for(let{target:{targetLinks:P}}of I)P.sort(Nye)}}o(R,"reorderNodeLinks");function k(I){if(f===void 0)for(let{sourceLinks:M,targetLinks:P}of I)M.sort(Mye),P.sort(Nye)}o(k,"reorderLinks");function L(I,M){let P=I.y0-(I.sourceLinks.length-1)*s/2;for(let{target:B,width:F}of I.sourceLinks){if(B===M)break;P+=F+s}for(let{source:B,width:F}of M.targetLinks){if(B===I)break;P-=F}return P}o(L,"targetTop");function A(I,M){let P=M.y0-(M.targetLinks.length-1)*s/2;for(let{source:B,width:F}of M.targetLinks){if(B===I)break;P+=F+s}for(let{target:B,width:F}of I.sourceLinks){if(B===M)break;P-=F}return P}return o(A,"sourceTop"),g}var Pye=N(()=>{"use strict";bF();EF();Rye();o(Nye,"ascendingSourceBreadth");o(Mye,"ascendingTargetBreadth");o(gC,"ascendingBreadth");o(SF,"value");o(itt,"defaultId");o(att,"defaultNodes");o(stt,"defaultLinks");o(Iye,"find");o(Oye,"computeLinkBreadths");o(yC,"Sankey")});function _F(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function Bye(){return new _F}var CF,AF,i0,ott,DF,Fye=N(()=>{"use strict";CF=Math.PI,AF=2*CF,i0=1e-6,ott=AF-i0;o(_F,"Path");o(Bye,"path");_F.prototype=Bye.prototype={constructor:_F,moveTo:o(function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},"moveTo"),closePath:o(function(){this._x1!==null&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},"closePath"),lineTo:o(function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},"lineTo"),quadraticCurveTo:o(function(t,e,r,n){this._+="Q"+ +t+","+ +e+","+(this._x1=+r)+","+(this._y1=+n)},"quadraticCurveTo"),bezierCurveTo:o(function(t,e,r,n,i,a){this._+="C"+ +t+","+ +e+","+ +r+","+ +n+","+(this._x1=+i)+","+(this._y1=+a)},"bezierCurveTo"),arcTo:o(function(t,e,r,n,i){t=+t,e=+e,r=+r,n=+n,i=+i;var a=this._x1,s=this._y1,l=r-t,u=n-e,h=a-t,f=s-e,d=h*h+f*f;if(i<0)throw new Error("negative radius: "+i);if(this._x1===null)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(d>i0)if(!(Math.abs(f*l-u*h)>i0)||!i)this._+="L"+(this._x1=t)+","+(this._y1=e);else{var p=r-a,m=n-s,g=l*l+u*u,y=p*p+m*m,v=Math.sqrt(g),x=Math.sqrt(d),b=i*Math.tan((CF-Math.acos((g+d-y)/(2*v*x)))/2),T=b/x,S=b/v;Math.abs(T-1)>i0&&(this._+="L"+(t+T*h)+","+(e+T*f)),this._+="A"+i+","+i+",0,0,"+ +(f*p>h*m)+","+(this._x1=t+S*l)+","+(this._y1=e+S*u)}},"arcTo"),arc:o(function(t,e,r,n,i,a){t=+t,e=+e,r=+r,a=!!a;var s=r*Math.cos(n),l=r*Math.sin(n),u=t+s,h=e+l,f=1^a,d=a?n-i:i-n;if(r<0)throw new Error("negative radius: "+r);this._x1===null?this._+="M"+u+","+h:(Math.abs(this._x1-u)>i0||Math.abs(this._y1-h)>i0)&&(this._+="L"+u+","+h),r&&(d<0&&(d=d%AF+AF),d>ott?this._+="A"+r+","+r+",0,1,"+f+","+(t-s)+","+(e-l)+"A"+r+","+r+",0,1,"+f+","+(this._x1=u)+","+(this._y1=h):d>i0&&(this._+="A"+r+","+r+",0,"+ +(d>=CF)+","+f+","+(this._x1=t+r*Math.cos(i))+","+(this._y1=e+r*Math.sin(i))))},"arc"),rect:o(function(t,e,r,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +r+"v"+ +n+"h"+-r+"Z"},"rect"),toString:o(function(){return this._},"toString")};DF=Bye});var $ye=N(()=>{"use strict";Fye()});function vC(t){return o(function(){return t},"constant")}var zye=N(()=>{"use strict";o(vC,"default")});function Gye(t){return t[0]}function Vye(t){return t[1]}var Uye=N(()=>{"use strict";o(Gye,"x");o(Vye,"y")});var Hye,Wye=N(()=>{"use strict";Hye=Array.prototype.slice});function ltt(t){return t.source}function ctt(t){return t.target}function utt(t){var e=ltt,r=ctt,n=Gye,i=Vye,a=null;function s(){var l,u=Hye.call(arguments),h=e.apply(this,u),f=r.apply(this,u);if(a||(a=l=DF()),t(a,+n.apply(this,(u[0]=h,u)),+i.apply(this,u),+n.apply(this,(u[0]=f,u)),+i.apply(this,u)),l)return a=null,l+""||null}return o(s,"link"),s.source=function(l){return arguments.length?(e=l,s):e},s.target=function(l){return arguments.length?(r=l,s):r},s.x=function(l){return arguments.length?(n=typeof l=="function"?l:vC(+l),s):n},s.y=function(l){return arguments.length?(i=typeof l=="function"?l:vC(+l),s):i},s.context=function(l){return arguments.length?(a=l??null,s):a},s}function htt(t,e,r,n,i){t.moveTo(e,r),t.bezierCurveTo(e=(e+n)/2,r,e,i,n,i)}function LF(){return utt(htt)}var qye=N(()=>{"use strict";$ye();Wye();zye();Uye();o(ltt,"linkSource");o(ctt,"linkTarget");o(utt,"link");o(htt,"curveHorizontal");o(LF,"linkHorizontal")});var Yye=N(()=>{"use strict";qye()});function ftt(t){return[t.source.x1,t.y0]}function dtt(t){return[t.target.x0,t.y1]}function xC(){return LF().source(ftt).target(dtt)}var Xye=N(()=>{"use strict";Yye();o(ftt,"horizontalSource");o(dtt,"horizontalTarget");o(xC,"default")});var jye=N(()=>{"use strict";Pye();EF();Xye()});var A4,Kye=N(()=>{"use strict";A4=class t{static{o(this,"Uid")}static{this.count=0}static next(e){return new t(e+ ++t.count)}constructor(e){this.id=e,this.href=`#${e}`}toString(){return"url("+this.href+")"}}});var ptt,mtt,Qye,Zye=N(()=>{"use strict";Gt();fr();jye();xi();Kye();ptt={left:TF,right:wF,center:kF,justify:C4},mtt=o(function(t,e,r,n){let{securityLevel:i,sankey:a}=me(),s=$3.sankey,l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ge(`[id="${e}"]`),f=a?.width??s.width,d=a?.height??s.width,p=a?.useMaxWidth??s.useMaxWidth,m=a?.nodeAlignment??s.nodeAlignment,g=a?.prefix??s.prefix,y=a?.suffix??s.suffix,v=a?.showValues??s.showValues,x=n.db.getGraph(),b=ptt[m];yC().nodeId(O=>O.id).nodeWidth(10).nodePadding(10+(v?15:0)).nodeAlign(b).extent([[0,0],[f,d]])(x);let w=Js(PD);h.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",O=>(O.uid=A4.next("node-")).id).attr("transform",function(O){return"translate("+O.x0+","+O.y0+")"}).attr("x",O=>O.x0).attr("y",O=>O.y0).append("rect").attr("height",O=>O.y1-O.y0).attr("width",O=>O.x1-O.x0).attr("fill",O=>w(O.id));let E=o(({id:O,value:R})=>v?`${O} -${g}${Math.round(R*100)/100}${y}`:O,"getText");h.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",O=>O.x0(O.y1+O.y0)/2).attr("dy",`${v?"0":"0.35"}em`).attr("text-anchor",O=>O.x0(R.uid=A4.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",R=>R.source.x1).attr("x2",R=>R.target.x0);O.append("stop").attr("offset","0%").attr("stop-color",R=>w(R.source.id)),O.append("stop").attr("offset","100%").attr("stop-color",R=>w(R.target.id))}let D;switch(C){case"gradient":D=o(O=>O.uid,"coloring");break;case"source":D=o(O=>w(O.source.id),"coloring");break;case"target":D=o(O=>w(O.target.id),"coloring");break;default:D=C}_.append("path").attr("d",xC()).attr("stroke",D).attr("stroke-width",O=>Math.max(1,O.width)),Lo(void 0,h,0,p)},"draw"),Qye={draw:mtt}});var Jye,eve=N(()=>{"use strict";Jye=o(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,` -`).trim(),"prepareTextForParsing")});var gtt,tve,rve=N(()=>{"use strict";gtt=o(t=>`.label { - font-family: ${t.fontFamily}; - }`,"getStyles"),tve=gtt});var nve={};ur(nve,{diagram:()=>vtt});var ytt,vtt,ive=N(()=>{"use strict";Sye();Aye();Zye();eve();rve();ytt=E4.parse.bind(E4);E4.parse=t=>ytt(Jye(t));vtt={styles:tve,parser:E4,db:Cye,renderer:Qye}});var ove,RF,wtt,ktt,Ett,Stt,Ctt,qf,NF=N(()=>{"use strict";mi();_a();er();ci();ove={packet:[]},RF=structuredClone(ove),wtt=or.packet,ktt=o(()=>{let t=$n({...wtt,...tr().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),Ett=o(()=>RF.packet,"getPacket"),Stt=o(t=>{t.length>0&&RF.packet.push(t)},"pushWord"),Ctt=o(()=>{kr(),RF=structuredClone(ove)},"clear"),qf={pushWord:Stt,getPacket:Ett,getConfig:ktt,clear:Ctt,setAccTitle:Ar,getAccTitle:Dr,setDiagramTitle:Or,getDiagramTitle:Nr,getAccDescription:Rr,setAccDescription:Lr}});var Att,_tt,Dtt,lve,cve=N(()=>{"use strict";bf();yt();Mp();NF();Att=1e4,_tt=o(t=>{Jo(t,qf);let e=-1,r=[],n=1,{bitsPerRow:i}=qf.getConfig();for(let{start:a,end:s,bits:l,label:u}of t.blocks){if(a!==void 0&&s!==void 0&&s{if(t.start===void 0)throw new Error("start should have been set during first phase");if(t.end===void 0)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*r)return[t,void 0];let n=e*r-1,i=e*r;return[{start:t.start,end:n,label:t.label,bits:n-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),lve={parse:o(async t=>{let e=await vs("packet",t);X.debug(e),_tt(e)},"parse")}});var Ltt,Rtt,uve,hve=N(()=>{"use strict";Vl();xi();Ltt=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),{rowHeight:s,paddingY:l,bitWidth:u,bitsPerRow:h}=a,f=i.getPacket(),d=i.getDiagramTitle(),p=s+l,m=p*(f.length+1)-(d?0:s),g=u*h+2,y=Li(e);y.attr("viewbox",`0 0 ${g} ${m}`),fn(y,m,g,a.useMaxWidth);for(let[v,x]of f.entries())Rtt(y,x,v,a);y.append("text").text(d).attr("x",g/2).attr("y",m-p/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),Rtt=o((t,e,r,{rowHeight:n,paddingX:i,paddingY:a,bitWidth:s,bitsPerRow:l,showBits:u})=>{let h=t.append("g"),f=r*(n+a)+a;for(let d of e){let p=d.start%l*s+1,m=(d.end-d.start+1)*s-i;if(h.append("rect").attr("x",p).attr("y",f).attr("width",m).attr("height",n).attr("class","packetBlock"),h.append("text").attr("x",p+m/2).attr("y",f+n/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(d.label),!u)continue;let g=d.end===d.start,y=f-2;h.append("text").attr("x",p+(g?m/2:0)).attr("y",y).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",g?"middle":"start").text(d.start),g||h.append("text").attr("x",p+m).attr("y",y).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(d.end)}},"drawWord"),uve={draw:Ltt}});var Ntt,fve,dve=N(()=>{"use strict";er();Ntt={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},fve=o(({packet:t}={})=>{let e=$n(Ntt,t);return` - .packetByte { - font-size: ${e.byteFontSize}; - } - .packetByte.start { - fill: ${e.startByteColor}; - } - .packetByte.end { - fill: ${e.endByteColor}; - } - .packetLabel { - fill: ${e.labelColor}; - font-size: ${e.labelFontSize}; - } - .packetTitle { - fill: ${e.titleColor}; - font-size: ${e.titleFontSize}; - } - .packetBlock { - stroke: ${e.blockStrokeColor}; - stroke-width: ${e.blockStrokeWidth}; - fill: ${e.blockFillColor}; - } - `},"styles")});var pve={};ur(pve,{diagram:()=>Mtt});var Mtt,mve=N(()=>{"use strict";NF();cve();hve();dve();Mtt={parser:lve,db:qf,renderer:uve,styles:fve}});var vy,vve,a0,Ptt,Btt,xve,Ftt,$tt,ztt,Gtt,Vtt,Utt,Htt,s0,MF=N(()=>{"use strict";mi();_a();er();ci();vy={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},vve={axes:[],curves:[],options:vy},a0=structuredClone(vve),Ptt=or.radar,Btt=o(()=>$n({...Ptt,...tr().radar}),"getConfig"),xve=o(()=>a0.axes,"getAxes"),Ftt=o(()=>a0.curves,"getCurves"),$tt=o(()=>a0.options,"getOptions"),ztt=o(t=>{a0.axes=t.map(e=>({name:e.name,label:e.label??e.name}))},"setAxes"),Gtt=o(t=>{a0.curves=t.map(e=>({name:e.name,label:e.label??e.name,entries:Vtt(e.entries)}))},"setCurves"),Vtt=o(t=>{if(t[0].axis==null)return t.map(r=>r.value);let e=xve();if(e.length===0)throw new Error("Axes must be populated before curves for reference entries");return e.map(r=>{let n=t.find(i=>i.axis?.$refText===r.name);if(n===void 0)throw new Error("Missing entry for axis "+r.label);return n.value})},"computeCurveEntries"),Utt=o(t=>{let e=t.reduce((r,n)=>(r[n.name]=n,r),{});a0.options={showLegend:e.showLegend?.value??vy.showLegend,ticks:e.ticks?.value??vy.ticks,max:e.max?.value??vy.max,min:e.min?.value??vy.min,graticule:e.graticule?.value??vy.graticule}},"setOptions"),Htt=o(()=>{kr(),a0=structuredClone(vve)},"clear"),s0={getAxes:xve,getCurves:Ftt,getOptions:$tt,setAxes:ztt,setCurves:Gtt,setOptions:Utt,getConfig:Btt,clear:Htt,setAccTitle:Ar,getAccTitle:Dr,setDiagramTitle:Or,getDiagramTitle:Nr,getAccDescription:Rr,setAccDescription:Lr}});var Wtt,bve,Tve=N(()=>{"use strict";bf();yt();Mp();MF();Wtt=o(t=>{Jo(t,s0);let{axes:e,curves:r,options:n}=t;s0.setAxes(e),s0.setCurves(r),s0.setOptions(n)},"populate"),bve={parse:o(async t=>{let e=await vs("radar",t);X.debug(e),Wtt(e)},"parse")}});function Ktt(t,e,r,n,i,a,s){let l=e.length,u=Math.min(s.width,s.height)/2;r.forEach((h,f)=>{if(h.entries.length!==l)return;let d=h.entries.map((p,m)=>{let g=2*Math.PI*m/l-Math.PI/2,y=Qtt(p,n,i,u),v=y*Math.cos(g),x=y*Math.sin(g);return{x:v,y:x}});a==="circle"?t.append("path").attr("d",Ztt(d,s.curveTension)).attr("class",`radarCurve-${f}`):a==="polygon"&&t.append("polygon").attr("points",d.map(p=>`${p.x},${p.y}`).join(" ")).attr("class",`radarCurve-${f}`)})}function Qtt(t,e,r,n){let i=Math.min(Math.max(t,e),r);return n*(i-e)/(r-e)}function Ztt(t,e){let r=t.length,n=`M${t[0].x},${t[0].y}`;for(let i=0;i{let h=t.append("g").attr("transform",`translate(${i}, ${a+u*s})`);h.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${u}`),h.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(l.label)})}var qtt,Ytt,Xtt,jtt,wve,kve=N(()=>{"use strict";Vl();qtt=o((t,e,r,n)=>{let i=n.db,a=i.getAxes(),s=i.getCurves(),l=i.getOptions(),u=i.getConfig(),h=i.getDiagramTitle(),f=Li(e),d=Ytt(f,u),p=l.max??Math.max(...s.map(y=>Math.max(...y.entries))),m=l.min,g=Math.min(u.width,u.height)/2;Xtt(d,a,g,l.ticks,l.graticule),jtt(d,a,g,u),Ktt(d,a,s,m,p,l.graticule,u),Jtt(d,s,l.showLegend,u),d.append("text").attr("class","radarTitle").text(h).attr("x",0).attr("y",-u.height/2-u.marginTop)},"draw"),Ytt=o((t,e)=>{let r=e.width+e.marginLeft+e.marginRight,n=e.height+e.marginTop+e.marginBottom,i={x:e.marginLeft+e.width/2,y:e.marginTop+e.height/2};return t.attr("viewbox",`0 0 ${r} ${n}`).attr("width",r).attr("height",n),t.append("g").attr("transform",`translate(${i.x}, ${i.y})`)},"drawFrame"),Xtt=o((t,e,r,n,i)=>{if(i==="circle")for(let a=0;a{let d=2*f*Math.PI/a-Math.PI/2,p=l*Math.cos(d),m=l*Math.sin(d);return`${p},${m}`}).join(" ");t.append("polygon").attr("points",u).attr("class","radarGraticule")}}},"drawGraticule"),jtt=o((t,e,r,n)=>{let i=e.length;for(let a=0;a{"use strict";er();By();mi();ert=o((t,e)=>{let r="";for(let n=0;n{let e=dh(),r=tr(),n=$n(e,r.themeVariables),i=$n(n.radar,t);return{themeVariables:n,radarOptions:i}},"buildRadarStyleOptions"),Eve=o(({radar:t}={})=>{let{themeVariables:e,radarOptions:r}=trt(t);return` - .radarTitle { - font-size: ${e.fontSize}; - color: ${e.titleColor}; - dominant-baseline: hanging; - text-anchor: middle; - } - .radarAxisLine { - stroke: ${r.axisColor}; - stroke-width: ${r.axisStrokeWidth}; - } - .radarAxisLabel { - dominant-baseline: middle; - text-anchor: middle; - font-size: ${r.axisLabelFontSize}px; - color: ${r.axisColor}; - } - .radarGraticule { - fill: ${r.graticuleColor}; - fill-opacity: ${r.graticuleOpacity}; - stroke: ${r.graticuleColor}; - stroke-width: ${r.graticuleStrokeWidth}; - } - .radarLegendText { - text-anchor: start; - font-size: ${r.legendFontSize}px; - dominant-baseline: hanging; - } - ${ert(e,r)} - `},"styles")});var Cve={};ur(Cve,{diagram:()=>rrt});var rrt,Ave=N(()=>{"use strict";MF();Tve();kve();Sve();rrt={parser:bve,db:s0,renderer:wve,styles:Eve}});var IF,Lve,Rve=N(()=>{"use strict";IF=function(){var t=o(function(T,S,w,E){for(w=w||{},E=T.length;E--;w[T[E]]=S);return w},"o"),e=[1,7],r=[1,13],n=[1,14],i=[1,15],a=[1,19],s=[1,16],l=[1,17],u=[1,18],h=[8,30],f=[8,21,28,29,30,31,32,40,44,47],d=[1,23],p=[1,24],m=[8,15,16,21,28,29,30,31,32,40,44,47],g=[8,15,16,21,27,28,29,30,31,32,40,44,47],y=[1,49],v={trace:o(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,block:31,NODE_ID:32,nodeShapeNLabel:33,dirList:34,DIR:35,NODE_DSTART:36,NODE_DEND:37,BLOCK_ARROW_START:38,BLOCK_ARROW_END:39,classDef:40,CLASSDEF_ID:41,CLASSDEF_STYLEOPTS:42,DEFAULT:43,class:44,CLASSENTITY_IDS:45,STYLECLASS:46,style:47,STYLE_ENTITY_IDS:48,STYLE_DEFINITION_DATA:49,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"block",32:"NODE_ID",35:"DIR",36:"NODE_DSTART",37:"NODE_DEND",38:"BLOCK_ARROW_START",39:"BLOCK_ARROW_END",40:"classDef",41:"CLASSDEF_ID",42:"CLASSDEF_STYLEOPTS",43:"DEFAULT",44:"class",45:"CLASSENTITY_IDS",46:"STYLECLASS",47:"style",48:"STYLE_ENTITY_IDS",49:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[34,1],[34,2],[33,3],[33,4],[23,3],[23,3],[24,3],[25,3]],performAction:o(function(S,w,E,_,C,D,O){var R=D.length-1;switch(C){case 4:_.getLogger().debug("Rule: separator (NL) ");break;case 5:_.getLogger().debug("Rule: separator (Space) ");break;case 6:_.getLogger().debug("Rule: separator (EOF) ");break;case 7:_.getLogger().debug("Rule: hierarchy: ",D[R-1]),_.setHierarchy(D[R-1]);break;case 8:_.getLogger().debug("Stop NL ");break;case 9:_.getLogger().debug("Stop EOF ");break;case 10:_.getLogger().debug("Stop NL2 ");break;case 11:_.getLogger().debug("Stop EOF2 ");break;case 12:_.getLogger().debug("Rule: statement: ",D[R]),typeof D[R].length=="number"?this.$=D[R]:this.$=[D[R]];break;case 13:_.getLogger().debug("Rule: statement #2: ",D[R-1]),this.$=[D[R-1]].concat(D[R]);break;case 14:_.getLogger().debug("Rule: link: ",D[R],S),this.$={edgeTypeStr:D[R],label:""};break;case 15:_.getLogger().debug("Rule: LABEL link: ",D[R-3],D[R-1],D[R]),this.$={edgeTypeStr:D[R],label:D[R-1]};break;case 18:let k=parseInt(D[R]),L=_.generateId();this.$={id:L,type:"space",label:"",width:k,children:[]};break;case 23:_.getLogger().debug("Rule: (nodeStatement link node) ",D[R-2],D[R-1],D[R]," typestr: ",D[R-1].edgeTypeStr);let A=_.edgeStrToEdgeData(D[R-1].edgeTypeStr);this.$=[{id:D[R-2].id,label:D[R-2].label,type:D[R-2].type,directions:D[R-2].directions},{id:D[R-2].id+"-"+D[R].id,start:D[R-2].id,end:D[R].id,label:D[R-1].label,type:"edge",directions:D[R].directions,arrowTypeEnd:A,arrowTypeStart:"arrow_open"},{id:D[R].id,label:D[R].label,type:_.typeStr2Type(D[R].typeStr),directions:D[R].directions}];break;case 24:_.getLogger().debug("Rule: nodeStatement (abc88 node size) ",D[R-1],D[R]),this.$={id:D[R-1].id,label:D[R-1].label,type:_.typeStr2Type(D[R-1].typeStr),directions:D[R-1].directions,widthInColumns:parseInt(D[R],10)};break;case 25:_.getLogger().debug("Rule: nodeStatement (node) ",D[R]),this.$={id:D[R].id,label:D[R].label,type:_.typeStr2Type(D[R].typeStr),directions:D[R].directions,widthInColumns:1};break;case 26:_.getLogger().debug("APA123",this?this:"na"),_.getLogger().debug("COLUMNS: ",D[R]),this.$={type:"column-setting",columns:D[R]==="auto"?-1:parseInt(D[R])};break;case 27:_.getLogger().debug("Rule: id-block statement : ",D[R-2],D[R-1]);let I=_.generateId();this.$={...D[R-2],type:"composite",children:D[R-1]};break;case 28:_.getLogger().debug("Rule: blockStatement : ",D[R-2],D[R-1],D[R]);let M=_.generateId();this.$={id:M,type:"composite",label:"",children:D[R-1]};break;case 29:_.getLogger().debug("Rule: node (NODE_ID separator): ",D[R]),this.$={id:D[R]};break;case 30:_.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",D[R-1],D[R]),this.$={id:D[R-1],label:D[R].label,typeStr:D[R].typeStr,directions:D[R].directions};break;case 31:_.getLogger().debug("Rule: dirList: ",D[R]),this.$=[D[R]];break;case 32:_.getLogger().debug("Rule: dirList: ",D[R-1],D[R]),this.$=[D[R-1]].concat(D[R]);break;case 33:_.getLogger().debug("Rule: nodeShapeNLabel: ",D[R-2],D[R-1],D[R]),this.$={typeStr:D[R-2]+D[R],label:D[R-1]};break;case 34:_.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",D[R-3],D[R-2]," #3:",D[R-1],D[R]),this.$={typeStr:D[R-3]+D[R],label:D[R-2],directions:D[R-1]};break;case 35:case 36:this.$={type:"classDef",id:D[R-1].trim(),css:D[R].trim()};break;case 37:this.$={type:"applyClass",id:D[R-1].trim(),styleClass:D[R].trim()};break;case 38:this.$={type:"applyStyles",id:D[R-1].trim(),stylesStr:D[R].trim()};break}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{11:3,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{8:[1,20]},t(h,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,21:e,28:r,29:n,31:i,32:a,40:s,44:l,47:u}),t(f,[2,16],{14:22,15:d,16:p}),t(f,[2,17]),t(f,[2,18]),t(f,[2,19]),t(f,[2,20]),t(f,[2,21]),t(f,[2,22]),t(m,[2,25],{27:[1,25]}),t(f,[2,26]),{19:26,26:12,32:a},{11:27,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{41:[1,28],43:[1,29]},{45:[1,30]},{48:[1,31]},t(g,[2,29],{33:32,36:[1,33],38:[1,34]}),{1:[2,7]},t(h,[2,13]),{26:35,32:a},{32:[2,14]},{17:[1,36]},t(m,[2,24]),{11:37,13:4,14:22,15:d,16:p,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:n,31:i,32:a,40:s,44:l,47:u},{30:[1,38]},{42:[1,39]},{42:[1,40]},{46:[1,41]},{49:[1,42]},t(g,[2,30]),{18:[1,43]},{18:[1,44]},t(m,[2,23]),{18:[1,45]},{30:[1,46]},t(f,[2,28]),t(f,[2,35]),t(f,[2,36]),t(f,[2,37]),t(f,[2,38]),{37:[1,47]},{34:48,35:y},{15:[1,50]},t(f,[2,27]),t(g,[2,33]),{39:[1,51]},{34:52,35:y,39:[2,31]},{32:[2,15]},t(g,[2,34]),{39:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:o(function(S,w){if(w.recoverable)this.trace(S);else{var E=new Error(S);throw E.hash=w,E}},"parseError"),parse:o(function(S){var w=this,E=[0],_=[],C=[null],D=[],O=this.table,R="",k=0,L=0,A=0,I=2,M=1,P=D.slice.call(arguments,1),B=Object.create(this.lexer),F={yy:{}};for(var z in this.yy)Object.prototype.hasOwnProperty.call(this.yy,z)&&(F.yy[z]=this.yy[z]);B.setInput(S,F.yy),F.yy.lexer=B,F.yy.parser=this,typeof B.yylloc>"u"&&(B.yylloc={});var $=B.yylloc;D.push($);var U=B.options&&B.options.ranges;typeof F.yy.parseError=="function"?this.parseError=F.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError;function K(se){E.length=E.length-2*se,C.length=C.length-se,D.length=D.length-se}o(K,"popStack");function ee(){var se;return se=_.pop()||B.lex()||M,typeof se!="number"&&(se instanceof Array&&(_=se,se=_.pop()),se=w.symbols_[se]||se),se}o(ee,"lex");for(var Y,ce,Z,ue,Q,j,ne={},te,he,le,J;;){if(Z=E[E.length-1],this.defaultActions[Z]?ue=this.defaultActions[Z]:((Y===null||typeof Y>"u")&&(Y=ee()),ue=O[Z]&&O[Z][Y]),typeof ue>"u"||!ue.length||!ue[0]){var Se="";J=[];for(te in O[Z])this.terminals_[te]&&te>I&&J.push("'"+this.terminals_[te]+"'");B.showPosition?Se="Parse error on line "+(k+1)+`: -`+B.showPosition()+` -Expecting `+J.join(", ")+", got '"+(this.terminals_[Y]||Y)+"'":Se="Parse error on line "+(k+1)+": Unexpected "+(Y==M?"end of input":"'"+(this.terminals_[Y]||Y)+"'"),this.parseError(Se,{text:B.match,token:this.terminals_[Y]||Y,line:B.yylineno,loc:$,expected:J})}if(ue[0]instanceof Array&&ue.length>1)throw new Error("Parse Error: multiple actions possible at state: "+Z+", token: "+Y);switch(ue[0]){case 1:E.push(Y),C.push(B.yytext),D.push(B.yylloc),E.push(ue[1]),Y=null,ce?(Y=ce,ce=null):(L=B.yyleng,R=B.yytext,k=B.yylineno,$=B.yylloc,A>0&&A--);break;case 2:if(he=this.productions_[ue[1]][1],ne.$=C[C.length-he],ne._$={first_line:D[D.length-(he||1)].first_line,last_line:D[D.length-1].last_line,first_column:D[D.length-(he||1)].first_column,last_column:D[D.length-1].last_column},U&&(ne._$.range=[D[D.length-(he||1)].range[0],D[D.length-1].range[1]]),j=this.performAction.apply(ne,[R,L,k,F.yy,ue[1],C,D].concat(P)),typeof j<"u")return j;he&&(E=E.slice(0,-1*he*2),C=C.slice(0,-1*he),D=D.slice(0,-1*he)),E.push(this.productions_[ue[1]][0]),C.push(ne.$),D.push(ne._$),le=O[E[E.length-2]][E[E.length-1]],E.push(le);break;case 3:return!0}}return!0},"parse")},x=function(){var T={EOF:1,parseError:o(function(w,E){if(this.yy.parser)this.yy.parser.parseError(w,E);else throw new Error(w)},"parseError"),setInput:o(function(S,w){return this.yy=w||this.yy||{},this._input=S,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:o(function(){var S=this._input[0];this.yytext+=S,this.yyleng++,this.offset++,this.match+=S,this.matched+=S;var w=S.match(/(?:\r\n?|\n).*/g);return w?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),S},"input"),unput:o(function(S){var w=S.length,E=S.split(/(?:\r\n?|\n)/g);this._input=S+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-w),this.offset-=w;var _=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),E.length-1&&(this.yylineno-=E.length-1);var C=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:E?(E.length===_.length?this.yylloc.first_column:0)+_[_.length-E.length].length-E[0].length:this.yylloc.first_column-w},this.options.ranges&&(this.yylloc.range=[C[0],C[0]+this.yyleng-w]),this.yyleng=this.yytext.length,this},"unput"),more:o(function(){return this._more=!0,this},"more"),reject:o(function(){if(this.options.backtrack_lexer)this._backtrack=!0;else return this.parseError("Lexical error on line "+(this.yylineno+1)+`. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true). -`+this.showPosition(),{text:"",token:null,line:this.yylineno});return this},"reject"),less:o(function(S){this.unput(this.match.slice(S))},"less"),pastInput:o(function(){var S=this.matched.substr(0,this.matched.length-this.match.length);return(S.length>20?"...":"")+S.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:o(function(){var S=this.match;return S.length<20&&(S+=this._input.substr(0,20-S.length)),(S.substr(0,20)+(S.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:o(function(){var S=this.pastInput(),w=new Array(S.length+1).join("-");return S+this.upcomingInput()+` -`+w+"^"},"showPosition"),test_match:o(function(S,w){var E,_,C;if(this.options.backtrack_lexer&&(C={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(C.yylloc.range=this.yylloc.range.slice(0))),_=S[0].match(/(?:\r\n?|\n).*/g),_&&(this.yylineno+=_.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:_?_[_.length-1].length-_[_.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+S[0].length},this.yytext+=S[0],this.match+=S[0],this.matches=S,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(S[0].length),this.matched+=S[0],E=this.performAction.call(this,this.yy,this,w,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),E)return E;if(this._backtrack){for(var D in C)this[D]=C[D];return!1}return!1},"test_match"),next:o(function(){if(this.done)return this.EOF;this._input||(this.done=!0);var S,w,E,_;this._more||(this.yytext="",this.match="");for(var C=this._currentRules(),D=0;Dw[0].length)){if(w=E,_=D,this.options.backtrack_lexer){if(S=this.test_match(E,C[D]),S!==!1)return S;if(this._backtrack){w=!1;continue}else return!1}else if(!this.options.flex)break}return w?(S=this.test_match(w,C[_]),S!==!1?S:!1):this._input===""?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+`. Unrecognized text. -`+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:o(function(){var w=this.next();return w||this.lex()},"lex"),begin:o(function(w){this.conditionStack.push(w)},"begin"),popState:o(function(){var w=this.conditionStack.length-1;return w>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:o(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:o(function(w){return w=this.conditionStack.length-1-Math.abs(w||0),w>=0?this.conditionStack[w]:"INITIAL"},"topState"),pushState:o(function(w){this.begin(w)},"pushState"),stateStackSize:o(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:o(function(w,E,_,C){var D=C;switch(_){case 0:return 10;case 1:return w.getLogger().debug("Found space-block"),31;break;case 2:return w.getLogger().debug("Found nl-block"),31;break;case 3:return w.getLogger().debug("Found space-block"),29;break;case 4:w.getLogger().debug(".",E.yytext);break;case 5:w.getLogger().debug("_",E.yytext);break;case 6:return 5;case 7:return E.yytext=-1,28;break;case 8:return E.yytext=E.yytext.replace(/columns\s+/,""),w.getLogger().debug("COLUMNS (LEX)",E.yytext),28;break;case 9:this.pushState("md_string");break;case 10:return"MD_STR";case 11:this.popState();break;case 12:this.pushState("string");break;case 13:w.getLogger().debug("LEX: POPPING STR:",E.yytext),this.popState();break;case 14:return w.getLogger().debug("LEX: STR end:",E.yytext),"STR";break;case 15:return E.yytext=E.yytext.replace(/space\:/,""),w.getLogger().debug("SPACE NUM (LEX)",E.yytext),21;break;case 16:return E.yytext="1",w.getLogger().debug("COLUMNS (LEX)",E.yytext),21;break;case 17:return 43;case 18:return"LINKSTYLE";case 19:return"INTERPOLATE";case 20:return this.pushState("CLASSDEF"),40;break;case 21:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";break;case 22:return this.popState(),this.pushState("CLASSDEFID"),41;break;case 23:return this.popState(),42;break;case 24:return this.pushState("CLASS"),44;break;case 25:return this.popState(),this.pushState("CLASS_STYLE"),45;break;case 26:return this.popState(),46;break;case 27:return this.pushState("STYLE_STMNT"),47;break;case 28:return this.popState(),this.pushState("STYLE_DEFINITION"),48;break;case 29:return this.popState(),49;break;case 30:return this.pushState("acc_title"),"acc_title";break;case 31:return this.popState(),"acc_title_value";break;case 32:return this.pushState("acc_descr"),"acc_descr";break;case 33:return this.popState(),"acc_descr_value";break;case 34:this.pushState("acc_descr_multiline");break;case 35:this.popState();break;case 36:return"acc_descr_multiline_value";case 37:return 30;case 38:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 39:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 40:return this.popState(),w.getLogger().debug("Lex: ))"),"NODE_DEND";break;case 41:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 42:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 43:return this.popState(),w.getLogger().debug("Lex: (-"),"NODE_DEND";break;case 44:return this.popState(),w.getLogger().debug("Lex: -)"),"NODE_DEND";break;case 45:return this.popState(),w.getLogger().debug("Lex: (("),"NODE_DEND";break;case 46:return this.popState(),w.getLogger().debug("Lex: ]]"),"NODE_DEND";break;case 47:return this.popState(),w.getLogger().debug("Lex: ("),"NODE_DEND";break;case 48:return this.popState(),w.getLogger().debug("Lex: ])"),"NODE_DEND";break;case 49:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 50:return this.popState(),w.getLogger().debug("Lex: /]"),"NODE_DEND";break;case 51:return this.popState(),w.getLogger().debug("Lex: )]"),"NODE_DEND";break;case 52:return this.popState(),w.getLogger().debug("Lex: )"),"NODE_DEND";break;case 53:return this.popState(),w.getLogger().debug("Lex: ]>"),"NODE_DEND";break;case 54:return this.popState(),w.getLogger().debug("Lex: ]"),"NODE_DEND";break;case 55:return w.getLogger().debug("Lexa: -)"),this.pushState("NODE"),36;break;case 56:return w.getLogger().debug("Lexa: (-"),this.pushState("NODE"),36;break;case 57:return w.getLogger().debug("Lexa: ))"),this.pushState("NODE"),36;break;case 58:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 59:return w.getLogger().debug("Lex: ((("),this.pushState("NODE"),36;break;case 60:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 61:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 62:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 63:return w.getLogger().debug("Lexc: >"),this.pushState("NODE"),36;break;case 64:return w.getLogger().debug("Lexa: (["),this.pushState("NODE"),36;break;case 65:return w.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;break;case 66:return this.pushState("NODE"),36;break;case 67:return this.pushState("NODE"),36;break;case 68:return this.pushState("NODE"),36;break;case 69:return this.pushState("NODE"),36;break;case 70:return this.pushState("NODE"),36;break;case 71:return this.pushState("NODE"),36;break;case 72:return this.pushState("NODE"),36;break;case 73:return w.getLogger().debug("Lexa: ["),this.pushState("NODE"),36;break;case 74:return this.pushState("BLOCK_ARROW"),w.getLogger().debug("LEX ARR START"),38;break;case 75:return w.getLogger().debug("Lex: NODE_ID",E.yytext),32;break;case 76:return w.getLogger().debug("Lex: EOF",E.yytext),8;break;case 77:this.pushState("md_string");break;case 78:this.pushState("md_string");break;case 79:return"NODE_DESCR";case 80:this.popState();break;case 81:w.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 82:w.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 83:return w.getLogger().debug("LEX: NODE_DESCR:",E.yytext),"NODE_DESCR";break;case 84:w.getLogger().debug("LEX POPPING"),this.popState();break;case 85:w.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 86:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (right): dir:",E.yytext),"DIR";break;case 87:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (left):",E.yytext),"DIR";break;case 88:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (x):",E.yytext),"DIR";break;case 89:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (y):",E.yytext),"DIR";break;case 90:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (up):",E.yytext),"DIR";break;case 91:return E.yytext=E.yytext.replace(/^,\s*/,""),w.getLogger().debug("Lex (down):",E.yytext),"DIR";break;case 92:return E.yytext="]>",w.getLogger().debug("Lex (ARROW_DIR end):",E.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";break;case 93:return w.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 94:return w.getLogger().debug("Lex: LINK",E.yytext),15;break;case 95:return w.getLogger().debug("Lex: LINK",E.yytext),15;break;case 96:return w.getLogger().debug("Lex: LINK",E.yytext),15;break;case 97:return w.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 98:return w.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 99:return w.getLogger().debug("Lex: START_LINK",E.yytext),this.pushState("LLABEL"),16;break;case 100:this.pushState("md_string");break;case 101:return w.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";break;case 102:return this.popState(),w.getLogger().debug("Lex: LINK","#"+E.yytext+"#"),15;break;case 103:return this.popState(),w.getLogger().debug("Lex: LINK",E.yytext),15;break;case 104:return this.popState(),w.getLogger().debug("Lex: LINK",E.yytext),15;break;case 105:return w.getLogger().debug("Lex: COLON",E.yytext),E.yytext=E.yytext.slice(1),27;break}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block\s+)/,/^(?:block\n+)/,/^(?:block:)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[29],inclusive:!1},STYLE_STMNT:{rules:[28],inclusive:!1},CLASSDEFID:{rules:[23],inclusive:!1},CLASSDEF:{rules:[21,22],inclusive:!1},CLASS_STYLE:{rules:[26],inclusive:!1},CLASS:{rules:[25],inclusive:!1},LLABEL:{rules:[100,101,102,103,104],inclusive:!1},ARROW_DIR:{rules:[86,87,88,89,90,91,92],inclusive:!1},BLOCK_ARROW:{rules:[77,82,85],inclusive:!1},NODE:{rules:[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,78,81],inclusive:!1},md_string:{rules:[10,11,79,80],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[13,14,83,84],inclusive:!1},acc_descr_multiline:{rules:[35,36],inclusive:!1},acc_descr:{rules:[33],inclusive:!1},acc_title:{rules:[31],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,12,15,16,17,18,19,20,24,27,30,32,34,37,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,93,94,95,96,97,98,99,105],inclusive:!0}}};return T}();v.lexer=x;function b(){this.yy={}}return o(b,"Parser"),b.prototype=v,v.Parser=b,new b}();IF.parser=IF;Lve=IF});function frt(t){switch(X.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return X.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function drt(t){switch(X.debug("typeStr2Type",t),t){case"==":return"thick";default:return"normal"}}function prt(t){switch(t.trim()){case"--x":return"arrow_cross";case"--o":return"arrow_circle";default:return"arrow_point"}}var Yl,PF,OF,Nve,Mve,art,Ove,srt,bC,ort,lrt,crt,urt,Pve,BF,_4,hrt,Ive,mrt,grt,yrt,vrt,xrt,brt,Trt,wrt,krt,Ert,Srt,Bve,Fve=N(()=>{"use strict";JL();mi();Gt();yt();pr();ci();Yl=new Map,PF=[],OF=new Map,Nve="color",Mve="fill",art="bgFill",Ove=",",srt=me(),bC=new Map,ort=o(t=>Ze.sanitizeText(t,srt),"sanitizeText"),lrt=o(function(t,e=""){let r=bC.get(t);r||(r={id:t,styles:[],textStyles:[]},bC.set(t,r)),e?.split(Ove).forEach(n=>{let i=n.replace(/([^;]*);/,"$1").trim();if(RegExp(Nve).exec(n)){let s=i.replace(Mve,art).replace(Nve,Mve);r.textStyles.push(s)}r.styles.push(i)})},"addStyleClass"),crt=o(function(t,e=""){let r=Yl.get(t);e!=null&&(r.styles=e.split(Ove))},"addStyle2Node"),urt=o(function(t,e){t.split(",").forEach(function(r){let n=Yl.get(r);if(n===void 0){let i=r.trim();n={id:i,type:"na",children:[]},Yl.set(i,n)}n.classes||(n.classes=[]),n.classes.push(e)})},"setCssClass"),Pve=o((t,e)=>{let r=t.flat(),n=[];for(let i of r){if(i.label&&(i.label=ort(i.label)),i.type==="classDef"){lrt(i.id,i.css);continue}if(i.type==="applyClass"){urt(i.id,i?.styleClass??"");continue}if(i.type==="applyStyles"){i?.stylesStr&&crt(i.id,i?.stylesStr);continue}if(i.type==="column-setting")e.columns=i.columns??-1;else if(i.type==="edge"){let a=(OF.get(i.id)??0)+1;OF.set(i.id,a),i.id=a+"-"+i.id,PF.push(i)}else{i.label||(i.type==="composite"?i.label="":i.label=i.id);let a=Yl.get(i.id);if(a===void 0?Yl.set(i.id,i):(i.type!=="na"&&(a.type=i.type),i.label!==i.id&&(a.label=i.label)),i.children&&Pve(i.children,i),i.type==="space"){let s=i.width??1;for(let l=0;l{X.debug("Clear called"),kr(),_4={id:"root",type:"composite",children:[],columns:-1},Yl=new Map([["root",_4]]),BF=[],bC=new Map,PF=[],OF=new Map},"clear");o(frt,"typeStr2Type");o(drt,"edgeTypeStr2Type");o(prt,"edgeStrToEdgeData");Ive=0,mrt=o(()=>(Ive++,"id-"+Math.random().toString(36).substr(2,12)+"-"+Ive),"generateId"),grt=o(t=>{_4.children=t,Pve(t,_4),BF=_4.children},"setHierarchy"),yrt=o(t=>{let e=Yl.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),vrt=o(()=>[...Yl.values()],"getBlocksFlat"),xrt=o(()=>BF||[],"getBlocks"),brt=o(()=>PF,"getEdges"),Trt=o(t=>Yl.get(t),"getBlock"),wrt=o(t=>{Yl.set(t.id,t)},"setBlock"),krt=o(()=>X,"getLogger"),Ert=o(function(){return bC},"getClasses"),Srt={getConfig:o(()=>tr().block,"getConfig"),typeStr2Type:frt,edgeTypeStr2Type:drt,edgeStrToEdgeData:prt,getLogger:krt,getBlocksFlat:vrt,getBlocks:xrt,getEdges:brt,setHierarchy:grt,getBlock:Trt,setBlock:wrt,getColumns:yrt,getClasses:Ert,clear:hrt,generateId:mrt},Bve=Srt});var TC,Crt,$ve,zve=N(()=>{"use strict";Ks();Xm();TC=o((t,e)=>{let r=id,n=r(t,"r"),i=r(t,"g"),a=r(t,"b");return Qa(n,i,a,e)},"fade"),Crt=o(t=>`.label { - font-family: ${t.fontFamily}; - color: ${t.nodeTextColor||t.textColor}; - } - .cluster-label text { - fill: ${t.titleColor}; - } - .cluster-label span,p { - color: ${t.titleColor}; - } - - - - .label text,span,p { - fill: ${t.nodeTextColor||t.textColor}; - color: ${t.nodeTextColor||t.textColor}; - } - - .node rect, - .node circle, - .node ellipse, - .node polygon, - .node path { - fill: ${t.mainBkg}; - stroke: ${t.nodeBorder}; - stroke-width: 1px; - } - .flowchart-label text { - text-anchor: middle; - } - // .flowchart-label .text-outer-tspan { - // text-anchor: middle; - // } - // .flowchart-label .text-inner-tspan { - // text-anchor: start; - // } - - .node .label { - text-align: center; - } - .node.clickable { - cursor: pointer; - } - - .arrowheadPath { - fill: ${t.arrowheadColor}; - } - - .edgePath .path { - stroke: ${t.lineColor}; - stroke-width: 2.0px; - } - - .flowchart-link { - stroke: ${t.lineColor}; - fill: none; - } - - .edgeLabel { - background-color: ${t.edgeLabelBackground}; - rect { - opacity: 0.5; - background-color: ${t.edgeLabelBackground}; - fill: ${t.edgeLabelBackground}; - } - text-align: center; - } - - /* For html labels only */ - .labelBkg { - background-color: ${TC(t.edgeLabelBackground,.5)}; - // background-color: - } - - .node .cluster { - // fill: ${TC(t.mainBkg,.5)}; - fill: ${TC(t.clusterBkg,.5)}; - stroke: ${TC(t.clusterBorder,.2)}; - box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px; - stroke-width: 1px; - } - - .cluster text { - fill: ${t.titleColor}; - } - - .cluster span,p { - color: ${t.titleColor}; - } - /* .cluster div { - color: ${t.titleColor}; - } */ - - div.mermaidTooltip { - position: absolute; - text-align: center; - max-width: 200px; - padding: 2px; - font-family: ${t.fontFamily}; - font-size: 12px; - background: ${t.tertiaryColor}; - border: 1px solid ${t.border2}; - border-radius: 2px; - pointer-events: none; - z-index: 100; - } - - .flowchartTitleText { - text-anchor: middle; - font-size: 18px; - fill: ${t.textColor}; - } - ${Nc()} -`,"getStyles"),$ve=Crt});var Art,_rt,Drt,Lrt,Rrt,Nrt,Mrt,Irt,Ort,Prt,Brt,Gve,Vve=N(()=>{"use strict";yt();Art=o((t,e,r,n)=>{e.forEach(i=>{Brt[i](t,r,n)})},"insertMarkers"),_rt=o((t,e,r)=>{X.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),Drt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),Lrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),Rrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),Nrt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),Mrt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),Irt=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),Ort=o((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),Prt=o((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),Brt={extension:_rt,composition:Drt,aggregation:Lrt,dependency:Rrt,lollipop:Nrt,point:Mrt,circle:Irt,cross:Ort,barb:Prt},Gve=Art});function Frt(t,e){if(t===0||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(t===1)return{px:0,py:e};let r=e%t,n=Math.floor(e/t);return{px:r,py:n}}function FF(t,e,r=0,n=0){X.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"siblingWidth",r),t?.size?.width||(t.size={width:r,height:n,x:0,y:0});let i=0,a=0;if(t.children?.length>0){for(let m of t.children)FF(m,e);let s=$rt(t);i=s.width,a=s.height,X.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",i,a);for(let m of t.children)m.size&&(X.debug(`abc95 Setting size of children of ${t.id} id=${m.id} ${i} ${a} ${JSON.stringify(m.size)}`),m.size.width=i*(m.widthInColumns??1)+ki*((m.widthInColumns??1)-1),m.size.height=a,m.size.x=0,m.size.y=0,X.debug(`abc95 updating size of ${t.id} children child:${m.id} maxWidth:${i} maxHeight:${a}`));for(let m of t.children)FF(m,e,i,a);let l=t.columns??-1,u=0;for(let m of t.children)u+=m.widthInColumns??1;let h=t.children.length;l>0&&l0?Math.min(t.children.length,l):t.children.length;if(m>0){let g=(d-m*ki-ki)/m;X.debug("abc95 (growing to fit) width",t.id,d,t.size?.width,g);for(let y of t.children)y.size&&(y.size.width=g)}}t.size={width:d,height:p,x:0,y:0}}X.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function Uve(t,e){X.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);let r=t.columns??-1;if(X.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){let n=t?.children[0]?.size?.width??0,i=t.children.length*n+(t.children.length-1)*ki;X.debug("widthOfChildren 88",i,"posX");let a=0;X.debug("abc91 block?.size?.x",t.id,t?.size?.x);let s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-ki,l=0;for(let u of t.children){let h=t;if(!u.size)continue;let{width:f,height:d}=u.size,{px:p,py:m}=Frt(r,a);if(m!=l&&(l=m,s=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-ki,X.debug("New row in layout for block",t.id," and child ",u.id,l)),X.debug(`abc89 layout blocks (child) id: ${u.id} Pos: ${a} (px, py) ${p},${m} (${h?.size?.x},${h?.size?.y}) parent: ${h.id} width: ${f}${ki}`),h.size){let g=f/2;u.size.x=s+ki+g,X.debug(`abc91 layout blocks (calc) px, pyid:${u.id} startingPos=X${s} new startingPosX${u.size.x} ${g} padding=${ki} width=${f} halfWidth=${g} => x:${u.size.x} y:${u.size.y} ${u.widthInColumns} (width * (child?.w || 1)) / 2 ${f*(u?.widthInColumns??1)/2}`),s=u.size.x+g,u.size.y=h.size.y-h.size.height/2+m*(d+ki)+d/2+ki,X.debug(`abc88 layout blocks (calc) px, pyid:${u.id}startingPosX${s}${ki}${g}=>x:${u.size.x}y:${u.size.y}${u.widthInColumns}(width * (child?.w || 1)) / 2${f*(u?.widthInColumns??1)/2}`)}u.children&&Uve(u,e),a+=u?.widthInColumns??1,X.debug("abc88 columnsPos",u,a)}}X.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function Hve(t,{minX:e,minY:r,maxX:n,maxY:i}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&t.id!=="root"){let{x:a,y:s,width:l,height:u}=t.size;a-l/2n&&(n=a+l/2),s+u/2>i&&(i=s+u/2)}if(t.children)for(let a of t.children)({minX:e,minY:r,maxX:n,maxY:i}=Hve(a,{minX:e,minY:r,maxX:n,maxY:i}));return{minX:e,minY:r,maxX:n,maxY:i}}function Wve(t){let e=t.getBlock("root");if(!e)return;FF(e,t,0,0),Uve(e,t),X.debug("getBlocks",JSON.stringify(e,null,2));let{minX:r,minY:n,maxX:i,maxY:a}=Hve(e),s=a-n,l=i-r;return{x:r,y:n,width:l,height:s}}var ki,$rt,qve=N(()=>{"use strict";yt();Gt();ki=me()?.block?.padding??8;o(Frt,"calculateBlockPosition");$rt=o(t=>{let e=0,r=0;for(let n of t.children){let{width:i,height:a,x:s,y:l}=n.size??{width:0,height:0,x:0,y:0};X.debug("getMaxChildSize abc95 child:",n.id,"width:",i,"height:",a,"x:",s,"y:",l,n.type),n.type!=="space"&&(i>e&&(e=i/(t.widthInColumns??1)),a>r&&(r=a))}return{width:e,height:r}},"getMaxChildSize");o(FF,"setBlockSizes");o(Uve,"layoutBlocks");o(Hve,"findBounds");o(Wve,"layout")});function Yve(t,e){e&&t.attr("style",e)}function zrt(t){let e=Ge(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),n=t.label,i=t.isNode?"nodeLabel":"edgeLabel",a=r.append("span");return a.html(n),Yve(a,t.labelStyle),a.attr("class",i),Yve(r,t.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}var Grt,ks,wC=N(()=>{"use strict";fr();yt();Gt();pr();er();ao();o(Yve,"applyStyle");o(zrt,"addHtmlLabel");Grt=o(async(t,e,r,n)=>{let i=t||"";if(typeof i=="object"&&(i=i[0]),dr(me().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"
    "),X.debug("vertexText"+i);let a=await dL(na(i)),s={isNode:n,label:a,labelStyle:e.replace("fill:","color:")};return zrt(s)}else{let a=document.createElementNS("http://www.w3.org/2000/svg","text");a.setAttribute("style",e.replace("color:","fill:"));let s=[];typeof i=="string"?s=i.split(/\\n|\n|/gi):Array.isArray(i)?s=i:s=[];for(let l of s){let u=document.createElementNS("http://www.w3.org/2000/svg","tspan");u.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),u.setAttribute("dy","1em"),u.setAttribute("x","0"),r?u.setAttribute("class","title-row"):u.setAttribute("class","row"),u.textContent=l.trim(),a.appendChild(u)}return a}},"createLabel"),ks=Grt});var jve,Vrt,Xve,Kve=N(()=>{"use strict";yt();jve=o((t,e,r,n,i)=>{e.arrowTypeStart&&Xve(t,"start",e.arrowTypeStart,r,n,i),e.arrowTypeEnd&&Xve(t,"end",e.arrowTypeEnd,r,n,i)},"addEdgeMarkers"),Vrt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},Xve=o((t,e,r,n,i,a)=>{let s=Vrt[r];if(!s){X.warn(`Unknown arrow type: ${r}`);return}let l=e==="start"?"Start":"End";t.attr(`marker-${e}`,`url(${n}#${i}_${a}-${s}${l})`)},"addEdgeMarker")});function kC(t,e){me().flowchart.htmlLabels&&t&&(t.style.width=e.length*9+"px",t.style.height="12px")}var $F,Xa,Zve,Jve,Urt,Hrt,Qve,e2e,t2e=N(()=>{"use strict";yt();wC();ao();fr();Gt();er();pr();PL();R2();Kve();$F={},Xa={},Zve=o(async(t,e)=>{let r=me(),n=dr(r.flowchart.htmlLabels),i=e.labelType==="markdown"?qn(t,e.label,{style:e.labelStyle,useHtmlLabels:n,addSvgBackground:!0},r):await ks(e.label,e.labelStyle),a=t.insert("g").attr("class","edgeLabel"),s=a.insert("g").attr("class","label");s.node().appendChild(i);let l=i.getBBox();if(n){let h=i.children[0],f=Ge(i);l=h.getBoundingClientRect(),f.attr("width",l.width),f.attr("height",l.height)}s.attr("transform","translate("+-l.width/2+", "+-l.height/2+")"),$F[e.id]=a,e.width=l.width,e.height=l.height;let u;if(e.startLabelLeft){let h=await ks(e.startLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].startLeft=f,kC(u,e.startLabelLeft)}if(e.startLabelRight){let h=await ks(e.startLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=f.node().appendChild(h),d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].startRight=f,kC(u,e.startLabelRight)}if(e.endLabelLeft){let h=await ks(e.endLabelLeft,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].endLeft=f,kC(u,e.endLabelLeft)}if(e.endLabelRight){let h=await ks(e.endLabelRight,e.labelStyle),f=t.insert("g").attr("class","edgeTerminals"),d=f.insert("g").attr("class","inner");u=d.node().appendChild(h);let p=h.getBBox();d.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),f.node().appendChild(h),Xa[e.id]||(Xa[e.id]={}),Xa[e.id].endRight=f,kC(u,e.endLabelRight)}return i},"insertEdgeLabel");o(kC,"setTerminalWidth");Jve=o((t,e)=>{X.debug("Moving label abc88 ",t.id,t.label,$F[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath,n=me(),{subGraphTitleTotalMargin:i}=Bu(n);if(t.label){let a=$F[t.id],s=t.x,l=t.y;if(r){let u=Vt.calcLabelPosition(r);X.debug("Moving label "+t.label+" from (",s,",",l,") to (",u.x,",",u.y,") abc88"),e.updatedPath&&(s=u.x,l=u.y)}a.attr("transform",`translate(${s}, ${l+i/2})`)}if(t.startLabelLeft){let a=Xa[t.id].startLeft,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.startLabelRight){let a=Xa[t.id].startRight,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelLeft){let a=Xa[t.id].endLeft,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}if(t.endLabelRight){let a=Xa[t.id].endRight,s=t.x,l=t.y;if(r){let u=Vt.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);s=u.x,l=u.y}a.attr("transform",`translate(${s}, ${l})`)}},"positionEdgeLabel"),Urt=o((t,e)=>{let r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),s=t.width/2,l=t.height/2;return i>=s||a>=l},"outsideNode"),Hrt=o((t,e,r)=>{X.debug(`intersection calc abc89: - outsidePoint: ${JSON.stringify(e)} - insidePoint : ${JSON.stringify(r)} - node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);let n=t.x,i=t.y,a=Math.abs(n-r.x),s=t.width/2,l=r.xMath.abs(n-e.x)*u){let d=r.y{X.debug("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(a=>{if(!Urt(e,a)&&!i){let s=Hrt(e,n,a),l=!1;r.forEach(u=>{l=l||u.x===s.x&&u.y===s.y}),r.some(u=>u.x===s.x&&u.y===s.y)||r.push(s),i=!0}else n=a,i||r.push(a)}),r},"cutPathAtIntersect"),e2e=o(function(t,e,r,n,i,a,s){let l=r.points;X.debug("abc88 InsertEdge: edge=",r,"e=",e);let u=!1,h=a.node(e.v);var f=a.node(e.w);f?.intersect&&h?.intersect&&(l=l.slice(1,r.points.length-1),l.unshift(h.intersect(l[0])),l.push(f.intersect(l[l.length-1]))),r.toCluster&&(X.debug("to cluster abc88",n[r.toCluster]),l=Qve(r.points,n[r.toCluster].node),u=!0),r.fromCluster&&(X.debug("from cluster abc88",n[r.fromCluster]),l=Qve(l.reverse(),n[r.fromCluster].node).reverse(),u=!0);let d=l.filter(S=>!Number.isNaN(S.y)),p=No;r.curve&&(i==="graph"||i==="flowchart")&&(p=r.curve);let{x:m,y:g}=ow(r),y=Cl().x(m).y(g).curve(p),v;switch(r.thickness){case"normal":v="edge-thickness-normal";break;case"thick":v="edge-thickness-thick";break;case"invisible":v="edge-thickness-thick";break;default:v=""}switch(r.pattern){case"solid":v+=" edge-pattern-solid";break;case"dotted":v+=" edge-pattern-dotted";break;case"dashed":v+=" edge-pattern-dashed";break}let x=t.append("path").attr("d",y(d)).attr("id",r.id).attr("class"," "+v+(r.classes?" "+r.classes:"")).attr("style",r.style),b="";(me().flowchart.arrowMarkerAbsolute||me().state.arrowMarkerAbsolute)&&(b=mu(!0)),jve(x,r,b,s,i);let T={};return u&&(T.updatedPath=l),T.originalPath=r.points,T},"insertEdge")});var Wrt,r2e,n2e=N(()=>{"use strict";Wrt=o(t=>{let e=new Set;for(let r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r);break}return e},"expandAndDeduplicateDirections"),r2e=o((t,e,r)=>{let n=Wrt(t),i=2,a=e.height+2*r.padding,s=a/i,l=e.width+2*s+r.padding,u=r.padding/2;return n.has("right")&&n.has("left")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:s,y:0},{x:l/2,y:2*u},{x:l-s,y:0},{x:l,y:0},{x:l,y:-a/3},{x:l+2*u,y:-a/2},{x:l,y:-2*a/3},{x:l,y:-a},{x:l-s,y:-a},{x:l/2,y:-a-2*u},{x:s,y:-a},{x:0,y:-a},{x:0,y:-2*a/3},{x:-2*u,y:-a/2},{x:0,y:-a/3}]:n.has("right")&&n.has("left")&&n.has("up")?[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}]:n.has("right")&&n.has("left")&&n.has("down")?[{x:0,y:0},{x:s,y:-a},{x:l-s,y:-a},{x:l,y:0}]:n.has("right")&&n.has("up")&&n.has("down")?[{x:0,y:0},{x:l,y:-s},{x:l,y:-a+s},{x:0,y:-a}]:n.has("left")&&n.has("up")&&n.has("down")?[{x:l,y:0},{x:0,y:-s},{x:0,y:-a+s},{x:l,y:-a}]:n.has("right")&&n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")&&n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:n.has("right")&&n.has("up")?[{x:0,y:0},{x:l,y:-s},{x:0,y:-a}]:n.has("right")&&n.has("down")?[{x:0,y:0},{x:l,y:0},{x:0,y:-a}]:n.has("left")&&n.has("up")?[{x:l,y:0},{x:0,y:-s},{x:l,y:-a}]:n.has("left")&&n.has("down")?[{x:l,y:0},{x:0,y:0},{x:l,y:-a}]:n.has("right")?[{x:s,y:-u},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a+u}]:n.has("left")?[{x:s,y:0},{x:s,y:-u},{x:l-s,y:-u},{x:l-s,y:-a+u},{x:s,y:-a+u},{x:s,y:-a},{x:0,y:-a/2}]:n.has("up")?[{x:s,y:-u},{x:s,y:-a+u},{x:0,y:-a+u},{x:l/2,y:-a},{x:l,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u}]:n.has("down")?[{x:l/2,y:0},{x:0,y:-u},{x:s,y:-u},{x:s,y:-a+u},{x:l-s,y:-a+u},{x:l-s,y:-u},{x:l,y:-u}]:[{x:0,y:0}]},"getArrowPoints")});function qrt(t,e){return t.intersect(e)}var i2e,a2e=N(()=>{"use strict";o(qrt,"intersectNode");i2e=qrt});function Yrt(t,e,r,n){var i=t.x,a=t.y,s=i-n.x,l=a-n.y,u=Math.sqrt(e*e*l*l+r*r*s*s),h=Math.abs(e*r*s/u);n.x{"use strict";o(Yrt,"intersectEllipse");EC=Yrt});function Xrt(t,e,r){return EC(t,e,e,r)}var s2e,o2e=N(()=>{"use strict";zF();o(Xrt,"intersectCircle");s2e=Xrt});function jrt(t,e,r,n){var i,a,s,l,u,h,f,d,p,m,g,y,v,x,b;if(i=e.y-t.y,s=t.x-e.x,u=e.x*t.y-t.x*e.y,p=i*r.x+s*r.y+u,m=i*n.x+s*n.y+u,!(p!==0&&m!==0&&l2e(p,m))&&(a=n.y-r.y,l=r.x-n.x,h=n.x*r.y-r.x*n.y,f=a*t.x+l*t.y+h,d=a*e.x+l*e.y+h,!(f!==0&&d!==0&&l2e(f,d))&&(g=i*l-a*s,g!==0)))return y=Math.abs(g/2),v=s*h-l*u,x=v<0?(v-y)/g:(v+y)/g,v=a*u-i*h,b=v<0?(v-y)/g:(v+y)/g,{x,y:b}}function l2e(t,e){return t*e>0}var c2e,u2e=N(()=>{"use strict";o(jrt,"intersectLine");o(l2e,"sameSign");c2e=jrt});function Krt(t,e,r){var n=t.x,i=t.y,a=[],s=Number.POSITIVE_INFINITY,l=Number.POSITIVE_INFINITY;typeof e.forEach=="function"?e.forEach(function(g){s=Math.min(s,g.x),l=Math.min(l,g.y)}):(s=Math.min(s,e.x),l=Math.min(l,e.y));for(var u=n-t.width/2-s,h=i-t.height/2-l,f=0;f1&&a.sort(function(g,y){var v=g.x-r.x,x=g.y-r.y,b=Math.sqrt(v*v+x*x),T=y.x-r.x,S=y.y-r.y,w=Math.sqrt(T*T+S*S);return b{"use strict";u2e();h2e=Krt;o(Krt,"intersectPolygon")});var Qrt,d2e,p2e=N(()=>{"use strict";Qrt=o((t,e)=>{var r=t.x,n=t.y,i=e.x-r,a=e.y-n,s=t.width/2,l=t.height/2,u,h;return Math.abs(a)*s>Math.abs(i)*l?(a<0&&(l=-l),u=a===0?0:l*i/a,h=l):(i<0&&(s=-s),u=s,h=i===0?0:s*a/i),{x:r+u,y:n+h}},"intersectRect"),d2e=Qrt});var In,GF=N(()=>{"use strict";a2e();o2e();zF();f2e();p2e();In={node:i2e,circle:s2e,ellipse:EC,polygon:h2e,rect:d2e}});function Xl(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(i){return i.x+","+i.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}var Ni,Jn,VF=N(()=>{"use strict";wC();ao();Gt();fr();pr();er();Ni=o(async(t,e,r,n)=>{let i=me(),a,s=e.useHtmlLabels||dr(i.flowchart.htmlLabels);r?a=r:a="node default";let l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),u=l.insert("g").attr("class","label").attr("style",e.labelStyle),h;e.labelText===void 0?h="":h=typeof e.labelText=="string"?e.labelText:e.labelText[0];let f=u.node(),d;e.labelType==="markdown"?d=qn(u,wr(na(h),i),{useHtmlLabels:s,width:e.width||i.flowchart.wrappingWidth,classes:"markdown-node-label"},i):d=f.appendChild(await ks(wr(na(h),i),e.labelStyle,!1,n));let p=d.getBBox(),m=e.padding/2;if(dr(i.flowchart.htmlLabels)){let g=d.children[0],y=Ge(d),v=g.getElementsByTagName("img");if(v){let x=h.replace(/]*>/g,"").trim()==="";await Promise.all([...v].map(b=>new Promise(T=>{function S(){if(b.style.display="flex",b.style.flexDirection="column",x){let w=i.fontSize?i.fontSize:window.getComputedStyle(document.body).fontSize,_=parseInt(w,10)*5+"px";b.style.minWidth=_,b.style.maxWidth=_}else b.style.width="100%";T(b)}o(S,"setupImage"),setTimeout(()=>{b.complete&&S()}),b.addEventListener("error",S),b.addEventListener("load",S)})))}p=g.getBoundingClientRect(),y.attr("width",p.width),y.attr("height",p.height)}return s?u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):u.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&u.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),u.insert("rect",":first-child"),{shapeSvg:l,bbox:p,halfPadding:m,label:u}},"labelHelper"),Jn=o((t,e)=>{let r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");o(Xl,"insertPolygonShape")});var Zrt,m2e,g2e=N(()=>{"use strict";VF();yt();Gt();GF();Zrt=o(async(t,e)=>{e.useHtmlLabels||me().flowchart.htmlLabels||(e.centerLabel=!0);let{shapeSvg:n,bbox:i,halfPadding:a}=await Ni(t,e,"node "+e.classes,!0);X.info("Classes = ",e.classes);let s=n.insert("rect",":first-child");return s.attr("rx",e.rx).attr("ry",e.ry).attr("x",-i.width/2-a).attr("y",-i.height/2-a).attr("width",i.width+e.padding).attr("height",i.height+e.padding),Jn(e,s),e.intersect=function(l){return In.rect(e,l)},n},"note"),m2e=Zrt});function UF(t,e,r,n){let i=[],a=o(l=>{i.push(l,0)},"addBorder"),s=o(l=>{i.push(0,l)},"skipBorder");e.includes("t")?(X.debug("add top border"),a(r)):s(r),e.includes("r")?(X.debug("add right border"),a(n)):s(n),e.includes("b")?(X.debug("add bottom border"),a(r)):s(r),e.includes("l")?(X.debug("add left border"),a(n)):s(n),t.attr("stroke-dasharray",i.join(" "))}var y2e,bo,v2e,Jrt,ent,tnt,rnt,nnt,int,ant,snt,ont,lnt,cnt,unt,hnt,fnt,dnt,pnt,mnt,gnt,ynt,x2e,vnt,xnt,b2e,SC,HF,T2e,w2e=N(()=>{"use strict";fr();Gt();pr();yt();n2e();wC();GF();g2e();VF();y2e=o(t=>t?" "+t:"","formatClass"),bo=o((t,e)=>`${e||"node default"}${y2e(t.classes)} ${y2e(t.class)}`,"getClassesFromNode"),v2e=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=i+a,l=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];X.info("Question main (Circle)");let u=Xl(r,s,s,l);return u.attr("style",e.style),Jn(e,u),e.intersect=function(h){return X.warn("Intersect called"),In.polygon(e,l,h)},r},"question"),Jrt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=28,i=[{x:0,y:n/2},{x:n/2,y:0},{x:0,y:-n/2},{x:-n/2,y:0}];return r.insert("polygon",":first-child").attr("points",i.map(function(s){return s.x+","+s.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(s){return In.circle(e,14,s)},r},"choice"),ent=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=4,a=n.height+e.padding,s=a/i,l=n.width+2*s+e.padding,u=[{x:s,y:0},{x:l-s,y:0},{x:l,y:-a/2},{x:l-s,y:-a},{x:s,y:-a},{x:0,y:-a/2}],h=Xl(r,l,a,u);return h.attr("style",e.style),Jn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"hexagon"),tnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,void 0,!0),i=2,a=n.height+2*e.padding,s=a/i,l=n.width+2*s+e.padding,u=r2e(e.directions,n,e),h=Xl(r,l,a,u);return h.attr("style",e.style),Jn(e,h),e.intersect=function(f){return In.polygon(e,u,f)},r},"block_arrow"),rnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-a/2,y:0},{x:i,y:0},{x:i,y:-a},{x:-a/2,y:-a},{x:0,y:-a/2}];return Xl(r,i,a,s).attr("style",e.style),e.width=i+a,e.height=a,e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_left_inv_arrow"),nnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:a/6,y:-a}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_right"),int=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:2*a/6,y:0},{x:i+a/6,y:0},{x:i-2*a/6,y:-a},{x:-a/6,y:-a}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"lean_left"),ant=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:-2*a/6,y:0},{x:i+2*a/6,y:0},{x:i-a/6,y:-a},{x:a/6,y:-a}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"trapezoid"),snt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:a/6,y:0},{x:i-a/6,y:0},{x:i+2*a/6,y:-a},{x:-2*a/6,y:-a}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"inv_trapezoid"),ont=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i+a/2,y:0},{x:i,y:-a/2},{x:i+a/2,y:-a},{x:0,y:-a}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"rect_right_inv_arrow"),lnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=i/2,s=a/(2.5+i/50),l=n.height+s+e.padding,u="M 0,"+s+" a "+a+","+s+" 0,0,0 "+i+" 0 a "+a+","+s+" 0,0,0 "+-i+" 0 l 0,"+l+" a "+a+","+s+" 0,0,0 "+i+" 0 l 0,"+-l,h=r.attr("label-offset-y",s).insert("path",":first-child").attr("style",e.style).attr("d",u).attr("transform","translate("+-i/2+","+-(l/2+s)+")");return Jn(e,h),e.intersect=function(f){let d=In.rect(e,f),p=d.x-e.x;if(a!=0&&(Math.abs(p)e.height/2-s)){let m=s*s*(1-p*p/(a*a));m!=0&&(m=Math.sqrt(m)),m=s-m,f.y-e.y>0&&(m=-m),d.y+=m}return d},r},"cylinder"),cnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ni(t,e,"node "+e.classes+" "+e.class,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(UF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return Jn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"rect"),unt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ni(t,e,"node "+e.classes,!0),a=r.insert("rect",":first-child"),s=e.positioned?e.width:n.width+e.padding,l=e.positioned?e.height:n.height+e.padding,u=e.positioned?-s/2:-n.width/2-i,h=e.positioned?-l/2:-n.height/2-i;if(a.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",u).attr("y",h).attr("width",s).attr("height",l),e.props){let f=new Set(Object.keys(e.props));e.props.borders&&(UF(a,e.props.borders,s,l),f.delete("borders")),f.forEach(d=>{X.warn(`Unknown node property ${d}`)})}return Jn(e,a),e.intersect=function(f){return In.rect(e,f)},r},"composite"),hnt=o(async(t,e)=>{let{shapeSvg:r}=await Ni(t,e,"label",!0);X.trace("Classes = ",e.class);let n=r.insert("rect",":first-child"),i=0,a=0;if(n.attr("width",i).attr("height",a),r.attr("class","label edgeLabel"),e.props){let s=new Set(Object.keys(e.props));e.props.borders&&(UF(n,e.props.borders,i,a),s.delete("borders")),s.forEach(l=>{X.warn(`Unknown node property ${l}`)})}return Jn(e,n),e.intersect=function(s){return In.rect(e,s)},r},"labelRect");o(UF,"applyNodePropertyBorders");fnt=o(async(t,e)=>{let r;e.classes?r="node "+e.classes:r="node default";let n=t.insert("g").attr("class",r).attr("id",e.domId||e.id),i=n.insert("rect",":first-child"),a=n.insert("line"),s=n.insert("g").attr("class","label"),l=e.labelText.flat?e.labelText.flat():e.labelText,u="";typeof l=="object"?u=l[0]:u=l,X.info("Label text abc79",u,l,typeof l=="object");let h=s.node().appendChild(await ks(u,e.labelStyle,!0,!0)),f={width:0,height:0};if(dr(me().flowchart.htmlLabels)){let y=h.children[0],v=Ge(h);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}X.info("Text 2",l);let d=l.slice(1,l.length),p=h.getBBox(),m=s.node().appendChild(await ks(d.join?d.join("
    "):d,e.labelStyle,!0,!0));if(dr(me().flowchart.htmlLabels)){let y=m.children[0],v=Ge(m);f=y.getBoundingClientRect(),v.attr("width",f.width),v.attr("height",f.height)}let g=e.padding/2;return Ge(m).attr("transform","translate( "+(f.width>p.width?0:(p.width-f.width)/2)+", "+(p.height+g+5)+")"),Ge(h).attr("transform","translate( "+(f.width{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.height+e.padding,a=n.width+i/4+e.padding,s=r.insert("rect",":first-child").attr("style",e.style).attr("rx",i/2).attr("ry",i/2).attr("x",-a/2).attr("y",-i/2).attr("width",a).attr("height",i);return Jn(e,s),e.intersect=function(l){return In.rect(e,l)},r},"stadium"),pnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ni(t,e,bo(e,void 0),!0),a=r.insert("circle",":first-child");return a.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("Circle main"),Jn(e,a),e.intersect=function(s){return X.info("Circle intersect",e,n.width/2+i,s),In.circle(e,n.width/2+i,s)},r},"circle"),mnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n,halfPadding:i}=await Ni(t,e,bo(e,void 0),!0),a=5,s=r.insert("g",":first-child"),l=s.insert("circle"),u=s.insert("circle");return s.attr("class",e.class),l.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i+a).attr("width",n.width+e.padding+a*2).attr("height",n.height+e.padding+a*2),u.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",n.width/2+i).attr("width",n.width+e.padding).attr("height",n.height+e.padding),X.info("DoubleCircle main"),Jn(e,l),e.intersect=function(h){return X.info("DoubleCircle intersect",e,n.width/2+i+a,h),In.circle(e,n.width/2+i+a,h)},r},"doublecircle"),gnt=o(async(t,e)=>{let{shapeSvg:r,bbox:n}=await Ni(t,e,bo(e,void 0),!0),i=n.width+e.padding,a=n.height+e.padding,s=[{x:0,y:0},{x:i,y:0},{x:i,y:-a},{x:0,y:-a},{x:0,y:0},{x:-8,y:0},{x:i+8,y:0},{x:i+8,y:-a},{x:-8,y:-a},{x:-8,y:0}],l=Xl(r,i,a,s);return l.attr("style",e.style),Jn(e,l),e.intersect=function(u){return In.polygon(e,s,u)},r},"subroutine"),ynt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child");return n.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),Jn(e,n),e.intersect=function(i){return In.circle(e,7,i)},r},"start"),x2e=o((t,e,r)=>{let n=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),i=70,a=10;r==="LR"&&(i=10,a=70);let s=n.append("rect").attr("x",-1*i/2).attr("y",-1*a/2).attr("width",i).attr("height",a).attr("class","fork-join");return Jn(e,s),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(l){return In.rect(e,l)},n},"forkJoin"),vnt=o((t,e)=>{let r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),n=r.insert("circle",":first-child"),i=r.insert("circle",":first-child");return i.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),n.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),Jn(e,i),e.intersect=function(a){return In.circle(e,7,a)},r},"end"),xnt=o(async(t,e)=>{let r=e.padding/2,n=4,i=8,a;e.classes?a="node "+e.classes:a="node default";let s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),l=s.insert("rect",":first-child"),u=s.insert("line"),h=s.insert("line"),f=0,d=n,p=s.insert("g").attr("class","label"),m=0,g=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xAB"+e.classData.annotations[0]+"\xBB":"",v=p.node().appendChild(await ks(y,e.labelStyle,!0,!0)),x=v.getBBox();if(dr(me().flowchart.htmlLabels)){let C=v.children[0],D=Ge(v);x=C.getBoundingClientRect(),D.attr("width",x.width),D.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+n,f+=x.width);let b=e.classData.label;e.classData.type!==void 0&&e.classData.type!==""&&(me().flowchart.htmlLabels?b+="<"+e.classData.type+">":b+="<"+e.classData.type+">");let T=p.node().appendChild(await ks(b,e.labelStyle,!0,!0));Ge(T).attr("class","classTitle");let S=T.getBBox();if(dr(me().flowchart.htmlLabels)){let C=T.children[0],D=Ge(T);S=C.getBoundingClientRect(),D.attr("width",S.width),D.attr("height",S.height)}d+=S.height+n,S.width>f&&(f=S.width);let w=[];e.classData.members.forEach(async C=>{let D=C.getDisplayDetails(),O=D.displayText;me().flowchart.htmlLabels&&(O=O.replace(//g,">"));let R=p.node().appendChild(await ks(O,D.cssStyle?D.cssStyle:e.labelStyle,!0,!0)),k=R.getBBox();if(dr(me().flowchart.htmlLabels)){let L=R.children[0],A=Ge(R);k=L.getBoundingClientRect(),A.attr("width",k.width),A.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,w.push(R)}),d+=i;let E=[];if(e.classData.methods.forEach(async C=>{let D=C.getDisplayDetails(),O=D.displayText;me().flowchart.htmlLabels&&(O=O.replace(//g,">"));let R=p.node().appendChild(await ks(O,D.cssStyle?D.cssStyle:e.labelStyle,!0,!0)),k=R.getBBox();if(dr(me().flowchart.htmlLabels)){let L=R.children[0],A=Ge(R);k=L.getBoundingClientRect(),A.attr("width",k.width),A.attr("height",k.height)}k.width>f&&(f=k.width),d+=k.height+n,E.push(R)}),d+=i,g){let C=(f-x.width)/2;Ge(v).attr("transform","translate( "+(-1*f/2+C)+", "+-1*d/2+")"),m=x.height+n}let _=(f-S.width)/2;return Ge(T).attr("transform","translate( "+(-1*f/2+_)+", "+(-1*d/2+m)+")"),m+=S.height+n,u.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,w.forEach(C=>{Ge(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m+i/2)+")");let D=C?.getBBox();m+=(D?.height??0)+n}),m+=i,h.attr("class","divider").attr("x1",-f/2-r).attr("x2",f/2+r).attr("y1",-d/2-r+i+m).attr("y2",-d/2-r+i+m),m+=i,E.forEach(C=>{Ge(C).attr("transform","translate( "+-f/2+", "+(-1*d/2+m)+")");let D=C?.getBBox();m+=(D?.height??0)+n}),l.attr("style",e.style).attr("class","outer title-state").attr("x",-f/2-r).attr("y",-(d/2)-r).attr("width",f+e.padding).attr("height",d+e.padding),Jn(e,l),e.intersect=function(C){return In.rect(e,C)},s},"class_box"),b2e={rhombus:v2e,composite:unt,question:v2e,rect:cnt,labelRect:hnt,rectWithTitle:fnt,choice:Jrt,circle:pnt,doublecircle:mnt,stadium:dnt,hexagon:ent,block_arrow:tnt,rect_left_inv_arrow:rnt,lean_right:nnt,lean_left:int,trapezoid:ant,inv_trapezoid:snt,rect_right_inv_arrow:ont,cylinder:lnt,start:ynt,end:vnt,note:m2e,subroutine:gnt,fork:x2e,join:x2e,class_box:xnt},SC={},HF=o(async(t,e,r)=>{let n,i;if(e.link){let a;me().securityLevel==="sandbox"?a="_top":e.linkTarget&&(a=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",a),i=await b2e[e.shape](n,e,r)}else i=await b2e[e.shape](t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),e.class&&i.attr("class","node default "+e.class),SC[e.id]=n,e.haveCallback&&SC[e.id].attr("class",SC[e.id].attr("class")+" clickable"),n},"insertNode"),T2e=o(t=>{let e=SC[t.id];X.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");let r=8,n=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+n-t.width/2)+", "+(t.y-t.height/2-r)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),n},"positionNode")});function k2e(t,e,r=!1){let n=t,i="default";(n?.classes?.length||0)>0&&(i=(n?.classes??[]).join(" ")),i=i+" flowchart-label";let a=0,s="",l;switch(n.type){case"round":a=5,s="rect";break;case"composite":a=0,s="composite",l=0;break;case"square":s="rect";break;case"diamond":s="question";break;case"hexagon":s="hexagon";break;case"block_arrow":s="block_arrow";break;case"odd":s="rect_left_inv_arrow";break;case"lean_right":s="lean_right";break;case"lean_left":s="lean_left";break;case"trapezoid":s="trapezoid";break;case"inv_trapezoid":s="inv_trapezoid";break;case"rect_left_inv_arrow":s="rect_left_inv_arrow";break;case"circle":s="circle";break;case"ellipse":s="ellipse";break;case"stadium":s="stadium";break;case"subroutine":s="subroutine";break;case"cylinder":s="cylinder";break;case"group":s="rect";break;case"doublecircle":s="doublecircle";break;default:s="rect"}let u=D9(n?.styles??[]),h=n.label,f=n.size??{width:0,height:0,x:0,y:0};return{labelStyle:u.labelStyle,shape:s,labelText:h,rx:a,ry:a,class:i,style:u.style,id:n.id,directions:n.directions,width:f.width,height:f.height,x:f.x,y:f.y,positioned:r,intersect:void 0,type:n.type,padding:l??tr()?.block?.padding??0}}async function bnt(t,e,r){let n=k2e(e,r,!1);if(n.type==="group")return;let i=tr(),a=await HF(t,n,{config:i}),s=a.node().getBBox(),l=r.getBlock(n.id);l.size={width:s.width,height:s.height,x:0,y:0,node:a},r.setBlock(l),a.remove()}async function Tnt(t,e,r){let n=k2e(e,r,!0);if(r.getBlock(n.id).type!=="space"){let a=tr();await HF(t,n,{config:a}),e.intersect=n?.intersect,T2e(n)}}async function WF(t,e,r,n){for(let i of e)await n(t,i,r),i.children&&await WF(t,i.children,r,n)}async function E2e(t,e,r){await WF(t,e,r,bnt)}async function S2e(t,e,r){await WF(t,e,r,Tnt)}async function C2e(t,e,r,n,i){let a=new sn({multigraph:!0,compound:!0});a.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(let s of r)s.size&&a.setNode(s.id,{width:s.size.width,height:s.size.height,intersect:s.intersect});for(let s of e)if(s.start&&s.end){let l=n.getBlock(s.start),u=n.getBlock(s.end);if(l?.size&&u?.size){let h=l.size,f=u.size,d=[{x:h.x,y:h.y},{x:h.x+(f.x-h.x)/2,y:h.y+(f.y-h.y)/2},{x:f.x,y:f.y}];e2e(t,{v:s.start,w:s.end,name:s.id},{...s,arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",a,i),s.label&&(await Zve(t,{...s,label:s.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:s.arrowTypeEnd,arrowTypeStart:s.arrowTypeStart,points:d,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),Jve({...s,x:d[1].x,y:d[1].y},{originalPath:d}))}}}var A2e=N(()=>{"use strict";Wo();mi();t2e();w2e();er();o(k2e,"getNodeFromBlock");o(bnt,"calculateBlockSize");o(Tnt,"insertBlockPositioned");o(WF,"performOperations");o(E2e,"calculateBlockSizes");o(S2e,"insertBlocks");o(C2e,"insertEdges")});var wnt,knt,_2e,D2e=N(()=>{"use strict";fr();mi();Vve();yt();xi();qve();A2e();wnt=o(function(t,e){return e.db.getClasses()},"getClasses"),knt=o(async function(t,e,r,n){let{securityLevel:i,block:a}=tr(),s=n.db,l;i==="sandbox"&&(l=Ge("#i"+e));let u=i==="sandbox"?Ge(l.nodes()[0].contentDocument.body):Ge("body"),h=i==="sandbox"?u.select(`[id="${e}"]`):Ge(`[id="${e}"]`);Gve(h,["point","circle","cross"],n.type,e);let d=s.getBlocks(),p=s.getBlocksFlat(),m=s.getEdges(),g=h.insert("g").attr("class","block");await E2e(g,d,s);let y=Wve(s);if(await S2e(g,d,s),await C2e(g,m,p,s,e),y){let v=y,x=Math.max(1,Math.round(.125*(v.width/v.height))),b=v.height+x+10,T=v.width+10,{useMaxWidth:S}=a;fn(h,b,T,!!S),X.debug("Here Bounds",y,v),h.attr("viewBox",`${v.x-5} ${v.y-5} ${v.width+10} ${v.height+10}`)}},"draw"),_2e={draw:knt,getClasses:wnt}});var L2e={};ur(L2e,{diagram:()=>Ent});var Ent,R2e=N(()=>{"use strict";Rve();Fve();zve();D2e();Ent={parser:Lve,db:Bve,renderer:_2e,styles:$ve}});var qF,YF,D4,I2e,XF,ja,ru,L4,O2e,_nt,R4,P2e,B2e,F2e,$2e,z2e,CC,Yf,AC=N(()=>{"use strict";qF={L:"left",R:"right",T:"top",B:"bottom"},YF={L:o(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:o(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:o(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:o(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},D4={L:o((t,e)=>t-e+2,"L"),R:o((t,e)=>t-2,"R"),T:o((t,e)=>t-e+2,"T"),B:o((t,e)=>t-2,"B")},I2e=o(function(t){return ja(t)?t==="L"?"R":"L":t==="T"?"B":"T"},"getOppositeArchitectureDirection"),XF=o(function(t){let e=t;return e==="L"||e==="R"||e==="T"||e==="B"},"isArchitectureDirection"),ja=o(function(t){let e=t;return e==="L"||e==="R"},"isArchitectureDirectionX"),ru=o(function(t){let e=t;return e==="T"||e==="B"},"isArchitectureDirectionY"),L4=o(function(t,e){let r=ja(t)&&ru(e),n=ru(t)&&ja(e);return r||n},"isArchitectureDirectionXY"),O2e=o(function(t){let e=t[0],r=t[1],n=ja(e)&&ru(r),i=ru(e)&&ja(r);return n||i},"isArchitecturePairXY"),_nt=o(function(t){return t!=="LL"&&t!=="RR"&&t!=="TT"&&t!=="BB"},"isValidArchitectureDirectionPair"),R4=o(function(t,e){let r=`${t}${e}`;return _nt(r)?r:void 0},"getArchitectureDirectionPair"),P2e=o(function([t,e],r){let n=r[0],i=r[1];return ja(n)?ru(i)?[t+(n==="L"?-1:1),e+(i==="T"?1:-1)]:[t+(n==="L"?-1:1),e]:ja(i)?[t+(i==="L"?1:-1),e+(n==="T"?1:-1)]:[t,e+(n==="T"?1:-1)]},"shiftPositionByArchitectureDirectionPair"),B2e=o(function(t){return t==="LT"||t==="TL"?[1,1]:t==="BL"||t==="LB"?[1,-1]:t==="BR"||t==="RB"?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),F2e=o(function(t,e){return L4(t,e)?"bend":ja(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),$2e=o(function(t){return t.type==="service"},"isArchitectureService"),z2e=o(function(t){return t.type==="junction"},"isArchitectureJunction"),CC=o(t=>t.data(),"edgeData"),Yf=o(t=>t.data(),"nodeData")});function Mi(t){return V2e()[t]}var G2e,vr,Dnt,Lnt,Rnt,Nnt,Mnt,Int,jF,Ont,Pnt,Bnt,Fnt,$nt,znt,Gnt,V2e,o0,N4=N(()=>{"use strict";_a();mi();SS();ci();AC();er();G2e=or.architecture,vr=new Tf(()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:G2e,dataStructures:void 0,elements:{}})),Dnt=o(()=>{vr.reset(),kr()},"clear"),Lnt=o(function({id:t,icon:e,in:r,title:n,iconText:i}){if(vr.records.registeredIds[t]!==void 0)throw new Error(`The service id [${t}] is already in use by another ${vr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The service [${t}] cannot be placed within itself`);if(vr.records.registeredIds[r]===void 0)throw new Error(`The service [${t}]'s parent does not exist. Please make sure the parent is created before this service`);if(vr.records.registeredIds[r]==="node")throw new Error(`The service [${t}]'s parent is not a group`)}vr.records.registeredIds[t]="node",vr.records.nodes[t]={id:t,type:"service",icon:e,iconText:i,title:n,edges:[],in:r}},"addService"),Rnt=o(()=>Object.values(vr.records.nodes).filter($2e),"getServices"),Nnt=o(function({id:t,in:e}){vr.records.registeredIds[t]="node",vr.records.nodes[t]={id:t,type:"junction",edges:[],in:e}},"addJunction"),Mnt=o(()=>Object.values(vr.records.nodes).filter(z2e),"getJunctions"),Int=o(()=>Object.values(vr.records.nodes),"getNodes"),jF=o(t=>vr.records.nodes[t],"getNode"),Ont=o(function({id:t,icon:e,in:r,title:n}){if(vr.records.registeredIds[t]!==void 0)throw new Error(`The group id [${t}] is already in use by another ${vr.records.registeredIds[t]}`);if(r!==void 0){if(t===r)throw new Error(`The group [${t}] cannot be placed within itself`);if(vr.records.registeredIds[r]===void 0)throw new Error(`The group [${t}]'s parent does not exist. Please make sure the parent is created before this group`);if(vr.records.registeredIds[r]==="node")throw new Error(`The group [${t}]'s parent is not a group`)}vr.records.registeredIds[t]="group",vr.records.groups[t]={id:t,icon:e,title:n,in:r}},"addGroup"),Pnt=o(()=>Object.values(vr.records.groups),"getGroups"),Bnt=o(function({lhsId:t,rhsId:e,lhsDir:r,rhsDir:n,lhsInto:i,rhsInto:a,lhsGroup:s,rhsGroup:l,title:u}){if(!XF(r))throw new Error(`Invalid direction given for left hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${r}`);if(!XF(n))throw new Error(`Invalid direction given for right hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${n}`);if(vr.records.nodes[t]===void 0&&vr.records.groups[t]===void 0)throw new Error(`The left-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(vr.records.nodes[e]===void 0&&vr.records.groups[t]===void 0)throw new Error(`The right-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);let h=vr.records.nodes[t].in,f=vr.records.nodes[e].in;if(s&&h&&f&&h==f)throw new Error(`The left-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(l&&h&&f&&h==f)throw new Error(`The right-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);let d={lhsId:t,lhsDir:r,lhsInto:i,lhsGroup:s,rhsId:e,rhsDir:n,rhsInto:a,rhsGroup:l,title:u};vr.records.edges.push(d),vr.records.nodes[t]&&vr.records.nodes[e]&&(vr.records.nodes[t].edges.push(vr.records.edges[vr.records.edges.length-1]),vr.records.nodes[e].edges.push(vr.records.edges[vr.records.edges.length-1]))},"addEdge"),Fnt=o(()=>vr.records.edges,"getEdges"),$nt=o(()=>{if(vr.records.dataStructures===void 0){let t={},e=Object.entries(vr.records.nodes).reduce((l,[u,h])=>(l[u]=h.edges.reduce((f,d)=>{let p=jF(d.lhsId)?.in,m=jF(d.rhsId)?.in;if(p&&m&&p!==m){let g=F2e(d.lhsDir,d.rhsDir);g!=="bend"&&(t[p]??={},t[p][m]=g,t[m]??={},t[m][p]=g)}if(d.lhsId===u){let g=R4(d.lhsDir,d.rhsDir);g&&(f[g]=d.rhsId)}else{let g=R4(d.rhsDir,d.lhsDir);g&&(f[g]=d.lhsId)}return f},{}),l),{}),r=Object.keys(e)[0],n={[r]:1},i=Object.keys(e).reduce((l,u)=>u===r?l:{...l,[u]:1},{}),a=o(l=>{let u={[l]:[0,0]},h=[l];for(;h.length>0;){let f=h.shift();if(f){n[f]=1,delete i[f];let d=e[f],[p,m]=u[f];Object.entries(d).forEach(([g,y])=>{n[y]||(u[y]=P2e([p,m],g),h.push(y))})}}return u},"BFS"),s=[a(r)];for(;Object.keys(i).length>0;)s.push(a(Object.keys(i)[0]));vr.records.dataStructures={adjList:e,spatialMaps:s,groupAlignments:t}}return vr.records.dataStructures},"getDataStructures"),znt=o((t,e)=>{vr.records.elements[t]=e},"setElementForId"),Gnt=o(t=>vr.records.elements[t],"getElementById"),V2e=o(()=>$n({...G2e,...tr().architecture}),"getConfig"),o0={clear:Dnt,setDiagramTitle:Or,getDiagramTitle:Nr,setAccTitle:Ar,getAccTitle:Dr,setAccDescription:Lr,getAccDescription:Rr,getConfig:V2e,addService:Lnt,getServices:Rnt,addJunction:Nnt,getJunctions:Mnt,getNodes:Int,getNode:jF,addGroup:Ont,getGroups:Pnt,addEdge:Bnt,getEdges:Fnt,setElementForId:znt,getElementById:Gnt,getDataStructures:$nt};o(Mi,"getConfigField")});var Vnt,U2e,H2e=N(()=>{"use strict";bf();yt();Mp();N4();Vnt=o((t,e)=>{Jo(t,e),t.groups.map(e.addGroup),t.services.map(r=>e.addService({...r,type:"service"})),t.junctions.map(r=>e.addJunction({...r,type:"junction"})),t.edges.map(e.addEdge)},"populateDb"),U2e={parse:o(async t=>{let e=await vs("architecture",t);X.debug(e),Vnt(e,o0)},"parse")}});var Unt,W2e,q2e=N(()=>{"use strict";Unt=o(t=>` - .edge { - stroke-width: ${t.archEdgeWidth}; - stroke: ${t.archEdgeColor}; - fill: none; - } - - .arrow { - fill: ${t.archEdgeArrowColor}; - } - - .node-bkg { - fill: none; - stroke: ${t.archGroupBorderColor}; - stroke-width: ${t.archGroupBorderWidth}; - stroke-dasharray: 8; - } - .node-icon-text { - display: flex; - align-items: center; - } - - .node-icon-text > div { - color: #fff; - margin: 1px; - height: fit-content; - text-align: center; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - } -`,"getStyles"),W2e=Unt});var QF=Pi((M4,KF)=>{"use strict";o(function(e,r){typeof M4=="object"&&typeof KF=="object"?KF.exports=r():typeof define=="function"&&define.amd?define([],r):typeof M4=="object"?M4.layoutBase=r():e.layoutBase=r()},"webpackUniversalModuleDefinition")(M4,function(){return function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return o(r,"__webpack_require__"),r.m=t,r.c=e,r.i=function(n){return n},r.d=function(n,i,a){r.o(n,i)||Object.defineProperty(n,i,{configurable:!1,enumerable:!0,get:a})},r.n=function(n){var i=n&&n.__esModule?o(function(){return n.default},"getDefault"):o(function(){return n},"getModuleExports");return r.d(i,"a",i),i},r.o=function(n,i){return Object.prototype.hasOwnProperty.call(n,i)},r.p="",r(r.s=28)}([function(t,e,r){"use strict";function n(){}o(n,"LayoutConstants"),n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(8),a=r(9);function s(u,h,f){n.call(this,f),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=f,this.bendpoints=[],this.source=u,this.target=h}o(s,"LEdge"),s.prototype=Object.create(n.prototype);for(var l in n)s[l]=n[l];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(u){if(this.source===u)return this.target;if(this.target===u)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(u,h){for(var f=this.getOtherEnd(u),d=h.getGraphManager().getRoot();;){if(f.getOwner()==h)return f;if(f.getOwner()==d)break;f=f.getOwner().getParent()}return null},s.prototype.updateLength=function(){var u=new Array(4);this.isOverlapingSourceAndTarget=i.getIntersection(this.target.getRect(),this.source.getRect(),u),this.isOverlapingSourceAndTarget||(this.lengthX=u[0]-u[2],this.lengthY=u[1]-u[3],Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=a.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=a.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,r){"use strict";function n(i){this.vGraphObject=i}o(n,"LGraphObject"),t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(13),s=r(0),l=r(16),u=r(5);function h(d,p,m,g){m==null&&g==null&&(g=p),n.call(this,g),d.graphManager!=null&&(d=d.graphManager),this.estimatedSize=i.MIN_VALUE,this.inclusionTreeDepth=i.MAX_VALUE,this.vGraphObject=g,this.edges=[],this.graphManager=d,m!=null&&p!=null?this.rect=new a(p.x,p.y,m.width,m.height):this.rect=new a}o(h,"LNode"),h.prototype=Object.create(n.prototype);for(var f in n)h[f]=n[f];h.prototype.getEdges=function(){return this.edges},h.prototype.getChild=function(){return this.child},h.prototype.getOwner=function(){return this.owner},h.prototype.getWidth=function(){return this.rect.width},h.prototype.setWidth=function(d){this.rect.width=d},h.prototype.getHeight=function(){return this.rect.height},h.prototype.setHeight=function(d){this.rect.height=d},h.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},h.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},h.prototype.getCenter=function(){return new u(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},h.prototype.getLocation=function(){return new u(this.rect.x,this.rect.y)},h.prototype.getRect=function(){return this.rect},h.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},h.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},h.prototype.setRect=function(d,p){this.rect.x=d.x,this.rect.y=d.y,this.rect.width=p.width,this.rect.height=p.height},h.prototype.setCenter=function(d,p){this.rect.x=d-this.rect.width/2,this.rect.y=p-this.rect.height/2},h.prototype.setLocation=function(d,p){this.rect.x=d,this.rect.y=p},h.prototype.moveBy=function(d,p){this.rect.x+=d,this.rect.y+=p},h.prototype.getEdgeListToNode=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(y.target==d){if(y.source!=g)throw"Incorrect edge source!";p.push(y)}}),p},h.prototype.getEdgesBetween=function(d){var p=[],m,g=this;return g.edges.forEach(function(y){if(!(y.source==g||y.target==g))throw"Incorrect edge source and/or target";(y.target==d||y.source==d)&&p.push(y)}),p},h.prototype.getNeighborsList=function(){var d=new Set,p=this;return p.edges.forEach(function(m){if(m.source==p)d.add(m.target);else{if(m.target!=p)throw"Incorrect incidency!";d.add(m.source)}}),d},h.prototype.withChildren=function(){var d=new Set,p,m;if(d.add(this),this.child!=null)for(var g=this.child.getNodes(),y=0;yp?(this.rect.x-=(this.labelWidth-p)/2,this.setWidth(this.labelWidth)):this.labelPosHorizontal=="right"&&this.setWidth(p+this.labelWidth)),this.labelHeight&&(this.labelPosVertical=="top"?(this.rect.y-=this.labelHeight,this.setHeight(m+this.labelHeight)):this.labelPosVertical=="center"&&this.labelHeight>m?(this.rect.y-=(this.labelHeight-m)/2,this.setHeight(this.labelHeight)):this.labelPosVertical=="bottom"&&this.setHeight(m+this.labelHeight))}}},h.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==i.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},h.prototype.transform=function(d){var p=this.rect.x;p>s.WORLD_BOUNDARY?p=s.WORLD_BOUNDARY:p<-s.WORLD_BOUNDARY&&(p=-s.WORLD_BOUNDARY);var m=this.rect.y;m>s.WORLD_BOUNDARY?m=s.WORLD_BOUNDARY:m<-s.WORLD_BOUNDARY&&(m=-s.WORLD_BOUNDARY);var g=new u(p,m),y=d.inverseTransformPoint(g);this.setLocation(y.x,y.y)},h.prototype.getLeft=function(){return this.rect.x},h.prototype.getRight=function(){return this.rect.x+this.rect.width},h.prototype.getTop=function(){return this.rect.y},h.prototype.getBottom=function(){return this.rect.y+this.rect.height},h.prototype.getParent=function(){return this.owner==null?null:this.owner.getParent()},t.exports=h},function(t,e,r){"use strict";var n=r(0);function i(){}o(i,"FDLayoutConstants");for(var a in n)i[a]=n[a];i.MAX_ITERATIONS=2500,i.DEFAULT_EDGE_LENGTH=50,i.DEFAULT_SPRING_STRENGTH=.45,i.DEFAULT_REPULSION_STRENGTH=4500,i.DEFAULT_GRAVITY_STRENGTH=.4,i.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,i.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,i.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,i.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,i.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,i.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,i.COOLING_ADAPTATION_FACTOR=.33,i.ADAPTATION_LOWER_NODE_LIMIT=1e3,i.ADAPTATION_UPPER_NODE_LIMIT=5e3,i.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,i.MAX_NODE_DISPLACEMENT=i.MAX_NODE_DISPLACEMENT_INCREMENTAL*3,i.MIN_REPULSION_DIST=i.DEFAULT_EDGE_LENGTH/10,i.CONVERGENCE_CHECK_PERIOD=100,i.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,i.MIN_EDGE_LENGTH=1,i.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=i},function(t,e,r){"use strict";function n(i,a){i==null&&a==null?(this.x=0,this.y=0):(this.x=i,this.y=a)}o(n,"PointD"),n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(i){this.x=i},n.prototype.setY=function(i){this.y=i},n.prototype.getDifference=function(i){return new DimensionD(this.x-i.x,this.y-i.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(i){return this.x+=i.width,this.y+=i.height,this},t.exports=n},function(t,e,r){"use strict";var n=r(2),i=r(10),a=r(0),s=r(7),l=r(3),u=r(1),h=r(13),f=r(12),d=r(11);function p(g,y,v){n.call(this,v),this.estimatedSize=i.MIN_VALUE,this.margin=a.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=g,y!=null&&y instanceof s?this.graphManager=y:y!=null&&y instanceof Layout&&(this.graphManager=y.graphManager)}o(p,"LGraph"),p.prototype=Object.create(n.prototype);for(var m in n)p[m]=n[m];p.prototype.getNodes=function(){return this.nodes},p.prototype.getEdges=function(){return this.edges},p.prototype.getGraphManager=function(){return this.graphManager},p.prototype.getParent=function(){return this.parent},p.prototype.getLeft=function(){return this.left},p.prototype.getRight=function(){return this.right},p.prototype.getTop=function(){return this.top},p.prototype.getBottom=function(){return this.bottom},p.prototype.isConnected=function(){return this.isConnected},p.prototype.add=function(g,y,v){if(y==null&&v==null){var x=g;if(this.graphManager==null)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(x)>-1)throw"Node already in graph!";return x.owner=this,this.getNodes().push(x),x}else{var b=g;if(!(this.getNodes().indexOf(y)>-1&&this.getNodes().indexOf(v)>-1))throw"Source or target not in graph!";if(!(y.owner==v.owner&&y.owner==this))throw"Both owners must be this graph!";return y.owner!=v.owner?null:(b.source=y,b.target=v,b.isInterGraph=!1,this.getEdges().push(b),y.edges.push(b),v!=y&&v.edges.push(b),b)}},p.prototype.remove=function(g){var y=g;if(g instanceof l){if(y==null)throw"Node is null!";if(!(y.owner!=null&&y.owner==this))throw"Owner graph is invalid!";if(this.graphManager==null)throw"Owner graph manager is invalid!";for(var v=y.edges.slice(),x,b=v.length,T=0;T-1&&E>-1))throw"Source and/or target doesn't know this edge!";x.source.edges.splice(w,1),x.target!=x.source&&x.target.edges.splice(E,1);var S=x.source.owner.getEdges().indexOf(x);if(S==-1)throw"Not in owner's edge list!";x.source.owner.getEdges().splice(S,1)}},p.prototype.updateLeftTop=function(){for(var g=i.MAX_VALUE,y=i.MAX_VALUE,v,x,b,T=this.getNodes(),S=T.length,w=0;wv&&(g=v),y>x&&(y=x)}return g==i.MAX_VALUE?null:(T[0].getParent().paddingLeft!=null?b=T[0].getParent().paddingLeft:b=this.margin,this.left=y-b,this.top=g-b,new f(this.left,this.top))},p.prototype.updateBounds=function(g){for(var y=i.MAX_VALUE,v=-i.MAX_VALUE,x=i.MAX_VALUE,b=-i.MAX_VALUE,T,S,w,E,_,C=this.nodes,D=C.length,O=0;OT&&(y=T),vw&&(x=w),bT&&(y=T),vw&&(x=w),b=this.nodes.length){var D=0;v.forEach(function(O){O.owner==g&&D++}),D==this.nodes.length&&(this.isConnected=!0)}},t.exports=p},function(t,e,r){"use strict";var n,i=r(1);function a(s){n=r(6),this.layout=s,this.graphs=[],this.edges=[]}o(a,"LGraphManager"),a.prototype.addRoot=function(){var s=this.layout.newGraph(),l=this.layout.newNode(null),u=this.add(s,l);return this.setRootGraph(u),this.rootGraph},a.prototype.add=function(s,l,u,h,f){if(u==null&&h==null&&f==null){if(s==null)throw"Graph is null!";if(l==null)throw"Parent node is null!";if(this.graphs.indexOf(s)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(s),s.parent!=null)throw"Already has a parent!";if(l.child!=null)throw"Already has a child!";return s.parent=l,l.child=s,s}else{f=u,h=l,u=s;var d=h.getOwner(),p=f.getOwner();if(!(d!=null&&d.getGraphManager()==this))throw"Source not in this graph mgr!";if(!(p!=null&&p.getGraphManager()==this))throw"Target not in this graph mgr!";if(d==p)return u.isInterGraph=!1,d.add(u,h,f);if(u.isInterGraph=!0,u.source=h,u.target=f,this.edges.indexOf(u)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(u),!(u.source!=null&&u.target!=null))throw"Edge source and/or target is null!";if(!(u.source.edges.indexOf(u)==-1&&u.target.edges.indexOf(u)==-1))throw"Edge already in source and/or target incidency list!";return u.source.edges.push(u),u.target.edges.push(u),u}},a.prototype.remove=function(s){if(s instanceof n){var l=s;if(l.getGraphManager()!=this)throw"Graph not in this graph mgr";if(!(l==this.rootGraph||l.parent!=null&&l.parent.graphManager==this))throw"Invalid parent node!";var u=[];u=u.concat(l.getEdges());for(var h,f=u.length,d=0;d=s.getRight()?l[0]+=Math.min(s.getX()-a.getX(),a.getRight()-s.getRight()):s.getX()<=a.getX()&&s.getRight()>=a.getRight()&&(l[0]+=Math.min(a.getX()-s.getX(),s.getRight()-a.getRight())),a.getY()<=s.getY()&&a.getBottom()>=s.getBottom()?l[1]+=Math.min(s.getY()-a.getY(),a.getBottom()-s.getBottom()):s.getY()<=a.getY()&&s.getBottom()>=a.getBottom()&&(l[1]+=Math.min(a.getY()-s.getY(),s.getBottom()-a.getBottom()));var f=Math.abs((s.getCenterY()-a.getCenterY())/(s.getCenterX()-a.getCenterX()));s.getCenterY()===a.getCenterY()&&s.getCenterX()===a.getCenterX()&&(f=1);var d=f*l[0],p=l[1]/f;l[0]d)return l[0]=u,l[1]=m,l[2]=f,l[3]=C,!1;if(hf)return l[0]=p,l[1]=h,l[2]=E,l[3]=d,!1;if(uf?(l[0]=y,l[1]=v,k=!0):(l[0]=g,l[1]=m,k=!0):A===M&&(u>f?(l[0]=p,l[1]=m,k=!0):(l[0]=x,l[1]=v,k=!0)),-I===M?f>u?(l[2]=_,l[3]=C,L=!0):(l[2]=E,l[3]=w,L=!0):I===M&&(f>u?(l[2]=S,l[3]=w,L=!0):(l[2]=D,l[3]=C,L=!0)),k&&L)return!1;if(u>f?h>d?(P=this.getCardinalDirection(A,M,4),B=this.getCardinalDirection(I,M,2)):(P=this.getCardinalDirection(-A,M,3),B=this.getCardinalDirection(-I,M,1)):h>d?(P=this.getCardinalDirection(-A,M,1),B=this.getCardinalDirection(-I,M,3)):(P=this.getCardinalDirection(A,M,2),B=this.getCardinalDirection(I,M,4)),!k)switch(P){case 1:z=m,F=u+-T/M,l[0]=F,l[1]=z;break;case 2:F=x,z=h+b*M,l[0]=F,l[1]=z;break;case 3:z=v,F=u+T/M,l[0]=F,l[1]=z;break;case 4:F=y,z=h+-b*M,l[0]=F,l[1]=z;break}if(!L)switch(B){case 1:U=w,$=f+-R/M,l[2]=$,l[3]=U;break;case 2:$=D,U=d+O*M,l[2]=$,l[3]=U;break;case 3:U=C,$=f+R/M,l[2]=$,l[3]=U;break;case 4:$=_,U=d+-O*M,l[2]=$,l[3]=U;break}}return!1},i.getCardinalDirection=function(a,s,l){return a>s?l:1+l%4},i.getIntersection=function(a,s,l,u){if(u==null)return this.getIntersection2(a,s,l);var h=a.x,f=a.y,d=s.x,p=s.y,m=l.x,g=l.y,y=u.x,v=u.y,x=void 0,b=void 0,T=void 0,S=void 0,w=void 0,E=void 0,_=void 0,C=void 0,D=void 0;return T=p-f,w=h-d,_=d*f-h*p,S=v-g,E=m-y,C=y*g-m*v,D=T*E-S*w,D===0?null:(x=(w*C-E*_)/D,b=(S*_-T*C)/D,new n(x,b))},i.angleOfVector=function(a,s,l,u){var h=void 0;return a!==l?(h=Math.atan((u-s)/(l-a)),l=0){var v=(-m+Math.sqrt(m*m-4*p*g))/(2*p),x=(-m-Math.sqrt(m*m-4*p*g))/(2*p),b=null;return v>=0&&v<=1?[v]:x>=0&&x<=1?[x]:b}else return null},i.HALF_PI=.5*Math.PI,i.ONE_AND_HALF_PI=1.5*Math.PI,i.TWO_PI=2*Math.PI,i.THREE_PI=3*Math.PI,t.exports=i},function(t,e,r){"use strict";function n(){}o(n,"IMath"),n.sign=function(i){return i>0?1:i<0?-1:0},n.floor=function(i){return i<0?Math.ceil(i):Math.floor(i)},n.ceil=function(i){return i<0?Math.floor(i):Math.ceil(i)},t.exports=n},function(t,e,r){"use strict";function n(){}o(n,"Integer"),n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,r){"use strict";var n=function(){function h(f,d){for(var p=0;p"u"?"undefined":n(a);return a==null||s!="object"&&s!="function"},t.exports=i},function(t,e,r){"use strict";function n(m){if(Array.isArray(m)){for(var g=0,y=Array(m.length);g0&&g;){for(T.push(w[0]);T.length>0&&g;){var E=T[0];T.splice(0,1),b.add(E);for(var _=E.getEdges(),x=0;x<_.length;x++){var C=_[x].getOtherEnd(E);if(S.get(E)!=C)if(!b.has(C))T.push(C),S.set(C,E);else{g=!1;break}}}if(!g)m=[];else{var D=[].concat(n(b));m.push(D);for(var x=0;x-1&&w.splice(R,1)}b=new Set,S=new Map}}return m},p.prototype.createDummyNodesForBendpoints=function(m){for(var g=[],y=m.source,v=this.graphManager.calcLowestCommonAncestor(m.source,m.target),x=0;x0){for(var v=this.edgeToDummyNodes.get(y),x=0;x=0&&g.splice(C,1);var D=S.getNeighborsList();D.forEach(function(k){if(y.indexOf(k)<0){var L=v.get(k),A=L-1;A==1&&E.push(k),v.set(k,A)}})}y=y.concat(E),(g.length==1||g.length==2)&&(x=!0,b=g[0])}return b},p.prototype.setGraphManager=function(m){this.graphManager=m},t.exports=p},function(t,e,r){"use strict";function n(){}o(n,"RandomSeed"),n.seed=1,n.x=0,n.nextDouble=function(){return n.x=Math.sin(n.seed++)*1e4,n.x-Math.floor(n.x)},t.exports=n},function(t,e,r){"use strict";var n=r(5);function i(a,s){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}o(i,"Transform"),i.prototype.getWorldOrgX=function(){return this.lworldOrgX},i.prototype.setWorldOrgX=function(a){this.lworldOrgX=a},i.prototype.getWorldOrgY=function(){return this.lworldOrgY},i.prototype.setWorldOrgY=function(a){this.lworldOrgY=a},i.prototype.getWorldExtX=function(){return this.lworldExtX},i.prototype.setWorldExtX=function(a){this.lworldExtX=a},i.prototype.getWorldExtY=function(){return this.lworldExtY},i.prototype.setWorldExtY=function(a){this.lworldExtY=a},i.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},i.prototype.setDeviceOrgX=function(a){this.ldeviceOrgX=a},i.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},i.prototype.setDeviceOrgY=function(a){this.ldeviceOrgY=a},i.prototype.getDeviceExtX=function(){return this.ldeviceExtX},i.prototype.setDeviceExtX=function(a){this.ldeviceExtX=a},i.prototype.getDeviceExtY=function(){return this.ldeviceExtY},i.prototype.setDeviceExtY=function(a){this.ldeviceExtY=a},i.prototype.transformX=function(a){var s=0,l=this.lworldExtX;return l!=0&&(s=this.ldeviceOrgX+(a-this.lworldOrgX)*this.ldeviceExtX/l),s},i.prototype.transformY=function(a){var s=0,l=this.lworldExtY;return l!=0&&(s=this.ldeviceOrgY+(a-this.lworldOrgY)*this.ldeviceExtY/l),s},i.prototype.inverseTransformX=function(a){var s=0,l=this.ldeviceExtX;return l!=0&&(s=this.lworldOrgX+(a-this.ldeviceOrgX)*this.lworldExtX/l),s},i.prototype.inverseTransformY=function(a){var s=0,l=this.ldeviceExtY;return l!=0&&(s=this.lworldOrgY+(a-this.ldeviceOrgY)*this.lworldExtY/l),s},i.prototype.inverseTransformPoint=function(a){var s=new n(this.inverseTransformX(a.x),this.inverseTransformY(a.y));return s},t.exports=i},function(t,e,r){"use strict";function n(d){if(Array.isArray(d)){for(var p=0,m=Array(d.length);pa.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*a.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-a.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT_INCREMENTAL):(d>a.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(a.COOLING_ADAPTATION_FACTOR,1-(d-a.ADAPTATION_LOWER_NODE_LIMIT)/(a.ADAPTATION_UPPER_NODE_LIMIT-a.ADAPTATION_LOWER_NODE_LIMIT)*(1-a.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=a.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(this.getAllNodes().length*5,this.maxIterations),this.displacementThresholdPerNode=3*a.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var d=this.getAllEdges(),p,m=0;m0&&arguments[0]!==void 0?arguments[0]:!0,p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,m,g,y,v,x=this.getAllNodes(),b;if(this.useFRGridVariant)for(this.totalIterations%a.GRID_CALCULATION_CHECK_PERIOD==1&&d&&this.updateGrid(),b=new Set,m=0;mT||b>T)&&(d.gravitationForceX=-this.gravityConstant*y,d.gravitationForceY=-this.gravityConstant*v)):(T=p.getEstimatedSize()*this.compoundGravityRangeFactor,(x>T||b>T)&&(d.gravitationForceX=-this.gravityConstant*y*this.compoundGravityConstant,d.gravitationForceY=-this.gravityConstant*v*this.compoundGravityConstant))},h.prototype.isConverged=function(){var d,p=!1;return this.totalIterations>this.maxIterations/3&&(p=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),d=this.totalDisplacement=x.length||T>=x[0].length)){for(var S=0;Sh},"_defaultCompareFunction")}]),l}();t.exports=s},function(t,e,r){"use strict";function n(){}o(n,"SVD"),n.svd=function(i){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=i.length,this.n=i[0].length;var a=Math.min(this.m,this.n);this.s=function(bt){for(var ut=[];bt-- >0;)ut.push(0);return ut}(Math.min(this.m+1,this.n)),this.U=function(bt){var ut=o(function St(ft){if(ft.length==0)return 0;for(var vt=[],nt=0;nt0;)ut.push(0);return ut}(this.n),l=function(bt){for(var ut=[];bt-- >0;)ut.push(0);return ut}(this.m),u=!0,h=!0,f=Math.min(this.m-1,this.n),d=Math.max(0,Math.min(this.n-2,this.m)),p=0;p=0;M--)if(this.s[M]!==0){for(var P=M+1;P=0;ee--){if(function(bt,ut){return bt&&ut}(ee0;){var le=void 0,J=void 0;for(le=L-2;le>=-1&&le!==-1;le--)if(Math.abs(s[le])<=he+te*(Math.abs(this.s[le])+Math.abs(this.s[le+1]))){s[le]=0;break}if(le===L-2)J=4;else{var Se=void 0;for(Se=L-1;Se>=le&&Se!==le;Se--){var se=(Se!==L?Math.abs(s[Se]):0)+(Se!==le+1?Math.abs(s[Se-1]):0);if(Math.abs(this.s[Se])<=he+te*se){this.s[Se]=0;break}}Se===le?J=3:Se===L-1?J=1:(J=2,le=Se)}switch(le++,J){case 1:{var ae=s[L-2];s[L-2]=0;for(var Oe=L-2;Oe>=le;Oe--){var ye=n.hypot(this.s[Oe],ae),Be=this.s[Oe]/ye,He=ae/ye;if(this.s[Oe]=ye,Oe!==le&&(ae=-He*s[Oe-1],s[Oe-1]=Be*s[Oe-1]),h)for(var ze=0;ze=this.s[le+1]);){var ot=this.s[le];if(this.s[le]=this.s[le+1],this.s[le+1]=ot,h&&leMath.abs(a)?(s=a/i,s=Math.abs(i)*Math.sqrt(1+s*s)):a!=0?(s=i/a,s=Math.abs(a)*Math.sqrt(1+s*s)):s=0,s},t.exports=n},function(t,e,r){"use strict";var n=function(){function s(l,u){for(var h=0;h2&&arguments[2]!==void 0?arguments[2]:1,f=arguments.length>3&&arguments[3]!==void 0?arguments[3]:-1,d=arguments.length>4&&arguments[4]!==void 0?arguments[4]:-1;i(this,s),this.sequence1=l,this.sequence2=u,this.match_score=h,this.mismatch_penalty=f,this.gap_penalty=d,this.iMax=l.length+1,this.jMax=u.length+1,this.grid=new Array(this.iMax);for(var p=0;p=0;l--){var u=this.listeners[l];u.event===a&&u.callback===s&&this.listeners.splice(l,1)}},i.emit=function(a,s){for(var l=0;l{"use strict";o(function(e,r){typeof I4=="object"&&typeof ZF=="object"?ZF.exports=r(QF()):typeof define=="function"&&define.amd?define(["layout-base"],r):typeof I4=="object"?I4.coseBase=r(QF()):e.coseBase=r(e.layoutBase)},"webpackUniversalModuleDefinition")(I4,function(t){return(()=>{"use strict";var e={45:(a,s,l)=>{var u={};u.layoutBase=l(551),u.CoSEConstants=l(806),u.CoSEEdge=l(767),u.CoSEGraph=l(880),u.CoSEGraphManager=l(578),u.CoSELayout=l(765),u.CoSENode=l(991),u.ConstraintHandler=l(902),a.exports=u},806:(a,s,l)=>{var u=l(551).FDLayoutConstants;function h(){}o(h,"CoSEConstants");for(var f in u)h[f]=u[f];h.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,h.DEFAULT_RADIAL_SEPARATION=u.DEFAULT_EDGE_LENGTH,h.DEFAULT_COMPONENT_SEPERATION=60,h.TILE=!0,h.TILING_PADDING_VERTICAL=10,h.TILING_PADDING_HORIZONTAL=10,h.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,h.ENFORCE_CONSTRAINTS=!0,h.APPLY_LAYOUT=!0,h.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,h.TREE_REDUCTION_ON_INCREMENTAL=!0,h.PURE_INCREMENTAL=h.DEFAULT_INCREMENTAL,a.exports=h},767:(a,s,l)=>{var u=l(551).FDLayoutEdge;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEEdge"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},880:(a,s,l)=>{var u=l(551).LGraph;function h(d,p,m){u.call(this,d,p,m)}o(h,"CoSEGraph"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},578:(a,s,l)=>{var u=l(551).LGraphManager;function h(d){u.call(this,d)}o(h,"CoSEGraphManager"),h.prototype=Object.create(u.prototype);for(var f in u)h[f]=u[f];a.exports=h},765:(a,s,l)=>{var u=l(551).FDLayout,h=l(578),f=l(880),d=l(991),p=l(767),m=l(806),g=l(902),y=l(551).FDLayoutConstants,v=l(551).LayoutConstants,x=l(551).Point,b=l(551).PointD,T=l(551).DimensionD,S=l(551).Layout,w=l(551).Integer,E=l(551).IGeometry,_=l(551).LGraph,C=l(551).Transform,D=l(551).LinkedList;function O(){u.call(this),this.toBeTiled={},this.constraints={}}o(O,"CoSELayout"),O.prototype=Object.create(u.prototype);for(var R in u)O[R]=u[R];O.prototype.newGraphManager=function(){var k=new h(this);return this.graphManager=k,k},O.prototype.newGraph=function(k){return new f(null,this.graphManager,k)},O.prototype.newNode=function(k){return new d(this.graphManager,k)},O.prototype.newEdge=function(k){return new p(null,null,k)},O.prototype.initParameters=function(){u.prototype.initParameters.call(this,arguments),this.isSubLayout||(m.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=m.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=m.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=y.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=y.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=y.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},O.prototype.initSpringEmbedder=function(){u.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/y.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},O.prototype.layout=function(){var k=v.DEFAULT_CREATE_BENDS_AS_NEEDED;return k&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},O.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental){if(m.TREE_REDUCTION_ON_INCREMENTAL){this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var L=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(P){return L.has(P)});this.graphManager.setAllNodesToApplyGravitation(A)}}else{var k=this.getFlatForest();if(k.length>0)this.positionNodesRadially(k);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var L=new Set(this.getAllNodes()),A=this.nodesWithGravity.filter(function(I){return L.has(I)});this.graphManager.setAllNodesToApplyGravitation(A),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(g.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),m.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},O.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished)if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;if(this.totalIterations%y.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged())if(this.prunedNodesAll.length>0)this.isTreeGrowing=!0;else return!0;this.coolingCycle++,this.layoutQuality==0?this.coolingAdjuster=this.coolingCycle:this.layoutQuality==1&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var k=new Set(this.getAllNodes()),L=this.nodesWithGravity.filter(function(M){return k.has(M)});this.graphManager.setAllNodesToApplyGravitation(L),this.graphManager.updateBounds(),this.updateGrid(),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),m.PURE_INCREMENTAL?this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=y.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var A=!this.isTreeGrowing&&!this.isGrowthFinished,I=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(A,I),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},O.prototype.getPositionsData=function(){for(var k=this.graphManager.getAllNodes(),L={},A=0;A0&&this.updateDisplacements();for(var A=0;A0&&(I.fixedNodeWeight=P)}}if(this.constraints.relativePlacementConstraint){var B=new Map,F=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(Z){k.fixedNodesOnHorizontal.add(Z),k.fixedNodesOnVertical.add(Z)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var z=this.constraints.alignmentConstraint.vertical,A=0;A=2*Z.length/3;j--)ue=Math.floor(Math.random()*(j+1)),Q=Z[j],Z[j]=Z[ue],Z[ue]=Q;return Z},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(Z){if(Z.left){var ue=B.has(Z.left)?B.get(Z.left):Z.left,Q=B.has(Z.right)?B.get(Z.right):Z.right;k.nodesInRelativeHorizontal.includes(ue)||(k.nodesInRelativeHorizontal.push(ue),k.nodeToRelativeConstraintMapHorizontal.set(ue,[]),k.dummyToNodeForVerticalAlignment.has(ue)?k.nodeToTempPositionMapHorizontal.set(ue,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(ue)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(ue,k.idToNodeMap.get(ue).getCenterX())),k.nodesInRelativeHorizontal.includes(Q)||(k.nodesInRelativeHorizontal.push(Q),k.nodeToRelativeConstraintMapHorizontal.set(Q,[]),k.dummyToNodeForVerticalAlignment.has(Q)?k.nodeToTempPositionMapHorizontal.set(Q,k.idToNodeMap.get(k.dummyToNodeForVerticalAlignment.get(Q)[0]).getCenterX()):k.nodeToTempPositionMapHorizontal.set(Q,k.idToNodeMap.get(Q).getCenterX())),k.nodeToRelativeConstraintMapHorizontal.get(ue).push({right:Q,gap:Z.gap}),k.nodeToRelativeConstraintMapHorizontal.get(Q).push({left:ue,gap:Z.gap})}else{var j=F.has(Z.top)?F.get(Z.top):Z.top,ne=F.has(Z.bottom)?F.get(Z.bottom):Z.bottom;k.nodesInRelativeVertical.includes(j)||(k.nodesInRelativeVertical.push(j),k.nodeToRelativeConstraintMapVertical.set(j,[]),k.dummyToNodeForHorizontalAlignment.has(j)?k.nodeToTempPositionMapVertical.set(j,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(j)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(j,k.idToNodeMap.get(j).getCenterY())),k.nodesInRelativeVertical.includes(ne)||(k.nodesInRelativeVertical.push(ne),k.nodeToRelativeConstraintMapVertical.set(ne,[]),k.dummyToNodeForHorizontalAlignment.has(ne)?k.nodeToTempPositionMapVertical.set(ne,k.idToNodeMap.get(k.dummyToNodeForHorizontalAlignment.get(ne)[0]).getCenterY()):k.nodeToTempPositionMapVertical.set(ne,k.idToNodeMap.get(ne).getCenterY())),k.nodeToRelativeConstraintMapVertical.get(j).push({bottom:ne,gap:Z.gap}),k.nodeToRelativeConstraintMapVertical.get(ne).push({top:j,gap:Z.gap})}});else{var U=new Map,K=new Map;this.constraints.relativePlacementConstraint.forEach(function(Z){if(Z.left){var ue=B.has(Z.left)?B.get(Z.left):Z.left,Q=B.has(Z.right)?B.get(Z.right):Z.right;U.has(ue)?U.get(ue).push(Q):U.set(ue,[Q]),U.has(Q)?U.get(Q).push(ue):U.set(Q,[ue])}else{var j=F.has(Z.top)?F.get(Z.top):Z.top,ne=F.has(Z.bottom)?F.get(Z.bottom):Z.bottom;K.has(j)?K.get(j).push(ne):K.set(j,[ne]),K.has(ne)?K.get(ne).push(j):K.set(ne,[j])}});var ee=o(function(ue,Q){var j=[],ne=[],te=new D,he=new Set,le=0;return ue.forEach(function(J,Se){if(!he.has(Se)){j[le]=[],ne[le]=!1;var se=Se;for(te.push(se),he.add(se),j[le].push(se);te.length!=0;){se=te.shift(),Q.has(se)&&(ne[le]=!0);var ae=ue.get(se);ae.forEach(function(Oe){he.has(Oe)||(te.push(Oe),he.add(Oe),j[le].push(Oe))})}le++}}),{components:j,isFixed:ne}},"constructComponents"),Y=ee(U,k.fixedNodesOnHorizontal);this.componentsOnHorizontal=Y.components,this.fixedComponentsOnHorizontal=Y.isFixed;var ce=ee(K,k.fixedNodesOnVertical);this.componentsOnVertical=ce.components,this.fixedComponentsOnVertical=ce.isFixed}}},O.prototype.updateDisplacements=function(){var k=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(ce){var Z=k.idToNodeMap.get(ce.nodeId);Z.displacementX=0,Z.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var L=this.constraints.alignmentConstraint.vertical,A=0;A1){var F;for(F=0;FI&&(I=Math.floor(B.y)),P=Math.floor(B.x+m.DEFAULT_COMPONENT_SEPERATION)}this.transform(new b(v.WORLD_CENTER_X-B.x/2,v.WORLD_CENTER_Y-B.y/2))},O.radialLayout=function(k,L,A){var I=Math.max(this.maxDiagonalInTree(k),m.DEFAULT_RADIAL_SEPARATION);O.branchRadialLayout(L,null,0,359,0,I);var M=_.calculateBounds(k),P=new C;P.setDeviceOrgX(M.getMinX()),P.setDeviceOrgY(M.getMinY()),P.setWorldOrgX(A.x),P.setWorldOrgY(A.y);for(var B=0;B1;){var j=Q[0];Q.splice(0,1);var ne=ee.indexOf(j);ne>=0&&ee.splice(ne,1),Z--,Y--}L!=null?ue=(ee.indexOf(Q[0])+1)%Z:ue=0;for(var te=Math.abs(I-A)/Y,he=ue;ce!=Y;he=++he%Z){var le=ee[he].getOtherEnd(k);if(le!=L){var J=(A+ce*te)%360,Se=(J+te)%360;O.branchRadialLayout(le,k,J,Se,M+P,P),ce++}}},O.maxDiagonalInTree=function(k){for(var L=w.MIN_VALUE,A=0;AL&&(L=M)}return L},O.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},O.prototype.groupZeroDegreeMembers=function(){var k=this,L={};this.memberGroups={},this.idToDummyNode={};for(var A=[],I=this.graphManager.getAllNodes(),M=0;M"u"&&(L[F]=[]),L[F]=L[F].concat(P)}Object.keys(L).forEach(function(z){if(L[z].length>1){var $="DummyCompound_"+z;k.memberGroups[$]=L[z];var U=L[z][0].getParent(),K=new d(k.graphManager);K.id=$,K.paddingLeft=U.paddingLeft||0,K.paddingRight=U.paddingRight||0,K.paddingBottom=U.paddingBottom||0,K.paddingTop=U.paddingTop||0,k.idToDummyNode[$]=K;var ee=k.getGraphManager().add(k.newGraph(),K),Y=U.getChild();Y.add(K);for(var ce=0;ceM?(I.rect.x-=(I.labelWidth-M)/2,I.setWidth(I.labelWidth),I.labelMarginLeft=(I.labelWidth-M)/2):I.labelPosHorizontal=="right"&&I.setWidth(M+I.labelWidth)),I.labelHeight&&(I.labelPosVertical=="top"?(I.rect.y-=I.labelHeight,I.setHeight(P+I.labelHeight),I.labelMarginTop=I.labelHeight):I.labelPosVertical=="center"&&I.labelHeight>P?(I.rect.y-=(I.labelHeight-P)/2,I.setHeight(I.labelHeight),I.labelMarginTop=(I.labelHeight-P)/2):I.labelPosVertical=="bottom"&&I.setHeight(P+I.labelHeight))}})},O.prototype.repopulateCompounds=function(){for(var k=this.compoundOrder.length-1;k>=0;k--){var L=this.compoundOrder[k],A=L.id,I=L.paddingLeft,M=L.paddingTop,P=L.labelMarginLeft,B=L.labelMarginTop;this.adjustLocations(this.tiledMemberPack[A],L.rect.x,L.rect.y,I,M,P,B)}},O.prototype.repopulateZeroDegreeMembers=function(){var k=this,L=this.tiledZeroDegreePack;Object.keys(L).forEach(function(A){var I=k.idToDummyNode[A],M=I.paddingLeft,P=I.paddingTop,B=I.labelMarginLeft,F=I.labelMarginTop;k.adjustLocations(L[A],I.rect.x,I.rect.y,M,P,B,F)})},O.prototype.getToBeTiled=function(k){var L=k.id;if(this.toBeTiled[L]!=null)return this.toBeTiled[L];var A=k.getChild();if(A==null)return this.toBeTiled[L]=!1,!1;for(var I=A.getNodes(),M=0;M0)return this.toBeTiled[L]=!1,!1;if(P.getChild()==null){this.toBeTiled[P.id]=!1;continue}if(!this.getToBeTiled(P))return this.toBeTiled[L]=!1,!1}return this.toBeTiled[L]=!0,!0},O.prototype.getNodeDegree=function(k){for(var L=k.id,A=k.getEdges(),I=0,M=0;MU&&(U=ee.rect.height)}A+=U+k.verticalPadding}},O.prototype.tileCompoundMembers=function(k,L){var A=this;this.tiledMemberPack=[],Object.keys(k).forEach(function(I){var M=L[I];if(A.tiledMemberPack[I]=A.tileNodes(k[I],M.paddingLeft+M.paddingRight),M.rect.width=A.tiledMemberPack[I].width,M.rect.height=A.tiledMemberPack[I].height,M.setCenter(A.tiledMemberPack[I].centerX,A.tiledMemberPack[I].centerY),M.labelMarginLeft=0,M.labelMarginTop=0,m.NODE_DIMENSIONS_INCLUDE_LABELS){var P=M.rect.width,B=M.rect.height;M.labelWidth&&(M.labelPosHorizontal=="left"?(M.rect.x-=M.labelWidth,M.setWidth(P+M.labelWidth),M.labelMarginLeft=M.labelWidth):M.labelPosHorizontal=="center"&&M.labelWidth>P?(M.rect.x-=(M.labelWidth-P)/2,M.setWidth(M.labelWidth),M.labelMarginLeft=(M.labelWidth-P)/2):M.labelPosHorizontal=="right"&&M.setWidth(P+M.labelWidth)),M.labelHeight&&(M.labelPosVertical=="top"?(M.rect.y-=M.labelHeight,M.setHeight(B+M.labelHeight),M.labelMarginTop=M.labelHeight):M.labelPosVertical=="center"&&M.labelHeight>B?(M.rect.y-=(M.labelHeight-B)/2,M.setHeight(M.labelHeight),M.labelMarginTop=(M.labelHeight-B)/2):M.labelPosVertical=="bottom"&&M.setHeight(B+M.labelHeight))}})},O.prototype.tileNodes=function(k,L){var A=this.tileNodesByFavoringDim(k,L,!0),I=this.tileNodesByFavoringDim(k,L,!1),M=this.getOrgRatio(A),P=this.getOrgRatio(I),B;return PF&&(F=ce.getWidth())});var z=P/M,$=B/M,U=Math.pow(A-I,2)+4*(z+I)*($+A)*M,K=(I-A+Math.sqrt(U))/(2*(z+I)),ee;L?(ee=Math.ceil(K),ee==K&&ee++):ee=Math.floor(K);var Y=ee*(z+I)-I;return F>Y&&(Y=F),Y+=I*2,Y},O.prototype.tileNodesByFavoringDim=function(k,L,A){var I=m.TILING_PADDING_VERTICAL,M=m.TILING_PADDING_HORIZONTAL,P=m.TILING_COMPARE_BY,B={rows:[],rowWidth:[],rowHeight:[],width:0,height:L,verticalPadding:I,horizontalPadding:M,centerX:0,centerY:0};P&&(B.idealRowWidth=this.calcIdealRowWidth(k,A));var F=o(function(Z){return Z.rect.width*Z.rect.height},"getNodeArea"),z=o(function(Z,ue){return F(ue)-F(Z)},"areaCompareFcn");k.sort(function(ce,Z){var ue=z;return B.idealRowWidth?(ue=P,ue(ce.id,Z.id)):ue(ce,Z)});for(var $=0,U=0,K=0;K0&&(B+=k.horizontalPadding),k.rowWidth[A]=B,k.width0&&(F+=k.verticalPadding);var z=0;F>k.rowHeight[A]&&(z=k.rowHeight[A],k.rowHeight[A]=F,z=k.rowHeight[A]-z),k.height+=z,k.rows[A].push(L)},O.prototype.getShortestRowIndex=function(k){for(var L=-1,A=Number.MAX_VALUE,I=0;IA&&(L=I,A=k.rowWidth[I]);return L},O.prototype.canAddHorizontal=function(k,L,A){if(k.idealRowWidth){var I=k.rows.length-1,M=k.rowWidth[I];return M+L+k.horizontalPadding<=k.idealRowWidth}var P=this.getShortestRowIndex(k);if(P<0)return!0;var B=k.rowWidth[P];if(B+k.horizontalPadding+L<=k.width)return!0;var F=0;k.rowHeight[P]0&&(F=A+k.verticalPadding-k.rowHeight[P]);var z;k.width-B>=L+k.horizontalPadding?z=(k.height+F)/(B+L+k.horizontalPadding):z=(k.height+F)/k.width,F=A+k.verticalPadding;var $;return k.widthP&&L!=A){I.splice(-1,1),k.rows[A].push(M),k.rowWidth[L]=k.rowWidth[L]-P,k.rowWidth[A]=k.rowWidth[A]+P,k.width=k.rowWidth[instance.getLongestRowIndex(k)];for(var B=Number.MIN_VALUE,F=0;FB&&(B=I[F].height);L>0&&(B+=k.verticalPadding);var z=k.rowHeight[L]+k.rowHeight[A];k.rowHeight[L]=B,k.rowHeight[A]0)for(var Y=M;Y<=P;Y++)ee[0]+=this.grid[Y][B-1].length+this.grid[Y][B].length-1;if(P0)for(var Y=B;Y<=F;Y++)ee[3]+=this.grid[M-1][Y].length+this.grid[M][Y].length-1;for(var ce=w.MAX_VALUE,Z,ue,Q=0;Q{var u=l(551).FDLayoutNode,h=l(551).IMath;function f(p,m,g,y){u.call(this,p,m,g,y)}o(f,"CoSENode"),f.prototype=Object.create(u.prototype);for(var d in u)f[d]=u[d];f.prototype.calculateDisplacement=function(){var p=this.graphManager.getLayout();this.getChild()!=null&&this.fixedNodeWeight?(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=p.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=p.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementX=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementX)),Math.abs(this.displacementY)>p.coolingFactor*p.maxNodeDisplacement&&(this.displacementY=p.coolingFactor*p.maxNodeDisplacement*h.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},f.prototype.propogateDisplacementToChildren=function(p,m){for(var g=this.getChild().getNodes(),y,v=0;v{function u(g){if(Array.isArray(g)){for(var y=0,v=Array(g.length);y0){var ct=0;Ue.forEach(function(ot){Te=="horizontal"?(be.set(ot,x.has(ot)?b[x.get(ot)]:pe.get(ot)),ct+=be.get(ot)):(be.set(ot,x.has(ot)?T[x.get(ot)]:pe.get(ot)),ct+=be.get(ot))}),ct=ct/Ue.length,st.forEach(function(ot){W.has(ot)||be.set(ot,ct)})}else{var We=0;st.forEach(function(ot){Te=="horizontal"?We+=x.has(ot)?b[x.get(ot)]:pe.get(ot):We+=x.has(ot)?T[x.get(ot)]:pe.get(ot)}),We=We/st.length,st.forEach(function(ot){be.set(ot,We)})}});for(var qe=o(function(){var Ue=De.shift(),ct=V.get(Ue);ct.forEach(function(We){if(be.get(We.id)ot&&(ot=vt),ntYt&&(Yt=nt)}}catch(Dt){Mt=!0,bt=Dt}finally{try{!Tt&&ut.return&&ut.return()}finally{if(Mt)throw bt}}var pn=(ct+ot)/2-(We+Yt)/2,kt=!0,On=!1,tn=void 0;try{for(var Mr=st[Symbol.iterator](),Ir;!(kt=(Ir=Mr.next()).done);kt=!0){var Pn=Ir.value;be.set(Pn,be.get(Pn)+pn)}}catch(Dt){On=!0,tn=Dt}finally{try{!kt&&Mr.return&&Mr.return()}finally{if(On)throw tn}}})}return be},"findAppropriatePositionForRelativePlacement"),R=o(function(V){var Te=0,W=0,pe=0,ve=0;if(V.forEach(function(Ve){Ve.left?b[x.get(Ve.left)]-b[x.get(Ve.right)]>=0?Te++:W++:T[x.get(Ve.top)]-T[x.get(Ve.bottom)]>=0?pe++:ve++}),Te>W&&pe>ve)for(var Pe=0;PeW)for(var _e=0;_eve)for(var be=0;be1)y.fixedNodeConstraint.forEach(function(oe,V){I[V]=[oe.position.x,oe.position.y],M[V]=[b[x.get(oe.nodeId)],T[x.get(oe.nodeId)]]}),P=!0;else if(y.alignmentConstraint)(function(){var oe=0;if(y.alignmentConstraint.vertical){for(var V=y.alignmentConstraint.vertical,Te=o(function(be){var Ve=new Set;V[be].forEach(function(at){Ve.add(at)});var De=new Set([].concat(u(Ve)).filter(function(at){return F.has(at)})),qe=void 0;De.size>0?qe=b[x.get(De.values().next().value)]:qe=D(Ve).x,V[be].forEach(function(at){I[oe]=[qe,T[x.get(at)]],M[oe]=[b[x.get(at)],T[x.get(at)]],oe++})},"_loop2"),W=0;W0?qe=b[x.get(De.values().next().value)]:qe=D(Ve).y,pe[be].forEach(function(at){I[oe]=[b[x.get(at)],qe],M[oe]=[b[x.get(at)],T[x.get(at)]],oe++})},"_loop3"),Pe=0;PeK&&(K=U[Y].length,ee=Y);if(K<$.size/2)R(y.relativePlacementConstraint),P=!1,B=!1;else{var ce=new Map,Z=new Map,ue=[];U[ee].forEach(function(oe){z.get(oe).forEach(function(V){V.direction=="horizontal"?(ce.has(oe)?ce.get(oe).push(V):ce.set(oe,[V]),ce.has(V.id)||ce.set(V.id,[]),ue.push({left:oe,right:V.id})):(Z.has(oe)?Z.get(oe).push(V):Z.set(oe,[V]),Z.has(V.id)||Z.set(V.id,[]),ue.push({top:oe,bottom:V.id}))})}),R(ue),B=!1;var Q=O(ce,"horizontal"),j=O(Z,"vertical");U[ee].forEach(function(oe,V){M[V]=[b[x.get(oe)],T[x.get(oe)]],I[V]=[],Q.has(oe)?I[V][0]=Q.get(oe):I[V][0]=b[x.get(oe)],j.has(oe)?I[V][1]=j.get(oe):I[V][1]=T[x.get(oe)]}),P=!0}}if(P){for(var ne=void 0,te=d.transpose(I),he=d.transpose(M),le=0;le0){var Be={x:0,y:0};y.fixedNodeConstraint.forEach(function(oe,V){var Te={x:b[x.get(oe.nodeId)],y:T[x.get(oe.nodeId)]},W=oe.position,pe=C(W,Te);Be.x+=pe.x,Be.y+=pe.y}),Be.x/=y.fixedNodeConstraint.length,Be.y/=y.fixedNodeConstraint.length,b.forEach(function(oe,V){b[V]+=Be.x}),T.forEach(function(oe,V){T[V]+=Be.y}),y.fixedNodeConstraint.forEach(function(oe){b[x.get(oe.nodeId)]=oe.position.x,T[x.get(oe.nodeId)]=oe.position.y})}if(y.alignmentConstraint){if(y.alignmentConstraint.vertical)for(var He=y.alignmentConstraint.vertical,ze=o(function(V){var Te=new Set;He[V].forEach(function(ve){Te.add(ve)});var W=new Set([].concat(u(Te)).filter(function(ve){return F.has(ve)})),pe=void 0;W.size>0?pe=b[x.get(W.values().next().value)]:pe=D(Te).x,Te.forEach(function(ve){F.has(ve)||(b[x.get(ve)]=pe)})},"_loop4"),Le=0;Le0?pe=T[x.get(W.values().next().value)]:pe=D(Te).y,Te.forEach(function(ve){F.has(ve)||(T[x.get(ve)]=pe)})},"_loop5"),q=0;q{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(45);return i})()})});var Y2e=Pi((O4,e$)=>{"use strict";o(function(e,r){typeof O4=="object"&&typeof e$=="object"?e$.exports=r(JF()):typeof define=="function"&&define.amd?define(["cose-base"],r):typeof O4=="object"?O4.cytoscapeFcose=r(JF()):e.cytoscapeFcose=r(e.coseBase)},"webpackUniversalModuleDefinition")(O4,function(t){return(()=>{"use strict";var e={658:a=>{a.exports=Object.assign!=null?Object.assign.bind(Object):function(s){for(var l=arguments.length,u=Array(l>1?l-1:0),h=1;h{var u=function(){function d(p,m){var g=[],y=!0,v=!1,x=void 0;try{for(var b=p[Symbol.iterator](),T;!(y=(T=b.next()).done)&&(g.push(T.value),!(m&&g.length===m));y=!0);}catch(S){v=!0,x=S}finally{try{!y&&b.return&&b.return()}finally{if(v)throw x}}return g}return o(d,"sliceIterator"),function(p,m){if(Array.isArray(p))return p;if(Symbol.iterator in Object(p))return d(p,m);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),h=l(140).layoutBase.LinkedList,f={};f.getTopMostNodes=function(d){for(var p={},m=0;m0&&P.merge($)});for(var B=0;B1){T=x[0],S=T.connectedEdges().length,x.forEach(function(M){M.connectedEdges().length0&&g.set("dummy"+(g.size+1),_),C},f.relocateComponent=function(d,p,m){if(!m.fixedNodeConstraint){var g=Number.POSITIVE_INFINITY,y=Number.NEGATIVE_INFINITY,v=Number.POSITIVE_INFINITY,x=Number.NEGATIVE_INFINITY;if(m.quality=="draft"){var b=!0,T=!1,S=void 0;try{for(var w=p.nodeIndexes[Symbol.iterator](),E;!(b=(E=w.next()).done);b=!0){var _=E.value,C=u(_,2),D=C[0],O=C[1],R=m.cy.getElementById(D);if(R){var k=R.boundingBox(),L=p.xCoords[O]-k.w/2,A=p.xCoords[O]+k.w/2,I=p.yCoords[O]-k.h/2,M=p.yCoords[O]+k.h/2;Ly&&(y=A),Ix&&(x=M)}}}catch($){T=!0,S=$}finally{try{!b&&w.return&&w.return()}finally{if(T)throw S}}var P=d.x-(y+g)/2,B=d.y-(x+v)/2;p.xCoords=p.xCoords.map(function($){return $+P}),p.yCoords=p.yCoords.map(function($){return $+B})}else{Object.keys(p).forEach(function($){var U=p[$],K=U.getRect().x,ee=U.getRect().x+U.getRect().width,Y=U.getRect().y,ce=U.getRect().y+U.getRect().height;Ky&&(y=ee),Yx&&(x=ce)});var F=d.x-(y+g)/2,z=d.y-(x+v)/2;Object.keys(p).forEach(function($){var U=p[$];U.setCenter(U.getCenterX()+F,U.getCenterY()+z)})}}},f.calcBoundingBox=function(d,p,m,g){for(var y=Number.MAX_SAFE_INTEGER,v=Number.MIN_SAFE_INTEGER,x=Number.MAX_SAFE_INTEGER,b=Number.MIN_SAFE_INTEGER,T=void 0,S=void 0,w=void 0,E=void 0,_=d.descendants().not(":parent"),C=_.length,D=0;DT&&(y=T),vw&&(x=w),b{var u=l(548),h=l(140).CoSELayout,f=l(140).CoSENode,d=l(140).layoutBase.PointD,p=l(140).layoutBase.DimensionD,m=l(140).layoutBase.LayoutConstants,g=l(140).layoutBase.FDLayoutConstants,y=l(140).CoSEConstants,v=o(function(b,T){var S=b.cy,w=b.eles,E=w.nodes(),_=w.edges(),C=void 0,D=void 0,O=void 0,R={};b.randomize&&(C=T.nodeIndexes,D=T.xCoords,O=T.yCoords);var k=o(function($){return typeof $=="function"},"isFn"),L=o(function($,U){return k($)?$(U):$},"optFn"),A=u.calcParentsWithoutChildren(S,w),I=o(function z($,U,K,ee){for(var Y=U.length,ce=0;ce0){var te=void 0;te=K.getGraphManager().add(K.newGraph(),Q),z(te,ue,K,ee)}}},"processChildrenList"),M=o(function($,U,K){for(var ee=0,Y=0,ce=0;ce0?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=ee/Y:k(b.idealEdgeLength)?y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=50:y.DEFAULT_EDGE_LENGTH=g.DEFAULT_EDGE_LENGTH=b.idealEdgeLength,y.MIN_REPULSION_DIST=g.MIN_REPULSION_DIST=g.DEFAULT_EDGE_LENGTH/10,y.DEFAULT_RADIAL_SEPARATION=g.DEFAULT_EDGE_LENGTH)},"processEdges"),P=o(function($,U){U.fixedNodeConstraint&&($.constraints.fixedNodeConstraint=U.fixedNodeConstraint),U.alignmentConstraint&&($.constraints.alignmentConstraint=U.alignmentConstraint),U.relativePlacementConstraint&&($.constraints.relativePlacementConstraint=U.relativePlacementConstraint)},"processConstraints");b.nestingFactor!=null&&(y.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=g.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=b.nestingFactor),b.gravity!=null&&(y.DEFAULT_GRAVITY_STRENGTH=g.DEFAULT_GRAVITY_STRENGTH=b.gravity),b.numIter!=null&&(y.MAX_ITERATIONS=g.MAX_ITERATIONS=b.numIter),b.gravityRange!=null&&(y.DEFAULT_GRAVITY_RANGE_FACTOR=g.DEFAULT_GRAVITY_RANGE_FACTOR=b.gravityRange),b.gravityCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_STRENGTH=g.DEFAULT_COMPOUND_GRAVITY_STRENGTH=b.gravityCompound),b.gravityRangeCompound!=null&&(y.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=g.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=b.gravityRangeCompound),b.initialEnergyOnIncremental!=null&&(y.DEFAULT_COOLING_FACTOR_INCREMENTAL=g.DEFAULT_COOLING_FACTOR_INCREMENTAL=b.initialEnergyOnIncremental),b.tilingCompareBy!=null&&(y.TILING_COMPARE_BY=b.tilingCompareBy),b.quality=="proof"?m.QUALITY=2:m.QUALITY=0,y.NODE_DIMENSIONS_INCLUDE_LABELS=g.NODE_DIMENSIONS_INCLUDE_LABELS=m.NODE_DIMENSIONS_INCLUDE_LABELS=b.nodeDimensionsIncludeLabels,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!b.randomize,y.ANIMATE=g.ANIMATE=m.ANIMATE=b.animate,y.TILE=b.tile,y.TILING_PADDING_VERTICAL=typeof b.tilingPaddingVertical=="function"?b.tilingPaddingVertical.call():b.tilingPaddingVertical,y.TILING_PADDING_HORIZONTAL=typeof b.tilingPaddingHorizontal=="function"?b.tilingPaddingHorizontal.call():b.tilingPaddingHorizontal,y.DEFAULT_INCREMENTAL=g.DEFAULT_INCREMENTAL=m.DEFAULT_INCREMENTAL=!0,y.PURE_INCREMENTAL=!b.randomize,m.DEFAULT_UNIFORM_LEAF_NODE_SIZES=b.uniformNodeDimensions,b.step=="transformed"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!1),b.step=="enforced"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!1),b.step=="cose"&&(y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!1,y.APPLY_LAYOUT=!0),b.step=="all"&&(b.randomize?y.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:y.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,y.ENFORCE_CONSTRAINTS=!0,y.APPLY_LAYOUT=!0),b.fixedNodeConstraint||b.alignmentConstraint||b.relativePlacementConstraint?y.TREE_REDUCTION_ON_INCREMENTAL=!1:y.TREE_REDUCTION_ON_INCREMENTAL=!0;var B=new h,F=B.newGraphManager();return I(F.addRoot(),u.getTopMostNodes(E),B,b),M(B,F,_),P(B,b),B.runLayout(),R},"coseLayout");a.exports={coseLayout:v}},212:(a,s,l)=>{var u=function(){function b(T,S){for(var w=0;w0)if(M){var F=d.getTopMostNodes(w.eles.nodes());if(k=d.connectComponents(E,w.eles,F),k.forEach(function(se){var ae=se.boundingBox();L.push({x:ae.x1+ae.w/2,y:ae.y1+ae.h/2})}),w.randomize&&k.forEach(function(se){w.eles=se,C.push(m(w))}),w.quality=="default"||w.quality=="proof"){var z=E.collection();if(w.tile){var $=new Map,U=[],K=[],ee=0,Y={nodeIndexes:$,xCoords:U,yCoords:K},ce=[];if(k.forEach(function(se,ae){se.edges().length==0&&(se.nodes().forEach(function(Oe,ye){z.merge(se.nodes()[ye]),Oe.isParent()||(Y.nodeIndexes.set(se.nodes()[ye].id(),ee++),Y.xCoords.push(se.nodes()[0].position().x),Y.yCoords.push(se.nodes()[0].position().y))}),ce.push(ae))}),z.length>1){var Z=z.boundingBox();L.push({x:Z.x1+Z.w/2,y:Z.y1+Z.h/2}),k.push(z),C.push(Y);for(var ue=ce.length-1;ue>=0;ue--)k.splice(ce[ue],1),C.splice(ce[ue],1),L.splice(ce[ue],1)}}k.forEach(function(se,ae){w.eles=se,R.push(y(w,C[ae])),d.relocateComponent(L[ae],R[ae],w)})}else k.forEach(function(se,ae){d.relocateComponent(L[ae],C[ae],w)});var Q=new Set;if(k.length>1){var j=[],ne=_.filter(function(se){return se.css("display")=="none"});k.forEach(function(se,ae){var Oe=void 0;if(w.quality=="draft"&&(Oe=C[ae].nodeIndexes),se.nodes().not(ne).length>0){var ye={};ye.edges=[],ye.nodes=[];var Be=void 0;se.nodes().not(ne).forEach(function(He){if(w.quality=="draft")if(!He.isParent())Be=Oe.get(He.id()),ye.nodes.push({x:C[ae].xCoords[Be]-He.boundingbox().w/2,y:C[ae].yCoords[Be]-He.boundingbox().h/2,width:He.boundingbox().w,height:He.boundingbox().h});else{var ze=d.calcBoundingBox(He,C[ae].xCoords,C[ae].yCoords,Oe);ye.nodes.push({x:ze.topLeftX,y:ze.topLeftY,width:ze.width,height:ze.height})}else R[ae][He.id()]&&ye.nodes.push({x:R[ae][He.id()].getLeft(),y:R[ae][He.id()].getTop(),width:R[ae][He.id()].getWidth(),height:R[ae][He.id()].getHeight()})}),se.edges().forEach(function(He){var ze=He.source(),Le=He.target();if(ze.css("display")!="none"&&Le.css("display")!="none")if(w.quality=="draft"){var Ie=Oe.get(ze.id()),xe=Oe.get(Le.id()),q=[],de=[];if(ze.isParent()){var ie=d.calcBoundingBox(ze,C[ae].xCoords,C[ae].yCoords,Oe);q.push(ie.topLeftX+ie.width/2),q.push(ie.topLeftY+ie.height/2)}else q.push(C[ae].xCoords[Ie]),q.push(C[ae].yCoords[Ie]);if(Le.isParent()){var oe=d.calcBoundingBox(Le,C[ae].xCoords,C[ae].yCoords,Oe);de.push(oe.topLeftX+oe.width/2),de.push(oe.topLeftY+oe.height/2)}else de.push(C[ae].xCoords[xe]),de.push(C[ae].yCoords[xe]);ye.edges.push({startX:q[0],startY:q[1],endX:de[0],endY:de[1]})}else R[ae][ze.id()]&&R[ae][Le.id()]&&ye.edges.push({startX:R[ae][ze.id()].getCenterX(),startY:R[ae][ze.id()].getCenterY(),endX:R[ae][Le.id()].getCenterX(),endY:R[ae][Le.id()].getCenterY()})}),ye.nodes.length>0&&(j.push(ye),Q.add(ae))}});var te=I.packComponents(j,w.randomize).shifts;if(w.quality=="draft")C.forEach(function(se,ae){var Oe=se.xCoords.map(function(Be){return Be+te[ae].dx}),ye=se.yCoords.map(function(Be){return Be+te[ae].dy});se.xCoords=Oe,se.yCoords=ye});else{var he=0;Q.forEach(function(se){Object.keys(R[se]).forEach(function(ae){var Oe=R[se][ae];Oe.setCenter(Oe.getCenterX()+te[he].dx,Oe.getCenterY()+te[he].dy)}),he++})}}}else{var P=w.eles.boundingBox();if(L.push({x:P.x1+P.w/2,y:P.y1+P.h/2}),w.randomize){var B=m(w);C.push(B)}w.quality=="default"||w.quality=="proof"?(R.push(y(w,C[0])),d.relocateComponent(L[0],R[0],w)):d.relocateComponent(L[0],C[0],w)}var le=o(function(ae,Oe){if(w.quality=="default"||w.quality=="proof"){typeof ae=="number"&&(ae=Oe);var ye=void 0,Be=void 0,He=ae.data("id");return R.forEach(function(Le){He in Le&&(ye={x:Le[He].getRect().getCenterX(),y:Le[He].getRect().getCenterY()},Be=Le[He])}),w.nodeDimensionsIncludeLabels&&(Be.labelWidth&&(Be.labelPosHorizontal=="left"?ye.x+=Be.labelWidth/2:Be.labelPosHorizontal=="right"&&(ye.x-=Be.labelWidth/2)),Be.labelHeight&&(Be.labelPosVertical=="top"?ye.y+=Be.labelHeight/2:Be.labelPosVertical=="bottom"&&(ye.y-=Be.labelHeight/2))),ye==null&&(ye={x:ae.position("x"),y:ae.position("y")}),{x:ye.x,y:ye.y}}else{var ze=void 0;return C.forEach(function(Le){var Ie=Le.nodeIndexes.get(ae.id());Ie!=null&&(ze={x:Le.xCoords[Ie],y:Le.yCoords[Ie]})}),ze==null&&(ze={x:ae.position("x"),y:ae.position("y")}),{x:ze.x,y:ze.y}}},"getPositions");if(w.quality=="default"||w.quality=="proof"||w.randomize){var J=d.calcParentsWithoutChildren(E,_),Se=_.filter(function(se){return se.css("display")=="none"});w.eles=_.not(Se),_.nodes().not(":parent").not(Se).layoutPositions(S,w,le),J.length>0&&J.forEach(function(se){se.position(le(se))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")},"run")}]),b}();a.exports=x},657:(a,s,l)=>{var u=l(548),h=l(140).layoutBase.Matrix,f=l(140).layoutBase.SVD,d=o(function(m){var g=m.cy,y=m.eles,v=y.nodes(),x=y.nodes(":parent"),b=new Map,T=new Map,S=new Map,w=[],E=[],_=[],C=[],D=[],O=[],R=[],k=[],L=void 0,A=void 0,I=1e8,M=1e-9,P=m.piTol,B=m.samplingType,F=m.nodeSeparation,z=void 0,$=o(function(){for(var Te=0,W=0,pe=!1;W=Pe;){be=ve[Pe++];for(var st=w[be],Ue=0;Ueqe&&(qe=D[We],at=We)}return at},"BFS"),K=o(function(Te){var W=void 0;if(Te){W=Math.floor(Math.random()*A),L=W;for(var ve=0;ve=1)break;qe=De}for(var st=0;st=1)break;qe=De}for(var ct=0;ct0&&(W.isParent()?w[Te].push(S.get(W.id())):w[Te].push(W.id()))})});var J=o(function(Te){var W=T.get(Te),pe=void 0;b.get(Te).forEach(function(ve){g.getElementById(ve).isParent()?pe=S.get(ve):pe=ve,w[W].push(pe),w[T.get(pe)].push(Te)})},"_loop"),Se=!0,se=!1,ae=void 0;try{for(var Oe=b.keys()[Symbol.iterator](),ye;!(Se=(ye=Oe.next()).done);Se=!0){var Be=ye.value;J(Be)}}catch(V){se=!0,ae=V}finally{try{!Se&&Oe.return&&Oe.return()}finally{if(se)throw ae}}A=T.size;var He=void 0;if(A>2){z=A{var u=l(212),h=o(function(d){d&&d("layout","fcose",u)},"register");typeof cytoscape<"u"&&h(cytoscape),a.exports=h},140:a=>{a.exports=t}},r={};function n(a){var s=r[a];if(s!==void 0)return s.exports;var l=r[a]={exports:{}};return e[a](l,l.exports,n),l.exports}o(n,"__webpack_require__");var i=n(579);return i})()})});var xy,l0,t$=N(()=>{"use strict";jl();xy=o(t=>`${t}`,"wrapIcon"),l0={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:xy('')},server:{body:xy('')},disk:{body:xy('')},internet:{body:xy('')},cloud:{body:xy('')},unknown:t7,blank:{body:xy("")}}}});var X2e,j2e,K2e,Q2e,Z2e=N(()=>{"use strict";jl();Gt();ao();N4();t$();AC();X2e=o(async function(t,e){let r=Mi("padding"),n=Mi("iconSize"),i=n/2,a=n/6,s=a/2;await Promise.all(e.edges().map(async l=>{let{source:u,sourceDir:h,sourceArrow:f,sourceGroup:d,target:p,targetDir:m,targetArrow:g,targetGroup:y,label:v}=CC(l),{x,y:b}=l[0].sourceEndpoint(),{x:T,y:S}=l[0].midpoint(),{x:w,y:E}=l[0].targetEndpoint(),_=r+4;if(d&&(ja(h)?x+=h==="L"?-_:_:b+=h==="T"?-_:_+18),y&&(ja(m)?w+=m==="L"?-_:_:E+=m==="T"?-_:_+18),!d&&o0.getNode(u)?.type==="junction"&&(ja(h)?x+=h==="L"?i:-i:b+=h==="T"?i:-i),!y&&o0.getNode(p)?.type==="junction"&&(ja(m)?w+=m==="L"?i:-i:E+=m==="T"?i:-i),l[0]._private.rscratch){let C=t.insert("g");if(C.insert("path").attr("d",`M ${x},${b} L ${T},${S} L${w},${E} `).attr("class","edge"),f){let D=ja(h)?D4[h](x,a):x-s,O=ru(h)?D4[h](b,a):b-s;C.insert("polygon").attr("points",YF[h](a)).attr("transform",`translate(${D},${O})`).attr("class","arrow")}if(g){let D=ja(m)?D4[m](w,a):w-s,O=ru(m)?D4[m](E,a):E-s;C.insert("polygon").attr("points",YF[m](a)).attr("transform",`translate(${D},${O})`).attr("class","arrow")}if(v){let D=L4(h,m)?"XY":ja(h)?"X":"Y",O=0;D==="X"?O=Math.abs(x-w):D==="Y"?O=Math.abs(b-E)/1.5:O=Math.abs(x-w)/2;let R=C.append("g");if(await qn(R,v,{useHtmlLabels:!1,width:O,classes:"architecture-service-label"},me()),R.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),D==="X")R.attr("transform","translate("+T+", "+S+")");else if(D==="Y")R.attr("transform","translate("+T+", "+S+") rotate(-90)");else if(D==="XY"){let k=R4(h,m);if(k&&O2e(k)){let L=R.node().getBoundingClientRect(),[A,I]=B2e(k);R.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*A*I*45})`);let M=R.node().getBoundingClientRect();R.attr("transform",` - translate(${T}, ${S-L.height/2}) - translate(${A*M.width/2}, ${I*M.height/2}) - rotate(${-1*A*I*45}, 0, ${L.height/2}) - `)}}}}}))},"drawEdges"),j2e=o(async function(t,e){let n=Mi("padding")*.75,i=Mi("fontSize"),s=Mi("iconSize")/2;await Promise.all(e.nodes().map(async l=>{let u=Yf(l);if(u.type==="group"){let{h,w:f,x1:d,y1:p}=l.boundingBox();t.append("rect").attr("x",d+s).attr("y",p+s).attr("width",f).attr("height",h).attr("class","node-bkg");let m=t.append("g"),g=d,y=p;if(u.icon){let v=m.append("g");v.html(`${await Es(u.icon,{height:n,width:n,fallbackPrefix:l0.prefix})}`),v.attr("transform","translate("+(g+s+1)+", "+(y+s+1)+")"),g+=n,y+=i/2-1-2}if(u.label){let v=m.append("g");await qn(v,u.label,{useHtmlLabels:!1,width:f,classes:"architecture-service-label"},me()),v.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),v.attr("transform","translate("+(g+s+4)+", "+(y+s+2)+")")}}}))},"drawGroups"),K2e=o(async function(t,e,r){for(let n of r){let i=e.append("g"),a=Mi("iconSize");if(n.title){let h=i.append("g");await qn(h,n.title,{useHtmlLabels:!1,width:a*1.5,classes:"architecture-service-label"},me()),h.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),h.attr("transform","translate("+a/2+", "+a+")")}let s=i.append("g");if(n.icon)s.html(`${await Es(n.icon,{height:a,width:a,fallbackPrefix:l0.prefix})}`);else if(n.iconText){s.html(`${await Es("blank",{height:a,width:a,fallbackPrefix:l0.prefix})}`);let d=s.append("g").append("foreignObject").attr("width",a).attr("height",a).append("div").attr("class","node-icon-text").attr("style",`height: ${a}px;`).append("div").html(n.iconText),p=parseInt(window.getComputedStyle(d.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;d.attr("style",`-webkit-line-clamp: ${Math.floor((a-2)/p)};`)}else s.append("path").attr("class","node-bkg").attr("id","node-"+n.id).attr("d",`M0 ${a} v${-a} q0,-5 5,-5 h${a} q5,0 5,5 v${a} H0 Z`);i.attr("class","architecture-service");let{width:l,height:u}=i._groups[0][0].getBBox();n.width=l,n.height=u,t.setElementForId(n.id,i)}return 0},"drawServices"),Q2e=o(function(t,e,r){r.forEach(n=>{let i=e.append("g"),a=Mi("iconSize");i.append("g").append("rect").attr("id","node-"+n.id).attr("fill-opacity","0").attr("width",a).attr("height",a),i.attr("class","architecture-junction");let{width:l,height:u}=i._groups[0][0].getBBox();i.width=l,i.height=u,t.setElementForId(n.id,i)})},"drawJunctions")});function Hnt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"service",id:r.id,icon:r.icon,label:r.title,parent:r.in,width:Mi("iconSize"),height:Mi("iconSize")},classes:"node-service"})})}function Wnt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"junction",id:r.id,parent:r.in,width:Mi("iconSize"),height:Mi("iconSize")},classes:"node-junction"})})}function qnt(t,e){e.nodes().map(r=>{let n=Yf(r);if(n.type==="group")return;n.x=r.position().x,n.y=r.position().y,t.getElementById(n.id).attr("transform","translate("+(n.x||0)+","+(n.y||0)+")")})}function Ynt(t,e){t.forEach(r=>{e.add({group:"nodes",data:{type:"group",id:r.id,icon:r.icon,label:r.title,parent:r.in},classes:"node-group"})})}function Xnt(t,e){t.forEach(r=>{let{lhsId:n,rhsId:i,lhsInto:a,lhsGroup:s,rhsInto:l,lhsDir:u,rhsDir:h,rhsGroup:f,title:d}=r,p=L4(r.lhsDir,r.rhsDir)?"segments":"straight",m={id:`${n}-${i}`,label:d,source:n,sourceDir:u,sourceArrow:a,sourceGroup:s,sourceEndpoint:u==="L"?"0 50%":u==="R"?"100% 50%":u==="T"?"50% 0":"50% 100%",target:i,targetDir:h,targetArrow:l,targetGroup:f,targetEndpoint:h==="L"?"0 50%":h==="R"?"100% 50%":h==="T"?"50% 0":"50% 100%"};e.add({group:"edges",data:m,classes:p})})}function jnt(t,e,r){let n=o((l,u)=>Object.entries(l).reduce((h,[f,d])=>{let p=0,m=Object.entries(d);if(m.length===1)return h[f]=m[0][1],h;for(let g=0;g{let u={},h={};return Object.entries(l).forEach(([f,[d,p]])=>{let m=t.getNode(f)?.in??"default";u[p]??={},u[p][m]??=[],u[p][m].push(f),h[d]??={},h[d][m]??=[],h[d][m].push(f)}),{horiz:Object.values(n(u,"horizontal")).filter(f=>f.length>1),vert:Object.values(n(h,"vertical")).filter(f=>f.length>1)}}),[a,s]=i.reduce(([l,u],{horiz:h,vert:f})=>[[...l,...h],[...u,...f]],[[],[]]);return{horizontal:a,vertical:s}}function Knt(t){let e=[],r=o(i=>`${i[0]},${i[1]}`,"posToStr"),n=o(i=>i.split(",").map(a=>parseInt(a)),"strToPos");return t.forEach(i=>{let a=Object.fromEntries(Object.entries(i).map(([h,f])=>[r(f),h])),s=[r([0,0])],l={},u={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;s.length>0;){let h=s.shift();if(h){l[h]=1;let f=a[h];if(f){let d=n(h);Object.entries(u).forEach(([p,m])=>{let g=r([d[0]+m[0],d[1]+m[1]]),y=a[g];y&&!l[g]&&(s.push(g),e.push({[qF[p]]:y,[qF[I2e(p)]]:f,gap:1.5*Mi("iconSize")}))})}}}}),e}function Qnt(t,e,r,n,i,{spatialMaps:a,groupAlignments:s}){return new Promise(l=>{let u=Ge("body").append("div").attr("id","cy").attr("style","display:none"),h=sl({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${Mi("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${Mi("padding")}px`}}],layout:{name:"grid",boundingBox:{x1:0,x2:100,y1:0,y2:100}}});u.remove(),Ynt(r,h),Hnt(t,h),Wnt(e,h),Xnt(n,h);let f=jnt(i,a,s),d=Knt(a),p=h.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(m){let[g,y]=m.connectedNodes(),{parent:v}=Yf(g),{parent:x}=Yf(y);return v===x?1.5*Mi("iconSize"):.5*Mi("iconSize")},edgeElasticity(m){let[g,y]=m.connectedNodes(),{parent:v}=Yf(g),{parent:x}=Yf(y);return v===x?.45:.001},alignmentConstraint:f,relativePlacementConstraint:d});p.one("layoutstop",()=>{function m(g,y,v,x){let b,T,{x:S,y:w}=g,{x:E,y:_}=y;T=(x-w+(S-v)*(w-_)/(S-E))/Math.sqrt(1+Math.pow((w-_)/(S-E),2)),b=Math.sqrt(Math.pow(x-w,2)+Math.pow(v-S,2)-Math.pow(T,2));let C=Math.sqrt(Math.pow(E-S,2)+Math.pow(_-w,2));b=b/C;let D=(E-S)*(x-w)-(_-w)*(v-S);switch(!0){case D>=0:D=1;break;case D<0:D=-1;break}let O=(E-S)*(v-S)+(_-w)*(x-w);switch(!0){case O>=0:O=1;break;case O<0:O=-1;break}return T=Math.abs(T)*D,b=b*O,{distances:T,weights:b}}o(m,"getSegmentWeights"),h.startBatch();for(let g of Object.values(h.edges()))if(g.data?.()){let{x:y,y:v}=g.source().position(),{x,y:b}=g.target().position();if(y!==x&&v!==b){let T=g.sourceEndpoint(),S=g.targetEndpoint(),{sourceDir:w}=CC(g),[E,_]=ru(w)?[T.x,S.y]:[S.x,T.y],{weights:C,distances:D}=m(T,S,E,_);g.style("segment-distances",D),g.style("segment-weights",C)}}h.endBatch(),p.run()}),p.run(),h.ready(m=>{X.info("Ready",m),l(h)})})}var J2e,Znt,exe,txe=N(()=>{"use strict";jl();oF();J2e=Aa(Y2e(),1);fr();yt();Vl();xi();N4();t$();AC();Z2e();X4([{name:l0.prefix,icons:l0}]);sl.use(J2e.default);o(Hnt,"addServices");o(Wnt,"addJunctions");o(qnt,"positionNodes");o(Ynt,"addGroups");o(Xnt,"addEdges");o(jnt,"getAlignments");o(Knt,"getRelativeConstraints");o(Qnt,"layoutArchitecture");Znt=o(async(t,e,r,n)=>{let i=n.db,a=i.getServices(),s=i.getJunctions(),l=i.getGroups(),u=i.getEdges(),h=i.getDataStructures(),f=Li(e),d=f.append("g");d.attr("class","architecture-edges");let p=f.append("g");p.attr("class","architecture-services");let m=f.append("g");m.attr("class","architecture-groups"),await K2e(i,p,a),Q2e(i,p,s);let g=await Qnt(a,s,l,u,i,h);await X2e(d,g),await j2e(m,g),qnt(i,g),Lo(void 0,f,Mi("padding"),Mi("useMaxWidth"))},"draw"),exe={draw:Znt}});var rxe={};ur(rxe,{diagram:()=>Jnt});var Jnt,nxe=N(()=>{"use strict";H2e();N4();q2e();txe();Jnt={parser:U2e,db:o0,renderer:exe,styles:W2e}});var by,r$=N(()=>{"use strict";_a();mi();er();zt();ci();by=class{constructor(){this.nodes=[];this.levels=new Map;this.outerNodes=[];this.classes=new Map;this.setAccTitle=Ar;this.getAccTitle=Dr;this.setDiagramTitle=Or;this.getDiagramTitle=Nr;this.getAccDescription=Rr;this.setAccDescription=Lr}static{o(this,"TreeMapDB")}getNodes(){return this.nodes}getConfig(){let e=or,r=tr();return $n({...e.treemap,...r.treemap??{}})}addNode(e,r){this.nodes.push(e),this.levels.set(e,r),r===0&&(this.outerNodes.push(e),this.root??=e)}getRoot(){return{name:"",children:this.outerNodes}}addClass(e,r){let n=this.classes.get(e)??{id:e,styles:[],textStyles:[]},i=r.replace(/\\,/g,"\xA7\xA7\xA7").replace(/,/g,";").replace(/§§§/g,",").split(";");i&&i.forEach(a=>{S2(a)&&(n?.textStyles?n.textStyles.push(a):n.textStyles=[a]),n?.styles?n.styles.push(a):n.styles=[a]}),this.classes.set(e,n)}getClasses(){return this.classes}getStylesForClass(e){return this.classes.get(e)?.styles??[]}clear(){kr(),this.nodes=[],this.levels=new Map,this.outerNodes=[],this.classes=new Map,this.root=void 0}}});function sxe(t){if(!t.length)return[];let e=[],r=[];return t.forEach(n=>{let i={name:n.name,children:n.type==="Leaf"?void 0:[]};for(i.classSelector=n?.classSelector,n?.cssCompiledStyles&&(i.cssCompiledStyles=[n.cssCompiledStyles]),n.type==="Leaf"&&n.value!==void 0&&(i.value=n.value);r.length>0&&r[r.length-1].level>=n.level;)r.pop();if(r.length===0)e.push(i);else{let a=r[r.length-1].node;a.children?a.children.push(i):a.children=[i]}n.type!=="Leaf"&&r.push({node:i,level:n.level})}),e}var oxe=N(()=>{"use strict";o(sxe,"buildHierarchy")});var nit,iit,n$,lxe=N(()=>{"use strict";bf();yt();Mp();oxe();r$();nit=o((t,e)=>{Jo(t,e);let r=[];for(let a of t.TreemapRows??[])a.$type==="ClassDefStatement"&&e.addClass(a.className??"",a.styleText??"");for(let a of t.TreemapRows??[]){let s=a.item;if(!s)continue;let l=a.indent?parseInt(a.indent):0,u=iit(s),h=s.classSelector?e.getStylesForClass(s.classSelector):[],f=h.length>0?h.join(";"):void 0,d={level:l,name:u,type:s.$type,value:s.value,classSelector:s.classSelector,cssCompiledStyles:f};r.push(d)}let n=sxe(r),i=o((a,s)=>{for(let l of a)e.addNode(l,s),l.children&&l.children.length>0&&i(l.children,s+1)},"addNodesRecursively");i(n,0)},"populate"),iit=o(t=>t.name?String(t.name):"","getItemName"),n$={parser:{yy:void 0},parse:o(async t=>{try{let r=await vs("treemap",t);X.debug("Treemap AST:",r);let n=n$.parser?.yy;if(!(n instanceof by))throw new Error("parser.parser?.yy was not a TreemapDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");nit(r,n)}catch(e){throw X.error("Error parsing treemap:",e),e}},"parse")}});var ait,Ty,P4,sit,oit,cxe,uxe=N(()=>{"use strict";Vl();np();xi();fr();zt();mi();yt();ait=10,Ty=10,P4=25,sit=o((t,e,r,n)=>{let i=n.db,a=i.getConfig(),s=a.padding??ait,l=i.getDiagramTitle(),u=i.getRoot(),{themeVariables:h}=tr();if(!u)return;let f=l?30:0,d=Li(e),p=a.nodeWidth?a.nodeWidth*Ty:960,m=a.nodeHeight?a.nodeHeight*Ty:500,g=p,y=m+f;d.attr("viewBox",`0 0 ${g} ${y}`),fn(d,y,g,a.useMaxWidth);let v;try{let A=a.valueFormat||",";if(A==="$0,0")v=o(I=>"$"+cc(",")(I),"valueFormat");else if(A.startsWith("$")&&A.includes(",")){let I=/\.\d+/.exec(A),M=I?I[0]:"";v=o(P=>"$"+cc(","+M)(P),"valueFormat")}else if(A.startsWith("$")){let I=A.substring(1);v=o(M=>"$"+cc(I||"")(M),"valueFormat")}else v=cc(A)}catch(A){X.error("Error creating format function:",A),v=cc(",")}let x=Js().range(["transparent",h.cScale0,h.cScale1,h.cScale2,h.cScale3,h.cScale4,h.cScale5,h.cScale6,h.cScale7,h.cScale8,h.cScale9,h.cScale10,h.cScale11]),b=Js().range(["transparent",h.cScalePeer0,h.cScalePeer1,h.cScalePeer2,h.cScalePeer3,h.cScalePeer4,h.cScalePeer5,h.cScalePeer6,h.cScalePeer7,h.cScalePeer8,h.cScalePeer9,h.cScalePeer10,h.cScalePeer11]),T=Js().range([h.cScaleLabel0,h.cScaleLabel1,h.cScaleLabel2,h.cScaleLabel3,h.cScaleLabel4,h.cScaleLabel5,h.cScaleLabel6,h.cScaleLabel7,h.cScaleLabel8,h.cScaleLabel9,h.cScaleLabel10,h.cScaleLabel11]);l&&d.append("text").attr("x",g/2).attr("y",f/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(l);let S=d.append("g").attr("transform",`translate(0, ${f})`).attr("class","treemapContainer"),w=z0(u).sum(A=>A.value??0).sort((A,I)=>(I.value??0)-(A.value??0)),_=D5().size([p,m]).paddingTop(A=>A.children&&A.children.length>0?P4+Ty:0).paddingInner(s).paddingLeft(A=>A.children&&A.children.length>0?Ty:0).paddingRight(A=>A.children&&A.children.length>0?Ty:0).paddingBottom(A=>A.children&&A.children.length>0?Ty:0).round(!0)(w),C=_.descendants().filter(A=>A.children&&A.children.length>0),D=S.selectAll(".treemapSection").data(C).enter().append("g").attr("class","treemapSection").attr("transform",A=>`translate(${A.x0},${A.y0})`);D.append("rect").attr("width",A=>A.x1-A.x0).attr("height",P4).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",A=>A.depth===0?"display: none;":""),D.append("clipPath").attr("id",(A,I)=>`clip-section-${e}-${I}`).append("rect").attr("width",A=>Math.max(0,A.x1-A.x0-12)).attr("height",P4),D.append("rect").attr("width",A=>A.x1-A.x0).attr("height",A=>A.y1-A.y0).attr("class",(A,I)=>`treemapSection section${I}`).attr("fill",A=>x(A.data.name)).attr("fill-opacity",.6).attr("stroke",A=>b(A.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",A=>{if(A.depth===0)return"display: none;";let I=Ye({cssCompiledStyles:A.data.cssCompiledStyles});return I.nodeStyles+";"+I.borderStyles.join(";")}),D.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",P4/2).attr("dominant-baseline","middle").text(A=>A.depth===0?"":A.data.name).attr("font-weight","bold").attr("style",A=>{if(A.depth===0)return"display: none;";let I="dominant-baseline: middle; font-size: 12px; fill:"+T(A.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=Ye({cssCompiledStyles:A.data.cssCompiledStyles});return I+M.labelStyles.replace("color:","fill:")}).each(function(A){if(A.depth===0)return;let I=Ge(this),M=A.data.name;I.text(M);let P=A.x1-A.x0,B=6,F;a.showValues!==!1&&A.value?F=P-10-30-10-B:F=P-B-6;let $=Math.max(15,F),U=I.node();if(U.getComputedTextLength()>$){let ee="...",Y=M;for(;Y.length>0;){if(Y=M.substring(0,Y.length-1),Y.length===0){I.text(ee),U.getComputedTextLength()>$&&I.text("");break}if(I.text(Y+ee),U.getComputedTextLength()<=$)break}}}),a.showValues!==!1&&D.append("text").attr("class","treemapSectionValue").attr("x",A=>A.x1-A.x0-10).attr("y",P4/2).attr("text-anchor","end").attr("dominant-baseline","middle").text(A=>A.value?v(A.value):"").attr("font-style","italic").attr("style",A=>{if(A.depth===0)return"display: none;";let I="text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+T(A.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;",M=Ye({cssCompiledStyles:A.data.cssCompiledStyles});return I+M.labelStyles.replace("color:","fill:")});let O=_.leaves(),R=S.selectAll(".treemapLeafGroup").data(O).enter().append("g").attr("class",(A,I)=>`treemapNode treemapLeafGroup leaf${I}${A.data.classSelector?` ${A.data.classSelector}`:""}x`).attr("transform",A=>`translate(${A.x0},${A.y0})`);R.append("rect").attr("width",A=>A.x1-A.x0).attr("height",A=>A.y1-A.y0).attr("class","treemapLeaf").attr("fill",A=>A.parent?x(A.parent.data.name):x(A.data.name)).attr("style",A=>Ye({cssCompiledStyles:A.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",A=>A.parent?x(A.parent.data.name):x(A.data.name)).attr("stroke-width",3),R.append("clipPath").attr("id",(A,I)=>`clip-${e}-${I}`).append("rect").attr("width",A=>Math.max(0,A.x1-A.x0-4)).attr("height",A=>Math.max(0,A.y1-A.y0-4)),R.append("text").attr("class","treemapLabel").attr("x",A=>(A.x1-A.x0)/2).attr("y",A=>(A.y1-A.y0)/2).attr("style",A=>{let I="text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+T(A.data.name)+";",M=Ye({cssCompiledStyles:A.data.cssCompiledStyles});return I+M.labelStyles.replace("color:","fill:")}).attr("clip-path",(A,I)=>`url(#clip-${e}-${I})`).text(A=>A.data.name).each(function(A){let I=Ge(this),M=A.x1-A.x0,P=A.y1-A.y0,B=I.node(),F=4,z=M-2*F,$=P-2*F;if(z<10||$<10){I.style("display","none");return}let U=parseInt(I.style("font-size"),10),K=8,ee=28,Y=.6,ce=6,Z=2;for(;B.getComputedTextLength()>z&&U>K;)U--,I.style("font-size",`${U}px`);let ue=Math.max(ce,Math.min(ee,Math.round(U*Y))),Q=U+Z+ue;for(;Q>$&&U>K&&(U--,ue=Math.max(ce,Math.min(ee,Math.round(U*Y))),!(ue$;I.style("font-size",`${U}px`),(B.getComputedTextLength()>z||U(I.x1-I.x0)/2).attr("y",function(I){return(I.y1-I.y0)/2}).attr("style",I=>{let M="text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+T(I.data.name)+";",P=Ye({cssCompiledStyles:I.data.cssCompiledStyles});return M+P.labelStyles.replace("color:","fill:")}).attr("clip-path",(I,M)=>`url(#clip-${e}-${M})`).text(I=>I.value?v(I.value):"").each(function(I){let M=Ge(this),P=this.parentNode;if(!P){M.style("display","none");return}let B=Ge(P).select(".treemapLabel");if(B.empty()||B.style("display")==="none"){M.style("display","none");return}let F=parseFloat(B.style("font-size")),z=28,$=.6,U=6,K=2,ee=Math.max(U,Math.min(z,Math.round(F*$)));M.style("font-size",`${ee}px`);let ce=(I.y1-I.y0)/2+F/2+K;M.attr("y",ce);let Z=I.x1-I.x0,j=I.y1-I.y0-4,ne=Z-2*4;M.node().getComputedTextLength()>ne||ce+ee>j||ee{"use strict";er();lit={sectionStrokeColor:"black",sectionStrokeWidth:"1",sectionFillColor:"#efefef",leafStrokeColor:"black",leafStrokeWidth:"1",leafFillColor:"#efefef",labelColor:"black",labelFontSize:"12px",valueFontSize:"10px",valueColor:"black",titleColor:"black",titleFontSize:"14px"},cit=o(({treemap:t}={})=>{let e=$n(lit,t);return` - .treemapNode.section { - stroke: ${e.sectionStrokeColor}; - stroke-width: ${e.sectionStrokeWidth}; - fill: ${e.sectionFillColor}; - } - .treemapNode.leaf { - stroke: ${e.leafStrokeColor}; - stroke-width: ${e.leafStrokeWidth}; - fill: ${e.leafFillColor}; - } - .treemapLabel { - fill: ${e.labelColor}; - font-size: ${e.labelFontSize}; - } - .treemapValue { - fill: ${e.valueColor}; - font-size: ${e.valueFontSize}; - } - .treemapTitle { - fill: ${e.titleColor}; - font-size: ${e.titleFontSize}; - } - `},"getStyles"),hxe=cit});var dxe={};ur(dxe,{diagram:()=>uit});var uit,pxe=N(()=>{"use strict";r$();lxe();uxe();fxe();uit={parser:n$,get db(){return new by},renderer:cxe,styles:hxe}});var Kit={};ur(Kit,{default:()=>jit});jl();r7();rd();var cK="c4",lAe=o(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),cAe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(lK(),oK));return{id:cK,diagram:t}},"loader"),uAe={id:cK,detector:lAe,loader:cAe},uK=uAe;var use="flowchart",qPe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-wrapper"||e?.flowchart?.defaultRenderer==="elk"?!1:/^\s*graph/.test(t),"detector"),YPe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bk(),xk));return{id:use,diagram:t}},"loader"),XPe={id:use,detector:qPe,loader:YPe},hse=XPe;var fse="flowchart-v2",jPe=o((t,e)=>e?.flowchart?.defaultRenderer==="dagre-d3"?!1:(e?.flowchart?.defaultRenderer==="elk"&&(e.layout="elk"),/^\s*graph/.test(t)&&e?.flowchart?.defaultRenderer==="dagre-wrapper"?!0:/^\s*flowchart/.test(t)),"detector"),KPe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bk(),xk));return{id:fse,diagram:t}},"loader"),QPe={id:fse,detector:jPe,loader:KPe},dse=QPe;var wse="er",rBe=o(t=>/^\s*erDiagram/.test(t),"detector"),nBe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Tse(),bse));return{id:wse,diagram:t}},"loader"),iBe={id:wse,detector:rBe,loader:nBe},kse=iBe;var Lhe="gitGraph",IGe=o(t=>/^\s*gitGraph/.test(t),"detector"),OGe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Dhe(),_he));return{id:Lhe,diagram:t}},"loader"),PGe={id:Lhe,detector:IGe,loader:OGe},Rhe=PGe;var ofe="gantt",kVe=o(t=>/^\s*gantt/.test(t),"detector"),EVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(sfe(),afe));return{id:ofe,diagram:t}},"loader"),SVe={id:ofe,detector:kVe,loader:EVe},lfe=SVe;var yfe="info",RVe=o(t=>/^\s*info/.test(t),"detector"),NVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(gfe(),mfe));return{id:yfe,diagram:t}},"loader"),vfe={id:yfe,detector:RVe,loader:NVe};var _fe="pie",WVe=o(t=>/^\s*pie/.test(t),"detector"),qVe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Afe(),Cfe));return{id:_fe,diagram:t}},"loader"),Dfe={id:_fe,detector:WVe,loader:qVe};var Vfe="quadrantChart",uUe=o(t=>/^\s*quadrantChart/.test(t),"detector"),hUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Gfe(),zfe));return{id:Vfe,diagram:t}},"loader"),fUe={id:Vfe,detector:uUe,loader:hUe},Ufe=fUe;var gde="xychart",DUe=o(t=>/^\s*xychart-beta/.test(t),"detector"),LUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(mde(),pde));return{id:gde,diagram:t}},"loader"),RUe={id:gde,detector:DUe,loader:LUe},yde=RUe;var Cde="requirement",OUe=o(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),PUe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Sde(),Ede));return{id:Cde,diagram:t}},"loader"),BUe={id:Cde,detector:OUe,loader:PUe},Ade=BUe;var Yde="sequence",bHe=o(t=>/^\s*sequenceDiagram/.test(t),"detector"),THe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(qde(),Wde));return{id:Yde,diagram:t}},"loader"),wHe={id:Yde,detector:bHe,loader:THe},Xde=wHe;var epe="class",_He=o((t,e)=>e?.class?.defaultRenderer==="dagre-wrapper"?!1:/^\s*classDiagram/.test(t),"detector"),DHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Jde(),Zde));return{id:epe,diagram:t}},"loader"),LHe={id:epe,detector:_He,loader:DHe},tpe=LHe;var ipe="classDiagram",NHe=o((t,e)=>/^\s*classDiagram/.test(t)&&e?.class?.defaultRenderer==="dagre-wrapper"?!0:/^\s*classDiagram-v2/.test(t),"detector"),MHe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(npe(),rpe));return{id:ipe,diagram:t}},"loader"),IHe={id:ipe,detector:NHe,loader:MHe},ape=IHe;var Ppe="state",aWe=o((t,e)=>e?.state?.defaultRenderer==="dagre-wrapper"?!1:/^\s*stateDiagram/.test(t),"detector"),sWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ope(),Ipe));return{id:Ppe,diagram:t}},"loader"),oWe={id:Ppe,detector:aWe,loader:sWe},Bpe=oWe;var zpe="stateDiagram",cWe=o((t,e)=>!!(/^\s*stateDiagram-v2/.test(t)||/^\s*stateDiagram/.test(t)&&e?.state?.defaultRenderer==="dagre-wrapper"),"detector"),uWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>($pe(),Fpe));return{id:zpe,diagram:t}},"loader"),hWe={id:zpe,detector:cWe,loader:uWe},Gpe=hWe;var n0e="journey",NWe=o(t=>/^\s*journey/.test(t),"detector"),MWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(r0e(),t0e));return{id:n0e,diagram:t}},"loader"),IWe={id:n0e,detector:NWe,loader:MWe},i0e=IWe;yt();Vl();xi();var OWe=o((t,e,r)=>{X.debug(`rendering svg for syntax error -`);let n=Li(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),fn(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw"),QP={draw:OWe},a0e=QP;var PWe={db:{},renderer:QP,parser:{parse:o(()=>{},"parse")}},s0e=PWe;var o0e="flowchart-elk",BWe=o((t,e={})=>/^\s*flowchart-elk/.test(t)||/^\s*flowchart|graph/.test(t)&&e?.flowchart?.defaultRenderer==="elk"?(e.layout="elk",!0):!1,"detector"),FWe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(bk(),xk));return{id:o0e,diagram:t}},"loader"),$We={id:o0e,detector:BWe,loader:FWe},l0e=$We;var I0e="timeline",iqe=o(t=>/^\s*timeline/.test(t),"detector"),aqe=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(M0e(),N0e));return{id:I0e,diagram:t}},"loader"),sqe={id:I0e,detector:iqe,loader:aqe},O0e=sqe;var uye="mindmap",Let=o(t=>/^\s*mindmap/.test(t),"detector"),Ret=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(cye(),lye));return{id:uye,diagram:t}},"loader"),Net={id:uye,detector:Let,loader:Ret},hye=Net;var kye="kanban",Xet=o(t=>/^\s*kanban/.test(t),"detector"),jet=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(wye(),Tye));return{id:kye,diagram:t}},"loader"),Ket={id:kye,detector:Xet,loader:jet},Eye=Ket;var ave="sankey",xtt=o(t=>/^\s*sankey-beta/.test(t),"detector"),btt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(ive(),nve));return{id:ave,diagram:t}},"loader"),Ttt={id:ave,detector:xtt,loader:btt},sve=Ttt;var gve="packet",Itt=o(t=>/^\s*packet(-beta)?/.test(t),"detector"),Ott=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(mve(),pve));return{id:gve,diagram:t}},"loader"),yve={id:gve,detector:Itt,loader:Ott};var _ve="radar",nrt=o(t=>/^\s*radar-beta/.test(t),"detector"),irt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(Ave(),Cve));return{id:_ve,diagram:t}},"loader"),Dve={id:_ve,detector:nrt,loader:irt};var N2e="block",Snt=o(t=>/^\s*block-beta/.test(t),"detector"),Cnt=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(R2e(),L2e));return{id:N2e,diagram:t}},"loader"),Ant={id:N2e,detector:Snt,loader:Cnt},M2e=Ant;var ixe="architecture",eit=o(t=>/^\s*architecture/.test(t),"detector"),tit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(nxe(),rxe));return{id:ixe,diagram:t}},"loader"),rit={id:ixe,detector:eit,loader:tit},axe=rit;rd();Gt();var mxe="treemap",hit=o(t=>/^\s*treemap/.test(t),"detector"),fit=o(async()=>{let{diagram:t}=await Promise.resolve().then(()=>(pxe(),dxe));return{id:mxe,diagram:t}},"loader"),gxe={id:mxe,detector:hit,loader:fit};var yxe=!1,wy=o(()=>{yxe||(yxe=!0,dd("error",s0e,t=>t.toLowerCase().trim()==="error"),dd("---",{db:{clear:o(()=>{},"clear")},styles:{},renderer:{draw:o(()=>{},"draw")},parser:{parse:o(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:o(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),Ly(l0e,hye,axe),Ly(uK,Eye,ape,tpe,kse,lfe,vfe,Dfe,Ade,Xde,dse,hse,O0e,Rhe,Gpe,Bpe,i0e,Ufe,sve,yve,yde,M2e,Dve,gxe))},"addDiagrams");yt();rd();Gt();var vxe=o(async()=>{X.debug("Loading registered diagrams");let e=(await Promise.allSettled(Object.entries(au).map(async([r,{detector:n,loader:i}])=>{if(i)try{iv(r)}catch{try{let{diagram:a,id:s}=await i();dd(s,a,n)}catch(a){throw X.error(`Failed to load external diagram with key ${r}. Removing from detectors.`),delete au[r],a}}}))).filter(r=>r.status==="rejected");if(e.length>0){X.error(`Failed to load ${e.length} external diagrams`);for(let r of e)X.error(r);throw new Error(`Failed to load ${e.length} external diagrams`)}},"loadRegisteredDiagrams");yt();fr();var _C="comm",DC="rule",LC="decl";var xxe="@import";var bxe="@namespace",Txe="@keyframes";var wxe="@layer";var i$=Math.abs,B4=String.fromCharCode;function RC(t){return t.trim()}o(RC,"trim");function F4(t,e,r){return t.replace(e,r)}o(F4,"replace");function kxe(t,e,r){return t.indexOf(e,r)}o(kxe,"indexof");function Xf(t,e){return t.charCodeAt(e)|0}o(Xf,"charat");function jf(t,e,r){return t.slice(e,r)}o(jf,"substr");function To(t){return t.length}o(To,"strlen");function Exe(t){return t.length}o(Exe,"sizeof");function ky(t,e){return e.push(t),t}o(ky,"append");var NC=1,Ey=1,Sxe=0,ll=0,Ii=0,Cy="";function MC(t,e,r,n,i,a,s,l){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:NC,column:Ey,length:s,return:"",siblings:l}}o(MC,"node");function Cxe(){return Ii}o(Cxe,"char");function Axe(){return Ii=ll>0?Xf(Cy,--ll):0,Ey--,Ii===10&&(Ey=1,NC--),Ii}o(Axe,"prev");function cl(){return Ii=ll2||Sy(Ii)>3?"":" "}o(Lxe,"whitespace");function Rxe(t,e){for(;--e&&cl()&&!(Ii<48||Ii>102||Ii>57&&Ii<65||Ii>70&&Ii<97););return IC(t,$4()+(e<6&&lh()==32&&cl()==32))}o(Rxe,"escaping");function a$(t){for(;cl();)switch(Ii){case t:return ll;case 34:case 39:t!==34&&t!==39&&a$(Ii);break;case 40:t===41&&a$(t);break;case 92:cl();break}return ll}o(a$,"delimiter");function Nxe(t,e){for(;cl()&&t+Ii!==57;)if(t+Ii===84&&lh()===47)break;return"/*"+IC(e,ll-1)+"*"+B4(t===47?t:cl())}o(Nxe,"commenter");function Mxe(t){for(;!Sy(lh());)cl();return IC(t,ll)}o(Mxe,"identifier");function Pxe(t){return Dxe(PC("",null,null,null,[""],t=_xe(t),0,[0],t))}o(Pxe,"compile");function PC(t,e,r,n,i,a,s,l,u){for(var h=0,f=0,d=s,p=0,m=0,g=0,y=1,v=1,x=1,b=0,T="",S=i,w=a,E=n,_=T;v;)switch(g=b,b=cl()){case 40:if(g!=108&&Xf(_,d-1)==58){kxe(_+=F4(OC(b),"&","&\f"),"&\f",i$(h?l[h-1]:0))!=-1&&(x=-1);break}case 34:case 39:case 91:_+=OC(b);break;case 9:case 10:case 13:case 32:_+=Lxe(g);break;case 92:_+=Rxe($4()-1,7);continue;case 47:switch(lh()){case 42:case 47:ky(dit(Nxe(cl(),$4()),e,r,u),u),(Sy(g||1)==5||Sy(lh()||1)==5)&&To(_)&&jf(_,-1,void 0)!==" "&&(_+=" ");break;default:_+="/"}break;case 123*y:l[h++]=To(_)*x;case 125*y:case 59:case 0:switch(b){case 0:case 125:v=0;case 59+f:x==-1&&(_=F4(_,/\f/g,"")),m>0&&(To(_)-d||y===0&&g===47)&&ky(m>32?Oxe(_+";",n,r,d-1,u):Oxe(F4(_," ","")+";",n,r,d-2,u),u);break;case 59:_+=";";default:if(ky(E=Ixe(_,e,r,h,f,i,l,T,S=[],w=[],d,a),a),b===123)if(f===0)PC(_,e,E,E,S,a,d,l,w);else{switch(p){case 99:if(Xf(_,3)===110)break;case 108:if(Xf(_,2)===97)break;default:f=0;case 100:case 109:case 115:}f?PC(t,E,E,n&&ky(Ixe(t,E,E,0,0,i,l,T,i,S=[],d,w),w),i,w,d,l,n?S:w):PC(_,E,E,E,[""],w,0,l,w)}}h=f=m=0,y=x=1,T=_="",d=s;break;case 58:d=1+To(_),m=g;default:if(y<1){if(b==123)--y;else if(b==125&&y++==0&&Axe()==125)continue}switch(_+=B4(b),b*y){case 38:x=f>0?1:(_+="\f",-1);break;case 44:l[h++]=(To(_)-1)*x,x=1;break;case 64:lh()===45&&(_+=OC(cl())),p=lh(),f=d=To(T=_+=Mxe($4())),b++;break;case 45:g===45&&To(_)==2&&(y=0)}}return a}o(PC,"parse");function Ixe(t,e,r,n,i,a,s,l,u,h,f,d){for(var p=i-1,m=i===0?a:[""],g=Exe(m),y=0,v=0,x=0;y0?m[b]+" "+T:F4(T,/&\f/g,m[b])))&&(u[x++]=S);return MC(t,e,r,i===0?DC:l,u,h,f,d)}o(Ixe,"ruleset");function dit(t,e,r,n){return MC(t,e,r,_C,B4(Cxe()),jf(t,2,-2),0,n)}o(dit,"comment");function Oxe(t,e,r,n,i){return MC(t,e,r,LC,jf(t,0,n),jf(t,n+1,-1),n,i)}o(Oxe,"declaration");function BC(t,e){for(var r="",n=0;n{zxe.forEach(t=>{t()}),zxe=[]},"attachFunctions");yt();var Vxe=o(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");Q4();PT();function Uxe(t){let e=t.match(K4);if(!e)return{text:t,metadata:{}};let r=Tm(e[1],{schema:bm})??{};r=typeof r=="object"&&!Array.isArray(r)?r:{};let n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}o(Uxe,"extractFrontMatter");er();var mit=o(t=>t.replace(/\r\n?/g,` -`).replace(/<(\w+)([^>]*)>/g,(e,r,n)=>"<"+r+n.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),git=o(t=>{let{text:e,metadata:r}=Uxe(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),yit=o(t=>{let e=Vt.detectInit(t)??{},r=Vt.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:n})=>n==="wrap"):r?.type==="wrap"&&(e.wrap=!0),{text:Kj(t),directive:e}},"processDirectives");function s$(t){let e=mit(t),r=git(e),n=yit(r.text),i=$n(r.config,n.directive);return t=Vxe(n.text),{code:t,title:r.title,config:i}}o(s$,"preprocessDiagram");TA();n3();er();function Hxe(t){let e=new TextEncoder().encode(t),r=Array.from(e,n=>String.fromCodePoint(n)).join("");return btoa(r)}o(Hxe,"toBase64");var vit=5e4,xit="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa",bit="sandbox",Tit="loose",wit="http://www.w3.org/2000/svg",kit="http://www.w3.org/1999/xlink",Eit="http://www.w3.org/1999/xhtml",Sit="100%",Cit="100%",Ait="border:0;margin:0;",_it="margin:0",Dit="allow-top-navigation-by-user-activation allow-popups",Lit='The "iframe" tag is not supported by your browser.',Rit=["foreignobject"],Nit=["dominant-baseline"];function Xxe(t){let e=s$(t);return $y(),Mz(e.config??{}),e}o(Xxe,"processAndSetConfigs");async function Mit(t,e){wy();try{let{code:r,config:n}=Xxe(t);return{diagramType:(await jxe(r)).type,config:n}}catch(r){if(e?.suppressErrors)return!1;throw r}}o(Mit,"parse");var Wxe=o((t,e,r=[])=>` -.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),Iit=o((t,e=new Map)=>{let r="";if(t.themeCSS!==void 0&&(r+=` -${t.themeCSS}`),t.fontFamily!==void 0&&(r+=` -:root { --mermaid-font-family: ${t.fontFamily}}`),t.altFontFamily!==void 0&&(r+=` -:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){let s=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(l=>{hr(l.styles)||s.forEach(u=>{r+=Wxe(l.id,u,l.styles)}),hr(l.textStyles)||(r+=Wxe(l.id,"tspan",(l?.textStyles||[]).map(u=>u.replace("color","fill"))))})}return r},"createCssStyles"),Oit=o((t,e,r,n)=>{let i=Iit(t,r),a=MV(e,i,t.themeVariables);return BC(Pxe(`${n}{${a}}`),Bxe)},"createUserStyles"),Pit=o((t="",e,r)=>{let n=t;return!r&&!e&&(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=na(n),n=n.replace(/
    /g,"
    "),n},"cleanUpSvgCode"),Bit=o((t="",e)=>{let r=e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":Cit,n=Hxe(`${t}`);return``},"putIntoIFrame"),qxe=o((t,e,r,n,i)=>{let a=t.append("div");a.attr("id",r),n&&a.attr("style",n);let s=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns",wit);return i&&s.attr("xmlns:xlink",i),s.append("g"),t},"appendDivSvgG");function Yxe(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}o(Yxe,"sandboxedIframe");var Fit=o((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),$it=o(async function(t,e,r){wy();let n=Xxe(e);e=n.code;let i=tr();X.debug(i),e.length>(i?.maxTextSize??vit)&&(e=xit);let a="#"+t,s="i"+t,l="#"+s,u="d"+t,h="#"+u,f=o(()=>{let L=Ge(p?l:h).node();L&&"remove"in L&&L.remove()},"removeTempElements"),d=Ge("body"),p=i.securityLevel===bit,m=i.securityLevel===Tit,g=i.fontFamily;if(r!==void 0){if(r&&(r.innerHTML=""),p){let k=Yxe(Ge(r),s);d=Ge(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ge(r);qxe(d,t,u,`font-family: ${g}`,kit)}else{if(Fit(document,t,u,s),p){let k=Yxe(Ge("body"),s);d=Ge(k.nodes()[0].contentDocument.body),d.node().style.margin=0}else d=Ge("body");qxe(d,t,u)}let y,v;try{y=await Ay.fromText(e,{title:n.title})}catch(k){if(i.suppressErrorRendering)throw f(),k;y=await Ay.fromText("error"),v=k}let x=d.select(h).node(),b=y.type,T=x.firstChild,S=T.firstChild,w=y.renderer.getClasses?.(e,y),E=Oit(i,b,w,a),_=document.createElement("style");_.innerHTML=E,T.insertBefore(_,S);try{await y.renderer.draw(e,t,Db.version,y)}catch(k){throw i.suppressErrorRendering?f():a0e.draw(e,t,Db.version),k}let C=d.select(`${h} svg`),D=y.db.getAccTitle?.(),O=y.db.getAccDescription?.();Git(b,C,D,O),d.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns",Eit);let R=d.select(h).node().innerHTML;if(X.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),R=Pit(R,p,dr(i.arrowMarkerAbsolute)),p){let k=d.select(h+" svg").node();R=Bit(R,k)}else m||(R=mh.sanitize(R,{ADD_TAGS:Rit,ADD_ATTR:Nit,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(Gxe(),v)throw v;return f(),{diagramType:b,svg:R,bindFunctions:y.db.bindFunctions}},"render");function zit(t={}){let e=Un({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),Lz(e),e?.theme&&e.theme in Eo?e.themeVariables=Eo[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=Eo.default.getThemeVariables(e.themeVariables));let r=typeof e=="object"?T7(e):w7();Dy(r.logLevel),wy()}o(zit,"initialize");var jxe=o((t,e={})=>{let{code:r}=s$(t);return Ay.fromText(r,e)},"getDiagramFromText");function Git(t,e,r,n){Fxe(e,t),$xe(e,r,n,e.attr("id"))}o(Git,"addA11yInfo");var Kf=Object.freeze({render:$it,parse:Mit,getDiagramFromText:jxe,initialize:zit,getConfig:tr,setConfig:a3,getSiteConfig:w7,updateSiteConfig:Rz,reset:o(()=>{$y()},"reset"),globalReset:o(()=>{$y(ph)},"globalReset"),defaultConfig:ph});Dy(tr().logLevel);$y(tr());rp();er();var Vit=o((t,e,r)=>{X.warn(t),I9(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),Kxe=o(async function(t={querySelector:".mermaid"}){try{await Uit(t)}catch(e){if(I9(e)&&X.error(e.str),ch.parseError&&ch.parseError(e),!t.suppressErrors)throw X.error("Use the suppressErrors option to suppress these errors"),e}},"run"),Uit=o(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){let n=Kf.getConfig();X.debug(`${t?"":"No "}Callback function found`);let i;if(r)i=r;else if(e)i=document.querySelectorAll(e);else throw new Error("Nodes and querySelector are both undefined");X.debug(`Found ${i.length} diagrams`),n?.startOnLoad!==void 0&&(X.debug("Start On Load: "+n?.startOnLoad),Kf.updateSiteConfig({startOnLoad:n?.startOnLoad}));let a=new Vt.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed),s,l=[];for(let u of Array.from(i)){X.info("Rendering diagram: "+u.id);if(u.getAttribute("data-processed"))continue;u.setAttribute("data-processed","true");let h=`mermaid-${a.next()}`;s=u.innerHTML,s=j4(Vt.entityDecode(s)).trim().replace(//gi,"
    ");let f=Vt.detectInit(s);f&&X.debug("Detected early reinit: ",f);try{let{svg:d,bindFunctions:p}=await ebe(h,s,u);u.innerHTML=d,t&&await t(h),p&&p(u)}catch(d){Vit(d,l,ch.parseError)}}if(l.length>0)throw l[0]},"runThrowsErrors"),Qxe=o(function(t){Kf.initialize(t)},"initialize"),Hit=o(async function(t,e,r){X.warn("mermaid.init is deprecated. Please use run instead."),t&&Qxe(t);let n={postRenderCallback:r,querySelector:".mermaid"};typeof e=="string"?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await Kxe(n)},"init"),Wit=o(async(t,{lazyLoad:e=!0}={})=>{wy(),Ly(...t),e===!1&&await vxe()},"registerExternalDiagrams"),Zxe=o(function(){if(ch.startOnLoad){let{startOnLoad:t}=Kf.getConfig();t&&ch.run().catch(e=>X.error("Mermaid failed to initialize",e))}},"contentLoaded");if(typeof document<"u"){window.addEventListener("load",Zxe,!1)}var qit=o(function(t){ch.parseError=t},"setParseErrorHandler"),FC=[],o$=!1,Jxe=o(async()=>{if(!o$){for(o$=!0;FC.length>0;){let t=FC.shift();if(t)try{await t()}catch(e){X.error("Error executing queue",e)}}o$=!1}},"executeQueue"),Yit=o(async(t,e)=>new Promise((r,n)=>{let i=o(()=>new Promise((a,s)=>{Kf.parse(t,e).then(l=>{a(l),r(l)},l=>{X.error("Error parsing",l),ch.parseError?.(l),s(l),n(l)})}),"performCall");FC.push(i),Jxe().catch(n)}),"parse"),ebe=o((t,e,r)=>new Promise((n,i)=>{let a=o(()=>new Promise((s,l)=>{Kf.render(t,e,r).then(u=>{s(u),n(u)},u=>{X.error("Error parsing",u),ch.parseError?.(u),l(u),i(u)})}),"performCall");FC.push(a),Jxe().catch(i)}),"render"),Xit=o(()=>Object.keys(au).map(t=>({id:t})),"getRegisteredDiagramsMetadata"),ch={startOnLoad:!0,mermaidAPI:Kf,parse:Yit,render:ebe,init:Hit,run:Kxe,registerExternalDiagrams:Wit,registerLayoutLoaders:tN,initialize:Qxe,parseError:void 0,contentLoaded:Zxe,setParseErrorHandler:qit,detectType:m0,registerIconPacks:X4,getRegisteredDiagramsMetadata:Xit},jit=ch;return ube(Kit);})(); -/*! Check if previously processed */ -/*! - * Wait for document loaded before starting the execution - */ -/*! Bundled license information: - -dompurify/dist/purify.es.mjs: - (*! @license DOMPurify 3.2.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.5/LICENSE *) - -js-yaml/dist/js-yaml.mjs: - (*! js-yaml 4.1.0 https://github.com/nodeca/js-yaml @license MIT *) - -lodash-es/lodash.js: - (** - * @license - * Lodash (Custom Build) - * Build: `lodash modularize exports="es" -o ./` - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - *) - -cytoscape/dist/cytoscape.esm.mjs: - (*! - Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable - Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) - Licensed under The MIT License (http://opensource.org/licenses/MIT) - *) - (*! - Event object based on jQuery events, MIT license - - https://jquery.org/license/ - https://tldrlegal.com/license/mit-license - https://github.com/jquery/jquery/blob/master/src/event.js - *) - (*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License *) - (*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License *) -*/ -globalThis["mermaid"] = globalThis.__esbuild_esm_mermaid_nm["mermaid"].default; \ No newline at end of file diff --git a/website/public/sitemap.xml b/website/public/sitemap.xml deleted file mode 100644 index 10dcfb6..0000000 --- a/website/public/sitemap.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - https://example.org/docs/ - - https://example.org/docs/00-preface/ - - https://example.org/examples/ - - https://example.org/docs/01-introduction/ - - https://example.org/docs/02-getting-started/ - - https://example.org/docs/03-everything-is-an-object/ - - https://example.org/docs/04-prototypes-not-classes/ - - https://example.org/docs/05-messages-and-slots/ - - https://example.org/docs/06-cloning-and-inheritance/ - - https://example.org/docs/07-control-flow/ - - https://example.org/docs/08-collections/ - - https://example.org/docs/09-blocks-and-closures/ - - https://example.org/docs/10-exceptions/ - - https://example.org/docs/11-metaprogramming/ - - https://example.org/docs/12-concurrency/ - - https://example.org/docs/13-domain-specific-languages/ - - https://example.org/docs/14-c-integration/ - - https://example.org/docs/15-real-world-patterns/ - - https://example.org/docs/16-case-studies/ - - https://example.org/docs/17-ecosystem-and-libraries/ - - https://example.org/docs/18-conclusion/ - - https://example.org/categories/ - - https://example.org/tags/ - - https://example.org/ - - diff --git a/website/public/svg/backward.svg b/website/public/svg/backward.svg deleted file mode 100644 index 1ea8776..0000000 --- a/website/public/svg/backward.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/calendar.svg b/website/public/svg/calendar.svg deleted file mode 100644 index 87f2d70..0000000 --- a/website/public/svg/calendar.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/edit.svg b/website/public/svg/edit.svg deleted file mode 100644 index a852ca9..0000000 --- a/website/public/svg/edit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/forward.svg b/website/public/svg/forward.svg deleted file mode 100644 index c93ae55..0000000 --- a/website/public/svg/forward.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/menu.svg b/website/public/svg/menu.svg deleted file mode 100644 index 4dafe61..0000000 --- a/website/public/svg/menu.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/toc.svg b/website/public/svg/toc.svg deleted file mode 100644 index 4926cc2..0000000 --- a/website/public/svg/toc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/svg/translate.svg b/website/public/svg/translate.svg deleted file mode 100644 index dfc9fc1..0000000 --- a/website/public/svg/translate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/public/tags/index.html b/website/public/tags/index.html deleted file mode 100644 index 3fe211e..0000000 --- a/website/public/tags/index.html +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - - - - - - -Tags | The Io Programming Language - - - - - - - - - - - - - - - -
    -
    - - -
    -
    - -
    - - - - -
    -
    - -
    - - -

    Tags

    - - -
    - - - - -
    - - - -
    -

    Tags

    - - -
    - - - -
    - -
    - - - - - -
    - - - - - - - - - - - - - - - - - -
    - - - - - -
    - - - - -
    - - - - - - - - - - - - - - - - - - - diff --git a/website/public/tags/index.xml b/website/public/tags/index.xml deleted file mode 100644 index b4dc3f8..0000000 --- a/website/public/tags/index.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - Tags on The Io Programming Language - https://example.org/tags/ - Recent content in Tags on The Io Programming Language - Hugo - en-us - - - diff --git a/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.content b/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.content deleted file mode 100644 index fd2df76..0000000 --- a/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.content +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";:root{--gray-100:#f8f9fa;--gray-200:#e9ecef;--gray-500:#adb5bd;--color-link:#0055bb;--color-visited-link:#8440f1;--body-background:white;--body-font-color:black;--icon-filter:none}/*!modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize*/*,::before,::after{box-sizing:border-box}html{font-family:system-ui,segoe ui,Roboto,Helvetica,Arial,sans-serif,apple color emoji,segoe ui emoji;line-height:1.15;-webkit-text-size-adjust:100%;tab-size:4}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,liberation mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:initial}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.flex{display:flex}.flex-auto{flex:auto}.flex-even{flex:1 1}.flex-wrap{flex-wrap:wrap}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.align-center{align-items:center}.mx-auto{margin:0 auto}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-small{font-size:.875em}.hidden{display:none}input.toggle{height:0;width:0;overflow:hidden;opacity:0;position:absolute}.clearfix::after{content:"";display:table;clear:both}html{font-size:16px;scroll-behavior:smooth;touch-action:manipulation;scrollbar-gutter:stable}body{min-width:20rem;color:var(--body-font-color);background:var(--body-background);font-weight:400;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:400}a{text-decoration:none}a[href]{color:var(--color-link)}img{vertical-align:baseline}:focus{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}nav ul{padding:0;margin:0;list-style:none}nav ul li{position:relative}nav ul a,nav ul span{padding:.5em 0;display:block}nav ul a:hover{opacity:.5}nav ul ul{padding-inline-start:1rem}ul.pagination{display:flex;justify-content:center;list-style-type:none;padding-inline-start:0}ul.pagination .page-item a{padding:1rem}.container{max-width:80rem;margin:0 auto}.book-icon{filter:var(--icon-filter)}a .book-icon{height:1em;width:1em}a .book-icon:first-child{margin-inline-end:.5rem}a .book-icon:last-child{margin-inline-start:.5rem}.book-brand{margin-top:0;margin-bottom:1rem}.book-brand img{height:1.5em;width:1.5em;margin-inline-end:.5rem}.book-menu{flex:0 0 16rem;font-size:.875rem}.book-menu .book-menu-content{width:16rem;padding:1rem;background:var(--body-background);position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-menu a,.book-menu label{color:inherit;cursor:pointer;word-wrap:break-word}.book-menu a.active{color:var(--color-link)}.book-menu input.toggle+label+ul{display:none}.book-menu input.toggle:checked+label+ul{display:block}.book-menu input.toggle+label::after{content:"▸";align-self:center;transition:transform .1s ease-in-out}.book-menu input.toggle:checked+label::after{transform:rotate(90deg)}body[dir=rtl] .book-menu input.toggle+label::after{content:"◂"}body[dir=rtl] .book-menu input.toggle:checked+label::after{transform:rotate(-90deg)}.book-section-flat{margin:1rem 0}.book-section-flat>a,.book-section-flat>span,.book-section-flat>label{font-weight:bolder}.book-section-flat>ul{padding-inline-start:0}.book-page{min-width:20rem;flex-grow:1;padding:1rem}.book-post{margin-bottom:4rem}.book-post .book-post-date img{height:1em;width:1em;margin-inline-end:.5em}.book-post .book-post-content>:first-child{margin-top:1rem}.book-header{display:none;margin-bottom:1rem}.book-header label{line-height:0}.book-header h3{overflow:hidden;text-overflow:ellipsis;margin:0 1rem}.book-header img.book-icon{height:1.5em;width:1.5em}.book-layout-landing .book-header{display:block;position:relative;z-index:1}.book-layout-landing .book-header nav>ul{display:flex;gap:1rem;justify-content:end}.book-layout-landing .book-header nav>ul>li{display:block;white-space:nowrap}.book-layout-landing .book-header nav>ul>li>ul{display:none;position:absolute;padding:0}.book-layout-landing .book-header nav>ul>li:hover>ul{display:block}.book-search{position:relative;margin:.5rem 0;border-bottom:1px solid transparent}.book-search input{width:100%;padding:.5rem;border:0;border-radius:.25rem;background:var(--gray-100);color:var(--body-font-color)}.book-search input:required+.book-search-spinner{display:block}.book-search .book-search-spinner{position:absolute;top:0;margin:.5rem;margin-inline-start:calc(100% - 1.5rem);width:1rem;height:1rem;border:1px solid transparent;border-top-color:var(--body-font-color);border-radius:50%;animation:spin 1s ease infinite}@keyframes spin{100%{transform:rotate(360deg)}}.book-search ul a{padding-bottom:0}.book-search small{opacity:.5}.book-toc{flex:0 0 16rem;font-size:.75rem}.book-toc .book-toc-content{width:16rem;padding:1rem;position:fixed;top:0;bottom:0;overflow-x:hidden;overflow-y:auto}.book-toc img{height:1em;width:1em}.book-toc nav>ul>li:first-child{margin-top:0}.book-footer{padding-top:1rem;font-size:.875rem}.book-footer a{margin:.5rem 0}.book-comments{margin-top:1rem}.book-languages{margin-bottom:1rem}.book-languages span{padding:0}.book-languages ul{padding-inline-start:1.5em}.book-menu-content,.book-toc-content{transition:.2s ease-in-out;transition-property:transform,margin,opacity,visibility;will-change:transform,margin,opacity}@media screen and (max-width:56rem){#menu-control,#toc-control{display:inline}.book-menu{visibility:hidden;margin-inline-start:-16rem;z-index:1}.book-toc{display:none}.book-header{display:block}#menu-control:focus~main label[for=menu-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#menu-control:checked~main .book-menu{visibility:initial}#menu-control:checked~main .book-menu .book-menu-content{transform:translateX(16rem);box-shadow:0 0 .5rem rgba(0,0,0,.1)}#menu-control:checked~main .book-page{opacity:.25}#menu-control:checked~main .book-menu-overlay{display:block;position:absolute;top:0;bottom:0;left:0;right:0}#toc-control:focus~main label[for=toc-control]{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}#toc-control:checked~main .book-header aside{display:block}body[dir=rtl] #menu-control:checked~main .book-menu .book-menu-content{transform:translateX(-16rem)}}@media screen and (min-width:80rem){.book-page,.book-menu .book-menu-content,.book-toc .book-toc-content{padding:2rem 1rem}}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-math-400.woff2)format("woff2");unicode-range:U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-symbols-400.woff2)format("woff2");unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-ext-400.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-400.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-math-700.woff2)format("woff2");unicode-range:U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-symbols-700.woff2)format("woff2");unicode-range:U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-ext-700.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-v47-normal-latin-700.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-ext-400.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto mono;font-style:normal;font-weight:400;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-400.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:roboto mono;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-ext-700.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:roboto mono;font-style:normal;font-weight:700;font-display:fallback;src:url(./fonts/roboto-mono-v30-normal-latin-700.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}body{font-family:roboto,sans-serif}code{font-family:roboto mono,monospace}@media print{.book-menu,.book-footer,.book-toc{display:none}.book-header,.book-header aside{display:block}main{display:block!important}}.markdown{line-height:1.6}.markdown>:first-child{margin-top:0}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-weight:400;line-height:1;margin-top:1.5em;margin-bottom:1rem}.markdown h1 a.anchor,.markdown h2 a.anchor,.markdown h3 a.anchor,.markdown h4 a.anchor,.markdown h5 a.anchor,.markdown h6 a.anchor{opacity:0;font-size:.75em;vertical-align:middle;text-decoration:none}.markdown h1:hover a.anchor,.markdown h1 a.anchor:focus,.markdown h2:hover a.anchor,.markdown h2 a.anchor:focus,.markdown h3:hover a.anchor,.markdown h3 a.anchor:focus,.markdown h4:hover a.anchor,.markdown h4 a.anchor:focus,.markdown h5:hover a.anchor,.markdown h5 a.anchor:focus,.markdown h6:hover a.anchor,.markdown h6 a.anchor:focus{opacity:initial}.markdown h1{font-size:2rem}.markdown h2{font-size:1.5rem}.markdown h3{font-size:1.25rem}.markdown h4{font-size:1.125rem}.markdown h5{font-size:1rem}.markdown h6{font-size:.875rem}.markdown b,.markdown optgroup,.markdown strong{font-weight:bolder}.markdown a{text-decoration:none}.markdown a[href]:hover{text-decoration:underline}.markdown a[href]:visited{color:var(--color-visited-link)}.markdown img{max-width:100%;height:auto}.markdown code{direction:ltr;unicode-bidi:embed;padding:0 .25rem;background:var(--gray-200);border-radius:.25rem;font-size:.875em}.markdown pre{direction:ltr;unicode-bidi:embed;padding:1rem;background:var(--gray-100);border-radius:.25rem;overflow-x:auto}.markdown pre code{padding:0;background:0 0}.markdown p{word-wrap:break-word}.markdown blockquote{margin:1rem 0;padding:.5rem 1rem .5rem .75rem;border-inline-start:.25rem solid var(--gray-200);border-radius:.25rem}.markdown blockquote :first-child{margin-top:0}.markdown blockquote :last-child{margin-bottom:0}.markdown table{overflow:auto;display:block;border-spacing:0;border-collapse:collapse;margin-top:1rem;margin-bottom:1rem}.markdown table tr th,.markdown table tr td{padding:.5rem 1rem;border:1px solid var(--gray-200);text-align:start}.markdown table tr:nth-child(2n){background:var(--gray-100)}.markdown hr{height:1px;border:none;background:var(--gray-200)}.markdown ul,.markdown ol{padding-inline-start:2rem;word-wrap:break-word}.markdown dl dt{font-weight:bolder;margin-top:1rem}.markdown dl dd{margin-inline-start:0;margin-bottom:1rem}.markdown .highlight{direction:ltr;unicode-bidi:embed;border-radius:.25rem}.markdown .highlight table tr td pre code>span{display:flex}.markdown .highlight table tr td:nth-child(1) pre{margin:0;padding-inline-end:0}.markdown .highlight table tr td:nth-child(2) pre{margin:0;padding-inline-start:0}.markdown details{padding:1rem;border:1px solid var(--gray-200);border-radius:.25rem}.markdown details summary{line-height:1;padding:1rem;margin:-1rem;cursor:pointer;list-style:none}.markdown details summary::before{content:"▸";display:inline-block;margin-inline-end:.5rem;transition:transform .1s ease-in-out}.markdown details[open] summary{margin-bottom:0}.markdown details[open] summary::before{transform:rotate(90deg)}.markdown figure{margin:1rem 0}.markdown-inner>:first-child,.markdown .book-card figcaption>:first-child,.markdown figure figcaption>:first-child,.markdown .book-steps>ol>li>:first-child{margin-top:0}.markdown-inner>:last-child,.markdown .book-card figcaption>:last-child,.markdown figure figcaption>:last-child,.markdown .book-steps>ol>li>:last-child{margin-bottom:0}.markdown .book-expand{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden}.markdown .book-expand .book-expand-head{background:var(--gray-100);padding:.5rem 1rem;cursor:pointer}.markdown .book-expand .book-expand-content{display:none;padding:1rem}.markdown .book-expand input[type=checkbox]:checked+.book-expand-content{display:block}.markdown .book-tabs{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--gray-200);border-radius:.25rem;overflow:hidden;display:flex;flex-wrap:wrap}.markdown .book-tabs label{display:inline-block;padding:.5rem 1rem;border-bottom:1px transparent;cursor:pointer}.markdown .book-tabs .book-tabs-content{order:999;width:100%;border-top:1px solid var(--gray-100);padding:1rem;display:none}.markdown .book-tabs input[type=radio]:checked+label{border-bottom:1px solid var(--color-link)}.markdown .book-tabs input[type=radio]:checked+label+.book-tabs-content{display:block}.markdown .book-tabs input[type=radio]:focus+label{outline-style:auto;outline-color:currentColor;outline-color:-webkit-focus-ring-color}.markdown .book-columns{gap:1rem}.markdown .book-columns>div{margin:1rem 0;min-width:13.2rem}.markdown .book-columns>ul{list-style:none;display:flex;padding:0;flex-wrap:wrap;gap:1rem}.markdown .book-columns>ul>li{flex:1 1;min-width:13.2rem}.markdown a.book-btn[href]{display:inline-block;font-size:.875rem;color:var(--color-link);line-height:2rem;padding:0 1rem;border:1px solid var(--color-link);border-radius:.25rem;cursor:pointer}.markdown a.book-btn[href]:hover{text-decoration:none}.markdown .book-hint.default{border-color:#64748b;background-color:rgba(100,116,139,.1)}.markdown .book-hint.info{border-color:#4486dd;background-color:rgba(68,134,221,.1)}.markdown .book-hint.success{border-color:#3bad3b;background-color:rgba(59,173,59,.1)}.markdown .book-hint.warning{border-color:#f59e42;background-color:rgba(245,158,66,.1)}.markdown .book-hint.danger{border-color:#d84747;background-color:rgba(216,71,71,.1)}.markdown .book-hint.note{border-color:#4486dd;background-color:rgba(68,134,221,.1)}.markdown .book-hint.tip{border-color:#3bad3b;background-color:rgba(59,173,59,.1)}.markdown .book-hint.important{border-color:#8144dd;background-color:rgba(129,68,221,.1)}.markdown .book-hint.caution{border-color:#d84747;background-color:rgba(216,71,71,.1)}.markdown .book-badge{display:inline-block;font-size:.875rem;font-weight:400;vertical-align:middle;border-radius:.25rem;overflow:hidden;text-wrap:nowrap;color:var(--body-font-color)}.markdown .book-badge span{display:inline-block;padding:0 .5rem}.markdown .book-badge span.book-badge-title{--background-opacity:0.1}.markdown .book-badge span.book-badge-value{--background-opacity:1;color:var(--body-background)}.markdown .book-badge.default span{background-color:rgba(100,116,139,var(--background-opacity))}.markdown .book-badge.info span{background-color:rgba(68,134,221,var(--background-opacity))}.markdown .book-badge.success span{background-color:rgba(59,173,59,var(--background-opacity))}.markdown .book-badge.warning span{background-color:rgba(245,158,66,var(--background-opacity))}.markdown .book-badge.danger span{background-color:rgba(216,71,71,var(--background-opacity))}.markdown .book-badge.note span{background-color:rgba(68,134,221,var(--background-opacity))}.markdown .book-badge.tip span{background-color:rgba(59,173,59,var(--background-opacity))}.markdown .book-badge.important span{background-color:rgba(129,68,221,var(--background-opacity))}.markdown .book-badge.caution span{background-color:rgba(216,71,71,var(--background-opacity))}.markdown .book-steps{position:relative}.markdown .book-steps>ol{counter-reset:steps;list-style:none;padding-inline-start:1.25rem;margin-top:2rem}.markdown .book-steps>ol>li::before{content:counter(steps);counter-increment:steps;position:absolute;display:flex;justify-content:center;left:.5rem;height:1.5rem;width:1.5rem;padding:.25rem;border-radius:.5rem;white-space:nowrap;line-height:1rem;color:var(--body-background);background:var(--gray-500);outline:.25rem solid var(--body-background)}.markdown .book-steps>ol>li{border-inline-start:1px solid var(--gray-500);padding-inline-start:3rem;padding-bottom:2rem}.markdown .book-steps>ol>li:last-child{border:0}.markdown .book-card,.markdown figure{display:inline-block;overflow:hidden;height:100%;border-radius:.25rem;border:1px solid var(--gray-200)}.markdown .book-card[href],.markdown .book-card[href]:visited,.markdown figure[href],.markdown figure[href]:visited{color:var(--body-font-color)}.markdown .book-card[href]:hover,.markdown figure[href]:hover{text-decoration:none;background:var(--gray-100)}.markdown .book-card img,.markdown figure img{width:100%;display:block;aspect-ratio:4/3;object-fit:cover}.markdown .book-card .markdown-inner,.markdown .book-card figcaption,.markdown .book-card figure figcaption,.markdown figure .book-card figcaption,.markdown .book-card .book-steps>ol>li,.markdown figure .markdown-inner,.markdown figure figcaption,.markdown figure .book-steps>ol>li{padding:1rem}.markdown .book-card figcaption,.markdown figure figcaption{padding:1rem}.markdown .book-image input+img{cursor:zoom-in;transition:transform .2s ease-in-out}.markdown .book-image input:checked+img{position:fixed;top:0;left:0;right:0;bottom:0;background:var(--body-background);object-fit:contain;width:100%;height:100%;z-index:1;cursor:zoom-out;padding:1rem}.markdown .book-hero{min-height:24rem;align-content:center}.markdown .book-hero h1{font-size:3em} \ No newline at end of file diff --git a/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.json b/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.json deleted file mode 100644 index 1a97d70..0000000 --- a/website/resources/_gen/assets/book.scss_b807c86e8030af4cdc30edccea379f5f.json +++ /dev/null @@ -1 +0,0 @@ -{"Target":"book.min.4cb515616f615b2a0bff9bc1586e8704536e3d9ada38b7ed57973b3f954b35de.css","MediaType":"text/css","Data":{"Integrity":"sha256-TLUVYW9hWyoL/5vBWG6HBFNuPZraOLftV5c7P5VLNd4="}} \ No newline at end of file diff --git a/website/static/custom.css b/website/static/custom.css deleted file mode 100644 index 21729fa..0000000 --- a/website/static/custom.css +++ /dev/null @@ -1,329 +0,0 @@ -/* Import Geist Mono font */ -@import url('https://cdn.jsdelivr.net/npm/geist@1.3.1/dist/fonts/geist-mono/style.css'); - -/* Text selection styling */ -::selection { - background-color: #999999; - color: #000000; -} - -::-moz-selection { - background-color: #999999; - color: #000000; -} - -/* Top Header Bar */ -.top-header { - position: fixed; - top: 0; - left: 0; - right: 0; - height: 60px; - background: #ffffff; - border-bottom: 1px solid #e5e5e7; - z-index: 1000; - display: flex; - align-items: center; -} - -.header-container { - width: 100%; - max-width: 100%; - margin: 0; - padding: 0 20px; - display: flex; - justify-content: space-between; - align-items: center; - box-sizing: border-box; - position: relative; -} - -.header-brand { - display: flex; - align-items: center; - margin-left: 30px; /* Align with sidebar content */ -} - -.header-title { - font-size: 1.25rem; - font-weight: 600; - color: #000 !important; - text-decoration: none; -} - -.header-title:hover { - color: #333 !important; -} - -.header-search { - position: absolute; - right: 1rem; - top: calc(50% - 18px); - height: 36px; -} - -.header-search .book-search { - margin: 0; - display: block; - height: 100%; -} - -.header-search .book-search input { - margin: 0; - height: 36px; - text-align: left; - width: 200px; - display: block; -} - -/* Adjust main content for header */ -body { - margin: 0; - padding: 0; - padding-top: 0; -} - -/* Ensure main container starts below header */ -.container.flex { - padding-top: 60px !important; - margin-top: 0 !important; - position: relative; -} - -main.container { - position: relative; - top: 0; - min-height: 100vh; -} - -/* Override default sidebar positioning */ -.book-menu { - position: fixed !important; - left: 0; - top: 60px !important; - bottom: 0; - width: 250px !important; - height: calc(100vh - 60px) !important; - overflow-y: auto; - z-index: 50; - background: white; - padding-top: 1rem !important; - padding-left: 0 !important; - box-sizing: border-box; -} - -aside.book-menu { - width: 250px !important; - flex: none !important; -} - -/* Sidebar content */ -.book-menu-content { - width: 100%; - padding: 1rem 20px 1rem 30px; - margin: 0; - margin-top: 4em; - box-sizing: border-box; -} - -.book-menu nav { - text-align: left; - width: auto; - padding: 0 !important; - margin: 0 !important; -} - -.book-menu nav ul { - padding-left: 0 !important; - margin: 0 !important; - list-style: none; - text-align: left; -} - -.book-menu nav li { - text-align: left; - margin: 0; - padding: 0; -} - -.book-menu nav a { - display: block; - padding: 0.25rem 0; - text-align: left; -} - -/* Adjust main content to account for narrower sidebar */ -.book-page { - margin-left: 250px !important; - padding: 2rem 2rem; - margin-top: 0; -} - -@media screen and (max-width: 56rem) { - .book-page { - margin-left: 0 !important; - } -} - -/* Add padding to top of right TOC if present */ -.book-toc { - top: 60px; - height: calc(100vh - 60px); -} - -.book-toc-content { - padding-top: 1.5rem; -} - -/* Hide search in sidebar */ -.book-menu .book-search { - display: none; -} - -/* Main font override */ -body, .book-menu, .markdown { - font-family: "Helvetica Neue", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif !important; -} - -/* Page padding */ -.book-page, .container, main { - padding-left: max(1em, env(safe-area-inset-left)) !important; - padding-right: max(1em, env(safe-area-inset-right)) !important; -} - -.markdown, .book-article { - padding: 0 1em; -} - -@media (max-width: 56rem) { - .book-page, .container, main { - padding: 0 1em !important; - } -} - -/* Code block styling - black text on light grey */ -pre, code { - background-color: #eeeff1 !important; - color: #000000 !important; - font-family: 'Geist Mono', 'SF Mono', Monaco, 'Courier New', monospace; - font-weight: 500 !important; -} - -pre { - padding: 1rem !important; - border-radius: 6px !important; - overflow-x: auto !important; - line-height: 1.45 !important; - font-size: 0.75em !important; - font-weight: 500 !important; -} - -code { - padding: 0.2em 0.4em !important; - border-radius: 3px !important; - font-size: 0.75em !important; - font-weight: 500 !important; -} - -pre code { - padding: 0 !important; - background-color: transparent !important; - font-size: inherit !important; - font-weight: 500 !important; -} - -/* Remove any syntax highlighting colors but keep medium weight */ -pre * { - color: #000000 !important; - background-color: transparent !important; - font-weight: 500 !important; - font-style: normal !important; - text-decoration: none !important; -} - -/* Blockquote styling */ -blockquote { - font-family: 'Times New Roman', Times, serif !important; - font-style: italic !important; - font-size: 1.1rem !important; - border-left: none !important; - border: none !important; - padding-left: 1.5rem; - margin: 1.5rem 0; -} - -blockquote p { - font-family: inherit; - font-style: inherit; -} - -.book-hint { - border-left: none !important; - border: none !important; -} - -/* Chapter header styling */ -.chapter-header { - margin-bottom: 4rem; -} - -.chapter-title { - font-size: 2.5rem !important; - font-weight: 600; - margin: 0 0 0.25rem 0 !important; - line-height: 1.2; -} - -.chapter-number { - font-size: 0.9rem; - color: #6e6e73; - font-weight: 400; - letter-spacing: 0.02em; -} - -/* Sidebar navigation enhancements */ -.book-menu nav { - font-size: 0.95rem; -} - -/* Style nested TOC items in sidebar */ -.book-menu .book-section-flat { - margin-left: 0; -} - -.book-menu .book-page.with-toc { - margin-left: 1rem; - font-size: 0.9rem; -} - -/* Active chapter highlighting */ -.book-menu .active { - font-weight: 600; - color: #000000; -} - -.book-menu a.active { - color: #000000; -} - -.book-menu nav a:hover { - color: #000000; - opacity: 0.7; -} - -/* Collapsible sections */ -.book-menu .book-section-container { - margin-left: 1rem; -} - -/* Center the content better */ -.book-page { - max-width: 48rem; - margin: 0 auto; -} - -/* Hide back arrow navigation but keep forward arrow */ -.book-pagination .book-pagination-item:first-child { - display: none !important; -} - diff --git a/website/static/examples/README.md b/website/static/examples/README.md deleted file mode 100644 index 195ab35..0000000 --- a/website/static/examples/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Code Examples - -This directory contains runnable code examples from the book, organized by chapter. - -## Running Examples - -To run any example: - -```bash -io examples/chapter-02/hello.io -``` - -## Organization - -- `chapter-02/` - Getting Started examples -- `chapter-03/` - Everything is an Object examples -- `chapter-04/` - Prototypes examples -- `chapter-05/` - Messages and Slots examples -- `chapter-07/` - Control Flow examples -- `chapter-08/` - Collections examples -- `chapter-09/` - Blocks and Closures examples -- `chapter-11/` - Metaprogramming examples -- `chapter-12/` - Concurrency examples -- `chapter-13/` - DSL examples -- `chapter-15/` - Pattern examples -- `chapter-16/` - Case study code - -Each directory contains standalone examples that demonstrate the concepts from that chapter. \ No newline at end of file diff --git a/website/static/examples/chapter-02/hello.io b/website/static/examples/chapter-02/hello.io deleted file mode 100644 index a75d814..0000000 --- a/website/static/examples/chapter-02/hello.io +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env io -# Basic Hello World -"Hello, World!" println \ No newline at end of file diff --git a/website/static/examples/chapter-02/todo-list.io b/website/static/examples/chapter-02/todo-list.io deleted file mode 100644 index 14da2f4..0000000 --- a/website/static/examples/chapter-02/todo-list.io +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env io -# Simple To-Do List Manager from Chapter 2 - -TodoList := Object clone -TodoList items := list() - -TodoList add := method(task, - items append(task) - self -) - -TodoList show := method( - if(items size == 0, - "No tasks!" println, - items foreach(i, task, - (" " .. (i + 1) .. ". " .. task) println - ) - ) - self -) - -TodoList complete := method(index, - if(index > 0 and index <= items size, - task := items at(index - 1) - items removeAt(index - 1) - ("Completed: " .. task) println, - "Invalid task number" println - ) - self -) - -# Usage -todo := TodoList clone -todo add("Learn Io") add("Build something cool") add("Share with friends") - -"=== My Todo List ===" println -todo show - -todo complete(1) - -"=== Updated List ===" println -todo show \ No newline at end of file diff --git a/website/static/examples/chapter-04/prototypes.io b/website/static/examples/chapter-04/prototypes.io deleted file mode 100644 index bb6e9a1..0000000 --- a/website/static/examples/chapter-04/prototypes.io +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env io -# Prototype-based inheritance examples from Chapter 4 - -# Create a prototype chain -Animal := Object clone -Animal species := "Unknown" -Animal speak := method("Some sound" println) - -Dog := Animal clone -Dog species = "Canis familiaris" -Dog speak := method("Woof!" println) -Dog wagTail := method("*wagging tail*" println) - -fido := Dog clone -fido name := "Fido" - -# Demonstrate inheritance -"=== Prototype Chain Demo ===" println -("fido's name: " .. fido name) println -("fido's species: " .. fido species) println -"fido speaks: " print -fido speak -"fido wags: " print -fido wagTail - -# Show the prototype chain -"\n=== Prototype Chain ===" println -obj := fido -while(obj != Object, - (" " .. obj type) println - obj = obj proto -) - -# Dynamic prototype modification -"\n=== Dynamic Modification ===" println -"Adding 'fetch' method to Dog prototype..." println -Dog fetch := method("*fetching ball*" println) - -"Now fido can fetch:" print -fido fetch # Works even though fido was created before we added fetch! \ No newline at end of file diff --git a/website/static/examples/chapter-09/closures.io b/website/static/examples/chapter-09/closures.io deleted file mode 100644 index cca279d..0000000 --- a/website/static/examples/chapter-09/closures.io +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env io -# Closure examples from Chapter 9 - -# Counter using closures -makeCounter := method(start, - count := start - block( - count = count + 1 - count - ) -) - -"\n=== Counter Example ===" println -counter1 := makeCounter(0) -counter2 := makeCounter(100) - -"Counter1: " print -3 repeat(counter1 call print; " " print) -"" println - -"Counter2: " print -3 repeat(counter2 call print; " " print) -"" println - -# Function composition -"\n=== Function Composition ===" println -compose := method(f, g, - block(x, f call(g call(x))) -) - -double := block(x, x * 2) -addFive := block(x, x + 5) -doubleThenAddFive := compose(addFive, double) - -("10 doubled then plus 5 = " .. doubleThenAddFive call(10)) println - -# Partial application -"\n=== Partial Application ===" println -add := block(a, b, a + b) -addTen := block(x, add call(10, x)) - -("15 + 10 = " .. addTen call(15)) println - -# Memoization -"\n=== Memoization ===" println -memoize := method(f, - cache := Map clone - block(n, - if(cache hasKey(n asString), - "Cache hit!" println - cache at(n asString), - "Computing..." println - result := f call(n) - cache atPut(n asString, result) - result - ) - ) -) - -slowSquare := block(n, - wait(0.1) # Simulate expensive computation - n * n -) - -fastSquare := memoize(slowSquare) - -"First call to fastSquare(5):" println -fastSquare call(5) println - -"Second call to fastSquare(5):" println -fastSquare call(5) println \ No newline at end of file diff --git a/website/static/examples/chapter-11/metaprogramming.io b/website/static/examples/chapter-11/metaprogramming.io deleted file mode 100644 index aedc0fe..0000000 --- a/website/static/examples/chapter-11/metaprogramming.io +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env io -# Metaprogramming examples from Chapter 11 - -"\n=== Dynamic Method Creation ===" println - -# Create getters and setters dynamically -Object addProperty := method(name, defaultValue, - # Create storage slot - self setSlot("_" .. name, defaultValue) - - # Create getter - self setSlot(name, - method(self getSlot("_" .. call message name)) - ) - - # Create setter - self setSlot("set" .. name asCapitalized, - method(value, - propName := call message name afterSeq("set") asLowercase - self setSlot("_" .. propName, value) - self - ) - ) -) - -Person := Object clone -Person addProperty("name", "Unknown") -Person addProperty("age", 0) - -john := Person clone -john setName("John") setAge(25) -("Name: " .. john name) println -("Age: " .. john age) println - -"\n=== Method Missing Pattern ===" println - -DynamicObject := Object clone -DynamicObject forward := method( - messageName := call message name - args := call message arguments - - ("Intercepted unknown method: " .. messageName) println - - if(messageName beginsWithSeq("get"), - property := messageName afterSeq("get") asLowercase - return self getSlot(property) - ) - - if(messageName beginsWithSeq("set"), - property := messageName afterSeq("set") asLowercase - value := call evalArgAt(0) - return self setSlot(property, value) - ) - - "Method not handled" println -) - -obj := DynamicObject clone -obj setColor("blue") -obj setSize(42) -("Color: " .. obj getColor) println -("Size: " .. obj getSize) println - -"\n=== Message Inspection ===" println - -# Build and inspect messages -msg := message(2 + 3 * 4) -("Message: " .. msg) println -("Message name: " .. msg name) println -("Message arguments: " .. msg arguments) println - -# Evaluate message -result := msg doInContext(Lobby) -("Result: " .. result) println - -# Modify message -msg setName("*") -newResult := msg doInContext(Lobby) -("Modified result (now multiplication): " .. newResult) println - -"\n=== Self-Modifying Code ===" println - -Counter := Object clone -Counter count := 0 -Counter increment := method( - count = count + 1 - ("Count: " .. count) println - - # Self-modify after 3 calls - if(count >= 3, - "Limit reached! Disabling increment..." println - self increment = method( - "Counter is disabled!" println - ) - ) - count -) - -c := Counter clone -5 repeat(c increment) \ No newline at end of file diff --git a/website/static/examples/chapter-12/concurrency.io b/website/static/examples/chapter-12/concurrency.io deleted file mode 100644 index 347a16e..0000000 --- a/website/static/examples/chapter-12/concurrency.io +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env io -# Concurrency examples from Chapter 12 - -"\n=== Coroutine Example ===" println - -# Simple coroutine -coro := coroutine( - 3 repeat(i, - ("Coroutine says: " .. i) println - yield # Give control back - ) - "Coroutine done!" -) - -3 repeat(i, - ("Main says: " .. i) println - result := coro resume - if(result, result println) -) - -"\n=== Producer-Consumer Pattern ===" println - -# Channel implementation -Channel := Object clone -Channel init := method( - self queue := list() - self -) - -Channel send := method(value, - queue append(value) -) - -Channel receive := method( - while(queue size == 0, yield) - queue removeFirst -) - -ch := Channel clone init - -# Producer coroutine -producer := coroutine( - 5 repeat(i, - value := i * i - ("Producer: sending " .. value) println - ch send(value) - yield - ) -) - -# Consumer coroutine -consumer := coroutine( - 5 repeat( - value := ch receive - ("Consumer: received " .. value) println - yield - ) -) - -# Run them -10 repeat( - producer resume - consumer resume -) - -"\n=== Futures Example ===" println - -# Simulate async operation -slowOperation := method(n, - "Starting slow operation..." println - wait(0.5) # Simulate work - n * 2 -) - -# Run async with @ -"Launching async operation..." println -future := self @slowOperation(21) - -"Doing other work while waiting..." println -3 repeat(i, - ("Working... " .. i) println - wait(0.1) -) - -"Getting result..." println -result := future resolve -("Result: " .. result) println - -"\n=== Parallel Map ===" println - -# Add parallel map to List -List parallelMap := method(block, - futures := self map(item, - self @(block call(item)) - ) - futures map(resolve) -) - -# Compare sequential vs parallel -numbers := list(1, 2, 3, 4, 5) - -"Sequential map:" println -start := Date now -sequential := numbers map(n, - wait(0.1) # Simulate work - n * n -) -("Time: " .. (Date now - start) .. " seconds") println -("Result: " .. sequential) println - -"Parallel map:" println -start := Date now -parallel := numbers parallelMap(n, - wait(0.1) # Simulate work - n * n -) -("Time: " .. (Date now - start) .. " seconds") println -("Result: " .. parallel) println \ No newline at end of file diff --git a/website/static/examples/chapter-13/html-dsl.io b/website/static/examples/chapter-13/html-dsl.io deleted file mode 100644 index 0392998..0000000 --- a/website/static/examples/chapter-13/html-dsl.io +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env io -# HTML DSL example from Chapter 13 - -HTML := Object clone - -# Handle any tag name via forward -HTML forward := method( - tagName := call message name - attributes := Map clone - children := list() - - # Process arguments - call message arguments foreach(arg, - argValue := call sender doMessage(arg) - - if(argValue type == "Map", - attributes = argValue, - if(argValue type == "Sequence", - children append(argValue), - if(argValue type == "List", - children appendSeq(argValue), - children append(argValue asString) - ) - ) - ) - ) - - # Build HTML - result := "<" .. tagName - attributes foreach(key, value, - result = result .. " " .. key .. "=\"" .. value .. "\"" - ) - - if(children size == 0, - result = result .. " />", - result = result .. ">" - children foreach(child, result = result .. child) - result = result .. "" - ) - - result -) - -# Helper for attributes -Object attrs := method( - map := Map clone - call message arguments foreach(arg, - key := arg name - value := call sender doMessage(arg arguments at(0)) - map atPut(key, value) - ) - map -) - -# Usage example -"\n=== HTML DSL Demo ===" println - -html := HTML clone - -page := html html( - html head( - html title("My Io Website"), - html meta(attrs(charset: "UTF-8")) - ), - html body(attrs(class: "container"), - html h1("Welcome to Io!"), - html p(attrs(class: "intro"), - "This is a paragraph with ", - html strong("bold text"), - " and ", - html em("italic text"), - "." - ), - html ul(attrs(id: "features"), - html li("Prototype-based OOP"), - html li("Everything is an object"), - html li("Powerful metaprogramming") - ), - html footer( - html p("© 2024 - Built with Io") - ) - ) -) - -# Output the generated HTML -page println \ No newline at end of file diff --git a/website/static/fonts/GeistMono.zip b/website/static/fonts/GeistMono.zip deleted file mode 100644 index 8537307..0000000 --- a/website/static/fonts/GeistMono.zip +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/website/static/fonts/GeistMonoVF.woff2 b/website/static/fonts/GeistMonoVF.woff2 deleted file mode 100644 index d6a1335..0000000 --- a/website/static/fonts/GeistMonoVF.woff2 +++ /dev/null @@ -1 +0,0 @@ -Couldn't find the requested file /dist/fonts/geist-mono/GeistMonoVF.woff2 in geist. \ No newline at end of file diff --git a/website/static/fonts/geist-mono.zip b/website/static/fonts/geist-mono.zip deleted file mode 100644 index 8537307..0000000 --- a/website/static/fonts/geist-mono.zip +++ /dev/null @@ -1 +0,0 @@ -Not Found \ No newline at end of file diff --git a/website/themes/hugo-book b/website/themes/hugo-book deleted file mode 160000 index 249682f..0000000 --- a/website/themes/hugo-book +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 249682f9dd7a4b305b2d92e51c22e676086e3d83