# record_sheet

id: screen
git_filename: ./screen.md
format: md
field_title: Screen
field_category: CLI
field_updated: 2024-02-03
field_updated___timezone: UTC
data:
{"title": "Screen", "category": "CLI", "updated": "2024-02-03", "keywords": ["Screen", "Linux", "Unix", "CLI", "Command", "Line"], "intro": "Screen or GNU Screen is a terminal multiplexer. In other words, it means that you can start a screen session and then open any number of windows (virtual terminals).\nThis does not contain **all** of screen's commands and options, read [GNU's manual](https://www.gnu.org/software/screen/manual/screen.html#Commands) to see everything\n", "body": "## Basics\n{: .-three-column}\n\n### Basics\n\n| Options/Keybind           | Description                                                                              |\n| ------------------------- | ---------------------------------------------------------------------------------------- |\n| `screen -S [name]`        | Start a named session                                                                    |\n| `ctrl+a ctrl+d`           | Detach the current screen and go back to the terminal (screen session will stay running) |\n| `screen -ls` _or_ <br /> `screen -list`   | List all sessions                                                                        |\n| `screen -r [name]`        | Reattach to a screen (optionally by name)                                                |\n\n### Screens\n\n| Keybind         | Description                                                                              |\n| --------------- | ---------------------------------------------------------------------------------------- |\n| `ctrl+a c`      | Create a new screen tab inside a screen                                                  |\n| `ctrl+a [0-9]`  | Switch to a screen tab by number 0 through 9                                             |\n| `ctrl+a n`      | Go to the next screen tab                                                                |\n| `ctrl+a p`      | Go to the previous screen tab                                                            |\n| `ctrl+a k`      | Kill current screen tab                                                                  |\n\n### Visual pleasure\n\n| Keybind                         | Description                  |\n| ------------------------------- | ---------------------------- |\n| `ctrl+a S`                      | Split a screen horizontally  |\n| `ctrl+a |`                      | Split a screen vertically    |\n| `ctrl+a ctrl+I` _or_ <br /> `ctrl+a tab` | Change screen split          |\n| `ctrl+a Q`                      | Remove all screen splits     |\n| `ctrl+a C`                      | Clear the current screen tab |\n\n### Accessibility\n\n| Keybind         | Description                                         |\n| --------------- | --------------------------------------------------- |\n| `ctrl+a A`      | Rename current screen tab                           |\n| `ctrl+a k`      | Kill current screen tab                             |\n| `ctrl+a ctrl+a` | Switch to last used screen tab                      |\n| `ctrl+a a`      | Send `ctrl+a` to current screen tab                 |\n| `ctrl+a ctrl+w` | See a list of all screen tabs in the current screen |"}

field_intro:
Screen or GNU Screen is a terminal multiplexer. In other words, it means that you can start a screen session and then open any number of windows (virtual terminals).
This does not contain **all** of screen's commands and options, read [GNU's manual](https://www.gnu.org/software/screen/manual/screen.html#Commands) to see everything

field_body:
## Basics
{: .-three-column}

### Basics

| Options/Keybind           | Description                                                                              |
| ------------------------- | ---------------------------------------------------------------------------------------- |
| `screen -S [name]`        | Start a named session                                                                    |
| `ctrl+a ctrl+d`           | Detach the current screen and go back to the terminal (screen session will stay running) |
| `screen -ls` _or_ <br /> `screen -list`   | List all sessions                                                                        |
| `screen -r [name]`        | Reattach to a screen (optionally by name)                                                |

### Screens

| Keybind         | Description                                                                              |
| --------------- | ---------------------------------------------------------------------------------------- |
| `ctrl+a c`      | Create a new screen tab inside a screen                                                  |
| `ctrl+a [0-9]`  | Switch to a screen tab by number 0 through 9                                             |
| `ctrl+a n`      | Go to the next screen tab                                                                |
| `ctrl+a p`      | Go to the previous screen tab                                                            |
| `ctrl+a k`      | Kill current screen tab                                                                  |

### Visual pleasure

| Keybind                         | Description                  |
| ------------------------------- | ---------------------------- |
| `ctrl+a S`                      | Split a screen horizontally  |
| `ctrl+a |`                      | Split a screen vertically    |
| `ctrl+a ctrl+I` _or_ <br /> `ctrl+a tab` | Change screen split          |
| `ctrl+a Q`                      | Remove all screen splits     |
| `ctrl+a C`                      | Clear the current screen tab |

### Accessibility

| Keybind         | Description                                         |
| --------------- | --------------------------------------------------- |
| `ctrl+a A`      | Rename current screen tab                           |
| `ctrl+a k`      | Kill current screen tab                             |
| `ctrl+a ctrl+a` | Switch to last used screen tab                      |
| `ctrl+a a`      | Send `ctrl+a` to current screen tab                 |
| `ctrl+a ctrl+w` | See a list of all screen tabs in the current screen |


id: scp
git_filename: ./scp.md
format: md
field_title: scp
field_category: CLI
field_updated: 2018-12-25
field_updated___timezone: UTC
data:
{"title": "scp", "category": "CLI", "updated": "2018-12-25", "authors": [{"github": "vastpeng"}], "body": "### Usage\n{: .-prime}\n\n```bash\nscp <options> source_path destination_path\n```\n\n### Conditions\n\n```bash\n-r      # transfer directory \n-v      # see the transfer details\n-C      # copy files with compression\n-l 800  # limit bandwidth with 800\n-p      # preserving the original attributes of the copied files\n-P      # connection port\n-q      # hidden the output\n```\n\n### Commands\n\n```bash\n$ scp file user@host:/path/to/file                        # copying a file to the remote system using scp command\n$ scp user@host:/path/to/file /local/path/to/file         # copying a file from the remote system using scp command\n```\n\n```bash\n$ scp file1 file2 user@host:/path/to/directory            # copying multiple files using scp command\n$ scp -r /path/to/directory user@host:/path/to/directory  # Copying an entire directory with scp command\n```"}

field_body:
### Usage
{: .-prime}

```bash
scp <options> source_path destination_path
```

### Conditions

```bash
-r      # transfer directory 
-v      # see the transfer details
-C      # copy files with compression
-l 800  # limit bandwidth with 800
-p      # preserving the original attributes of the copied files
-P      # connection port
-q      # hidden the output
```

### Commands

```bash
$ scp file user@host:/path/to/file                        # copying a file to the remote system using scp command
$ scp user@host:/path/to/file /local/path/to/file         # copying a file from the remote system using scp command
```

```bash
$ scp file1 file2 user@host:/path/to/directory            # copying multiple files using scp command
$ scp -r /path/to/directory user@host:/path/to/directory  # Copying an entire directory with scp command
```


id: saucelabs
git_filename: ./saucelabs.md
format: md
field_title: Saucelabs
data:
{"title": "Saucelabs", "body": "### Getting started\n\nSign up for opensauce:\n{: .-setup}\n\n- http://saucelabs.com/opensauce\n\nInstall [zuul](https://npmjs.com/package/zuul):\n\n```\nnpm i -g zuul\n```\n\nConfigure zuul:\n\n```yml\n# ~/.zuulrc\nsauce_username: me\nsauce_key: abc12348-e3e2-...\n```\n\nAdd `.zuul.yml` to your project:\n\n```yml\n# .zuul.yml\nui: mocha-bdd\nbrowsers:\n  - name: chrome\n    version: latest\n  - name: ie\n    version: 6..latest\n  - name: firefox\n    version: latest\n```\n\nTry to run tests:\n\n```\nzuul test/test.js\nzuul --local test/test.js\n```"}

field_body:
### Getting started

Sign up for opensauce:
{: .-setup}

- http://saucelabs.com/opensauce

Install [zuul](https://npmjs.com/package/zuul):

```
npm i -g zuul
```

Configure zuul:

```yml
# ~/.zuulrc
sauce_username: me
sauce_key: abc12348-e3e2-...
```

Add `.zuul.yml` to your project:

```yml
# .zuul.yml
ui: mocha-bdd
browsers:
  - name: chrome
    version: latest
  - name: ie
    version: 6..latest
  - name: firefox
    version: latest
```

Try to run tests:

```
zuul test/test.js
zuul --local test/test.js
```


id: sass
git_filename: ./sass.md
format: md
field_title: Sass
field_category: CSS
field_tags: Featured
field_updated: 2020-07-03
field_updated___timezone: UTC
data:
{"title": "Sass", "category": "CSS", "tags": ["Featured"], "updated": "2020-07-03", "weight": -5, "keywords": ["Variables", "mixins", "darken()", "adjust-color()", "@for @each @while @if @else", "$list: (a b c)", "$map: (a: b, c: d)"], "body": "## Basics\n{: .-three-column}\n\n### Introduction\n{: .-intro}\n\nThis is a quick reference to [Sass stylesheets](https://sass-lang.com).\n\n- [Sass documentation](https://sass-lang.com/documentation) _(sass-lang.com)_\n\n### Variables\n\n```scss\n$red: #833;\n```\n\n```scss\nbody {\n  color: $red;\n}\n```\n\n### Nesting\n\n```scss\n.markdown-body {\n  a {\n    color: blue;\n    &:hover {\n      color: red;\n    }\n  }\n}\n```\n\n#### to properties\n```scss\ntext: {\n  align: center;          // like text-align: center\n  transform: uppercase;   // like text-transform: uppercase\n}\n```\n\n### Comments\n\n```scss\n/* Block comments */\n// Line comments\n```\n\n### Mixins\n\n```scss\n@mixin heading-font {\n  font-family: sans-serif;\n  font-weight: bold;\n}\n```\n\n```scss\nh1 {\n  @include heading-font;\n}\n```\n\n#### with parameters\n\n```scss\n@mixin font-size($n) {\n  font-size: $n * 1.2em;\n}\n```\n\n```scss\nbody {\n  @include font-size(2);\n}\n```\n\n#### with default values\n\n```scss\n@mixin pad($n: 10px) {\n  padding: $n;\n}\n```\n\n```scss\nbody {\n  @include pad(15px);\n}\n```\n\n#### with a default variable\n\n```scss\n// Set a default value\n$default-padding: 10px;\n```\n\n```scss\n@mixin pad($n: $default-padding) {\n  padding: $n;\n}\n```\n\n```scss\nbody {\n  @include pad(15px);\n}\n```\n\n### Extend\n\n```scss\n.button {\n  \u00b7\u00b7\u00b7\n}\n```\n\n```scss\n.push-button {\n  @extend .button;\n}\n```\n\n### Composing\n\n```scss\n@import './other_sass_file';\n@use './other_sass_file';\n```\n\nThe `@import` rule is discouraged because will get eventually [removed from the language](https://sass-lang.com/documentation/at-rules/import).  \nInstead, we should use the [`@use` rule](https://sass-lang.com/documentation/at-rules/use).  \nThe `.scss` or `.sass` extension is optional.\n\n## Color functions\n\n### rgba\n\n```scss\nrgb(100, 120, 140)\nrgba(100, 120, 140, .5)\nrgba($color, .5)\n```\n\n### Mixing\n\n```scss\nmix($a, $b, 10%)   // 10% a, 90% b\n```\n\n### Modifying HSLA\n\n```scss\ndarken($color, 5%)\nlighten($color, 5%)\n```\n\n```scss\nsaturate($color, 5%)\ndesaturate($color, 5%)\ngrayscale($color)\n```\n\n```scss\nadjust-hue($color, 15deg)\ncomplement($color)    // like adjust-hue(_, 180deg)\ninvert($color)\n```\n\n```scss\nfade-in($color, .5)   // aka opacify()\nfade-out($color, .5)  // aka transparentize() - halves the opacity\nrgba($color, .5)      // sets alpha to .5\n```\n\n### Getting individual values\n\n#### HSLA\n\n```scss\nhue($color)         // \u2192 0deg..360deg\nsaturation($color)  // \u2192 0%..100%\nlightness($color)   // \u2192 0%..100%\nalpha($color)       // \u2192 0..1 (aka opacity())\n```\n\n#### RGB\n\n```scss\nred($color)         // \u2192 0..255\ngreen($color)\nblue($color)\n```\n\nSee: [hue()](http://sass-lang.com/documentation/Sass/Script/Functions.html#hue-instance_method), [red()](http://sass-lang.com/documentation/Sass/Script/Functions.html#red-instance_method)\n\n### Adjustments\n\n```scss\n// Changes by fixed amounts\nadjust-color($color, $blue: 5)\nadjust-color($color, $lightness: -30%)   // like darken(_, 30%)\nadjust-color($color, $alpha: -0.4)       // like fade-out(_, .4)\nadjust-color($color, $hue: 30deg)        // like adjust-hue(_, 15deg)\n```\n\n```scss\n// Changes via percentage\nscale-color($color, $lightness: 50%)\n```\n\n```scss\n// Changes one property completely\nchange-color($color, $hue: 180deg)\nchange-color($color, $blue: 250)\n```\n\nSupported: `$red` `$green` `$blue` `$hue` `$saturation` `$lightness` `$alpha`\n\n## Other functions\n\n### Strings\n\n```scss\nunquote('hello')\nquote(hello)\n```\n\n```scss\nto-upper-case(hello)\nto-lower-case(hello)\n```\n\n```scss\nstr-length(hello world)\nstr-slice(hello, 2, 5)      // \"ello\" - it's 1-based, not 0-based\nstr-insert(\"abcd\", \"X\", 1)  // \"Xabcd\"\n```\n\n### Units\n\n```scss\nunit(3em)        // 'em'\nunitless(100px)  // false\n```\n\n### Numbers\n\n```scss\nfloor(3.5)\nceil(3.5)\nround(3.5)\nabs(3.5)\n```\n\n```scss\nmin(1, 2, 3)\nmax(1, 2, 3)\n```\n\n```scss\npercentage(.5)   // 50%\nrandom(3)        // 0..3\n```\n\n### Misc\n\n```scss\nvariable-exists(red)    // checks for $red\nmixin-exists(red-text)  // checks for @mixin red-text\nfunction-exists(redify)\n```\n\n```scss\nglobal-variable-exists(red)\n```\n\n```scss\nselector-append('.menu', 'li', 'a')   // .menu li a\nselector-nest('.menu', '&:hover li')  // .menu:hover li\nselector-extend(...)\nselector-parse(...)\nselector-replace(...)\nselector-unify(...)\n```\n\n## Feature checks\n\n### Feature check\n\n```scss\nfeature-exists(global-variable-shadowing)\n```\n\n### Features\n\n* global-variable-shadowing\n* extend-selector-pseudoclass\n* units-level-3\n* at-error\n\n## Loops\n\n### For loops\n\n```scss\n@for $i from 1 through 4 {\n  .item-#{$i} { left: 20px * $i; }\n}\n```\n\n### Each loops (simple)\n\n```scss\n$menu-items: home about services contact;\n\n@each $item in $menu-items {\n  .photo-#{$item} {\n    background: url('images/#{$item}.jpg');\n  }\n}\n```\n\n### Each loops (nested)\n```scss\n$backgrounds: (home, 'home.jpg'), (about, 'about.jpg');\n\n@each $id, $image in $backgrounds {\n  .photo-#{$id} {\n    background: url($image);\n  }\n}\n```\n\n### While loops\n\n```scss\n$i: 6;\n@while $i > 0 {\n  .item-#{$i} { width: 2em * $i; }\n  $i: $i - 2;\n}\n```\n\n## Other features\n\n### Conditionals\n\n```scss\n@if $position == 'left' {\n   position: absolute;\n   left: 0;\n}\n@else if $position == 'right' {\n   position: absolute;\n   right: 0;\n}\n@else {\n   position: static;\n}\n```\n\n### Interpolation\n\n```scss\n.#{$klass} { ... }      // Class\ncall($function-name)    // Functions\n\n@media #{$tablet}\nfont: #{$size}/#{$line-height}\nurl(\"#{$background}.jpg\")\n```\n\n### Lists\n\n```scss\n$list: (a b c);\n\nnth($list, 1)  // starts with 1\nlength($list)\n\n@each $item in $list { ... }\n```\n\n### Maps\n\n```scss\n$map: (key1: value1, key2: value2, key3: value3);\n\nmap-get($map, key1)\n```\n\n## See also\n{: .-one-column}\n\n- <http://sass-lang.com/documentation/Sass/Script/Functions.html>\n- <http://sass-lang.com/documentation/file.SASS_REFERENCE.html#sassscript>"}

field_body:
## Basics
{: .-three-column}

### Introduction
{: .-intro}

This is a quick reference to [Sass stylesheets](https://sass-lang.com).

- [Sass documentation](https://sass-lang.com/documentation) _(sass-lang.com)_

### Variables

```scss
$red: #833;
```

```scss
body {
  color: $red;
}
```

### Nesting

```scss
.markdown-body {
  a {
    color: blue;
    &:hover {
      color: red;
    }
  }
}
```

#### to properties
```scss
text: {
  align: center;          // like text-align: center
  transform: uppercase;   // like text-transform: uppercase
}
```

### Comments

```scss
/* Block comments */
// Line comments
```

### Mixins

```scss
@mixin heading-font {
  font-family: sans-serif;
  font-weight: bold;
}
```

```scss
h1 {
  @include heading-font;
}
```

#### with parameters

```scss
@mixin font-size($n) {
  font-size: $n * 1.2em;
}
```

```scss
body {
  @include font-size(2);
}
```

#### with default values

```scss
@mixin pad($n: 10px) {
  padding: $n;
}
```

```scss
body {
  @include pad(15px);
}
```

#### with a default variable

```scss
// Set a default value
$default-padding: 10px;
```

```scss
@mixin pad($n: $default-padding) {
  padding: $n;
}
```

```scss
body {
  @include pad(15px);
}
```

### Extend

```scss
.button {
  ···
}
```

```scss
.push-button {
  @extend .button;
}
```

### Composing

```scss
@import './other_sass_file';
@use './other_sass_file';
```

The `@import` rule is discouraged because will get eventually [removed from the language](https://sass-lang.com/documentation/at-rules/import).  
Instead, we should use the [`@use` rule](https://sass-lang.com/documentation/at-rules/use).  
The `.scss` or `.sass` extension is optional.

## Color functions

### rgba

```scss
rgb(100, 120, 140)
rgba(100, 120, 140, .5)
rgba($color, .5)
```

### Mixing

```scss
mix($a, $b, 10%)   // 10% a, 90% b
```

### Modifying HSLA

```scss
darken($color, 5%)
lighten($color, 5%)
```

```scss
saturate($color, 5%)
desaturate($color, 5%)
grayscale($color)
```

```scss
adjust-hue($color, 15deg)
complement($color)    // like adjust-hue(_, 180deg)
invert($color)
```

```scss
fade-in($color, .5)   // aka opacify()
fade-out($color, .5)  // aka transparentize() - halves the opacity
rgba($color, .5)      // sets alpha to .5
```

### Getting individual values

#### HSLA

```scss
hue($color)         // → 0deg..360deg
saturation($color)  // → 0%..100%
lightness($color)   // → 0%..100%
alpha($color)       // → 0..1 (aka opacity())
```

#### RGB

```scss
red($color)         // → 0..255
green($color)
blue($color)
```

See: [hue()](http://sass-lang.com/documentation/Sass/Script/Functions.html#hue-instance_method), [red()](http://sass-lang.com/documentation/Sass/Script/Functions.html#red-instance_method)

### Adjustments

```scss
// Changes by fixed amounts
adjust-color($color, $blue: 5)
adjust-color($color, $lightness: -30%)   // like darken(_, 30%)
adjust-color($color, $alpha: -0.4)       // like fade-out(_, .4)
adjust-color($color, $hue: 30deg)        // like adjust-hue(_, 15deg)
```

```scss
// Changes via percentage
scale-color($color, $lightness: 50%)
```

```scss
// Changes one property completely
change-color($color, $hue: 180deg)
change-color($color, $blue: 250)
```

Supported: `$red` `$green` `$blue` `$hue` `$saturation` `$lightness` `$alpha`

## Other functions

### Strings

```scss
unquote('hello')
quote(hello)
```

```scss
to-upper-case(hello)
to-lower-case(hello)
```

```scss
str-length(hello world)
str-slice(hello, 2, 5)      // "ello" - it's 1-based, not 0-based
str-insert("abcd", "X", 1)  // "Xabcd"
```

### Units

```scss
unit(3em)        // 'em'
unitless(100px)  // false
```

### Numbers

```scss
floor(3.5)
ceil(3.5)
round(3.5)
abs(3.5)
```

```scss
min(1, 2, 3)
max(1, 2, 3)
```

```scss
percentage(.5)   // 50%
random(3)        // 0..3
```

### Misc

```scss
variable-exists(red)    // checks for $red
mixin-exists(red-text)  // checks for @mixin red-text
function-exists(redify)
```

```scss
global-variable-exists(red)
```

```scss
selector-append('.menu', 'li', 'a')   // .menu li a
selector-nest('.menu', '&:hover li')  // .menu:hover li
selector-extend(...)
selector-parse(...)
selector-replace(...)
selector-unify(...)
```

## Feature checks

### Feature check

```scss
feature-exists(global-variable-shadowing)
```

### Features

* global-variable-shadowing
* extend-selector-pseudoclass
* units-level-3
* at-error

## Loops

### For loops

```scss
@for $i from 1 through 4 {
  .item-#{$i} { left: 20px * $i; }
}
```

### Each loops (simple)

```scss
$menu-items: home about services contact;

@each $item in $menu-items {
  .photo-#{$item} {
    background: url('images/#{$item}.jpg');
  }
}
```

### Each loops (nested)
```scss
$backgrounds: (home, 'home.jpg'), (about, 'about.jpg');

@each $id, $image in $backgrounds {
  .photo-#{$id} {
    background: url($image);
  }
}
```

### While loops

```scss
$i: 6;
@while $i > 0 {
  .item-#{$i} { width: 2em * $i; }
  $i: $i - 2;
}
```

## Other features

### Conditionals

```scss
@if $position == 'left' {
   position: absolute;
   left: 0;
}
@else if $position == 'right' {
   position: absolute;
   right: 0;
}
@else {
   position: static;
}
```

### Interpolation

```scss
.#{$klass} { ... }      // Class
call($function-name)    // Functions

@media #{$tablet}
font: #{$size}/#{$line-height}
url("#{$background}.jpg")
```

### Lists

```scss
$list: (a b c);

nth($list, 1)  // starts with 1
length($list)

@each $item in $list { ... }
```

### Maps

```scss
$map: (key1: value1, key2: value2, key3: value3);

map-get($map, key1)
```

## See also
{: .-one-column}

- <http://sass-lang.com/documentation/Sass/Script/Functions.html>
- <http://sass-lang.com/documentation/file.SASS_REFERENCE.html#sassscript>


id: rubygems
git_filename: ./rubygems.md
format: md
field_title: Rubygems
field_category: Ruby
field_intro: A quick reference to common [rubygems](https://rubygems.org) CLI commands.
data:
{"title": "Rubygems", "category": "Ruby", "intro": "A quick reference to common [rubygems](https://rubygems.org) CLI commands.\n", "body": "### Building and publishing\n\n```sh\ngem build *.gemspec         # Build a gem\ngem install *.gem           # Install locally\ngem push *.gem              # Upload to rubygems.org\ngem yank foogem -v 0.0.1    # Take it back\n```\n\n### Querying\n\n```sh\ngem owner foogem -a rico@ricostacruz.com\n\ngem list                    # List local gems\ngem which rake              # Point to where lib/rake.rb is\ngem search -r rails         # [remote] Search for gems\n```\n\n### Opening a gem\n\n```sh\n# https://github.com/fnando/gem-open\ngem open foogem\nGEM_EDITOR=\"vim\" gem open foogem\n```\n\n### Changing to a directory\n\n```sh\ncd $(basename `gem which rake`)  # Go to a gem's path\n```"}

field_body:
### Building and publishing

```sh
gem build *.gemspec         # Build a gem
gem install *.gem           # Install locally
gem push *.gem              # Upload to rubygems.org
gem yank foogem -v 0.0.1    # Take it back
```

### Querying

```sh
gem owner foogem -a rico@ricostacruz.com

gem list                    # List local gems
gem which rake              # Point to where lib/rake.rb is
gem search -r rails         # [remote] Search for gems
```

### Opening a gem

```sh
# https://github.com/fnando/gem-open
gem open foogem
GEM_EDITOR="vim" gem open foogem
```

### Changing to a directory

```sh
cd $(basename `gem which rake`)  # Go to a gem's path
```


id: ruby21
git_filename: ./ruby21.md
format: md
field_title: Ruby 2.1
field_category: Ruby
field_tags: Archived
field_intro: Quick reference to the [new features in Ruby 2.1](https://www.ruby-lang.org/).
data:
{"title": "Ruby 2.1", "category": "Ruby", "tags": ["Archived"], "intro": "Quick reference to the [new features in Ruby 2.1](https://www.ruby-lang.org/).\n", "body": "### Named arguments with defaults\n\n```ruby\n# length is required\ndef pad(num, length:, char: \"0\")\n  num.to_s.rjust(length, char)\nend\n```\n\n```ruby\npad(42, length: 6) #=> \"000042\"\npad(42) #=> #<ArgumentError: missing keyword: length>\n```\n\n### Module.prepend\n\n```ruby\nprepend(\n  Module.new do\n    define_method ...\n  end\n)\n```\n\n### References\n\n- http://globaldev.co.uk/2013/03/ruby-2-0-0-in-detail\n- http://globaldev.co.uk/2014/05/ruby-2-1-in-detail"}

field_body:
### Named arguments with defaults

```ruby
# length is required
def pad(num, length:, char: "0")
  num.to_s.rjust(length, char)
end
```

```ruby
pad(42, length: 6) #=> "000042"
pad(42) #=> #<ArgumentError: missing keyword: length>
```

### Module.prepend

```ruby
prepend(
  Module.new do
    define_method ...
  end
)
```

### References

- http://globaldev.co.uk/2013/03/ruby-2-0-0-in-detail
- http://globaldev.co.uk/2014/05/ruby-2-1-in-detail


id: ruby
git_filename: ./ruby.md
format: md
field_title: Ruby
field_category: Ruby
field_tags: WIP
field_intro: Quick reference to some features of the Ruby programming language.
data:
{"title": "Ruby", "category": "Ruby", "tags": ["WIP"], "intro": "Quick reference to some features of the Ruby programming language.\n", "body": "### Reference\n{:.-one-column}\n\n| Code                    | Description                                               |\n| ----------------------- | --------------------------------------------------------- |\n| `$!`                    | latest error message                                      |\n| `$@`                    | location of error                                         |\n| `$_`                    | string last read by gets                                  |\n| `$.`                    | line number last read by interpreter                      |\n| `$&`                    | string last matched by regexp                             |\n| `$~`                    | the last regexp match, as an array of subexpressions      |\n| `$n`                    | the nth subexpression in the last match (same as `$~[n]`) |\n| `$=`                    | case-insensitivity flag                                   |\n| `$/`                    | input record separator                                    |\n| `$\\`                    | output record separator                                   |\n| `$0`                    | the name of the ruby script file                          |\n| `$*` (or `ARGV`)        | the command line arguments                                |\n| `$$`                    | interpreter's process ID                                  |\n| `$?`                    | exit status of last executed child process                |\n| `$-i` `$-l` `$-p` `$-v` | Command line switches                                     |\n| `$-v` (or `$VERBOSE`)   | verbose mode                                              |"}

field_body:
### Reference
{:.-one-column}

| Code                    | Description                                               |
| ----------------------- | --------------------------------------------------------- |
| `$!`                    | latest error message                                      |
| `$@`                    | location of error                                         |
| `$_`                    | string last read by gets                                  |
| `$.`                    | line number last read by interpreter                      |
| `$&`                    | string last matched by regexp                             |
| `$~`                    | the last regexp match, as an array of subexpressions      |
| `$n`                    | the nth subexpression in the last match (same as `$~[n]`) |
| `$=`                    | case-insensitivity flag                                   |
| `$/`                    | input record separator                                    |
| `$\`                    | output record separator                                   |
| `$0`                    | the name of the ruby script file                          |
| `$*` (or `ARGV`)        | the command line arguments                                |
| `$$`                    | interpreter's process ID                                  |
| `$?`                    | exit status of last executed child process                |
| `$-i` `$-l` `$-p` `$-v` | Command line switches                                     |
| `$-v` (or `$VERBOSE`)   | verbose mode                                              |


id: rtorrent
git_filename: ./rtorrent.md
format: md
field_title: rTorrent
field_category: CLI
data:
{"title": "rTorrent", "category": "CLI", "intro": "[rTorrent](https://rakshasa.github.io/rtorrent/) is a command-line torrent application. Here are some shortcut keys.\n", "body": "## Shortcuts\n{: .-three-column}\n\n### Global\n\n| `^q` | Quit |\n{: .-shortcuts}\n\n### Main view\n\n| Shortcut | Description |\n| --- | --- |\n| `bksp` | Add torrent |\n| --- | --- |\n| `->` | View download |\n| --- | --- |\n| `1` _-_ `7` | Change view |\n| --- | --- |\n| `^S` | Start download |\n| `^D` | Stop download (or remove stopped) |\n| `^K` | Close a torrent |\n| --- | --- |\n| `+` _/_ `-` | Change priority |\n{: .-shortcuts}\n\n### Throttling\n\n#### Upload\n\n| `a` _/_ `s` _/_ `d` | Increase upload throttle by 1/5/50 KB   |\n| `z` _/_ `x` _/_ `c` | Decrease upload throttle by 1/5/50 KB   |\n{: .-shortcuts}\n\n#### Download\n\n| `A` _/_ `S` _/_ `D` | Increase download throttle by 1/5/50 KB |\n| `Z` _/_ `X` _/_ `C` | Decrease download throttle by 1/5/50 KB |\n{: .-shortcuts}\n\n### Download view\n\n| `1` _/_ `2` | Adjust max uploads |\n| `3` _/_ `4` | Adjust min peers   |\n| `5` _/_ `6` | Adjust max peers   |\n{: .-shortcuts}\n\n### File list view\n\n| `space` | Change priority |\n{: .-shortcuts}\n\n## Also see\n\n- [rTorrent website](https://rakshasa.github.io/rtorrent/) _(rakshasa.github.io)_\n- [rTorrent wiki](https://github.com/rakshasa/rtorrent/wiki) _(github.com)_"}

field_intro:
[rTorrent](https://rakshasa.github.io/rtorrent/) is a command-line torrent application. Here are some shortcut keys.

field_body:
## Shortcuts
{: .-three-column}

### Global

| `^q` | Quit |
{: .-shortcuts}

### Main view

| Shortcut | Description |
| --- | --- |
| `bksp` | Add torrent |
| --- | --- |
| `->` | View download |
| --- | --- |
| `1` _-_ `7` | Change view |
| --- | --- |
| `^S` | Start download |
| `^D` | Stop download (or remove stopped) |
| `^K` | Close a torrent |
| --- | --- |
| `+` _/_ `-` | Change priority |
{: .-shortcuts}

### Throttling

#### Upload

| `a` _/_ `s` _/_ `d` | Increase upload throttle by 1/5/50 KB   |
| `z` _/_ `x` _/_ `c` | Decrease upload throttle by 1/5/50 KB   |
{: .-shortcuts}

#### Download

| `A` _/_ `S` _/_ `D` | Increase download throttle by 1/5/50 KB |
| `Z` _/_ `X` _/_ `C` | Decrease download throttle by 1/5/50 KB |
{: .-shortcuts}

### Download view

| `1` _/_ `2` | Adjust max uploads |
| `3` _/_ `4` | Adjust min peers   |
| `5` _/_ `6` | Adjust max peers   |
{: .-shortcuts}

### File list view

| `space` | Change priority |
{: .-shortcuts}

## Also see

- [rTorrent website](https://rakshasa.github.io/rtorrent/) _(rakshasa.github.io)_
- [rTorrent wiki](https://github.com/rakshasa/rtorrent/wiki) _(github.com)_


id: rsync
git_filename: ./rsync.md
format: md
field_title: Rsync
field_category: CLI
data:
{"title": "Rsync", "category": "CLI", "weight": -1, "body": "### Basic example\n{: .-prime}\n\n```bash\n# syncing folder src into dest:\nrsync -avz ./src /dest\n# syncing the content of src into dest:\nrsync -avz ./src/ /dest\n```\n\n### OSX\n\n```bash\n--exclude '.Trashes'\n--exclude '.Spotlight-V100'\n--exclude '.fseventsd'\n```\n\n### Transfer options\n\n```bash\n-z, --compress\n-n, --dry-run\n    --partial   # allows resuming of aborted syncs\n    --bwlimit=RATE    # limit socket I/O bandwidth\n```\n\n### Display options\n\n```bash\n-q, --quiet\n-v, --verbose\n    --stats\n-h, --human-readable\n    --progress\n-P                     # same as --partial --progress\n```\n\n### Skipping options\n\n```bash\n-u, --update     # skip files newer on dest\n-c, --checksum   # skip based on checksum, not mod-time & size\n```\n\n### Backup options\n\n```bash\n-b, --backup           # backup with suffix\n    --suffix=SUFFIX    # default ~ without --backup-dir\n    --backup-dir=DIR\n```\n\n### Include options\n\n```bash\n--exclude=PATTERN\n--include=PATTERN\n```\n\n```bash\n--exclude-from=FILE\n--include-from=FILE\n--files-from=FILE    # read list of filenames from FILE\n```\n\n```bash\n-C, --cvs-exclude    # exclude from local/global .cvsignore\n```\n\n### Archive options\n\n```bash\n-a, --archive    # archive (-rlptgoD)\n```\n\n```bash\n-r, --recursive\n-l, --links      # copy symlinks as links\n-p, --perms      # preserve permissions\n-t, --times      # preserve times\n-g, --group      # preserve group\n-o, --owner      # preserve owner\n-D               # same as --devices --specials\n```\n\n```bash\n--delete         # Delete extra files\n```"}

field_body:
### Basic example
{: .-prime}

```bash
# syncing folder src into dest:
rsync -avz ./src /dest
# syncing the content of src into dest:
rsync -avz ./src/ /dest
```

### OSX

```bash
--exclude '.Trashes'
--exclude '.Spotlight-V100'
--exclude '.fseventsd'
```

### Transfer options

```bash
-z, --compress
-n, --dry-run
    --partial   # allows resuming of aborted syncs
    --bwlimit=RATE    # limit socket I/O bandwidth
```

### Display options

```bash
-q, --quiet
-v, --verbose
    --stats
-h, --human-readable
    --progress
-P                     # same as --partial --progress
```

### Skipping options

```bash
-u, --update     # skip files newer on dest
-c, --checksum   # skip based on checksum, not mod-time & size
```

### Backup options

```bash
-b, --backup           # backup with suffix
    --suffix=SUFFIX    # default ~ without --backup-dir
    --backup-dir=DIR
```

### Include options

```bash
--exclude=PATTERN
--include=PATTERN
```

```bash
--exclude-from=FILE
--include-from=FILE
--files-from=FILE    # read list of filenames from FILE
```

```bash
-C, --cvs-exclude    # exclude from local/global .cvsignore
```

### Archive options

```bash
-a, --archive    # archive (-rlptgoD)
```

```bash
-r, --recursive
-l, --links      # copy symlinks as links
-p, --perms      # preserve permissions
-t, --times      # preserve times
-g, --group      # preserve group
-o, --owner      # preserve owner
-D               # same as --devices --specials
```

```bash
--delete         # Delete extra files
```


id: rst
git_filename: ./rst.md
format: md
field_title: ReStructuredText
field_category: Markup
data:
{"title": "ReStructuredText", "category": "Markup", "body": "### About\n{: .-intro}\n\nReStructuredText is a markup language for writing documents.\n\n- <https://en.wikipedia.org/wiki/ReStructuredText>\n\n### Comments\n\n    .. @theme 2010\n    .. include:: ../themes/2010/common.rst\n    .. contents::\n    .. |substitute| replace:: replacement name\n\n### Headings\n\n    Heading\n    =======\n    \n    .. class:: brief\n    \n    Hello there. |substitute| **This is bold**\n    \n    \n     - Bullet list with a link_ (or `link with words`_)\n     - Yes\n    \n    .. _link: http://link.org\n    \n### PDF page break\n\n    .. raw:: pdf\n    \n       PageBreak oneColumn\n    \n### Link targets\n    \n    Internal link target_.\n    \n    .. _target:\n    \n    This is where _target will end up in.\n    \n### Tables (?)\n    \n    .. class:: hash-table\n    \n    .. list-table::\n    \n       * - :key:`Cuisine:`\n         - :val:`French/fusion`\n       * - :key:`Number of ingredients:`\n         - :val:`8`\n       * - :key:`Preparation time:`\n         - :val:`30 hours`"}

field_body:
### About
{: .-intro}

ReStructuredText is a markup language for writing documents.

- <https://en.wikipedia.org/wiki/ReStructuredText>

### Comments

    .. @theme 2010
    .. include:: ../themes/2010/common.rst
    .. contents::
    .. |substitute| replace:: replacement name

### Headings

    Heading
    =======
    
    .. class:: brief
    
    Hello there. |substitute| **This is bold**
    
    
     - Bullet list with a link_ (or `link with words`_)
     - Yes
    
    .. _link: http://link.org
    
### PDF page break

    .. raw:: pdf
    
       PageBreak oneColumn
    
### Link targets
    
    Internal link target_.
    
    .. _target:
    
    This is where _target will end up in.
    
### Tables (?)
    
    .. class:: hash-table
    
    .. list-table::
    
       * - :key:`Cuisine:`
         - :val:`French/fusion`
       * - :key:`Number of ingredients:`
         - :val:`8`
       * - :key:`Preparation time:`
         - :val:`30 hours`


id: rspec
git_filename: ./rspec.md
format: md
field_title: RSpec
field_category: Ruby
data:
{"title": "RSpec", "category": "Ruby", "body": "### About\n{: .-intro}\n\nRSpec is a Ruby library for testing.\n\n- <https://rspec.info/>\n\n### Invoking tests\n\n```sh\nrake -T spec      # List spec tasks\n\nrake spec         # Run all\n\nrake spec/models/mymodel_spec.rb\nrake spec/models/mymodel_spec.rb:27\n```\n\n## Writing tests\n\n```rb\ndescribe \"A User (in general)\" do\n  include UserSpecHelper\n\n  subject { Person.new }\n\n  let(:admin) { Person.new(role: :admin) }\n\n  context \"setter methods\" do\n    it \"should do this\" do\n      pending \"some other thing\"\n\n      expect(subject.name).to eq 'x'\n    end\n  end\nend\n```\n\n### Before/after\n\n```rb\nbefore :each do\n  # before all tests\nend\n\nbefore :all do\n  # before this suite\nend\n\nafter : all do\n  # after this suite\nend\n```\n\n### Subjects\n\n```rb\nsubject { CheckingAccount.new }\nit { is_expected.to be_empty }\n\n# also names: subject(:account) { ... }\n```\n\n## Expectations\n\n```rb\ntarget.should eq 1\ntarget.should_not eq 1\n\nexpect(target).to eq 1\nexpect(target).not_to eq 1\n```\n\n### Numeric\n\n```rb\nexpect(5).to be < 6\nexpect(5).to == 5\nexpect(5).to equal value\nexpect(5).to be_between(1, 10)\nexpect(5).to be_within(0.05).of value\n```\n\n### Compound expectations\n\n```rb\nexpect(1).to (be < 2).or be > 5\n```\n\nUse `or`/`and` to string multiple matchers together. See: [Compound expectations](https://relishapp.com/rspec/rspec-expectations/docs/compound-expectations)\n\n### Comparison\n\n```rb\nexpect(x).to be value\nexpect(x).to satisfy { |arg| ... }\nexpect(x).to match /regexp/\n```\n\n### Predicate\n\n```rb\nexpect(x).to be_zero    # FixNum#zero?\nexpect(x).to be_empty   # Array#empty?\nexpect(x).to have_key   # Hash#has_key?\n```\n\n### Objects\n\n```rb\nexpect(obj).to be_an_instance_of MyClass\nexpect(obj).to be_a_kind_of MyClass\nexpect(obj).to respond_to :save!\n```\n\n### Control flow\n\n```rb\nexpect { user.save! }.to raise_error\nexpect { user.save! }.to raise_error(ExceptionName, /msg/)\nexpect { user.save! }.to throw :symbol\n```\n\n### Enumerables/arrays\n\n```rb\nexpect(list).to include(<object>)\n\nexpect(list).to have(1).things\nexpect(list).to have_at_least(2).things\nexpect(list).to have_at_most(3).things\n\nexpect(list).to have(2).errors_on(:field)\n\nexpect(list).to contain_exactly(1, 2)\nexpect(list).to match_array([1, 2])\n```\n\n### Change\n\n```rb\nexpect { thing.approve! }.to \\\n  change(thing, :status)\n  .from(Status::AWAITING_APPROVAL)\n  .to(Status::APPROVED)\n\nexpect { thing.destroy }.to \\\n  change(Thing, :count)\n  .by(-1)\n```\n\n## Doubles\n\n```rb\nbook = double('book')\nbook = instance_double('Book', pages: 250)\n```\n\n### Method stubs\n\n```rb\nallow(die).to receive(:roll)\nallow(die).to receive(:roll) { 3 }\nallow_any_instance_of(Die).to receive(:roll)\n\nexpect(die).to receive(:roll)\n  .with(1)\n  .with(1, true)\n  .with(boolean)\n  .with(anything)\n  .with(any_args)\n  .with(1, any_args)\n  .with(no_args)\n  .with(hash_including(a: 1))\n  .with(hash_excluding(a: 1))\n  .with(array_including(:a, :b))\n  .with(array_excluding(:a, :b))\n  .with(instance_of(Fixnum))\n  .with(kind_of(Numeric))\n  .with(<matcher>)\n\n  .once\n  .twice\n  .exactly(n).times\n  .at_least(:once)\n  .at_least(:twice)\n  .at_least(n).times\n  .at_most(:once)\n  .at_most(:twice)\n  .at_most(n).times\n```\n\nhttps://relishapp.com/rspec/rspec-mocks/docs\n\n## Spec helpers\n\n```rb\nmodule UserSpecHelper\n  def valid_user_attributes\n    { :email => \"joe@bloggs.com\",\n      :username => \"joebloggs\",\n      :password => \"abcdefg\"}\n  end\nend\n```\n\n```rb\ndescribe User do\n  include UserSpecHelper\n\n  ...\nend\n```"}

field_body:
### About
{: .-intro}

RSpec is a Ruby library for testing.

- <https://rspec.info/>

### Invoking tests

```sh
rake -T spec      # List spec tasks

rake spec         # Run all

rake spec/models/mymodel_spec.rb
rake spec/models/mymodel_spec.rb:27
```

## Writing tests

```rb
describe "A User (in general)" do
  include UserSpecHelper

  subject { Person.new }

  let(:admin) { Person.new(role: :admin) }

  context "setter methods" do
    it "should do this" do
      pending "some other thing"

      expect(subject.name).to eq 'x'
    end
  end
end
```

### Before/after

```rb
before :each do
  # before all tests
end

before :all do
  # before this suite
end

after : all do
  # after this suite
end
```

### Subjects

```rb
subject { CheckingAccount.new }
it { is_expected.to be_empty }

# also names: subject(:account) { ... }
```

## Expectations

```rb
target.should eq 1
target.should_not eq 1

expect(target).to eq 1
expect(target).not_to eq 1
```

### Numeric

```rb
expect(5).to be < 6
expect(5).to == 5
expect(5).to equal value
expect(5).to be_between(1, 10)
expect(5).to be_within(0.05).of value
```

### Compound expectations

```rb
expect(1).to (be < 2).or be > 5
```

Use `or`/`and` to string multiple matchers together. See: [Compound expectations](https://relishapp.com/rspec/rspec-expectations/docs/compound-expectations)

### Comparison

```rb
expect(x).to be value
expect(x).to satisfy { |arg| ... }
expect(x).to match /regexp/
```

### Predicate

```rb
expect(x).to be_zero    # FixNum#zero?
expect(x).to be_empty   # Array#empty?
expect(x).to have_key   # Hash#has_key?
```

### Objects

```rb
expect(obj).to be_an_instance_of MyClass
expect(obj).to be_a_kind_of MyClass
expect(obj).to respond_to :save!
```

### Control flow

```rb
expect { user.save! }.to raise_error
expect { user.save! }.to raise_error(ExceptionName, /msg/)
expect { user.save! }.to throw :symbol
```

### Enumerables/arrays

```rb
expect(list).to include(<object>)

expect(list).to have(1).things
expect(list).to have_at_least(2).things
expect(list).to have_at_most(3).things

expect(list).to have(2).errors_on(:field)

expect(list).to contain_exactly(1, 2)
expect(list).to match_array([1, 2])
```

### Change

```rb
expect { thing.approve! }.to \
  change(thing, :status)
  .from(Status::AWAITING_APPROVAL)
  .to(Status::APPROVED)

expect { thing.destroy }.to \
  change(Thing, :count)
  .by(-1)
```

## Doubles

```rb
book = double('book')
book = instance_double('Book', pages: 250)
```

### Method stubs

```rb
allow(die).to receive(:roll)
allow(die).to receive(:roll) { 3 }
allow_any_instance_of(Die).to receive(:roll)

expect(die).to receive(:roll)
  .with(1)
  .with(1, true)
  .with(boolean)
  .with(anything)
  .with(any_args)
  .with(1, any_args)
  .with(no_args)
  .with(hash_including(a: 1))
  .with(hash_excluding(a: 1))
  .with(array_including(:a, :b))
  .with(array_excluding(:a, :b))
  .with(instance_of(Fixnum))
  .with(kind_of(Numeric))
  .with(<matcher>)

  .once
  .twice
  .exactly(n).times
  .at_least(:once)
  .at_least(:twice)
  .at_least(n).times
  .at_most(:once)
  .at_most(:twice)
  .at_most(n).times
```

https://relishapp.com/rspec/rspec-mocks/docs

## Spec helpers

```rb
module UserSpecHelper
  def valid_user_attributes
    { :email => "joe@bloggs.com",
      :username => "joebloggs",
      :password => "abcdefg"}
  end
end
```

```rb
describe User do
  include UserSpecHelper

  ...
end
```


id: rspec-rails
git_filename: ./rspec-rails.md
format: md
field_title: Rspec-rails
field_category: Ruby
data:
{"title": "Rspec-rails", "category": "Ruby", "body": "### About\n{: .-intro}\n\nRSpec is a Ruby library for testing. [rspec-rails](https://github.com/rspec/rspec-rails) is its Rails integration.\n\n- <https://rspec.info/>\n- <https://github.com/rspec/rspec-rails>\n\n### Spec tasks\n\n    rake spec:controllers\n    rake spec:helpers\n    rake spec:lib\n    rake spec:mailers\n    rake spec:models\n    rake spec:requests\n    rake spec:routing\n    rake spec:views\n\n### Models\n\n```rb\n# spec/models/*.rb\ndescribe MyModel do\nend\n```\n\n### Controllers\n\n```rb\n# spec/controllers/*.rb\ndescribe MyController do\n  describe \"POST update\" do\n    render_views #optional\n\n    it \"works\" do\n      post :update, { user: { name: \"john\" } }\n\n      controller\n      controller.send ...\n\n      response\n      expect(response).to be_success\n      expect(response).to have_http_status(200)\n      expect(response).to render_template(\"index\")\n      expect(response).to redirect_to '/..'\n\n      expect(assigns :article).to eq article\n\n      response.status\n    end\n  end\nend\n```\n\n### Request\n\n```js\n# spec/requests/*.rb\ndescribe \"home page\" do\n  it \"displays the user's username after successful login\" do\n    get \"/login\"\n    post \"/login\", username: \"jdoe\", password: \"secret\"\n\n    expect(response.status).to eql 200\n    expect(response).to redirect_to(...)\n    expect(response).to render_template(:show)\n    expect(response.body).to include 'hello'\n    follow_redirect!\n  end\nend\n```\n\n### Routing\n\n```rb\n# spec/routing/*.rb\ndescribe \"routing to profiles\" do\n  it \"routes /profile/:username to profile#show for username\" do\n    expect(get: \"/profiles/jsmith\").to route_to(\n      controller: \"profiles\",\n      action: \"show\",\n      username: \"jsmith\"\n    )\n  end\n\n  it \"does not expose a list of profiles\" do\n    expect(get: \"/profiles\").not_to be_routable\n  end\nend\n```\n\n### Helpers\n\n```rb\n# spec/helpers/*.rb\ndescribe EventsHelper do\n  describe \"#link_to_event\" do\n    it \"displays the title, and formatted date\" do\n      event = Event.new(\"Ruby Kaigi\", Date.new(2010, 8, 27))\n\n      # helper is an instance of ActionView::Base configured with the\n      # EventsHelper and all of Rails' built-in helpers\n      expect(helper.link_to_event).to match /Ruby Kaigi, 27 Aug, 2010/\n    end\n  end\nend\n```\n\n### Features\n\n```rb\n# spec/features/*.rb\nfeature 'Signing in' do\n  given(:something) { \"hi\" }\n\n  background do\n    User.make email: 'hi@gmail.com'\n  end\n\n  scenario 'Signing in with credentials' do\n  end\nend\n```\n\n### Matchers\n\n```rb\nbe_a_new(Widget)  # new_record?\nrender_template(\"new\")\nrender_template(partial: 'form', locals: {...})\nredirect_to(widgets_path)\nroute_to(..)\nbe_routable\nhave_http_status(500)\nhave_http_status(:created)\n```\n\n### Time helpers\n\n```\ntravel_to Time.new(2014, 11, 14, 01, 04, 44)\n...\ntravel_back\n\ntravel_to Time.new(2014, 11, 14, 01, 04, 44) do\n  ...\nend\n```"}

field_body:
### About
{: .-intro}

RSpec is a Ruby library for testing. [rspec-rails](https://github.com/rspec/rspec-rails) is its Rails integration.

- <https://rspec.info/>
- <https://github.com/rspec/rspec-rails>

### Spec tasks

    rake spec:controllers
    rake spec:helpers
    rake spec:lib
    rake spec:mailers
    rake spec:models
    rake spec:requests
    rake spec:routing
    rake spec:views

### Models

```rb
# spec/models/*.rb
describe MyModel do
end
```

### Controllers

```rb
# spec/controllers/*.rb
describe MyController do
  describe "POST update" do
    render_views #optional

    it "works" do
      post :update, { user: { name: "john" } }

      controller
      controller.send ...

      response
      expect(response).to be_success
      expect(response).to have_http_status(200)
      expect(response).to render_template("index")
      expect(response).to redirect_to '/..'

      expect(assigns :article).to eq article

      response.status
    end
  end
end
```

### Request

```js
# spec/requests/*.rb
describe "home page" do
  it "displays the user's username after successful login" do
    get "/login"
    post "/login", username: "jdoe", password: "secret"

    expect(response.status).to eql 200
    expect(response).to redirect_to(...)
    expect(response).to render_template(:show)
    expect(response.body).to include 'hello'
    follow_redirect!
  end
end
```

### Routing

```rb
# spec/routing/*.rb
describe "routing to profiles" do
  it "routes /profile/:username to profile#show for username" do
    expect(get: "/profiles/jsmith").to route_to(
      controller: "profiles",
      action: "show",
      username: "jsmith"
    )
  end

  it "does not expose a list of profiles" do
    expect(get: "/profiles").not_to be_routable
  end
end
```

### Helpers

```rb
# spec/helpers/*.rb
describe EventsHelper do
  describe "#link_to_event" do
    it "displays the title, and formatted date" do
      event = Event.new("Ruby Kaigi", Date.new(2010, 8, 27))

      # helper is an instance of ActionView::Base configured with the
      # EventsHelper and all of Rails' built-in helpers
      expect(helper.link_to_event).to match /Ruby Kaigi, 27 Aug, 2010/
    end
  end
end
```

### Features

```rb
# spec/features/*.rb
feature 'Signing in' do
  given(:something) { "hi" }

  background do
    User.make email: 'hi@gmail.com'
  end

  scenario 'Signing in with credentials' do
  end
end
```

### Matchers

```rb
be_a_new(Widget)  # new_record?
render_template("new")
render_template(partial: 'form', locals: {...})
redirect_to(widgets_path)
route_to(..)
be_routable
have_http_status(500)
have_http_status(:created)
```

### Time helpers

```
travel_to Time.new(2014, 11, 14, 01, 04, 44)
...
travel_back

travel_to Time.new(2014, 11, 14, 01, 04, 44) do
  ...
end
```


id: ronn
git_filename: ./ronn.md
format: md
field_title: Ronn
field_category: Ruby libraries
field_prism_languages: bash, ruby, json, markdown
field_updated: 2017-10-15
field_updated___timezone: UTC
data:
{"title": "Ronn", "category": "Ruby libraries", "updated": "2017-10-15", "weight": -1, "prism_languages": ["bash", "ruby", "json", "markdown"], "intro": "Ronn generates Man pages. See [ronn(1)](https://rtomayko.github.io/ronn/ronn.1.html), [ronn-format(7)](https://rtomayko.github.com/ronn/ronn-format.7.html). Also see it on GitHub: [rtomayko/ronn](httpss://github.com/rtomayko/ronn).\n", "body": "## Getting started\n{: .-left-reference}\n\n### Installation\n\n#### Installation\n\n```bash\ngem install ronn\n```\n\n#### Usage\n\n```bash\nronn foo.1.md        # creates foo.1.html\nronn -r foo.1.md     # creates foo.1 (--roff)\nronn -r -h foo.1.md  # builds --roff and --html\nronn -m foo.1.md     # view as manpage\n```\n\nRonn is a Ruby gem.\n\n### Basic template\n\n```markdown\nname(1) -- short, single-sentence description\n=============================================\n\n## SYNOPSIS\n\n`name` [<optional>...] <flags>\n\n## DESCRIPTION\n\nA normal paragraph. This can span multiple lines and is terminated with two\nor more line endings just like Markdown.\n\n## OPTIONS\n\n * `-h`, `--help` :\n   Displays the help screen.\n\n * `--version` : \n   Displays version information.\n\n## EXAMPLES\n\nIndent examples with 4 spaces.\n\n    $ ls\n    $ ls -la\n\n## COPYRIGHT\n\n**PROJECTNAME** is copyright (c) 2015, Rico Sta. Cruz. Released under the MIT\nlicense.\n\n## SEE ALSO\n\nronn-format(7), ronn(1)\n```\n\n## Formatting tags\n\n### Inline\n\n#### Bold\n\n```\n`code`\n**strong**\n```\n\n#### Underline\n\n```\n<variable>\n_emphasis_\n*emphasis*\n```\n\n### Linking\n\n#### Manual references\n\n```\nsh(1)\nmarkdown(7)\n```\n\n#### Sections\n\n```\n[STANDARDS][]\n[SEE ALSO][]\n[DIFFERENT TEXT][#SEE-ALSO]\n```\n\n#### URL links\n\n```\n[URL link](https://github.com/rstacruz)\n<https://github.com>\n```\n\n## Frequently-used sections\n{: .-one-column}\n\n### Sections\n\n- `## SYNOPSIS`\n- `## DESCRIPTION`\n- `## OPTIONS`\n- `## SYNTAX`\n- `## ENVIRONMENT`\n- `## RETURN VALUES`\n- `## STANDARDS`\n- `## SECURITY CONSIDERATIONS`\n- `## BUGS`\n- `## HISTORY`\n- `## AUTHOR`\n- `## COPYRIGHT`\n- `## SEE ALSO`\n{: .-four-column}\n\n## Other CLI options\n\n### Options\n\n```bash\n--pipe                       # write to stdout\n--server, -S                 # serve in http://localhost:1207\n```\n\n```bash\n--html, -5                   # default\n--fragment, -f               # html without header/title/footer\n```\n\n```bash\n--style=toc,80c              # toc (table of contents)\n                             # 80c (use 80c instead of 100c)\n                             # print (include print stylesheet)\n                             # dark\n```\n\n```bash\n--manual=\"MY MANUAL\"         # shown on top-center\n--organization=\"RONN 0.7.0\"  # shown on bottom-left\n--date=\"YYYY-MM-DD\"          # shown on bottom-center\n```\n\n## Sections\n\n| Section | Description                                   |\n| ---     | ---                                           |\n| `1`     | General commands                              |\n| `2`     | System calls                                  |\n| `3`     | C standard lib                                |\n| `4`     | Special files (/dev) and drivers              |\n| `5`     | File formats                                  |\n| `6`     | Games                                         |\n| `7`     | Misc                                          |\n| `8`     | System administration commands and procedures |\n\nSee [Man page sections](https://www.december.com/unix/ref/mansec.html) (december.com).\n\n## Using with npm\n\n### npm scripts\n\nPlace manual files in `man/xxx.1.md`, then in package.json:\n{: .-setup}\n\n```json\n\"scripts\": {\n  \"prepublish\": \"npm run build-man\",\n  \"build-man\": \"if which ronn; then ronn man/*.md --html --roff --style=toc,80c --organization=\\\"@rstacruz\\\"; fi\"\n},\n\"directories\": {\n  \"man\": \"man\"\n}\n```\n\n### marked-man\n\n```\nnpm install -g marked-man\nmarked-man foo.1.md > foo.1\n```\n\n#### Differences\n\n* No definition lists\n* Can't use `<br>`\n\nSee [marked-man](https://github.com/kapouer/marked-man)."}

field_intro:
Ronn generates Man pages. See [ronn(1)](https://rtomayko.github.io/ronn/ronn.1.html), [ronn-format(7)](https://rtomayko.github.com/ronn/ronn-format.7.html). Also see it on GitHub: [rtomayko/ronn](httpss://github.com/rtomayko/ronn).

field_body:
## Getting started
{: .-left-reference}

### Installation

#### Installation

```bash
gem install ronn
```

#### Usage

```bash
ronn foo.1.md        # creates foo.1.html
ronn -r foo.1.md     # creates foo.1 (--roff)
ronn -r -h foo.1.md  # builds --roff and --html
ronn -m foo.1.md     # view as manpage
```

Ronn is a Ruby gem.

### Basic template

```markdown
name(1) -- short, single-sentence description
=============================================

## SYNOPSIS

`name` [<optional>...] <flags>

## DESCRIPTION

A normal paragraph. This can span multiple lines and is terminated with two
or more line endings just like Markdown.

## OPTIONS

 * `-h`, `--help` :
   Displays the help screen.

 * `--version` : 
   Displays version information.

## EXAMPLES

Indent examples with 4 spaces.

    $ ls
    $ ls -la

## COPYRIGHT

**PROJECTNAME** is copyright (c) 2015, Rico Sta. Cruz. Released under the MIT
license.

## SEE ALSO

ronn-format(7), ronn(1)
```

## Formatting tags

### Inline

#### Bold

```
`code`
**strong**
```

#### Underline

```
<variable>
_emphasis_
*emphasis*
```

### Linking

#### Manual references

```
sh(1)
markdown(7)
```

#### Sections

```
[STANDARDS][]
[SEE ALSO][]
[DIFFERENT TEXT][#SEE-ALSO]
```

#### URL links

```
[URL link](https://github.com/rstacruz)
<https://github.com>
```

## Frequently-used sections
{: .-one-column}

### Sections

- `## SYNOPSIS`
- `## DESCRIPTION`
- `## OPTIONS`
- `## SYNTAX`
- `## ENVIRONMENT`
- `## RETURN VALUES`
- `## STANDARDS`
- `## SECURITY CONSIDERATIONS`
- `## BUGS`
- `## HISTORY`
- `## AUTHOR`
- `## COPYRIGHT`
- `## SEE ALSO`
{: .-four-column}

## Other CLI options

### Options

```bash
--pipe                       # write to stdout
--server, -S                 # serve in http://localhost:1207
```

```bash
--html, -5                   # default
--fragment, -f               # html without header/title/footer
```

```bash
--style=toc,80c              # toc (table of contents)
                             # 80c (use 80c instead of 100c)
                             # print (include print stylesheet)
                             # dark
```

```bash
--manual="MY MANUAL"         # shown on top-center
--organization="RONN 0.7.0"  # shown on bottom-left
--date="YYYY-MM-DD"          # shown on bottom-center
```

## Sections

| Section | Description                                   |
| ---     | ---                                           |
| `1`     | General commands                              |
| `2`     | System calls                                  |
| `3`     | C standard lib                                |
| `4`     | Special files (/dev) and drivers              |
| `5`     | File formats                                  |
| `6`     | Games                                         |
| `7`     | Misc                                          |
| `8`     | System administration commands and procedures |

See [Man page sections](https://www.december.com/unix/ref/mansec.html) (december.com).

## Using with npm

### npm scripts

Place manual files in `man/xxx.1.md`, then in package.json:
{: .-setup}

```json
"scripts": {
  "prepublish": "npm run build-man",
  "build-man": "if which ronn; then ronn man/*.md --html --roff --style=toc,80c --organization=\"@rstacruz\"; fi"
},
"directories": {
  "man": "man"
}
```

### marked-man

```
npm install -g marked-man
marked-man foo.1.md > foo.1
```

#### Differences

* No definition lists
* Can't use `<br>`

See [marked-man](https://github.com/kapouer/marked-man).


id: rollup
git_filename: ./rollup.md
format: md
field_title: Rollup.js
field_category: JavaScript libraries
field_updated: 2020-01-29
field_updated___timezone: UTC
data:
{"title": "Rollup.js", "category": "JavaScript libraries", "updated": "2020-01-29", "authors": [{"github": "ryanSN"}], "keywords": ["rollup.watch", "bundle", "rollup.config.js"], "intro": "[Rollup](https://rollupjs.org/) Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application.\n", "body": "### Basic config\n\n#### rollup.config.js\n\n```js\nexport default {\n  input: 'src/main.js',\n  output: {\n    file: 'bundle.js',\n    format: 'cjs'\n  }\n}\n```\n#### Terminal\n\n```bash\nnpm install -D rollup\n```\n\n| Command                                | Description         |\n| ---                                    | ---                 |\n| `rollup -c -o bundle.js`               | bundle using config |\n| `rollup main.js --o bundle.js --f cjs` | bundle              |\n| `rollup --watch`                       | bundle continuously |\n\nYou may need to use `./node_modules/.bin/rollup` as a command if you did not install rollup globally.\n\n### Multiple outputs\n\n#### rollup.config.js\n\n```js\nexport default [\n  {\n    input: 'src/main.js',\n    output: {\n      file: __dirname + '/public/main.js',\n      format: 'cjs',\n      name: 'main'\n    }\n  },\n  {\n    input: 'src/vendor.js',\n    output: {\n      file: __dirname + 'public/vendor.js',\n      format: 'cjs',\n      name: 'vendor'\n    }\n  }\n]\n```\n\nThis creates `main.js` and `vendor.js`.\n\n## Using plugins\n\n### Plugins\n\n#### Terminal\n\n```bash\nnpm install -D @rollup/plugin-json\n```\n\n#### rollup.config.js\n\n```js\nimport json from '@rollup/plugin-json'\n\nexport default {\n  input: 'src/main.js',\n  output: {\n    file: 'bundle.js',\n    format: 'cjs'\n  },\n  plugins: [ json() ]\n}\n\n```\n\n### npm packages\n\n#### Terminal\n```bash\nnpm install -D @rollup/plugin-node-resolve\n```\n\n#### rollup.config.js\n```js\nimport resolve from '@rollup/plugin-node-resolve'\n\nexport default {\n  input: 'src/main.js',\n  output: {\n    file: 'bundle.js',\n    format: 'cjs'\n  },\n  plugins: [ resolve() ]\n}\n```\n\nWhen you run a npm run build, no warning is emitted and contains the imported modules.\n\n### Peer dependencies\n\n#### Terminal\n\n```bash\nnpm install -D @rollup/plugin-node-resolve\n```\n\n#### rollup.config.js\n\n```js\nimport resolve from '@rollup/plugin-node-resolve'\n\nexport default {\n  input: 'src/main.js',\n  output: {\n    file: 'bundle.js',\n    format: 'cjs'\n  },\n  plugins: [resolve({\n    // pass custom options to the resolve plugin\n    customResolveOptions: {\n      moduleDirectory: 'node_modules'\n    }\n  })],\n  // indicate which modules should be treated as external\n  external: ['lodash']\n}\n```\n\n### Babel\n\n#### Terminal\n\n```bash\nnpm install -D @rollup/plugin-babel\n```\n\n#### rollup.config.js\n\n```js\nimport resolve from '@rollup/plugin-node-resolve'\nimport babel from '@rollup/plugin-babel'\n\nexport default {\n  input: 'src/main.js',\n  output: {\n    file: 'bundle.js',\n    format: 'cjs'\n  },\n  plugins: [\n    resolve(),\n    babel({\n      exclude: 'node_modules/**' // only transpile our source code\n    })\n  ]\n}\n```\n\n#### src/.babelrc\n\n```js\n{\n  \"presets\": [\n    [\"latest\", {\n      \"es2015\": {\n        \"modules\": false\n      }\n    }]\n  ],\n  \"plugins\": [\"external-helpers\"]\n}\n```"}

field_intro:
[Rollup](https://rollupjs.org/) Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application.

field_body:
### Basic config

#### rollup.config.js

```js
export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  }
}
```
#### Terminal

```bash
npm install -D rollup
```

| Command                                | Description         |
| ---                                    | ---                 |
| `rollup -c -o bundle.js`               | bundle using config |
| `rollup main.js --o bundle.js --f cjs` | bundle              |
| `rollup --watch`                       | bundle continuously |

You may need to use `./node_modules/.bin/rollup` as a command if you did not install rollup globally.

### Multiple outputs

#### rollup.config.js

```js
export default [
  {
    input: 'src/main.js',
    output: {
      file: __dirname + '/public/main.js',
      format: 'cjs',
      name: 'main'
    }
  },
  {
    input: 'src/vendor.js',
    output: {
      file: __dirname + 'public/vendor.js',
      format: 'cjs',
      name: 'vendor'
    }
  }
]
```

This creates `main.js` and `vendor.js`.

## Using plugins

### Plugins

#### Terminal

```bash
npm install -D @rollup/plugin-json
```

#### rollup.config.js

```js
import json from '@rollup/plugin-json'

export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  },
  plugins: [ json() ]
}

```

### npm packages

#### Terminal
```bash
npm install -D @rollup/plugin-node-resolve
```

#### rollup.config.js
```js
import resolve from '@rollup/plugin-node-resolve'

export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  },
  plugins: [ resolve() ]
}
```

When you run a npm run build, no warning is emitted and contains the imported modules.

### Peer dependencies

#### Terminal

```bash
npm install -D @rollup/plugin-node-resolve
```

#### rollup.config.js

```js
import resolve from '@rollup/plugin-node-resolve'

export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  },
  plugins: [resolve({
    // pass custom options to the resolve plugin
    customResolveOptions: {
      moduleDirectory: 'node_modules'
    }
  })],
  // indicate which modules should be treated as external
  external: ['lodash']
}
```

### Babel

#### Terminal

```bash
npm install -D @rollup/plugin-babel
```

#### rollup.config.js

```js
import resolve from '@rollup/plugin-node-resolve'
import babel from '@rollup/plugin-babel'

export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  },
  plugins: [
    resolve(),
    babel({
      exclude: 'node_modules/**' // only transpile our source code
    })
  ]
}
```

#### src/.babelrc

```js
{
  "presets": [
    ["latest", {
      "es2015": {
        "modules": false
      }
    }]
  ],
  "plugins": ["external-helpers"]
}
```


id: riot
git_filename: ./riot.md
format: md
field_title: Riot.js
field_category: JavaScript libraries
data:
{"title": "Riot.js", "category": "JavaScript libraries", "body": "### About\n{: .-intro}\n\nRiot is a UI library for JavaScript.\n\n- <https://riot.js.org/>\n\n### Tags\n\n```js\n/* tag-name.tag */\n<tag-name>\n  <div>\n    hello {name}\n  </div>\n\n  this.name = opts.name\n</tag-name>\n```\n\n```html\n<!-- in html -->\n<tag-name>\n<script>riot.mount('*')</script>\n<script>riot.mount('tag-name')</script>\n<script>riot.mount('tag-name', { title: 'my app', ... })</script>\n```\n\n### Expressions\n\n```\n{value}\n{value || 'its a js expression'}\n\n<input checked={null}>   /* null values ignore the tag */\n<p class={ selected: true }>\n```\n\n### Loops\n\n```\n<li each={movies}>{title}</li>\n```\n\n### Conditional\n```\n<div if={error}>\n<div show={error}> /* show using display: '' */\n<div hide={error}> /* hide using display: none */\n```\n\n### Events\n\n```js\n<button onclick={go}>\n\nthis.go = function (e) { ... }\n```\n\n## API\n\n```js\nthis.update()\nthis.update({ data: 'hi' }\n\nthis.unmount()\nthis.unmount(true) // keep parent tag\n\nriot.update() // update all\n```\n\n## Nesting\n\n### Nesting\n\n```\n<my-tag>\n  <child></child>\n  var child = this.tags.child\n</my-tag>\n```\n\n### Names\n\n```\n<my-tag>\n  <child name='xyz'></child>\n  var child = this.tags.xyz\n</my-tag>\n```\n\n## Nested HTML\n\n### Yield\n\n```js\n<yield/>\n```\n\n### Yield to/from\n\n```js\n<post>\n  <yield to='title'>Hello</yield>\n  <yield to='body'>Hey there world</yield>\n</post>\n```\n\n```js\n<post>\n  <yield from='title'/>\n  <yield from='body'/>\n</post>\n```\n\n## Router\n\n```js\nriot.route('customers/*/edit', (id) => {\n})\nriot.route('customers/234/edit')\nriot.route.start()\nriot.route.start(true) // exec the current url\n```\n\n## Lifecycle\n\n```js\nthis.on('before-mount', function() {\n// before the tag is mounted\n})\n\nthis.on('mount', function() {\n// right after the tag is mounted on the page\n})\n\nthis.on('update', function() {\n// allows recalculation of context data before the update\n})\n\nthis.on('updated', function() {\n// right after the tag template is updated\n})\n\nthis.on('before-unmount', function() {\n// before the tag is removed\n})\n\nthis.on('unmount', function() {\n// when the tag is removed from the page\n})\n\n// curious about all events ?\nthis.on('all', function(eventName) {\nconsole.info(eventName)\n})\n```"}

field_body:
### About
{: .-intro}

Riot is a UI library for JavaScript.

- <https://riot.js.org/>

### Tags

```js
/* tag-name.tag */
<tag-name>
  <div>
    hello {name}
  </div>

  this.name = opts.name
</tag-name>
```

```html
<!-- in html -->
<tag-name>
<script>riot.mount('*')</script>
<script>riot.mount('tag-name')</script>
<script>riot.mount('tag-name', { title: 'my app', ... })</script>
```

### Expressions

```
{value}
{value || 'its a js expression'}

<input checked={null}>   /* null values ignore the tag */
<p class={ selected: true }>
```

### Loops

```
<li each={movies}>{title}</li>
```

### Conditional
```
<div if={error}>
<div show={error}> /* show using display: '' */
<div hide={error}> /* hide using display: none */
```

### Events

```js
<button onclick={go}>

this.go = function (e) { ... }
```

## API

```js
this.update()
this.update({ data: 'hi' }

this.unmount()
this.unmount(true) // keep parent tag

riot.update() // update all
```

## Nesting

### Nesting

```
<my-tag>
  <child></child>
  var child = this.tags.child
</my-tag>
```

### Names

```
<my-tag>
  <child name='xyz'></child>
  var child = this.tags.xyz
</my-tag>
```

## Nested HTML

### Yield

```js
<yield/>
```

### Yield to/from

```js
<post>
  <yield to='title'>Hello</yield>
  <yield to='body'>Hey there world</yield>
</post>
```

```js
<post>
  <yield from='title'/>
  <yield from='body'/>
</post>
```

## Router

```js
riot.route('customers/*/edit', (id) => {
})
riot.route('customers/234/edit')
riot.route.start()
riot.route.start(true) // exec the current url
```

## Lifecycle

```js
this.on('before-mount', function() {
// before the tag is mounted
})

this.on('mount', function() {
// right after the tag is mounted on the page
})

this.on('update', function() {
// allows recalculation of context data before the update
})

this.on('updated', function() {
// right after the tag template is updated
})

this.on('before-unmount', function() {
// before the tag is removed
})

this.on('unmount', function() {
// when the tag is removed from the page
})

// curious about all events ?
this.on('all', function(eventName) {
console.info(eventName)
})
```


id: rest-api
git_filename: ./rest-api.md
format: md
field_title: RESTful API
field_category: API
field_updated: 2019-07-07
field_updated___timezone: UTC
data:
{"title": "RESTful API", "updated": "2019-07-07", "category": "API", "body": "### Status codes\n\n| Code                  | Description                                  |\n| --------------------- | -------------------------------------------- |\n| `200 OK`              | Successful get, patch (return a JSON object) |\n| `201 Created`         | Successful post (return a JSON object)       |\n| `202 Accepted`        | Successful post, delete, path - async        |\n| `204 No content`      | Successful delete                            |\n| `206 Partial content` | Successful get - async                       |\n\n### Error status\n\n| Code                       | Description                       |\n| -------------------------- | --------------------------------- |\n| `401 Unauthorized`         | Not authenticated                 |\n| `403 Forbidden`            | Authenticated, but no permissions |\n| `422 Unprocessable entity` | Validation                        |\n\n### Errors\n\n```\nHTTP/1.1 401 Unauthorized\nContent-Type: application/json\n{\n  'id': 'auth_failed',\n  'message': \"You're not logged in.\"\n}\n```\n\nHere's an example of a possible error reply.\n\n### Versioning\n\n```\nGET /api/foo\nAccept: application/json; version=1\n```\n\nYou can pass a `version=x` to the Accept request header. [Info here](https://github.com/interagent/http-api-design#version-with-accepts-header)\n\n### Authentication\n\n```\ncurl -is https://$TOKEN@api.example.com/\n```\n\n### Methods\n\n| Request              | Description                   |\n| -------------------- | ----------------------------- |\n| `GET /articles/1`    | read, returns _200_           |\n| `PUT /articles/1`    | edit (or path), returns _200_ |\n| `DELETE /articles/1` | delete, returns _200_         |\n| `POST /articles`     | create, returns _201_         |\n| `GET /articles`      | list, returns _200_           |\n\n### References\n\n* [interagent/http-api-design](https://github.com/interagent/http-api-design) _(github.com)_"}

field_body:
### Status codes

| Code                  | Description                                  |
| --------------------- | -------------------------------------------- |
| `200 OK`              | Successful get, patch (return a JSON object) |
| `201 Created`         | Successful post (return a JSON object)       |
| `202 Accepted`        | Successful post, delete, path - async        |
| `204 No content`      | Successful delete                            |
| `206 Partial content` | Successful get - async                       |

### Error status

| Code                       | Description                       |
| -------------------------- | --------------------------------- |
| `401 Unauthorized`         | Not authenticated                 |
| `403 Forbidden`            | Authenticated, but no permissions |
| `422 Unprocessable entity` | Validation                        |

### Errors

```
HTTP/1.1 401 Unauthorized
Content-Type: application/json
{
  'id': 'auth_failed',
  'message': "You're not logged in."
}
```

Here's an example of a possible error reply.

### Versioning

```
GET /api/foo
Accept: application/json; version=1
```

You can pass a `version=x` to the Accept request header. [Info here](https://github.com/interagent/http-api-design#version-with-accepts-header)

### Authentication

```
curl -is https://$TOKEN@api.example.com/
```

### Methods

| Request              | Description                   |
| -------------------- | ----------------------------- |
| `GET /articles/1`    | read, returns _200_           |
| `PUT /articles/1`    | edit (or path), returns _200_ |
| `DELETE /articles/1` | delete, returns _200_         |
| `POST /articles`     | create, returns _201_         |
| `GET /articles`      | list, returns _200_           |

### References

* [interagent/http-api-design](https://github.com/interagent/http-api-design) _(github.com)_


id: resolutions
git_filename: ./resolutions.md
format: md
field_title: Screen resolutions
field_updated: 2020-07-03
field_updated___timezone: UTC
data:
{"title": "Screen resolutions", "updated": "2020-07-03", "weight": -1, "body": "## Resolutions\n{: .-one-column}\n\n### Mobile\n\n| Resolution | DPPX  | Actual resolution | DPPI    | Actual PPI | Size  | Devices                      |\n| ---        | ---   | ---               | ---     | ---        | ---   | ---                          |\n| 320 x 480  | @1x   | 320 x 480         | 163 ppi | 163 ppi    | 3.5\"  | iPhone 2G/3G/3GS             |\n| 320 x 480  | @2x   | 640 x 960         | 163 ppi | 326 ppi    | 3.5\"  | iPhone 4/4S                  |\n| 320 x 568  | @2x   | 640 x 1136        | 163 ppi | 326 ppi    | 4\"    | iPhone 5/5C/5S               |\n| 320 x 568  | @2x   | 640 x 1136        | 163 ppi | 326 ppi    | 4\"    | iPhone SE                    |\n| 375 x 667  | @2x   | 750 x 1334        | 163 ppi | 326 ppi    | 4.7\"  | iPhone 6/6S/7/8/SE2          |\n| 414 x 736  | @3x   | 1242 x 2208       | 133 ppi | 401 ppi    | 5.5\"  | iPhone 6+/6S+/7+/8+          |\n| 414 x 896  | @2x   | 828 x 1792        | 163 ppi | 326 ppi    | 6.1\"  | iPhone Xr/11                 |\n| 375 x 812  | @3x   | 1125 x 2436       | 152 ppi | 458 ppi    | 5.8\"  | iPhone X/Xs/11 Pro           |\n| 414 x 896\t | @3x   | 1242 x 2688\t     | 162 ppi | 458 ppi    | 6.5\"  | iPhone Xs Max/11 Pro Max     |\n| 390 x 844\t | @3x   | 1170 x 2532\t     | 153 ppi | 460 ppi\t  | 6.1\"  | iPhone 12/12 Pro/13/13 Pro   |\n| 428 x 926\t | @3x   | 1284 x 2778\t     | 152 ppi | 458 ppi\t  | 6.7\"  | iPhone 12 Pro Max/13 Pro Max |\n| 375 x 812  | @3x   | 1080 x 2540       | 158 ppi | 476 ppi    | 5.4\"  | iPhone 13 Mini               |\n| ---        | ---   | ---               | ----    | ---        | ---   | ---                          |\n| 320 x 533  | @1.5x |  480 x  800       | 155 ppi | 233 ppi    |       | Galaxy S                     |\n| 320 x 533  | @1.5x |  480 x  800       | 145 ppi | 217 ppi    |       | Galaxy S2                    |\n| 360 x 640  | @2x   |  720 x 1280       | 153 ppi | 306 ppi    | 4.8\"  | Galaxy S3                    |\n| 320 x 533  | @1.5x |  480 x 1200       | 155 ppi | 233 ppi    |       | Galaxy S3 Mini               |\n| 360 x 640  | @3x   | 1080 x 1920       | 147 ppi | 441 ppi    | 5\"    | Galaxy S4                    |\n| 360 x 640  | @3x   | 1080 x 1920       | 144 ppi | 432 ppi    | 5.1\"  | Galaxy S5                    |\n| 360 x 640  | @4x   | 1440 x 2560       | 144 ppi | 577 ppi    | 5.1\"  | Galaxy S6/Edge               |\n| 360 x 640  | @4x   | 1440 x 2560       | 144 ppi | 576 ppi    | 5.1\"  | Galaxy S7                    |\n| 360 x 640  | @4x   | 1440 x 2560       | 134 ppi | 534 ppi    | 5.5\"  | Galaxy S7 Edge               |\n| 360 x 740  | @4x   | 1440 x 2960       | 142 ppi | 568 ppi    | 5.8\"  | Galaxy S8                    |\n| 412 x 846  | @4x   | 1440 x 2960       | 133 ppi | 531 ppi    | 6.2\"  | Galaxy S8 Plus               |\n| 360 x 740  | @4x   | 1440 x 2960       | 142 ppi | 568 ppi    | 5.8\"  | Galaxy S9                    |\n| 412 x 846  | @4x   | 1440 x 2960       | 133 ppi | 531 ppi    | 6.2\"  | Galaxy S9 Plus               |\n{: .-headers}\n\n### Tablet\n\n| Resolution | DPPX | Actual resolution | DPPI    | Actual PPI | Size | Devices          |\n| ---        | ---- | ---               | ---     | ---        | ---- | ---              |\n| 1024 x 768 | @2x  | 2048 x 1536       | 163 ppi | 326 ppi    | 7.9\" | iPad Mini Retina |\n| 1024 x 768 | @2x  | 2048 x 1536       | 132 ppi | 264 ppi    | 9.7\" | iPad Air         |\n{: .-headers}"}

field_body:
## Resolutions
{: .-one-column}

### Mobile

| Resolution | DPPX  | Actual resolution | DPPI    | Actual PPI | Size  | Devices                      |
| ---        | ---   | ---               | ---     | ---        | ---   | ---                          |
| 320 x 480  | @1x   | 320 x 480         | 163 ppi | 163 ppi    | 3.5"  | iPhone 2G/3G/3GS             |
| 320 x 480  | @2x   | 640 x 960         | 163 ppi | 326 ppi    | 3.5"  | iPhone 4/4S                  |
| 320 x 568  | @2x   | 640 x 1136        | 163 ppi | 326 ppi    | 4"    | iPhone 5/5C/5S               |
| 320 x 568  | @2x   | 640 x 1136        | 163 ppi | 326 ppi    | 4"    | iPhone SE                    |
| 375 x 667  | @2x   | 750 x 1334        | 163 ppi | 326 ppi    | 4.7"  | iPhone 6/6S/7/8/SE2          |
| 414 x 736  | @3x   | 1242 x 2208       | 133 ppi | 401 ppi    | 5.5"  | iPhone 6+/6S+/7+/8+          |
| 414 x 896  | @2x   | 828 x 1792        | 163 ppi | 326 ppi    | 6.1"  | iPhone Xr/11                 |
| 375 x 812  | @3x   | 1125 x 2436       | 152 ppi | 458 ppi    | 5.8"  | iPhone X/Xs/11 Pro           |
| 414 x 896	 | @3x   | 1242 x 2688	     | 162 ppi | 458 ppi    | 6.5"  | iPhone Xs Max/11 Pro Max     |
| 390 x 844	 | @3x   | 1170 x 2532	     | 153 ppi | 460 ppi	  | 6.1"  | iPhone 12/12 Pro/13/13 Pro   |
| 428 x 926	 | @3x   | 1284 x 2778	     | 152 ppi | 458 ppi	  | 6.7"  | iPhone 12 Pro Max/13 Pro Max |
| 375 x 812  | @3x   | 1080 x 2540       | 158 ppi | 476 ppi    | 5.4"  | iPhone 13 Mini               |
| ---        | ---   | ---               | ----    | ---        | ---   | ---                          |
| 320 x 533  | @1.5x |  480 x  800       | 155 ppi | 233 ppi    |       | Galaxy S                     |
| 320 x 533  | @1.5x |  480 x  800       | 145 ppi | 217 ppi    |       | Galaxy S2                    |
| 360 x 640  | @2x   |  720 x 1280       | 153 ppi | 306 ppi    | 4.8"  | Galaxy S3                    |
| 320 x 533  | @1.5x |  480 x 1200       | 155 ppi | 233 ppi    |       | Galaxy S3 Mini               |
| 360 x 640  | @3x   | 1080 x 1920       | 147 ppi | 441 ppi    | 5"    | Galaxy S4                    |
| 360 x 640  | @3x   | 1080 x 1920       | 144 ppi | 432 ppi    | 5.1"  | Galaxy S5                    |
| 360 x 640  | @4x   | 1440 x 2560       | 144 ppi | 577 ppi    | 5.1"  | Galaxy S6/Edge               |
| 360 x 640  | @4x   | 1440 x 2560       | 144 ppi | 576 ppi    | 5.1"  | Galaxy S7                    |
| 360 x 640  | @4x   | 1440 x 2560       | 134 ppi | 534 ppi    | 5.5"  | Galaxy S7 Edge               |
| 360 x 740  | @4x   | 1440 x 2960       | 142 ppi | 568 ppi    | 5.8"  | Galaxy S8                    |
| 412 x 846  | @4x   | 1440 x 2960       | 133 ppi | 531 ppi    | 6.2"  | Galaxy S8 Plus               |
| 360 x 740  | @4x   | 1440 x 2960       | 142 ppi | 568 ppi    | 5.8"  | Galaxy S9                    |
| 412 x 846  | @4x   | 1440 x 2960       | 133 ppi | 531 ppi    | 6.2"  | Galaxy S9 Plus               |
{: .-headers}

### Tablet

| Resolution | DPPX | Actual resolution | DPPI    | Actual PPI | Size | Devices          |
| ---        | ---- | ---               | ---     | ---        | ---- | ---              |
| 1024 x 768 | @2x  | 2048 x 1536       | 163 ppi | 326 ppi    | 7.9" | iPad Mini Retina |
| 1024 x 768 | @2x  | 2048 x 1536       | 132 ppi | 264 ppi    | 9.7" | iPad Air         |
{: .-headers}


id: rename
git_filename: ./rename.md
format: md
field_title: rename
field_category: CLI
data:
{"title": "rename", "category": "CLI", "body": "### Installation\n\n```bash\nbrew install rename\n```\n\nSee: <http://plasmasturm.org/code/rename/>\n\n### Regex substitution\n\n```bash\nrename 's/hello/world/' *.txt\n```\n\nRename `hello.txt` to `world.txt` and so on in `*.txt`.\n\n### Replace extension\n\n```bash\nrename -s .png .jpg.png *.png\n```\n\nReplace `.png` with `.jpg.png` in `*.png`.\n\n### Options\n\n| Option | Description               |\n| ---    | ---                       |\n| `-n`   | Simulation                |\n| `-l`   | Symlink instead of rename |\n| `-i`   | Interactive               |\n\n## Also see\n\n- [Rename website](http://plasmasturm.org/code/rename/) _(plasmasturm.org)_"}

field_body:
### Installation

```bash
brew install rename
```

See: <http://plasmasturm.org/code/rename/>

### Regex substitution

```bash
rename 's/hello/world/' *.txt
```

Rename `hello.txt` to `world.txt` and so on in `*.txt`.

### Replace extension

```bash
rename -s .png .jpg.png *.png
```

Replace `.png` with `.jpg.png` in `*.png`.

### Options

| Option | Description               |
| ---    | ---                       |
| `-n`   | Simulation                |
| `-l`   | Symlink instead of rename |
| `-i`   | Interactive               |

## Also see

- [Rename website](http://plasmasturm.org/code/rename/) _(plasmasturm.org)_


id: regexp
git_filename: ./regexp.md
format: md
field_title: regexp
field_category: Others
field_updated: 2020-03-10
field_updated___timezone: UTC
data:
{"title": "regexp", "category": "Others", "weight": -1, "authors": [{"github": "rizqyhi"}, {"github": "izzergh"}, {"github": "kolapsys"}, {"github": "samtrion"}], "updated": "2020-03-10", "description": "Basic cheatsheets for regular expression\n", "body": "## RegExp\n{: .-three-column}\n\n### Character classes\n\n| Pattern       | Description                              |\n| ------------- | ---------------------------------------- |\n| `.`           | Any character, except newline            |\n| `\\w`          | Word                                     |\n| `\\d`          | Digit                                    |\n| `\\s`          | Whitespace                               |\n| `\\W`          | Not word                                 |\n| `\\D`          | Not digit                                |\n| `\\S`          | Not whitespace                           |\n| `[abc]`       | Any of a, b, or c                        |\n| `[a-e]`       | Characters between `a` and `e`           |\n| `[1-9]`       | Digit between `1` and `9`                |\n| `[[:print:]]` | Any printable character including spaces |\n| `[^abc]`      | Any character except `a`, `b` or `c`     |\n\n### Anchors\n\n| Pattern | Description            |\n| ------- | ---------------------- |\n| `\\G`    | Start of match         |\n| `^`     | Start of string \\*     |\n| `$`     | End of string \\*       |\n| `\\A`    | Start of string        |\n| `\\Z`    | End of string          |\n| `\\z`    | Absolute end of string |\n| `\\b`    | A word boundary        |\n| `\\B`    | Non-word boundary      |\n| `^abc`  | Start with `abc`       |\n| `abc$`  | End with `abc`         |\n\nFor multiline patterns (`m` flag), `^` and `$` will act as start and end of line.\n\n### Escaped characters\n\n| Pattern    | Description                            |\n| ---------- | -------------------------------------- |\n| `\\. \\* \\\\` | Escape special character used by regex |\n| `\\t`       | Tab                                    |\n| `\\n`       | Newline                                |\n| `\\r`       | Carriage return                        |\n\n### Groups\n\n| Pattern   | Description                                              |\n| --------- | -------------------------------------------------------- |\n| `(abc)`   | Capture group                                            |\n| `(a|b)`   | Match `a` or `b`                                         |\n| `(?:abc)` | Match `abc`, but don't capture                           |\n| `\\1`      | Substituted with text matched of the 1st capturing group |\n\n\n### Quantifiers\n\n| Pattern  | Description           |\n| -------- | --------------------- |\n| `a*`     | Match 0 or more       |\n| `a+`     | Match 1 or more       |\n| `a?`     | Match 0 or 1          |\n| `a{5}`   | Match exactly 5       |\n| `a{,3}`  | Match up to 3         |\n| `a{3,}`  | Match 3 or more       |\n| `a{1,3}` | Match between 1 and 3 |\n\n### Lookahead & Lookbehind\n\n| Pattern      | Description                               |\n| ---          | ---                                       |\n| `a(?=b)`     | Match `a` in `baby` but not in `bay`      |\n| `a(?!b)`     | Match `a` in `Stan` but not in `Stab`     |\n| ---          | ---                                       |\n| `(?<=a)b`    | Match `b` in `crabs` but not in `cribs`   |\n| `(?<!a)b`    | Match `b` in `fib` but not in `fab`       |"}

field_body:
## RegExp
{: .-three-column}

### Character classes

| Pattern       | Description                              |
| ------------- | ---------------------------------------- |
| `.`           | Any character, except newline            |
| `\w`          | Word                                     |
| `\d`          | Digit                                    |
| `\s`          | Whitespace                               |
| `\W`          | Not word                                 |
| `\D`          | Not digit                                |
| `\S`          | Not whitespace                           |
| `[abc]`       | Any of a, b, or c                        |
| `[a-e]`       | Characters between `a` and `e`           |
| `[1-9]`       | Digit between `1` and `9`                |
| `[[:print:]]` | Any printable character including spaces |
| `[^abc]`      | Any character except `a`, `b` or `c`     |

### Anchors

| Pattern | Description            |
| ------- | ---------------------- |
| `\G`    | Start of match         |
| `^`     | Start of string \*     |
| `$`     | End of string \*       |
| `\A`    | Start of string        |
| `\Z`    | End of string          |
| `\z`    | Absolute end of string |
| `\b`    | A word boundary        |
| `\B`    | Non-word boundary      |
| `^abc`  | Start with `abc`       |
| `abc$`  | End with `abc`         |

For multiline patterns (`m` flag), `^` and `$` will act as start and end of line.

### Escaped characters

| Pattern    | Description                            |
| ---------- | -------------------------------------- |
| `\. \* \\` | Escape special character used by regex |
| `\t`       | Tab                                    |
| `\n`       | Newline                                |
| `\r`       | Carriage return                        |

### Groups

| Pattern   | Description                                              |
| --------- | -------------------------------------------------------- |
| `(abc)`   | Capture group                                            |
| `(a|b)`   | Match `a` or `b`                                         |
| `(?:abc)` | Match `abc`, but don't capture                           |
| `\1`      | Substituted with text matched of the 1st capturing group |


### Quantifiers

| Pattern  | Description           |
| -------- | --------------------- |
| `a*`     | Match 0 or more       |
| `a+`     | Match 1 or more       |
| `a?`     | Match 0 or 1          |
| `a{5}`   | Match exactly 5       |
| `a{,3}`  | Match up to 3         |
| `a{3,}`  | Match 3 or more       |
| `a{1,3}` | Match between 1 and 3 |

### Lookahead & Lookbehind

| Pattern      | Description                               |
| ---          | ---                                       |
| `a(?=b)`     | Match `a` in `baby` but not in `bay`      |
| `a(?!b)`     | Match `a` in `Stan` but not in `Stab`     |
| ---          | ---                                       |
| `(?<=a)b`    | Match `b` in `crabs` but not in `cribs`   |
| `(?<!a)b`    | Match `b` in `fib` but not in `fab`       |


id: redux
git_filename: ./redux.md
format: md
field_title: Redux
field_category: React
field_updated: 2018-01-17
field_updated___timezone: UTC
data:
{"title": "Redux", "category": "React", "updated": "2018-01-17", "weight": -3, "body": "### Creating a store\n\n```js\nimport { createStore } from 'redux'\n```\n{: .-setup}\n\n```js\n// Reducer\nfunction counter (state = { value: 0 }, action) {\n  switch (action.type) {\n  case 'INCREMENT':\n    return { value: state.value + 1 }\n  case 'DECREMENT':\n    return { value: state.value - 1 }\n  default:\n    return state\n  }\n}\n```\n\n```js\nlet store = createStore(counter)\n```\n\n```js\n// Optional - you can pass `initialState` as a second arg\nlet store = createStore(counter, { value: 0 })\n```\n\nA store is made from a reducer function, which takes the current `state`, and\nreturns a new `state` depending on the `action` it was given.\n\n### Using a store\n\n```js\nlet store = createStore(counter)\n```\n{: .-setup}\n\n```js\n// Dispatches an action; this changes the state\nstore.dispatch({ type: 'INCREMENT' })\nstore.dispatch({ type: 'DECREMENT' })\n```\n\n```js\n// Gets the current state\nstore.getState()\n```\n\n```js\n// Listens for changes\nstore.subscribe(() => { ... })\n```\n\nDispatch actions to change the store's state.\n\n## React Redux\n\n### Provider\n\n```js\nimport { Provider } from 'react-redux'\n```\n{: .-setup}\n\n```js\nReact.render(\n  <Provider store={store}>\n    <App />\n  </Provider>, mountNode)\n```\n\nThe `<Provider>` component makes the store available in your React components. You need this so you can use `connect()`.\n\n### Mapping state\n\n```js\nimport { connect } from 'react-redux'\n```\n{: .-setup}\n\n```js\n// A functional React component\nfunction App ({ message, onMessageClick }) {\n  return (\n    <div onClick={() => onMessageClick('hello')}>\n      {message}\n    </div>\n  )\n}\n```\n\n```js\n// Maps `state` to `props`:\n// These will be added as props to the component.\nfunction mapState (state) {\n  return { message: state.message }\n}\n\n// Maps `dispatch` to `props`:\nfunction mapDispatch (dispatch) {\n  return {\n    onMessageClick (message) {\n      dispatch({ type: 'click', message })\n    }\n  }\n}\n\n// Connect them:\nexport default connect(mapState, mapDispatch)(App)\n```\n\n### Shorthand\n\n```js\nexport default connect(\n  (state) => ({\n    message: state.message\n  }),\n  (dispatch) => ({\n    onMessageClick: (message) => {\n      dispatch({ type: 'click', message })\n    }\n  })\n)(App)\n```\n\nSame as above, but shorter.\n\n### Combining reducers\n\n```js\nconst reducer = combineReducers({\n  counter, user, store\n})\n```\n\nCombines multiple reducers into one reducer function. See: [combineReducers](https://redux.js.org/docs/api/combineReducers.html) _(redux.js.org)_\n\n## Middleware\n\n### Signature\n\n```js\n// noop middleware\nconst logger = store => dispatch => action { dispatch(action) }\n```\n\n```js\nconst logger = store => {\n  // This function runs on createStore().\n  // It returns a decorator for dispatch().\n\n  return dispatch => {\n    // Runs on createStore(), too.\n    // It returns a new dispatch() function\n\n    return action => {\n      // Runs on every dispatch()\n    }\n  }\n}\n```\n\nMiddlewares are simply decorators for `dispatch()` to allow you to take\ndifferent kinds of actions, and to perform different tasks when receiving\nactions.\n\n### Applying middleware\n\n```js\nconst enhancer = applyMiddleware(logger, thunk, ...)\n```\n\n```js\nconst store = createStore(reducer, {}, enhancer)\n```\n{: data-line=\"1\"}\n\n## References\n{: .-one-column}\n\n* [Redux](https://www.npmjs.com/package/redux) _(npmjs.com)_\n* [React-redux](https://www.npmjs.com/package/react-redux) _(npmjs.com)_\n* [Usage with React](http://redux.js.org/docs/basics/UsageWithReact.html) _(redux.js.org)_\n{: .-also-see}"}

field_body:
### Creating a store

```js
import { createStore } from 'redux'
```
{: .-setup}

```js
// Reducer
function counter (state = { value: 0 }, action) {
  switch (action.type) {
  case 'INCREMENT':
    return { value: state.value + 1 }
  case 'DECREMENT':
    return { value: state.value - 1 }
  default:
    return state
  }
}
```

```js
let store = createStore(counter)
```

```js
// Optional - you can pass `initialState` as a second arg
let store = createStore(counter, { value: 0 })
```

A store is made from a reducer function, which takes the current `state`, and
returns a new `state` depending on the `action` it was given.

### Using a store

```js
let store = createStore(counter)
```
{: .-setup}

```js
// Dispatches an action; this changes the state
store.dispatch({ type: 'INCREMENT' })
store.dispatch({ type: 'DECREMENT' })
```

```js
// Gets the current state
store.getState()
```

```js
// Listens for changes
store.subscribe(() => { ... })
```

Dispatch actions to change the store's state.

## React Redux

### Provider

```js
import { Provider } from 'react-redux'
```
{: .-setup}

```js
React.render(
  <Provider store={store}>
    <App />
  </Provider>, mountNode)
```

The `<Provider>` component makes the store available in your React components. You need this so you can use `connect()`.

### Mapping state

```js
import { connect } from 'react-redux'
```
{: .-setup}

```js
// A functional React component
function App ({ message, onMessageClick }) {
  return (
    <div onClick={() => onMessageClick('hello')}>
      {message}
    </div>
  )
}
```

```js
// Maps `state` to `props`:
// These will be added as props to the component.
function mapState (state) {
  return { message: state.message }
}

// Maps `dispatch` to `props`:
function mapDispatch (dispatch) {
  return {
    onMessageClick (message) {
      dispatch({ type: 'click', message })
    }
  }
}

// Connect them:
export default connect(mapState, mapDispatch)(App)
```

### Shorthand

```js
export default connect(
  (state) => ({
    message: state.message
  }),
  (dispatch) => ({
    onMessageClick: (message) => {
      dispatch({ type: 'click', message })
    }
  })
)(App)
```

Same as above, but shorter.

### Combining reducers

```js
const reducer = combineReducers({
  counter, user, store
})
```

Combines multiple reducers into one reducer function. See: [combineReducers](https://redux.js.org/docs/api/combineReducers.html) _(redux.js.org)_

## Middleware

### Signature

```js
// noop middleware
const logger = store => dispatch => action { dispatch(action) }
```

```js
const logger = store => {
  // This function runs on createStore().
  // It returns a decorator for dispatch().

  return dispatch => {
    // Runs on createStore(), too.
    // It returns a new dispatch() function

    return action => {
      // Runs on every dispatch()
    }
  }
}
```

Middlewares are simply decorators for `dispatch()` to allow you to take
different kinds of actions, and to perform different tasks when receiving
actions.

### Applying middleware

```js
const enhancer = applyMiddleware(logger, thunk, ...)
```

```js
const store = createStore(reducer, {}, enhancer)
```
{: data-line="1"}

## References
{: .-one-column}

* [Redux](https://www.npmjs.com/package/redux) _(npmjs.com)_
* [React-redux](https://www.npmjs.com/package/react-redux) _(npmjs.com)_
* [Usage with React](http://redux.js.org/docs/basics/UsageWithReact.html) _(redux.js.org)_
{: .-also-see}


id: react@0.14
git_filename: ./react@0.14.md
format: md
field_title: React.js (v0.14)
field_category: React
data:
{"title": "React.js (v0.14)", "category": "React", "deprecated": true, "intro": "**Deprecated:** this guide targets an old version of React (v0.14). See the [updated React cheatsheet](react) for new versions.\n", "body": "{%raw%}\n\n### Components\n\n```js\nvar Component = React.createClass({\n  render: function () {\n    return <div>Hello {this.props.name}</div>;\n  }\n});\n```\n\n```js\nReactDOM.render(<Component name=\"John\" />, document.body);\n```\n{:.light}\n\nUse the [React.js jsfiddle](http://jsfiddle.net/reactjs/69z2wepo/) to start hacking. (or the unofficial [jsbin](http://jsbin.com/yafixat/edit?js,output))\n\n### Nesting\n\n```js\nvar UserAvatar  = React.createClass({...});\nvar UserProfile = React.createClass({...});\n```\n{:.light}\n\n```js\nvar Info = React.createClass({\n  render() {\n    return <div>\n      <UserAvatar src={this.props.avatar} />\n      <UserProfile username={this.props.username} />\n    </div>;\n  }\n});\n```\n\nNest components to separate concerns. See [multiple components](http://facebook.github.io/react/docs/multiple-components.html).\n\n## States & Properties\n{:.center}\n\n### States and props\n\n```html\n<MyComponent fullscreen={true} />\n```\n{:.light}\n \n```js\n// props\n  this.props.fullscreen //=> true\n\n// state\n  this.setState({ username: 'rstacruz' });\n  this.replaceState({ ... });\n  this.state.username //=> 'rstacruz'\n```\n\n```js\nrender: function () {\n  return <div className={this.props.fullscreen ? 'full' : ''}>\n    Welcome, {this.state.username}\n  </div>;\n}\n```\n\nUse [props](https://facebook.github.io/react/docs/tutorial.html#using-props) (`this.props`) to access parameters passed from the parent.\nUse [states](https://facebook.github.io/react/docs/tutorial.html#reactive-state) (`this.state`) to manage dynamic data.\n\n### Setting defaults\n\n```js\nReact.createClass({\n  getInitialState: function () {\n    return { comments: [] };\n  },\n\n  getDefaultProps: function () {\n    return { name: \"Hello\" };\n  }\n);\n```\n\nPre-populates `this.state.comments` and `this.props.name`.\n\n## Components\n\n### Component API\n\n```js\nReactDOM.findDOMNode(c)  // 0.14+\nReact.findDOMNode(c)  // 0.13\nc.getDOMNode()        // 0.12 below\n```\n{:.light}\n\n```js\nc.forceUpdate()\nc.isMounted()\n\nc.state\nc.props\n\nc.setState({ ... })\nc.replaceState({ ... })\n\nc.setProps({ ... })       // for deprecation\nc.replaceProps({ ... })   // for deprecation\n\nc.refs\n```\n\nThese are methods available for `Component` instances. See [Component API](http://facebook.github.io/react/docs/component-api.html).\n\n### Component specs\n\n| Method | What |\n| ---- | ---- |\n| [`render()`](http://facebook.github.io/react/docs/component-specs.html#render) | |\n| ---- | ---- |\n| [`getInitialState()`](http://facebook.github.io/react/docs/component-specs.html#getinitialstate) | |\n| [`getDefaultProps()`](http://facebook.github.io/react/docs/component-specs.html#getdefaultprops) |  |\n| ---- | ---- |\n| [`mixins: [ ... ]`](http://facebook.github.io/react/docs/component-specs.html#mixins) | Mixins ... [more](#mixins) |\n| [`propTypes: { ... }`](http://facebook.github.io/react/docs/component-specs.html#proptypes) | Validation ... [more](#property-validation) |\n| [`statics: { ... }`](http://facebook.github.io/react/docs/component-specs.html#statics) | Static methods |\n| [`displayName: \"...\"`](http://facebook.github.io/react/docs/component-specs.html#displayname) | Automatically filled by JSX |\n{:.greycode.no-head}\n\nMethods and properties you can override. See [component specs](http://facebook.github.io/react/docs/component-specs.html).\n\n## Lifecycle\n\n### Mounting\n\n| `componentWillMount()` | Before rendering (no DOM yet) |\n| `componentDidMount()` | After rendering |\n{:.greycode.no-head.lc}\n\nBefore initial rendering occurs. Add your DOM stuff on didMount (events, timers, etc). See [reference](http://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount).\n\n### Updating\n\n| `componentWillReceiveProps`*(newProps={})* | Use `setState()` here |\n| `shouldComponentUpdate`*(newProps={}, newState={})* | Skips `render()` if returns false |\n| `componentWillUpdate`*(newProps={}, newState={})* | Can't use `setState()` here |\n| `componentDidUpdate`*(prevProps={}, prevState={})* | Operate on the DOM here |\n{:.greycode.no-head.lc}\n\nCalled when parents change properties and `.setState()`. These are not called for initial renders. See [reference](http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops).\n\n### Unmounting\n\n| `componentWillUnmount()` | Invoked before DOM removal |\n{:.greycode.no-head.lc}\n\nClear your DOM stuff here (probably done on didMount). See [reference](http://facebook.github.io/react/docs/component-specs.html#unmounting-componentwillunmount).\n\n## Examples\n\n### Example: loading data\n\n```js\nReact.createClass({\n  componentDidMount: function () {\n    $.get(this.props.url, function (data) {\n      this.setState(data);\n    }.bind(this));\n  },\n\n  render: function () {\n    return <CommentList data={this.state.data} />\n  }\n});\n```\n\nSee [initial AJAX data](http://facebook.github.io/react/tips/initial-ajax.html).\n\n## DOM nodes\n\n### References\n\n```html\n<input ref=\"myInput\">\n```\n{:.light}\n\n```js\nthis.refs.myInput\nReactDOM.findDOMNode(this.refs.myInput).focus()\nReactDOM.findDOMNode(this.refs.myInput).value\n```\n\n### DOM Events\nAdd attributes like `onChange`. See [events](https://facebook.github.io/react/docs/events.html).\n\n```html\n<input type=\"text\"\n    value={this.state.value}\n    onChange={this.handleChange} />\n```\n{:.light}\n\n```js\nhandleChange: function(event) {\n  this.setState({ value: event.target.value });\n}\n```\n\nAllows access to DOM nodes. See [References](http://facebook.github.io/react/docs/more-about-refs.html).\n\n### Two-way binding\n\n```html\nEmail: <input type=\"text\" valueLink={this.linkState('email')} />\n```\n{:.light}\n\n```js\nReact.createClass({\n  mixins: [React.addons.LinkedStateMixin]\n});\n```\n\n```js\nthis.state.email\n```\n\nUse [LinkedStateMixin](http://facebook.github.io/react/docs/two-way-binding-helpers.html) for easier two-way binding.\n\n## Property validation\n\n### Basic types\n\n```js\nReact.createClass({\n  propTypes: {\n    email:      React.PropTypes.string,\n    seats:      React.PropTypes.number,\n    settings:   React.PropTypes.object,\n    callback:   React.PropTypes.func,\n    isClosed:   React.PropTypes.bool,\n    any:        React.PropTypes.any,\n  }\n});\n```\nPrimitive types: `.string`, `.number`, `.func`, and `.bool`. See [propTypes](http://facebook.github.io/react/docs/reusable-components.html#prop-validation).\n\n### Required types\n\n```js\npropTypes: {\n  requiredFunc:  React.PropTypes.func.isRequired,\n  requiredAny:   React.PropTypes.any.isRequired,\n```\n\nAdd `.isRequired`.\n\n### React elements\n\n```js\npropTypes: {\n  element:  React.PropTypes.element,  // react element\n  node:     React.PropTypes.node,     // num, string, element\n                                      // ...or array of those\n```\n\nUse `.element`, `.node`.\n\n### Enumerables\n\n```\npropTypes: {\n  enum:     React.PropTypes.oneOf(['M','F']),  // enum\n  union:    React.PropTypes.oneOfType([        // any\n              React.PropTypes.string,\n              React.PropTypes.number ]),\n```\n\nUse `.oneOf`, `.oneOfType`.\n\n### Arrays and objects\n\n```js\npropTypes: {\n  array:    React.PropTypes.array,\n  arrayOf:  React.PropTypes.arrayOf(React.PropTypes.number),\n  object:   React.PropTypes.object,\n  objectOf: React.PropTypes.objectOf(React.PropTypes.number),\n\n  message:  React.PropTypes.instanceOf(Message),\n\n  object2:  React.PropTypes.shape({\n    color:  React.PropTypes.string,\n    size:   React.PropTypes.number\n  }),\n```\n\nUse `.array[Of]`, `.object[Of]`, `.instanceOf`, `.shape`.\n\n### Custom validation\n\n```js\npropTypes: {\n  customProp: function(props, propName, componentName) {\n    if (!/matchme/.test(props[propName])) {\n      return new Error('Validation failed!');\n    }\n  }\n}\n```\n\nSupply your own function.\n\n## Other features\n\n### Class set\n\n```js\nvar cx = require('classnames');\n\nrender: function() {\n  var classes = cx({\n    'message': true,\n    'message-important': this.props.isImportant,\n    'message-read': this.props.isRead\n  });\n\n  return <div className={classes}>Great Scott!</div>;\n}\n```\n\nManipulate DOM classes with [classnames](https://www.npmjs.org/package/classnames), previously known as `React.addons.classSet`. See [Class set](http://facebook.github.io/react/docs/class-name-manipulation.html).\n\n### Propagating properties\n\n```html\n<VideoPlayer src=\"video.mp4\" />\n```\n{:.light}\n\n```js\nvar VideoPlayer = React.createClass({\n  render: function() {\n    /* propagates src=\"...\" down to this sub component */\n    return <VideoEmbed {...this.props} controls='false' />;\n  }\n});\n```\n\nSee [Transferring props](http://facebook.github.io/react/docs/transferring-props.html).\n\n### Mixins\n\n```js\nvar SetIntervalMixin = {\n  componentWillMount: function() { .. }\n}\n```\n{:.light}\n\n```js\nvar TickTock = React.createClass({\n  mixins: [SetIntervalMixin]\n}\n```\n\nSee [addons](https://facebook.github.io/react/docs/addons.html) for some built-in mixins.\n\n## [Top level API](https://facebook.github.io/react/docs/top-level-api.html)\n\n```js\nReact.createClass({ ... })\n\nReact.isValidElement(c)\n\nReactDOM.findDOMNode(c) // 0.14+\nReactDOM.render(<Component />, domnode, [callback]) // 0.14+\nReactDOM.unmountComponentAtNode(domnode) // 0.14+\n\nReactDOMServer.renderToString(<Component />) // 0.14+\nReactDOMServer.renderToStaticMarkup(<Component />) // 0.14+\n```\n\n## JSX patterns\n\n### Style shorthand\n\n```js\nvar style = { backgroundImage: 'url(x.jpg)', height: 10 };\nreturn <div style={style}></div>;\n```\n\nSee [inline styles](https://facebook.github.io/react/tips/inline-styles.html).\n\n### InnerHTML\n\n```js\nfunction markdownify() { return \"<p>...</p>\"; }\n<div dangerouslySetInnerHTML={{__html: markdownify()}} />\n```\n\nSee [dangerously set innerHTML](https://facebook.github.io/react/tips/dangerously-set-inner-html.html).\n\n### Lists\n\n```js\nvar TodoList = React.createClass({\n  render: function() {\n    function item(itemText) {\n      return <li>{itemText}</li>;\n    };\n    return <ul>{this.props.items.map(item)}</ul>;\n  }\n});\n```\n\n## See also\n\n* [Animations](http://facebook.github.io/react/docs/animation.html)\n{%endraw%}"}

field_intro:
**Deprecated:** this guide targets an old version of React (v0.14). See the [updated React cheatsheet](react) for new versions.

field_body:
{%raw%}

### Components

```js
var Component = React.createClass({
  render: function () {
    return <div>Hello {this.props.name}</div>;
  }
});
```

```js
ReactDOM.render(<Component name="John" />, document.body);
```
{:.light}

Use the [React.js jsfiddle](http://jsfiddle.net/reactjs/69z2wepo/) to start hacking. (or the unofficial [jsbin](http://jsbin.com/yafixat/edit?js,output))

### Nesting

```js
var UserAvatar  = React.createClass({...});
var UserProfile = React.createClass({...});
```
{:.light}

```js
var Info = React.createClass({
  render() {
    return <div>
      <UserAvatar src={this.props.avatar} />
      <UserProfile username={this.props.username} />
    </div>;
  }
});
```

Nest components to separate concerns. See [multiple components](http://facebook.github.io/react/docs/multiple-components.html).

## States & Properties
{:.center}

### States and props

```html
<MyComponent fullscreen={true} />
```
{:.light}
 
```js
// props
  this.props.fullscreen //=> true

// state
  this.setState({ username: 'rstacruz' });
  this.replaceState({ ... });
  this.state.username //=> 'rstacruz'
```

```js
render: function () {
  return <div className={this.props.fullscreen ? 'full' : ''}>
    Welcome, {this.state.username}
  </div>;
}
```

Use [props](https://facebook.github.io/react/docs/tutorial.html#using-props) (`this.props`) to access parameters passed from the parent.
Use [states](https://facebook.github.io/react/docs/tutorial.html#reactive-state) (`this.state`) to manage dynamic data.

### Setting defaults

```js
React.createClass({
  getInitialState: function () {
    return { comments: [] };
  },

  getDefaultProps: function () {
    return { name: "Hello" };
  }
);
```

Pre-populates `this.state.comments` and `this.props.name`.

## Components

### Component API

```js
ReactDOM.findDOMNode(c)  // 0.14+
React.findDOMNode(c)  // 0.13
c.getDOMNode()        // 0.12 below
```
{:.light}

```js
c.forceUpdate()
c.isMounted()

c.state
c.props

c.setState({ ... })
c.replaceState({ ... })

c.setProps({ ... })       // for deprecation
c.replaceProps({ ... })   // for deprecation

c.refs
```

These are methods available for `Component` instances. See [Component API](http://facebook.github.io/react/docs/component-api.html).

### Component specs

| Method | What |
| ---- | ---- |
| [`render()`](http://facebook.github.io/react/docs/component-specs.html#render) | |
| ---- | ---- |
| [`getInitialState()`](http://facebook.github.io/react/docs/component-specs.html#getinitialstate) | |
| [`getDefaultProps()`](http://facebook.github.io/react/docs/component-specs.html#getdefaultprops) |  |
| ---- | ---- |
| [`mixins: [ ... ]`](http://facebook.github.io/react/docs/component-specs.html#mixins) | Mixins ... [more](#mixins) |
| [`propTypes: { ... }`](http://facebook.github.io/react/docs/component-specs.html#proptypes) | Validation ... [more](#property-validation) |
| [`statics: { ... }`](http://facebook.github.io/react/docs/component-specs.html#statics) | Static methods |
| [`displayName: "..."`](http://facebook.github.io/react/docs/component-specs.html#displayname) | Automatically filled by JSX |
{:.greycode.no-head}

Methods and properties you can override. See [component specs](http://facebook.github.io/react/docs/component-specs.html).

## Lifecycle

### Mounting

| `componentWillMount()` | Before rendering (no DOM yet) |
| `componentDidMount()` | After rendering |
{:.greycode.no-head.lc}

Before initial rendering occurs. Add your DOM stuff on didMount (events, timers, etc). See [reference](http://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount).

### Updating

| `componentWillReceiveProps`*(newProps={})* | Use `setState()` here |
| `shouldComponentUpdate`*(newProps={}, newState={})* | Skips `render()` if returns false |
| `componentWillUpdate`*(newProps={}, newState={})* | Can't use `setState()` here |
| `componentDidUpdate`*(prevProps={}, prevState={})* | Operate on the DOM here |
{:.greycode.no-head.lc}

Called when parents change properties and `.setState()`. These are not called for initial renders. See [reference](http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops).

### Unmounting

| `componentWillUnmount()` | Invoked before DOM removal |
{:.greycode.no-head.lc}

Clear your DOM stuff here (probably done on didMount). See [reference](http://facebook.github.io/react/docs/component-specs.html#unmounting-componentwillunmount).

## Examples

### Example: loading data

```js
React.createClass({
  componentDidMount: function () {
    $.get(this.props.url, function (data) {
      this.setState(data);
    }.bind(this));
  },

  render: function () {
    return <CommentList data={this.state.data} />
  }
});
```

See [initial AJAX data](http://facebook.github.io/react/tips/initial-ajax.html).

## DOM nodes

### References

```html
<input ref="myInput">
```
{:.light}

```js
this.refs.myInput
ReactDOM.findDOMNode(this.refs.myInput).focus()
ReactDOM.findDOMNode(this.refs.myInput).value
```

### DOM Events
Add attributes like `onChange`. See [events](https://facebook.github.io/react/docs/events.html).

```html
<input type="text"
    value={this.state.value}
    onChange={this.handleChange} />
```
{:.light}

```js
handleChange: function(event) {
  this.setState({ value: event.target.value });
}
```

Allows access to DOM nodes. See [References](http://facebook.github.io/react/docs/more-about-refs.html).

### Two-way binding

```html
Email: <input type="text" valueLink={this.linkState('email')} />
```
{:.light}

```js
React.createClass({
  mixins: [React.addons.LinkedStateMixin]
});
```

```js
this.state.email
```

Use [LinkedStateMixin](http://facebook.github.io/react/docs/two-way-binding-helpers.html) for easier two-way binding.

## Property validation

### Basic types

```js
React.createClass({
  propTypes: {
    email:      React.PropTypes.string,
    seats:      React.PropTypes.number,
    settings:   React.PropTypes.object,
    callback:   React.PropTypes.func,
    isClosed:   React.PropTypes.bool,
    any:        React.PropTypes.any,
  }
});
```
Primitive types: `.string`, `.number`, `.func`, and `.bool`. See [propTypes](http://facebook.github.io/react/docs/reusable-components.html#prop-validation).

### Required types

```js
propTypes: {
  requiredFunc:  React.PropTypes.func.isRequired,
  requiredAny:   React.PropTypes.any.isRequired,
```

Add `.isRequired`.

### React elements

```js
propTypes: {
  element:  React.PropTypes.element,  // react element
  node:     React.PropTypes.node,     // num, string, element
                                      // ...or array of those
```

Use `.element`, `.node`.

### Enumerables

```
propTypes: {
  enum:     React.PropTypes.oneOf(['M','F']),  // enum
  union:    React.PropTypes.oneOfType([        // any
              React.PropTypes.string,
              React.PropTypes.number ]),
```

Use `.oneOf`, `.oneOfType`.

### Arrays and objects

```js
propTypes: {
  array:    React.PropTypes.array,
  arrayOf:  React.PropTypes.arrayOf(React.PropTypes.number),
  object:   React.PropTypes.object,
  objectOf: React.PropTypes.objectOf(React.PropTypes.number),

  message:  React.PropTypes.instanceOf(Message),

  object2:  React.PropTypes.shape({
    color:  React.PropTypes.string,
    size:   React.PropTypes.number
  }),
```

Use `.array[Of]`, `.object[Of]`, `.instanceOf`, `.shape`.

### Custom validation

```js
propTypes: {
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error('Validation failed!');
    }
  }
}
```

Supply your own function.

## Other features

### Class set

```js
var cx = require('classnames');

render: function() {
  var classes = cx({
    'message': true,
    'message-important': this.props.isImportant,
    'message-read': this.props.isRead
  });

  return <div className={classes}>Great Scott!</div>;
}
```

Manipulate DOM classes with [classnames](https://www.npmjs.org/package/classnames), previously known as `React.addons.classSet`. See [Class set](http://facebook.github.io/react/docs/class-name-manipulation.html).

### Propagating properties

```html
<VideoPlayer src="video.mp4" />
```
{:.light}

```js
var VideoPlayer = React.createClass({
  render: function() {
    /* propagates src="..." down to this sub component */
    return <VideoEmbed {...this.props} controls='false' />;
  }
});
```

See [Transferring props](http://facebook.github.io/react/docs/transferring-props.html).

### Mixins

```js
var SetIntervalMixin = {
  componentWillMount: function() { .. }
}
```
{:.light}

```js
var TickTock = React.createClass({
  mixins: [SetIntervalMixin]
}
```

See [addons](https://facebook.github.io/react/docs/addons.html) for some built-in mixins.

## [Top level API](https://facebook.github.io/react/docs/top-level-api.html)

```js
React.createClass({ ... })

React.isValidElement(c)

ReactDOM.findDOMNode(c) // 0.14+
ReactDOM.render(<Component />, domnode, [callback]) // 0.14+
ReactDOM.unmountComponentAtNode(domnode) // 0.14+

ReactDOMServer.renderToString(<Component />) // 0.14+
ReactDOMServer.renderToStaticMarkup(<Component />) // 0.14+
```

## JSX patterns

### Style shorthand

```js
var style = { backgroundImage: 'url(x.jpg)', height: 10 };
return <div style={style}></div>;
```

See [inline styles](https://facebook.github.io/react/tips/inline-styles.html).

### InnerHTML

```js
function markdownify() { return "<p>...</p>"; }
<div dangerouslySetInnerHTML={{__html: markdownify()}} />
```

See [dangerously set innerHTML](https://facebook.github.io/react/tips/dangerously-set-inner-html.html).

### Lists

```js
var TodoList = React.createClass({
  render: function() {
    function item(itemText) {
      return <li>{itemText}</li>;
    };
    return <ul>{this.props.items.map(item)}</ul>;
  }
});
```

## See also

* [Animations](http://facebook.github.io/react/docs/animation.html)
{%endraw%}


id: react
git_filename: ./react.md
format: md
field_title: React.js
field_category: React
field_tags: Featured
field_updated: 2020-07-05
field_updated___timezone: UTC
data:
{"title": "React.js", "category": "React", "ads": true, "tags": ["Featured"], "updated": "2020-07-05", "weight": -10, "keywords": ["React.Component", "render()", "componentDidMount()", "props/state", "dangerouslySetInnerHTML"], "intro": "[React](https://reactjs.org/) is a JavaScript library for building user interfaces. This guide targets React v15 to v16.\n", "body": "{%raw%}\n\nComponents\n----------\n{: .-three-column}\n\n### Components\n{: .-prime}\n\n```jsx\nimport React from 'react'\nimport ReactDOM from 'react-dom'\n```\n{: .-setup}\n\n```jsx\nclass Hello extends React.Component {\n  render () {\n    return <div className='message-box'>\n      Hello {this.props.name}\n    </div>\n  }\n}\n```\n\n```jsx\nconst el = document.body\nReactDOM.render(<Hello name='John' />, el)\n```\n\nUse the [React.js jsfiddle](http://jsfiddle.net/reactjs/69z2wepo/) to start hacking. (or the unofficial [jsbin](http://jsbin.com/yafixat/edit?js,output))\n\n### Import multiple exports\n{: .-prime}\n\n```jsx\nimport React, {Component} from 'react'\nimport ReactDOM from 'react-dom'\n```\n{: .-setup}\n\n```jsx\nclass Hello extends Component {\n  ...\n}\n```\n\n### Properties\n\n```html\n<Video fullscreen={true} autoplay={false} />\n```\n{: .-setup}\n\n```jsx\nrender () {\n  this.props.fullscreen\n  const { fullscreen, autoplay } = this.props\n  \u00b7\u00b7\u00b7\n}\n```\n{: data-line=\"2,3\"}\n\nUse `this.props` to access properties passed to the component.\n\nSee: [Properties](https://reactjs.org/docs/tutorial.html#using-props)\n\n### States\n\n```jsx\nconstructor(props) {\n  super(props)\n  this.state = { username: undefined }\n}\n```\n\n```jsx\nthis.setState({ username: 'rstacruz' })\n```\n\n```jsx\nrender () {\n  this.state.username\n  const { username } = this.state\n  \u00b7\u00b7\u00b7\n}\n```\n{: data-line=\"2,3\"}\n\nUse states (`this.state`) to manage dynamic data.\n\nWith [Babel](https://babeljs.io/) you can use [proposal-class-fields](https://github.com/tc39/proposal-class-fields) and get rid of constructor\n\n```jsx\nclass Hello extends Component {\n  state = { username: undefined };\n  ...\n}\n```\n\nSee: [States](https://reactjs.org/docs/tutorial.html#reactive-state)\n\n\n### Nesting\n\n```jsx\nclass Info extends Component {\n  render () {\n    const { avatar, username } = this.props\n\n    return <div>\n      <UserAvatar src={avatar} />\n      <UserProfile username={username} />\n    </div>\n  }\n}\n```\nAs of React v16.2.0, fragments can be used to return multiple children without adding extra wrapping nodes to the DOM.\n\n```jsx\nimport React, {\n  Component,\n  Fragment\n} from 'react'\n\nclass Info extends Component {\n  render () {\n    const { avatar, username } = this.props\n\n    return (\n      <Fragment>\n        <UserAvatar src={avatar} />\n        <UserProfile username={username} />\n      </Fragment>\n    )\n  }\n}\n```\n{: data-line=\"5,6,7,8,9,10\"}\n\nNest components to separate concerns.\n\nSee: [Composing Components](https://reactjs.org/docs/components-and-props.html#composing-components)\n\n### Children\n\n```jsx\n<AlertBox>\n  <h1>You have pending notifications</h1>\n</AlertBox>\n```\n{: data-line=\"2\"}\n\n```jsx\nclass AlertBox extends Component {\n  render () {\n    return <div className='alert-box'>\n      {this.props.children}\n    </div>\n  }\n}\n```\n{: data-line=\"4\"}\n\nChildren are passed as the `children` property.\n\nDefaults\n--------\n\n### Setting default props\n\n```jsx\nHello.defaultProps = {\n  color: 'blue'\n}\n```\n{: data-line=\"1\"}\n\nSee: [defaultProps](https://reactjs.org/docs/react-component.html#defaultprops)\n\n### Setting default state\n\n```jsx\nclass Hello extends Component {\n  constructor (props) {\n    super(props)\n    this.state = { visible: true }\n  }\n}\n```\n{: data-line=\"4\"}\n\nSet the default state in the `constructor()`.\n\nAnd without constructor using [Babel](https://babeljs.io/) with [proposal-class-fields](https://github.com/tc39/proposal-class-fields).\n\n```jsx\nclass Hello extends Component {\n  state = { visible: true }\n}\n```\n{: data-line=\"2\"}\n\nSee: [Setting the default state](https://reactjs.org/docs/react-without-es6.html#setting-the-initial-state)\n\nOther components\n----------------\n{: .-three-column}\n\n### Functional components\n\n```jsx\nfunction MyComponent ({ name }) {\n  return <div className='message-box'>\n    Hello {name}\n  </div>\n}\n```\n{: data-line=\"1\"}\n\nFunctional components have no state. Also, their `props` are passed as the first parameter to a function.\n\nSee: [Function and Class Components](https://reactjs.org/docs/components-and-props.html#functional-and-class-components)\n\n### Pure components\n\n```jsx\nimport React, {PureComponent} from 'react'\n\nclass MessageBox extends PureComponent {\n  \u00b7\u00b7\u00b7\n}\n```\n{: data-line=\"3\"}\n\nPerformance-optimized version of `React.Component`. Doesn't rerender if props/state hasn't changed.\n\nSee: [Pure components](https://reactjs.org/docs/react-api.html#react.purecomponent)\n\n### Component API\n\n```jsx\nthis.forceUpdate()\n```\n\n```jsx\nthis.setState({ ... })\nthis.setState(state => { ... })\n```\n\n```jsx\nthis.state\nthis.props\n```\n\nThese methods and properties are available for `Component` instances.\n\nSee: [Component API](http://facebook.github.io/react/docs/component-api.html)\n\nLifecycle\n---------\n{: .-two-column}\n\n### Mounting\n\n| Method                   | Description                                                                                          |\n| ------------------------ | ---------------------------------------------------------------------------------------------------- |\n| `constructor` _(props)_  | Before rendering [#](https://reactjs.org/docs/react-component.html#constructor)                      |\n| `componentWillMount()`   | _Don't use this_ [#](https://reactjs.org/docs/react-component.html#componentwillmount)               |\n| `render()`               | Render [#](https://reactjs.org/docs/react-component.html#render)                                     |\n| `componentDidMount()`    | After rendering (DOM available) [#](https://reactjs.org/docs/react-component.html#componentdidmount) |\n| ---                      | ---                                                                                                  |\n| `componentWillUnmount()` | Before DOM removal [#](https://reactjs.org/docs/react-component.html#componentwillunmount)           |\n| ---                      | ---                                                                                                  |\n| `componentDidCatch()`    | Catch errors (16+) [#](https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html)          |\n\nSet initial the state on `constructor()`.\nAdd DOM event handlers, timers (etc) on `componentDidMount()`, then remove them on `componentWillUnmount()`.\n\n### Updating\n\n| Method                                                  | Description                                          |\n| ------------------------------------------------------- | ---------------------------------------------------- |\n| `componentDidUpdate` _(prevProps, prevState, snapshot)_ | Use `setState()` here, but remember to compare props |\n| `shouldComponentUpdate` _(newProps, newState)_          | Skips `render()` if returns false                    |\n| `render()`                                              | Render                                               |\n| `componentDidUpdate` _(prevProps, prevState)_           | Operate on the DOM here                              |\n\nCalled when parents change properties and `.setState()`. These are not called for initial renders.\n\nSee: [Component specs](http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops)\n\nHooks (New)\n-----------\n{: .-two-column}\n\n### State Hook\n\n```jsx\nimport React, { useState } from 'react';\n\nfunction Example() {\n  // Declare a new state variable, which we'll call \"count\"\n  const [count, setCount] = useState(0);\n\n  return (\n    <div>\n      <p>You clicked {count} times</p>\n      <button onClick={() => setCount(count + 1)}>\n        Click me\n      </button>\n    </div>\n  );\n}\n```\n{: data-line=\"5,10\"}\n\nHooks are a new addition in React 16.8.\n\nSee: [Hooks at a Glance](https://reactjs.org/docs/hooks-overview.html)\n\n### Declaring multiple state variables\n\n```jsx\nimport React, { useState } from 'react';\n\nfunction ExampleWithManyStates() {\n  // Declare multiple state variables!\n  const [age, setAge] = useState(42);\n  const [fruit, setFruit] = useState('banana');\n  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);\n  // ...\n}\n```\n\n### Effect hook\n\n```jsx\nimport React, { useState, useEffect } from 'react';\n\nfunction Example() {\n  const [count, setCount] = useState(0);\n\n  // Similar to componentDidMount and componentDidUpdate:\n  useEffect(() => {\n    // Update the document title using the browser API\n    document.title = `You clicked ${count} times`;\n  }, [count]);\n\n  return (\n    <div>\n      <p>You clicked {count} times</p>\n      <button onClick={() => setCount(count + 1)}>\n        Click me\n      </button>\n    </div>\n  );\n}\n```\n{: data-line=\"6,7,8,9,10\"}\n\nIf you\u2019re familiar with React class lifecycle methods, you can think of `useEffect` Hook as `componentDidMount`, `componentDidUpdate`, and `componentWillUnmount` combined.\n\nBy default, React runs the effects after every render \u2014 including the first render.\n\n### Building your own hooks\n\n#### Define FriendStatus\n```jsx\nimport React, { useState, useEffect } from 'react';\n\nfunction FriendStatus(props) {\n  const [isOnline, setIsOnline] = useState(null);\n\n  useEffect(() => {\n    function handleStatusChange(status) {\n      setIsOnline(status.isOnline);\n    }\n\n    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);\n    return () => {\n      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);\n    };\n  }, [props.friend.id]);\n\n  if (isOnline === null) {\n    return 'Loading...';\n  }\n  return isOnline ? 'Online' : 'Offline';\n}\n```\n{: data-line=\"11,12,13,14\"}\n\nEffects may also optionally specify how to \u201cclean up\u201d after them by returning a function. \n\n#### Use FriendStatus\n\n```jsx\nfunction FriendStatus(props) {\n  const isOnline = useFriendStatus(props.friend.id);\n\n  if (isOnline === null) {\n    return 'Loading...';\n  }\n  return isOnline ? 'Online' : 'Offline';\n}\n```\n{: data-line=\"2\"}\n\nSee: [Building Your Own Hooks](https://reactjs.org/docs/hooks-custom.html)\n\n### Hooks API Reference\n\nAlso see: [Hooks FAQ](https://reactjs.org/docs/hooks-faq.html)\n\n#### Basic Hooks\n\n| Hook                         | Description                               |\n| ---------------------------- | ----------------------------------------- |\n| `useState`_(initialState)_   |                                           |\n| `useEffect`_(() => { ... })_ |                                           |\n| `useContext`_(MyContext)_    | value returned from `React.createContext` |\n\nFull details: [Basic Hooks](https://reactjs.org/docs/hooks-reference.html#basic-hooks)\n\n#### Additional Hooks\n\n| Hook                                         | Description                                                                 |\n| -------------------------------------------- | ---------------------------------------------------------------------------- |\n| `useReducer`_(reducer, initialArg, init)_    |                                                                              |\n| `useCallback`_(() => { ... })_               |                                                                              |\n| `useMemo`_(() => { ... })_                   |                                                                              |\n| `useRef`_(initialValue)_                     |                                                                              |\n| `useImperativeHandle`_(ref, () => { ... })_  |                                                                              |\n| `useLayoutEffect`                            | identical to `useEffect`, but it fires synchronously after all DOM mutations |\n| `useDebugValue`_(value)_                     | display a label for custom hooks in React DevTools                           |\n\nFull details: [Additional Hooks](https://reactjs.org/docs/hooks-reference.html#additional-hooks)\n\nDOM nodes\n---------\n{: .-two-column}\n\n### References\n\n```jsx\nclass MyComponent extends Component {\n  render () {\n    return <div>\n      <input ref={el => this.input = el} />\n    </div>\n  }\n\n  componentDidMount () {\n    this.input.focus()\n  }\n}\n```\n{: data-line=\"4,9\"}\n\nAllows access to DOM nodes.\n\nSee: [Refs and the DOM](https://reactjs.org/docs/refs-and-the-dom.html)\n\n### DOM Events\n\n```jsx\nclass MyComponent extends Component {\n  render () {\n    <input type=\"text\"\n        value={this.state.value}\n        onChange={event => this.onChange(event)} />\n  }\n\n  onChange (event) {\n    this.setState({ value: event.target.value })\n  }\n}\n```\n{: data-line=\"5,9\"}\n\nPass functions to attributes like `onChange`.\n\nSee: [Events](https://reactjs.org/docs/events.html)\n\n## Other features\n\n### Transferring props\n\n```html\n<VideoPlayer src=\"video.mp4\" />\n```\n{: .-setup}\n\n```jsx\nclass VideoPlayer extends Component {\n  render () {\n    return <VideoEmbed {...this.props} />\n  }\n}\n```\n{: data-line=\"3\"}\n\nPropagates `src=\"...\"` down to the sub-component.\n\nSee [Transferring props](http://facebook.github.io/react/docs/transferring-props.html)\n\n### Top-level API\n\n```jsx\nReact.createClass({ ... })\nReact.isValidElement(c)\n```\n\n```jsx\nReactDOM.render(<Component />, domnode, [callback])\nReactDOM.unmountComponentAtNode(domnode)\n```\n\n```jsx\nReactDOMServer.renderToString(<Component />)\nReactDOMServer.renderToStaticMarkup(<Component />)\n```\n\nThere are more, but these are most common.\n\nSee: [React top-level API](https://reactjs.org/docs/react-api.html)\n\nJSX patterns\n------------\n{: .-two-column}\n\n### Style shorthand\n\n```jsx\nconst style = { height: 10 }\nreturn <div style={style}></div>\n```\n\n```jsx\nreturn <div style={{ margin: 0, padding: 0 }}></div>\n```\n\nSee: [Inline styles](https://reactjs.org/tips/inline-styles.html)\n\n### Inner HTML\n\n```jsx\nfunction markdownify() { return \"<p>...</p>\"; }\n<div dangerouslySetInnerHTML={{__html: markdownify()}} />\n```\n\nSee: [Dangerously set innerHTML](https://reactjs.org/tips/dangerously-set-inner-html.html)\n\n### Lists\n\n```jsx\nclass TodoList extends Component {\n  render () {\n    const { items } = this.props\n\n    return <ul>\n      {items.map(item =>\n        <TodoItem item={item} key={item.key} />)}\n    </ul>\n  }\n}\n```\n{: data-line=\"6,7\"}\n\nAlways supply a `key` property.\n\n### Conditionals\n\n```jsx\n<Fragment>\n  {showMyComponent\n    ? <MyComponent />\n    : <OtherComponent />}\n</Fragment>\n```\n\n### Short-circuit evaluation\n\n```jsx\n<Fragment>\n  {showPopup && <Popup />}\n  ...\n</Fragment>\n```\n\nNew features\n------------\n{: .-three-column}\n\n### Returning multiple elements\n\nYou can return multiple elements as arrays or fragments.\n\n#### Arrays\n\n```js\nrender () {\n  // Don't forget the keys!\n  return [\n    <li key=\"A\">First item</li>,\n    <li key=\"B\">Second item</li>\n  ]\n}\n```\n{: data-line=\"3,4,5,6\"}\n\n#### Fragments\n```js\nrender () {\n  return (\n    <Fragment>\n      <li>First item</li>\n      <li>Second item</li>\n    </Fragment>\n  )\n}\n```\n{: data-line=\"3,4,5,6,7,8\"}\n\nSee: [Fragments and strings](https://reactjs.org/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings)\n\n### Returning strings\n\n```js\nrender() {\n  return 'Look ma, no spans!';\n}\n```\n{: data-line=\"2\"}\n\nYou can return just a string.\n\nSee: [Fragments and strings](https://reactjs.org/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings)\n\n### Errors\n\n```js\nclass MyComponent extends Component {\n  \u00b7\u00b7\u00b7\n  componentDidCatch (error, info) {\n    this.setState({ error })\n  }\n}\n```\n{: data-line=\"3,4,5\"}\n\nCatch errors via `componentDidCatch`. (React 16+)\n\nSee: [Error handling in React 16](https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html)\n\n### Portals\n\n```js\nrender () {\n  return React.createPortal(\n    this.props.children,\n    document.getElementById('menu')\n  )\n}\n```\n{: data-line=\"2,3,4,5\"}\n\nThis renders `this.props.children` into any location in the DOM.\n\nSee: [Portals](https://reactjs.org/docs/portals.html)\n\n### Hydration\n\n```js\nconst el = document.getElementById('app')\nReactDOM.hydrate(<App />, el)\n```\n{: data-line=\"2\"}\n\nUse `ReactDOM.hydrate` instead of using `ReactDOM.render` if you're rendering over the output of [ReactDOMServer](https://reactjs.org/docs/react-dom-server.html).\n\nSee: [Hydrate](https://reactjs.org/docs/react-dom.html#hydrate)\n\nProperty validation\n-------------------\n{: .-three-column}\n\n### PropTypes\n\n```js\nimport PropTypes from 'prop-types'\n```\n{: .-setup}\n\nSee: [Typechecking with PropTypes](https://reactjs.org/docs/typechecking-with-proptypes.html)\n\n| Key   | Description |\n| ----- | ----------- |\n| `any` | Anything    |\n\n#### Basic\n\n| Key      | Description   |\n| -------- | ------------- |\n| `string` |               |\n| `number` |               |\n| `func`   | Function      |\n| `bool`   | True or false |\n\n#### Enum\n\n| Key                       | Description |\n| ------------------------- | ----------- |\n| `oneOf`_(any)_            | Enum types  |\n| `oneOfType`_(type array)_ | Union       |\n\n#### Array\n\n| Key              | Description |\n| ---------------- | ----------- |\n| `array`          |             |\n| `arrayOf`_(...)_ |             |\n\n#### Object\n\n| Key                 | Description                          |\n| ------------------- | ------------------------------------ |\n| `object`            |                                      |\n| `objectOf`_(...)_   | Object with values of a certain type |\n| `instanceOf`_(...)_ | Instance of a class                  |\n| `shape`_(...)_      |                                      |\n\n#### Elements\n\n| Key       | Description   |\n| --------- | ------------- |\n| `element` | React element |\n| `node`    | DOM node      |\n\n#### Required\n\n| Key                | Description |\n| ------------------ | ----------- |\n| `(\u00b7\u00b7\u00b7).isRequired` | Required    |\n\n### Basic types\n\n```jsx\nMyComponent.propTypes = {\n  email:      PropTypes.string,\n  seats:      PropTypes.number,\n  callback:   PropTypes.func,\n  isClosed:   PropTypes.bool,\n  any:        PropTypes.any\n}\n```\n\n### Required types\n\n```jsx\nMyCo.propTypes = {\n  name:  PropTypes.string.isRequired\n}\n```\n\n### Elements\n\n```jsx\nMyCo.propTypes = {\n  // React element\n  element: PropTypes.element,\n\n  // num, string, element, or an array of those\n  node: PropTypes.node\n}\n```\n\n### Enumerables (oneOf)\n\n```jsx\nMyCo.propTypes = {\n  direction: PropTypes.oneOf([\n    'left', 'right'\n  ])\n}\n```\n\n### Arrays and objects\n\n```jsx\nMyCo.propTypes = {\n  list: PropTypes.array,\n  ages: PropTypes.arrayOf(PropTypes.number),\n  user: PropTypes.object,\n  user: PropTypes.objectOf(PropTypes.number),\n  message: PropTypes.instanceOf(Message)\n}\n```\n\n```jsx\nMyCo.propTypes = {\n  user: PropTypes.shape({\n    name: PropTypes.string,\n    age:  PropTypes.number\n  })\n}\n```\n\nUse `.array[Of]`, `.object[Of]`, `.instanceOf`, `.shape`.\n\n### Custom validation\n\n```jsx\nMyCo.propTypes = {\n  customProp: (props, key, componentName) => {\n    if (!/matchme/.test(props[key])) {\n      return new Error('Validation failed!')\n    }\n  }\n}\n```\n\nAlso see\n--------\n\n* [React website](https://reactjs.org) _(reactjs.org)_\n* [React cheatsheet](https://reactcheatsheet.com/) _(reactcheatsheet.com)_\n* [Awesome React](https://github.com/enaqx/awesome-react) _(github.com)_\n* [React v0.14 cheatsheet](react@0.14) _Legacy version_\n\n{%endraw%}"}

field_intro:
[React](https://reactjs.org/) is a JavaScript library for building user interfaces. This guide targets React v15 to v16.

field_body:
{%raw%}

Components
----------
{: .-three-column}

### Components
{: .-prime}

```jsx
import React from 'react'
import ReactDOM from 'react-dom'
```
{: .-setup}

```jsx
class Hello extends React.Component {
  render () {
    return <div className='message-box'>
      Hello {this.props.name}
    </div>
  }
}
```

```jsx
const el = document.body
ReactDOM.render(<Hello name='John' />, el)
```

Use the [React.js jsfiddle](http://jsfiddle.net/reactjs/69z2wepo/) to start hacking. (or the unofficial [jsbin](http://jsbin.com/yafixat/edit?js,output))

### Import multiple exports
{: .-prime}

```jsx
import React, {Component} from 'react'
import ReactDOM from 'react-dom'
```
{: .-setup}

```jsx
class Hello extends Component {
  ...
}
```

### Properties

```html
<Video fullscreen={true} autoplay={false} />
```
{: .-setup}

```jsx
render () {
  this.props.fullscreen
  const { fullscreen, autoplay } = this.props
  ···
}
```
{: data-line="2,3"}

Use `this.props` to access properties passed to the component.

See: [Properties](https://reactjs.org/docs/tutorial.html#using-props)

### States

```jsx
constructor(props) {
  super(props)
  this.state = { username: undefined }
}
```

```jsx
this.setState({ username: 'rstacruz' })
```

```jsx
render () {
  this.state.username
  const { username } = this.state
  ···
}
```
{: data-line="2,3"}

Use states (`this.state`) to manage dynamic data.

With [Babel](https://babeljs.io/) you can use [proposal-class-fields](https://github.com/tc39/proposal-class-fields) and get rid of constructor

```jsx
class Hello extends Component {
  state = { username: undefined };
  ...
}
```

See: [States](https://reactjs.org/docs/tutorial.html#reactive-state)


### Nesting

```jsx
class Info extends Component {
  render () {
    const { avatar, username } = this.props

    return <div>
      <UserAvatar src={avatar} />
      <UserProfile username={username} />
    </div>
  }
}
```
As of React v16.2.0, fragments can be used to return multiple children without adding extra wrapping nodes to the DOM.

```jsx
import React, {
  Component,
  Fragment
} from 'react'

class Info extends Component {
  render () {
    const { avatar, username } = this.props

    return (
      <Fragment>
        <UserAvatar src={avatar} />
        <UserProfile username={username} />
      </Fragment>
    )
  }
}
```
{: data-line="5,6,7,8,9,10"}

Nest components to separate concerns.

See: [Composing Components](https://reactjs.org/docs/components-and-props.html#composing-components)

### Children

```jsx
<AlertBox>
  <h1>You have pending notifications</h1>
</AlertBox>
```
{: data-line="2"}

```jsx
class AlertBox extends Component {
  render () {
    return <div className='alert-box'>
      {this.props.children}
    </div>
  }
}
```
{: data-line="4"}

Children are passed as the `children` property.

Defaults
--------

### Setting default props

```jsx
Hello.defaultProps = {
  color: 'blue'
}
```
{: data-line="1"}

See: [defaultProps](https://reactjs.org/docs/react-component.html#defaultprops)

### Setting default state

```jsx
class Hello extends Component {
  constructor (props) {
    super(props)
    this.state = { visible: true }
  }
}
```
{: data-line="4"}

Set the default state in the `constructor()`.

And without constructor using [Babel](https://babeljs.io/) with [proposal-class-fields](https://github.com/tc39/proposal-class-fields).

```jsx
class Hello extends Component {
  state = { visible: true }
}
```
{: data-line="2"}

See: [Setting the default state](https://reactjs.org/docs/react-without-es6.html#setting-the-initial-state)

Other components
----------------
{: .-three-column}

### Functional components

```jsx
function MyComponent ({ name }) {
  return <div className='message-box'>
    Hello {name}
  </div>
}
```
{: data-line="1"}

Functional components have no state. Also, their `props` are passed as the first parameter to a function.

See: [Function and Class Components](https://reactjs.org/docs/components-and-props.html#functional-and-class-components)

### Pure components

```jsx
import React, {PureComponent} from 'react'

class MessageBox extends PureComponent {
  ···
}
```
{: data-line="3"}

Performance-optimized version of `React.Component`. Doesn't rerender if props/state hasn't changed.

See: [Pure components](https://reactjs.org/docs/react-api.html#react.purecomponent)

### Component API

```jsx
this.forceUpdate()
```

```jsx
this.setState({ ... })
this.setState(state => { ... })
```

```jsx
this.state
this.props
```

These methods and properties are available for `Component` instances.

See: [Component API](http://facebook.github.io/react/docs/component-api.html)

Lifecycle
---------
{: .-two-column}

### Mounting

| Method                   | Description                                                                                          |
| ------------------------ | ---------------------------------------------------------------------------------------------------- |
| `constructor` _(props)_  | Before rendering [#](https://reactjs.org/docs/react-component.html#constructor)                      |
| `componentWillMount()`   | _Don't use this_ [#](https://reactjs.org/docs/react-component.html#componentwillmount)               |
| `render()`               | Render [#](https://reactjs.org/docs/react-component.html#render)                                     |
| `componentDidMount()`    | After rendering (DOM available) [#](https://reactjs.org/docs/react-component.html#componentdidmount) |
| ---                      | ---                                                                                                  |
| `componentWillUnmount()` | Before DOM removal [#](https://reactjs.org/docs/react-component.html#componentwillunmount)           |
| ---                      | ---                                                                                                  |
| `componentDidCatch()`    | Catch errors (16+) [#](https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html)          |

Set initial the state on `constructor()`.
Add DOM event handlers, timers (etc) on `componentDidMount()`, then remove them on `componentWillUnmount()`.

### Updating

| Method                                                  | Description                                          |
| ------------------------------------------------------- | ---------------------------------------------------- |
| `componentDidUpdate` _(prevProps, prevState, snapshot)_ | Use `setState()` here, but remember to compare props |
| `shouldComponentUpdate` _(newProps, newState)_          | Skips `render()` if returns false                    |
| `render()`                                              | Render                                               |
| `componentDidUpdate` _(prevProps, prevState)_           | Operate on the DOM here                              |

Called when parents change properties and `.setState()`. These are not called for initial renders.

See: [Component specs](http://facebook.github.io/react/docs/component-specs.html#updating-componentwillreceiveprops)

Hooks (New)
-----------
{: .-two-column}

### State Hook

```jsx
import React, { useState } from 'react';

function Example() {
  // Declare a new state variable, which we'll call "count"
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```
{: data-line="5,10"}

Hooks are a new addition in React 16.8.

See: [Hooks at a Glance](https://reactjs.org/docs/hooks-overview.html)

### Declaring multiple state variables

```jsx
import React, { useState } from 'react';

function ExampleWithManyStates() {
  // Declare multiple state variables!
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
  // ...
}
```

### Effect hook

```jsx
import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  }, [count]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```
{: data-line="6,7,8,9,10"}

If you’re familiar with React class lifecycle methods, you can think of `useEffect` Hook as `componentDidMount`, `componentDidUpdate`, and `componentWillUnmount` combined.

By default, React runs the effects after every render — including the first render.

### Building your own hooks

#### Define FriendStatus
```jsx
import React, { useState, useEffect } from 'react';

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  useEffect(() => {
    function handleStatusChange(status) {
      setIsOnline(status.isOnline);
    }

    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  }, [props.friend.id]);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
```
{: data-line="11,12,13,14"}

Effects may also optionally specify how to “clean up” after them by returning a function. 

#### Use FriendStatus

```jsx
function FriendStatus(props) {
  const isOnline = useFriendStatus(props.friend.id);

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}
```
{: data-line="2"}

See: [Building Your Own Hooks](https://reactjs.org/docs/hooks-custom.html)

### Hooks API Reference

Also see: [Hooks FAQ](https://reactjs.org/docs/hooks-faq.html)

#### Basic Hooks

| Hook                         | Description                               |
| ---------------------------- | ----------------------------------------- |
| `useState`_(initialState)_   |                                           |
| `useEffect`_(() => { ... })_ |                                           |
| `useContext`_(MyContext)_    | value returned from `React.createContext` |

Full details: [Basic Hooks](https://reactjs.org/docs/hooks-reference.html#basic-hooks)

#### Additional Hooks

| Hook                                         | Description                                                                 |
| -------------------------------------------- | ---------------------------------------------------------------------------- |
| `useReducer`_(reducer, initialArg, init)_    |                                                                              |
| `useCallback`_(() => { ... })_               |                                                                              |
| `useMemo`_(() => { ... })_                   |                                                                              |
| `useRef`_(initialValue)_                     |                                                                              |
| `useImperativeHandle`_(ref, () => { ... })_  |                                                                              |
| `useLayoutEffect`                            | identical to `useEffect`, but it fires synchronously after all DOM mutations |
| `useDebugValue`_(value)_                     | display a label for custom hooks in React DevTools                           |

Full details: [Additional Hooks](https://reactjs.org/docs/hooks-reference.html#additional-hooks)

DOM nodes
---------
{: .-two-column}

### References

```jsx
class MyComponent extends Component {
  render () {
    return <div>
      <input ref={el => this.input = el} />
    </div>
  }

  componentDidMount () {
    this.input.focus()
  }
}
```
{: data-line="4,9"}

Allows access to DOM nodes.

See: [Refs and the DOM](https://reactjs.org/docs/refs-and-the-dom.html)

### DOM Events

```jsx
class MyComponent extends Component {
  render () {
    <input type="text"
        value={this.state.value}
        onChange={event => this.onChange(event)} />
  }

  onChange (event) {
    this.setState({ value: event.target.value })
  }
}
```
{: data-line="5,9"}

Pass functions to attributes like `onChange`.

See: [Events](https://reactjs.org/docs/events.html)

## Other features

### Transferring props

```html
<VideoPlayer src="video.mp4" />
```
{: .-setup}

```jsx
class VideoPlayer extends Component {
  render () {
    return <VideoEmbed {...this.props} />
  }
}
```
{: data-line="3"}

Propagates `src="..."` down to the sub-component.

See [Transferring props](http://facebook.github.io/react/docs/transferring-props.html)

### Top-level API

```jsx
React.createClass({ ... })
React.isValidElement(c)
```

```jsx
ReactDOM.render(<Component />, domnode, [callback])
ReactDOM.unmountComponentAtNode(domnode)
```

```jsx
ReactDOMServer.renderToString(<Component />)
ReactDOMServer.renderToStaticMarkup(<Component />)
```

There are more, but these are most common.

See: [React top-level API](https://reactjs.org/docs/react-api.html)

JSX patterns
------------
{: .-two-column}

### Style shorthand

```jsx
const style = { height: 10 }
return <div style={style}></div>
```

```jsx
return <div style={{ margin: 0, padding: 0 }}></div>
```

See: [Inline styles](https://reactjs.org/tips/inline-styles.html)

### Inner HTML

```jsx
function markdownify() { return "<p>...</p>"; }
<div dangerouslySetInnerHTML={{__html: markdownify()}} />
```

See: [Dangerously set innerHTML](https://reactjs.org/tips/dangerously-set-inner-html.html)

### Lists

```jsx
class TodoList extends Component {
  render () {
    const { items } = this.props

    return <ul>
      {items.map(item =>
        <TodoItem item={item} key={item.key} />)}
    </ul>
  }
}
```
{: data-line="6,7"}

Always supply a `key` property.

### Conditionals

```jsx
<Fragment>
  {showMyComponent
    ? <MyComponent />
    : <OtherComponent />}
</Fragment>
```

### Short-circuit evaluation

```jsx
<Fragment>
  {showPopup && <Popup />}
  ...
</Fragment>
```

New features
------------
{: .-three-column}

### Returning multiple elements

You can return multiple elements as arrays or fragments.

#### Arrays

```js
render () {
  // Don't forget the keys!
  return [
    <li key="A">First item</li>,
    <li key="B">Second item</li>
  ]
}
```
{: data-line="3,4,5,6"}

#### Fragments
```js
render () {
  return (
    <Fragment>
      <li>First item</li>
      <li>Second item</li>
    </Fragment>
  )
}
```
{: data-line="3,4,5,6,7,8"}

See: [Fragments and strings](https://reactjs.org/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings)

### Returning strings

```js
render() {
  return 'Look ma, no spans!';
}
```
{: data-line="2"}

You can return just a string.

See: [Fragments and strings](https://reactjs.org/blog/2017/09/26/react-v16.0.html#new-render-return-types-fragments-and-strings)

### Errors

```js
class MyComponent extends Component {
  ···
  componentDidCatch (error, info) {
    this.setState({ error })
  }
}
```
{: data-line="3,4,5"}

Catch errors via `componentDidCatch`. (React 16+)

See: [Error handling in React 16](https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html)

### Portals

```js
render () {
  return React.createPortal(
    this.props.children,
    document.getElementById('menu')
  )
}
```
{: data-line="2,3,4,5"}

This renders `this.props.children` into any location in the DOM.

See: [Portals](https://reactjs.org/docs/portals.html)

### Hydration

```js
const el = document.getElementById('app')
ReactDOM.hydrate(<App />, el)
```
{: data-line="2"}

Use `ReactDOM.hydrate` instead of using `ReactDOM.render` if you're rendering over the output of [ReactDOMServer](https://reactjs.org/docs/react-dom-server.html).

See: [Hydrate](https://reactjs.org/docs/react-dom.html#hydrate)

Property validation
-------------------
{: .-three-column}

### PropTypes

```js
import PropTypes from 'prop-types'
```
{: .-setup}

See: [Typechecking with PropTypes](https://reactjs.org/docs/typechecking-with-proptypes.html)

| Key   | Description |
| ----- | ----------- |
| `any` | Anything    |

#### Basic

| Key      | Description   |
| -------- | ------------- |
| `string` |               |
| `number` |               |
| `func`   | Function      |
| `bool`   | True or false |

#### Enum

| Key                       | Description |
| ------------------------- | ----------- |
| `oneOf`_(any)_            | Enum types  |
| `oneOfType`_(type array)_ | Union       |

#### Array

| Key              | Description |
| ---------------- | ----------- |
| `array`          |             |
| `arrayOf`_(...)_ |             |

#### Object

| Key                 | Description                          |
| ------------------- | ------------------------------------ |
| `object`            |                                      |
| `objectOf`_(...)_   | Object with values of a certain type |
| `instanceOf`_(...)_ | Instance of a class                  |
| `shape`_(...)_      |                                      |

#### Elements

| Key       | Description   |
| --------- | ------------- |
| `element` | React element |
| `node`    | DOM node      |

#### Required

| Key                | Description |
| ------------------ | ----------- |
| `(···).isRequired` | Required    |

### Basic types

```jsx
MyComponent.propTypes = {
  email:      PropTypes.string,
  seats:      PropTypes.number,
  callback:   PropTypes.func,
  isClosed:   PropTypes.bool,
  any:        PropTypes.any
}
```

### Required types

```jsx
MyCo.propTypes = {
  name:  PropTypes.string.isRequired
}
```

### Elements

```jsx
MyCo.propTypes = {
  // React element
  element: PropTypes.element,

  // num, string, element, or an array of those
  node: PropTypes.node
}
```

### Enumerables (oneOf)

```jsx
MyCo.propTypes = {
  direction: PropTypes.oneOf([
    'left', 'right'
  ])
}
```

### Arrays and objects

```jsx
MyCo.propTypes = {
  list: PropTypes.array,
  ages: PropTypes.arrayOf(PropTypes.number),
  user: PropTypes.object,
  user: PropTypes.objectOf(PropTypes.number),
  message: PropTypes.instanceOf(Message)
}
```

```jsx
MyCo.propTypes = {
  user: PropTypes.shape({
    name: PropTypes.string,
    age:  PropTypes.number
  })
}
```

Use `.array[Of]`, `.object[Of]`, `.instanceOf`, `.shape`.

### Custom validation

```jsx
MyCo.propTypes = {
  customProp: (props, key, componentName) => {
    if (!/matchme/.test(props[key])) {
      return new Error('Validation failed!')
    }
  }
}
```

Also see
--------

* [React website](https://reactjs.org) _(reactjs.org)_
* [React cheatsheet](https://reactcheatsheet.com/) _(reactcheatsheet.com)_
* [Awesome React](https://github.com/enaqx/awesome-react) _(github.com)_
* [React v0.14 cheatsheet](react@0.14) _Legacy version_

{%endraw%}


id: react-router
git_filename: ./react-router.md
format: md
field_title: React-router
field_category: React
data:
{"title": "React-router", "category": "React", "body": "### About\n{: .-intro}\n\n- <https://reactrouter.com/>\n\n{% raw %}\n\n### Basic\n\n```js\nimport { default as Router, Route } from 'react-router'\n\nconst routes = (\n  <Route>\n    <Route path='*' handler={RootView} />\n  </Route>\n)\n\nRouter.run(routes, Router.HashLocation, (Root) => {\n  React.render(<Root />, document.getElementById('all'))\n})\n```\n\n### Nesting\n\n```js\nconst routes = (\n  <Route handler={Chrome}>\n    <Route path='about' handler={About} />\n    <Route path='inbox' handler={Inbox} />\n    <Route path='messages/:id' handler={Message} />\n  </Route>\n)\n\nimport { RouteHandler } from 'react-router'\n\nconst Chrome = React.createClass({\n  render () {\n    return (\n      <div>\n        <h1>App</h1>\n        <RouteHandler />\n      </div>\n    )\n  }\n})\n```\n\n### URL params\n\n```js\nvar Message = React.createClass({\n  componentDidMount: function () {\n    // from the path `/inbox/messages/:id`\n    var id = this.props.params.id\n    ...\n```\n\n### Link\n\n```js\nimport { Link } from 'react-router'\n\n<!-- make a named route `user` -->\n<Link to='user' params={{userId: 10}} />\n\n<Link to='login'\n  activeClassName='-active'\n  onClick='...'>\n\n```\n\n### Other config\n\n```js\n<Route path='/'>\n  <DefaultRoute handler={Home} />\n  <NotFoundRoute handler={NotFound} />\n  \n  <Redirect from='login' to='sessions/new' />\n  <Redirect from='login' to='sessions/new' params={{from: 'home'}} />\n  <Redirect from='profile/:id' to='about-user' />\n\n  <Route name='about-user' ... />\n```\n\n### Router.create\n\n```js\nvar router = Router.create({\n  routes: <Route>...</Route>,\n  location: Router.HistoryLocation\n})\n\nrouter.run((Root) => { ... })\n```\n\n### Navigation\n\n```js\nimport { Navigation } from 'react-router'\n\nReact.createClass({\n  mixins: [ Navigation ], ...\n})\n\nthis\n  .transitionTo('user', {id: 10})\n  .transitionTo('/path')\n  .transitionTo('http://...')\n  .replaceWith('about')\n  .makePath('about') // return URL\n  .makeHref('about') // return URL\n  .goBack()\n```\n\n{% endraw %}"}

field_body:
### About
{: .-intro}

- <https://reactrouter.com/>

{% raw %}

### Basic

```js
import { default as Router, Route } from 'react-router'

const routes = (
  <Route>
    <Route path='*' handler={RootView} />
  </Route>
)

Router.run(routes, Router.HashLocation, (Root) => {
  React.render(<Root />, document.getElementById('all'))
})
```

### Nesting

```js
const routes = (
  <Route handler={Chrome}>
    <Route path='about' handler={About} />
    <Route path='inbox' handler={Inbox} />
    <Route path='messages/:id' handler={Message} />
  </Route>
)

import { RouteHandler } from 'react-router'

const Chrome = React.createClass({
  render () {
    return (
      <div>
        <h1>App</h1>
        <RouteHandler />
      </div>
    )
  }
})
```

### URL params

```js
var Message = React.createClass({
  componentDidMount: function () {
    // from the path `/inbox/messages/:id`
    var id = this.props.params.id
    ...
```

### Link

```js
import { Link } from 'react-router'

<!-- make a named route `user` -->
<Link to='user' params={{userId: 10}} />

<Link to='login'
  activeClassName='-active'
  onClick='...'>

```

### Other config

```js
<Route path='/'>
  <DefaultRoute handler={Home} />
  <NotFoundRoute handler={NotFound} />
  
  <Redirect from='login' to='sessions/new' />
  <Redirect from='login' to='sessions/new' params={{from: 'home'}} />
  <Redirect from='profile/:id' to='about-user' />

  <Route name='about-user' ... />
```

### Router.create

```js
var router = Router.create({
  routes: <Route>...</Route>,
  location: Router.HistoryLocation
})

router.run((Root) => { ... })
```

### Navigation

```js
import { Navigation } from 'react-router'

React.createClass({
  mixins: [ Navigation ], ...
})

this
  .transitionTo('user', {id: 10})
  .transitionTo('/path')
  .transitionTo('http://...')
  .replaceWith('about')
  .makePath('about') // return URL
  .makeHref('about') // return URL
  .goBack()
```

{% endraw %}


id: rdoc
git_filename: ./rdoc.md
format: md
field_title: Rdoc
field_category: Markup
data:
{"title": "Rdoc", "category": "Markup", "body": "### Basic RDoc format\n\n```rb\n# Foo.\n#\n# @example\n#\n#   y\n#   g\n#\n# @param [String] param_name The xx and xx.\n#\n# @see https://example.com/\n#\n# @return [true] if so\n```\n\n### Hash parameters\n\n```rb\n# @param [Hash] opts the options to create a message with.\n# @option opts [String] :subject The subject\n# @option opts [String] :from ('nobody') From address\n# @option opts [String] :to Recipient email\n# @option opts [String] :body ('') The email's body\n```\n\n### Parameter types\n\n```rb\n# @param (see User#initialize)\n# @param [OptionParser] opts the option parser object\n# @param [Array<String>] args the arguments passed from input. This\n#   array will be modified.\n# @param [Array<String, Symbol>] list the list of strings and symbols.\n# @param [Hash<Symbol, String>] a hash with symbol keys and string values\n#\n# The options parsed out of the commandline.\n# Default options are:\n#   :format => :dot\n```\n\n### Exceptions\n```rb\n# @raise [AccountBalanceError] if the account does not have\n#   sufficient funds to perform the transaction\n```\n\n### Inline\n\n```markdown\n*bold*\n_emphasized_\n+code+\n```\n\n```markdown\n{ObjectName#method optional title}\n{Class::CONSTANT My constant's title}\n{#method_inside_current_namespace}\n```\n\n```markdown\nhttps://www.example.com/\nSee Models::User@Examples\n{Google}[https://google.com/]\n```\n\n### Skip\n\n```rb\ndef input # :nodoc:\n```\n\n```rb\nmodule MyModule # :nodoc: all\n```\n\n### Definition lists\n\n```rb\n# == Definition lists\n#\n# list::  hi.\n# +foo+:: parameterized\n```\n\n```rb\n# == Definition lists\n# [foo]   also\n# [bar]   like this\n```\n\n### Return types\n\n```rb\n# @return [String]\n# @return [String, nil] the name\n```\n\n### Callseq\n\n```rb\n# :call-seq:\n#   ARGF.readlines(sep=$/)     -> array\n#   ARGF.readlines(limit)      -> array\n#   ARGF.readlines(sep, limit) -> array\n#\n#   ARGF.to_a(sep=$/)     -> array\n#   ARGF.to_a(limit)      -> array\n#   ARGF.to_a(sep, limit) -> array\n```\n\n### Category\n\n```rb\n# :category: Utilities\n```\n\n### Sections\n\n```rb\n# :section: Expiry methods\n# methods relating to expiring\n\ndef expire!\ndef expired?\n...\n```\n\n### Using tomdoc\n\n```rb\n# :markup: TomDoc\n```\n\nPlace this at the beginning of the file.\n\n## Also see\n{: .-one-column}\n\n* <https://docs.ruby-lang.org/en/2.1.0/RDoc/Markup.html>\n* <https://www.rubydoc.info/gems/yard/file/docs/GettingStarted.md>\n* <https://rubydoc.info/gems/yard/file/docs/Tags.md>\n{: .-also-see}"}

field_body:
### Basic RDoc format

```rb
# Foo.
#
# @example
#
#   y
#   g
#
# @param [String] param_name The xx and xx.
#
# @see https://example.com/
#
# @return [true] if so
```

### Hash parameters

```rb
# @param [Hash] opts the options to create a message with.
# @option opts [String] :subject The subject
# @option opts [String] :from ('nobody') From address
# @option opts [String] :to Recipient email
# @option opts [String] :body ('') The email's body
```

### Parameter types

```rb
# @param (see User#initialize)
# @param [OptionParser] opts the option parser object
# @param [Array<String>] args the arguments passed from input. This
#   array will be modified.
# @param [Array<String, Symbol>] list the list of strings and symbols.
# @param [Hash<Symbol, String>] a hash with symbol keys and string values
#
# The options parsed out of the commandline.
# Default options are:
#   :format => :dot
```

### Exceptions
```rb
# @raise [AccountBalanceError] if the account does not have
#   sufficient funds to perform the transaction
```

### Inline

```markdown
*bold*
_emphasized_
+code+
```

```markdown
{ObjectName#method optional title}
{Class::CONSTANT My constant's title}
{#method_inside_current_namespace}
```

```markdown
https://www.example.com/
See Models::User@Examples
{Google}[https://google.com/]
```

### Skip

```rb
def input # :nodoc:
```

```rb
module MyModule # :nodoc: all
```

### Definition lists

```rb
# == Definition lists
#
# list::  hi.
# +foo+:: parameterized
```

```rb
# == Definition lists
# [foo]   also
# [bar]   like this
```

### Return types

```rb
# @return [String]
# @return [String, nil] the name
```

### Callseq

```rb
# :call-seq:
#   ARGF.readlines(sep=$/)     -> array
#   ARGF.readlines(limit)      -> array
#   ARGF.readlines(sep, limit) -> array
#
#   ARGF.to_a(sep=$/)     -> array
#   ARGF.to_a(limit)      -> array
#   ARGF.to_a(sep, limit) -> array
```

### Category

```rb
# :category: Utilities
```

### Sections

```rb
# :section: Expiry methods
# methods relating to expiring

def expire!
def expired?
...
```

### Using tomdoc

```rb
# :markup: TomDoc
```

Place this at the beginning of the file.

## Also see
{: .-one-column}

* <https://docs.ruby-lang.org/en/2.1.0/RDoc/Markup.html>
* <https://www.rubydoc.info/gems/yard/file/docs/GettingStarted.md>
* <https://rubydoc.info/gems/yard/file/docs/Tags.md>
{: .-also-see}


id: rclone
git_filename: ./rclone.md
format: md
field_title: rclone
field_category: CLI
data:
{"title": "rclone", "category": "CLI", "body": "### Basic configuration\n\n```bash\nrclone config       # Start the interactive configuration wizard to add new remotes\nrclone config show  # Display the current configuration\nrclone listremotes  # List the names of all configured remotes\n```\n\n### Listing files & directories\n\n```bash\nrclone ls <remote>:<path>    # List files and file sizes\nrclone lsl <remote>:<path>   # List files, sizes, and modification times\nrclone lsd <remote>:<path>   # List directories only\nrclone tree <remote>:<path>  # List contents in a tree-like structure\n```\n\n### Copying & syncing\n\n#### Copy\n\n```bash\nrclone copy <source> <dest>            # Copy new/changed files\nrclone copy <source> <dest> --dry-run  # Test the copy operation without making changes\n```\n\n#### Sync\n\n```bash\nrclone sync <source> <dest>            # Sync source to destination\nrclone sync <source> <dest> --dry-run  # Test the sync operation (recommended before actual sync)\n```\n\n### Deleting & moving\n\n```bash\nrclone move <source> <dest>    # Move files (copy and then delete the source)\nrclone delete <remote>:<path>  # Delete the files in the path\nrclone purge <remote>:<path>   # Delete the path and all of its contents (Irrecoverable!)\nrclone rmdir <remote>:<path>   # Remove an empty directory\n```\n\n### File manipulation\n\n```bash\nrclone mkdir <remote>:<path>           # Create a new directory\nrclone touch <remote>:<path>/file.txt  # Create a new file with the current time\nrclone cat <remote>:<path>/file.txt    # Output the file content to standard output\nrclone check <source> <dest>           # Check if the files in source and dest are identical\n```\n\n### Important flags (general)\n\n```bash\n--dry-run                     # Show what would be transferred without doing it\n-P or --progress              # Show progress during transfer\n--transfers=N                 # Set number of file transfers to run in parallel (default 4)\n--checkers=N                  # Set number of checkers to run in parallel (default 8)\n--max-age <time>              # Don't transfer files older than <time>\n--min-age <time>              # Don't transfer files newer than <time>\n--include <filter>            # Include files matching this pattern\n--exclude <filter>            # Exclude files matching this pattern\n--fast-list                   # Use recursive listing to speed up checks (may use more memory)\n--multi-thread-cutoff <size>  # Use multiple threads for files bigger than <size>\n--multi-thread-streams <N>    # Number of streams to use for multi-thread transfers\n```"}

field_body:
### Basic configuration

```bash
rclone config       # Start the interactive configuration wizard to add new remotes
rclone config show  # Display the current configuration
rclone listremotes  # List the names of all configured remotes
```

### Listing files & directories

```bash
rclone ls <remote>:<path>    # List files and file sizes
rclone lsl <remote>:<path>   # List files, sizes, and modification times
rclone lsd <remote>:<path>   # List directories only
rclone tree <remote>:<path>  # List contents in a tree-like structure
```

### Copying & syncing

#### Copy

```bash
rclone copy <source> <dest>            # Copy new/changed files
rclone copy <source> <dest> --dry-run  # Test the copy operation without making changes
```

#### Sync

```bash
rclone sync <source> <dest>            # Sync source to destination
rclone sync <source> <dest> --dry-run  # Test the sync operation (recommended before actual sync)
```

### Deleting & moving

```bash
rclone move <source> <dest>    # Move files (copy and then delete the source)
rclone delete <remote>:<path>  # Delete the files in the path
rclone purge <remote>:<path>   # Delete the path and all of its contents (Irrecoverable!)
rclone rmdir <remote>:<path>   # Remove an empty directory
```

### File manipulation

```bash
rclone mkdir <remote>:<path>           # Create a new directory
rclone touch <remote>:<path>/file.txt  # Create a new file with the current time
rclone cat <remote>:<path>/file.txt    # Output the file content to standard output
rclone check <source> <dest>           # Check if the files in source and dest are identical
```

### Important flags (general)

```bash
--dry-run                     # Show what would be transferred without doing it
-P or --progress              # Show progress during transfer
--transfers=N                 # Set number of file transfers to run in parallel (default 4)
--checkers=N                  # Set number of checkers to run in parallel (default 8)
--max-age <time>              # Don't transfer files older than <time>
--min-age <time>              # Don't transfer files newer than <time>
--include <filter>            # Include files matching this pattern
--exclude <filter>            # Exclude files matching this pattern
--fast-list                   # Use recursive listing to speed up checks (may use more memory)
--multi-thread-cutoff <size>  # Use multiple threads for files bigger than <size>
--multi-thread-streams <N>    # Number of streams to use for multi-thread transfers
```


id: rbenv
git_filename: ./rbenv.md
format: md
field_title: rbenv
field_category: Ruby
field_intro: [rbenv](https://github.com/rbenv/rbenv) lets you manage installations of multiple Ruby versions.
field_updated: 2018-02-20
field_updated___timezone: UTC
data:
{"title": "rbenv", "category": "Ruby", "updated": "2018-02-20", "weight": -1, "description": "A one-page guide to rbenv Ruby version manager, with usage examples and more.\n", "intro": "[rbenv](https://github.com/rbenv/rbenv) lets you manage installations of multiple Ruby versions.\n", "body": "### Installation\n\n#### Install rbenv and ruby-build\n\n```bash\ngit clone https://github.com/sstephenson/rbenv.git ~/.rbenv\ngit clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build\n```\n\n#### Add to ~/.bash_profile\n\n```bash\necho 'export PATH=\"$HOME/.rbenv/bin:$PATH\"' >> ~/.bash_profile\necho 'eval \"$(rbenv init -)\"' >> ~/.bash_profile\n```\n\n#### Verify installation\n\n```bash\ntype rbenv   # \u2192 \"rbenv is a function\"\n```\n\nThese are generic instructions; there may be rbenv packages available for your OS.\n\nSee: [Installation](https://github.com/rbenv/rbenv#installation)\n\n### Managing versions\n\n| Command                 | Description                 |\n| ---                     | ---                         |\n| `rbenv install -l`      | List all available versions |\n| ---                     | ---                         |\n| `rbenv install 2.2.1`   | Install Ruby _2.2.1_        |\n| `rbenv uninstall 2.2.1` | Uninstall Ruby _2.2.1_      |\n| ---                     | ---                         |\n| `rbenv versions`        | See installed versions      |\n| `rbenv version`         | See current version         |\n| ---                     | ---                         |\n| `rbenv which <NAME>`    | Display path to executable  |\n| `rbenv rehash`          | Re-write binstubs           |\n\n## Using versions\n{: .-three-column}\n\n### Locally\n\n| Command               | Description                 |\n| ---                   | ---                         |\n| `rbenv local 2.2.2`   | Use Ruby _2.2.2_ in project |\n| `rbenv local --unset` | Undo above                  |\n\nApplication-specific version numbers are stored in `.ruby-version`.\n\n### Globally\n\n| Command                | Description               |\n| ---                    | ---                       |\n| `rbenv global 2.2.2`   | Use Ruby _2.2.2_ globally |\n| `rbenv global --unset` | Undo above                |\n\nGlobal version numbers are stored in `~/.rbenv/version`.\n\n### Shell\n\n| Command               | Description               |\n| ---                   | ---                       |\n| `rbenv shell 2.2.2`   | Use Ruby _2.2.2_ in shell |\n| `rbenv shell --unset` | Undo above                |\n\nShell-local version numbers are stored as environment variables.\n\n## References\n\n- [rbenv project page](https://github.com/rbenv/rbenv) _(github.com)_\n- [rbenv ubuntu server cheatsheet](https://gist.github.com/rahul286/7160839f4425a3b7e718) _(gist.github.com)_"}

field_body:
### Installation

#### Install rbenv and ruby-build

```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

#### Add to ~/.bash_profile

```bash
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

#### Verify installation

```bash
type rbenv   # → "rbenv is a function"
```

These are generic instructions; there may be rbenv packages available for your OS.

See: [Installation](https://github.com/rbenv/rbenv#installation)

### Managing versions

| Command                 | Description                 |
| ---                     | ---                         |
| `rbenv install -l`      | List all available versions |
| ---                     | ---                         |
| `rbenv install 2.2.1`   | Install Ruby _2.2.1_        |
| `rbenv uninstall 2.2.1` | Uninstall Ruby _2.2.1_      |
| ---                     | ---                         |
| `rbenv versions`        | See installed versions      |
| `rbenv version`         | See current version         |
| ---                     | ---                         |
| `rbenv which <NAME>`    | Display path to executable  |
| `rbenv rehash`          | Re-write binstubs           |

## Using versions
{: .-three-column}

### Locally

| Command               | Description                 |
| ---                   | ---                         |
| `rbenv local 2.2.2`   | Use Ruby _2.2.2_ in project |
| `rbenv local --unset` | Undo above                  |

Application-specific version numbers are stored in `.ruby-version`.

### Globally

| Command                | Description               |
| ---                    | ---                       |
| `rbenv global 2.2.2`   | Use Ruby _2.2.2_ globally |
| `rbenv global --unset` | Undo above                |

Global version numbers are stored in `~/.rbenv/version`.

### Shell

| Command               | Description               |
| ---                   | ---                       |
| `rbenv shell 2.2.2`   | Use Ruby _2.2.2_ in shell |
| `rbenv shell --unset` | Undo above                |

Shell-local version numbers are stored as environment variables.

## References

- [rbenv project page](https://github.com/rbenv/rbenv) _(github.com)_
- [rbenv ubuntu server cheatsheet](https://gist.github.com/rahul286/7160839f4425a3b7e718) _(gist.github.com)_


id: rake
git_filename: ./rake.md
format: md
field_title: Rake
field_category: Ruby
data:
{"title": "Rake", "category": "Ruby", "body": "### Basic syntax\n\n```rb\nnamespace :foo do\n  desc \"Description\"\n  task :bar do\n    ...\n  end\n\n  task :baz => :dependency do\n  end\n\n  task :baz => [:dep1, :dep2, :dep3] do\n  end\nend\n\n# rake foo:bar\n```\n\n### Rake task with arguments\n\n```rb\ndesc \"Do something\"\ntask :workit, [:id] => :environment do |_, args|\n  id = args[:id]\nend\n\n# rake workit[234]\n```"}

field_body:
### Basic syntax

```rb
namespace :foo do
  desc "Description"
  task :bar do
    ...
  end

  task :baz => :dependency do
  end

  task :baz => [:dep1, :dep2, :dep3] do
  end
end

# rake foo:bar
```

### Rake task with arguments

```rb
desc "Do something"
task :workit, [:id] => :environment do |_, args|
  id = args[:id]
end

# rake workit[234]
```


id: rails
git_filename: ./rails.md
format: md
field_title: Rails
field_category: Rails
data:
{"title": "Rails", "category": "Rails", "body": "Helpers\n-------\n\n    class ApplicationController\n      helper_method :logged_in?\n    \n      def logged_in?\n        \"Something\"\n      end\n    end\n\n### CSS/JS packages\n\n    stylesheet_link_tag :monkey\n    javascript_link_tag :monkey\n\n### Forms\n\n    # http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html\n\n    - form_for @person do |f|\n      = f.label :first_name\n      = f.label :first_name, \"First name\"\n      = f.text_field :first_name\n\n      = f.label :last_name>\n      = f.text_field :last_name>\n\n      - fields_for @person.permission do |fields|\n        = fields.checkbox :admin\n\n      -# name=\"person[admin]\"\n      - fields_for :person, @client do |fields|\n        = fields.checkbox :admin\n\n      = f.submit\n\n    # Also: check_box, email_field, fields_for\n    # file_field, hidden_field, label, number_field, password_field\n    # radio_button, range_field, search_field, telephonen_field,\n    # text_area, text_field, url_field\n\nControllers\n-----------\n\nhttp://apidock.com/rails/ActionController/Base\n\n    class ProjectsController\n      layout 'project'   # Actually defaults to `projects` based\n                         # on the controller name\n\n      def save\n      end\n\n      def edit\n      end\n    end\n\n### Before filter\n  \n    class ApplicationController < ActionController::Base\n      before_filter :validate, only: [:save, :edit]\n      before_filter :ensure_auth, except: [:logout]\n\n      before_filter :require_login\n     \n      private\n     \n      def require_login\n        unless logged_in?\n          flash[:error] = \"You must be logged in to access this section\"\n          redirect_to new_login_url # halts request cycle\n        end\n      end\n    end\n\n### Default URL options\n\n    class ApplicationController < ActionController::Base\n      # The options parameter is the hash passed in to 'url_for'\n      def default_url_options(options)\n        {:locale => I18n.locale}\n      end\n    end\n\n### Hashes\n\n    session[:what]\n    flash[:notice] = \"Your session expired\"\n    params[:id]\n\n### XML and JSON\n  \n    class UsersController < ApplicationController\n      def index\n        @users = User.all\n        respond_to do |format|\n          format.html # index.html.erb\n          format.xml  { render :xml => @users}\n          format.json { render :json => @users}\n        end\n      end\n    end\n\n### Redirection\n\n    redirect_to action: 'show', id: @entry.id\n    redirect_to root_url          # a path\n\n### Render\n\n    render nothing: true\n    render template: 'products/show'\n    render status: 500\n    render status: :forbidden\n    render text: '...'\n    render layout: 'special_layout'\n    render layout: false\n    render action: 'something'    # same as `file: 'my/something'`\n                                  # Renders the template only, does not execute\n                                  # the action\n\n    render json: object\n    render xml: object\n\n    render location: photo_url(photo)\n\n### Head-only responses\n\n    head :bad_request\n    head :created, location: photo_path(@photo)\n\nLayouts\n-------\n\n    # app/views/layouts/application.html.erb\n    <%= content_for?(:content) ? yield :content : yield %>\n\n    # app/views/layouts/news.html.erb\n    <% content_for :content do %>\n       ...\n    <% end %>\n    <% render template: :'layouts/application' %>"}

field_body:
Helpers
-------

    class ApplicationController
      helper_method :logged_in?
    
      def logged_in?
        "Something"
      end
    end

### CSS/JS packages

    stylesheet_link_tag :monkey
    javascript_link_tag :monkey

### Forms

    # http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

    - form_for @person do |f|
      = f.label :first_name
      = f.label :first_name, "First name"
      = f.text_field :first_name

      = f.label :last_name>
      = f.text_field :last_name>

      - fields_for @person.permission do |fields|
        = fields.checkbox :admin

      -# name="person[admin]"
      - fields_for :person, @client do |fields|
        = fields.checkbox :admin

      = f.submit

    # Also: check_box, email_field, fields_for
    # file_field, hidden_field, label, number_field, password_field
    # radio_button, range_field, search_field, telephonen_field,
    # text_area, text_field, url_field

Controllers
-----------

http://apidock.com/rails/ActionController/Base

    class ProjectsController
      layout 'project'   # Actually defaults to `projects` based
                         # on the controller name

      def save
      end

      def edit
      end
    end

### Before filter
  
    class ApplicationController < ActionController::Base
      before_filter :validate, only: [:save, :edit]
      before_filter :ensure_auth, except: [:logout]

      before_filter :require_login
     
      private
     
      def require_login
        unless logged_in?
          flash[:error] = "You must be logged in to access this section"
          redirect_to new_login_url # halts request cycle
        end
      end
    end

### Default URL options

    class ApplicationController < ActionController::Base
      # The options parameter is the hash passed in to 'url_for'
      def default_url_options(options)
        {:locale => I18n.locale}
      end
    end

### Hashes

    session[:what]
    flash[:notice] = "Your session expired"
    params[:id]

### XML and JSON
  
    class UsersController < ApplicationController
      def index
        @users = User.all
        respond_to do |format|
          format.html # index.html.erb
          format.xml  { render :xml => @users}
          format.json { render :json => @users}
        end
      end
    end

### Redirection

    redirect_to action: 'show', id: @entry.id
    redirect_to root_url          # a path

### Render

    render nothing: true
    render template: 'products/show'
    render status: 500
    render status: :forbidden
    render text: '...'
    render layout: 'special_layout'
    render layout: false
    render action: 'something'    # same as `file: 'my/something'`
                                  # Renders the template only, does not execute
                                  # the action

    render json: object
    render xml: object

    render location: photo_url(photo)

### Head-only responses

    head :bad_request
    head :created, location: photo_path(@photo)

Layouts
-------

    # app/views/layouts/application.html.erb
    <%= content_for?(:content) ? yield :content : yield %>

    # app/views/layouts/news.html.erb
    <% content_for :content do %>
       ...
    <% end %>
    <% render template: :'layouts/application' %>


id: rails-tricks
git_filename: ./rails-tricks.md
format: md
field_title: Rails tricks
field_category: Rails
field_tags: Archived
data:
{"title": "Rails tricks", "category": "Rails", "tags": ["Archived"], "archived": "This sheet may describe practices that might be outdated.", "body": "### Sass source maps\n\nin config/environments/development.rb:\n\n    # Source maps for Sass\n    config.sass.debug_info = true\n    config.sass.line_comments = false\n\n    # Don't break apart\n    config.assets.debug = false\n\n### Partial locals\n\n    <%= render 'article', full: true %>\n    <%= render 'article' %>\n\n    <% if local_assigns[:full] %>\n      ...\n    <% end %>\n\n### HTML in i18n\n\n    en:\n      read_more_html: \"read <b>more</b>...\"\n\n### Exception handling\n\n    # config/application.rb\n    config.exceptions_app = self.routes\n\n    get '/404', to: 'errors#not_found'\n    get '/500', to: 'errors#server_error'\n\n    class ErrorsController\n      def not_found\n        render status: :not_found\n      end\n     end\n\n### Rails updating\n\n    rake rails:update\n\n### Distinct pluck\n\n    Article.distinct.pluck('author')\n\n### Relation#merge\n\n    scope :with_drafts, -> {\n      uniq.joins(:articles).merge(Article.draft)\n    }\n\n### Order\n\n    scope :recent, -> { order created_at: :desc }\n\n### Group by month\n\n    .group(\"to_char(created_at, 'YYYY-MM')\")\n    .group(\"to_char(created_at, 'YYYY-MM')\").count"}

field_body:
### Sass source maps

in config/environments/development.rb:

    # Source maps for Sass
    config.sass.debug_info = true
    config.sass.line_comments = false

    # Don't break apart
    config.assets.debug = false

### Partial locals

    <%= render 'article', full: true %>
    <%= render 'article' %>

    <% if local_assigns[:full] %>
      ...
    <% end %>

### HTML in i18n

    en:
      read_more_html: "read <b>more</b>..."

### Exception handling

    # config/application.rb
    config.exceptions_app = self.routes

    get '/404', to: 'errors#not_found'
    get '/500', to: 'errors#server_error'

    class ErrorsController
      def not_found
        render status: :not_found
      end
     end

### Rails updating

    rake rails:update

### Distinct pluck

    Article.distinct.pluck('author')

### Relation#merge

    scope :with_drafts, -> {
      uniq.joins(:articles).merge(Article.draft)
    }

### Order

    scope :recent, -> { order created_at: :desc }

### Group by month

    .group("to_char(created_at, 'YYYY-MM')")
    .group("to_char(created_at, 'YYYY-MM')").count


id: rails-routes
git_filename: ./rails-routes.md
format: md
field_title: Routes
field_category: Rails
data:
{"title": "Routes", "category": "Rails", "body": "## Resources\n\n### Multiple resources (`resources`)\n\n    resources :photos\n\n    # PhotosController:\n    # index  =>    GET /photos\n    # new    =>    GET /photos/new\n    # create =>   POST /photos/new\n    # show   =>    GET /photos/:id\n    # edit   =>    GET /photos/:id/edit\n    # update =>    PUT /photos/:id\n    # delete => DELETE /photos/:id\n    #\n    # Helpers:\n    # new_photo_path\n    # photo_path(id)\n    # edit_photo_path(id)\n\n### Custom actions\n\n    resources :photos do\n      member { get 'preview' }       # /photo/1/preview\n      collection { get 'search' }    # /photos/search\n\n      get 'preview', on: :member     # (..same as the first)\n    end\n\n### Options\n\n    resources :photos,\n      path_names: { new: 'brand_new' }    # /photos/1/brand_new\n      path: 'postings'                    # /postings\n      only: :index\n      only: [:index, :show]\n      except: :show\n      except: [:index, :show]\n\n      shallow: true                       # also generate shallow routes\n      shalow_path: 'secret'\n      shallow_prefix: 'secret'\n\n## Single resource (`resource`)\n\n    resource :coder\n\n    # CodersController:\n    # new    =>    GET /coder/new\n    # create =>   POST /coder/new\n    # show   =>    GET /coder\n    # edit   =>    GET /coder/edit\n    # update =>    PUT /coder\n    # delete => DELETE /coder\n\n## Matching (`match`)\n\n    match 'photo/:id' => 'photos#show'  # /photo/what-is-it\n    match 'photo/:id', id: /[0-9]+/     # /photo/0192\n    match 'photo/:id' => 'photos#show', constraints: { id: /[0-9]+/ }\n    match 'photo/:id', via: :get\n    match 'photo/:id', via: [:get, :post]\n\n    match 'photo/*path' => 'photos#unknown'    # /photo/what/ever\n\n    # params[:format] == 'jpg'\n    match 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' }\n\n### Get/post\n\n`get` is the same as `match via: :get`.\n\n    get 'photo/:id' => 'photos#show'\n    # same as match 'photo/:id' => 'photos#show', via: :get\n\n    post 'photo/:id' => 'photos#update'\n    # same as match 'photo/:id' => 'photos#show', via: :post\n\n### Redirection\n\n    match '/stories' => redirect('/posts')\n    match '/stories/:name' => redirect('/posts/%{name}')\n\n### Named\n\n    # logout_path\n    match 'exit' => 'sessions#destroy', as: :logout\n    \n### Constraints\n\n    match '/', constraints: { subdomain: 'admin' }\n\n    # admin.site.com/admin/photos\n    namespace 'admin' do\n      constraints subdomain: 'admin' do\n        resources :photos\n      end\n    end\n\n### Custom constraints\n\n    class BlacklistConstraint\n      def initialize\n        @ips = Blacklist.retrieve_ips\n      end\n     \n      def matches?(request)\n        @ips.include?(request.remote_ip)\n      end\n    end\n     \n    TwitterClone::Application.routes.draw do\n      match \"*path\" => \"blacklist#index\",\n        :constraints => BlacklistConstraint.new\n    end\n\n### Scopes\n\n    scope 'admin', constraints: { subdomain: 'admin' } do\n      resources ...\n    end\n\n### Rack middleware\n\n    # Yes, Sprockets is middleware\n    match '/application.js' => Sprockets\n\n### Route helpers\n\n    projects_path   # /projects\n    projects_url    # http://site.com/projects\n\n\n### Default help text\n\n    # The priority is based upon order of creation:\n    # first created -> highest priority.\n\n    # Sample of regular route:\n    match 'products/:id' => 'catalog#view'\n\n    # Keep in mind you can assign values other than :controller and :action\n\n    # Sample of named route:\n    match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase\n\n    # This route can be invoked with purchase_url(:id => product.id)\n\n    # Sample resource route (maps HTTP verbs to controller actions automatically):\n    resources :products\n\n    # Sample resource route with options:\n    resources :products do\n      member do\n        get 'short'\n        post 'toggle'\n      end\n    \n      collection do\n        get 'sold'\n      end\n    end\n\n    # Sample resource route with sub-resources:\n    resources :products do\n      resources :comments, :sales\n      resource :seller\n    end\n\n    # Sample resource route with more complex sub-resources\n    resources :products do\n      resources :comments\n      resources :sales do\n        get 'recent', :on => :collection\n      end\n    end\n\n    # Sample resource route within a namespace:\n    namespace :admin do\n      # Directs /admin/products/* to Admin::ProductsController\n      # (app/controllers/admin/products_controller.rb)\n      resources :products\n    end\n\n    # You can have the root of your site routed with \"root\"\n    # just remember to delete public/index.html.\n    root :to => 'welcome#index'\n\n    # See how all your routes lay out with \"rake routes\"\n\n    # This is a legacy wild controller route that's not recommended for RESTful applications.\n    # Note: This route will make all actions in every controller accessible via GET requests.\n    match ':controller(/:action(/:id(.:format)))'\n\n### References\n\n * [Guides/Routing](http://guides.rubyonrails.org/routing.html)\n\n * [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)\n    (See included modules)"}

field_body:
## Resources

### Multiple resources (`resources`)

    resources :photos

    # PhotosController:
    # index  =>    GET /photos
    # new    =>    GET /photos/new
    # create =>   POST /photos/new
    # show   =>    GET /photos/:id
    # edit   =>    GET /photos/:id/edit
    # update =>    PUT /photos/:id
    # delete => DELETE /photos/:id
    #
    # Helpers:
    # new_photo_path
    # photo_path(id)
    # edit_photo_path(id)

### Custom actions

    resources :photos do
      member { get 'preview' }       # /photo/1/preview
      collection { get 'search' }    # /photos/search

      get 'preview', on: :member     # (..same as the first)
    end

### Options

    resources :photos,
      path_names: { new: 'brand_new' }    # /photos/1/brand_new
      path: 'postings'                    # /postings
      only: :index
      only: [:index, :show]
      except: :show
      except: [:index, :show]

      shallow: true                       # also generate shallow routes
      shalow_path: 'secret'
      shallow_prefix: 'secret'

## Single resource (`resource`)

    resource :coder

    # CodersController:
    # new    =>    GET /coder/new
    # create =>   POST /coder/new
    # show   =>    GET /coder
    # edit   =>    GET /coder/edit
    # update =>    PUT /coder
    # delete => DELETE /coder

## Matching (`match`)

    match 'photo/:id' => 'photos#show'  # /photo/what-is-it
    match 'photo/:id', id: /[0-9]+/     # /photo/0192
    match 'photo/:id' => 'photos#show', constraints: { id: /[0-9]+/ }
    match 'photo/:id', via: :get
    match 'photo/:id', via: [:get, :post]

    match 'photo/*path' => 'photos#unknown'    # /photo/what/ever

    # params[:format] == 'jpg'
    match 'photos/:id' => 'photos#show', :defaults => { :format => 'jpg' }

### Get/post

`get` is the same as `match via: :get`.

    get 'photo/:id' => 'photos#show'
    # same as match 'photo/:id' => 'photos#show', via: :get

    post 'photo/:id' => 'photos#update'
    # same as match 'photo/:id' => 'photos#show', via: :post

### Redirection

    match '/stories' => redirect('/posts')
    match '/stories/:name' => redirect('/posts/%{name}')

### Named

    # logout_path
    match 'exit' => 'sessions#destroy', as: :logout
    
### Constraints

    match '/', constraints: { subdomain: 'admin' }

    # admin.site.com/admin/photos
    namespace 'admin' do
      constraints subdomain: 'admin' do
        resources :photos
      end
    end

### Custom constraints

    class BlacklistConstraint
      def initialize
        @ips = Blacklist.retrieve_ips
      end
     
      def matches?(request)
        @ips.include?(request.remote_ip)
      end
    end
     
    TwitterClone::Application.routes.draw do
      match "*path" => "blacklist#index",
        :constraints => BlacklistConstraint.new
    end

### Scopes

    scope 'admin', constraints: { subdomain: 'admin' } do
      resources ...
    end

### Rack middleware

    # Yes, Sprockets is middleware
    match '/application.js' => Sprockets

### Route helpers

    projects_path   # /projects
    projects_url    # http://site.com/projects


### Default help text

    # The priority is based upon order of creation:
    # first created -> highest priority.

    # Sample of regular route:
    match 'products/:id' => 'catalog#view'

    # Keep in mind you can assign values other than :controller and :action

    # Sample of named route:
    match 'products/:id/purchase' => 'catalog#purchase', :as => :purchase

    # This route can be invoked with purchase_url(:id => product.id)

    # Sample resource route (maps HTTP verbs to controller actions automatically):
    resources :products

    # Sample resource route with options:
    resources :products do
      member do
        get 'short'
        post 'toggle'
      end
    
      collection do
        get 'sold'
      end
    end

    # Sample resource route with sub-resources:
    resources :products do
      resources :comments, :sales
      resource :seller
    end

    # Sample resource route with more complex sub-resources
    resources :products do
      resources :comments
      resources :sales do
        get 'recent', :on => :collection
      end
    end

    # Sample resource route within a namespace:
    namespace :admin do
      # Directs /admin/products/* to Admin::ProductsController
      # (app/controllers/admin/products_controller.rb)
      resources :products
    end

    # You can have the root of your site routed with "root"
    # just remember to delete public/index.html.
    root :to => 'welcome#index'

    # See how all your routes lay out with "rake routes"

    # This is a legacy wild controller route that's not recommended for RESTful applications.
    # Note: This route will make all actions in every controller accessible via GET requests.
    match ':controller(/:action(/:id(.:format)))'

### References

 * [Guides/Routing](http://guides.rubyonrails.org/routing.html)

 * [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)
    (See included modules)


id: rails-plugins
git_filename: ./rails-plugins.md
format: md
field_title: Rails plugins
field_category: Rails
data:
{"title": "Rails plugins", "category": "Rails", "body": "### Generate a plugin\n\nGenerate a Rails Engine plugin:\n\n    rails plugin new myplugin --skip-bundle --full\n\nInitializers\n------------\n\n### Initializers\n\n* [Rails::Railtie](http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html)\n* [EngineYard blog \n  post](http://www.engineyard.com/blog/2010/extending-rails-3-with-railties/)\n\n### Initializer method\n\nSubclass Railtie and provide an `initializer` method.\n\n    module NewPlugin\n      class Railtie < Rails::Railtie\n        initializer \"newplugin.initialize\" do |app|\n     \n          # subscribe to all rails notifications: controllers, AR, etc.\n          ActiveSupport::Notifications.subscribe do |*args|\n            event = ActiveSupport::Notifications::Event.new(*args)\n            puts \"Got notification: #{event.inspect}\"\n          end\n     \n        end\n      end\n    end\n     \nCustom routes\n-------------\n\n### Custom routes\n\n* [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)\n\n### Creating routes\n\nTo create custom `routes.rb` keywords:\n\n    # # routes.rb:\n    # myplugin_for x\n    #\n    class ActionDispatch::Routing\n      class Mapper\n        def myplugin_for(*x)\n        end\n      end\n    end\n\nExample with a block:\n\n    # authenticated do\n    #   resources :users\n    # end\n    #\n    def authenticated\n      constraint = lambda { |request| request... }\n\n      constraints(constraint) { yield }\n    end\n\nCustom generators\n-----------------\n\n### Custom generators\n\n* [Guide: generators](http://guides.rubyonrails.org/generators.html)\n* [ActiveRecord::Generators::Base](http://api.rubyonrails.org/classes/ActiveRecord/Generators/Base.html)\n\n### Basic\n\n    # rails g initializer\n    # lib/generators/initializer_generator.rb\n    class InitializerGenerator < Rails::Generators::Base\n      def create_initializer_file\n        create_file \"config/initializers/initializer.rb\", \"# Add initialization content here\"\n      end\n    end\n\n * Extend `Rails::Generators::Base`.\n * Each public method in the generator is executed when a generator is invoked. \n\n### Generating a generator\n \n    $ rails generate generator initializer\n\n### NamedBase\n\nUse `NamedBase` instead if you want to take an argument. It will be available as \n`file_name`.\n\n    class InitializerGenerator < Rails::Generators::Base\n      def lol\n        puts file_name\n      end\n    end\n\n### More\n\n    class InitializerGenerator < Rails::Generators::NamedBase\n      # \n    \u00a0\u00a0source_root File.expand_path(\"../templates\", __FILE__)\n      desc \"Description goes here.\"\n    end\n\n### Generators lookup\n  \nWhen invoking `rails g XXX`:\n\n    [rails/]generators/XXX/XXX_generator.rb\n    [rails/]generators/XXX_generator.rb\n\nWhen invoking `rails g XXX:YYY`:\n\n    [rails/]generators/XXX/YYY_generator.rb\n\nActiveModel 'acts as'\n---------------------\n\n### acts as\n\n    # yaffle/lib/yaffle/acts_as_yaffle.rb\n    module Yaffle\n      module ActsAsYaffle\n        extend ActiveSupport::Concern\n     \n        included do\n        end\n     \n        module ClassMethods\n          def acts_as_yaffle(options = {})\n            # your code will go here\n          end\n        end\n      end\n    end\n     \n    ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle"}

field_body:
### Generate a plugin

Generate a Rails Engine plugin:

    rails plugin new myplugin --skip-bundle --full

Initializers
------------

### Initializers

* [Rails::Railtie](http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html)
* [EngineYard blog 
  post](http://www.engineyard.com/blog/2010/extending-rails-3-with-railties/)

### Initializer method

Subclass Railtie and provide an `initializer` method.

    module NewPlugin
      class Railtie < Rails::Railtie
        initializer "newplugin.initialize" do |app|
     
          # subscribe to all rails notifications: controllers, AR, etc.
          ActiveSupport::Notifications.subscribe do |*args|
            event = ActiveSupport::Notifications::Event.new(*args)
            puts "Got notification: #{event.inspect}"
          end
     
        end
      end
    end
     
Custom routes
-------------

### Custom routes

* [ActionDispatch::Routing::Mapper](http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper.html)

### Creating routes

To create custom `routes.rb` keywords:

    # # routes.rb:
    # myplugin_for x
    #
    class ActionDispatch::Routing
      class Mapper
        def myplugin_for(*x)
        end
      end
    end

Example with a block:

    # authenticated do
    #   resources :users
    # end
    #
    def authenticated
      constraint = lambda { |request| request... }

      constraints(constraint) { yield }
    end

Custom generators
-----------------

### Custom generators

* [Guide: generators](http://guides.rubyonrails.org/generators.html)
* [ActiveRecord::Generators::Base](http://api.rubyonrails.org/classes/ActiveRecord/Generators/Base.html)

### Basic

    # rails g initializer
    # lib/generators/initializer_generator.rb
    class InitializerGenerator < Rails::Generators::Base
      def create_initializer_file
        create_file "config/initializers/initializer.rb", "# Add initialization content here"
      end
    end

 * Extend `Rails::Generators::Base`.
 * Each public method in the generator is executed when a generator is invoked. 

### Generating a generator
 
    $ rails generate generator initializer

### NamedBase

Use `NamedBase` instead if you want to take an argument. It will be available as 
`file_name`.

    class InitializerGenerator < Rails::Generators::Base
      def lol
        puts file_name
      end
    end

### More

    class InitializerGenerator < Rails::Generators::NamedBase
      # 
      source_root File.expand_path("../templates", __FILE__)
      desc "Description goes here."
    end

### Generators lookup
  
When invoking `rails g XXX`:

    [rails/]generators/XXX/XXX_generator.rb
    [rails/]generators/XXX_generator.rb

When invoking `rails g XXX:YYY`:

    [rails/]generators/XXX/YYY_generator.rb

ActiveModel 'acts as'
---------------------

### acts as

    # yaffle/lib/yaffle/acts_as_yaffle.rb
    module Yaffle
      module ActsAsYaffle
        extend ActiveSupport::Concern
     
        included do
        end
     
        module ClassMethods
          def acts_as_yaffle(options = {})
            # your code will go here
          end
        end
      end
    end
     
    ActiveRecord::Base.send :include, Yaffle::ActsAsYaffle


id: rails-models
git_filename: ./rails-models.md
format: md
field_title: Rails models
field_category: Rails
data:
{"title": "Rails models", "category": "Rails", "body": "Generating\n----------\n\n### Generating\n\n    $ rails g model User\n\nUsing models\n------------\n\n### Query methods\n\n```ruby\nitems = Model\n  .where(first_name: 'Harvey')\n  .where('id = 3')\n  .where('id = ?', 3)\n```\n\n```ruby\n  .order(:title)\n  .order(title: :desc)\n  .order(\"title DESC\")\n```\n\n```ruby\n  .reorder(:title)  # discards other .order's\n  .rewhere(...)     # discards other .where's\n```\n\n```ruby\n  .limit(2)\n  .offset(1)\n  .uniq\n```\n\nSee: [QueryMethods](http://devdocs.io/rails/activerecord/querymethods)\n\n### Advanced query methods\n\n```ruby\nitems = Model\n  .select(:id)\n  .select([:id, :name])\n```\n\n```ruby\n  .group(:name)   # GROUP BY name\n  .group('name AS grouped_name, age')\n  .having('SUM(price) > 30')  # needs to be chained with .group\n```\n\n```ruby\n  .includes(:user)\n  .includes(user: [:articles])\n```\n\n```ruby\n  .references(:posts)\n  # aka: .where(\"posts.name = 'foo'\").references(:posts)\n```\n\n### Finder methods\n\n```ruby\nitem = Model.find(id)\nitem = Model.find_by_email(email)\nitem = Model.where(email: email).first\n```\n\n```ruby\nModel\n  .exists?(5)\n  .exists?(name: \"David\")\n```\n\n```ruby\n  .first\n  .last\n  .find_nth(4, [offset])\n```\n\nSee: [FinderMethods](http://devdocs.io/rails/activerecord/findermethods)\n\n### Persistence\n\n```ruby\nitem.new_record?\nitem.persisted?\nitem.destroyed?\n\nitem.serialize_hash\n```\n\n```ruby\nitem.save\nitem.save!      # Same as above, but raises an Exception\n```\n\n```ruby\nitem.update  name: 'John'  # Saves immediately\nitem.update! name: 'John'\n```\n\n```ruby\nitem.update_column  :name, 'John'  # skips validations and callbacks\nitem.update_columns  name: 'John'\nitem.update_columns! name: 'John'\n```\n\n```ruby\nitem.touch                 # updates :updated_at\nitem.touch :published_at\n```\n\n```ruby\nitem.destroy\nitem.delete  # skips callbacks\n```\n\n```ruby\nModel.create     # Same an #new then #save\nModel.create!    # Same as above, but raises an Exception\n```\n\nSee: [Persistence](http://devdocs.io/rails/activerecord/persistence)\n\n### Attribute Assignment\n\n```ruby\nitem.attributes                      # #<Hash>\n```\n\n```ruby\nitem.attributes = { name: 'John' }   # Merges attributes in. Doesn't save.\nitem.assign_attributes name: 'John'  # Same as above\n```\n\nSee: [AttributeAssignment](http://devdocs.io/rails/activerecord/attributeassignment)\n\n### Dirty\n\n```ruby\nitem.changed?\nitem.changed             # ['name']\nitem.changed_attributes  # { 'name' => 'Bob' } - original values\nitem.changes             # { 'name' => ['Bob', 'Robert'] }\nitem.previous_changes    # available after #save\nitem.restore_attributes\n```\n\n```ruby\nitem.name = 'Robert'\nitem.name_was         # 'Bob'\nitem.name_change      # [ 'Bob', 'Robert' ]\nitem.name_changed?    # true\nitem.name_changed?(from: 'Bob', to: 'Robert')\n```\n\nSee: [Dirty](http://devdocs.io/rails/activemodel/dirty)\n\n### Validations\n\n```ruby\nitem.valid?\nitem.invalid?\n```\n\nSee: [Validations](http://devdocs.io/rails/activerecord/validations)\n\n### Calculations\n\n```ruby\nPerson.count\nPerson.count(:age)    # counts non-nil's\n```\n\n```ruby\nPerson.average(:age)\nPerson.maximum(:age)\nPerson.minimum(:age)\nPerson.sum('2 * age')\n```\n\n```ruby\nPerson.calculate(:count, :all)\n```\n\nAdvanced:\n\n```ruby\nPerson.distinct.count\nPerson.group(:city).count\n```\n\nSee: [Calculations](http://devdocs.io/rails/activerecord/calculations)\n\n### Dynamic attribute-based finders\n\nGiven a field called `name`:\n{: .-setup}\n\n```ruby\n# Returns one record\nPerson.find_by_name(name)\nPerson.find_last_by_name(name)\nPerson.find_or_create_by_name(name)\nPerson.find_or_initialize_by_name(name)\n```\n\n```ruby\n# Returns a list of records\nPerson.find_all_by_name(name)\n```\n\n```ruby\n# Add a bang to make it raise an exception\nPerson.find_by_name!(name)\n```\n\n```ruby\n# You may use `scoped` instead of `find`\nPerson.scoped_by_user_name\n```\n\nAssociations\n------------\n\n### Associations\n\n- `belongs_to`\n- `has_one`\n- `has_many`\n- `has_many :through`\n- `has_one :through`\n- `has_and_belongs_to_many`\n\n### Has many\n\n```ruby\nbelongs_to :parent, :foreign_key => 'parent_id' class_name: 'Folder'\nhas_many :folders, :foreign_key => 'parent_id', class_name: 'Folder'\n\nhas_many :comments,                -> { order('posted_on DESC') }\nhas_many :comments,    :include    => :author\nhas_many :people,      :class_name => \"Person\"\nhas_many :people,      :conditions => \"deleted = 0\"\nhas_many :tracks,                  -> { order(:position) }\nhas_many :comments,    :dependent  => :nullify\nhas_many :comments,    :dependent  => :destroy\nhas_many :tags,        :as         => :taggable\nhas_many :reports,     :readonly   => true\nhas_many :subscribers, :through    => :subscriptions, class_name: \"User\", :source => :user\nhas_many :subscribers, :finder_sql =>\n    'SELECT DISTINCT people.* ' +\n    'FROM people p, post_subscriptions ps ' +\n    'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +\n    'ORDER BY p.first_name'\n```\n\n### belongs to\n\n```ruby\nbelongs_to :author,\n  :dependent      => :destroy    # or :delete\n\n  :class_name     => \"Person\"\n  :select         => \"*\"\n  :counter_cache  => true\n  :counter_cache  => :custom_counter\n  :include        => \"Book\"\n  :readonly       => true\n\n  :conditions     => 'published = true'\n\n  :touch          => true\n  :touch          => :authors_last_updated_at\n\n  :primary_key    => \"name\"\n  :foreign_key    => \"author_name\"\n```\n\n### Many-to-many\n\nIf you have a join model:\n{: .-setup}\n\n```ruby\nclass Programmer < ActiveRecord::Base\n  has_many :assignments\n  has_many :projects, :through => :assignments\nend\n```\n{: data-line=\"2,3\"}\n\n```ruby\nclass Project < ActiveRecord::Base\n  has_many :assignments\n  has_many :programmers, :through => :assignments\nend\n```\n{: data-line=\"2,3\"}\n\n```ruby\nclass Assignment\n  belongs_to :project\n  belongs_to :programmer\nend\n```\n{: data-line=\"2,3\"}\n\n### Many-to-many (HABTM)\n\n```ruby\nhas_and_belongs_to_many :projects\nhas_and_belongs_to_many :projects, :include => [ :milestones, :manager ]\nhas_and_belongs_to_many :nations, :class_name => \"Country\"\nhas_and_belongs_to_many :categories, :join_table => \"prods_cats\"\nhas_and_belongs_to_many :categories, :readonly => true\nhas_and_belongs_to_many :active_projects, :join_table => 'developers_projects', :delete_sql =>\n\"DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}\"\n```\n\n### Polymorphic associations\n\n```ruby\nclass Post\n  has_many :attachments, as: :parent\nend\n```\n{: data-line=\"2\"}\n\n```ruby\nclass Image\n  belongs_to :parent, polymorphic: true\nend\n```\n{: data-line=\"2\"}\n\nAnd in migrations:\n\n```ruby\ncreate_table :images do |t|\n  t.references :post, polymorphic: true\nend\n```\n{: data-line=\"2\"}\n\nValidation\n----------\n\n### Validation\n\n```ruby\nclass Person < ActiveRecord::Base\n```\n{:.-setup}\n\n```ruby\n  # Presence\n  validates :name,     presence: true\n```\n{: data-line=\"2\"}\n\n```ruby\n  # Acceptance\n  validates :terms,    acceptance: true\n```\n\n```ruby\n  # Confirm\n  validates :email,    confirmation: true\n```\n\n```ruby\n  # Unique\n  validates :slug,     uniqueness: true\n  validates :slug,     uniqueness: { case_sensitive: false }\n  validates :holiday,  uniqueness: { scope: :year, message: 'yearly only' }\n```\n\n```ruby\n  # Format\n  validates :code,     format: /regex/\n  validates :code,     format: { with: /regex/ }\n```\n\n```ruby\n  # Length\n  validates :name,     length: { minimum: 2 }\n  validates :bio,      length: { maximum: 500 }\n  validates :password, length: { in: => 6..20 }\n  validates :number,   length: { is: => 6 }\n```\n\n```ruby\n  # Include/exclude\n  validates :gender,   inclusion: %w(male female)\n  validates :gender,   inclusion: { in: %w(male female) }\n  validates :lol,      exclusion: %w(xyz)\n```\n\n```ruby\n  # Numeric\n  validates :points,   numericality: true\n  validates :played,   numericality: { only_integer: true }\n  # ... greater_than, greater_than_or_equal_to,\n  # ... less_than, less_than_or_equal_to\n  # ... odd, even, equal_to\n```\n\n```ruby\n  # Validate the associated records to ensure they're valid as well\n  has_many :books\n  validates_associated :books\n```\n\n```ruby\n  # Length (full options)\n  validates :content, length: {\n    minimum:   300,\n    maximum:   400,\n    tokenizer: lambda { |str| str.scan(/\\w+/) },\n    too_short: \"must have at least %{count} words\",\n    too_long:  \"must have at most %{count} words\" }\n```\n\n```ruby\n  # Multiple\n  validates :login, :email, presence: true\n```\n\n```ruby\n  # Conditional\n  validates :description, presence: true, if: :published?\n  validates :description, presence: true, if: lambda { |obj| .. }\n```\n\n```ruby\n  validates :title, presence: true, on: :save   # :save | :create | :update\n```\n\n```ruby\nend\n```\n{: .-setup}\n\n### Custom validations\n\n```ruby\nclass Person < ActiveRecord::Base\n  validate :foo_cant_be_nil\n\n  def foo_cant_be_nil\n    errors.add(:foo, 'cant be nil')  if foo.nil?\n  end\nend\n```\n{: data-line=\"2\"}\n\n### Errors\n\n```ruby\nrecord.errors.valid?      # \u2192 false\nrecord.errors             # \u2192 { :name => [\"can't be blank\"] }\nrecord.errors.messages    # \u2192 { :name => [\"can't be blank\"] }\n```\n\n```ruby\nrecord.errors[:name].any?\n```\n\nOther API\n---------\n\n### Callbacks\n\n * [Guides: callbacks](http://guides.rubyonrails.org/active_record_validations_callbacks.html)\n\n### Mass updates\n\n ```ruby\n# Updates person id 15\nPerson.update 15, name: \"John\", age: 24\nPerson.update [1,2], [{name: \"John\"}, {name: \"foo\"}]\n```\n\n### Joining\n\n```ruby\n# Basic joins\nStudent.joins(:schools).where(schools: { type: 'public' })\nStudent.joins(:schools).where('schools.type' => 'public' )\n```\n\n```ruby\n# Multiple associations\nArticle.joins(:category, :comments)\n```\n\n```ruby\n# Nested associations\nArticle.joins(comments: :guest)\n```\n\n```ruby\n# SQL\nAuthor.joins(\n  'INNER JOIN posts ' +\n  'ON posts.author_id = authors.id ' +\n  'AND posts.published = \"t\"'\n)\n```\n\n### Where interpolation\n\n```ruby\nwhere('name = ?', 'John')\nwhere(['name = :name', { name: 'John' }])\n```\n\n### Serialize\n\n```ruby\nclass User < ActiveRecord::Base\n  serialize :preferences\nend\n```\n{: data-line=\"2\"}\n\n```ruby\nuser = User.create(\n  preferences: {\n    'background' => 'black',\n    'display' => 'large'\n  }\n)\n```\n\nYou can also specify a class option as the second parameter that\u2019ll raise an \nexception if a serialized object is retrieved as a descendant of a class not in \nthe hierarchy.\n\n```ruby\n# Only Hash allowed!\nclass User < ActiveRecord::Base\n  serialize :preferences, Hash\nend\n```\n{: data-line=\"3\"}\n\n```ruby\n# Reading it raises SerializationTypeMismatch\nuser = User.create(preferences: %w(one two three))\nUser.find(user.id).preferences\n```\n\nOther tricks\n------------\n\n### Overriding accessors\n\n```ruby\nclass Song < ActiveRecord::Base\n  # Uses an integer of seconds to hold the length of the song\n\n  def length=(minutes)\n    write_attribute(:length, minutes.to_i * 60)\n  end\n\n  def length\n    read_attribute(:length) / 60\n  end\nend\n```\n{: data-line=\"4,8\"}\n\nSee: <http://api.rubyonrails.org/classes/ActiveRecord/Base.html>\n\nCallbacks\n---------\n\n- after_initialize\n- before_validation / after_validation\n- before_save / after_save / around_save\n- before_create / after_create / around_create\n- before_update / after_update / around_update\n- before_destroy / after_destroy / around_destroy\n- after_commit\n- after_rollback\n\nSee: [ActiveRecord Callbacks](https://guides.rubyonrails.org/active_record_callbacks.html)"}

field_body:
Generating
----------

### Generating

    $ rails g model User

Using models
------------

### Query methods

```ruby
items = Model
  .where(first_name: 'Harvey')
  .where('id = 3')
  .where('id = ?', 3)
```

```ruby
  .order(:title)
  .order(title: :desc)
  .order("title DESC")
```

```ruby
  .reorder(:title)  # discards other .order's
  .rewhere(...)     # discards other .where's
```

```ruby
  .limit(2)
  .offset(1)
  .uniq
```

See: [QueryMethods](http://devdocs.io/rails/activerecord/querymethods)

### Advanced query methods

```ruby
items = Model
  .select(:id)
  .select([:id, :name])
```

```ruby
  .group(:name)   # GROUP BY name
  .group('name AS grouped_name, age')
  .having('SUM(price) > 30')  # needs to be chained with .group
```

```ruby
  .includes(:user)
  .includes(user: [:articles])
```

```ruby
  .references(:posts)
  # aka: .where("posts.name = 'foo'").references(:posts)
```

### Finder methods

```ruby
item = Model.find(id)
item = Model.find_by_email(email)
item = Model.where(email: email).first
```

```ruby
Model
  .exists?(5)
  .exists?(name: "David")
```

```ruby
  .first
  .last
  .find_nth(4, [offset])
```

See: [FinderMethods](http://devdocs.io/rails/activerecord/findermethods)

### Persistence

```ruby
item.new_record?
item.persisted?
item.destroyed?

item.serialize_hash
```

```ruby
item.save
item.save!      # Same as above, but raises an Exception
```

```ruby
item.update  name: 'John'  # Saves immediately
item.update! name: 'John'
```

```ruby
item.update_column  :name, 'John'  # skips validations and callbacks
item.update_columns  name: 'John'
item.update_columns! name: 'John'
```

```ruby
item.touch                 # updates :updated_at
item.touch :published_at
```

```ruby
item.destroy
item.delete  # skips callbacks
```

```ruby
Model.create     # Same an #new then #save
Model.create!    # Same as above, but raises an Exception
```

See: [Persistence](http://devdocs.io/rails/activerecord/persistence)

### Attribute Assignment

```ruby
item.attributes                      # #<Hash>
```

```ruby
item.attributes = { name: 'John' }   # Merges attributes in. Doesn't save.
item.assign_attributes name: 'John'  # Same as above
```

See: [AttributeAssignment](http://devdocs.io/rails/activerecord/attributeassignment)

### Dirty

```ruby
item.changed?
item.changed             # ['name']
item.changed_attributes  # { 'name' => 'Bob' } - original values
item.changes             # { 'name' => ['Bob', 'Robert'] }
item.previous_changes    # available after #save
item.restore_attributes
```

```ruby
item.name = 'Robert'
item.name_was         # 'Bob'
item.name_change      # [ 'Bob', 'Robert' ]
item.name_changed?    # true
item.name_changed?(from: 'Bob', to: 'Robert')
```

See: [Dirty](http://devdocs.io/rails/activemodel/dirty)

### Validations

```ruby
item.valid?
item.invalid?
```

See: [Validations](http://devdocs.io/rails/activerecord/validations)

### Calculations

```ruby
Person.count
Person.count(:age)    # counts non-nil's
```

```ruby
Person.average(:age)
Person.maximum(:age)
Person.minimum(:age)
Person.sum('2 * age')
```

```ruby
Person.calculate(:count, :all)
```

Advanced:

```ruby
Person.distinct.count
Person.group(:city).count
```

See: [Calculations](http://devdocs.io/rails/activerecord/calculations)

### Dynamic attribute-based finders

Given a field called `name`:
{: .-setup}

```ruby
# Returns one record
Person.find_by_name(name)
Person.find_last_by_name(name)
Person.find_or_create_by_name(name)
Person.find_or_initialize_by_name(name)
```

```ruby
# Returns a list of records
Person.find_all_by_name(name)
```

```ruby
# Add a bang to make it raise an exception
Person.find_by_name!(name)
```

```ruby
# You may use `scoped` instead of `find`
Person.scoped_by_user_name
```

Associations
------------

### Associations

- `belongs_to`
- `has_one`
- `has_many`
- `has_many :through`
- `has_one :through`
- `has_and_belongs_to_many`

### Has many

```ruby
belongs_to :parent, :foreign_key => 'parent_id' class_name: 'Folder'
has_many :folders, :foreign_key => 'parent_id', class_name: 'Folder'

has_many :comments,                -> { order('posted_on DESC') }
has_many :comments,    :include    => :author
has_many :people,      :class_name => "Person"
has_many :people,      :conditions => "deleted = 0"
has_many :tracks,                  -> { order(:position) }
has_many :comments,    :dependent  => :nullify
has_many :comments,    :dependent  => :destroy
has_many :tags,        :as         => :taggable
has_many :reports,     :readonly   => true
has_many :subscribers, :through    => :subscriptions, class_name: "User", :source => :user
has_many :subscribers, :finder_sql =>
    'SELECT DISTINCT people.* ' +
    'FROM people p, post_subscriptions ps ' +
    'WHERE ps.post_id = #{id} AND ps.person_id = p.id ' +
    'ORDER BY p.first_name'
```

### belongs to

```ruby
belongs_to :author,
  :dependent      => :destroy    # or :delete

  :class_name     => "Person"
  :select         => "*"
  :counter_cache  => true
  :counter_cache  => :custom_counter
  :include        => "Book"
  :readonly       => true

  :conditions     => 'published = true'

  :touch          => true
  :touch          => :authors_last_updated_at

  :primary_key    => "name"
  :foreign_key    => "author_name"
```

### Many-to-many

If you have a join model:
{: .-setup}

```ruby
class Programmer < ActiveRecord::Base
  has_many :assignments
  has_many :projects, :through => :assignments
end
```
{: data-line="2,3"}

```ruby
class Project < ActiveRecord::Base
  has_many :assignments
  has_many :programmers, :through => :assignments
end
```
{: data-line="2,3"}

```ruby
class Assignment
  belongs_to :project
  belongs_to :programmer
end
```
{: data-line="2,3"}

### Many-to-many (HABTM)

```ruby
has_and_belongs_to_many :projects
has_and_belongs_to_many :projects, :include => [ :milestones, :manager ]
has_and_belongs_to_many :nations, :class_name => "Country"
has_and_belongs_to_many :categories, :join_table => "prods_cats"
has_and_belongs_to_many :categories, :readonly => true
has_and_belongs_to_many :active_projects, :join_table => 'developers_projects', :delete_sql =>
"DELETE FROM developers_projects WHERE active=1 AND developer_id = #{id} AND project_id = #{record.id}"
```

### Polymorphic associations

```ruby
class Post
  has_many :attachments, as: :parent
end
```
{: data-line="2"}

```ruby
class Image
  belongs_to :parent, polymorphic: true
end
```
{: data-line="2"}

And in migrations:

```ruby
create_table :images do |t|
  t.references :post, polymorphic: true
end
```
{: data-line="2"}

Validation
----------

### Validation

```ruby
class Person < ActiveRecord::Base
```
{:.-setup}

```ruby
  # Presence
  validates :name,     presence: true
```
{: data-line="2"}

```ruby
  # Acceptance
  validates :terms,    acceptance: true
```

```ruby
  # Confirm
  validates :email,    confirmation: true
```

```ruby
  # Unique
  validates :slug,     uniqueness: true
  validates :slug,     uniqueness: { case_sensitive: false }
  validates :holiday,  uniqueness: { scope: :year, message: 'yearly only' }
```

```ruby
  # Format
  validates :code,     format: /regex/
  validates :code,     format: { with: /regex/ }
```

```ruby
  # Length
  validates :name,     length: { minimum: 2 }
  validates :bio,      length: { maximum: 500 }
  validates :password, length: { in: => 6..20 }
  validates :number,   length: { is: => 6 }
```

```ruby
  # Include/exclude
  validates :gender,   inclusion: %w(male female)
  validates :gender,   inclusion: { in: %w(male female) }
  validates :lol,      exclusion: %w(xyz)
```

```ruby
  # Numeric
  validates :points,   numericality: true
  validates :played,   numericality: { only_integer: true }
  # ... greater_than, greater_than_or_equal_to,
  # ... less_than, less_than_or_equal_to
  # ... odd, even, equal_to
```

```ruby
  # Validate the associated records to ensure they're valid as well
  has_many :books
  validates_associated :books
```

```ruby
  # Length (full options)
  validates :content, length: {
    minimum:   300,
    maximum:   400,
    tokenizer: lambda { |str| str.scan(/\w+/) },
    too_short: "must have at least %{count} words",
    too_long:  "must have at most %{count} words" }
```

```ruby
  # Multiple
  validates :login, :email, presence: true
```

```ruby
  # Conditional
  validates :description, presence: true, if: :published?
  validates :description, presence: true, if: lambda { |obj| .. }
```

```ruby
  validates :title, presence: true, on: :save   # :save | :create | :update
```

```ruby
end
```
{: .-setup}

### Custom validations

```ruby
class Person < ActiveRecord::Base
  validate :foo_cant_be_nil

  def foo_cant_be_nil
    errors.add(:foo, 'cant be nil')  if foo.nil?
  end
end
```
{: data-line="2"}

### Errors

```ruby
record.errors.valid?      # → false
record.errors             # → { :name => ["can't be blank"] }
record.errors.messages    # → { :name => ["can't be blank"] }
```

```ruby
record.errors[:name].any?
```

Other API
---------

### Callbacks

 * [Guides: callbacks](http://guides.rubyonrails.org/active_record_validations_callbacks.html)

### Mass updates

 ```ruby
# Updates person id 15
Person.update 15, name: "John", age: 24
Person.update [1,2], [{name: "John"}, {name: "foo"}]
```

### Joining

```ruby
# Basic joins
Student.joins(:schools).where(schools: { type: 'public' })
Student.joins(:schools).where('schools.type' => 'public' )
```

```ruby
# Multiple associations
Article.joins(:category, :comments)
```

```ruby
# Nested associations
Article.joins(comments: :guest)
```

```ruby
# SQL
Author.joins(
  'INNER JOIN posts ' +
  'ON posts.author_id = authors.id ' +
  'AND posts.published = "t"'
)
```

### Where interpolation

```ruby
where('name = ?', 'John')
where(['name = :name', { name: 'John' }])
```

### Serialize

```ruby
class User < ActiveRecord::Base
  serialize :preferences
end
```
{: data-line="2"}

```ruby
user = User.create(
  preferences: {
    'background' => 'black',
    'display' => 'large'
  }
)
```

You can also specify a class option as the second parameter that’ll raise an 
exception if a serialized object is retrieved as a descendant of a class not in 
the hierarchy.

```ruby
# Only Hash allowed!
class User < ActiveRecord::Base
  serialize :preferences, Hash
end
```
{: data-line="3"}

```ruby
# Reading it raises SerializationTypeMismatch
user = User.create(preferences: %w(one two three))
User.find(user.id).preferences
```

Other tricks
------------

### Overriding accessors

```ruby
class Song < ActiveRecord::Base
  # Uses an integer of seconds to hold the length of the song

  def length=(minutes)
    write_attribute(:length, minutes.to_i * 60)
  end

  def length
    read_attribute(:length) / 60
  end
end
```
{: data-line="4,8"}

See: <http://api.rubyonrails.org/classes/ActiveRecord/Base.html>

Callbacks
---------

- after_initialize
- before_validation / after_validation
- before_save / after_save / around_save
- before_create / after_create / around_create
- before_update / after_update / around_update
- before_destroy / after_destroy / around_destroy
- after_commit
- after_rollback

See: [ActiveRecord Callbacks](https://guides.rubyonrails.org/active_record_callbacks.html)


id: rails-migrations
git_filename: ./rails-migrations.md
format: md
field_title: Rails migrations
field_category: Rails
data:
{"title": "Rails migrations", "category": "Rails", "body": "### Automatically make migrations\n\n    $ rails generate migration RemovePartNumberFromProducts part_number:string\n    $ rails generate migration remove_part_number_from_products part_number # rails assumes string if not type given - and you can use snake_case\n    \n    $ rails generate migration AddNameToWidgets name:string\n    $ rails g migration add_name_to_widgets name:string # you can use the short cut 'g' instead of generate - they both do the same thing\n\n### Run migrations\n\n    $ rake db:migrate\n\n### Creating tables\n\n    create_table :users do |t|\n      t.string :name\n      t.text   :description\n\n      t.primary_key :id\n      t.string      :title\n      t.text        :description\n      t.integer     :games_count\n      t.float       :lol\n      t.decimal     :price\n      t.decimal     :price, :precision => 2, :scale => 10\n      t.datetime    :expiration\n      t.timestamp   :time_in\n      t.time        :time_in\n      t.date        :expiry\n      t.binary      :image_data\n      t.boolean     :is_admin\n    end\n\n    # Options:\n      :null (boolean)\n      :limit (integer)\n      :default\n\n### Operations\n\n    add_column    :users, :first_name, :string\n    remove_column :users, :first_name, :string\n\n    change_column :users, :first_name, :text\n\n    change_column_default :users, :admin, nil\n    change_column_null    :users, :email, false # adds NOT NULL constraint\n\n    create_table\n    change_table\n    drop_table\n\n    add_column\n    change_column\n    rename_column\n    remove_column\n\n    add_index\n    remove_index\n\n### Use models\n\n    class AddFlagToProduct < ActiveRecord::Migration\n      class Product < ActiveRecord::Base\n      end\n     \n      def change\n        add_column :products, :flag, :boolean\n        Product.reset_column_information\n        reversible do |dir|\n          dir.up { Product.update_all flag: false }\n        end\n      end\n    end\n\n### Associations\n    \n    t.references :category   # kinda same as t.integer :category_id\n\n    # Can have different types\n    t.references :category, polymorphic: true\n\n### Auto-Add/remove columns\n  \n    $ rails generate migration RemovePartNumberFromProducts part_number:string\n\n### Indices\n\n    # Simple\n    add_index :suppliers, :name\n\n    # Unique\n    add_index :accounts, [:branch_id, :party_id], :unique => true\n\n    # Named (:name => ...)\n    add_index :accounts, [:branch_id, :party_id], :unique => true, :name => \"by_branch_party\"\n\n    # Length\n    add_index :accounts, :name, :name => \u2018by_name\u2019, :length => 10\n    add_index :accounts, [:name, :surname], :name => \u2018by_name_surname\u2019,\n      :length => {\n        :name => 10,\n        :surname => 15\n      }\n\n    # Sort order (no MySQL support)\n    add_index :accounts, [:branch_id, :party_id, :surname],\n      :order => {:branch_id => :desc, :part_id => :asc}\n\n### In console\nUse `ActiveRecord::Migration`.\n\n    ActiveRecord::Migration.add_index :posts, :slug\n\n### References\n\n * https://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index"}

field_body:
### Automatically make migrations

    $ rails generate migration RemovePartNumberFromProducts part_number:string
    $ rails generate migration remove_part_number_from_products part_number # rails assumes string if not type given - and you can use snake_case
    
    $ rails generate migration AddNameToWidgets name:string
    $ rails g migration add_name_to_widgets name:string # you can use the short cut 'g' instead of generate - they both do the same thing

### Run migrations

    $ rake db:migrate

### Creating tables

    create_table :users do |t|
      t.string :name
      t.text   :description

      t.primary_key :id
      t.string      :title
      t.text        :description
      t.integer     :games_count
      t.float       :lol
      t.decimal     :price
      t.decimal     :price, :precision => 2, :scale => 10
      t.datetime    :expiration
      t.timestamp   :time_in
      t.time        :time_in
      t.date        :expiry
      t.binary      :image_data
      t.boolean     :is_admin
    end

    # Options:
      :null (boolean)
      :limit (integer)
      :default

### Operations

    add_column    :users, :first_name, :string
    remove_column :users, :first_name, :string

    change_column :users, :first_name, :text

    change_column_default :users, :admin, nil
    change_column_null    :users, :email, false # adds NOT NULL constraint

    create_table
    change_table
    drop_table

    add_column
    change_column
    rename_column
    remove_column

    add_index
    remove_index

### Use models

    class AddFlagToProduct < ActiveRecord::Migration
      class Product < ActiveRecord::Base
      end
     
      def change
        add_column :products, :flag, :boolean
        Product.reset_column_information
        reversible do |dir|
          dir.up { Product.update_all flag: false }
        end
      end
    end

### Associations
    
    t.references :category   # kinda same as t.integer :category_id

    # Can have different types
    t.references :category, polymorphic: true

### Auto-Add/remove columns
  
    $ rails generate migration RemovePartNumberFromProducts part_number:string

### Indices

    # Simple
    add_index :suppliers, :name

    # Unique
    add_index :accounts, [:branch_id, :party_id], :unique => true

    # Named (:name => ...)
    add_index :accounts, [:branch_id, :party_id], :unique => true, :name => "by_branch_party"

    # Length
    add_index :accounts, :name, :name => ‘by_name’, :length => 10
    add_index :accounts, [:name, :surname], :name => ‘by_name_surname’,
      :length => {
        :name => 10,
        :surname => 15
      }

    # Sort order (no MySQL support)
    add_index :accounts, [:branch_id, :party_id, :surname],
      :order => {:branch_id => :desc, :part_id => :asc}

### In console
Use `ActiveRecord::Migration`.

    ActiveRecord::Migration.add_index :posts, :slug

### References

 * https://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index


id: rails-i18n
git_filename: ./rails-i18n.md
format: md
field_title: Rails i18n
field_category: Rails
data:
{"title": "Rails i18n", "category": "Rails", "body": "### References\n\n * <http://guides.rubyonrails.org/i18n.html>\n * <http://rails-i18n.org/wiki>\n * <https://github.com/svenfuchs/i18n>\n * <https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml>\n\n### Example\n\n```rb\nt('my.messages.hello')\n\n# same as 'my.messages.hello'\nt(:hello, scope: 'my.messages')\nt(:hello, scope: [:my, :messages])\n\nt('my.messages.hello', default: \"Hello\")\n```\n\n#### YAML\n\n```yml\nen:\n  my:\n    messages:\n      hello: \"Hello\"\n```\n\n### Interpolation\n\n```rb\nt('hello', name: \"John\")\n```\n\n#### YAML\n\n```yml\nhello: \"Hello %{name}\"\n```\n\n### Lazy lookup\n\n```rb\n# from the 'books/index' view\nt('.title')\n```\n\n#### YAML\n\n```yml\nen:\n  books:\n    index:\n      title: \"T\u00edtulo\"\n```\n\n### Plural\n\n```rb\nt(:inbox, count: 1)  #=> 'one message'\nt(:inbox, count: 2)  #=> '2 messages'\n```\n\n#### YAML\n\n```yml\ninbox:\n  one: 'one message',\n  other: '%{count} messages'\n```\n\n## Localizing\n\n### Time\n\n```rb\nl(Time.now)\nl(Time.now, format: :short)\n```\n\n#### YAML\n\n```yml\nen:\n  time:\n    formats:\n      default: \"%a, %d %b %Y %H:%M:%S %z\"\n      long: \"%B %d, %Y %H:%M\"\n      short: \"%d %b %H:%M\"\n```\n\n### Date\n\n```rb\nl(Date.today)\n```\n\n#### YAML\n\n```yml\nen:\n  date:\n    formats:\n      default: \"%Y-%m-%d\" # 2015-06-25\n      long: \"%B %d, %Y\"   # June 25, 2015\n      short: \"%b %d\"      # Jun 25\n```\n\n## ActiveRecord\n\n### Model names\n\n```rb\nUser.model_name.human            #=> \"User\"\nChild.model_name.human(count: 2) #=> \"Children\"\n```\n\n#### YAML\n\n```yml\nen:\n  activerecord:\n    models:\n      user: \"User\"\n      child:\n        one: \"Child\"\n        other: \"Children\"\n```\n\n### Attributes\n\n```rb\nUser.human_attribute_for :name   #=> \"Name\"\n```\n\n#### YAML\n\n```yml\nen:\n  activerecord:\n    attributes:\n      user:\n        # activerecord.attributes.<model>.<field>\n        name: \"Name\"\n        email: \"Email\"\n```\n\n### Error messages\n\n```rb\nerror_messages_for(...)\n```\n\n#### YAML\n\n```yml\nactiverecord:\n  errors:\n    models:\n      venue:\n        attributes:\n          name:\n            blank: \"Please enter a name.\"\n```\n\n### Scopes\n\nPossible scopes (in order):\n\n```yml\nactiverecord.errors.models.[model_name].attributes.[attribute_name].[error]\nactiverecord.errors.models.[model_name].[error]\nactiverecord.errors.messages.[error]\nerrors.attributes.[attribute_name].[error]\nerrors.messages.[error]\n```\n\nWhere `[error]` can be:\n\n```yml\nvalidates\n  confirmation - :confirmation\n  acceptance   - :accepted\n  presence     - :blank\n  length       - :too_short (%{count})\n  length       - :too_long (%{count})\n  length       - :wrong_length (%{count})\n  uniqueness   - :taken\n  format       - :invalid\n  numericality - :not_a_number\n```\n\n### Form labels\n\n```rb\nform_for @post do\n  f.label :body\n```\n\n#### YAML\n\n```yml\nhelpers:\n  # helpers.label.<model>.<field>\n  label:\n    post:\n      body: \"Your body text\"\n```\n\n### Submit buttons\n\n```rb\nform_for @post do\n  f.submit\n```\n\n#### YAML\n\n```yml\nhelpers:\n  submit:\n    # helpers.submit.<action>\n    create: \"Create a %{model}\"\n    update: \"Confirm changes to %{model}\"\n\n    # helpers.submit.<model>.<action>\n    article:\n      create: \"Publish article\"\n      update: \"Update article\"\n```\n \n\n## Numbers\n\n```rb\nnumber_to_delimited(2000)             #=> \"2,000\"\nnumber_to_currency(12.3)              #=> \"$12.30\"\nnumber_to_percentage(0.3)             #=> \"30%\"\nnumber_to_rounded(3.14, precision: 0) #=> \"3\"\nnumber_to_human(12_000)               #=> \"12 Thousand\"\nnumber_to_human_size(12345)           #=> \"12.3 kb\"\n```\n\n### Delimited\n\n```rb\nnumber_to_delimited(n)\n```\n\n#### YAML\n\n```yml\nnumber:\n  format:\n    separator: '.'\n    delimiter: ','\n    precision: 3\n    significant: false\n    strip_insignificant_zeroes: false\n```\n\n### Currencies\n\n```rb\nnumber_to_currency(n)\n```\n{:.light}\n\n```yml\nnumber:\n  currency:\n    format:\n      format: \"%u%n\" # %u = unit, %n = number\n      unit: \"$\"\n      separator: '.'\n      delimiter: ','\n      precision: 3\n      # (see number.format)\n```\n\n### Percentage\n\n```rb\nnumber_to_percentage(n)\n```\n\n#### YAML\n\n```yml\nnumber:\n  percentage:\n    format:\n      format: \"%n%\"\n      # (see number.format)\n```\n\n## Programmatic access\n\n### Programmatic access\n\n```rb\nI18n.backend.store_translations :en, ok: \"Ok\"\nI18n.locale = :en\nI18n.default_locale = :en\n\nI18n.available_locales\n\nI18n.translate :ok   # aka, I18n.t\nI18n.localize date   # aka, I18n.l\n```"}

field_body:
### References

 * <http://guides.rubyonrails.org/i18n.html>
 * <http://rails-i18n.org/wiki>
 * <https://github.com/svenfuchs/i18n>
 * <https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/en.yml>

### Example

```rb
t('my.messages.hello')

# same as 'my.messages.hello'
t(:hello, scope: 'my.messages')
t(:hello, scope: [:my, :messages])

t('my.messages.hello', default: "Hello")
```

#### YAML

```yml
en:
  my:
    messages:
      hello: "Hello"
```

### Interpolation

```rb
t('hello', name: "John")
```

#### YAML

```yml
hello: "Hello %{name}"
```

### Lazy lookup

```rb
# from the 'books/index' view
t('.title')
```

#### YAML

```yml
en:
  books:
    index:
      title: "Título"
```

### Plural

```rb
t(:inbox, count: 1)  #=> 'one message'
t(:inbox, count: 2)  #=> '2 messages'
```

#### YAML

```yml
inbox:
  one: 'one message',
  other: '%{count} messages'
```

## Localizing

### Time

```rb
l(Time.now)
l(Time.now, format: :short)
```

#### YAML

```yml
en:
  time:
    formats:
      default: "%a, %d %b %Y %H:%M:%S %z"
      long: "%B %d, %Y %H:%M"
      short: "%d %b %H:%M"
```

### Date

```rb
l(Date.today)
```

#### YAML

```yml
en:
  date:
    formats:
      default: "%Y-%m-%d" # 2015-06-25
      long: "%B %d, %Y"   # June 25, 2015
      short: "%b %d"      # Jun 25
```

## ActiveRecord

### Model names

```rb
User.model_name.human            #=> "User"
Child.model_name.human(count: 2) #=> "Children"
```

#### YAML

```yml
en:
  activerecord:
    models:
      user: "User"
      child:
        one: "Child"
        other: "Children"
```

### Attributes

```rb
User.human_attribute_for :name   #=> "Name"
```

#### YAML

```yml
en:
  activerecord:
    attributes:
      user:
        # activerecord.attributes.<model>.<field>
        name: "Name"
        email: "Email"
```

### Error messages

```rb
error_messages_for(...)
```

#### YAML

```yml
activerecord:
  errors:
    models:
      venue:
        attributes:
          name:
            blank: "Please enter a name."
```

### Scopes

Possible scopes (in order):

```yml
activerecord.errors.models.[model_name].attributes.[attribute_name].[error]
activerecord.errors.models.[model_name].[error]
activerecord.errors.messages.[error]
errors.attributes.[attribute_name].[error]
errors.messages.[error]
```

Where `[error]` can be:

```yml
validates
  confirmation - :confirmation
  acceptance   - :accepted
  presence     - :blank
  length       - :too_short (%{count})
  length       - :too_long (%{count})
  length       - :wrong_length (%{count})
  uniqueness   - :taken
  format       - :invalid
  numericality - :not_a_number
```

### Form labels

```rb
form_for @post do
  f.label :body
```

#### YAML

```yml
helpers:
  # helpers.label.<model>.<field>
  label:
    post:
      body: "Your body text"
```

### Submit buttons

```rb
form_for @post do
  f.submit
```

#### YAML

```yml
helpers:
  submit:
    # helpers.submit.<action>
    create: "Create a %{model}"
    update: "Confirm changes to %{model}"

    # helpers.submit.<model>.<action>
    article:
      create: "Publish article"
      update: "Update article"
```
 

## Numbers

```rb
number_to_delimited(2000)             #=> "2,000"
number_to_currency(12.3)              #=> "$12.30"
number_to_percentage(0.3)             #=> "30%"
number_to_rounded(3.14, precision: 0) #=> "3"
number_to_human(12_000)               #=> "12 Thousand"
number_to_human_size(12345)           #=> "12.3 kb"
```

### Delimited

```rb
number_to_delimited(n)
```

#### YAML

```yml
number:
  format:
    separator: '.'
    delimiter: ','
    precision: 3
    significant: false
    strip_insignificant_zeroes: false
```

### Currencies

```rb
number_to_currency(n)
```
{:.light}

```yml
number:
  currency:
    format:
      format: "%u%n" # %u = unit, %n = number
      unit: "$"
      separator: '.'
      delimiter: ','
      precision: 3
      # (see number.format)
```

### Percentage

```rb
number_to_percentage(n)
```

#### YAML

```yml
number:
  percentage:
    format:
      format: "%n%"
      # (see number.format)
```

## Programmatic access

### Programmatic access

```rb
I18n.backend.store_translations :en, ok: "Ok"
I18n.locale = :en
I18n.default_locale = :en

I18n.available_locales

I18n.translate :ok   # aka, I18n.t
I18n.localize date   # aka, I18n.l
```


id: rails-helpers
git_filename: ./rails-helpers.md
format: md
field_title: Rails helpers
field_category: Rails
data:
{"title": "Rails helpers", "category": "Rails", "body": "### Date\n\n    distance_of_time_in_words(Time.now, project.end_date) #=> 3 hours\n    distance_of_time_in_words_to_now(project.end_date)    #=> 3 hours\n\n    time_ago_in_words 3.minutes.ago #=> \"3 minutes\"\n\n### Numbers\n\n    number_to_currency 20.33\n    number_to_currency 20.33, precision: 0\n    number_with_precision 3.14159, precision: 2\n    number_to_percentage 32       #=> \"32%\"\n    number_with_delimiter 2048    #=> \"2,048\"\n    number_to_human 12000000      #=> \"12 million\"\n    number_to_human_size 12000000 #=> \"12 MB\"\n    number_to_phone \"5551234\"     #=> \"555-1234\"\n\n### Cache\n\n    <% cache project do %>\n    <% cache [project, current_user] do %>\n\n    <% cache_if admin?, project do %>\n    <% cache_unless admin?, project do %>\n\n### Tags\n\n    tag(\"br\")\n    tag(\"img\", src: \"image.jpg\")\n    content_tag(:p, \"Hello\")\n\n### Time select\n\n    # Creates a time select tag that, when POSTed, will be stored in the article\n    # variable in the sunrise attribute.\n    time_select \"article\", \"start_time\"\n\n    # All options are optional\n    time_select \"article\", \"start_time\", \\\n      include_seconds: true,\n      minute_step: 15,\n      prompt: true,\n      prompt: { hour: \"Choose hr\", minute: \"Choose min\", second: \"Choose sec\" },\n      ampm: true\n\n    # For dates (all options are optional)\n    date_select \"article\", \"written_on\", \\\n      start_year: 1995,\n      use_month_numbers: true,\n      discard_day: true,\n      include_blank: true,\n      order: [:day, :month, :year],\n      default: 3.days.from_now,\n      default: { day: 20 },\n      prompt: { day: 'Select day', month: 'Select month', year: 'Select year' }\n\n### Time tag\n\n    time_tag Date.today \n    #=> '<time datetime=\"2010-11-04\">November 04, 2010<%rtime>'\n\n    time_tag Time.now\n    #=> '<time datetime=\"2010-11-04T17:55:45+01:00\">November 04, 2010 17:55</time>'\n\n    time_tag Date.yesterday, 'Yesterday'\n    #=> '<time datetime=\"2010-11-03\">Yesterday<%rtime>'\n\n    time_tag Date.today, pubdate: true\n    #=> '<time datetime=\"2010-11-04\" pubdate=\"pubdate\">November 04, 2010</time>'\n\n    time_tag Date.today, \\\n      format: :short_date # (en.time.formats.short_date)\n\n### Files\n\n    = form_for @post, multipart: true do |f|\n      = f.file_field :picture\n\n### i18n\n\n    t('folders')\n    t('folders.save')\n\n    l(Time.now)\n\n    t('x_files', count: files.count)\n    # files:\n    #    one: 'one file'\n    #    other: '%{count} files'\n\n### References\n\n    * http://api.rubyonrails.org/classes/ActionView/Helpers.html"}

field_body:
### Date

    distance_of_time_in_words(Time.now, project.end_date) #=> 3 hours
    distance_of_time_in_words_to_now(project.end_date)    #=> 3 hours

    time_ago_in_words 3.minutes.ago #=> "3 minutes"

### Numbers

    number_to_currency 20.33
    number_to_currency 20.33, precision: 0
    number_with_precision 3.14159, precision: 2
    number_to_percentage 32       #=> "32%"
    number_with_delimiter 2048    #=> "2,048"
    number_to_human 12000000      #=> "12 million"
    number_to_human_size 12000000 #=> "12 MB"
    number_to_phone "5551234"     #=> "555-1234"

### Cache

    <% cache project do %>
    <% cache [project, current_user] do %>

    <% cache_if admin?, project do %>
    <% cache_unless admin?, project do %>

### Tags

    tag("br")
    tag("img", src: "image.jpg")
    content_tag(:p, "Hello")

### Time select

    # Creates a time select tag that, when POSTed, will be stored in the article
    # variable in the sunrise attribute.
    time_select "article", "start_time"

    # All options are optional
    time_select "article", "start_time", \
      include_seconds: true,
      minute_step: 15,
      prompt: true,
      prompt: { hour: "Choose hr", minute: "Choose min", second: "Choose sec" },
      ampm: true

    # For dates (all options are optional)
    date_select "article", "written_on", \
      start_year: 1995,
      use_month_numbers: true,
      discard_day: true,
      include_blank: true,
      order: [:day, :month, :year],
      default: 3.days.from_now,
      default: { day: 20 },
      prompt: { day: 'Select day', month: 'Select month', year: 'Select year' }

### Time tag

    time_tag Date.today 
    #=> '<time datetime="2010-11-04">November 04, 2010<%rtime>'

    time_tag Time.now
    #=> '<time datetime="2010-11-04T17:55:45+01:00">November 04, 2010 17:55</time>'

    time_tag Date.yesterday, 'Yesterday'
    #=> '<time datetime="2010-11-03">Yesterday<%rtime>'

    time_tag Date.today, pubdate: true
    #=> '<time datetime="2010-11-04" pubdate="pubdate">November 04, 2010</time>'

    time_tag Date.today, \
      format: :short_date # (en.time.formats.short_date)

### Files

    = form_for @post, multipart: true do |f|
      = f.file_field :picture

### i18n

    t('folders')
    t('folders.save')

    l(Time.now)

    t('x_files', count: files.count)
    # files:
    #    one: 'one file'
    #    other: '%{count} files'

### References

    * http://api.rubyonrails.org/classes/ActionView/Helpers.html


id: rails-forms
git_filename: ./rails-forms.md
format: md
field_title: Rails form helpers
field_category: Rails
data:
{"title": "Rails form helpers", "category": "Rails", "body": "## Form builder\n\n### Form builder\n\n```haml\n- form_for @post do |f|\n```\n\nField names will be prefixed with `post` (the class name), and values will be derived from this object (eg, `f.text_field :name` from `@post.name`).\n\n### Options\n\n```haml\n- form_for @post, |\n  url: { method: 'put', action: 'create' }, |\n  html: { class: 'nifty_form' } |\n  do |f|\n```\n\n## Fields\n\n### Text\n\n```rb\nf.text_field :title\nf.text_area :body, size: '60x12'\n```\n\n### Checkbox\n\n```rb\nf.check_box :remember_me\nf.label :remember_me, \"Remember me\"\n```\n\n### Radio\n\n```rb\nf.radio_button :gender, 'male'\nf.label :gender_male, \"Male\"\n\nf.radio_button :gender, 'female'\nf.label :gender_female, \"Female\"\n```\n\n### Label\n\n```rb\nf.label :title\nf.label :title, \"Title\"\nf.label :title, \"Title\", class: \"title\"\nf.label(:post, :terms) { \"Accept terms\" }\n```\n\n### Submit button\n\n```rb\nf.submit \"Create\"\n```\n\n### Hidden fields\n\n```rb\nf.hidden_field :id\n```\n\n## Misc\n\n### The model\n\n```ruby\nf.object\n```\n\n### Fields for\n\n```haml\n= form_for @post do |f|\n  = fields_for :author, @post.author do |ff|\n    = ff.text_field :name\n```\n\n### Select dropdowns\n\n```rb\nf.select :city_id, [['Lisbon',1], ['Madrid',2], ...], 4\n# (4 = selected)\n\noptions_for_select [['Lisbon',1], ['Madrid',2], ...], 4\n# Just makes <option> tags\n```\n\n### Collections\n\n```\nf.collection_radio_buttons :author_id, Author.all, :id, :name_with_initial\nf.collection_select :city_id, City.all, :id, :name\n# (field, collection, value_key, label_key)\n```\n\n### Time select\n\n```rb\nf.time_zone_select :time_zone\nf.date_select :birthday\n```\n### I18n\n\n```yaml\nhelpers:\n  submit:\n    # helpers.submit.<action>\n    create: \"Create a %{model}\"\n    update: \"Confirm changes to %{model}\"\n\n    # helpers.submit.<model>.<action>\n    article:\n      create: \"Publish article\"\n      update: \"Update article\"\n\n  # helpers.label.<model>.<field>\n  label:\n    post:\n      body: \"Your body text\"\n```\n\n### Outside `f`\n\n```rb\nradio_button(\"post\", \"category\", \"rails\")\nradio_button(\"post\", \"category\", \"java\")\n\n# picks from @post.category\n# <input type=\"radio\" id=\"post_category_rails\" name=\"post[category]\"\n#  value=\"rails\" checked=\"checked\" />\n```\n\n### Reference\n\n```rb\nselect(method, choices = nil, options = {}, html_options = {}, &block)\n  choices == [ ['label', id], ... ]\n\nsubmit(value=nil, options={})\n```"}

field_body:
## Form builder

### Form builder

```haml
- form_for @post do |f|
```

Field names will be prefixed with `post` (the class name), and values will be derived from this object (eg, `f.text_field :name` from `@post.name`).

### Options

```haml
- form_for @post, |
  url: { method: 'put', action: 'create' }, |
  html: { class: 'nifty_form' } |
  do |f|
```

## Fields

### Text

```rb
f.text_field :title
f.text_area :body, size: '60x12'
```

### Checkbox

```rb
f.check_box :remember_me
f.label :remember_me, "Remember me"
```

### Radio

```rb
f.radio_button :gender, 'male'
f.label :gender_male, "Male"

f.radio_button :gender, 'female'
f.label :gender_female, "Female"
```

### Label

```rb
f.label :title
f.label :title, "Title"
f.label :title, "Title", class: "title"
f.label(:post, :terms) { "Accept terms" }
```

### Submit button

```rb
f.submit "Create"
```

### Hidden fields

```rb
f.hidden_field :id
```

## Misc

### The model

```ruby
f.object
```

### Fields for

```haml
= form_for @post do |f|
  = fields_for :author, @post.author do |ff|
    = ff.text_field :name
```

### Select dropdowns

```rb
f.select :city_id, [['Lisbon',1], ['Madrid',2], ...], 4
# (4 = selected)

options_for_select [['Lisbon',1], ['Madrid',2], ...], 4
# Just makes <option> tags
```

### Collections

```
f.collection_radio_buttons :author_id, Author.all, :id, :name_with_initial
f.collection_select :city_id, City.all, :id, :name
# (field, collection, value_key, label_key)
```

### Time select

```rb
f.time_zone_select :time_zone
f.date_select :birthday
```
### I18n

```yaml
helpers:
  submit:
    # helpers.submit.<action>
    create: "Create a %{model}"
    update: "Confirm changes to %{model}"

    # helpers.submit.<model>.<action>
    article:
      create: "Publish article"
      update: "Update article"

  # helpers.label.<model>.<field>
  label:
    post:
      body: "Your body text"
```

### Outside `f`

```rb
radio_button("post", "category", "rails")
radio_button("post", "category", "java")

# picks from @post.category
# <input type="radio" id="post_category_rails" name="post[category]"
#  value="rails" checked="checked" />
```

### Reference

```rb
select(method, choices = nil, options = {}, html_options = {}, &block)
  choices == [ ['label', id], ... ]

submit(value=nil, options={})
```


id: rails-controllers
git_filename: ./rails-controllers.md
format: md
field_title: Rails controllers
field_category: Rails
data:
{"title": "Rails controllers", "category": "Rails", "body": "### Common stuff\n\n    redirect_to root_url\n    redirect_to root_url, notice: \"Good.\"\n\n### Special hashes\n\n    session[:user_id] = nil\n\n    flash[:notice] = \"Hello\"    # Gets flushed on next request\n    flash.keep                  # Persist flash values\n    flash.now[:error] = \"Boo\"   # Available on the same request\n\n    cookies[:hello] = \"Hi\"\n\n    params[:page]\n\n    # params is a combination of:\n    query_parameters\n    path_parameters\n    request_parameters\n\n### respond_to\n\n    respond_to do |format|\n      format.html\n      format.xml  { render xml: @users }\n      format.json { render json: @users }\n      format.js    # Will be executed by the browser\n    end\n\n### default_url_options\n\n    # The options parameter is the hash passed in to 'url_for'\n    def default_url_options(options)\n      {:locale => I18n.locale}\n    end\n\n### Filters\n\n    # Filter with callbacks\n    before_filter :authenticate\n    before_filter :authenticate, except: [:login]\n    before_filter :authenticate, only: [:login]\n    def authenticate\n      redirect_to login_url unless controller.logged_in?\n    end\n\n    # Filter with inline\n    before_filter do |controller|\n      redirect_to login_url unless controller.logged_in?\n    end\n\n    # Filter with external classes\n    before_filter LoginFilter\n    class LoginFilter\n      def self.filter(controller) ...; end\n    end\n\n    # Filter exceptions\n    skip_before_filter :require_login, only: [:new, :create]\n\n    # Before/after filters\n    around_filter :wrap_in_transaction\n    def wrap_in_transaction(&blk)\n      ActiveRecord::Base.transaction { yield }\n    end\n\n### HTTP basic authentication\n\n    before_filter :authenticate\n\n    # Basic authentication:\n    def authenticate\n      authenticate_or_request_with_http_basic { |u, p|\n        u == \"root\" && p == \"alpine\"\n      }\n    end\n\n    # ...or digest (hashed) authentication:\n    # uses the ha1 hash (username:realm:password)\n    def authenticate_by_digest\n      realm = \"Secret3000\"\n      users = {\n        \"rsc\" => Digest::MD5.hexdigest(\"rsc:#{realm}:passwordhere\")\n      }\n\n      authenticate_or_request_with_http_digest(realm) { |user|\n        users[user]\n      }\n    end\n\n    # For integration tests\n    def test_access\n      auth = ActionController::HttpAuthentication::Basic.encode_credentials(user, pass)\n      get \"/notes/1.xml\", nil, 'HTTP_AUTHORIZATION' => auth\n    end\n\n    # Token auth\n    is_logged_in = authenticate_with_http_token do |token, options|\n      token == our_secret_token\n    end\n\n    request_http_token_authentication  unless is_logged_in\n\n### Request/response\n\n    request.host            #=> \"www.example.com\"\n    request.domain          #=> \"www.example.com\"\n    request.domain(n=2)     #=> \"example.com\"\n    request.port            #=> 80\n    request.protocol        #=> \"http://\"\n    request.query_string    #=> \"q=duck+tales\"\n    request.url             #=> \"http://www.example.com/search?q=duck+tales\"\n    request.fullpath        #=> \"/search?q=duck+tales\"\n\n    request.headers         # Returns a hash\n\n    request.format          #=> \"text/html\"\n    request.remote_ip       #=> \"203.167.220.220\"\n    request.local?          #=> true (if localhost/127.0.0.1)\n\n    request.xhr?\n\n    request.method          #=> \"POST\"\n    request.method_symbol   #=> :post\n    request.get?\n    request.post?\n    request.put?\n    request.delete?\n    request.head?\n\n### response\n\n    response.body\n    response.status         #=> 404\n    response.location       # Redirect location\n    response.content_type\n    response.charset\n    response.headers\n\n    response.headers[\"Content-Type\"] = \"application/pdf\"\n\n### Streaming\n\n    send_data pdfdata, filename: \"foo.pdf\", type: \"application/pdf\"\n    send_file Rails.root.join('public','filename.txt') [filename: '..', type: '..']\n\n### References\n\n * [Guide](http://guides.rubyonrails.org/action_controller_overview.html)\n * [HttpAuthentication::Basic](http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html)\n * [HttpAuthentication::Token](http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html)"}

field_body:
### Common stuff

    redirect_to root_url
    redirect_to root_url, notice: "Good."

### Special hashes

    session[:user_id] = nil

    flash[:notice] = "Hello"    # Gets flushed on next request
    flash.keep                  # Persist flash values
    flash.now[:error] = "Boo"   # Available on the same request

    cookies[:hello] = "Hi"

    params[:page]

    # params is a combination of:
    query_parameters
    path_parameters
    request_parameters

### respond_to

    respond_to do |format|
      format.html
      format.xml  { render xml: @users }
      format.json { render json: @users }
      format.js    # Will be executed by the browser
    end

### default_url_options

    # The options parameter is the hash passed in to 'url_for'
    def default_url_options(options)
      {:locale => I18n.locale}
    end

### Filters

    # Filter with callbacks
    before_filter :authenticate
    before_filter :authenticate, except: [:login]
    before_filter :authenticate, only: [:login]
    def authenticate
      redirect_to login_url unless controller.logged_in?
    end

    # Filter with inline
    before_filter do |controller|
      redirect_to login_url unless controller.logged_in?
    end

    # Filter with external classes
    before_filter LoginFilter
    class LoginFilter
      def self.filter(controller) ...; end
    end

    # Filter exceptions
    skip_before_filter :require_login, only: [:new, :create]

    # Before/after filters
    around_filter :wrap_in_transaction
    def wrap_in_transaction(&blk)
      ActiveRecord::Base.transaction { yield }
    end

### HTTP basic authentication

    before_filter :authenticate

    # Basic authentication:
    def authenticate
      authenticate_or_request_with_http_basic { |u, p|
        u == "root" && p == "alpine"
      }
    end

    # ...or digest (hashed) authentication:
    # uses the ha1 hash (username:realm:password)
    def authenticate_by_digest
      realm = "Secret3000"
      users = {
        "rsc" => Digest::MD5.hexdigest("rsc:#{realm}:passwordhere")
      }

      authenticate_or_request_with_http_digest(realm) { |user|
        users[user]
      }
    end

    # For integration tests
    def test_access
      auth = ActionController::HttpAuthentication::Basic.encode_credentials(user, pass)
      get "/notes/1.xml", nil, 'HTTP_AUTHORIZATION' => auth
    end

    # Token auth
    is_logged_in = authenticate_with_http_token do |token, options|
      token == our_secret_token
    end

    request_http_token_authentication  unless is_logged_in

### Request/response

    request.host            #=> "www.example.com"
    request.domain          #=> "www.example.com"
    request.domain(n=2)     #=> "example.com"
    request.port            #=> 80
    request.protocol        #=> "http://"
    request.query_string    #=> "q=duck+tales"
    request.url             #=> "http://www.example.com/search?q=duck+tales"
    request.fullpath        #=> "/search?q=duck+tales"

    request.headers         # Returns a hash

    request.format          #=> "text/html"
    request.remote_ip       #=> "203.167.220.220"
    request.local?          #=> true (if localhost/127.0.0.1)

    request.xhr?

    request.method          #=> "POST"
    request.method_symbol   #=> :post
    request.get?
    request.post?
    request.put?
    request.delete?
    request.head?

### response

    response.body
    response.status         #=> 404
    response.location       # Redirect location
    response.content_type
    response.charset
    response.headers

    response.headers["Content-Type"] = "application/pdf"

### Streaming

    send_data pdfdata, filename: "foo.pdf", type: "application/pdf"
    send_file Rails.root.join('public','filename.txt') [filename: '..', type: '..']

### References

 * [Guide](http://guides.rubyonrails.org/action_controller_overview.html)
 * [HttpAuthentication::Basic](http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Basic.html)
 * [HttpAuthentication::Token](http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html)


id: ractive
git_filename: ./ractive.md
format: md
field_title: Ractive.js
field_category: JavaScript libraries
data:
{"title": "Ractive.js", "category": "JavaScript libraries", "body": "{% raw %}\n\n### About\n{: .-intro}\n\nRactive is a UI library for JavaScript.\n\n- <https://ractive.js.org/>\n- <https://ractivejs.org/>\n\n### [Initialization](http://docs.ractivejs.org/latest/options)\n\n    new Ractive({\n      el: $('..'),\n      el: '#box',\n      template: '...', // required\n\n      // callbacks\n      init: function() {},    // on instantiate\n      complete: function() {}, // on finish animations\n\n      // objs\n      data: { ... },\n      partials: { ... },    // global: Ractive.partials\n      transitions: { ... }, // global: Ractive.transitions\n      components: { ... },\n      adaptors: [ ... ],\n\n      // options\n      magic: false\n      modifyArrays: true\n      twoway: true\n      noIntro: true // true = disable transition on initial render\n      lazy: false   // false = use keyevents, true = use change/blur\n      append: false // false = overwrite element, true = append\n      debug: false\n      sanitize: false\n    })\n\n## Instance methods\n\n### Updating values\n\n    view.add('count', 1)       //=> promise\n    view.subtract('count', 1)  //=> promise\n    view.toggle('shown')       //=> promise\n\n    view.set('a', true)\n    view.set({ a: true })\n    view.reset({ a: true })\n    view.merge('list', [a,b,c])\n\n    view.get('a')\n    view.data.a\n\n### Nodes and components\n\n    view.find('.klass')\n    view.findAll('.klass')\n    view.nodes\n    view.nodes['hello']   // .find('#hello')\n\n    view.findComponent('photo')\n    view.findAllComponents('photo')\n\n### Events\n\n    view.on('event', function() { ... })\n    view.off('event', fn)\n    view.fire('event')\n\n### Others\n\n    view.update()\n    view.updateModel()\n\n    view.insert('.node .path')\n\n    view.observe({ 'name': function() { ... } })\n\n    view.toHTML()  //=> String\n    view.render()\n\n## Extend\n\n    View = Ractive.extend({\n      ...\n    })\n    new View()\n\n## [Components](https://github.com/RactiveJS/Ractive/wiki/Components)\n\nSee: https://github.com/RactiveJS/Ractive/issues/74\n{:.center}\n\n    Widget = Ractive.extend({ ... })\n\n    ractive = new Ractive({\n      el: 'main',\n      template: '<widget foo=\"bar\"/>',\n      components: {\n        widget: Widget\n      }\n    });\n\n## Partials\n\n    // Global partials\n    Ractive.partials.x = \"<..>\"\n\n## Events\n\n    view.on('teardown')\n\n### DOM Events\n\n    <button on-click='activate'>Activate!</button>\n\n    view.on({\n      activate: function () { ... }\n    });\n\n    <button on-click='sort:name'>Sort by name</button>\n    view.on('sort', function (e, column) {\n      console.log('sorting by #{column}');\n    });\n\n### Observing\n\n     view.observe(\"name\", function (name) {\n       console.log(\"Changed name to\", name);\n     }, { init: false });\n\n## Markup\n\n    Hello, {{name}}\n    Body: {{{unescaped}}}\n\n    <!-- each -->\n    {{#mylist:i}}\n      <li>{{this.name}}</li>\n      <li>{{name}}</li>\n      <li>{{.}}</li> <!-- same as 'this' -->\n    {{/mylist}}\n\n    {{^user}}Not logged in{{/user}} <!-- if false -->\n    {{#user}}Welcome, sire{{/user}} <!-- if true -->\n\n    {{>partialName}}\n    <component>\n\n    {{#statusDogs[selected]}}\n\n## Transformed attributes\n\nThis transforms the `list` attribute via a helper function called `sort()`.\n\n    {{# sort(list, \"name\") :num }}\n      <li>{{num}} - {{name}}</li>\n    {{/ end. any text goes here }}\n\n    data: {\n      sort: function(array, column) { return array.whatever(); }\n    }\n\n## Transitions\n\n    <div intro=\"fade\">\n    <div intro=\"bump\">\n    <div intro=\"bump:{duration:400}\">\n\n    Ractive.transitions.bump = function(t, params) {\n       params = t.processParams( params, {\n         duration: 400,\n         color: t.isIntro ? 'rgb(0,255,0)' : 'rgb(255,0,0)'\n       });\n\n      if (t.isIntro) {\n        /* enter */\n      } else {\n        /* exit */\n      }\n\n      t.complete();\n    };\n\n## [Decorators](http://docs.ractivejs.org/latest/decorators)\n\n    <span decorator=\"tooltip:hello there\">Hover me</span>\n\n    decorators: {\n      tooltip: function (node, content) {\n        // setup code here\n        return {\n          teardown: function () {\n            // cleanup code here\n          }\n        }\n      }\n    }\n\n    <span decorator=\"tooltip:'a','b',2,'c'\">Hover me</span>\n\n    tooltip: function (node, a, b, two, c) { ... }\n\n## [Adaptors](http://docs.ractivejs.org/latest/adaptors)\n\n    myAdaptor = {\n      filter: function (object, keypath, ractive) {\n        // return `true` if a particular object is of the type we want to adapt\n      },\n      wrap: function (ractive, object, keypath, prefixer) {\n        // set up event bindings here\n        object.on('change', function () { ractive.set(prefixer({...})); });\n        // then return a wrapper:\n        return {\n          teardown: function () { .. },\n          // json representation\n          get: function () { return { a:2, b:3, c:4, ... }; },\n          // called on ractive.set\n          set: function (key, val) { },\n          // called on ractive.set on root (return false = die)\n          reset: function (data) { return false; }\n        };\n      }\n    };\n\n## [Computed properties](http://docs.ractivejs.org/latest/computed-properties)\n\n    new Ractive({\n      template: '{{area}}',\n      computed: {\n        area: function () { return this.get('width') * this.get('height'); }\n        area: '${width} * ${height}'\n        fullname: {\n          get: '${first} + \" \" + ${last}\"\n          set: function (name) { ... }\n        }\n      }\n    });\n\n{% endraw %}"}

field_body:
{% raw %}

### About
{: .-intro}

Ractive is a UI library for JavaScript.

- <https://ractive.js.org/>
- <https://ractivejs.org/>

### [Initialization](http://docs.ractivejs.org/latest/options)

    new Ractive({
      el: $('..'),
      el: '#box',
      template: '...', // required

      // callbacks
      init: function() {},    // on instantiate
      complete: function() {}, // on finish animations

      // objs
      data: { ... },
      partials: { ... },    // global: Ractive.partials
      transitions: { ... }, // global: Ractive.transitions
      components: { ... },
      adaptors: [ ... ],

      // options
      magic: false
      modifyArrays: true
      twoway: true
      noIntro: true // true = disable transition on initial render
      lazy: false   // false = use keyevents, true = use change/blur
      append: false // false = overwrite element, true = append
      debug: false
      sanitize: false
    })

## Instance methods

### Updating values

    view.add('count', 1)       //=> promise
    view.subtract('count', 1)  //=> promise
    view.toggle('shown')       //=> promise

    view.set('a', true)
    view.set({ a: true })
    view.reset({ a: true })
    view.merge('list', [a,b,c])

    view.get('a')
    view.data.a

### Nodes and components

    view.find('.klass')
    view.findAll('.klass')
    view.nodes
    view.nodes['hello']   // .find('#hello')

    view.findComponent('photo')
    view.findAllComponents('photo')

### Events

    view.on('event', function() { ... })
    view.off('event', fn)
    view.fire('event')

### Others

    view.update()
    view.updateModel()

    view.insert('.node .path')

    view.observe({ 'name': function() { ... } })

    view.toHTML()  //=> String
    view.render()

## Extend

    View = Ractive.extend({
      ...
    })
    new View()

## [Components](https://github.com/RactiveJS/Ractive/wiki/Components)

See: https://github.com/RactiveJS/Ractive/issues/74
{:.center}

    Widget = Ractive.extend({ ... })

    ractive = new Ractive({
      el: 'main',
      template: '<widget foo="bar"/>',
      components: {
        widget: Widget
      }
    });

## Partials

    // Global partials
    Ractive.partials.x = "<..>"

## Events

    view.on('teardown')

### DOM Events

    <button on-click='activate'>Activate!</button>

    view.on({
      activate: function () { ... }
    });

    <button on-click='sort:name'>Sort by name</button>
    view.on('sort', function (e, column) {
      console.log('sorting by #{column}');
    });

### Observing

     view.observe("name", function (name) {
       console.log("Changed name to", name);
     }, { init: false });

## Markup

    Hello, {{name}}
    Body: {{{unescaped}}}

    <!-- each -->
    {{#mylist:i}}
      <li>{{this.name}}</li>
      <li>{{name}}</li>
      <li>{{.}}</li> <!-- same as 'this' -->
    {{/mylist}}

    {{^user}}Not logged in{{/user}} <!-- if false -->
    {{#user}}Welcome, sire{{/user}} <!-- if true -->

    {{>partialName}}
    <component>

    {{#statusDogs[selected]}}

## Transformed attributes

This transforms the `list` attribute via a helper function called `sort()`.

    {{# sort(list, "name") :num }}
      <li>{{num}} - {{name}}</li>
    {{/ end. any text goes here }}

    data: {
      sort: function(array, column) { return array.whatever(); }
    }

## Transitions

    <div intro="fade">
    <div intro="bump">
    <div intro="bump:{duration:400}">

    Ractive.transitions.bump = function(t, params) {
       params = t.processParams( params, {
         duration: 400,
         color: t.isIntro ? 'rgb(0,255,0)' : 'rgb(255,0,0)'
       });

      if (t.isIntro) {
        /* enter */
      } else {
        /* exit */
      }

      t.complete();
    };

## [Decorators](http://docs.ractivejs.org/latest/decorators)

    <span decorator="tooltip:hello there">Hover me</span>

    decorators: {
      tooltip: function (node, content) {
        // setup code here
        return {
          teardown: function () {
            // cleanup code here
          }
        }
      }
    }

    <span decorator="tooltip:'a','b',2,'c'">Hover me</span>

    tooltip: function (node, a, b, two, c) { ... }

## [Adaptors](http://docs.ractivejs.org/latest/adaptors)

    myAdaptor = {
      filter: function (object, keypath, ractive) {
        // return `true` if a particular object is of the type we want to adapt
      },
      wrap: function (ractive, object, keypath, prefixer) {
        // set up event bindings here
        object.on('change', function () { ractive.set(prefixer({...})); });
        // then return a wrapper:
        return {
          teardown: function () { .. },
          // json representation
          get: function () { return { a:2, b:3, c:4, ... }; },
          // called on ractive.set
          set: function (key, val) { },
          // called on ractive.set on root (return false = die)
          reset: function (data) { return false; }
        };
      }
    };

## [Computed properties](http://docs.ractivejs.org/latest/computed-properties)

    new Ractive({
      template: '{{area}}',
      computed: {
        area: function () { return this.get('width') * this.get('height'); }
        area: '${width} * ${height}'
        fullname: {
          get: '${first} + " " + ${last}"
          set: function (name) { ... }
        }
      }
    });

{% endraw %}


id: rack-test
git_filename: ./rack-test.md
format: md
field_title: rack-test
field_category: Ruby libraries
data:
{"title": "rack-test", "category": "Ruby libraries", "body": "### Methods\n\n```ruby\nget 'url'\npost 'url', 'name' => 'john'\nput\npatch\ndelete\noptions\nhead\n```\n\n```ruby\nauthorize 'user', 'pass'\nenv 'rack.session', csrf: 'token'\nheader 'Content-Type', 'text/html'\n```\n\nSee [rack/test.rb](https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb)."}

field_body:
### Methods

```ruby
get 'url'
post 'url', 'name' => 'john'
put
patch
delete
options
head
```

```ruby
authorize 'user', 'pass'
env 'rack.session', csrf: 'token'
header 'Content-Type', 'text/html'
```

See [rack/test.rb](https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb).


id: qunit
git_filename: ./qunit.md
format: md
field_title: Qunit
field_category: JavaScript libraries
data:
{"title": "Qunit", "category": "JavaScript libraries", "intro": "A quick reference for the [QUnit](https://yarnpkg.com/package/qunit) testing library in JavaScript.\n", "body": "```js\nQUnit.module('a')\nQUnit.test('ok', function (t) {\n  /* ... */\n})\n```\n\n### Hooks\n\n#### Each test\n\n```js\n// each test\nQUnit.testStart(function)\nQUnit.testEnd(function)\n```\n\n```js\n// each module\nQUnit.moduleStart(function)\nQUnit.moduleEnd(function)\n```\n\n```js\n// all\nQUnit.begin(function)\nQUnit.done(function)\n```\n\n### Assertions\n\n```js\nt.equal(actual, expected)\nt.deepEqual(actual, expected)\nt.strictEqual(actual, expected)\nt.propEqual(actual, expected)\nt.notEqual(actual, expected)\nt.expect(amount)\n```"}

field_intro:
A quick reference for the [QUnit](https://yarnpkg.com/package/qunit) testing library in JavaScript.

field_body:
```js
QUnit.module('a')
QUnit.test('ok', function (t) {
  /* ... */
})
```

### Hooks

#### Each test

```js
// each test
QUnit.testStart(function)
QUnit.testEnd(function)
```

```js
// each module
QUnit.moduleStart(function)
QUnit.moduleEnd(function)
```

```js
// all
QUnit.begin(function)
QUnit.done(function)
```

### Assertions

```js
t.equal(actual, expected)
t.deepEqual(actual, expected)
t.strictEqual(actual, expected)
t.propEqual(actual, expected)
t.notEqual(actual, expected)
t.expect(amount)
```


id: qjs
git_filename: ./qjs.md
format: md
field_title: Q.js
field_category: JavaScript libraries
data:
{"title": "Q.js", "category": "JavaScript libraries", "body": "### About\n{: .-intro}\n\n* <https://github.com/kriskowal/q>\n* <https://github.com/kriskowal/q/wiki/API-Reference>\n\n### Creating promises (Q.promise)\n\n    Q.promise (ok, fail) =>\n      asyncFunction ->\n        if error\n          fail new Error(\"Failure\")\n        else\n          ok(data)\n\n### For arrays\n\n    promises = [saveDisk(), saveCloud()]\n\n    # When all succeeds, or *at least one* error\n    Q.all(promises).done ->\n      alert \"Saved\"\n\n    # Same, but get the values\n    Q.all(promises).spread (a, b) ->\n      alert \"Result A:\" + a\n      alert \"Result B:\" + b\n\n    # When all either succeeds or errors\n    Q.allSettled(promises).done -> ...\n\n\n### Creating promises from Node\n\n    # Works like .call() or .apply()\n\n    Q.nfcall(FS.readFile, 'foo.txt', 'utf-8')\n    .then -> ...\n\n    Q.nfapply(FS.readFile, ['foo.txt', 'utf-8'])\n    .then -> ...\n\n    Q.npost(FS, 'readFile', ['foo.txt, 'utf-8'])\n    .then -> ...\n\n    Q.npost(FS, 'readFile', 'foo.txt, 'utf-8')\n    .then -> ...\n\n    readFile = Q.denodeify(FS.readFile)\n    readFile('foo.txt').then -> ...\n\n### Promises to Node async\n\n    createUser = (next) ->\n      promiseMaker()\n      .nodeify(next)\n\n### Promise sugars\n\n    # Shortcut for .then(ok, fail, progress)\n    promise\n    .then (data) ->\n    .catch (err) ->\n    .progress (percent) ->\n\n### Try\n\n  Q.try ->\n    promise()\n\n  .catch (e) ->\n    console.error \"Oh well\", e"}

field_body:
### About
{: .-intro}

* <https://github.com/kriskowal/q>
* <https://github.com/kriskowal/q/wiki/API-Reference>

### Creating promises (Q.promise)

    Q.promise (ok, fail) =>
      asyncFunction ->
        if error
          fail new Error("Failure")
        else
          ok(data)

### For arrays

    promises = [saveDisk(), saveCloud()]

    # When all succeeds, or *at least one* error
    Q.all(promises).done ->
      alert "Saved"

    # Same, but get the values
    Q.all(promises).spread (a, b) ->
      alert "Result A:" + a
      alert "Result B:" + b

    # When all either succeeds or errors
    Q.allSettled(promises).done -> ...


### Creating promises from Node

    # Works like .call() or .apply()

    Q.nfcall(FS.readFile, 'foo.txt', 'utf-8')
    .then -> ...

    Q.nfapply(FS.readFile, ['foo.txt', 'utf-8'])
    .then -> ...

    Q.npost(FS, 'readFile', ['foo.txt, 'utf-8'])
    .then -> ...

    Q.npost(FS, 'readFile', 'foo.txt, 'utf-8')
    .then -> ...

    readFile = Q.denodeify(FS.readFile)
    readFile('foo.txt').then -> ...

### Promises to Node async

    createUser = (next) ->
      promiseMaker()
      .nodeify(next)

### Promise sugars

    # Shortcut for .then(ok, fail, progress)
    promise
    .then (data) ->
    .catch (err) ->
    .progress (percent) ->

### Try

  Q.try ->
    promise()

  .catch (e) ->
    console.error "Oh well", e


id: python
git_filename: ./python.md
format: md
field_title: Python
field_category: Python
data:
{"title": "Python", "category": "Python", "body": "### Tuples (immutable)\n\n```py\ntuple = ()\n```\n\n### Lists (mutable)\n\n```py\nlist = []\nlist[i:j]  # returns list subset\nlist[-1]   # returns last element\nlist[:-1]  # returns all but the last element\n*list      # expands all elements in place\n\nlist[i] = val\nlist[i:j] = otherlist  # replace ith to jth-1 elements with otherlist\ndel list[i:j]\n\nlist.append(item)\nlist.extend(another_list)\nlist.insert(index, item)\nlist.pop()        # returns and removes last element from the list\nlist.pop(i)       # returns and removes i-th element from the list\nlist.remove(i)    # removes the first item from the list whose value is i\nlist1 + list2     # combine two list    \nset(list)         # remove duplicate elements from a list\n\nlist.reverse()    # reverses the elements of the list in-place\nlist.count(item)\nsum(list)\n\nzip(list1, list2)  # returns list of tuples with n-th element of both list1 and list2\nlist.sort()        # sorts in-place, returns None\nsorted(list)       # returns sorted copy of list\n\",\".join(list)     # returns a string with list elements separated by comma\n\n```\n\n### Dict\n\n```py\ndict = {}\ndict = {'a': 1, 'b': 2}\ndict['c'] = 3\ndel dict['a']    # Remove key-value pair with key 'c'\ndict.keys()\ndict.values()\n\"key\" in dict    # let's say this returns False, then...\ndict[\"key\"]      # if \"key\" not in dict raises KeyError\ndict.get(\"key\")  # if \"key\" not in dict returns None\ndict.get(\"key\", \"optional return value if no key\")\ndict.setdefault(\"key\", 1)\n**dict           # expands all k/v pairs in place\n```\n\n### Set\n\n```py\nset = set()\nset = {1, 2, 3}\nset.add(4)\nset.remove(2) \n```\n\n### Iteration\n\n```py\nfor item in [\"a\", \"b\", \"c\"]:\nfor i in range(4):        # 0 to 3\nfor i in range(4, 8):     # 4 to 7\nfor i in range(1, 9, 2):  # 1, 3, 5, 7\nfor key, val in dict.items():\nfor index, item in enumerate(list):\n```\n\n### [String](https://docs.python.org/2/library/stdtypes.html#string-methods)\n\n```py\nstr[0:4]\nlen(str)\n\nstring.replace(\"-\", \" \")\n\",\".join(list)\n\"hi {0}\".format('j')\nf\"hi {name}\" # same as \"hi {}\".format('name')\nstr.find(\",\")\nstr.index(\",\")   # same, but raises IndexError\nstr.count(\",\")\nstr.split(\",\")\n\nstr.lower()\nstr.upper()\nstr.title()\n\nstr.lstrip()\nstr.rstrip()\nstr.strip()\n\nstr.islower()\n\n/* escape characters */\n>>> 'doesn\\'t'  # use \\' to escape the single quote...\n    \"doesn't\"\n>>> \"doesn't\"  # ...or use double quotes instead\n    \"doesn't\"\n>>> '\"Yes,\" they said.'\n    '\"Yes,\" they said.'\n>>> \"\\\"Yes,\\\" they said.\"\n    '\"Yes,\" they said.'\n>>> '\"Isn\\'t,\" they said.'\n    '\"Isn\\'t,\" they said.'\n```\n\n### Casting\n\n```py\nint(str)\nfloat(str)\nstr(int)\nstr(float)\n'string'.encode()\n```\n\n### Comprehensions\n\n```py\n[fn(i) for i in list]            # .map\nmap(fn, list)                    # .map, returns iterator\n\nfilter(fn, list)                 # .filter, returns iterator\n[fn(i) for i in list if i > 0]   # .filter.map\n```\n\n### Regex\n\n```py\nimport re\n\nre.match(r'^[aeiou]', str)\nre.sub(r'^[aeiou]', '?', str)\nre.sub(r'(xyz)', r'\\1', str)\n\nexpr = re.compile(r'^...$')\nexpr.match(...)\nexpr.sub(...)\n```\n\n## File manipulation\n    \n### Reading\n\n```py\nfile = open(\"hello.txt\", \"r\") # open in read mode 'r'\nfile.close() \n```\n\n```py\nprint(file.read())  # read the entire file and set the cursor at the end of file\nprint file.readline() # Reading one line\nfile.seek(0, 0) # place the cursor at the beginning of the file\n```\n\n### Writing (overwrite)\n\n```py\nfile = open(\"hello.txt\", \"w\") # open in write mode 'w'\nfile.write(\"Hello World\") \n\ntext_lines = [\"First line\", \"Second line\", \"Last line\"] \nfile.writelines(text_lines)\n\nfile.close()\n```\n\n### Writing (append)\n\n```py\nfile = open(\"Hello.txt\", \"a\") # open in append mode\nfile.write(\"Hello World again\")  \nfile.close()\n```\n\n### Context manager\n\n```py\nwith open(\"welcome.txt\", \"r\") as file:\n    # 'file' refers directly to \"welcome.txt\"\n   data = file.read()\n\n# It closes the file automatically at the end of scope, no need for `file.close()`.\n```"}

field_body:
### Tuples (immutable)

```py
tuple = ()
```

### Lists (mutable)

```py
list = []
list[i:j]  # returns list subset
list[-1]   # returns last element
list[:-1]  # returns all but the last element
*list      # expands all elements in place

list[i] = val
list[i:j] = otherlist  # replace ith to jth-1 elements with otherlist
del list[i:j]

list.append(item)
list.extend(another_list)
list.insert(index, item)
list.pop()        # returns and removes last element from the list
list.pop(i)       # returns and removes i-th element from the list
list.remove(i)    # removes the first item from the list whose value is i
list1 + list2     # combine two list    
set(list)         # remove duplicate elements from a list

list.reverse()    # reverses the elements of the list in-place
list.count(item)
sum(list)

zip(list1, list2)  # returns list of tuples with n-th element of both list1 and list2
list.sort()        # sorts in-place, returns None
sorted(list)       # returns sorted copy of list
",".join(list)     # returns a string with list elements separated by comma

```

### Dict

```py
dict = {}
dict = {'a': 1, 'b': 2}
dict['c'] = 3
del dict['a']    # Remove key-value pair with key 'c'
dict.keys()
dict.values()
"key" in dict    # let's say this returns False, then...
dict["key"]      # if "key" not in dict raises KeyError
dict.get("key")  # if "key" not in dict returns None
dict.get("key", "optional return value if no key")
dict.setdefault("key", 1)
**dict           # expands all k/v pairs in place
```

### Set

```py
set = set()
set = {1, 2, 3}
set.add(4)
set.remove(2) 
```

### Iteration

```py
for item in ["a", "b", "c"]:
for i in range(4):        # 0 to 3
for i in range(4, 8):     # 4 to 7
for i in range(1, 9, 2):  # 1, 3, 5, 7
for key, val in dict.items():
for index, item in enumerate(list):
```

### [String](https://docs.python.org/2/library/stdtypes.html#string-methods)

```py
str[0:4]
len(str)

string.replace("-", " ")
",".join(list)
"hi {0}".format('j')
f"hi {name}" # same as "hi {}".format('name')
str.find(",")
str.index(",")   # same, but raises IndexError
str.count(",")
str.split(",")

str.lower()
str.upper()
str.title()

str.lstrip()
str.rstrip()
str.strip()

str.islower()

/* escape characters */
>>> 'doesn\'t'  # use \' to escape the single quote...
    "doesn't"
>>> "doesn't"  # ...or use double quotes instead
    "doesn't"
>>> '"Yes," they said.'
    '"Yes," they said.'
>>> "\"Yes,\" they said."
    '"Yes," they said.'
>>> '"Isn\'t," they said.'
    '"Isn\'t," they said.'
```

### Casting

```py
int(str)
float(str)
str(int)
str(float)
'string'.encode()
```

### Comprehensions

```py
[fn(i) for i in list]            # .map
map(fn, list)                    # .map, returns iterator

filter(fn, list)                 # .filter, returns iterator
[fn(i) for i in list if i > 0]   # .filter.map
```

### Regex

```py
import re

re.match(r'^[aeiou]', str)
re.sub(r'^[aeiou]', '?', str)
re.sub(r'(xyz)', r'\1', str)

expr = re.compile(r'^...$')
expr.match(...)
expr.sub(...)
```

## File manipulation
    
### Reading

```py
file = open("hello.txt", "r") # open in read mode 'r'
file.close() 
```

```py
print(file.read())  # read the entire file and set the cursor at the end of file
print file.readline() # Reading one line
file.seek(0, 0) # place the cursor at the beginning of the file
```

### Writing (overwrite)

```py
file = open("hello.txt", "w") # open in write mode 'w'
file.write("Hello World") 

text_lines = ["First line", "Second line", "Last line"] 
file.writelines(text_lines)

file.close()
```

### Writing (append)

```py
file = open("Hello.txt", "a") # open in append mode
file.write("Hello World again")  
file.close()
```

### Context manager

```py
with open("welcome.txt", "r") as file:
    # 'file' refers directly to "welcome.txt"
   data = file.read()

# It closes the file automatically at the end of scope, no need for `file.close()`.
```


id: pug
git_filename: ./pug.md
format: md
field_title: Pug
field_category: JavaScript libraries
field_tags: Featurable
field_prism_languages: jade
field_updated: 2017-10-30
field_updated___timezone: UTC
data:
{"title": "Pug", "category": "JavaScript libraries", "prism_languages": ["jade"], "updated": "2017-10-30", "weight": -3, "tags": ["Featurable"], "body": "## Pug\n{: .-three-column}\n\n### Basic document\n{: .-prime}\n\n```jade\ndoctype html\nhtml(lang='en')\n  h1.class#id(name='hi')\n    | This is some text, hello there,\n    = name\n\n  - javascript()\n```\n\n### Elements\n\n```jade\ndiv\n  | Just a div\n```\n\n```jade\n.search\n  | A div, with class 'search'\n```\n\n```jade\nh1 A heading with text\n```\n\n```jade\nh1= page.title\n```\n\n```jade\ndiv.class\ndiv.class1.class2\nh1.header\n```\n\n### Attributes\n\n```jade\ninput(type='text' name='q' autofocus)\n```\n\n```jade\n- var authenticated = true\nbody(class=authenticated ? 'authed' : 'anon')\n```\n\nSee: [Attributes](https://pugjs.org/language/attributes.html)\n\n### Comments\n\n```jade\n// This comment will appear in the HTML\n```\n\n```jade\n//- This is a silent comment\n```\n\n```jade\n//-\n  Nesting inside a comment creates\n  a comment block\n```\n\nSee: [Comments](https://pugjs.org/language/attributes.html)\n\n### Iteration\n\n```jade\nul\n  each user in users\n    li= user\n```\n\n### Layouts\n\n```jade\n//- page.pug\nextends layout.pug\n\nblock title\n  | hello\n\nblock content\n  | hello\n```\n\n```jade\n//- layout.pug\ntitle\n  block title\nbody\n  block content\n```\n\n### Includes (partials)\n\n```jade\ninclude ./includes/head.pug\n```\n\n```jade\ninclude:markdown article.md\n```\n\nSee: [Includes](https://pugjs.org/language/includes.html)\n\n### Multiline text\n\n```jade\np.\n  This is text that doesn't need to\n  be prefixed by pipes.\n```\n{: data-line=\"1\"}\n\n```jade\nscript.\n  // It's great for raw\n  // JavaScript and stuff\n  alert('hello')\n```\n{: data-line=\"1\"}\n\n### Conditionals\n\n```jade\nif authenticated\n  a(href='/logout') Sign out\nelse\n  a(href='/login') Sign in\n```\n{: data-line=\"1,3\"}\n\nSee: [Conditionals](https://pugjs.org/language/conditionals.html)\n\n## Mixins\n{: .-three-column}\n\n### Mixins\n\n```jade\nmixin list\n  ul\n    \u00b7\u00b7\u00b7\n```\n{: data-line=\"1\"}\n\n```jade\n+list\n```\n\nMixins allow you to create reusable code blocks.\nSee: [Mixins](https://pugjs.org/language/mixins.html)\n\n### Mixin attributes\n\n```jade\nmixin pet(name)\n  span.pet= name\n```\n{: data-line=\"1\"}\n\n```jade\n+pet('cat')\n```\n\nSee: [Mixin attributes](https://pugjs.org/language/mixins.html#mixin-attributes)\n\n### Mixin blocks\n\n```jade\nmixin article(title)\n  article\n    h2.title= title\n    block\n```\n{: data-line=\"1,4\"}\n\n```jade\n+article('hello there')\n  p Content goes here\n```\n\nSee: [Mixin blocks](https://pugjs.org/language/mixins.html#mixin-blocks)"}

field_body:
## Pug
{: .-three-column}

### Basic document
{: .-prime}

```jade
doctype html
html(lang='en')
  h1.class#id(name='hi')
    | This is some text, hello there,
    = name

  - javascript()
```

### Elements

```jade
div
  | Just a div
```

```jade
.search
  | A div, with class 'search'
```

```jade
h1 A heading with text
```

```jade
h1= page.title
```

```jade
div.class
div.class1.class2
h1.header
```

### Attributes

```jade
input(type='text' name='q' autofocus)
```

```jade
- var authenticated = true
body(class=authenticated ? 'authed' : 'anon')
```

See: [Attributes](https://pugjs.org/language/attributes.html)

### Comments

```jade
// This comment will appear in the HTML
```

```jade
//- This is a silent comment
```

```jade
//-
  Nesting inside a comment creates
  a comment block
```

See: [Comments](https://pugjs.org/language/attributes.html)

### Iteration

```jade
ul
  each user in users
    li= user
```

### Layouts

```jade
//- page.pug
extends layout.pug

block title
  | hello

block content
  | hello
```

```jade
//- layout.pug
title
  block title
body
  block content
```

### Includes (partials)

```jade
include ./includes/head.pug
```

```jade
include:markdown article.md
```

See: [Includes](https://pugjs.org/language/includes.html)

### Multiline text

```jade
p.
  This is text that doesn't need to
  be prefixed by pipes.
```
{: data-line="1"}

```jade
script.
  // It's great for raw
  // JavaScript and stuff
  alert('hello')
```
{: data-line="1"}

### Conditionals

```jade
if authenticated
  a(href='/logout') Sign out
else
  a(href='/login') Sign in
```
{: data-line="1,3"}

See: [Conditionals](https://pugjs.org/language/conditionals.html)

## Mixins
{: .-three-column}

### Mixins

```jade
mixin list
  ul
    ···
```
{: data-line="1"}

```jade
+list
```

Mixins allow you to create reusable code blocks.
See: [Mixins](https://pugjs.org/language/mixins.html)

### Mixin attributes

```jade
mixin pet(name)
  span.pet= name
```
{: data-line="1"}

```jade
+pet('cat')
```

See: [Mixin attributes](https://pugjs.org/language/mixins.html#mixin-attributes)

### Mixin blocks

```jade
mixin article(title)
  article
    h2.title= title
    block
```
{: data-line="1,4"}

```jade
+article('hello there')
  p Content goes here
```

See: [Mixin blocks](https://pugjs.org/language/mixins.html#mixin-blocks)


id: psdrb
git_filename: ./psdrb.md
format: md
field_title: PSD.rb
field_category: Ruby libraries
field_intro: [PSD.rb](https://github.com/layervault/psd.rb) parses Photoshop documents in Ruby.
data:
{"title": "PSD.rb", "category": "Ruby libraries", "intro": "[PSD.rb](https://github.com/layervault/psd.rb) parses Photoshop documents in Ruby.\n", "body": "### Opening\n\n```ruby\npsd = PSD.new(file, parse_layer_images: true)\npsd.parse!\n```\n\n### Traversing\n\n```ruby\n# Gets the root node.\n# A #<Node> can be a Group or a Layer.\nnode = psd.tree\n```\n\n```ruby\nnode.root\nnode.descendants\nnode.ancestors\nnode.siblings\nnode.subtree\n```\n\n```ruby\nnode.descendant_groups\nnode.descendant_layers\n```\n\n### Layer info\n\n```ruby\nnode.name   #=> \"Layer 2\"\n```\n\n```ruby\nnode.top    #=> 3\nnode.left   #=> 3\nnode.bottom\nnode.right\n```\n\n```ruby\n# Note: these are interchanged (?)\nnode.width\nnode.height\n```\n\n```ruby\nnode.visible?\nnode.hidden?\n```\n\n```ruby\nnode.layer?\nnode.group?\n```\n\n```ruby\nnode.blending_mode  #=> \"normal\"\nnode.opacity        #=> 0..255\nnode.fill_opacity   #=> 0..255\n```\n\n### Layer text\n\n```ruby\nnode.text                  #=> (Hash)\nnode.text[:value]          #=> \"Text here\"\nnode.text[:font][:name]    #=> \"Arial\"\nnode.text[:font][:sizes]   #=> [6.9]\nnode.text[:font][:colors]  #=> [[255,255,255,255]]\nnode.text[:font][:css]     #=> \"font-family: ...;\"\nnode.text[:left]           #=> 3\nnode.text[:top]\nnode.text[:right]\nnode.text[:bottom]\nnode.text[:transform]      #=> (Hash)\n```\n\n### Layer effects\n\n```ruby\nfx = node.info[:object_effects]\n```\n\n```ruby\nfx.data['Scl ']   # ?\nfx.data['GrFl']   # Gradient fill\n```\n\n### Layer mask\n\n```ruby\nnode.mask[\"mask_size\"] == 0    # No mask\nnode.mask[\"mask_size\"] == 20   # Has mask\nnode.mask[\"top\"]\nnode.mask[\"left\"]\nnode.mask[\"bottom\"]\nnode.mask[\"right\"]\n```\n\n### Reference\n\n * [layervault/psd.rb](https://github.com/layervault/psd.rb) _(github.com)_"}

field_body:
### Opening

```ruby
psd = PSD.new(file, parse_layer_images: true)
psd.parse!
```

### Traversing

```ruby
# Gets the root node.
# A #<Node> can be a Group or a Layer.
node = psd.tree
```

```ruby
node.root
node.descendants
node.ancestors
node.siblings
node.subtree
```

```ruby
node.descendant_groups
node.descendant_layers
```

### Layer info

```ruby
node.name   #=> "Layer 2"
```

```ruby
node.top    #=> 3
node.left   #=> 3
node.bottom
node.right
```

```ruby
# Note: these are interchanged (?)
node.width
node.height
```

```ruby
node.visible?
node.hidden?
```

```ruby
node.layer?
node.group?
```

```ruby
node.blending_mode  #=> "normal"
node.opacity        #=> 0..255
node.fill_opacity   #=> 0..255
```

### Layer text

```ruby
node.text                  #=> (Hash)
node.text[:value]          #=> "Text here"
node.text[:font][:name]    #=> "Arial"
node.text[:font][:sizes]   #=> [6.9]
node.text[:font][:colors]  #=> [[255,255,255,255]]
node.text[:font][:css]     #=> "font-family: ...;"
node.text[:left]           #=> 3
node.text[:top]
node.text[:right]
node.text[:bottom]
node.text[:transform]      #=> (Hash)
```

### Layer effects

```ruby
fx = node.info[:object_effects]
```

```ruby
fx.data['Scl ']   # ?
fx.data['GrFl']   # Gradient fill
```

### Layer mask

```ruby
node.mask["mask_size"] == 0    # No mask
node.mask["mask_size"] == 20   # Has mask
node.mask["top"]
node.mask["left"]
node.mask["bottom"]
node.mask["right"]
```

### Reference

 * [layervault/psd.rb](https://github.com/layervault/psd.rb) _(github.com)_


id: pry
git_filename: ./pry.md
format: md
field_title: Pry
field_category: Ruby libraries
data:
{"title": "Pry", "category": "Ruby libraries", "body": "### About\n{: .-intro}\n\nPry is a runtime development console for Ruby.\n\n- <https://github.com/pry/pry>\n\n### cd\n\n```\n> cd Array\n```\n\n```nohighlight\n> ls\n  Array.methods: [] try_convert\n  Array#methods: & * + abbrev assoc at ...\n```\n\n```\n> show-source\n```\n\n### Code\n\n```nohighlight\n> show-method Array#select\n```\n\n### Docs\n\n```nohighlight\n> ri Array\n> ri Array#each\n\n> cd Gem\n> show-doc try_activate\n```\n\n### Finding\n\n```nohighlight\n> find-method each\n  Array#each\n  Array#each_index\n  Enumerable#each_slice\n  ...\n```\n\n### Editing\n\n    > edit Pry#repl\n\n### Gems\n\n    > gem-cd foo      # Switch to gem's dir\n    > gem-install foo\n    > gem-list\n\n### Misc commands\n\n    > hist          # History\n    > wtf?          # Trace of recent exception\n\n## Rails\n\n### Rails console\n\nAlso consider [pry-rails](https://rubygems.org/gems/pry-rails).\n\n    $ pry -r ./config/environment\n\n### Rails\n\n    > show-models\n    > show-routes\n    > show-middleware\n\n### ls\n\n    > ls         # All\n\n    > ls -m      # Methods\n    > ls -M      # Instance methods\n\n    > ls -g      # Globals\n    > ls -l      # Local vars\n    > ls -c      # Constants\n\n    > ls -i      # Instance vars\n\n    > ls -G xx   # Grep by regex\n\n## Shell integration\n\nshell-mode adds dir to the prompt.\n\n    pry(main)> shell-mode\n    pry(main):/home/x $\n\nCommands with `.` are shell commands.\n\n    pry(main)> .cat hello.txt\n\n## hirb\nAdd the [hirb](https://rubygems.org/gems/hirb) gem.\n\n    > table User.all\n    > view User.all\n    > view User.all, fields: %w[id name email]\n\n## pry-rescue\nAdd the [pry-rescue](https://github.com/ConradIrwin/pry-rescue) gem.\n\n```rb\nPry::rescue {\n  # raise exceptions here\n}\n```\n\nOr run:\n\n```\nbundle exec rescue rspec\n```\n\nAdditional commands:\n\n```\npry(main)> cd-cause\npry(main)> try-again\n```\n\n## pry-remote\nAdd the [pry-remote](https://github.com/Mon-Ouie/pry-remote) gem.\n\n```rb\n# In your code:\nbinding.remote_pry\n\n# In the shell:\nbundle exec pry-remote\n```\n\n## Reference\n\n * [Pry](https://github.com/pry/pry)\n * [Hirb](https://github.com/cldwalker/hirb)"}

field_body:
### About
{: .-intro}

Pry is a runtime development console for Ruby.

- <https://github.com/pry/pry>

### cd

```
> cd Array
```

```nohighlight
> ls
  Array.methods: [] try_convert
  Array#methods: & * + abbrev assoc at ...
```

```
> show-source
```

### Code

```nohighlight
> show-method Array#select
```

### Docs

```nohighlight
> ri Array
> ri Array#each

> cd Gem
> show-doc try_activate
```

### Finding

```nohighlight
> find-method each
  Array#each
  Array#each_index
  Enumerable#each_slice
  ...
```

### Editing

    > edit Pry#repl

### Gems

    > gem-cd foo      # Switch to gem's dir
    > gem-install foo
    > gem-list

### Misc commands

    > hist          # History
    > wtf?          # Trace of recent exception

## Rails

### Rails console

Also consider [pry-rails](https://rubygems.org/gems/pry-rails).

    $ pry -r ./config/environment

### Rails

    > show-models
    > show-routes
    > show-middleware

### ls

    > ls         # All

    > ls -m      # Methods
    > ls -M      # Instance methods

    > ls -g      # Globals
    > ls -l      # Local vars
    > ls -c      # Constants

    > ls -i      # Instance vars

    > ls -G xx   # Grep by regex

## Shell integration

shell-mode adds dir to the prompt.

    pry(main)> shell-mode
    pry(main):/home/x $

Commands with `.` are shell commands.

    pry(main)> .cat hello.txt

## hirb
Add the [hirb](https://rubygems.org/gems/hirb) gem.

    > table User.all
    > view User.all
    > view User.all, fields: %w[id name email]

## pry-rescue
Add the [pry-rescue](https://github.com/ConradIrwin/pry-rescue) gem.

```rb
Pry::rescue {
  # raise exceptions here
}
```

Or run:

```
bundle exec rescue rspec
```

Additional commands:

```
pry(main)> cd-cause
pry(main)> try-again
```

## pry-remote
Add the [pry-remote](https://github.com/Mon-Ouie/pry-remote) gem.

```rb
# In your code:
binding.remote_pry

# In the shell:
bundle exec pry-remote
```

## Reference

 * [Pry](https://github.com/pry/pry)
 * [Hirb](https://github.com/cldwalker/hirb)


id: promise
git_filename: ./promise.md
format: md
field_title: Promises
field_category: JavaScript
data:
{"title": "Promises", "category": "JavaScript", "body": "## Reference\n{:.-three-column}\n\n### Introduction\n{: .-intro}\n\nintro: A quick reference to the JavaScript [Promise API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).\n\n- [Using Promises guide](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) _(developer.mozilla.org)_\n- [Promise documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) _(developer.mozilla.org)_\n\n### Creating promises\n\n```js\nnew Promise((resolve, reject) => {\n  doStuff(() => {\n    if (success) {\n      resolve('good')\n    } else {\n      reject(new Error('oops'))\n    }\n  })\n})\n```\n\nUse [new Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Constructor) to create new promises.\n\n### Consuming promises\n\n```js\npromise\n  .then((result) => {\n    /* success */\n  })\n  .catch((error) => {\n    /* failure */\n  })\n```\n\n[then()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) runs a function when a promise resolves. [catch()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch) runs when a promise fails.\n\n### Multiple promises\n\n```js\nconst promises = [promise1(), promise2() /* ... */]\n```\n\n```js\n// Succeeds when all succeed\nPromise.all(promises).then((results) => {\n  /* ... */\n})\n```\n\n```js\n// Succeeds when one finishes first\nPromise.race(promises).then((result) => {\n  /* ... */\n})\n```\n\n### Converting other promises\n\n```js\nreturn Promise.resolve('result')\nreturn Promise.resolve(promise)\nreturn Promise.resolve(thenable)\n\nreturn Promise.reject('reason')\n\nPromise.resolve(result).then(() => {\n  /* ... */\n})\n```\n\n`Promise.resolve(val)` will return a promise that resolves to the value given to it."}

field_body:
## Reference
{:.-three-column}

### Introduction
{: .-intro}

intro: A quick reference to the JavaScript [Promise API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).

- [Using Promises guide](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises) _(developer.mozilla.org)_
- [Promise documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) _(developer.mozilla.org)_

### Creating promises

```js
new Promise((resolve, reject) => {
  doStuff(() => {
    if (success) {
      resolve('good')
    } else {
      reject(new Error('oops'))
    }
  })
})
```

Use [new Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise#Constructor) to create new promises.

### Consuming promises

```js
promise
  .then((result) => {
    /* success */
  })
  .catch((error) => {
    /* failure */
  })
```

[then()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) runs a function when a promise resolves. [catch()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch) runs when a promise fails.

### Multiple promises

```js
const promises = [promise1(), promise2() /* ... */]
```

```js
// Succeeds when all succeed
Promise.all(promises).then((results) => {
  /* ... */
})
```

```js
// Succeeds when one finishes first
Promise.race(promises).then((result) => {
  /* ... */
})
```

### Converting other promises

```js
return Promise.resolve('result')
return Promise.resolve(promise)
return Promise.resolve(thenable)

return Promise.reject('reason')

Promise.resolve(result).then(() => {
  /* ... */
})
```

`Promise.resolve(val)` will return a promise that resolves to the value given to it.


id: projectionist
git_filename: ./projectionist.md
format: md
field_title: Projectionist
field_category: Vim
data:
{"title": "Projectionist", "category": "Vim", "body": "### Basic usage\n\n```json\n/* .projectionist.vim */\n{\n  \"app/assets/react/components/*.jsx\": {\n    \"type\": \"component\",\n    \"template\": [\n      \"import React from 'react'\",\n      \"export default {} = React.createClass({ ... })\"\n    ]\n  }\n```\n\n### Available options\n\n```js\n{\n  \"lib/*.rb\": {\n    \"type\": \"lib\", /* enables :Elib */\n    \"alternate\": \"test/{}_spec.rb\", /* for :A */\n    \"template\": [ ... ],\n\n    \"path\": \"include\", /* for `gf` i think */\n\n    \"console\": \"node\", /* for :Console */\n    \"dispatch\": \"node\", /* for :Dispatch (dispatch.vim) */\n    \"start\": \"rails server\", /* for :Start (dispatch.vim) */\n    \"make\": \"node\", /* for makeprg */\n  }\n}\n```\n\n### Commands\n\n| Command | Description |\n|---------|-------------|\n| `:A` | Edit alternate |\n| `:A {file}` | Edit file |\n|---------|-------------|\n| `:AS` | Edit in split |\n| `:AV` | Edit in vsplit |\n| `:AT` | Edit in tab |\n|---------|-------------|\n| `:AD` | Replace with template |\n|---------|-------------|\n| `:Cd` | cd to root |\n| `:Cd {path}` | cd to path in root |\n| `:Lcd` | cd to root using :lcd |\n|---------|-------------|\n| `:ProjectDo {cmd}` | run command in root |\n\n### Reference\n\nSee [vim-projectionist](https://github.com/tpope/vim-projectionist)."}

field_body:
### Basic usage

```json
/* .projectionist.vim */
{
  "app/assets/react/components/*.jsx": {
    "type": "component",
    "template": [
      "import React from 'react'",
      "export default {} = React.createClass({ ... })"
    ]
  }
```

### Available options

```js
{
  "lib/*.rb": {
    "type": "lib", /* enables :Elib */
    "alternate": "test/{}_spec.rb", /* for :A */
    "template": [ ... ],

    "path": "include", /* for `gf` i think */

    "console": "node", /* for :Console */
    "dispatch": "node", /* for :Dispatch (dispatch.vim) */
    "start": "rails server", /* for :Start (dispatch.vim) */
    "make": "node", /* for makeprg */
  }
}
```

### Commands

| Command | Description |
|---------|-------------|
| `:A` | Edit alternate |
| `:A {file}` | Edit file |
|---------|-------------|
| `:AS` | Edit in split |
| `:AV` | Edit in vsplit |
| `:AT` | Edit in tab |
|---------|-------------|
| `:AD` | Replace with template |
|---------|-------------|
| `:Cd` | cd to root |
| `:Cd {path}` | cd to path in root |
| `:Lcd` | cd to root using :lcd |
|---------|-------------|
| `:ProjectDo {cmd}` | run command in root |

### Reference

See [vim-projectionist](https://github.com/tpope/vim-projectionist).


id: premailer
git_filename: ./premailer.md
format: md
field_title: Premailer
field_tags: WIP
field_intro: [Premailer](https://github.com/premailer/premailer/) is a Ruby library that inlines CSS into HTML.
data:
{"title": "Premailer", "tags": ["WIP"], "intro": "[Premailer](https://github.com/premailer/premailer/) is a Ruby library that inlines CSS into HTML.\n", "body": "### Custom CSS properties\n\n<!-- prettier-ignore -->\n```css\ntable, th, td {\n  /* Available on table, th and td elements */\n  -premailer-width: 32px;\n}\n\ntable, tr, th, td {\n  /* Available on table, tr, th and td elements */\n  -premailer-height: 32px;\n}\n\ntable {\n  /* Available on table elements */\n  -premailer-cellpadding: 32px;\n  -premailer-cellspacing: 32px;\n}\n```"}

field_body:
### Custom CSS properties

<!-- prettier-ignore -->
```css
table, th, td {
  /* Available on table, th and td elements */
  -premailer-width: 32px;
}

table, tr, th, td {
  /* Available on table, tr, th and td elements */
  -premailer-height: 32px;
}

table {
  /* Available on table elements */
  -premailer-cellpadding: 32px;
  -premailer-cellspacing: 32px;
}
```


id: postgresql
git_filename: ./postgresql.md
format: md
field_title: PostgreSQL
field_category: Databases
data:
{"title": "PostgreSQL", "category": "Databases", "body": "### Console\n\n    $ psql #logs in to default database & default user\n    $ sudo -u <rolename:postgres> psql #logs in with a particular user\n\nReplace anything within `<placeholder>` accordingly\n\n### Commands\n\n * Show roles: `\\du`\n * Show tables: `\\dt`\n * Show databases: `\\l`\n * Connect to a database: `\\c <database>`\n * Show columns of a table: `\\d <table>` or `\\d+ <table>`\n * Quit: `\\q`\n\n### Creating database\n\n     $ createdb databasename"}

field_body:
### Console

    $ psql #logs in to default database & default user
    $ sudo -u <rolename:postgres> psql #logs in with a particular user

Replace anything within `<placeholder>` accordingly

### Commands

 * Show roles: `\du`
 * Show tables: `\dt`
 * Show databases: `\l`
 * Connect to a database: `\c <database>`
 * Show columns of a table: `\d <table>` or `\d+ <table>`
 * Quit: `\q`

### Creating database

     $ createdb databasename


id: postgresql-json
git_filename: ./postgresql-json.md
format: md
field_title: PostgreSQL JSON
field_category: Databases
field_prism_languages: sql
field_updated: 2018-12-06
field_updated___timezone: UTC
data:
{"title": "PostgreSQL JSON", "prism_languages": ["sql"], "updated": "2018-12-06", "category": "Databases", "body": "## Operators\n\n### Accessors\n\n```sql\nSELECT * FROM users WHERE data->>'name' = 'John';\nSELECT data->>'name' AS name FROM users;\n```\n{: .-setup}\n\n| Operator       | Description                        | Example          | Returns |\n| ----           | ----                               | ----             | ----    |\n| `->` _int_     | Get array element `2`              | `data->2`        | JSON    |\n| `->` _text_    | Get object key `name`              | `data->'name'`   | JSON    |\n| `#>` _text[]_  | Get keypath `a,b` (eg, `data.a.b`) | `data#>'{a,b}'`  | JSON    |\n| -\n| `->>` _int_    | Get array element `2`              | `data->>2`       | Text    |\n| `->>` _text_   | Get object key `name`              | `data->>'name'`  | Text    |\n| `#>>` _text[]_ | Get keypath `a,b` (eg, `data.a.b`) | `data#>>'{a,b}'` | Text    |\n{: .-headers.-shortcuts}\n\n`>` returns JSON, `>>` returns text.\n\n### Boolean operators\n\n```sql\nSELECT * FROM users WHERE data->tags ? 'admin';\nSELECT data->tags ? 'admin' AS is_admin FROM users;\n```\n{: .-setup}\n\n| Operator      | Description                   | Example                          |\n| ----          | ----                          | ----                             |\n| `?` _str_     | Does `data` have key `name`?  | `data ? 'name'`                  |\n| `?|` _text[]_ | Does `data` have `a` or `b`?  | `data ?| array['a','b']`         |\n| `?&` _text[]_ | Does `data` have `a` and `b`? | `data ?& array['a','b']`         |\n| `@>` _jsonb_  | Does `left` include `right`?  | `data @> '{\"b\":2}'::jsonb`       |\n| `<@` _jsonb_  | Does `right` include `left`?  | `data <@ '{\"a\":1,\"b\":2}'::jsonb` |\n{: .-headers.-shortcuts.-left-align}\n\nWhen `?`/`?|`/`?&` works on objects, it checks keys; when it works on arrays, it checks for elements.\n\n## Updating\n\n### Arrays and objects\n\n```sql\nUPDATE users SET tags = tags || array['admin'];\n```\n{: .-setup}\n\n| Operator       |  Example                   |  Description\n| ----           |  ----                      |  ----\n| `||` _json_    |  `data || array['a','b']`  |  Concatenate\n| `-` _str_      |  `data - 'a'`              |  Delete a key\n| `-` _int_      |  `data - 1`                |  Delete an array item\n| `#-` _text[]_  |  `data #- '{us,name}'`     |  Delete a path\n{: .-headers.-shortcuts}\n\nOnly available in PostgreSQL 9.5+.\n\n### jsonb_set\n\n```sql\nUPDATE users SET data = jsonb_set(data, '{name}', '\"John\"');\n```\n\nOnly available in PostgreSQL 9.5+.\n\n## Functions\n\n#### fn(json) \u2192 json\n\n```sql\njsonb_set(data, '{path}', value)\njsonb_strip_nulls(data)\n```\n\n#### fn(\u00b7\u00b7\u00b7) \u2192 json\n\n```sql\nto_json(\"Hello\"::text)\narray_to_json('{1,2}'::int[])\n```\n\n#### Iteration\n\n```sql\nSELECT * from json_each('{\"a\":1, \"b\":2}')\nSELECT * from json_each_text('{\"a\":1, \"b\":2}')\n-- key | value\n```\n\nThis is an incomplete list, there's way too many!\n\nSee: [JSON functions](https://www.postgresql.org/docs/9.5/static/functions-json.html)\n\n## More examples\n\n- `'{\"a\":1}'::jsonb ? 'a'`\n- `'[\"a\"]'::jsonb ? 'a'`\n\n## References\n\n- <https://www.postgresql.org/docs/9.5/static/functions-json.html>\n- <https://www.postgresql.org/docs/9.5/static/datatype-json.html>"}

field_body:
## Operators

### Accessors

```sql
SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
```
{: .-setup}

| Operator       | Description                        | Example          | Returns |
| ----           | ----                               | ----             | ----    |
| `->` _int_     | Get array element `2`              | `data->2`        | JSON    |
| `->` _text_    | Get object key `name`              | `data->'name'`   | JSON    |
| `#>` _text[]_  | Get keypath `a,b` (eg, `data.a.b`) | `data#>'{a,b}'`  | JSON    |
| -
| `->>` _int_    | Get array element `2`              | `data->>2`       | Text    |
| `->>` _text_   | Get object key `name`              | `data->>'name'`  | Text    |
| `#>>` _text[]_ | Get keypath `a,b` (eg, `data.a.b`) | `data#>>'{a,b}'` | Text    |
{: .-headers.-shortcuts}

`>` returns JSON, `>>` returns text.

### Boolean operators

```sql
SELECT * FROM users WHERE data->tags ? 'admin';
SELECT data->tags ? 'admin' AS is_admin FROM users;
```
{: .-setup}

| Operator      | Description                   | Example                          |
| ----          | ----                          | ----                             |
| `?` _str_     | Does `data` have key `name`?  | `data ? 'name'`                  |
| `?|` _text[]_ | Does `data` have `a` or `b`?  | `data ?| array['a','b']`         |
| `?&` _text[]_ | Does `data` have `a` and `b`? | `data ?& array['a','b']`         |
| `@>` _jsonb_  | Does `left` include `right`?  | `data @> '{"b":2}'::jsonb`       |
| `<@` _jsonb_  | Does `right` include `left`?  | `data <@ '{"a":1,"b":2}'::jsonb` |
{: .-headers.-shortcuts.-left-align}

When `?`/`?|`/`?&` works on objects, it checks keys; when it works on arrays, it checks for elements.

## Updating

### Arrays and objects

```sql
UPDATE users SET tags = tags || array['admin'];
```
{: .-setup}

| Operator       |  Example                   |  Description
| ----           |  ----                      |  ----
| `||` _json_    |  `data || array['a','b']`  |  Concatenate
| `-` _str_      |  `data - 'a'`              |  Delete a key
| `-` _int_      |  `data - 1`                |  Delete an array item
| `#-` _text[]_  |  `data #- '{us,name}'`     |  Delete a path
{: .-headers.-shortcuts}

Only available in PostgreSQL 9.5+.

### jsonb_set

```sql
UPDATE users SET data = jsonb_set(data, '{name}', '"John"');
```

Only available in PostgreSQL 9.5+.

## Functions

#### fn(json) → json

```sql
jsonb_set(data, '{path}', value)
jsonb_strip_nulls(data)
```

#### fn(···) → json

```sql
to_json("Hello"::text)
array_to_json('{1,2}'::int[])
```

#### Iteration

```sql
SELECT * from json_each('{"a":1, "b":2}')
SELECT * from json_each_text('{"a":1, "b":2}')
-- key | value
```

This is an incomplete list, there's way too many!

See: [JSON functions](https://www.postgresql.org/docs/9.5/static/functions-json.html)

## More examples

- `'{"a":1}'::jsonb ? 'a'`
- `'["a"]'::jsonb ? 'a'`

## References

- <https://www.postgresql.org/docs/9.5/static/functions-json.html>
- <https://www.postgresql.org/docs/9.5/static/datatype-json.html>


id: polyfill.io
git_filename: ./polyfill.io.md
format: md
field_title: Polyfill.io
field_category: JavaScript libraries
field_intro: Polyfill.io is a service that serves JavaScript polyfills.
field_updated: 2024-06-26
field_updated___timezone: UTC
data:
{"title": "Polyfill.io", "category": "JavaScript libraries", "updated": "2024-06-26", "intro": "Polyfill.io is a service that serves JavaScript polyfills.\n", "body": "## Usage\n\n### Critical security warning\n\n\u26a0\ufe0f The polyfill.io CDN domain is currently being used in a web supply chain attack and is serving malicious code. **Remove any references to this domain from your codebase immediately**. Use alternative CDN providers like cdnjs.cloudflare.com as shown in the examples below.\n\n### Default usage\n\n```html\n<script src=\"https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js\"></script>\n```\n\n{: .-wrap}\n\nThis is the default script for Polyfill.io.\n\n### References\n\n* [Cloudflare now serves polyfill.io](https://blog.cloudflare.com/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk) _(blog.cloudflare.com)_\n\n## Optimized\n\n### For modern browsers\n\n```html\n<script>if(!(window.Promise&&[].includes&&Object.assign&&window.Map)){document.write('<script src=\"https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js\"></scr'+'ipt>')}</script>\n```\n\nThis only includes polyfill.io when necessary, skipping it for modern browsers for faster load times.\n\n### Extra features\n\n```html\n<script>if(!(window.fetch&&window.Promise&&[].includes&&Object.assign&&window.Map)){document.write('<script src=\"https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=default,fetch\"></scr'+'ipt>')}</script>\n```\n\nThis is the same as the previous, but also adds a polyfill for `window.fetch()`. We add a `window.fetch` check and loads the additional `fetch` feature."}

field_body:
## Usage

### Critical security warning

⚠️ The polyfill.io CDN domain is currently being used in a web supply chain attack and is serving malicious code. **Remove any references to this domain from your codebase immediately**. Use alternative CDN providers like cdnjs.cloudflare.com as shown in the examples below.

### Default usage

```html
<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js"></script>
```

{: .-wrap}

This is the default script for Polyfill.io.

### References

* [Cloudflare now serves polyfill.io](https://blog.cloudflare.com/polyfill-io-now-available-on-cdnjs-reduce-your-supply-chain-risk) _(blog.cloudflare.com)_

## Optimized

### For modern browsers

```html
<script>if(!(window.Promise&&[].includes&&Object.assign&&window.Map)){document.write('<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js"></scr'+'ipt>')}</script>
```

This only includes polyfill.io when necessary, skipping it for modern browsers for faster load times.

### Extra features

```html
<script>if(!(window.fetch&&window.Promise&&[].includes&&Object.assign&&window.Map)){document.write('<script src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.min.js?features=default,fetch"></scr'+'ipt>')}</script>
```

This is the same as the previous, but also adds a polyfill for `window.fetch()`. We add a `window.fetch` check and loads the additional `fetch` feature.


id: pnpm-lock
git_filename: ./pnpm-lock.yaml
format: yaml
data:
{"lockfileVersion": "6.0", "settings": {"autoInstallPeers": true, "excludeLinksFromLockfile": false}, "dependencies": {"@astrojs/partytown": {"specifier": "^2.0.2", "version": "2.0.4"}, "@astrojs/tailwind": {"specifier": "^5.1.0", "version": "5.1.0(astro@4.5.4)(tailwindcss@3.4.3)"}, "@astrojs/ts-plugin": {"specifier": "^1.3.1", "version": "1.6.0"}, "@fontsource/cousine": {"specifier": "^5.0.15", "version": "5.0.19"}, "@fontsource/manrope": {"specifier": "^5.0.19", "version": "5.0.19"}, "@mapbox/rehype-prism": {"specifier": "^0.8.0", "version": "0.8.0"}, "@playwright/test": {"specifier": "^1.53.1", "version": "1.53.1"}, "@rstacruz/rehype-sectionize": {"specifier": "^0.7.0", "version": "0.7.0"}, "@types/mapbox__rehype-prism": {"specifier": "^0.8.1", "version": "0.8.3"}, "@typescript-eslint/eslint-plugin": {"specifier": "^7.2.0", "version": "7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.8.3)"}, "@typescript-eslint/parser": {"specifier": "^7.2.0", "version": "7.2.0(eslint@8.57.0)(typescript@5.8.3)"}, "astro": {"specifier": "^4.0.3", "version": "4.5.4(sass@1.72.0)(typescript@5.8.3)"}, "autocompleter": {"specifier": "^9.1.0", "version": "9.1.2"}, "clsx": {"specifier": "^2.1.0", "version": "2.1.0"}, "concurrently": {"specifier": "^8.2.1", "version": "8.2.2"}, "eslint": {"specifier": "^8.52.0", "version": "8.57.0"}, "eslint-config-prettier": {"specifier": "^9.0.0", "version": "9.1.0(eslint@8.57.0)"}, "eslint-plugin-astro": {"specifier": "^0.31.4", "version": "0.31.4(eslint@8.57.0)"}, "eslint-plugin-jsx-a11y": {"specifier": "^6.7.1", "version": "6.8.0(eslint@8.57.0)"}, "fuse.js": {"specifier": "^6.6.2", "version": "6.6.2"}, "gray-matter": {"specifier": "^4.0.3", "version": "4.0.3"}, "happy-dom": {"specifier": "^12.9.1", "version": "12.10.3"}, "hint.css": {"specifier": "^2.7.0", "version": "2.7.0"}, "html-inline-external": {"specifier": "^1.0.10", "version": "1.0.10"}, "playwright": {"specifier": "^1.53.1", "version": "1.53.1"}, "prettier": {"specifier": "^3.0.3", "version": "3.2.5"}, "prettier-plugin-astro": {"specifier": "^0.13.0", "version": "0.13.0"}, "prettier-plugin-organize-imports": {"specifier": "^3.2.3", "version": "3.2.4(prettier@3.2.5)(typescript@5.8.3)"}, "prismjs": {"specifier": "1.29.0", "version": "1.29.0"}, "rehype-parse": {"specifier": "^9.0.0", "version": "9.0.0"}, "rehype-stringify": {"specifier": "^10.0.0", "version": "10.0.0"}, "sass": {"specifier": "^1.69.1", "version": "1.72.0"}, "snarkdown": {"specifier": "^2.0.0", "version": "2.0.0"}, "tailwindcss": {"specifier": "^3.4.3", "version": "3.4.3"}, "tsx": {"specifier": "^4.7.1", "version": "4.7.1"}, "unified": {"specifier": "^11.0.3", "version": "11.0.4"}, "vitest": {"specifier": "^1.4.0", "version": "1.4.0(happy-dom@12.10.3)(sass@1.72.0)"}, "zod": {"specifier": "^3.22.4", "version": "3.22.4"}}, "packages": {"/@aashutoshrathi/word-wrap@1.2.6": {"resolution": {"integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/@alloc/quick-lru@5.2.0": {"resolution": {"integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="}, "engines": {"node": ">=10"}, "dev": false}, "/@ampproject/remapping@2.3.0": {"resolution": {"integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="}, "engines": {"node": ">=6.0.0"}, "dependencies": {"@jridgewell/gen-mapping": "0.3.5", "@jridgewell/trace-mapping": "0.3.25"}, "dev": false}, "/@astrojs/compiler@1.8.2": {"resolution": {"integrity": "sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw=="}, "dev": false}, "/@astrojs/compiler@2.7.0": {"resolution": {"integrity": "sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA=="}, "dev": false}, "/@astrojs/internal-helpers@0.3.0": {"resolution": {"integrity": "sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g=="}, "dev": false}, "/@astrojs/markdown-remark@4.3.0": {"resolution": {"integrity": "sha512-iZOgYj/yNDvBRfKqkGuAvjeONhjQPq8Uk3HjyIgcTK5valq03NiUgSc5Ovq00yUVBeYJ/5EDx23c8xqtkkBlPw=="}, "dependencies": {"@astrojs/prism": "3.0.0", "github-slugger": "2.0.0", "hast-util-from-html": "2.0.1", "hast-util-to-text": "4.0.0", "import-meta-resolve": "4.0.0", "mdast-util-definitions": "6.0.0", "rehype-raw": "7.0.0", "rehype-stringify": "10.0.0", "remark-gfm": "4.0.0", "remark-parse": "11.0.0", "remark-rehype": "11.1.0", "remark-smartypants": "2.1.0", "shiki": "1.1.7", "unified": "11.0.4", "unist-util-remove-position": "5.0.0", "unist-util-visit": "5.0.0", "unist-util-visit-parents": "6.0.1", "vfile": "6.0.1"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@astrojs/partytown@2.0.4": {"resolution": {"integrity": "sha512-yC1smFLOBn7CWNAzaigXAr4bSJSgRJYF4g9jDuSR0NbShLd1SVUpRm9QOmOIrfSFGh2YtZEW8gnwvI5SZw+WmA=="}, "dependencies": {"@builder.io/partytown": "0.8.2", "mrmime": "1.0.1"}, "dev": false}, "/@astrojs/prism@3.0.0": {"resolution": {"integrity": "sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ=="}, "engines": {"node": ">=18.14.1"}, "dependencies": {"prismjs": "1.29.0"}, "dev": false}, "/@astrojs/tailwind@5.1.0(astro@4.5.4)(tailwindcss@3.4.3)": {"resolution": {"integrity": "sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig=="}, "peerDependencies": {"astro": "^3.0.0 || ^4.0.0", "tailwindcss": "^3.0.24"}, "dependencies": {"astro": "4.5.4(sass@1.72.0)(typescript@5.8.3)", "autoprefixer": "10.4.19(postcss@8.4.35)", "postcss": "8.4.35", "postcss-load-config": "4.0.2(postcss@8.4.35)", "tailwindcss": "3.4.3"}, "transitivePeerDependencies": ["ts-node"], "dev": false}, "/@astrojs/telemetry@3.0.4": {"resolution": {"integrity": "sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ=="}, "engines": {"node": ">=18.14.1"}, "dependencies": {"ci-info": "3.9.0", "debug": "4.3.4", "dlv": "1.1.3", "dset": "3.1.3", "is-docker": "3.0.0", "is-wsl": "3.1.0", "which-pm-runs": "1.1.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@astrojs/ts-plugin@1.6.0": {"resolution": {"integrity": "sha512-4ChbUPhMCQFajE7FmDQTZigtq8JM4cD8Z0m++po0QKUS0OgWYPBUo5wPhMPJgbIot8tf+e26xKWWcJqkGNl9gA=="}, "dependencies": {"@astrojs/compiler": "2.7.0", "@jridgewell/sourcemap-codec": "1.4.15", "@volar/language-core": "2.1.2", "@volar/typescript": "2.1.2", "semver": "7.6.0", "vscode-languageserver-textdocument": "1.0.11"}, "dev": false}, "/@babel/code-frame@7.23.5": {"resolution": {"integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/highlight": "7.23.4", "chalk": "2.4.2"}, "dev": false}, "/@babel/compat-data@7.23.5": {"resolution": {"integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/core@7.24.0": {"resolution": {"integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@ampproject/remapping": "2.3.0", "@babel/code-frame": "7.23.5", "@babel/generator": "7.23.6", "@babel/helper-compilation-targets": "7.23.6", "@babel/helper-module-transforms": "7.23.3(@babel/core@7.24.0)", "@babel/helpers": "7.24.0", "@babel/parser": "7.24.0", "@babel/template": "7.24.0", "@babel/traverse": "7.24.0", "@babel/types": "7.24.0", "convert-source-map": "2.0.0", "debug": "4.3.4", "gensync": "1.0.0-beta.2", "json5": "2.2.3", "semver": "6.3.1"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@babel/generator@7.23.6": {"resolution": {"integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0", "@jridgewell/gen-mapping": "0.3.5", "@jridgewell/trace-mapping": "0.3.25", "jsesc": "2.5.2"}, "dev": false}, "/@babel/helper-annotate-as-pure@7.22.5": {"resolution": {"integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-compilation-targets@7.23.6": {"resolution": {"integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/compat-data": "7.23.5", "@babel/helper-validator-option": "7.23.5", "browserslist": "4.23.0", "lru-cache": "5.1.1", "semver": "6.3.1"}, "dev": false}, "/@babel/helper-environment-visitor@7.22.20": {"resolution": {"integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/helper-function-name@7.23.0": {"resolution": {"integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/template": "7.24.0", "@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-hoist-variables@7.22.5": {"resolution": {"integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-module-imports@7.22.15": {"resolution": {"integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0)": {"resolution": {"integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ=="}, "engines": {"node": ">=6.9.0"}, "peerDependencies": {"@babel/core": "^7.0.0"}, "dependencies": {"@babel/core": "7.24.0", "@babel/helper-environment-visitor": "7.22.20", "@babel/helper-module-imports": "7.22.15", "@babel/helper-simple-access": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", "@babel/helper-validator-identifier": "7.22.20"}, "dev": false}, "/@babel/helper-plugin-utils@7.24.0": {"resolution": {"integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/helper-simple-access@7.22.5": {"resolution": {"integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-split-export-declaration@7.22.6": {"resolution": {"integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/helper-string-parser@7.23.4": {"resolution": {"integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/helper-validator-identifier@7.22.20": {"resolution": {"integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/helper-validator-option@7.23.5": {"resolution": {"integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/@babel/helpers@7.24.0": {"resolution": {"integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/template": "7.24.0", "@babel/traverse": "7.24.0", "@babel/types": "7.24.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@babel/highlight@7.23.4": {"resolution": {"integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/helper-validator-identifier": "7.22.20", "chalk": "2.4.2", "js-tokens": "4.0.0"}, "dev": false}, "/@babel/parser@7.24.0": {"resolution": {"integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg=="}, "engines": {"node": ">=6.0.0"}, "hasBin": true, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.24.0)": {"resolution": {"integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg=="}, "engines": {"node": ">=6.9.0"}, "peerDependencies": {"@babel/core": "^7.0.0-0"}, "dependencies": {"@babel/core": "7.24.0", "@babel/helper-plugin-utils": "7.24.0"}, "dev": false}, "/@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.0)": {"resolution": {"integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA=="}, "engines": {"node": ">=6.9.0"}, "peerDependencies": {"@babel/core": "^7.0.0-0"}, "dependencies": {"@babel/core": "7.24.0", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-module-imports": "7.22.15", "@babel/helper-plugin-utils": "7.24.0", "@babel/plugin-syntax-jsx": "7.23.3(@babel/core@7.24.0)", "@babel/types": "7.24.0"}, "dev": false}, "/@babel/runtime@7.24.0": {"resolution": {"integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"regenerator-runtime": "0.14.1"}, "dev": false}, "/@babel/template@7.24.0": {"resolution": {"integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/code-frame": "7.23.5", "@babel/parser": "7.24.0", "@babel/types": "7.24.0"}, "dev": false}, "/@babel/traverse@7.24.0": {"resolution": {"integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/code-frame": "7.23.5", "@babel/generator": "7.23.6", "@babel/helper-environment-visitor": "7.22.20", "@babel/helper-function-name": "7.23.0", "@babel/helper-hoist-variables": "7.22.5", "@babel/helper-split-export-declaration": "7.22.6", "@babel/parser": "7.24.0", "@babel/types": "7.24.0", "debug": "4.3.4", "globals": "11.12.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@babel/types@7.24.0": {"resolution": {"integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w=="}, "engines": {"node": ">=6.9.0"}, "dependencies": {"@babel/helper-string-parser": "7.23.4", "@babel/helper-validator-identifier": "7.22.20", "to-fast-properties": "2.0.0"}, "dev": false}, "/@builder.io/partytown@0.8.2": {"resolution": {"integrity": "sha512-WKGE+SO0qUGirW8J+xOWkHeCkfFEoPPvHnFkcdMl+MY3kDbAcTwjZCzjg27JCvoD0h8fH47FR7DSIss0/S5lyg=="}, "engines": {"node": ">=18.0.0"}, "hasBin": true, "dev": false}, "/@esbuild/aix-ppc64@0.19.12": {"resolution": {"integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="}, "engines": {"node": ">=12"}, "cpu": ["ppc64"], "os": ["aix"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/android-arm64@0.19.12": {"resolution": {"integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="}, "engines": {"node": ">=12"}, "cpu": ["arm64"], "os": ["android"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/android-arm@0.19.12": {"resolution": {"integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="}, "engines": {"node": ">=12"}, "cpu": ["arm"], "os": ["android"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/android-x64@0.19.12": {"resolution": {"integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["android"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/darwin-arm64@0.19.12": {"resolution": {"integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="}, "engines": {"node": ">=12"}, "cpu": ["arm64"], "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/darwin-x64@0.19.12": {"resolution": {"integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/freebsd-arm64@0.19.12": {"resolution": {"integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="}, "engines": {"node": ">=12"}, "cpu": ["arm64"], "os": ["freebsd"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/freebsd-x64@0.19.12": {"resolution": {"integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["freebsd"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-arm64@0.19.12": {"resolution": {"integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="}, "engines": {"node": ">=12"}, "cpu": ["arm64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-arm@0.19.12": {"resolution": {"integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="}, "engines": {"node": ">=12"}, "cpu": ["arm"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-ia32@0.19.12": {"resolution": {"integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="}, "engines": {"node": ">=12"}, "cpu": ["ia32"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-loong64@0.19.12": {"resolution": {"integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="}, "engines": {"node": ">=12"}, "cpu": ["loong64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-mips64el@0.19.12": {"resolution": {"integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="}, "engines": {"node": ">=12"}, "cpu": ["mips64el"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-ppc64@0.19.12": {"resolution": {"integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="}, "engines": {"node": ">=12"}, "cpu": ["ppc64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-riscv64@0.19.12": {"resolution": {"integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="}, "engines": {"node": ">=12"}, "cpu": ["riscv64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-s390x@0.19.12": {"resolution": {"integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="}, "engines": {"node": ">=12"}, "cpu": ["s390x"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/linux-x64@0.19.12": {"resolution": {"integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/netbsd-x64@0.19.12": {"resolution": {"integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["netbsd"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/openbsd-x64@0.19.12": {"resolution": {"integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["openbsd"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/sunos-x64@0.19.12": {"resolution": {"integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["sunos"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/win32-arm64@0.19.12": {"resolution": {"integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="}, "engines": {"node": ">=12"}, "cpu": ["arm64"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/win32-ia32@0.19.12": {"resolution": {"integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="}, "engines": {"node": ">=12"}, "cpu": ["ia32"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@esbuild/win32-x64@0.19.12": {"resolution": {"integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="}, "engines": {"node": ">=12"}, "cpu": ["x64"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)": {"resolution": {"integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "peerDependencies": {"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"}, "dependencies": {"eslint": "8.57.0", "eslint-visitor-keys": "3.4.3"}, "dev": false}, "/@eslint-community/regexpp@4.10.0": {"resolution": {"integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="}, "engines": {"node": "^12.0.0 || ^14.0.0 || >=16.0.0"}, "dev": false}, "/@eslint/eslintrc@2.1.4": {"resolution": {"integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dependencies": {"ajv": "6.12.6", "debug": "4.3.4", "espree": "9.6.1", "globals": "13.24.0", "ignore": "5.3.1", "import-fresh": "3.3.0", "js-yaml": "4.1.0", "minimatch": "3.1.2", "strip-json-comments": "3.1.1"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@eslint/js@8.57.0": {"resolution": {"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dev": false}, "/@fontsource/cousine@5.0.19": {"resolution": {"integrity": "sha512-pvVlYm3a7rwi3OVJpHMf2fuP8SM0Zb95pCgCxM+i4HvAWybz+/BS0cfrqedLk35MsR6oHsUgI4pCYDVeq+PwXw=="}, "dev": false}, "/@fontsource/manrope@5.0.19": {"resolution": {"integrity": "sha512-5AbXsYyl9pwc60VnfWcWoq7gNggaByqINfD/hTBUrvqpm2AzZTqqpkQzfff3SMWR6mJIXQjBgrn/OzR9wPkcdg=="}, "dev": false}, "/@humanwhocodes/config-array@0.11.14": {"resolution": {"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="}, "engines": {"node": ">=10.10.0"}, "dependencies": {"@humanwhocodes/object-schema": "2.0.2", "debug": "4.3.4", "minimatch": "3.1.2"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@humanwhocodes/module-importer@1.0.1": {"resolution": {"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="}, "engines": {"node": ">=12.22"}, "dev": false}, "/@humanwhocodes/object-schema@2.0.2": {"resolution": {"integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw=="}, "dev": false}, "/@isaacs/cliui@8.0.2": {"resolution": {"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="}, "engines": {"node": ">=12"}, "dependencies": {"string-width": "5.1.2", "string-width-cjs": "/string-width@4.2.3", "strip-ansi": "7.1.0", "strip-ansi-cjs": "/strip-ansi@6.0.1", "wrap-ansi": "8.1.0", "wrap-ansi-cjs": "/wrap-ansi@7.0.0"}, "dev": false}, "/@jest/schemas@29.6.3": {"resolution": {"integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="}, "engines": {"node": "^14.15.0 || ^16.10.0 || >=18.0.0"}, "dependencies": {"@sinclair/typebox": "0.27.8"}, "dev": false}, "/@jridgewell/gen-mapping@0.3.5": {"resolution": {"integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg=="}, "engines": {"node": ">=6.0.0"}, "dependencies": {"@jridgewell/set-array": "1.2.1", "@jridgewell/sourcemap-codec": "1.4.15", "@jridgewell/trace-mapping": "0.3.25"}, "dev": false}, "/@jridgewell/resolve-uri@3.1.2": {"resolution": {"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="}, "engines": {"node": ">=6.0.0"}, "dev": false}, "/@jridgewell/set-array@1.2.1": {"resolution": {"integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="}, "engines": {"node": ">=6.0.0"}, "dev": false}, "/@jridgewell/sourcemap-codec@1.4.15": {"resolution": {"integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="}, "dev": false}, "/@jridgewell/trace-mapping@0.3.25": {"resolution": {"integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="}, "dependencies": {"@jridgewell/resolve-uri": "3.1.2", "@jridgewell/sourcemap-codec": "1.4.15"}, "dev": false}, "/@mapbox/rehype-prism@0.8.0": {"resolution": {"integrity": "sha512-bIz4a3oZ8g+pQBHSMMIxNpYOMX4yq4aZdpezoiCl9yJudh1Z9SRmHQqH6f+WtTBNOORzXMEGkvBze4PiH17wtA=="}, "engines": {"node": ">=10"}, "dependencies": {"hast-util-to-string": "1.0.4", "mrm": "3.0.10", "refractor": "3.6.0", "unist-util-visit": "2.0.3"}, "dev": false}, "/@nodelib/fs.scandir@2.1.5": {"resolution": {"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="}, "engines": {"node": ">= 8"}, "dependencies": {"@nodelib/fs.stat": "2.0.5", "run-parallel": "1.2.0"}, "dev": false}, "/@nodelib/fs.stat@2.0.5": {"resolution": {"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="}, "engines": {"node": ">= 8"}, "dev": false}, "/@nodelib/fs.walk@1.2.8": {"resolution": {"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="}, "engines": {"node": ">= 8"}, "dependencies": {"@nodelib/fs.scandir": "2.1.5", "fastq": "1.17.1"}, "dev": false}, "/@one-ini/wasm@0.1.1": {"resolution": {"integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw=="}, "dev": false}, "/@pkgjs/parseargs@0.11.0": {"resolution": {"integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="}, "engines": {"node": ">=14"}, "requiresBuild": true, "dev": false, "optional": true}, "/@pkgr/core@0.1.1": {"resolution": {"integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA=="}, "engines": {"node": "^12.20.0 || ^14.18.0 || >=16.0.0"}, "dev": false}, "/@playwright/test@1.53.1": {"resolution": {"integrity": "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w=="}, "engines": {"node": ">=18"}, "hasBin": true, "dependencies": {"playwright": "1.53.1"}, "dev": false}, "/@rollup/rollup-android-arm-eabi@4.13.0": {"resolution": {"integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg=="}, "cpu": ["arm"], "os": ["android"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-android-arm64@4.13.0": {"resolution": {"integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q=="}, "cpu": ["arm64"], "os": ["android"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-darwin-arm64@4.13.0": {"resolution": {"integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g=="}, "cpu": ["arm64"], "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-darwin-x64@4.13.0": {"resolution": {"integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg=="}, "cpu": ["x64"], "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-arm-gnueabihf@4.13.0": {"resolution": {"integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ=="}, "cpu": ["arm"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-arm64-gnu@4.13.0": {"resolution": {"integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w=="}, "cpu": ["arm64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-arm64-musl@4.13.0": {"resolution": {"integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw=="}, "cpu": ["arm64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-riscv64-gnu@4.13.0": {"resolution": {"integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA=="}, "cpu": ["riscv64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-x64-gnu@4.13.0": {"resolution": {"integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA=="}, "cpu": ["x64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-linux-x64-musl@4.13.0": {"resolution": {"integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw=="}, "cpu": ["x64"], "os": ["linux"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-win32-arm64-msvc@4.13.0": {"resolution": {"integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA=="}, "cpu": ["arm64"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-win32-ia32-msvc@4.13.0": {"resolution": {"integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw=="}, "cpu": ["ia32"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@rollup/rollup-win32-x64-msvc@4.13.0": {"resolution": {"integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw=="}, "cpu": ["x64"], "os": ["win32"], "requiresBuild": true, "dev": false, "optional": true}, "/@rstacruz/rehype-sectionize@0.7.0": {"resolution": {"integrity": "sha512-1ptHrkl0siVsG9NcmNLGmT3xVc/hBolCP+wxOQ/ZsXxQt6tLETgUN5SUSXmH8Zsv9hhfLozee5wwp9BAvt0+oA=="}, "dependencies": {"unist-util-visit": "4.1.2"}, "dev": false}, "/@shikijs/core@1.1.7": {"resolution": {"integrity": "sha512-gTYLUIuD1UbZp/11qozD3fWpUTuMqPSf3svDMMrL0UmlGU7D9dPw/V1FonwAorCUJBltaaESxq90jrSjQyGixg=="}, "dev": false}, "/@sinclair/typebox@0.27.8": {"resolution": {"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="}, "dev": false}, "/@sindresorhus/is@0.14.0": {"resolution": {"integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="}, "engines": {"node": ">=6"}, "dev": false}, "/@szmarczak/http-timer@1.1.2": {"resolution": {"integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA=="}, "engines": {"node": ">=6"}, "dependencies": {"defer-to-connect": "1.1.3"}, "dev": false}, "/@tootallnate/once@1.1.2": {"resolution": {"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="}, "engines": {"node": ">= 6"}, "dev": false}, "/@types/babel__core@7.20.5": {"resolution": {"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="}, "dependencies": {"@babel/parser": "7.24.0", "@babel/types": "7.24.0", "@types/babel__generator": "7.6.8", "@types/babel__template": "7.4.4", "@types/babel__traverse": "7.20.5"}, "dev": false}, "/@types/babel__generator@7.6.8": {"resolution": {"integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw=="}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@types/babel__template@7.4.4": {"resolution": {"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="}, "dependencies": {"@babel/parser": "7.24.0", "@babel/types": "7.24.0"}, "dev": false}, "/@types/babel__traverse@7.20.5": {"resolution": {"integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ=="}, "dependencies": {"@babel/types": "7.24.0"}, "dev": false}, "/@types/debug@4.1.12": {"resolution": {"integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="}, "dependencies": {"@types/ms": "0.7.34"}, "dev": false}, "/@types/estree@1.0.5": {"resolution": {"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="}, "dev": false}, "/@types/hast@2.3.10": {"resolution": {"integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="}, "dependencies": {"@types/unist": "2.0.10"}, "dev": false}, "/@types/hast@3.0.4": {"resolution": {"integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="}, "dependencies": {"@types/unist": "3.0.2"}, "dev": false}, "/@types/json-schema@7.0.15": {"resolution": {"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="}, "dev": false}, "/@types/keyv@3.1.4": {"resolution": {"integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="}, "dependencies": {"@types/node": "20.11.28"}, "dev": false}, "/@types/mapbox__rehype-prism@0.8.3": {"resolution": {"integrity": "sha512-ayRTSAVHT0XpvKmx5GFN5luxwabuPb3EL06b3hRU0mnv30ETdcGmguk6C20R5EFVv6bWsfG8Jh6OUf+mMIqLdw=="}, "dependencies": {"@types/hast": "2.3.10", "unified": "10.1.2"}, "dev": false}, "/@types/mdast@4.0.3": {"resolution": {"integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg=="}, "dependencies": {"@types/unist": "3.0.2"}, "dev": false}, "/@types/ms@0.7.34": {"resolution": {"integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="}, "dev": false}, "/@types/nlcst@1.0.4": {"resolution": {"integrity": "sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg=="}, "dependencies": {"@types/unist": "2.0.10"}, "dev": false}, "/@types/node@20.11.28": {"resolution": {"integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA=="}, "dependencies": {"undici-types": "5.26.5"}, "dev": false}, "/@types/responselike@1.0.3": {"resolution": {"integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="}, "dependencies": {"@types/node": "20.11.28"}, "dev": false}, "/@types/semver@7.5.8": {"resolution": {"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="}, "dev": false}, "/@types/unist@2.0.10": {"resolution": {"integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="}, "dev": false}, "/@types/unist@3.0.2": {"resolution": {"integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="}, "dev": false}, "/@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "peerDependencies": {"@typescript-eslint/parser": "^7.0.0", "eslint": "^8.56.0", "typescript": "*"}, "peerDependenciesMeta": {"typescript": {"optional": true}}, "dependencies": {"@eslint-community/regexpp": "4.10.0", "@typescript-eslint/parser": "7.2.0(eslint@8.57.0)(typescript@5.8.3)", "@typescript-eslint/scope-manager": "7.2.0", "@typescript-eslint/type-utils": "7.2.0(eslint@8.57.0)(typescript@5.8.3)", "@typescript-eslint/utils": "7.2.0(eslint@8.57.0)(typescript@5.8.3)", "@typescript-eslint/visitor-keys": "7.2.0", "debug": "4.3.4", "eslint": "8.57.0", "graphemer": "1.4.0", "ignore": "5.3.1", "natural-compare": "1.4.0", "semver": "7.6.0", "ts-api-utils": "1.3.0(typescript@5.8.3)", "typescript": "5.8.3"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "peerDependencies": {"eslint": "^8.56.0", "typescript": "*"}, "peerDependenciesMeta": {"typescript": {"optional": true}}, "dependencies": {"@typescript-eslint/scope-manager": "7.2.0", "@typescript-eslint/types": "7.2.0", "@typescript-eslint/typescript-estree": "7.2.0(typescript@5.8.3)", "@typescript-eslint/visitor-keys": "7.2.0", "debug": "4.3.4", "eslint": "8.57.0", "typescript": "5.8.3"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@typescript-eslint/scope-manager@5.62.0": {"resolution": {"integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dependencies": {"@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0"}, "dev": false}, "/@typescript-eslint/scope-manager@7.2.0": {"resolution": {"integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "dependencies": {"@typescript-eslint/types": "7.2.0", "@typescript-eslint/visitor-keys": "7.2.0"}, "dev": false}, "/@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "peerDependencies": {"eslint": "^8.56.0", "typescript": "*"}, "peerDependenciesMeta": {"typescript": {"optional": true}}, "dependencies": {"@typescript-eslint/typescript-estree": "7.2.0(typescript@5.8.3)", "@typescript-eslint/utils": "7.2.0(eslint@8.57.0)(typescript@5.8.3)", "debug": "4.3.4", "eslint": "8.57.0", "ts-api-utils": "1.3.0(typescript@5.8.3)", "typescript": "5.8.3"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@typescript-eslint/types@5.62.0": {"resolution": {"integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dev": false}, "/@typescript-eslint/types@7.2.0": {"resolution": {"integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "dev": false}, "/@typescript-eslint/typescript-estree@7.2.0(typescript@5.8.3)": {"resolution": {"integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "peerDependencies": {"typescript": "*"}, "peerDependenciesMeta": {"typescript": {"optional": true}}, "dependencies": {"@typescript-eslint/types": "7.2.0", "@typescript-eslint/visitor-keys": "7.2.0", "debug": "4.3.4", "globby": "11.1.0", "is-glob": "4.0.3", "minimatch": "9.0.3", "semver": "7.6.0", "ts-api-utils": "1.3.0(typescript@5.8.3)", "typescript": "5.8.3"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "peerDependencies": {"eslint": "^8.56.0"}, "dependencies": {"@eslint-community/eslint-utils": "4.4.0(eslint@8.57.0)", "@types/json-schema": "7.0.15", "@types/semver": "7.5.8", "@typescript-eslint/scope-manager": "7.2.0", "@typescript-eslint/types": "7.2.0", "@typescript-eslint/typescript-estree": "7.2.0(typescript@5.8.3)", "eslint": "8.57.0", "semver": "7.6.0"}, "transitivePeerDependencies": ["supports-color", "typescript"], "dev": false}, "/@typescript-eslint/visitor-keys@5.62.0": {"resolution": {"integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dependencies": {"@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "3.4.3"}, "dev": false}, "/@typescript-eslint/visitor-keys@7.2.0": {"resolution": {"integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A=="}, "engines": {"node": "^16.0.0 || >=18.0.0"}, "dependencies": {"@typescript-eslint/types": "7.2.0", "eslint-visitor-keys": "3.4.3"}, "dev": false}, "/@ungap/structured-clone@1.2.0": {"resolution": {"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="}, "dev": false}, "/@vitest/expect@1.4.0": {"resolution": {"integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA=="}, "dependencies": {"@vitest/spy": "1.4.0", "@vitest/utils": "1.4.0", "chai": "4.4.1"}, "dev": false}, "/@vitest/runner@1.4.0": {"resolution": {"integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg=="}, "dependencies": {"@vitest/utils": "1.4.0", "p-limit": "5.0.0", "pathe": "1.1.2"}, "dev": false}, "/@vitest/snapshot@1.4.0": {"resolution": {"integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A=="}, "dependencies": {"magic-string": "0.30.8", "pathe": "1.1.2", "pretty-format": "29.7.0"}, "dev": false}, "/@vitest/spy@1.4.0": {"resolution": {"integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q=="}, "dependencies": {"tinyspy": "2.2.1"}, "dev": false}, "/@vitest/utils@1.4.0": {"resolution": {"integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg=="}, "dependencies": {"diff-sequences": "29.6.3", "estree-walker": "3.0.3", "loupe": "2.3.7", "pretty-format": "29.7.0"}, "dev": false}, "/@volar/language-core@2.1.2": {"resolution": {"integrity": "sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA=="}, "dependencies": {"@volar/source-map": "2.1.2"}, "dev": false}, "/@volar/source-map@2.1.2": {"resolution": {"integrity": "sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q=="}, "dependencies": {"muggle-string": "0.4.1"}, "dev": false}, "/@volar/typescript@2.1.2": {"resolution": {"integrity": "sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ=="}, "dependencies": {"@volar/language-core": "2.1.2", "path-browserify": "1.0.1"}, "dev": false}, "/abab@2.0.6": {"resolution": {"integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="}, "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": false}, "/abbrev@2.0.0": {"resolution": {"integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="}, "engines": {"node": "^14.17.0 || ^16.13.0 || >=18.0.0"}, "dev": false}, "/acorn-globals@6.0.0": {"resolution": {"integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg=="}, "dependencies": {"acorn": "7.4.1", "acorn-walk": "7.2.0"}, "dev": false}, "/acorn-jsx@5.3.2(acorn@8.11.3)": {"resolution": {"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="}, "peerDependencies": {"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"}, "dependencies": {"acorn": "8.11.3"}, "dev": false}, "/acorn-walk@7.2.0": {"resolution": {"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="}, "engines": {"node": ">=0.4.0"}, "dev": false}, "/acorn-walk@8.3.2": {"resolution": {"integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="}, "engines": {"node": ">=0.4.0"}, "dev": false}, "/acorn@7.4.1": {"resolution": {"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="}, "engines": {"node": ">=0.4.0"}, "hasBin": true, "dev": false}, "/acorn@8.11.3": {"resolution": {"integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg=="}, "engines": {"node": ">=0.4.0"}, "hasBin": true, "dev": false}, "/agent-base@6.0.2": {"resolution": {"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="}, "engines": {"node": ">= 6.0.0"}, "dependencies": {"debug": "4.3.4"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/ajv@6.12.6": {"resolution": {"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="}, "dependencies": {"fast-deep-equal": "3.1.3", "fast-json-stable-stringify": "2.1.0", "json-schema-traverse": "0.4.1", "uri-js": "4.4.1"}, "dev": false}, "/ansi-align@2.0.0": {"resolution": {"integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA=="}, "dependencies": {"string-width": "2.1.1"}, "dev": false}, "/ansi-align@3.0.1": {"resolution": {"integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="}, "dependencies": {"string-width": "4.2.3"}, "dev": false}, "/ansi-escapes@4.3.2": {"resolution": {"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="}, "engines": {"node": ">=8"}, "dependencies": {"type-fest": "0.21.3"}, "dev": false}, "/ansi-regex@2.1.1": {"resolution": {"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/ansi-regex@3.0.1": {"resolution": {"integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="}, "engines": {"node": ">=4"}, "dev": false}, "/ansi-regex@4.1.1": {"resolution": {"integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="}, "engines": {"node": ">=6"}, "dev": false}, "/ansi-regex@5.0.1": {"resolution": {"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/ansi-regex@6.0.1": {"resolution": {"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA=="}, "engines": {"node": ">=12"}, "dev": false}, "/ansi-styles@2.2.1": {"resolution": {"integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/ansi-styles@3.2.1": {"resolution": {"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="}, "engines": {"node": ">=4"}, "dependencies": {"color-convert": "1.9.3"}, "dev": false}, "/ansi-styles@4.3.0": {"resolution": {"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="}, "engines": {"node": ">=8"}, "dependencies": {"color-convert": "2.0.1"}, "dev": false}, "/ansi-styles@5.2.0": {"resolution": {"integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="}, "engines": {"node": ">=10"}, "dev": false}, "/ansi-styles@6.2.1": {"resolution": {"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="}, "engines": {"node": ">=12"}, "dev": false}, "/any-promise@1.3.0": {"resolution": {"integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="}, "dev": false}, "/anymatch@3.1.3": {"resolution": {"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="}, "engines": {"node": ">= 8"}, "dependencies": {"normalize-path": "3.0.0", "picomatch": "2.3.1"}, "dev": false}, "/arch@2.2.0": {"resolution": {"integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="}, "dev": false}, "/arg@5.0.2": {"resolution": {"integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="}, "dev": false}, "/argparse@1.0.10": {"resolution": {"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="}, "dependencies": {"sprintf-js": "1.0.3"}, "dev": false}, "/argparse@2.0.1": {"resolution": {"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="}, "dev": false}, "/aria-query@5.3.0": {"resolution": {"integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="}, "dependencies": {"dequal": "2.0.3"}, "dev": false}, "/array-buffer-byte-length@1.0.1": {"resolution": {"integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "is-array-buffer": "3.0.4"}, "dev": false}, "/array-includes@3.1.7": {"resolution": {"integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "get-intrinsic": "1.2.4", "is-string": "1.0.7"}, "dev": false}, "/array-iterate@2.0.1": {"resolution": {"integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="}, "dev": false}, "/array-union@2.1.0": {"resolution": {"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="}, "engines": {"node": ">=8"}, "dev": false}, "/array.prototype.flat@1.3.2": {"resolution": {"integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "es-shim-unscopables": "1.0.2"}, "dev": false}, "/array.prototype.flatmap@1.3.2": {"resolution": {"integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "es-shim-unscopables": "1.0.2"}, "dev": false}, "/arraybuffer.prototype.slice@1.0.3": {"resolution": {"integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"array-buffer-byte-length": "1.0.1", "call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "es-errors": "1.3.0", "get-intrinsic": "1.2.4", "is-array-buffer": "3.0.4", "is-shared-array-buffer": "1.0.3"}, "dev": false}, "/assertion-error@1.1.0": {"resolution": {"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="}, "dev": false}, "/ast-types-flow@0.0.8": {"resolution": {"integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="}, "dev": false}, "/astro-eslint-parser@0.16.3": {"resolution": {"integrity": "sha512-CGaBseNtunAV2DCpwBXqTKq8+9Tw65XZetMaC0FsMoZuLj0gxNIkbCf2QyKYScVrNOU7/ayfNdVw8ZCSHBiqCg=="}, "engines": {"node": "^14.18.0 || >=16.0.0"}, "dependencies": {"@astrojs/compiler": "2.7.0", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "astrojs-compiler-sync": "0.3.5(@astrojs/compiler@2.7.0)", "debug": "4.3.4", "entities": "4.5.0", "eslint-visitor-keys": "3.4.3", "espree": "9.6.1", "semver": "7.6.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/astro@4.5.4(sass@1.72.0)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-qwMyBn36wXvaCzdCmdbyCxLQGG5hTa3saNdHdqS20Yn1b7Z7oqqcWOb2UjFuq6O8dFqZxU8Hq0/pGFscvsYtJA=="}, "engines": {"node": ">=18.14.1", "npm": ">=6.14.0"}, "hasBin": true, "dependencies": {"@astrojs/compiler": "2.7.0", "@astrojs/internal-helpers": "0.3.0", "@astrojs/markdown-remark": "4.3.0", "@astrojs/telemetry": "3.0.4", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/parser": "7.24.0", "@babel/plugin-transform-react-jsx": "7.23.4(@babel/core@7.24.0)", "@babel/traverse": "7.24.0", "@babel/types": "7.24.0", "@types/babel__core": "7.20.5", "acorn": "8.11.3", "aria-query": "5.3.0", "axobject-query": "4.0.0", "boxen": "7.1.1", "chokidar": "3.6.0", "ci-info": "4.0.0", "clsx": "2.1.0", "common-ancestor-path": "1.0.1", "cookie": "0.6.0", "cssesc": "3.0.0", "debug": "4.3.4", "deterministic-object-hash": "2.0.2", "devalue": "4.3.2", "diff": "5.2.0", "dlv": "1.1.3", "dset": "3.1.3", "es-module-lexer": "1.4.1", "esbuild": "0.19.12", "estree-walker": "3.0.3", "execa": "8.0.1", "fast-glob": "3.3.2", "flattie": "1.1.1", "github-slugger": "2.0.0", "gray-matter": "4.0.3", "html-escaper": "3.0.3", "http-cache-semantics": "4.1.1", "js-yaml": "4.1.0", "kleur": "4.1.5", "magic-string": "0.30.8", "mime": "3.0.0", "ora": "7.0.1", "p-limit": "5.0.0", "p-queue": "8.0.1", "path-to-regexp": "6.2.1", "preferred-pm": "3.1.3", "prompts": "2.4.2", "rehype": "13.0.1", "resolve": "1.22.8", "semver": "7.6.0", "shiki": "1.1.7", "string-width": "7.1.0", "strip-ansi": "7.1.0", "tsconfck": "3.0.3(typescript@5.8.3)", "unist-util-visit": "5.0.0", "vfile": "6.0.1", "vite": "5.1.6(sass@1.72.0)", "vitefu": "0.2.5(vite@5.1.6)", "which-pm": "2.1.1", "yargs-parser": "21.1.1", "zod": "3.22.4", "zod-to-json-schema": "3.22.4(zod@3.22.4)"}, "optionalDependencies": {"sharp": "0.32.6"}, "transitivePeerDependencies": ["@types/node", "bare-buffer", "less", "lightningcss", "sass", "stylus", "sugarss", "supports-color", "terser", "typescript"], "dev": false}, "/astrojs-compiler-sync@0.3.5(@astrojs/compiler@2.7.0)": {"resolution": {"integrity": "sha512-y420rhIIJ2HHDkYeqKArBHSdJNIIGMztLH90KGIX3zjcJyt/cr9Z2wYA8CP5J1w6KE7xqMh0DAkhfjhNDpQb2Q=="}, "engines": {"node": "^14.18.0 || >=16.0.0"}, "peerDependencies": {"@astrojs/compiler": ">=0.27.0"}, "dependencies": {"@astrojs/compiler": "2.7.0", "synckit": "0.9.0"}, "dev": false}, "/asynciterator.prototype@1.0.0": {"resolution": {"integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg=="}, "dependencies": {"has-symbols": "1.0.3"}, "dev": false}, "/asynckit@0.4.0": {"resolution": {"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="}, "dev": false}, "/autocompleter@9.1.2": {"resolution": {"integrity": "sha512-L4DJ2UIsIy/YrTchKHHfyQRng2p8m9xpari1uHYZ/5DynQombeshF73uVQbrtdLxLSlK0R7ObhpnbPBkI8j8xA=="}, "dev": false}, "/autoprefixer@10.4.19(postcss@8.4.35)": {"resolution": {"integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew=="}, "engines": {"node": "^10 || ^12 || >=14"}, "hasBin": true, "peerDependencies": {"postcss": "^8.1.0"}, "dependencies": {"browserslist": "4.23.0", "caniuse-lite": "1.0.30001600", "fraction.js": "4.3.7", "normalize-range": "0.1.2", "picocolors": "1.0.0", "postcss": "8.4.35", "postcss-value-parser": "4.2.0"}, "dev": false}, "/available-typed-arrays@1.0.7": {"resolution": {"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"possible-typed-array-names": "1.0.0"}, "dev": false}, "/axe-core@4.7.0": {"resolution": {"integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/axobject-query@3.2.1": {"resolution": {"integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg=="}, "dependencies": {"dequal": "2.0.3"}, "dev": false}, "/axobject-query@4.0.0": {"resolution": {"integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw=="}, "dependencies": {"dequal": "2.0.3"}, "dev": false}, "/b4a@1.6.6": {"resolution": {"integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg=="}, "requiresBuild": true, "dev": false, "optional": true}, "/b4a@1.6.7": {"resolution": {"integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg=="}, "requiresBuild": true, "dev": false, "optional": true}, "/babel-code-frame@6.26.0": {"resolution": {"integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g=="}, "dependencies": {"chalk": "1.1.3", "esutils": "2.0.3", "js-tokens": "3.0.2"}, "dev": false}, "/bail@2.0.2": {"resolution": {"integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="}, "dev": false}, "/balanced-match@1.0.2": {"resolution": {"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="}, "dev": false}, "/bare-events@2.2.1": {"resolution": {"integrity": "sha512-9GYPpsPFvrWBkelIhOhTWtkeZxVxZOdb3VnFTCzlOo3OjvmTvzLoZFUT8kNFACx0vJej6QPney1Cf9BvzCNE/A=="}, "requiresBuild": true, "dev": false, "optional": true}, "/bare-events@2.5.4": {"resolution": {"integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="}, "requiresBuild": true, "dev": false, "optional": true}, "/bare-fs@2.3.5": {"resolution": {"integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw=="}, "requiresBuild": true, "dependencies": {"bare-events": "2.2.1", "bare-path": "2.1.3", "bare-stream": "2.6.5(bare-events@2.2.1)"}, "transitivePeerDependencies": ["bare-buffer"], "dev": false, "optional": true}, "/bare-os@2.2.1": {"resolution": {"integrity": "sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w=="}, "requiresBuild": true, "dev": false, "optional": true}, "/bare-path@2.1.3": {"resolution": {"integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA=="}, "requiresBuild": true, "dependencies": {"bare-os": "2.2.1"}, "dev": false, "optional": true}, "/bare-stream@2.6.5(bare-events@2.2.1)": {"resolution": {"integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA=="}, "requiresBuild": true, "peerDependencies": {"bare-buffer": "*", "bare-events": "*"}, "peerDependenciesMeta": {"bare-buffer": {"optional": true}, "bare-events": {"optional": true}}, "dependencies": {"bare-events": "2.2.1", "streamx": "2.22.1"}, "dev": false, "optional": true}, "/base-64@1.0.0": {"resolution": {"integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="}, "dev": false}, "/base64-js@1.5.1": {"resolution": {"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="}, "dev": false}, "/binary-extensions@2.3.0": {"resolution": {"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="}, "engines": {"node": ">=8"}, "dev": false}, "/bl@4.1.0": {"resolution": {"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="}, "requiresBuild": true, "dependencies": {"buffer": "5.7.1", "inherits": "2.0.4", "readable-stream": "3.6.2"}, "dev": false, "optional": true}, "/bl@5.1.0": {"resolution": {"integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ=="}, "dependencies": {"buffer": "6.0.3", "inherits": "2.0.4", "readable-stream": "3.6.2"}, "dev": false}, "/boxen@1.3.0": {"resolution": {"integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw=="}, "engines": {"node": ">=4"}, "dependencies": {"ansi-align": "2.0.0", "camelcase": "4.1.0", "chalk": "2.4.2", "cli-boxes": "1.0.0", "string-width": "2.1.1", "term-size": "1.2.0", "widest-line": "2.0.1"}, "dev": false}, "/boxen@4.2.0": {"resolution": {"integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ=="}, "engines": {"node": ">=8"}, "dependencies": {"ansi-align": "3.0.1", "camelcase": "5.3.1", "chalk": "3.0.0", "cli-boxes": "2.2.1", "string-width": "4.2.3", "term-size": "2.2.1", "type-fest": "0.8.1", "widest-line": "3.1.0"}, "dev": false}, "/boxen@7.1.1": {"resolution": {"integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="}, "engines": {"node": ">=14.16"}, "dependencies": {"ansi-align": "3.0.1", "camelcase": "7.0.1", "chalk": "5.3.0", "cli-boxes": "3.0.0", "string-width": "5.1.2", "type-fest": "2.19.0", "widest-line": "4.0.1", "wrap-ansi": "8.1.0"}, "dev": false}, "/brace-expansion@1.1.11": {"resolution": {"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="}, "dependencies": {"balanced-match": "1.0.2", "concat-map": "0.0.1"}, "dev": false}, "/brace-expansion@2.0.1": {"resolution": {"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="}, "dependencies": {"balanced-match": "1.0.2"}, "dev": false}, "/braces@3.0.2": {"resolution": {"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="}, "engines": {"node": ">=8"}, "dependencies": {"fill-range": "7.0.1"}, "dev": false}, "/browser-process-hrtime@1.0.0": {"resolution": {"integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="}, "dev": false}, "/browserslist@4.23.0": {"resolution": {"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ=="}, "engines": {"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"}, "hasBin": true, "dependencies": {"caniuse-lite": "1.0.30001597", "electron-to-chromium": "1.4.707", "node-releases": "2.0.14", "update-browserslist-db": "1.0.13(browserslist@4.23.0)"}, "dev": false}, "/buffer@5.7.1": {"resolution": {"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="}, "requiresBuild": true, "dependencies": {"base64-js": "1.5.1", "ieee754": "1.2.1"}, "dev": false, "optional": true}, "/buffer@6.0.3": {"resolution": {"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="}, "dependencies": {"base64-js": "1.5.1", "ieee754": "1.2.1"}, "dev": false}, "/builtins@1.0.3": {"resolution": {"integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ=="}, "dev": false}, "/cac@6.7.14": {"resolution": {"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/cacheable-request@6.1.0": {"resolution": {"integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg=="}, "engines": {"node": ">=8"}, "dependencies": {"clone-response": "1.0.3", "get-stream": "5.2.0", "http-cache-semantics": "4.1.1", "keyv": "3.1.0", "lowercase-keys": "2.0.0", "normalize-url": "4.5.1", "responselike": "1.0.2"}, "dev": false}, "/call-bind@1.0.7": {"resolution": {"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"es-define-property": "1.0.0", "es-errors": "1.3.0", "function-bind": "1.1.2", "get-intrinsic": "1.2.4", "set-function-length": "1.2.2"}, "dev": false}, "/callsites@3.1.0": {"resolution": {"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="}, "engines": {"node": ">=6"}, "dev": false}, "/camel-case@3.0.0": {"resolution": {"integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w=="}, "dependencies": {"no-case": "2.3.2", "upper-case": "1.1.3"}, "dev": false}, "/camelcase-css@2.0.1": {"resolution": {"integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="}, "engines": {"node": ">= 6"}, "dev": false}, "/camelcase@4.1.0": {"resolution": {"integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw=="}, "engines": {"node": ">=4"}, "dev": false}, "/camelcase@5.3.1": {"resolution": {"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="}, "engines": {"node": ">=6"}, "dev": false}, "/camelcase@7.0.1": {"resolution": {"integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="}, "engines": {"node": ">=14.16"}, "dev": false}, "/caniuse-lite@1.0.30001597": {"resolution": {"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w=="}, "dev": false}, "/caniuse-lite@1.0.30001600": {"resolution": {"integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ=="}, "dev": false}, "/capture-stack-trace@1.0.2": {"resolution": {"integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/ccount@2.0.1": {"resolution": {"integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="}, "dev": false}, "/chai@4.4.1": {"resolution": {"integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g=="}, "engines": {"node": ">=4"}, "dependencies": {"assertion-error": "1.1.0", "check-error": "1.0.3", "deep-eql": "4.1.3", "get-func-name": "2.0.2", "loupe": "2.3.7", "pathval": "1.1.1", "type-detect": "4.0.8"}, "dev": false}, "/chalk@1.1.3": {"resolution": {"integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", "has-ansi": "2.0.0", "strip-ansi": "3.0.1", "supports-color": "2.0.0"}, "dev": false}, "/chalk@2.4.2": {"resolution": {"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="}, "engines": {"node": ">=4"}, "dependencies": {"ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", "supports-color": "5.5.0"}, "dev": false}, "/chalk@3.0.0": {"resolution": {"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg=="}, "engines": {"node": ">=8"}, "dependencies": {"ansi-styles": "4.3.0", "supports-color": "7.2.0"}, "dev": false}, "/chalk@4.1.2": {"resolution": {"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="}, "engines": {"node": ">=10"}, "dependencies": {"ansi-styles": "4.3.0", "supports-color": "7.2.0"}, "dev": false}, "/chalk@5.3.0": {"resolution": {"integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="}, "engines": {"node": "^12.17.0 || ^14.13 || >=16.0.0"}, "dev": false}, "/character-entities-html4@2.1.0": {"resolution": {"integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="}, "dev": false}, "/character-entities-legacy@1.1.4": {"resolution": {"integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="}, "dev": false}, "/character-entities-legacy@3.0.0": {"resolution": {"integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="}, "dev": false}, "/character-entities@1.2.4": {"resolution": {"integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="}, "dev": false}, "/character-entities@2.0.2": {"resolution": {"integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="}, "dev": false}, "/character-reference-invalid@1.1.4": {"resolution": {"integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="}, "dev": false}, "/chardet@0.7.0": {"resolution": {"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="}, "dev": false}, "/check-error@1.0.3": {"resolution": {"integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="}, "dependencies": {"get-func-name": "2.0.2"}, "dev": false}, "/chokidar@3.6.0": {"resolution": {"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="}, "engines": {"node": ">= 8.10.0"}, "dependencies": {"anymatch": "3.1.3", "braces": "3.0.2", "glob-parent": "5.1.2", "is-binary-path": "2.1.0", "is-glob": "4.0.3", "normalize-path": "3.0.0", "readdirp": "3.6.0"}, "optionalDependencies": {"fsevents": "2.3.3"}, "dev": false}, "/chownr@1.1.4": {"resolution": {"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="}, "requiresBuild": true, "dev": false, "optional": true}, "/ci-info@1.6.0": {"resolution": {"integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="}, "dev": false}, "/ci-info@2.0.0": {"resolution": {"integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="}, "dev": false}, "/ci-info@3.9.0": {"resolution": {"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/ci-info@4.0.0": {"resolution": {"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg=="}, "engines": {"node": ">=8"}, "dev": false}, "/clean-css@4.2.4": {"resolution": {"integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A=="}, "engines": {"node": ">= 4.0"}, "dependencies": {"source-map": "0.6.1"}, "dev": false}, "/cli-boxes@1.0.0": {"resolution": {"integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/cli-boxes@2.2.1": {"resolution": {"integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="}, "engines": {"node": ">=6"}, "dev": false}, "/cli-boxes@3.0.0": {"resolution": {"integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="}, "engines": {"node": ">=10"}, "dev": false}, "/cli-cursor@3.1.0": {"resolution": {"integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="}, "engines": {"node": ">=8"}, "dependencies": {"restore-cursor": "3.1.0"}, "dev": false}, "/cli-cursor@4.0.0": {"resolution": {"integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dependencies": {"restore-cursor": "4.0.0"}, "dev": false}, "/cli-spinners@2.9.2": {"resolution": {"integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="}, "engines": {"node": ">=6"}, "dev": false}, "/cli-width@3.0.0": {"resolution": {"integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="}, "engines": {"node": ">= 10"}, "dev": false}, "/clipboardy@2.3.0": {"resolution": {"integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ=="}, "engines": {"node": ">=8"}, "dependencies": {"arch": "2.2.0", "execa": "1.0.0", "is-wsl": "2.2.0"}, "dev": false}, "/cliui@5.0.0": {"resolution": {"integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA=="}, "dependencies": {"string-width": "3.1.0", "strip-ansi": "5.2.0", "wrap-ansi": "5.1.0"}, "dev": false}, "/cliui@7.0.4": {"resolution": {"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="}, "dependencies": {"string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0"}, "dev": false}, "/cliui@8.0.1": {"resolution": {"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="}, "engines": {"node": ">=12"}, "dependencies": {"string-width": "4.2.3", "strip-ansi": "6.0.1", "wrap-ansi": "7.0.0"}, "dev": false}, "/clone-response@1.0.3": {"resolution": {"integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="}, "dependencies": {"mimic-response": "1.0.1"}, "dev": false}, "/clsx@2.1.0": {"resolution": {"integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg=="}, "engines": {"node": ">=6"}, "dev": false}, "/color-convert@1.9.3": {"resolution": {"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="}, "dependencies": {"color-name": "1.1.3"}, "dev": false}, "/color-convert@2.0.1": {"resolution": {"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="}, "engines": {"node": ">=7.0.0"}, "dependencies": {"color-name": "1.1.4"}, "dev": false}, "/color-name@1.1.3": {"resolution": {"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="}, "dev": false}, "/color-name@1.1.4": {"resolution": {"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="}, "requiresBuild": true, "dev": false}, "/color-string@1.9.1": {"resolution": {"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="}, "requiresBuild": true, "dependencies": {"color-name": "1.1.4", "simple-swizzle": "0.2.2"}, "dev": false, "optional": true}, "/color@4.2.3": {"resolution": {"integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="}, "engines": {"node": ">=12.5.0"}, "requiresBuild": true, "dependencies": {"color-convert": "2.0.1", "color-string": "1.9.1"}, "dev": false, "optional": true}, "/combined-stream@1.0.8": {"resolution": {"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="}, "engines": {"node": ">= 0.8"}, "dependencies": {"delayed-stream": "1.0.0"}, "dev": false}, "/comma-separated-tokens@1.0.8": {"resolution": {"integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="}, "dev": false}, "/comma-separated-tokens@2.0.3": {"resolution": {"integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="}, "dev": false}, "/commander@10.0.1": {"resolution": {"integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="}, "engines": {"node": ">=14"}, "dev": false}, "/commander@2.20.3": {"resolution": {"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="}, "dev": false}, "/commander@4.1.1": {"resolution": {"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="}, "engines": {"node": ">= 6"}, "dev": false}, "/comment-json@2.4.2": {"resolution": {"integrity": "sha512-T+iXox779qsqneMYx/x5BZyz4xjCeQRmuNVzz8tko7qZUs3MlzpA3RAs+O1XsgcKToNBMIvfVzafGOeiU7RggA=="}, "engines": {"node": ">= 6"}, "dependencies": {"core-util-is": "1.0.3", "esprima": "4.0.1", "has-own-prop": "2.0.0", "repeat-string": "1.6.1"}, "dev": false}, "/common-ancestor-path@1.0.1": {"resolution": {"integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="}, "dev": false}, "/concat-map@0.0.1": {"resolution": {"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="}, "dev": false}, "/concurrently@8.2.2": {"resolution": {"integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg=="}, "engines": {"node": "^14.13.0 || >=16.0.0"}, "hasBin": true, "dependencies": {"chalk": "4.1.2", "date-fns": "2.30.0", "lodash": "4.17.21", "rxjs": "7.8.1", "shell-quote": "1.8.1", "spawn-command": "0.0.2", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2"}, "dev": false}, "/condense-newlines@0.2.1": {"resolution": {"integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"extend-shallow": "2.0.1", "is-whitespace": "0.3.0", "kind-of": "3.2.2"}, "dev": false}, "/config-chain@1.1.13": {"resolution": {"integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="}, "dependencies": {"ini": "1.3.8", "proto-list": "1.2.4"}, "dev": false}, "/configstore@3.1.5": {"resolution": {"integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA=="}, "engines": {"node": ">=4"}, "dependencies": {"dot-prop": "4.2.1", "graceful-fs": "4.2.11", "make-dir": "1.3.0", "unique-string": "1.0.0", "write-file-atomic": "2.4.3", "xdg-basedir": "3.0.0"}, "dev": false}, "/configstore@5.0.1": {"resolution": {"integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA=="}, "engines": {"node": ">=8"}, "dependencies": {"dot-prop": "5.3.0", "graceful-fs": "4.2.11", "make-dir": "3.1.0", "unique-string": "2.0.0", "write-file-atomic": "3.0.3", "xdg-basedir": "4.0.0"}, "dev": false}, "/convert-source-map@2.0.0": {"resolution": {"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="}, "dev": false}, "/cookie@0.6.0": {"resolution": {"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="}, "engines": {"node": ">= 0.6"}, "dev": false}, "/core-util-is@1.0.3": {"resolution": {"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="}, "dev": false}, "/create-error-class@3.0.2": {"resolution": {"integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"capture-stack-trace": "1.0.2"}, "dev": false}, "/cross-spawn@5.1.0": {"resolution": {"integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A=="}, "dependencies": {"lru-cache": "4.1.5", "shebang-command": "1.2.0", "which": "1.3.1"}, "dev": false}, "/cross-spawn@6.0.5": {"resolution": {"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ=="}, "engines": {"node": ">=4.8"}, "dependencies": {"nice-try": "1.0.5", "path-key": "2.0.1", "semver": "5.7.2", "shebang-command": "1.2.0", "which": "1.3.1"}, "dev": false}, "/cross-spawn@7.0.3": {"resolution": {"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="}, "engines": {"node": ">= 8"}, "dependencies": {"path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2"}, "dev": false}, "/crypto-random-string@1.0.0": {"resolution": {"integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg=="}, "engines": {"node": ">=4"}, "dev": false}, "/crypto-random-string@2.0.0": {"resolution": {"integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="}, "engines": {"node": ">=8"}, "dev": false}, "/css.escape@1.5.1": {"resolution": {"integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="}, "dev": false}, "/cssesc@3.0.0": {"resolution": {"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="}, "engines": {"node": ">=4"}, "hasBin": true, "dev": false}, "/cssom@0.3.8": {"resolution": {"integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="}, "dev": false}, "/cssom@0.4.4": {"resolution": {"integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="}, "dev": false}, "/cssstyle@2.3.0": {"resolution": {"integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="}, "engines": {"node": ">=8"}, "dependencies": {"cssom": "0.3.8"}, "dev": false}, "/damerau-levenshtein@1.0.8": {"resolution": {"integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="}, "dev": false}, "/data-urls@2.0.0": {"resolution": {"integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ=="}, "engines": {"node": ">=10"}, "dependencies": {"abab": "2.0.6", "whatwg-mimetype": "2.3.0", "whatwg-url": "8.7.0"}, "dev": false}, "/date-fns@2.30.0": {"resolution": {"integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw=="}, "engines": {"node": ">=0.11"}, "dependencies": {"@babel/runtime": "7.24.0"}, "dev": false}, "/debug@4.3.4": {"resolution": {"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="}, "engines": {"node": ">=6.0"}, "peerDependencies": {"supports-color": "*"}, "peerDependenciesMeta": {"supports-color": {"optional": true}}, "dependencies": {"ms": "2.1.2"}, "dev": false}, "/decamelize@1.2.0": {"resolution": {"integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/decimal.js@10.4.3": {"resolution": {"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="}, "dev": false}, "/decode-named-character-reference@1.0.2": {"resolution": {"integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg=="}, "dependencies": {"character-entities": "2.0.2"}, "dev": false}, "/decompress-response@3.3.0": {"resolution": {"integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA=="}, "engines": {"node": ">=4"}, "dependencies": {"mimic-response": "1.0.1"}, "dev": false}, "/decompress-response@6.0.0": {"resolution": {"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="}, "engines": {"node": ">=10"}, "requiresBuild": true, "dependencies": {"mimic-response": "3.1.0"}, "dev": false, "optional": true}, "/deep-eql@4.1.3": {"resolution": {"integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw=="}, "engines": {"node": ">=6"}, "dependencies": {"type-detect": "4.0.8"}, "dev": false}, "/deep-extend@0.6.0": {"resolution": {"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="}, "engines": {"node": ">=4.0.0"}, "requiresBuild": true, "dev": false}, "/deep-is@0.1.4": {"resolution": {"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="}, "dev": false}, "/defer-to-connect@1.1.3": {"resolution": {"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="}, "dev": false}, "/define-data-property@1.1.4": {"resolution": {"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"es-define-property": "1.0.0", "es-errors": "1.3.0", "gopd": "1.0.1"}, "dev": false}, "/define-properties@1.2.1": {"resolution": {"integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"define-data-property": "1.1.4", "has-property-descriptors": "1.0.2", "object-keys": "1.1.1"}, "dev": false}, "/delayed-stream@1.0.0": {"resolution": {"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="}, "engines": {"node": ">=0.4.0"}, "dev": false}, "/dequal@2.0.3": {"resolution": {"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="}, "engines": {"node": ">=6"}, "dev": false}, "/detect-indent@6.1.0": {"resolution": {"integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="}, "engines": {"node": ">=8"}, "dev": false}, "/detect-libc@2.0.2": {"resolution": {"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="}, "engines": {"node": ">=8"}, "requiresBuild": true, "dev": false, "optional": true}, "/deterministic-object-hash@2.0.2": {"resolution": {"integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="}, "engines": {"node": ">=18"}, "dependencies": {"base-64": "1.0.0"}, "dev": false}, "/devalue@4.3.2": {"resolution": {"integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg=="}, "dev": false}, "/devlop@1.1.0": {"resolution": {"integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="}, "dependencies": {"dequal": "2.0.3"}, "dev": false}, "/didyoumean@1.2.2": {"resolution": {"integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="}, "dev": false}, "/diff-sequences@29.6.3": {"resolution": {"integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="}, "engines": {"node": "^14.15.0 || ^16.10.0 || >=18.0.0"}, "dev": false}, "/diff@5.2.0": {"resolution": {"integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A=="}, "engines": {"node": ">=0.3.1"}, "dev": false}, "/dir-glob@3.0.1": {"resolution": {"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="}, "engines": {"node": ">=8"}, "dependencies": {"path-type": "4.0.0"}, "dev": false}, "/dlv@1.1.3": {"resolution": {"integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="}, "dev": false}, "/doctrine@3.0.0": {"resolution": {"integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="}, "engines": {"node": ">=6.0.0"}, "dependencies": {"esutils": "2.0.3"}, "dev": false}, "/domexception@2.0.1": {"resolution": {"integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg=="}, "engines": {"node": ">=8"}, "deprecated": "Use your platform's native DOMException instead", "dependencies": {"webidl-conversions": "5.0.0"}, "dev": false}, "/dot-prop@4.2.1": {"resolution": {"integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ=="}, "engines": {"node": ">=4"}, "dependencies": {"is-obj": "1.0.1"}, "dev": false}, "/dot-prop@5.3.0": {"resolution": {"integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="}, "engines": {"node": ">=8"}, "dependencies": {"is-obj": "2.0.0"}, "dev": false}, "/dotenv@5.0.1": {"resolution": {"integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow=="}, "engines": {"node": ">=4.6.0"}, "dev": false}, "/dset@3.1.3": {"resolution": {"integrity": "sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/duplexer3@0.1.5": {"resolution": {"integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="}, "dev": false}, "/eastasianwidth@0.2.0": {"resolution": {"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="}, "dev": false}, "/editorconfig@0.15.3": {"resolution": {"integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g=="}, "hasBin": true, "dependencies": {"commander": "2.20.3", "lru-cache": "4.1.5", "semver": "5.7.2", "sigmund": "1.0.1"}, "dev": false}, "/editorconfig@1.0.4": {"resolution": {"integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q=="}, "engines": {"node": ">=14"}, "hasBin": true, "dependencies": {"@one-ini/wasm": "0.1.1", "commander": "10.0.1", "minimatch": "9.0.1", "semver": "7.6.0"}, "dev": false}, "/electron-to-chromium@1.4.707": {"resolution": {"integrity": "sha512-qRq74Mo7ChePOU6GHdfAJ0NREXU8vQTlVlfWz3wNygFay6xrd/fY2J7oGHwrhFeU30OVctGLdTh/FcnokTWpng=="}, "dev": false}, "/emoji-regex@10.3.0": {"resolution": {"integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw=="}, "dev": false}, "/emoji-regex@7.0.3": {"resolution": {"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="}, "dev": false}, "/emoji-regex@8.0.0": {"resolution": {"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="}, "dev": false}, "/emoji-regex@9.2.2": {"resolution": {"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="}, "dev": false}, "/end-of-stream@1.4.4": {"resolution": {"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="}, "requiresBuild": true, "dependencies": {"once": "1.4.0"}, "dev": false}, "/entities@4.5.0": {"resolution": {"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="}, "engines": {"node": ">=0.12"}, "dev": false}, "/es-abstract@1.22.5": {"resolution": {"integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"array-buffer-byte-length": "1.0.1", "arraybuffer.prototype.slice": "1.0.3", "available-typed-arrays": "1.0.7", "call-bind": "1.0.7", "es-define-property": "1.0.0", "es-errors": "1.3.0", "es-set-tostringtag": "2.0.3", "es-to-primitive": "1.2.1", "function.prototype.name": "1.1.6", "get-intrinsic": "1.2.4", "get-symbol-description": "1.0.2", "globalthis": "1.0.3", "gopd": "1.0.1", "has-property-descriptors": "1.0.2", "has-proto": "1.0.3", "has-symbols": "1.0.3", "hasown": "2.0.2", "internal-slot": "1.0.7", "is-array-buffer": "3.0.4", "is-callable": "1.2.7", "is-negative-zero": "2.0.3", "is-regex": "1.1.4", "is-shared-array-buffer": "1.0.3", "is-string": "1.0.7", "is-typed-array": "1.1.13", "is-weakref": "1.0.2", "object-inspect": "1.13.1", "object-keys": "1.1.1", "object.assign": "4.1.5", "regexp.prototype.flags": "1.5.2", "safe-array-concat": "1.1.2", "safe-regex-test": "1.0.3", "string.prototype.trim": "1.2.8", "string.prototype.trimend": "1.0.7", "string.prototype.trimstart": "1.0.7", "typed-array-buffer": "1.0.2", "typed-array-byte-length": "1.0.1", "typed-array-byte-offset": "1.0.2", "typed-array-length": "1.0.5", "unbox-primitive": "1.0.2", "which-typed-array": "1.1.15"}, "dev": false}, "/es-define-property@1.0.0": {"resolution": {"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"get-intrinsic": "1.2.4"}, "dev": false}, "/es-errors@1.3.0": {"resolution": {"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/es-iterator-helpers@1.0.17": {"resolution": {"integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"asynciterator.prototype": "1.0.0", "call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "es-errors": "1.3.0", "es-set-tostringtag": "2.0.3", "function-bind": "1.1.2", "get-intrinsic": "1.2.4", "globalthis": "1.0.3", "has-property-descriptors": "1.0.2", "has-proto": "1.0.3", "has-symbols": "1.0.3", "internal-slot": "1.0.7", "iterator.prototype": "1.1.2", "safe-array-concat": "1.1.2"}, "dev": false}, "/es-module-lexer@1.4.1": {"resolution": {"integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w=="}, "dev": false}, "/es-set-tostringtag@2.0.3": {"resolution": {"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"get-intrinsic": "1.2.4", "has-tostringtag": "1.0.2", "hasown": "2.0.2"}, "dev": false}, "/es-shim-unscopables@1.0.2": {"resolution": {"integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw=="}, "dependencies": {"hasown": "2.0.2"}, "dev": false}, "/es-to-primitive@1.2.1": {"resolution": {"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"is-callable": "1.2.7", "is-date-object": "1.0.5", "is-symbol": "1.0.4"}, "dev": false}, "/esbuild@0.19.12": {"resolution": {"integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="}, "engines": {"node": ">=12"}, "hasBin": true, "requiresBuild": true, "optionalDependencies": {"@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12"}, "dev": false}, "/escalade@3.1.2": {"resolution": {"integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA=="}, "engines": {"node": ">=6"}, "dev": false}, "/escape-goat@2.1.1": {"resolution": {"integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="}, "engines": {"node": ">=8"}, "dev": false}, "/escape-string-regexp@1.0.5": {"resolution": {"integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="}, "engines": {"node": ">=0.8.0"}, "dev": false}, "/escape-string-regexp@4.0.0": {"resolution": {"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="}, "engines": {"node": ">=10"}, "dev": false}, "/escape-string-regexp@5.0.0": {"resolution": {"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="}, "engines": {"node": ">=12"}, "dev": false}, "/escodegen@2.1.0": {"resolution": {"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="}, "engines": {"node": ">=6.0"}, "hasBin": true, "dependencies": {"esprima": "4.0.1", "estraverse": "5.3.0", "esutils": "2.0.3"}, "optionalDependencies": {"source-map": "0.6.1"}, "dev": false}, "/eslint-compat-utils@0.4.1(eslint@8.57.0)": {"resolution": {"integrity": "sha512-5N7ZaJG5pZxUeNNJfUchurLVrunD1xJvyg5kYOIVF8kg1f3ajTikmAu/5fZ9w100omNPOoMjngRszh/Q/uFGMg=="}, "engines": {"node": ">=12"}, "peerDependencies": {"eslint": ">=6.0.0"}, "dependencies": {"eslint": "8.57.0", "semver": "7.6.0"}, "dev": false}, "/eslint-config-prettier@9.1.0(eslint@8.57.0)": {"resolution": {"integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw=="}, "hasBin": true, "peerDependencies": {"eslint": ">=7.0.0"}, "dependencies": {"eslint": "8.57.0"}, "dev": false}, "/eslint-plugin-astro@0.31.4(eslint@8.57.0)": {"resolution": {"integrity": "sha512-aU1KYSo7TdnSTBenyAWuRFB07lVUe0/6u9cltC2ZCx0QgcfC+HP7e87OkmvoKh+RZuaSsVgLG4zCOI8LZ6nS/Q=="}, "engines": {"node": "^14.18.0 || >=16.0.0"}, "peerDependencies": {"eslint": ">=7.0.0"}, "dependencies": {"@eslint-community/eslint-utils": "4.4.0(eslint@8.57.0)", "@jridgewell/sourcemap-codec": "1.4.15", "@typescript-eslint/types": "5.62.0", "astro-eslint-parser": "0.16.3", "eslint": "8.57.0", "eslint-compat-utils": "0.4.1(eslint@8.57.0)", "postcss": "8.4.35", "postcss-selector-parser": "6.0.16"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.0)": {"resolution": {"integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA=="}, "engines": {"node": ">=4.0"}, "peerDependencies": {"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"}, "dependencies": {"@babel/runtime": "7.24.0", "aria-query": "5.3.0", "array-includes": "3.1.7", "array.prototype.flatmap": "1.3.2", "ast-types-flow": "0.0.8", "axe-core": "4.7.0", "axobject-query": "3.2.1", "damerau-levenshtein": "1.0.8", "emoji-regex": "9.2.2", "es-iterator-helpers": "1.0.17", "eslint": "8.57.0", "hasown": "2.0.2", "jsx-ast-utils": "3.3.5", "language-tags": "1.0.9", "minimatch": "3.1.2", "object.entries": "1.1.7", "object.fromentries": "2.0.7"}, "dev": false}, "/eslint-scope@7.2.2": {"resolution": {"integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dependencies": {"esrecurse": "4.3.0", "estraverse": "5.3.0"}, "dev": false}, "/eslint-visitor-keys@3.4.3": {"resolution": {"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dev": false}, "/eslint@8.57.0": {"resolution": {"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "hasBin": true, "dependencies": {"@eslint-community/eslint-utils": "4.4.0(eslint@8.57.0)", "@eslint-community/regexpp": "4.10.0", "@eslint/eslintrc": "2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "0.11.14", "@humanwhocodes/module-importer": "1.0.1", "@nodelib/fs.walk": "1.2.8", "@ungap/structured-clone": "1.2.0", "ajv": "6.12.6", "chalk": "4.1.2", "cross-spawn": "7.0.3", "debug": "4.3.4", "doctrine": "3.0.0", "escape-string-regexp": "4.0.0", "eslint-scope": "7.2.2", "eslint-visitor-keys": "3.4.3", "espree": "9.6.1", "esquery": "1.5.0", "esutils": "2.0.3", "fast-deep-equal": "3.1.3", "file-entry-cache": "6.0.1", "find-up": "5.0.0", "glob-parent": "6.0.2", "globals": "13.24.0", "graphemer": "1.4.0", "ignore": "5.3.1", "imurmurhash": "0.1.4", "is-glob": "4.0.3", "is-path-inside": "3.0.3", "js-yaml": "4.1.0", "json-stable-stringify-without-jsonify": "1.0.1", "levn": "0.4.1", "lodash.merge": "4.6.2", "minimatch": "3.1.2", "natural-compare": "1.4.0", "optionator": "0.9.3", "strip-ansi": "6.0.1", "text-table": "0.2.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/espree@9.6.1": {"resolution": {"integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="}, "engines": {"node": "^12.22.0 || ^14.17.0 || >=16.0.0"}, "dependencies": {"acorn": "8.11.3", "acorn-jsx": "5.3.2(acorn@8.11.3)", "eslint-visitor-keys": "3.4.3"}, "dev": false}, "/esprima@4.0.1": {"resolution": {"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="}, "engines": {"node": ">=4"}, "hasBin": true, "dev": false}, "/esquery@1.5.0": {"resolution": {"integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg=="}, "engines": {"node": ">=0.10"}, "dependencies": {"estraverse": "5.3.0"}, "dev": false}, "/esrecurse@4.3.0": {"resolution": {"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="}, "engines": {"node": ">=4.0"}, "dependencies": {"estraverse": "5.3.0"}, "dev": false}, "/estraverse@5.3.0": {"resolution": {"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="}, "engines": {"node": ">=4.0"}, "dev": false}, "/estree-walker@3.0.3": {"resolution": {"integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="}, "dependencies": {"@types/estree": "1.0.5"}, "dev": false}, "/esutils@2.0.3": {"resolution": {"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/eventemitter3@5.0.1": {"resolution": {"integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="}, "dev": false}, "/execa@0.7.0": {"resolution": {"integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw=="}, "engines": {"node": ">=4"}, "dependencies": {"cross-spawn": "5.1.0", "get-stream": "3.0.0", "is-stream": "1.1.0", "npm-run-path": "2.0.2", "p-finally": "1.0.0", "signal-exit": "3.0.7", "strip-eof": "1.0.0"}, "dev": false}, "/execa@1.0.0": {"resolution": {"integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA=="}, "engines": {"node": ">=6"}, "dependencies": {"cross-spawn": "6.0.5", "get-stream": "4.1.0", "is-stream": "1.1.0", "npm-run-path": "2.0.2", "p-finally": "1.0.0", "signal-exit": "3.0.7", "strip-eof": "1.0.0"}, "dev": false}, "/execa@8.0.1": {"resolution": {"integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="}, "engines": {"node": ">=16.17"}, "dependencies": {"cross-spawn": "7.0.3", "get-stream": "8.0.1", "human-signals": "5.0.0", "is-stream": "3.0.0", "merge-stream": "2.0.0", "npm-run-path": "5.3.0", "onetime": "6.0.0", "signal-exit": "4.1.0", "strip-final-newline": "3.0.0"}, "dev": false}, "/expand-template@2.0.3": {"resolution": {"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="}, "engines": {"node": ">=6"}, "requiresBuild": true, "dev": false, "optional": true}, "/extend-shallow@2.0.1": {"resolution": {"integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"is-extendable": "0.1.1"}, "dev": false}, "/extend@3.0.2": {"resolution": {"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="}, "dev": false}, "/external-editor@3.1.0": {"resolution": {"integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="}, "engines": {"node": ">=4"}, "dependencies": {"chardet": "0.7.0", "iconv-lite": "0.4.24", "tmp": "0.0.33"}, "dev": false}, "/fast-deep-equal@3.1.3": {"resolution": {"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="}, "dev": false}, "/fast-fifo@1.3.2": {"resolution": {"integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="}, "requiresBuild": true, "dev": false, "optional": true}, "/fast-glob@3.3.2": {"resolution": {"integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="}, "engines": {"node": ">=8.6.0"}, "dependencies": {"@nodelib/fs.stat": "2.0.5", "@nodelib/fs.walk": "1.2.8", "glob-parent": "5.1.2", "merge2": "1.4.1", "micromatch": "4.0.5"}, "dev": false}, "/fast-json-stable-stringify@2.1.0": {"resolution": {"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="}, "dev": false}, "/fast-levenshtein@2.0.6": {"resolution": {"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="}, "dev": false}, "/fastq@1.17.1": {"resolution": {"integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w=="}, "dependencies": {"reusify": "1.0.4"}, "dev": false}, "/figures@3.2.0": {"resolution": {"integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="}, "engines": {"node": ">=8"}, "dependencies": {"escape-string-regexp": "1.0.5"}, "dev": false}, "/file-entry-cache@6.0.1": {"resolution": {"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="}, "engines": {"node": "^10.12.0 || >=12.0.0"}, "dependencies": {"flat-cache": "3.2.0"}, "dev": false}, "/fill-range@7.0.1": {"resolution": {"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="}, "engines": {"node": ">=8"}, "dependencies": {"to-regex-range": "5.0.1"}, "dev": false}, "/find-up@3.0.0": {"resolution": {"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="}, "engines": {"node": ">=6"}, "dependencies": {"locate-path": "3.0.0"}, "dev": false}, "/find-up@4.1.0": {"resolution": {"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="}, "engines": {"node": ">=8"}, "dependencies": {"locate-path": "5.0.0", "path-exists": "4.0.0"}, "dev": false}, "/find-up@5.0.0": {"resolution": {"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="}, "engines": {"node": ">=10"}, "dependencies": {"locate-path": "6.0.0", "path-exists": "4.0.0"}, "dev": false}, "/find-yarn-workspace-root2@1.2.16": {"resolution": {"integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA=="}, "dependencies": {"micromatch": "4.0.5", "pkg-dir": "4.2.0"}, "dev": false}, "/flat-cache@3.2.0": {"resolution": {"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="}, "engines": {"node": "^10.12.0 || >=12.0.0"}, "dependencies": {"flatted": "3.3.1", "keyv": "4.5.4", "rimraf": "3.0.2"}, "dev": false}, "/flatted@3.3.1": {"resolution": {"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw=="}, "dev": false}, "/flattie@1.1.1": {"resolution": {"integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/for-each@0.3.3": {"resolution": {"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw=="}, "dependencies": {"is-callable": "1.2.7"}, "dev": false}, "/foreground-child@3.1.1": {"resolution": {"integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg=="}, "engines": {"node": ">=14"}, "dependencies": {"cross-spawn": "7.0.3", "signal-exit": "4.1.0"}, "dev": false}, "/form-data@3.0.1": {"resolution": {"integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg=="}, "engines": {"node": ">= 6"}, "dependencies": {"asynckit": "0.4.0", "combined-stream": "1.0.8", "mime-types": "2.1.35"}, "dev": false}, "/fraction.js@4.3.7": {"resolution": {"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="}, "dev": false}, "/fs-constants@1.0.0": {"resolution": {"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="}, "requiresBuild": true, "dev": false, "optional": true}, "/fs-exists-sync@0.1.0": {"resolution": {"integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/fs-extra@8.1.0": {"resolution": {"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="}, "engines": {"node": ">=6 <7 || >=8"}, "dependencies": {"graceful-fs": "4.2.11", "jsonfile": "4.0.0", "universalify": "0.1.2"}, "dev": false}, "/fs.realpath@1.0.0": {"resolution": {"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="}, "dev": false}, "/fsevents@2.3.2": {"resolution": {"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="}, "engines": {"node": "^8.16.0 || ^10.6.0 || >=11.0.0"}, "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/fsevents@2.3.3": {"resolution": {"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="}, "engines": {"node": "^8.16.0 || ^10.6.0 || >=11.0.0"}, "os": ["darwin"], "requiresBuild": true, "dev": false, "optional": true}, "/function-bind@1.1.2": {"resolution": {"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="}, "dev": false}, "/function.prototype.name@1.1.6": {"resolution": {"integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "functions-have-names": "1.2.3"}, "dev": false}, "/functions-have-names@1.2.3": {"resolution": {"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="}, "dev": false}, "/fuse.js@6.6.2": {"resolution": {"integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA=="}, "engines": {"node": ">=10"}, "dev": false}, "/gensync@1.0.0-beta.2": {"resolution": {"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="}, "engines": {"node": ">=6.9.0"}, "dev": false}, "/get-caller-file@2.0.5": {"resolution": {"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="}, "engines": {"node": "6.* || 8.* || >= 10.*"}, "dev": false}, "/get-east-asian-width@1.2.0": {"resolution": {"integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA=="}, "engines": {"node": ">=18"}, "dev": false}, "/get-func-name@2.0.2": {"resolution": {"integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="}, "dev": false}, "/get-intrinsic@1.2.4": {"resolution": {"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"es-errors": "1.3.0", "function-bind": "1.1.2", "has-proto": "1.0.3", "has-symbols": "1.0.3", "hasown": "2.0.2"}, "dev": false}, "/get-stream@3.0.0": {"resolution": {"integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/get-stream@4.1.0": {"resolution": {"integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w=="}, "engines": {"node": ">=6"}, "dependencies": {"pump": "3.0.0"}, "dev": false}, "/get-stream@5.2.0": {"resolution": {"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="}, "engines": {"node": ">=8"}, "dependencies": {"pump": "3.0.0"}, "dev": false}, "/get-stream@8.0.1": {"resolution": {"integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="}, "engines": {"node": ">=16"}, "dev": false}, "/get-symbol-description@1.0.2": {"resolution": {"integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "es-errors": "1.3.0", "get-intrinsic": "1.2.4"}, "dev": false}, "/get-tsconfig@4.7.3": {"resolution": {"integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg=="}, "dependencies": {"resolve-pkg-maps": "1.0.0"}, "dev": false}, "/git-config-path@1.0.1": {"resolution": {"integrity": "sha512-KcJ2dlrrP5DbBnYIZ2nlikALfRhKzNSX0stvv3ImJ+fvC4hXKoV+U+74SV0upg+jlQZbrtQzc0bu6/Zh+7aQbg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"extend-shallow": "2.0.1", "fs-exists-sync": "0.1.0", "homedir-polyfill": "1.0.3"}, "dev": false}, "/git-username@1.0.0": {"resolution": {"integrity": "sha512-xm45KwBR6Eu1jO4umx/o2M84v9TC7tdOBuzLx8ayhdR9H1FBiiG9azz31uC0esDvaWVBTDINpJ5USomk+ja8OQ=="}, "engines": {"node": ">=0.8"}, "dependencies": {"parse-github-url": "1.0.2", "remote-origin-url": "1.0.0"}, "dev": false}, "/github-from-package@0.0.0": {"resolution": {"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="}, "requiresBuild": true, "dev": false, "optional": true}, "/github-slugger@2.0.0": {"resolution": {"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="}, "dev": false}, "/glob-parent@5.1.2": {"resolution": {"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="}, "engines": {"node": ">= 6"}, "dependencies": {"is-glob": "4.0.3"}, "dev": false}, "/glob-parent@6.0.2": {"resolution": {"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="}, "engines": {"node": ">=10.13.0"}, "dependencies": {"is-glob": "4.0.3"}, "dev": false}, "/glob@10.3.10": {"resolution": {"integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "hasBin": true, "dependencies": {"foreground-child": "3.1.1", "jackspeak": "2.3.6", "minimatch": "9.0.3", "minipass": "7.0.4", "path-scurry": "1.10.1"}, "dev": false}, "/glob@7.2.3": {"resolution": {"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="}, "dependencies": {"fs.realpath": "1.0.0", "inflight": "1.0.6", "inherits": "2.0.4", "minimatch": "3.1.2", "once": "1.4.0", "path-is-absolute": "1.0.1"}, "dev": false}, "/global-dirs@0.1.1": {"resolution": {"integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg=="}, "engines": {"node": ">=4"}, "dependencies": {"ini": "1.3.8"}, "dev": false}, "/global-dirs@2.1.0": {"resolution": {"integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ=="}, "engines": {"node": ">=8"}, "dependencies": {"ini": "1.3.7"}, "dev": false}, "/globals@11.12.0": {"resolution": {"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="}, "engines": {"node": ">=4"}, "dev": false}, "/globals@13.24.0": {"resolution": {"integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="}, "engines": {"node": ">=8"}, "dependencies": {"type-fest": "0.20.2"}, "dev": false}, "/globalthis@1.0.3": {"resolution": {"integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"define-properties": "1.2.1"}, "dev": false}, "/globby@11.1.0": {"resolution": {"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="}, "engines": {"node": ">=10"}, "dependencies": {"array-union": "2.1.0", "dir-glob": "3.0.1", "fast-glob": "3.3.2", "ignore": "5.3.1", "merge2": "1.4.1", "slash": "3.0.0"}, "dev": false}, "/gopd@1.0.1": {"resolution": {"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="}, "dependencies": {"get-intrinsic": "1.2.4"}, "dev": false}, "/got@6.7.1": {"resolution": {"integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg=="}, "engines": {"node": ">=4"}, "dependencies": {"@types/keyv": "3.1.4", "@types/responselike": "1.0.3", "create-error-class": "3.0.2", "duplexer3": "0.1.5", "get-stream": "3.0.0", "is-redirect": "1.0.0", "is-retry-allowed": "1.2.0", "is-stream": "1.1.0", "lowercase-keys": "1.0.1", "safe-buffer": "5.2.1", "timed-out": "4.0.1", "unzip-response": "2.0.1", "url-parse-lax": "1.0.0"}, "dev": false}, "/got@9.6.0": {"resolution": {"integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q=="}, "engines": {"node": ">=8.6"}, "dependencies": {"@sindresorhus/is": "0.14.0", "@szmarczak/http-timer": "1.1.2", "@types/keyv": "3.1.4", "@types/responselike": "1.0.3", "cacheable-request": "6.1.0", "decompress-response": "3.3.0", "duplexer3": "0.1.5", "get-stream": "4.1.0", "lowercase-keys": "1.0.1", "mimic-response": "1.0.1", "p-cancelable": "1.1.0", "to-readable-stream": "1.0.0", "url-parse-lax": "3.0.0"}, "dev": false}, "/graceful-fs@4.2.11": {"resolution": {"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="}, "dev": false}, "/graphemer@1.4.0": {"resolution": {"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="}, "dev": false}, "/gray-matter@4.0.3": {"resolution": {"integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="}, "engines": {"node": ">=6.0"}, "dependencies": {"js-yaml": "3.14.1", "kind-of": "6.0.3", "section-matter": "1.0.0", "strip-bom-string": "1.0.0"}, "dev": false}, "/happy-dom@12.10.3": {"resolution": {"integrity": "sha512-JzUXOh0wdNGY54oKng5hliuBkq/+aT1V3YpTM+lrN/GoLQTANZsMaIvmHiHe612rauHvPJnDZkZ+5GZR++1Abg=="}, "dependencies": {"css.escape": "1.5.1", "entities": "4.5.0", "iconv-lite": "0.6.3", "webidl-conversions": "7.0.0", "whatwg-encoding": "2.0.0", "whatwg-mimetype": "3.0.0"}, "dev": false}, "/has-ansi@2.0.0": {"resolution": {"integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"ansi-regex": "2.1.1"}, "dev": false}, "/has-bigints@1.0.2": {"resolution": {"integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="}, "dev": false}, "/has-flag@3.0.0": {"resolution": {"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="}, "engines": {"node": ">=4"}, "dev": false}, "/has-flag@4.0.0": {"resolution": {"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/has-own-prop@2.0.0": {"resolution": {"integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/has-property-descriptors@1.0.2": {"resolution": {"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="}, "dependencies": {"es-define-property": "1.0.0"}, "dev": false}, "/has-proto@1.0.3": {"resolution": {"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/has-symbols@1.0.3": {"resolution": {"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/has-tostringtag@1.0.2": {"resolution": {"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-symbols": "1.0.3"}, "dev": false}, "/has-yarn@2.1.0": {"resolution": {"integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="}, "engines": {"node": ">=8"}, "dev": false}, "/hasown@2.0.2": {"resolution": {"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"function-bind": "1.1.2"}, "dev": false}, "/hast-util-from-html@2.0.1": {"resolution": {"integrity": "sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g=="}, "dependencies": {"@types/hast": "3.0.4", "devlop": "1.1.0", "hast-util-from-parse5": "8.0.1", "parse5": "7.1.2", "vfile": "6.0.1", "vfile-message": "4.0.2"}, "dev": false}, "/hast-util-from-parse5@8.0.1": {"resolution": {"integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ=="}, "dependencies": {"@types/hast": "3.0.4", "@types/unist": "3.0.2", "devlop": "1.1.0", "hastscript": "8.0.0", "property-information": "6.4.1", "vfile": "6.0.1", "vfile-location": "5.0.2", "web-namespaces": "2.0.1"}, "dev": false}, "/hast-util-is-element@3.0.0": {"resolution": {"integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="}, "dependencies": {"@types/hast": "3.0.4"}, "dev": false}, "/hast-util-parse-selector@2.2.5": {"resolution": {"integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="}, "dev": false}, "/hast-util-parse-selector@4.0.0": {"resolution": {"integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="}, "dependencies": {"@types/hast": "3.0.4"}, "dev": false}, "/hast-util-raw@9.0.2": {"resolution": {"integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA=="}, "dependencies": {"@types/hast": "3.0.4", "@types/unist": "3.0.2", "@ungap/structured-clone": "1.2.0", "hast-util-from-parse5": "8.0.1", "hast-util-to-parse5": "8.0.0", "html-void-elements": "3.0.0", "mdast-util-to-hast": "13.1.0", "parse5": "7.1.2", "unist-util-position": "5.0.0", "unist-util-visit": "5.0.0", "vfile": "6.0.1", "web-namespaces": "2.0.1", "zwitch": "2.0.4"}, "dev": false}, "/hast-util-to-html@9.0.0": {"resolution": {"integrity": "sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw=="}, "dependencies": {"@types/hast": "3.0.4", "@types/unist": "3.0.2", "ccount": "2.0.1", "comma-separated-tokens": "2.0.3", "hast-util-raw": "9.0.2", "hast-util-whitespace": "3.0.0", "html-void-elements": "3.0.0", "mdast-util-to-hast": "13.1.0", "property-information": "6.4.1", "space-separated-tokens": "2.0.2", "stringify-entities": "4.0.3", "zwitch": "2.0.4"}, "dev": false}, "/hast-util-to-parse5@8.0.0": {"resolution": {"integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw=="}, "dependencies": {"@types/hast": "3.0.4", "comma-separated-tokens": "2.0.3", "devlop": "1.1.0", "property-information": "6.4.1", "space-separated-tokens": "2.0.2", "web-namespaces": "2.0.1", "zwitch": "2.0.4"}, "dev": false}, "/hast-util-to-string@1.0.4": {"resolution": {"integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w=="}, "dev": false}, "/hast-util-to-text@4.0.0": {"resolution": {"integrity": "sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w=="}, "dependencies": {"@types/hast": "3.0.4", "@types/unist": "3.0.2", "hast-util-is-element": "3.0.0", "unist-util-find-after": "5.0.0"}, "dev": false}, "/hast-util-whitespace@3.0.0": {"resolution": {"integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="}, "dependencies": {"@types/hast": "3.0.4"}, "dev": false}, "/hastscript@6.0.0": {"resolution": {"integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="}, "dependencies": {"@types/hast": "2.3.10", "comma-separated-tokens": "1.0.8", "hast-util-parse-selector": "2.2.5", "property-information": "5.6.0", "space-separated-tokens": "1.1.5"}, "dev": false}, "/hastscript@8.0.0": {"resolution": {"integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw=="}, "dependencies": {"@types/hast": "3.0.4", "comma-separated-tokens": "2.0.3", "hast-util-parse-selector": "4.0.0", "property-information": "6.4.1", "space-separated-tokens": "2.0.2"}, "dev": false}, "/he@1.2.0": {"resolution": {"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="}, "hasBin": true, "dev": false}, "/hint.css@2.7.0": {"resolution": {"integrity": "sha512-kNtr/oXTOFA+qYLFAHY1dKVKZuAbavCPB22+w9kaFzqjB9ZLSFJyksxrVsJCphQiQxAYLazXZdrOaGLRe0hZMA=="}, "dev": false}, "/homedir-polyfill@1.0.3": {"resolution": {"integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"parse-passwd": "1.0.0"}, "dev": false}, "/hosted-git-info@2.8.9": {"resolution": {"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="}, "dev": false}, "/html-encoding-sniffer@2.0.1": {"resolution": {"integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ=="}, "engines": {"node": ">=10"}, "dependencies": {"whatwg-encoding": "1.0.5"}, "dev": false}, "/html-escaper@3.0.3": {"resolution": {"integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="}, "dev": false}, "/html-inline-external@1.0.10": {"resolution": {"integrity": "sha512-OgqLIxwxvAU8MY/XJ5OiAppniOvxmfwhxD73smII/3cdicn64dion6TLamUkZxOVZ/f5tiCHN3giR6zu4k6TuQ=="}, "hasBin": true, "dependencies": {"clipboardy": "2.3.0", "html-minifier": "4.0.0", "jsdom": "16.7.0", "pretty": "2.0.0", "yargs": "16.2.0"}, "transitivePeerDependencies": ["bufferutil", "canvas", "supports-color", "utf-8-validate"], "dev": false}, "/html-minifier@4.0.0": {"resolution": {"integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig=="}, "engines": {"node": ">=6"}, "hasBin": true, "dependencies": {"camel-case": "3.0.0", "clean-css": "4.2.4", "commander": "2.20.3", "he": "1.2.0", "param-case": "2.1.1", "relateurl": "0.2.7", "uglify-js": "3.17.4"}, "dev": false}, "/html-void-elements@3.0.0": {"resolution": {"integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="}, "dev": false}, "/http-cache-semantics@4.1.1": {"resolution": {"integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="}, "dev": false}, "/http-proxy-agent@4.0.1": {"resolution": {"integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg=="}, "engines": {"node": ">= 6"}, "dependencies": {"@tootallnate/once": "1.1.2", "agent-base": "6.0.2", "debug": "4.3.4"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/https-proxy-agent@5.0.1": {"resolution": {"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="}, "engines": {"node": ">= 6"}, "dependencies": {"agent-base": "6.0.2", "debug": "4.3.4"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/human-signals@5.0.0": {"resolution": {"integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="}, "engines": {"node": ">=16.17.0"}, "dev": false}, "/iconv-lite@0.4.24": {"resolution": {"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"safer-buffer": "2.1.2"}, "dev": false}, "/iconv-lite@0.6.3": {"resolution": {"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"safer-buffer": "2.1.2"}, "dev": false}, "/ieee754@1.2.1": {"resolution": {"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="}, "dev": false}, "/ignore@5.3.1": {"resolution": {"integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="}, "engines": {"node": ">= 4"}, "dev": false}, "/immutable@4.3.5": {"resolution": {"integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw=="}, "dev": false}, "/import-fresh@3.3.0": {"resolution": {"integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="}, "engines": {"node": ">=6"}, "dependencies": {"parent-module": "1.0.1", "resolve-from": "4.0.0"}, "dev": false}, "/import-lazy@2.1.0": {"resolution": {"integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A=="}, "engines": {"node": ">=4"}, "dev": false}, "/import-meta-resolve@4.0.0": {"resolution": {"integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA=="}, "dev": false}, "/imurmurhash@0.1.4": {"resolution": {"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="}, "engines": {"node": ">=0.8.19"}, "dev": false}, "/inflight@1.0.6": {"resolution": {"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="}, "dependencies": {"once": "1.4.0", "wrappy": "1.0.2"}, "dev": false}, "/inherits@2.0.4": {"resolution": {"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="}, "dev": false}, "/ini@1.3.7": {"resolution": {"integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ=="}, "dev": false}, "/ini@1.3.8": {"resolution": {"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="}, "dev": false}, "/inquirer@7.3.3": {"resolution": {"integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA=="}, "engines": {"node": ">=8.0.0"}, "dependencies": {"ansi-escapes": "4.3.2", "chalk": "4.1.2", "cli-cursor": "3.1.0", "cli-width": "3.0.0", "external-editor": "3.1.0", "figures": "3.2.0", "lodash": "4.17.21", "mute-stream": "0.0.8", "run-async": "2.4.1", "rxjs": "6.6.7", "string-width": "4.2.3", "strip-ansi": "6.0.1", "through": "2.3.8"}, "dev": false}, "/internal-slot@1.0.7": {"resolution": {"integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"es-errors": "1.3.0", "hasown": "2.0.2", "side-channel": "1.0.6"}, "dev": false}, "/is-alphabetical@1.0.4": {"resolution": {"integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="}, "dev": false}, "/is-alphanumerical@1.0.4": {"resolution": {"integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="}, "dependencies": {"is-alphabetical": "1.0.4", "is-decimal": "1.0.4"}, "dev": false}, "/is-array-buffer@3.0.4": {"resolution": {"integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "get-intrinsic": "1.2.4"}, "dev": false}, "/is-arrayish@0.3.2": {"resolution": {"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="}, "requiresBuild": true, "dev": false, "optional": true}, "/is-async-function@2.0.0": {"resolution": {"integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-tostringtag": "1.0.2"}, "dev": false}, "/is-bigint@1.0.4": {"resolution": {"integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg=="}, "dependencies": {"has-bigints": "1.0.2"}, "dev": false}, "/is-binary-path@2.1.0": {"resolution": {"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="}, "engines": {"node": ">=8"}, "dependencies": {"binary-extensions": "2.3.0"}, "dev": false}, "/is-boolean-object@1.1.2": {"resolution": {"integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "has-tostringtag": "1.0.2"}, "dev": false}, "/is-buffer@1.1.6": {"resolution": {"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="}, "dev": false}, "/is-buffer@2.0.5": {"resolution": {"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/is-callable@1.2.7": {"resolution": {"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/is-ci@1.2.1": {"resolution": {"integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg=="}, "hasBin": true, "dependencies": {"ci-info": "1.6.0"}, "dev": false}, "/is-ci@2.0.0": {"resolution": {"integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w=="}, "hasBin": true, "dependencies": {"ci-info": "2.0.0"}, "dev": false}, "/is-core-module@2.13.1": {"resolution": {"integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw=="}, "dependencies": {"hasown": "2.0.2"}, "dev": false}, "/is-date-object@1.0.5": {"resolution": {"integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-tostringtag": "1.0.2"}, "dev": false}, "/is-decimal@1.0.4": {"resolution": {"integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="}, "dev": false}, "/is-directory@0.3.1": {"resolution": {"integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-docker@2.2.1": {"resolution": {"integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="}, "engines": {"node": ">=8"}, "hasBin": true, "dev": false}, "/is-docker@3.0.0": {"resolution": {"integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "hasBin": true, "dev": false}, "/is-extendable@0.1.1": {"resolution": {"integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-extglob@2.1.1": {"resolution": {"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-finalizationregistry@1.0.2": {"resolution": {"integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw=="}, "dependencies": {"call-bind": "1.0.7"}, "dev": false}, "/is-fullwidth-code-point@2.0.0": {"resolution": {"integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="}, "engines": {"node": ">=4"}, "dev": false}, "/is-fullwidth-code-point@3.0.0": {"resolution": {"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="}, "engines": {"node": ">=8"}, "dev": false}, "/is-generator-function@1.0.10": {"resolution": {"integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-tostringtag": "1.0.2"}, "dev": false}, "/is-glob@4.0.3": {"resolution": {"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"is-extglob": "2.1.1"}, "dev": false}, "/is-hexadecimal@1.0.4": {"resolution": {"integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="}, "dev": false}, "/is-inside-container@1.0.0": {"resolution": {"integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="}, "engines": {"node": ">=14.16"}, "hasBin": true, "dependencies": {"is-docker": "3.0.0"}, "dev": false}, "/is-installed-globally@0.1.0": {"resolution": {"integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw=="}, "engines": {"node": ">=4"}, "dependencies": {"global-dirs": "0.1.1", "is-path-inside": "1.0.1"}, "dev": false}, "/is-installed-globally@0.3.2": {"resolution": {"integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g=="}, "engines": {"node": ">=8"}, "dependencies": {"global-dirs": "2.1.0", "is-path-inside": "3.0.3"}, "dev": false}, "/is-interactive@2.0.0": {"resolution": {"integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="}, "engines": {"node": ">=12"}, "dev": false}, "/is-map@2.0.3": {"resolution": {"integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/is-negative-zero@2.0.3": {"resolution": {"integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/is-npm@1.0.0": {"resolution": {"integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-npm@4.0.0": {"resolution": {"integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig=="}, "engines": {"node": ">=8"}, "dev": false}, "/is-number-object@1.0.7": {"resolution": {"integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-tostringtag": "1.0.2"}, "dev": false}, "/is-number@7.0.0": {"resolution": {"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="}, "engines": {"node": ">=0.12.0"}, "dev": false}, "/is-obj@1.0.1": {"resolution": {"integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-obj@2.0.0": {"resolution": {"integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="}, "engines": {"node": ">=8"}, "dev": false}, "/is-path-inside@1.0.1": {"resolution": {"integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"path-is-inside": "1.0.2"}, "dev": false}, "/is-path-inside@3.0.3": {"resolution": {"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="}, "engines": {"node": ">=8"}, "dev": false}, "/is-plain-obj@4.1.0": {"resolution": {"integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="}, "engines": {"node": ">=12"}, "dev": false}, "/is-potential-custom-element-name@1.0.1": {"resolution": {"integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="}, "dev": false}, "/is-redirect@1.0.0": {"resolution": {"integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-regex@1.1.4": {"resolution": {"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "has-tostringtag": "1.0.2"}, "dev": false}, "/is-retry-allowed@1.2.0": {"resolution": {"integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-set@2.0.3": {"resolution": {"integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/is-shared-array-buffer@1.0.3": {"resolution": {"integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7"}, "dev": false}, "/is-stream@1.1.0": {"resolution": {"integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-stream@3.0.0": {"resolution": {"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dev": false}, "/is-string@1.0.7": {"resolution": {"integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-tostringtag": "1.0.2"}, "dev": false}, "/is-symbol@1.0.4": {"resolution": {"integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"has-symbols": "1.0.3"}, "dev": false}, "/is-typed-array@1.1.13": {"resolution": {"integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"which-typed-array": "1.1.15"}, "dev": false}, "/is-typedarray@1.0.0": {"resolution": {"integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="}, "dev": false}, "/is-unicode-supported@1.3.0": {"resolution": {"integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="}, "engines": {"node": ">=12"}, "dev": false}, "/is-weakmap@2.0.2": {"resolution": {"integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/is-weakref@1.0.2": {"resolution": {"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ=="}, "dependencies": {"call-bind": "1.0.7"}, "dev": false}, "/is-weakset@2.0.3": {"resolution": {"integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "get-intrinsic": "1.2.4"}, "dev": false}, "/is-whitespace@0.3.0": {"resolution": {"integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/is-wsl@2.2.0": {"resolution": {"integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="}, "engines": {"node": ">=8"}, "dependencies": {"is-docker": "2.2.1"}, "dev": false}, "/is-wsl@3.1.0": {"resolution": {"integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="}, "engines": {"node": ">=16"}, "dependencies": {"is-inside-container": "1.0.0"}, "dev": false}, "/is-yarn-global@0.3.0": {"resolution": {"integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="}, "dev": false}, "/isarray@2.0.5": {"resolution": {"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="}, "dev": false}, "/isexe@2.0.0": {"resolution": {"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="}, "dev": false}, "/iterator.prototype@1.1.2": {"resolution": {"integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w=="}, "dependencies": {"define-properties": "1.2.1", "get-intrinsic": "1.2.4", "has-symbols": "1.0.3", "reflect.getprototypeof": "1.0.5", "set-function-name": "2.0.2"}, "dev": false}, "/jackspeak@2.3.6": {"resolution": {"integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ=="}, "engines": {"node": ">=14"}, "dependencies": {"@isaacs/cliui": "8.0.2"}, "optionalDependencies": {"@pkgjs/parseargs": "0.11.0"}, "dev": false}, "/jiti@1.21.0": {"resolution": {"integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q=="}, "hasBin": true, "dev": false}, "/js-beautify@1.15.1": {"resolution": {"integrity": "sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA=="}, "engines": {"node": ">=14"}, "hasBin": true, "dependencies": {"config-chain": "1.1.13", "editorconfig": "1.0.4", "glob": "10.3.10", "js-cookie": "3.0.5", "nopt": "7.2.0"}, "dev": false}, "/js-cookie@3.0.5": {"resolution": {"integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="}, "engines": {"node": ">=14"}, "dev": false}, "/js-tokens@3.0.2": {"resolution": {"integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="}, "dev": false}, "/js-tokens@4.0.0": {"resolution": {"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="}, "dev": false}, "/js-tokens@8.0.3": {"resolution": {"integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw=="}, "dev": false}, "/js-yaml@3.14.1": {"resolution": {"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="}, "hasBin": true, "dependencies": {"argparse": "1.0.10", "esprima": "4.0.1"}, "dev": false}, "/js-yaml@4.1.0": {"resolution": {"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="}, "hasBin": true, "dependencies": {"argparse": "2.0.1"}, "dev": false}, "/jsdom@16.7.0": {"resolution": {"integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw=="}, "engines": {"node": ">=10"}, "peerDependencies": {"canvas": "^2.5.0"}, "peerDependenciesMeta": {"canvas": {"optional": true}}, "dependencies": {"abab": "2.0.6", "acorn": "8.11.3", "acorn-globals": "6.0.0", "cssom": "0.4.4", "cssstyle": "2.3.0", "data-urls": "2.0.0", "decimal.js": "10.4.3", "domexception": "2.0.1", "escodegen": "2.1.0", "form-data": "3.0.1", "html-encoding-sniffer": "2.0.1", "http-proxy-agent": "4.0.1", "https-proxy-agent": "5.0.1", "is-potential-custom-element-name": "1.0.1", "nwsapi": "2.2.7", "parse5": "6.0.1", "saxes": "5.0.1", "symbol-tree": "3.2.4", "tough-cookie": "4.1.3", "w3c-hr-time": "1.0.2", "w3c-xmlserializer": "2.0.0", "webidl-conversions": "6.1.0", "whatwg-encoding": "1.0.5", "whatwg-mimetype": "2.3.0", "whatwg-url": "8.7.0", "ws": "7.5.9", "xml-name-validator": "3.0.0"}, "transitivePeerDependencies": ["bufferutil", "supports-color", "utf-8-validate"], "dev": false}, "/jsesc@2.5.2": {"resolution": {"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="}, "engines": {"node": ">=4"}, "hasBin": true, "dev": false}, "/json-buffer@3.0.0": {"resolution": {"integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ=="}, "dev": false}, "/json-buffer@3.0.1": {"resolution": {"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="}, "dev": false}, "/json-schema-traverse@0.4.1": {"resolution": {"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="}, "dev": false}, "/json-stable-stringify-without-jsonify@1.0.1": {"resolution": {"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="}, "dev": false}, "/json5@2.2.3": {"resolution": {"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="}, "engines": {"node": ">=6"}, "hasBin": true, "dev": false}, "/jsonc-parser@3.2.1": {"resolution": {"integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="}, "dev": false}, "/jsonfile@4.0.0": {"resolution": {"integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="}, "optionalDependencies": {"graceful-fs": "4.2.11"}, "dev": false}, "/jsx-ast-utils@3.3.5": {"resolution": {"integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="}, "engines": {"node": ">=4.0"}, "dependencies": {"array-includes": "3.1.7", "array.prototype.flat": "1.3.2", "object.assign": "4.1.5", "object.values": "1.1.7"}, "dev": false}, "/keyv@3.1.0": {"resolution": {"integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA=="}, "dependencies": {"json-buffer": "3.0.0"}, "dev": false}, "/keyv@4.5.4": {"resolution": {"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="}, "dependencies": {"json-buffer": "3.0.1"}, "dev": false}, "/kind-of@3.2.2": {"resolution": {"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"is-buffer": "1.1.6"}, "dev": false}, "/kind-of@6.0.3": {"resolution": {"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/kleur@3.0.3": {"resolution": {"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="}, "engines": {"node": ">=6"}, "dev": false}, "/kleur@4.1.5": {"resolution": {"integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="}, "engines": {"node": ">=6"}, "dev": false}, "/language-subtag-registry@0.3.22": {"resolution": {"integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w=="}, "dev": false}, "/language-tags@1.0.9": {"resolution": {"integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="}, "engines": {"node": ">=0.10"}, "dependencies": {"language-subtag-registry": "0.3.22"}, "dev": false}, "/latest-version@3.1.0": {"resolution": {"integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w=="}, "engines": {"node": ">=4"}, "dependencies": {"package-json": "4.0.1"}, "dev": false}, "/latest-version@5.1.0": {"resolution": {"integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA=="}, "engines": {"node": ">=8"}, "dependencies": {"package-json": "6.5.0"}, "dev": false}, "/levn@0.4.1": {"resolution": {"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="}, "engines": {"node": ">= 0.8.0"}, "dependencies": {"prelude-ls": "1.2.1", "type-check": "0.4.0"}, "dev": false}, "/libnpx@10.2.4": {"resolution": {"integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA=="}, "engines": {"node": ">=4"}, "dependencies": {"dotenv": "5.0.1", "npm-package-arg": "6.1.1", "rimraf": "2.7.1", "safe-buffer": "5.2.1", "update-notifier": "2.5.0", "which": "1.3.1", "y18n": "4.0.3", "yargs": "14.2.3"}, "dev": false}, "/lilconfig@2.1.0": {"resolution": {"integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="}, "engines": {"node": ">=10"}, "dev": false}, "/lilconfig@3.1.1": {"resolution": {"integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ=="}, "engines": {"node": ">=14"}, "dev": false}, "/lines-and-columns@1.2.4": {"resolution": {"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="}, "dev": false}, "/listify@1.0.3": {"resolution": {"integrity": "sha512-083swF7iH7bx8666zdzBColpgEuy46HjN3r1isD4zV6Ix7FuHfb/2/WVnl4CH8hjuoWeFF7P5KkKNXUnJCFEJg=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/load-yaml-file@0.2.0": {"resolution": {"integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw=="}, "engines": {"node": ">=6"}, "dependencies": {"graceful-fs": "4.2.11", "js-yaml": "3.14.1", "pify": "4.0.1", "strip-bom": "3.0.0"}, "dev": false}, "/local-pkg@0.5.0": {"resolution": {"integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg=="}, "engines": {"node": ">=14"}, "dependencies": {"mlly": "1.6.1", "pkg-types": "1.0.3"}, "dev": false}, "/locate-path@3.0.0": {"resolution": {"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="}, "engines": {"node": ">=6"}, "dependencies": {"p-locate": "3.0.0", "path-exists": "3.0.0"}, "dev": false}, "/locate-path@5.0.0": {"resolution": {"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="}, "engines": {"node": ">=8"}, "dependencies": {"p-locate": "4.1.0"}, "dev": false}, "/locate-path@6.0.0": {"resolution": {"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="}, "engines": {"node": ">=10"}, "dependencies": {"p-locate": "5.0.0"}, "dev": false}, "/lodash.merge@4.6.2": {"resolution": {"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="}, "dev": false}, "/lodash@4.17.21": {"resolution": {"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="}, "dev": false}, "/log-symbols@5.1.0": {"resolution": {"integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA=="}, "engines": {"node": ">=12"}, "dependencies": {"chalk": "5.3.0", "is-unicode-supported": "1.3.0"}, "dev": false}, "/longest-streak@3.1.0": {"resolution": {"integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="}, "dev": false}, "/longest@2.0.1": {"resolution": {"integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/loupe@2.3.7": {"resolution": {"integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="}, "dependencies": {"get-func-name": "2.0.2"}, "dev": false}, "/lower-case@1.1.4": {"resolution": {"integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA=="}, "dev": false}, "/lowercase-keys@1.0.1": {"resolution": {"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/lowercase-keys@2.0.0": {"resolution": {"integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="}, "engines": {"node": ">=8"}, "dev": false}, "/lru-cache@10.2.0": {"resolution": {"integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q=="}, "engines": {"node": "14 || >=16.14"}, "dev": false}, "/lru-cache@4.1.5": {"resolution": {"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="}, "dependencies": {"pseudomap": "1.0.2", "yallist": "2.1.2"}, "dev": false}, "/lru-cache@5.1.1": {"resolution": {"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="}, "dependencies": {"yallist": "3.1.1"}, "dev": false}, "/lru-cache@6.0.0": {"resolution": {"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="}, "engines": {"node": ">=10"}, "dependencies": {"yallist": "4.0.0"}, "dev": false}, "/magic-string@0.30.8": {"resolution": {"integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="}, "engines": {"node": ">=12"}, "dependencies": {"@jridgewell/sourcemap-codec": "1.4.15"}, "dev": false}, "/make-dir@1.3.0": {"resolution": {"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ=="}, "engines": {"node": ">=4"}, "dependencies": {"pify": "3.0.0"}, "dev": false}, "/make-dir@3.1.0": {"resolution": {"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="}, "engines": {"node": ">=8"}, "dependencies": {"semver": "6.3.1"}, "dev": false}, "/markdown-table@3.0.3": {"resolution": {"integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw=="}, "dev": false}, "/mdast-util-definitions@6.0.0": {"resolution": {"integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="}, "dependencies": {"@types/mdast": "4.0.3", "@types/unist": "3.0.2", "unist-util-visit": "5.0.0"}, "dev": false}, "/mdast-util-find-and-replace@3.0.1": {"resolution": {"integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA=="}, "dependencies": {"@types/mdast": "4.0.3", "escape-string-regexp": "5.0.0", "unist-util-is": "6.0.0", "unist-util-visit-parents": "6.0.1"}, "dev": false}, "/mdast-util-from-markdown@2.0.0": {"resolution": {"integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA=="}, "dependencies": {"@types/mdast": "4.0.3", "@types/unist": "3.0.2", "decode-named-character-reference": "1.0.2", "devlop": "1.1.0", "mdast-util-to-string": "4.0.0", "micromark": "4.0.0", "micromark-util-decode-numeric-character-reference": "2.0.1", "micromark-util-decode-string": "2.0.0", "micromark-util-normalize-identifier": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0", "unist-util-stringify-position": "4.0.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-gfm-autolink-literal@2.0.0": {"resolution": {"integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg=="}, "dependencies": {"@types/mdast": "4.0.3", "ccount": "2.0.1", "devlop": "1.1.0", "mdast-util-find-and-replace": "3.0.1", "micromark-util-character": "2.1.0"}, "dev": false}, "/mdast-util-gfm-footnote@2.0.0": {"resolution": {"integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ=="}, "dependencies": {"@types/mdast": "4.0.3", "devlop": "1.1.0", "mdast-util-from-markdown": "2.0.0", "mdast-util-to-markdown": "2.1.0", "micromark-util-normalize-identifier": "2.0.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-gfm-strikethrough@2.0.0": {"resolution": {"integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="}, "dependencies": {"@types/mdast": "4.0.3", "mdast-util-from-markdown": "2.0.0", "mdast-util-to-markdown": "2.1.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-gfm-table@2.0.0": {"resolution": {"integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="}, "dependencies": {"@types/mdast": "4.0.3", "devlop": "1.1.0", "markdown-table": "3.0.3", "mdast-util-from-markdown": "2.0.0", "mdast-util-to-markdown": "2.1.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-gfm-task-list-item@2.0.0": {"resolution": {"integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="}, "dependencies": {"@types/mdast": "4.0.3", "devlop": "1.1.0", "mdast-util-from-markdown": "2.0.0", "mdast-util-to-markdown": "2.1.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-gfm@3.0.0": {"resolution": {"integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw=="}, "dependencies": {"mdast-util-from-markdown": "2.0.0", "mdast-util-gfm-autolink-literal": "2.0.0", "mdast-util-gfm-footnote": "2.0.0", "mdast-util-gfm-strikethrough": "2.0.0", "mdast-util-gfm-table": "2.0.0", "mdast-util-gfm-task-list-item": "2.0.0", "mdast-util-to-markdown": "2.1.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/mdast-util-phrasing@4.1.0": {"resolution": {"integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="}, "dependencies": {"@types/mdast": "4.0.3", "unist-util-is": "6.0.0"}, "dev": false}, "/mdast-util-to-hast@13.1.0": {"resolution": {"integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA=="}, "dependencies": {"@types/hast": "3.0.4", "@types/mdast": "4.0.3", "@ungap/structured-clone": "1.2.0", "devlop": "1.1.0", "micromark-util-sanitize-uri": "2.0.0", "trim-lines": "3.0.1", "unist-util-position": "5.0.0", "unist-util-visit": "5.0.0", "vfile": "6.0.1"}, "dev": false}, "/mdast-util-to-markdown@2.1.0": {"resolution": {"integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ=="}, "dependencies": {"@types/mdast": "4.0.3", "@types/unist": "3.0.2", "longest-streak": "3.1.0", "mdast-util-phrasing": "4.1.0", "mdast-util-to-string": "4.0.0", "micromark-util-decode-string": "2.0.0", "unist-util-visit": "5.0.0", "zwitch": "2.0.4"}, "dev": false}, "/mdast-util-to-string@4.0.0": {"resolution": {"integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="}, "dependencies": {"@types/mdast": "4.0.3"}, "dev": false}, "/merge-stream@2.0.0": {"resolution": {"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="}, "dev": false}, "/merge2@1.4.1": {"resolution": {"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="}, "engines": {"node": ">= 8"}, "dev": false}, "/micromark-core-commonmark@2.0.0": {"resolution": {"integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA=="}, "dependencies": {"decode-named-character-reference": "1.0.2", "devlop": "1.1.0", "micromark-factory-destination": "2.0.0", "micromark-factory-label": "2.0.0", "micromark-factory-space": "2.0.0", "micromark-factory-title": "2.0.0", "micromark-factory-whitespace": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-chunked": "2.0.0", "micromark-util-classify-character": "2.0.0", "micromark-util-html-tag-name": "2.0.0", "micromark-util-normalize-identifier": "2.0.0", "micromark-util-resolve-all": "2.0.0", "micromark-util-subtokenize": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-autolink-literal@2.0.0": {"resolution": {"integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg=="}, "dependencies": {"micromark-util-character": "2.1.0", "micromark-util-sanitize-uri": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-footnote@2.0.0": {"resolution": {"integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg=="}, "dependencies": {"devlop": "1.1.0", "micromark-core-commonmark": "2.0.0", "micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-normalize-identifier": "2.0.0", "micromark-util-sanitize-uri": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-strikethrough@2.0.0": {"resolution": {"integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw=="}, "dependencies": {"devlop": "1.1.0", "micromark-util-chunked": "2.0.0", "micromark-util-classify-character": "2.0.0", "micromark-util-resolve-all": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-table@2.0.0": {"resolution": {"integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw=="}, "dependencies": {"devlop": "1.1.0", "micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-tagfilter@2.0.0": {"resolution": {"integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="}, "dependencies": {"micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm-task-list-item@2.0.1": {"resolution": {"integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw=="}, "dependencies": {"devlop": "1.1.0", "micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-extension-gfm@3.0.0": {"resolution": {"integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="}, "dependencies": {"micromark-extension-gfm-autolink-literal": "2.0.0", "micromark-extension-gfm-footnote": "2.0.0", "micromark-extension-gfm-strikethrough": "2.0.0", "micromark-extension-gfm-table": "2.0.0", "micromark-extension-gfm-tagfilter": "2.0.0", "micromark-extension-gfm-task-list-item": "2.0.1", "micromark-util-combine-extensions": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-factory-destination@2.0.0": {"resolution": {"integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA=="}, "dependencies": {"micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-factory-label@2.0.0": {"resolution": {"integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw=="}, "dependencies": {"devlop": "1.1.0", "micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-factory-space@2.0.0": {"resolution": {"integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg=="}, "dependencies": {"micromark-util-character": "2.1.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-factory-title@2.0.0": {"resolution": {"integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A=="}, "dependencies": {"micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-factory-whitespace@2.0.0": {"resolution": {"integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA=="}, "dependencies": {"micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-character@2.1.0": {"resolution": {"integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ=="}, "dependencies": {"micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-chunked@2.0.0": {"resolution": {"integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg=="}, "dependencies": {"micromark-util-symbol": "2.0.0"}, "dev": false}, "/micromark-util-classify-character@2.0.0": {"resolution": {"integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw=="}, "dependencies": {"micromark-util-character": "2.1.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-combine-extensions@2.0.0": {"resolution": {"integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ=="}, "dependencies": {"micromark-util-chunked": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-decode-numeric-character-reference@2.0.1": {"resolution": {"integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ=="}, "dependencies": {"micromark-util-symbol": "2.0.0"}, "dev": false}, "/micromark-util-decode-string@2.0.0": {"resolution": {"integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA=="}, "dependencies": {"decode-named-character-reference": "1.0.2", "micromark-util-character": "2.1.0", "micromark-util-decode-numeric-character-reference": "2.0.1", "micromark-util-symbol": "2.0.0"}, "dev": false}, "/micromark-util-encode@2.0.0": {"resolution": {"integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA=="}, "dev": false}, "/micromark-util-html-tag-name@2.0.0": {"resolution": {"integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw=="}, "dev": false}, "/micromark-util-normalize-identifier@2.0.0": {"resolution": {"integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w=="}, "dependencies": {"micromark-util-symbol": "2.0.0"}, "dev": false}, "/micromark-util-resolve-all@2.0.0": {"resolution": {"integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA=="}, "dependencies": {"micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-sanitize-uri@2.0.0": {"resolution": {"integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw=="}, "dependencies": {"micromark-util-character": "2.1.0", "micromark-util-encode": "2.0.0", "micromark-util-symbol": "2.0.0"}, "dev": false}, "/micromark-util-subtokenize@2.0.0": {"resolution": {"integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg=="}, "dependencies": {"devlop": "1.1.0", "micromark-util-chunked": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "dev": false}, "/micromark-util-symbol@2.0.0": {"resolution": {"integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw=="}, "dev": false}, "/micromark-util-types@2.0.0": {"resolution": {"integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w=="}, "dev": false}, "/micromark@4.0.0": {"resolution": {"integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ=="}, "dependencies": {"@types/debug": "4.1.12", "debug": "4.3.4", "decode-named-character-reference": "1.0.2", "devlop": "1.1.0", "micromark-core-commonmark": "2.0.0", "micromark-factory-space": "2.0.0", "micromark-util-character": "2.1.0", "micromark-util-chunked": "2.0.0", "micromark-util-combine-extensions": "2.0.0", "micromark-util-decode-numeric-character-reference": "2.0.1", "micromark-util-encode": "2.0.0", "micromark-util-normalize-identifier": "2.0.0", "micromark-util-resolve-all": "2.0.0", "micromark-util-sanitize-uri": "2.0.0", "micromark-util-subtokenize": "2.0.0", "micromark-util-symbol": "2.0.0", "micromark-util-types": "2.0.0"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/micromatch@4.0.5": {"resolution": {"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="}, "engines": {"node": ">=8.6"}, "dependencies": {"braces": "3.0.2", "picomatch": "2.3.1"}, "dev": false}, "/middleearth-names@1.1.0": {"resolution": {"integrity": "sha512-Oo1mbq9odpn6KHsDs8/UA5xFfX/gcrY+jWZpvd5MDaX0tjkxA7S7NTREQuqD7DWfluDgygjhKvETMWbwd3A9sA=="}, "dependencies": {"unique-random-array": "1.0.0"}, "dev": false}, "/mime-db@1.52.0": {"resolution": {"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="}, "engines": {"node": ">= 0.6"}, "dev": false}, "/mime-types@2.1.35": {"resolution": {"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="}, "engines": {"node": ">= 0.6"}, "dependencies": {"mime-db": "1.52.0"}, "dev": false}, "/mime@3.0.0": {"resolution": {"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="}, "engines": {"node": ">=10.0.0"}, "hasBin": true, "dev": false}, "/mimic-fn@2.1.0": {"resolution": {"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="}, "engines": {"node": ">=6"}, "dev": false}, "/mimic-fn@4.0.0": {"resolution": {"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="}, "engines": {"node": ">=12"}, "dev": false}, "/mimic-response@1.0.1": {"resolution": {"integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/mimic-response@3.1.0": {"resolution": {"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="}, "engines": {"node": ">=10"}, "requiresBuild": true, "dev": false, "optional": true}, "/minimatch@3.1.2": {"resolution": {"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="}, "dependencies": {"brace-expansion": "1.1.11"}, "dev": false}, "/minimatch@9.0.1": {"resolution": {"integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "dependencies": {"brace-expansion": "2.0.1"}, "dev": false}, "/minimatch@9.0.3": {"resolution": {"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "dependencies": {"brace-expansion": "2.0.1"}, "dev": false}, "/minimist@1.2.8": {"resolution": {"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="}, "dev": false}, "/minipass@7.0.4": {"resolution": {"integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "dev": false}, "/mkdirp-classic@0.5.3": {"resolution": {"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="}, "requiresBuild": true, "dev": false, "optional": true}, "/mlly@1.6.1": {"resolution": {"integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA=="}, "dependencies": {"acorn": "8.11.3", "pathe": "1.1.2", "pkg-types": "1.0.3", "ufo": "1.4.0"}, "dev": false}, "/mrm-core@6.1.7": {"resolution": {"integrity": "sha512-jLGWrkupcgGIsLerrI/xmM/dFHbaoehRsuVbgYBrxYKXNMRBHN3Mgkd8cw+/ZCCoiZEXF8/SaZol0GCp6oBQ9g=="}, "engines": {"node": ">=10.13"}, "dependencies": {"babel-code-frame": "6.26.0", "comment-json": "2.4.2", "detect-indent": "6.1.0", "editorconfig": "0.15.3", "find-up": "4.1.0", "fs-extra": "8.1.0", "kleur": "3.0.3", "listify": "1.0.3", "lodash": "4.17.21", "minimist": "1.2.8", "prop-ini": "0.0.2", "rc": "1.2.8", "readme-badger": "0.3.0", "semver": "6.3.1", "smpltmpl": "1.0.2", "split-lines": "2.1.0", "strip-bom": "4.0.0", "validate-npm-package-name": "3.0.0", "webpack-merge": "4.2.2", "yaml": "2.4.1"}, "dev": false}, "/mrm@3.0.10": {"resolution": {"integrity": "sha512-aRByZsPXMM8W0NHNH9afkKyk5OW4bB5pYNRIN+8iSVfpMAzqeMejmj/yIYcdFNJTksXmdPMfTaucm2NYdh4xIw=="}, "engines": {"node": ">=10.13"}, "hasBin": true, "dependencies": {"git-username": "1.0.0", "glob": "7.2.3", "inquirer": "7.3.3", "is-directory": "0.3.1", "kleur": "3.0.3", "libnpx": "10.2.4", "listify": "1.0.3", "lodash": "4.17.21", "longest": "2.0.1", "middleearth-names": "1.1.0", "minimist": "1.2.8", "mrm-core": "6.1.7", "semver-utils": "1.1.4", "update-notifier": "4.1.3", "user-home": "2.0.0", "user-meta": "1.0.0", "which": "2.0.2"}, "dev": false}, "/mrmime@1.0.1": {"resolution": {"integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw=="}, "engines": {"node": ">=10"}, "dev": false}, "/ms@2.1.2": {"resolution": {"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="}, "dev": false}, "/muggle-string@0.4.1": {"resolution": {"integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="}, "dev": false}, "/mute-stream@0.0.8": {"resolution": {"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="}, "dev": false}, "/mz@2.7.0": {"resolution": {"integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="}, "dependencies": {"any-promise": "1.3.0", "object-assign": "4.1.1", "thenify-all": "1.6.0"}, "dev": false}, "/nanoid@3.3.7": {"resolution": {"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="}, "engines": {"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"}, "hasBin": true, "dev": false}, "/napi-build-utils@1.0.2": {"resolution": {"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="}, "requiresBuild": true, "dev": false, "optional": true}, "/natural-compare@1.4.0": {"resolution": {"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="}, "dev": false}, "/nice-try@1.0.5": {"resolution": {"integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="}, "dev": false}, "/nlcst-to-string@3.1.1": {"resolution": {"integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw=="}, "dependencies": {"@types/nlcst": "1.0.4"}, "dev": false}, "/no-case@2.3.2": {"resolution": {"integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ=="}, "dependencies": {"lower-case": "1.1.4"}, "dev": false}, "/node-abi@3.56.0": {"resolution": {"integrity": "sha512-fZjdhDOeRcaS+rcpve7XuwHBmktS1nS1gzgghwKUQQ8nTy2FdSDr6ZT8k6YhvlJeHmmQMYiT/IH9hfco5zeW2Q=="}, "engines": {"node": ">=10"}, "requiresBuild": true, "dependencies": {"semver": "7.6.0"}, "dev": false, "optional": true}, "/node-addon-api@6.1.0": {"resolution": {"integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="}, "requiresBuild": true, "dev": false, "optional": true}, "/node-releases@2.0.14": {"resolution": {"integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="}, "dev": false}, "/nopt@7.2.0": {"resolution": {"integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA=="}, "engines": {"node": "^14.17.0 || ^16.13.0 || >=18.0.0"}, "hasBin": true, "dependencies": {"abbrev": "2.0.0"}, "dev": false}, "/normalize-path@3.0.0": {"resolution": {"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/normalize-range@0.1.2": {"resolution": {"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/normalize-url@4.5.1": {"resolution": {"integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA=="}, "engines": {"node": ">=8"}, "dev": false}, "/npm-package-arg@6.1.1": {"resolution": {"integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg=="}, "dependencies": {"hosted-git-info": "2.8.9", "osenv": "0.1.5", "semver": "5.7.2", "validate-npm-package-name": "3.0.0"}, "dev": false}, "/npm-run-path@2.0.2": {"resolution": {"integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw=="}, "engines": {"node": ">=4"}, "dependencies": {"path-key": "2.0.1"}, "dev": false}, "/npm-run-path@5.3.0": {"resolution": {"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dependencies": {"path-key": "4.0.0"}, "dev": false}, "/nwsapi@2.2.7": {"resolution": {"integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="}, "dev": false}, "/object-assign@4.1.1": {"resolution": {"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/object-hash@3.0.0": {"resolution": {"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="}, "engines": {"node": ">= 6"}, "dev": false}, "/object-inspect@1.13.1": {"resolution": {"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ=="}, "dev": false}, "/object-keys@1.1.1": {"resolution": {"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/object.assign@4.1.5": {"resolution": {"integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "has-symbols": "1.0.3", "object-keys": "1.1.1"}, "dev": false}, "/object.entries@1.1.7": {"resolution": {"integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/object.fromentries@2.0.7": {"resolution": {"integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/object.values@1.1.7": {"resolution": {"integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/once@1.4.0": {"resolution": {"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="}, "dependencies": {"wrappy": "1.0.2"}, "dev": false}, "/onetime@5.1.2": {"resolution": {"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="}, "engines": {"node": ">=6"}, "dependencies": {"mimic-fn": "2.1.0"}, "dev": false}, "/onetime@6.0.0": {"resolution": {"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="}, "engines": {"node": ">=12"}, "dependencies": {"mimic-fn": "4.0.0"}, "dev": false}, "/optionator@0.9.3": {"resolution": {"integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg=="}, "engines": {"node": ">= 0.8.0"}, "dependencies": {"@aashutoshrathi/word-wrap": "1.2.6", "deep-is": "0.1.4", "fast-levenshtein": "2.0.6", "levn": "0.4.1", "prelude-ls": "1.2.1", "type-check": "0.4.0"}, "dev": false}, "/ora@7.0.1": {"resolution": {"integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw=="}, "engines": {"node": ">=16"}, "dependencies": {"chalk": "5.3.0", "cli-cursor": "4.0.0", "cli-spinners": "2.9.2", "is-interactive": "2.0.0", "is-unicode-supported": "1.3.0", "log-symbols": "5.1.0", "stdin-discarder": "0.1.0", "string-width": "6.1.0", "strip-ansi": "7.1.0"}, "dev": false}, "/os-homedir@1.0.2": {"resolution": {"integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/os-tmpdir@1.0.2": {"resolution": {"integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/osenv@0.1.5": {"resolution": {"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g=="}, "dependencies": {"os-homedir": "1.0.2", "os-tmpdir": "1.0.2"}, "dev": false}, "/p-cancelable@1.1.0": {"resolution": {"integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="}, "engines": {"node": ">=6"}, "dev": false}, "/p-finally@1.0.0": {"resolution": {"integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="}, "engines": {"node": ">=4"}, "dev": false}, "/p-limit@2.3.0": {"resolution": {"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="}, "engines": {"node": ">=6"}, "dependencies": {"p-try": "2.2.0"}, "dev": false}, "/p-limit@3.1.0": {"resolution": {"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="}, "engines": {"node": ">=10"}, "dependencies": {"yocto-queue": "0.1.0"}, "dev": false}, "/p-limit@5.0.0": {"resolution": {"integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ=="}, "engines": {"node": ">=18"}, "dependencies": {"yocto-queue": "1.0.0"}, "dev": false}, "/p-locate@3.0.0": {"resolution": {"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="}, "engines": {"node": ">=6"}, "dependencies": {"p-limit": "2.3.0"}, "dev": false}, "/p-locate@4.1.0": {"resolution": {"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="}, "engines": {"node": ">=8"}, "dependencies": {"p-limit": "2.3.0"}, "dev": false}, "/p-locate@5.0.0": {"resolution": {"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="}, "engines": {"node": ">=10"}, "dependencies": {"p-limit": "3.1.0"}, "dev": false}, "/p-queue@8.0.1": {"resolution": {"integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA=="}, "engines": {"node": ">=18"}, "dependencies": {"eventemitter3": "5.0.1", "p-timeout": "6.1.2"}, "dev": false}, "/p-timeout@6.1.2": {"resolution": {"integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ=="}, "engines": {"node": ">=14.16"}, "dev": false}, "/p-try@2.2.0": {"resolution": {"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="}, "engines": {"node": ">=6"}, "dev": false}, "/package-json@4.0.1": {"resolution": {"integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA=="}, "engines": {"node": ">=4"}, "dependencies": {"got": "6.7.1", "registry-auth-token": "3.4.0", "registry-url": "3.1.0", "semver": "5.7.2"}, "dev": false}, "/package-json@6.5.0": {"resolution": {"integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ=="}, "engines": {"node": ">=8"}, "dependencies": {"got": "9.6.0", "registry-auth-token": "4.2.2", "registry-url": "5.1.0", "semver": "6.3.1"}, "dev": false}, "/param-case@2.1.1": {"resolution": {"integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w=="}, "dependencies": {"no-case": "2.3.2"}, "dev": false}, "/parent-module@1.0.1": {"resolution": {"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="}, "engines": {"node": ">=6"}, "dependencies": {"callsites": "3.1.0"}, "dev": false}, "/parse-entities@2.0.0": {"resolution": {"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ=="}, "dependencies": {"character-entities": "1.2.4", "character-entities-legacy": "1.1.4", "character-reference-invalid": "1.1.4", "is-alphanumerical": "1.0.4", "is-decimal": "1.0.4", "is-hexadecimal": "1.0.4"}, "dev": false}, "/parse-git-config@1.1.1": {"resolution": {"integrity": "sha512-S3LGXJZVSy/hswvbSkfdbKBRVsnqKrVu6j8fcvdtJ4TxosSELyQDsJPuGPXuZ+EyuYuJd3O4uAF8gcISR0OFrQ=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"extend-shallow": "2.0.1", "fs-exists-sync": "0.1.0", "git-config-path": "1.0.1", "ini": "1.3.8"}, "dev": false}, "/parse-github-url@1.0.2": {"resolution": {"integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw=="}, "engines": {"node": ">=0.10.0"}, "hasBin": true, "dev": false}, "/parse-latin@5.0.1": {"resolution": {"integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg=="}, "dependencies": {"nlcst-to-string": "3.1.1", "unist-util-modify-children": "3.1.1", "unist-util-visit-children": "2.0.2"}, "dev": false}, "/parse-passwd@1.0.0": {"resolution": {"integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/parse5@6.0.1": {"resolution": {"integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="}, "dev": false}, "/parse5@7.1.2": {"resolution": {"integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw=="}, "dependencies": {"entities": "4.5.0"}, "dev": false}, "/path-browserify@1.0.1": {"resolution": {"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="}, "dev": false}, "/path-exists@3.0.0": {"resolution": {"integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/path-exists@4.0.0": {"resolution": {"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="}, "engines": {"node": ">=8"}, "dev": false}, "/path-is-absolute@1.0.1": {"resolution": {"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/path-is-inside@1.0.2": {"resolution": {"integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="}, "dev": false}, "/path-key@2.0.1": {"resolution": {"integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="}, "engines": {"node": ">=4"}, "dev": false}, "/path-key@3.1.1": {"resolution": {"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="}, "engines": {"node": ">=8"}, "dev": false}, "/path-key@4.0.0": {"resolution": {"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="}, "engines": {"node": ">=12"}, "dev": false}, "/path-parse@1.0.7": {"resolution": {"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="}, "dev": false}, "/path-scurry@1.10.1": {"resolution": {"integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "dependencies": {"lru-cache": "10.2.0", "minipass": "7.0.4"}, "dev": false}, "/path-to-regexp@6.2.1": {"resolution": {"integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw=="}, "dev": false}, "/path-type@4.0.0": {"resolution": {"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="}, "engines": {"node": ">=8"}, "dev": false}, "/pathe@1.1.2": {"resolution": {"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="}, "dev": false}, "/pathval@1.1.1": {"resolution": {"integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="}, "dev": false}, "/picocolors@1.0.0": {"resolution": {"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="}, "dev": false}, "/picomatch@2.3.1": {"resolution": {"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="}, "engines": {"node": ">=8.6"}, "dev": false}, "/pify@2.3.0": {"resolution": {"integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/pify@3.0.0": {"resolution": {"integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="}, "engines": {"node": ">=4"}, "dev": false}, "/pify@4.0.1": {"resolution": {"integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="}, "engines": {"node": ">=6"}, "dev": false}, "/pirates@4.0.6": {"resolution": {"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg=="}, "engines": {"node": ">= 6"}, "dev": false}, "/pkg-dir@4.2.0": {"resolution": {"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="}, "engines": {"node": ">=8"}, "dependencies": {"find-up": "4.1.0"}, "dev": false}, "/pkg-types@1.0.3": {"resolution": {"integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A=="}, "dependencies": {"jsonc-parser": "3.2.1", "mlly": "1.6.1", "pathe": "1.1.2"}, "dev": false}, "/playwright-core@1.53.1": {"resolution": {"integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg=="}, "engines": {"node": ">=18"}, "hasBin": true, "dev": false}, "/playwright@1.53.1": {"resolution": {"integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw=="}, "engines": {"node": ">=18"}, "hasBin": true, "dependencies": {"playwright-core": "1.53.1"}, "optionalDependencies": {"fsevents": "2.3.2"}, "dev": false}, "/possible-typed-array-names@1.0.0": {"resolution": {"integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/postcss-import@15.1.0(postcss@8.4.35)": {"resolution": {"integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="}, "engines": {"node": ">=14.0.0"}, "peerDependencies": {"postcss": "^8.0.0"}, "dependencies": {"postcss": "8.4.35", "postcss-value-parser": "4.2.0", "read-cache": "1.0.0", "resolve": "1.22.8"}, "dev": false}, "/postcss-js@4.0.1(postcss@8.4.35)": {"resolution": {"integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="}, "engines": {"node": "^12 || ^14 || >= 16"}, "peerDependencies": {"postcss": "^8.4.21"}, "dependencies": {"camelcase-css": "2.0.1", "postcss": "8.4.35"}, "dev": false}, "/postcss-load-config@4.0.2(postcss@8.4.35)": {"resolution": {"integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="}, "engines": {"node": ">= 14"}, "peerDependencies": {"postcss": ">=8.0.9", "ts-node": ">=9.0.0"}, "peerDependenciesMeta": {"postcss": {"optional": true}, "ts-node": {"optional": true}}, "dependencies": {"lilconfig": "3.1.1", "postcss": "8.4.35", "yaml": "2.4.1"}, "dev": false}, "/postcss-nested@6.0.1(postcss@8.4.35)": {"resolution": {"integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ=="}, "engines": {"node": ">=12.0"}, "peerDependencies": {"postcss": "^8.2.14"}, "dependencies": {"postcss": "8.4.35", "postcss-selector-parser": "6.0.16"}, "dev": false}, "/postcss-selector-parser@6.0.16": {"resolution": {"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw=="}, "engines": {"node": ">=4"}, "dependencies": {"cssesc": "3.0.0", "util-deprecate": "1.0.2"}, "dev": false}, "/postcss-value-parser@4.2.0": {"resolution": {"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="}, "dev": false}, "/postcss@8.4.35": {"resolution": {"integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA=="}, "engines": {"node": "^10 || ^12 || >=14"}, "dependencies": {"nanoid": "3.3.7", "picocolors": "1.0.0", "source-map-js": "1.0.2"}, "dev": false}, "/prebuild-install@7.1.2": {"resolution": {"integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ=="}, "engines": {"node": ">=10"}, "hasBin": true, "requiresBuild": true, "dependencies": {"detect-libc": "2.0.2", "expand-template": "2.0.3", "github-from-package": "0.0.0", "minimist": "1.2.8", "mkdirp-classic": "0.5.3", "napi-build-utils": "1.0.2", "node-abi": "3.56.0", "pump": "3.0.0", "rc": "1.2.8", "simple-get": "4.0.1", "tar-fs": "2.1.1", "tunnel-agent": "0.6.0"}, "dev": false, "optional": true}, "/preferred-pm@3.1.3": {"resolution": {"integrity": "sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w=="}, "engines": {"node": ">=10"}, "dependencies": {"find-up": "5.0.0", "find-yarn-workspace-root2": "1.2.16", "path-exists": "4.0.0", "which-pm": "2.0.0"}, "dev": false}, "/prelude-ls@1.2.1": {"resolution": {"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="}, "engines": {"node": ">= 0.8.0"}, "dev": false}, "/prepend-http@1.0.4": {"resolution": {"integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/prepend-http@2.0.0": {"resolution": {"integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA=="}, "engines": {"node": ">=4"}, "dev": false}, "/prettier-plugin-astro@0.13.0": {"resolution": {"integrity": "sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g=="}, "engines": {"node": "^14.15.0 || >=16.0.0"}, "dependencies": {"@astrojs/compiler": "1.8.2", "prettier": "3.2.5", "sass-formatter": "0.7.9"}, "dev": false}, "/prettier-plugin-organize-imports@3.2.4(prettier@3.2.5)(typescript@5.8.3)": {"resolution": {"integrity": "sha512-6m8WBhIp0dfwu0SkgfOxJqh+HpdyfqSSLfKKRZSFbDuEQXDDndb8fTpRWkUrX/uBenkex3MgnVk0J3b3Y5byog=="}, "peerDependencies": {"@volar/vue-language-plugin-pug": "^1.0.4", "@volar/vue-typescript": "^1.0.4", "prettier": ">=2.0", "typescript": ">=2.9"}, "peerDependenciesMeta": {"@volar/vue-language-plugin-pug": {"optional": true}, "@volar/vue-typescript": {"optional": true}}, "dependencies": {"prettier": "3.2.5", "typescript": "5.8.3"}, "dev": false}, "/prettier@3.2.5": {"resolution": {"integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A=="}, "engines": {"node": ">=14"}, "hasBin": true, "dev": false}, "/pretty-format@29.7.0": {"resolution": {"integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="}, "engines": {"node": "^14.15.0 || ^16.10.0 || >=18.0.0"}, "dependencies": {"@jest/schemas": "29.6.3", "ansi-styles": "5.2.0", "react-is": "18.2.0"}, "dev": false}, "/pretty@2.0.0": {"resolution": {"integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"condense-newlines": "0.2.1", "extend-shallow": "2.0.1", "js-beautify": "1.15.1"}, "dev": false}, "/prismjs@1.27.0": {"resolution": {"integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA=="}, "engines": {"node": ">=6"}, "dev": false}, "/prismjs@1.29.0": {"resolution": {"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="}, "engines": {"node": ">=6"}, "dev": false}, "/prompts@2.4.2": {"resolution": {"integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="}, "engines": {"node": ">= 6"}, "dependencies": {"kleur": "3.0.3", "sisteransi": "1.0.5"}, "dev": false}, "/prop-ini@0.0.2": {"resolution": {"integrity": "sha512-qyU57WvAvZDbzmRy9xDbJGVwrGJhmA+rYnVjy4xtX4Ny9c7gzvpmf/j7A3oq9ChbPh15MZQKjPep2mNdnAhtig=="}, "dependencies": {"extend": "3.0.2"}, "dev": false}, "/property-information@5.6.0": {"resolution": {"integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA=="}, "dependencies": {"xtend": "4.0.2"}, "dev": false}, "/property-information@6.4.1": {"resolution": {"integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w=="}, "dev": false}, "/proto-list@1.2.4": {"resolution": {"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="}, "dev": false}, "/pseudomap@1.0.2": {"resolution": {"integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="}, "dev": false}, "/psl@1.9.0": {"resolution": {"integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="}, "dev": false}, "/pump@3.0.0": {"resolution": {"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="}, "dependencies": {"end-of-stream": "1.4.4", "once": "1.4.0"}, "dev": false}, "/punycode@2.3.1": {"resolution": {"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="}, "engines": {"node": ">=6"}, "dev": false}, "/pupa@2.1.1": {"resolution": {"integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A=="}, "engines": {"node": ">=8"}, "dependencies": {"escape-goat": "2.1.1"}, "dev": false}, "/querystringify@2.2.0": {"resolution": {"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="}, "dev": false}, "/queue-microtask@1.2.3": {"resolution": {"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="}, "dev": false}, "/queue-tick@1.0.1": {"resolution": {"integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="}, "requiresBuild": true, "dev": false, "optional": true}, "/rc@1.2.8": {"resolution": {"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="}, "hasBin": true, "dependencies": {"deep-extend": "0.6.0", "ini": "1.3.8", "minimist": "1.2.8", "strip-json-comments": "2.0.1"}, "dev": false}, "/react-is@18.2.0": {"resolution": {"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="}, "dev": false}, "/read-cache@1.0.0": {"resolution": {"integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="}, "dependencies": {"pify": "2.3.0"}, "dev": false}, "/readable-stream@3.6.2": {"resolution": {"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="}, "engines": {"node": ">= 6"}, "dependencies": {"inherits": "2.0.4", "string_decoder": "1.3.0", "util-deprecate": "1.0.2"}, "dev": false}, "/readdirp@3.6.0": {"resolution": {"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="}, "engines": {"node": ">=8.10.0"}, "dependencies": {"picomatch": "2.3.1"}, "dev": false}, "/readme-badger@0.3.0": {"resolution": {"integrity": "sha512-+sMOLSs1imZUISZ2Rhz7qqVd77QtpcAPbGeIraFdgJmijb04YtdlPjGNBvDChTNtLbeQ6JNGQy3pOgslWfaP3g=="}, "dependencies": {"balanced-match": "1.0.2"}, "dev": false}, "/reflect.getprototypeof@1.0.5": {"resolution": {"integrity": "sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5", "es-errors": "1.3.0", "get-intrinsic": "1.2.4", "globalthis": "1.0.3", "which-builtin-type": "1.1.3"}, "dev": false}, "/refractor@3.6.0": {"resolution": {"integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="}, "dependencies": {"hastscript": "6.0.0", "parse-entities": "2.0.0", "prismjs": "1.27.0"}, "dev": false}, "/regenerator-runtime@0.14.1": {"resolution": {"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="}, "dev": false}, "/regexp.prototype.flags@1.5.2": {"resolution": {"integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-errors": "1.3.0", "set-function-name": "2.0.2"}, "dev": false}, "/registry-auth-token@3.4.0": {"resolution": {"integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A=="}, "dependencies": {"rc": "1.2.8", "safe-buffer": "5.2.1"}, "dev": false}, "/registry-auth-token@4.2.2": {"resolution": {"integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg=="}, "engines": {"node": ">=6.0.0"}, "dependencies": {"rc": "1.2.8"}, "dev": false}, "/registry-url@3.1.0": {"resolution": {"integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"rc": "1.2.8"}, "dev": false}, "/registry-url@5.1.0": {"resolution": {"integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw=="}, "engines": {"node": ">=8"}, "dependencies": {"rc": "1.2.8"}, "dev": false}, "/rehype-parse@9.0.0": {"resolution": {"integrity": "sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw=="}, "dependencies": {"@types/hast": "3.0.4", "hast-util-from-html": "2.0.1", "unified": "11.0.4"}, "dev": false}, "/rehype-raw@7.0.0": {"resolution": {"integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="}, "dependencies": {"@types/hast": "3.0.4", "hast-util-raw": "9.0.2", "vfile": "6.0.1"}, "dev": false}, "/rehype-stringify@10.0.0": {"resolution": {"integrity": "sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ=="}, "dependencies": {"@types/hast": "3.0.4", "hast-util-to-html": "9.0.0", "unified": "11.0.4"}, "dev": false}, "/rehype@13.0.1": {"resolution": {"integrity": "sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg=="}, "dependencies": {"@types/hast": "3.0.4", "rehype-parse": "9.0.0", "rehype-stringify": "10.0.0", "unified": "11.0.4"}, "dev": false}, "/relateurl@0.2.7": {"resolution": {"integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="}, "engines": {"node": ">= 0.10"}, "dev": false}, "/remark-gfm@4.0.0": {"resolution": {"integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA=="}, "dependencies": {"@types/mdast": "4.0.3", "mdast-util-gfm": "3.0.0", "micromark-extension-gfm": "3.0.0", "remark-parse": "11.0.0", "remark-stringify": "11.0.0", "unified": "11.0.4"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/remark-parse@11.0.0": {"resolution": {"integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="}, "dependencies": {"@types/mdast": "4.0.3", "mdast-util-from-markdown": "2.0.0", "micromark-util-types": "2.0.0", "unified": "11.0.4"}, "transitivePeerDependencies": ["supports-color"], "dev": false}, "/remark-rehype@11.1.0": {"resolution": {"integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g=="}, "dependencies": {"@types/hast": "3.0.4", "@types/mdast": "4.0.3", "mdast-util-to-hast": "13.1.0", "unified": "11.0.4", "vfile": "6.0.1"}, "dev": false}, "/remark-smartypants@2.1.0": {"resolution": {"integrity": "sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dependencies": {"retext": "8.1.0", "retext-smartypants": "5.2.0", "unist-util-visit": "5.0.0"}, "dev": false}, "/remark-stringify@11.0.0": {"resolution": {"integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="}, "dependencies": {"@types/mdast": "4.0.3", "mdast-util-to-markdown": "2.1.0", "unified": "11.0.4"}, "dev": false}, "/remote-origin-url@1.0.0": {"resolution": {"integrity": "sha512-xHDM6IBqivpiQ1e4WOuFpM/T6rbzA/WBsu+3WLtgPOhHyjA0nYlijV3NprlTb4FcXlQ5+Q+z174sQ1NnUF5FwA=="}, "engines": {"node": ">= 0.8.0"}, "dependencies": {"parse-git-config": "1.1.1"}, "dev": false}, "/repeat-string@1.6.1": {"resolution": {"integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="}, "engines": {"node": ">=0.10"}, "dev": false}, "/require-directory@2.1.1": {"resolution": {"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/require-main-filename@2.0.0": {"resolution": {"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="}, "dev": false}, "/requires-port@1.0.0": {"resolution": {"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="}, "dev": false}, "/resolve-from@4.0.0": {"resolution": {"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="}, "engines": {"node": ">=4"}, "dev": false}, "/resolve-pkg-maps@1.0.0": {"resolution": {"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="}, "dev": false}, "/resolve@1.22.8": {"resolution": {"integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw=="}, "hasBin": true, "dependencies": {"is-core-module": "2.13.1", "path-parse": "1.0.7", "supports-preserve-symlinks-flag": "1.0.0"}, "dev": false}, "/responselike@1.0.2": {"resolution": {"integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ=="}, "dependencies": {"lowercase-keys": "1.0.1"}, "dev": false}, "/restore-cursor@3.1.0": {"resolution": {"integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="}, "engines": {"node": ">=8"}, "dependencies": {"onetime": "5.1.2", "signal-exit": "3.0.7"}, "dev": false}, "/restore-cursor@4.0.0": {"resolution": {"integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dependencies": {"onetime": "5.1.2", "signal-exit": "3.0.7"}, "dev": false}, "/retext-latin@3.1.0": {"resolution": {"integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ=="}, "dependencies": {"@types/nlcst": "1.0.4", "parse-latin": "5.0.1", "unherit": "3.0.1", "unified": "10.1.2"}, "dev": false}, "/retext-smartypants@5.2.0": {"resolution": {"integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw=="}, "dependencies": {"@types/nlcst": "1.0.4", "nlcst-to-string": "3.1.1", "unified": "10.1.2", "unist-util-visit": "4.1.2"}, "dev": false}, "/retext-stringify@3.1.0": {"resolution": {"integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w=="}, "dependencies": {"@types/nlcst": "1.0.4", "nlcst-to-string": "3.1.1", "unified": "10.1.2"}, "dev": false}, "/retext@8.1.0": {"resolution": {"integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q=="}, "dependencies": {"@types/nlcst": "1.0.4", "retext-latin": "3.1.0", "retext-stringify": "3.1.0", "unified": "10.1.2"}, "dev": false}, "/reusify@1.0.4": {"resolution": {"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="}, "engines": {"iojs": ">=1.0.0", "node": ">=0.10.0"}, "dev": false}, "/rimraf@2.7.1": {"resolution": {"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="}, "hasBin": true, "dependencies": {"glob": "7.2.3"}, "dev": false}, "/rimraf@3.0.2": {"resolution": {"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="}, "hasBin": true, "dependencies": {"glob": "7.2.3"}, "dev": false}, "/rollup@4.13.0": {"resolution": {"integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg=="}, "engines": {"node": ">=18.0.0", "npm": ">=8.0.0"}, "hasBin": true, "dependencies": {"@types/estree": "1.0.5"}, "optionalDependencies": {"@rollup/rollup-android-arm-eabi": "4.13.0", "@rollup/rollup-android-arm64": "4.13.0", "@rollup/rollup-darwin-arm64": "4.13.0", "@rollup/rollup-darwin-x64": "4.13.0", "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", "@rollup/rollup-linux-arm64-gnu": "4.13.0", "@rollup/rollup-linux-arm64-musl": "4.13.0", "@rollup/rollup-linux-riscv64-gnu": "4.13.0", "@rollup/rollup-linux-x64-gnu": "4.13.0", "@rollup/rollup-linux-x64-musl": "4.13.0", "@rollup/rollup-win32-arm64-msvc": "4.13.0", "@rollup/rollup-win32-ia32-msvc": "4.13.0", "@rollup/rollup-win32-x64-msvc": "4.13.0", "fsevents": "2.3.3"}, "dev": false}, "/run-async@2.4.1": {"resolution": {"integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="}, "engines": {"node": ">=0.12.0"}, "dev": false}, "/run-parallel@1.2.0": {"resolution": {"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="}, "dependencies": {"queue-microtask": "1.2.3"}, "dev": false}, "/rxjs@6.6.7": {"resolution": {"integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ=="}, "engines": {"npm": ">=2.0.0"}, "dependencies": {"tslib": "1.14.1"}, "dev": false}, "/rxjs@7.8.1": {"resolution": {"integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="}, "dependencies": {"tslib": "2.6.2"}, "dev": false}, "/s.color@0.0.15": {"resolution": {"integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA=="}, "dev": false}, "/safe-array-concat@1.1.2": {"resolution": {"integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q=="}, "engines": {"node": ">=0.4"}, "dependencies": {"call-bind": "1.0.7", "get-intrinsic": "1.2.4", "has-symbols": "1.0.3", "isarray": "2.0.5"}, "dev": false}, "/safe-buffer@5.2.1": {"resolution": {"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="}, "dev": false}, "/safe-regex-test@1.0.3": {"resolution": {"integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "es-errors": "1.3.0", "is-regex": "1.1.4"}, "dev": false}, "/safer-buffer@2.1.2": {"resolution": {"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="}, "dev": false}, "/sass-formatter@0.7.9": {"resolution": {"integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw=="}, "dependencies": {"suf-log": "2.5.3"}, "dev": false}, "/sass@1.72.0": {"resolution": {"integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA=="}, "engines": {"node": ">=14.0.0"}, "hasBin": true, "dependencies": {"chokidar": "3.6.0", "immutable": "4.3.5", "source-map-js": "1.0.2"}, "dev": false}, "/saxes@5.0.1": {"resolution": {"integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw=="}, "engines": {"node": ">=10"}, "dependencies": {"xmlchars": "2.2.0"}, "dev": false}, "/section-matter@1.0.0": {"resolution": {"integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="}, "engines": {"node": ">=4"}, "dependencies": {"extend-shallow": "2.0.1", "kind-of": "6.0.3"}, "dev": false}, "/semver-diff@2.1.0": {"resolution": {"integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"semver": "5.7.2"}, "dev": false}, "/semver-diff@3.1.1": {"resolution": {"integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg=="}, "engines": {"node": ">=8"}, "dependencies": {"semver": "6.3.1"}, "dev": false}, "/semver-utils@1.1.4": {"resolution": {"integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA=="}, "dev": false}, "/semver@5.7.2": {"resolution": {"integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="}, "hasBin": true, "dev": false}, "/semver@6.3.1": {"resolution": {"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="}, "hasBin": true, "dev": false}, "/semver@7.6.0": {"resolution": {"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="}, "engines": {"node": ">=10"}, "hasBin": true, "dependencies": {"lru-cache": "6.0.0"}, "dev": false}, "/set-blocking@2.0.0": {"resolution": {"integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="}, "dev": false}, "/set-function-length@1.2.2": {"resolution": {"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"define-data-property": "1.1.4", "es-errors": "1.3.0", "function-bind": "1.1.2", "get-intrinsic": "1.2.4", "gopd": "1.0.1", "has-property-descriptors": "1.0.2"}, "dev": false}, "/set-function-name@2.0.2": {"resolution": {"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"define-data-property": "1.1.4", "es-errors": "1.3.0", "functions-have-names": "1.2.3", "has-property-descriptors": "1.0.2"}, "dev": false}, "/sharp@0.32.6": {"resolution": {"integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w=="}, "engines": {"node": ">=14.15.0"}, "requiresBuild": true, "dependencies": {"color": "4.2.3", "detect-libc": "2.0.2", "node-addon-api": "6.1.0", "prebuild-install": "7.1.2", "semver": "7.6.0", "simple-get": "4.0.1", "tar-fs": "3.0.5", "tunnel-agent": "0.6.0"}, "transitivePeerDependencies": ["bare-buffer"], "dev": false, "optional": true}, "/shebang-command@1.2.0": {"resolution": {"integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"shebang-regex": "1.0.0"}, "dev": false}, "/shebang-command@2.0.0": {"resolution": {"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="}, "engines": {"node": ">=8"}, "dependencies": {"shebang-regex": "3.0.0"}, "dev": false}, "/shebang-regex@1.0.0": {"resolution": {"integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/shebang-regex@3.0.0": {"resolution": {"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="}, "engines": {"node": ">=8"}, "dev": false}, "/shell-quote@1.8.1": {"resolution": {"integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA=="}, "dev": false}, "/shiki@1.1.7": {"resolution": {"integrity": "sha512-9kUTMjZtcPH3i7vHunA6EraTPpPOITYTdA5uMrvsJRexktqP0s7P3s9HVK80b4pP42FRVe03D7fT3NmJv2yYhw=="}, "dependencies": {"@shikijs/core": "1.1.7"}, "dev": false}, "/side-channel@1.0.6": {"resolution": {"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "es-errors": "1.3.0", "get-intrinsic": "1.2.4", "object-inspect": "1.13.1"}, "dev": false}, "/siginfo@2.0.0": {"resolution": {"integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="}, "dev": false}, "/sigmund@1.0.1": {"resolution": {"integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g=="}, "dev": false}, "/signal-exit@3.0.7": {"resolution": {"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="}, "dev": false}, "/signal-exit@4.1.0": {"resolution": {"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="}, "engines": {"node": ">=14"}, "dev": false}, "/simple-concat@1.0.1": {"resolution": {"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="}, "requiresBuild": true, "dev": false, "optional": true}, "/simple-get@4.0.1": {"resolution": {"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="}, "requiresBuild": true, "dependencies": {"decompress-response": "6.0.0", "once": "1.4.0", "simple-concat": "1.0.1"}, "dev": false, "optional": true}, "/simple-swizzle@0.2.2": {"resolution": {"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="}, "requiresBuild": true, "dependencies": {"is-arrayish": "0.3.2"}, "dev": false, "optional": true}, "/sisteransi@1.0.5": {"resolution": {"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="}, "dev": false}, "/slash@3.0.0": {"resolution": {"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="}, "engines": {"node": ">=8"}, "dev": false}, "/smpltmpl@1.0.2": {"resolution": {"integrity": "sha512-Hq23NNgeZigOzIiX1dkb6W3gFn2/XQj43KhPxu65IMieG/gIwf/lQb1IudjYv0c/5LwJeS/mPayYzyo+8WJMxQ=="}, "engines": {"node": ">=4"}, "dependencies": {"babel-code-frame": "6.26.0"}, "dev": false}, "/snarkdown@2.0.0": {"resolution": {"integrity": "sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A=="}, "dev": false}, "/source-map-js@1.0.2": {"resolution": {"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/source-map@0.6.1": {"resolution": {"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/space-separated-tokens@1.1.5": {"resolution": {"integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="}, "dev": false}, "/space-separated-tokens@2.0.2": {"resolution": {"integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="}, "dev": false}, "/spawn-command@0.0.2": {"resolution": {"integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ=="}, "dev": false}, "/split-lines@2.1.0": {"resolution": {"integrity": "sha512-8dv+1zKgTpfTkOy8XZLFyWrfxO0NV/bj/3EaQ+hBrBxGv2DwiroljPjU8NlCr+59nLnsVm9WYT7lXKwe4TC6bw=="}, "engines": {"node": ">=6"}, "dev": false}, "/sprintf-js@1.0.3": {"resolution": {"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="}, "dev": false}, "/stackback@0.0.2": {"resolution": {"integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="}, "dev": false}, "/std-env@3.7.0": {"resolution": {"integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg=="}, "dev": false}, "/stdin-discarder@0.1.0": {"resolution": {"integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="}, "engines": {"node": "^12.20.0 || ^14.13.1 || >=16.0.0"}, "dependencies": {"bl": "5.1.0"}, "dev": false}, "/streamx@2.16.1": {"resolution": {"integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ=="}, "requiresBuild": true, "dependencies": {"fast-fifo": "1.3.2", "queue-tick": "1.0.1"}, "optionalDependencies": {"bare-events": "2.5.4"}, "dev": false, "optional": true}, "/streamx@2.22.1": {"resolution": {"integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="}, "requiresBuild": true, "dependencies": {"fast-fifo": "1.3.2", "text-decoder": "1.2.3"}, "optionalDependencies": {"bare-events": "2.2.1"}, "dev": false, "optional": true}, "/string-width@2.1.1": {"resolution": {"integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="}, "engines": {"node": ">=4"}, "dependencies": {"is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0"}, "dev": false}, "/string-width@3.1.0": {"resolution": {"integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w=="}, "engines": {"node": ">=6"}, "dependencies": {"emoji-regex": "7.0.3", "is-fullwidth-code-point": "2.0.0", "strip-ansi": "5.2.0"}, "dev": false}, "/string-width@4.2.3": {"resolution": {"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="}, "engines": {"node": ">=8"}, "dependencies": {"emoji-regex": "8.0.0", "is-fullwidth-code-point": "3.0.0", "strip-ansi": "6.0.1"}, "dev": false}, "/string-width@5.1.2": {"resolution": {"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="}, "engines": {"node": ">=12"}, "dependencies": {"eastasianwidth": "0.2.0", "emoji-regex": "9.2.2", "strip-ansi": "7.1.0"}, "dev": false}, "/string-width@6.1.0": {"resolution": {"integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ=="}, "engines": {"node": ">=16"}, "dependencies": {"eastasianwidth": "0.2.0", "emoji-regex": "10.3.0", "strip-ansi": "7.1.0"}, "dev": false}, "/string-width@7.1.0": {"resolution": {"integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw=="}, "engines": {"node": ">=18"}, "dependencies": {"emoji-regex": "10.3.0", "get-east-asian-width": "1.2.0", "strip-ansi": "7.1.0"}, "dev": false}, "/string.prototype.trim@1.2.8": {"resolution": {"integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/string.prototype.trimend@1.0.7": {"resolution": {"integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA=="}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/string.prototype.trimstart@1.0.7": {"resolution": {"integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg=="}, "dependencies": {"call-bind": "1.0.7", "define-properties": "1.2.1", "es-abstract": "1.22.5"}, "dev": false}, "/string_decoder@1.3.0": {"resolution": {"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="}, "dependencies": {"safe-buffer": "5.2.1"}, "dev": false}, "/stringify-entities@4.0.3": {"resolution": {"integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g=="}, "dependencies": {"character-entities-html4": "2.1.0", "character-entities-legacy": "3.0.0"}, "dev": false}, "/strip-ansi@3.0.1": {"resolution": {"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"ansi-regex": "2.1.1"}, "dev": false}, "/strip-ansi@4.0.0": {"resolution": {"integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="}, "engines": {"node": ">=4"}, "dependencies": {"ansi-regex": "3.0.1"}, "dev": false}, "/strip-ansi@5.2.0": {"resolution": {"integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="}, "engines": {"node": ">=6"}, "dependencies": {"ansi-regex": "4.1.1"}, "dev": false}, "/strip-ansi@6.0.1": {"resolution": {"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="}, "engines": {"node": ">=8"}, "dependencies": {"ansi-regex": "5.0.1"}, "dev": false}, "/strip-ansi@7.1.0": {"resolution": {"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="}, "engines": {"node": ">=12"}, "dependencies": {"ansi-regex": "6.0.1"}, "dev": false}, "/strip-bom-string@1.0.0": {"resolution": {"integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/strip-bom@3.0.0": {"resolution": {"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="}, "engines": {"node": ">=4"}, "dev": false}, "/strip-bom@4.0.0": {"resolution": {"integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="}, "engines": {"node": ">=8"}, "dev": false}, "/strip-eof@1.0.0": {"resolution": {"integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/strip-final-newline@3.0.0": {"resolution": {"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="}, "engines": {"node": ">=12"}, "dev": false}, "/strip-json-comments@2.0.1": {"resolution": {"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="}, "engines": {"node": ">=0.10.0"}, "requiresBuild": true, "dev": false}, "/strip-json-comments@3.1.1": {"resolution": {"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="}, "engines": {"node": ">=8"}, "dev": false}, "/strip-literal@2.0.0": {"resolution": {"integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA=="}, "dependencies": {"js-tokens": "8.0.3"}, "dev": false}, "/sucrase@3.35.0": {"resolution": {"integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="}, "engines": {"node": ">=16 || 14 >=14.17"}, "hasBin": true, "dependencies": {"@jridgewell/gen-mapping": "0.3.5", "commander": "4.1.1", "glob": "10.3.10", "lines-and-columns": "1.2.4", "mz": "2.7.0", "pirates": "4.0.6", "ts-interface-checker": "0.1.13"}, "dev": false}, "/suf-log@2.5.3": {"resolution": {"integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow=="}, "dependencies": {"s.color": "0.0.15"}, "dev": false}, "/supports-color@2.0.0": {"resolution": {"integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="}, "engines": {"node": ">=0.8.0"}, "dev": false}, "/supports-color@5.5.0": {"resolution": {"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="}, "engines": {"node": ">=4"}, "dependencies": {"has-flag": "3.0.0"}, "dev": false}, "/supports-color@7.2.0": {"resolution": {"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="}, "engines": {"node": ">=8"}, "dependencies": {"has-flag": "4.0.0"}, "dev": false}, "/supports-color@8.1.1": {"resolution": {"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="}, "engines": {"node": ">=10"}, "dependencies": {"has-flag": "4.0.0"}, "dev": false}, "/supports-preserve-symlinks-flag@1.0.0": {"resolution": {"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="}, "engines": {"node": ">= 0.4"}, "dev": false}, "/symbol-tree@3.2.4": {"resolution": {"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="}, "dev": false}, "/synckit@0.9.0": {"resolution": {"integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg=="}, "engines": {"node": "^14.18.0 || >=16.0.0"}, "dependencies": {"@pkgr/core": "0.1.1", "tslib": "2.6.2"}, "dev": false}, "/tailwindcss@3.4.3": {"resolution": {"integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A=="}, "engines": {"node": ">=14.0.0"}, "hasBin": true, "dependencies": {"@alloc/quick-lru": "5.2.0", "arg": "5.0.2", "chokidar": "3.6.0", "didyoumean": "1.2.2", "dlv": "1.1.3", "fast-glob": "3.3.2", "glob-parent": "6.0.2", "is-glob": "4.0.3", "jiti": "1.21.0", "lilconfig": "2.1.0", "micromatch": "4.0.5", "normalize-path": "3.0.0", "object-hash": "3.0.0", "picocolors": "1.0.0", "postcss": "8.4.35", "postcss-import": "15.1.0(postcss@8.4.35)", "postcss-js": "4.0.1(postcss@8.4.35)", "postcss-load-config": "4.0.2(postcss@8.4.35)", "postcss-nested": "6.0.1(postcss@8.4.35)", "postcss-selector-parser": "6.0.16", "resolve": "1.22.8", "sucrase": "3.35.0"}, "transitivePeerDependencies": ["ts-node"], "dev": false}, "/tar-fs@2.1.1": {"resolution": {"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng=="}, "requiresBuild": true, "dependencies": {"chownr": "1.1.4", "mkdirp-classic": "0.5.3", "pump": "3.0.0", "tar-stream": "2.2.0"}, "dev": false, "optional": true}, "/tar-fs@3.0.5": {"resolution": {"integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg=="}, "requiresBuild": true, "dependencies": {"pump": "3.0.0", "tar-stream": "3.1.7"}, "optionalDependencies": {"bare-fs": "2.3.5", "bare-path": "2.1.3"}, "transitivePeerDependencies": ["bare-buffer"], "dev": false, "optional": true}, "/tar-stream@2.2.0": {"resolution": {"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="}, "engines": {"node": ">=6"}, "requiresBuild": true, "dependencies": {"bl": "4.1.0", "end-of-stream": "1.4.4", "fs-constants": "1.0.0", "inherits": "2.0.4", "readable-stream": "3.6.2"}, "dev": false, "optional": true}, "/tar-stream@3.1.7": {"resolution": {"integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="}, "requiresBuild": true, "dependencies": {"b4a": "1.6.6", "fast-fifo": "1.3.2", "streamx": "2.16.1"}, "dev": false, "optional": true}, "/term-size@1.2.0": {"resolution": {"integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ=="}, "engines": {"node": ">=4"}, "dependencies": {"execa": "0.7.0"}, "dev": false}, "/term-size@2.2.1": {"resolution": {"integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg=="}, "engines": {"node": ">=8"}, "dev": false}, "/text-decoder@1.2.3": {"resolution": {"integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="}, "requiresBuild": true, "dependencies": {"b4a": "1.6.7"}, "dev": false, "optional": true}, "/text-table@0.2.0": {"resolution": {"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="}, "dev": false}, "/thenify-all@1.6.0": {"resolution": {"integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="}, "engines": {"node": ">=0.8"}, "dependencies": {"thenify": "3.3.1"}, "dev": false}, "/thenify@3.3.1": {"resolution": {"integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="}, "dependencies": {"any-promise": "1.3.0"}, "dev": false}, "/through@2.3.8": {"resolution": {"integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="}, "dev": false}, "/timed-out@4.0.1": {"resolution": {"integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/tinybench@2.6.0": {"resolution": {"integrity": "sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA=="}, "dev": false}, "/tinypool@0.8.2": {"resolution": {"integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ=="}, "engines": {"node": ">=14.0.0"}, "dev": false}, "/tinyspy@2.2.1": {"resolution": {"integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A=="}, "engines": {"node": ">=14.0.0"}, "dev": false}, "/tmp@0.0.33": {"resolution": {"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="}, "engines": {"node": ">=0.6.0"}, "dependencies": {"os-tmpdir": "1.0.2"}, "dev": false}, "/to-fast-properties@2.0.0": {"resolution": {"integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="}, "engines": {"node": ">=4"}, "dev": false}, "/to-readable-stream@1.0.0": {"resolution": {"integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="}, "engines": {"node": ">=6"}, "dev": false}, "/to-regex-range@5.0.1": {"resolution": {"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="}, "engines": {"node": ">=8.0"}, "dependencies": {"is-number": "7.0.0"}, "dev": false}, "/tough-cookie@4.1.3": {"resolution": {"integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw=="}, "engines": {"node": ">=6"}, "dependencies": {"psl": "1.9.0", "punycode": "2.3.1", "universalify": "0.2.0", "url-parse": "1.5.10"}, "dev": false}, "/tr46@2.1.0": {"resolution": {"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw=="}, "engines": {"node": ">=8"}, "dependencies": {"punycode": "2.3.1"}, "dev": false}, "/tree-kill@1.2.2": {"resolution": {"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="}, "hasBin": true, "dev": false}, "/trim-lines@3.0.1": {"resolution": {"integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="}, "dev": false}, "/trough@2.2.0": {"resolution": {"integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="}, "dev": false}, "/ts-api-utils@1.3.0(typescript@5.8.3)": {"resolution": {"integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ=="}, "engines": {"node": ">=16"}, "peerDependencies": {"typescript": ">=4.2.0"}, "dependencies": {"typescript": "5.8.3"}, "dev": false}, "/ts-interface-checker@0.1.13": {"resolution": {"integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="}, "dev": false}, "/tsconfck@3.0.3(typescript@5.8.3)": {"resolution": {"integrity": "sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA=="}, "engines": {"node": "^18 || >=20"}, "hasBin": true, "peerDependencies": {"typescript": "^5.0.0"}, "peerDependenciesMeta": {"typescript": {"optional": true}}, "dependencies": {"typescript": "5.8.3"}, "dev": false}, "/tslib@1.14.1": {"resolution": {"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="}, "dev": false}, "/tslib@2.6.2": {"resolution": {"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="}, "dev": false}, "/tsx@4.7.1": {"resolution": {"integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g=="}, "engines": {"node": ">=18.0.0"}, "hasBin": true, "dependencies": {"esbuild": "0.19.12", "get-tsconfig": "4.7.3"}, "optionalDependencies": {"fsevents": "2.3.3"}, "dev": false}, "/tunnel-agent@0.6.0": {"resolution": {"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="}, "requiresBuild": true, "dependencies": {"safe-buffer": "5.2.1"}, "dev": false, "optional": true}, "/type-check@0.4.0": {"resolution": {"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="}, "engines": {"node": ">= 0.8.0"}, "dependencies": {"prelude-ls": "1.2.1"}, "dev": false}, "/type-detect@4.0.8": {"resolution": {"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="}, "engines": {"node": ">=4"}, "dev": false}, "/type-fest@0.20.2": {"resolution": {"integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="}, "engines": {"node": ">=10"}, "dev": false}, "/type-fest@0.21.3": {"resolution": {"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="}, "engines": {"node": ">=10"}, "dev": false}, "/type-fest@0.8.1": {"resolution": {"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="}, "engines": {"node": ">=8"}, "dev": false}, "/type-fest@2.19.0": {"resolution": {"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="}, "engines": {"node": ">=12.20"}, "dev": false}, "/typed-array-buffer@1.0.2": {"resolution": {"integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "es-errors": "1.3.0", "is-typed-array": "1.1.13"}, "dev": false}, "/typed-array-byte-length@1.0.1": {"resolution": {"integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "for-each": "0.3.3", "gopd": "1.0.1", "has-proto": "1.0.3", "is-typed-array": "1.1.13"}, "dev": false}, "/typed-array-byte-offset@1.0.2": {"resolution": {"integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"available-typed-arrays": "1.0.7", "call-bind": "1.0.7", "for-each": "0.3.3", "gopd": "1.0.1", "has-proto": "1.0.3", "is-typed-array": "1.1.13"}, "dev": false}, "/typed-array-length@1.0.5": {"resolution": {"integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"call-bind": "1.0.7", "for-each": "0.3.3", "gopd": "1.0.1", "has-proto": "1.0.3", "is-typed-array": "1.1.13", "possible-typed-array-names": "1.0.0"}, "dev": false}, "/typedarray-to-buffer@3.1.5": {"resolution": {"integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="}, "dependencies": {"is-typedarray": "1.0.0"}, "dev": false}, "/typescript@5.8.3": {"resolution": {"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="}, "engines": {"node": ">=14.17"}, "hasBin": true, "dev": false}, "/ufo@1.4.0": {"resolution": {"integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ=="}, "dev": false}, "/uglify-js@3.17.4": {"resolution": {"integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g=="}, "engines": {"node": ">=0.8.0"}, "hasBin": true, "dev": false}, "/unbox-primitive@1.0.2": {"resolution": {"integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw=="}, "dependencies": {"call-bind": "1.0.7", "has-bigints": "1.0.2", "has-symbols": "1.0.3", "which-boxed-primitive": "1.0.2"}, "dev": false}, "/undici-types@5.26.5": {"resolution": {"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="}, "dev": false}, "/unherit@3.0.1": {"resolution": {"integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg=="}, "dev": false}, "/unified@10.1.2": {"resolution": {"integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q=="}, "dependencies": {"@types/unist": "2.0.10", "bail": "2.0.2", "extend": "3.0.2", "is-buffer": "2.0.5", "is-plain-obj": "4.1.0", "trough": "2.2.0", "vfile": "5.3.7"}, "dev": false}, "/unified@11.0.4": {"resolution": {"integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ=="}, "dependencies": {"@types/unist": "3.0.2", "bail": "2.0.2", "devlop": "1.1.0", "extend": "3.0.2", "is-plain-obj": "4.1.0", "trough": "2.2.0", "vfile": "6.0.1"}, "dev": false}, "/unique-random-array@1.0.0": {"resolution": {"integrity": "sha512-vtj2yltjcHPa69nFjNJ3xnhsEwE8pMyjqUQDw2myz/iSezqf4YCAcygwFQEsOgMid5VNW/dCPbnb2BcmaDCCKg=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"unique-random": "1.0.0"}, "dev": false}, "/unique-random@1.0.0": {"resolution": {"integrity": "sha512-K1sUkPf9EXCZFNIlMCoX4icAqcvkR4FMPH4Z61HbyiWhQl1ZGo0zYeV2bJmocK8Cp6tnKYrCnpkeKGebXZoRTQ=="}, "engines": {"node": ">=0.10.0"}, "dev": false}, "/unique-string@1.0.0": {"resolution": {"integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg=="}, "engines": {"node": ">=4"}, "dependencies": {"crypto-random-string": "1.0.0"}, "dev": false}, "/unique-string@2.0.0": {"resolution": {"integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="}, "engines": {"node": ">=8"}, "dependencies": {"crypto-random-string": "2.0.0"}, "dev": false}, "/unist-util-find-after@5.0.0": {"resolution": {"integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-is": "6.0.0"}, "dev": false}, "/unist-util-is@4.1.0": {"resolution": {"integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg=="}, "dev": false}, "/unist-util-is@5.2.1": {"resolution": {"integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="}, "dependencies": {"@types/unist": "2.0.10"}, "dev": false}, "/unist-util-is@6.0.0": {"resolution": {"integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="}, "dependencies": {"@types/unist": "3.0.2"}, "dev": false}, "/unist-util-modify-children@3.1.1": {"resolution": {"integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA=="}, "dependencies": {"@types/unist": "2.0.10", "array-iterate": "2.0.1"}, "dev": false}, "/unist-util-position@5.0.0": {"resolution": {"integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="}, "dependencies": {"@types/unist": "3.0.2"}, "dev": false}, "/unist-util-remove-position@5.0.0": {"resolution": {"integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-visit": "5.0.0"}, "dev": false}, "/unist-util-stringify-position@3.0.3": {"resolution": {"integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg=="}, "dependencies": {"@types/unist": "2.0.10"}, "dev": false}, "/unist-util-stringify-position@4.0.0": {"resolution": {"integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="}, "dependencies": {"@types/unist": "3.0.2"}, "dev": false}, "/unist-util-visit-children@2.0.2": {"resolution": {"integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q=="}, "dependencies": {"@types/unist": "2.0.10"}, "dev": false}, "/unist-util-visit-parents@3.1.1": {"resolution": {"integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg=="}, "dependencies": {"@types/unist": "2.0.10", "unist-util-is": "4.1.0"}, "dev": false}, "/unist-util-visit-parents@5.1.3": {"resolution": {"integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="}, "dependencies": {"@types/unist": "2.0.10", "unist-util-is": "5.2.1"}, "dev": false}, "/unist-util-visit-parents@6.0.1": {"resolution": {"integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-is": "6.0.0"}, "dev": false}, "/unist-util-visit@2.0.3": {"resolution": {"integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q=="}, "dependencies": {"@types/unist": "2.0.10", "unist-util-is": "4.1.0", "unist-util-visit-parents": "3.1.1"}, "dev": false}, "/unist-util-visit@4.1.2": {"resolution": {"integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="}, "dependencies": {"@types/unist": "2.0.10", "unist-util-is": "5.2.1", "unist-util-visit-parents": "5.1.3"}, "dev": false}, "/unist-util-visit@5.0.0": {"resolution": {"integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-is": "6.0.0", "unist-util-visit-parents": "6.0.1"}, "dev": false}, "/universalify@0.1.2": {"resolution": {"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="}, "engines": {"node": ">= 4.0.0"}, "dev": false}, "/universalify@0.2.0": {"resolution": {"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="}, "engines": {"node": ">= 4.0.0"}, "dev": false}, "/unzip-response@2.0.1": {"resolution": {"integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw=="}, "engines": {"node": ">=4"}, "dev": false}, "/update-browserslist-db@1.0.13(browserslist@4.23.0)": {"resolution": {"integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg=="}, "hasBin": true, "peerDependencies": {"browserslist": ">= 4.21.0"}, "dependencies": {"browserslist": "4.23.0", "escalade": "3.1.2", "picocolors": "1.0.0"}, "dev": false}, "/update-notifier@2.5.0": {"resolution": {"integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw=="}, "engines": {"node": ">=4"}, "dependencies": {"boxen": "1.3.0", "chalk": "2.4.2", "configstore": "3.1.5", "import-lazy": "2.1.0", "is-ci": "1.2.1", "is-installed-globally": "0.1.0", "is-npm": "1.0.0", "latest-version": "3.1.0", "semver-diff": "2.1.0", "xdg-basedir": "3.0.0"}, "dev": false}, "/update-notifier@4.1.3": {"resolution": {"integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A=="}, "engines": {"node": ">=8"}, "dependencies": {"boxen": "4.2.0", "chalk": "3.0.0", "configstore": "5.0.1", "has-yarn": "2.1.0", "import-lazy": "2.1.0", "is-ci": "2.0.0", "is-installed-globally": "0.3.2", "is-npm": "4.0.0", "is-yarn-global": "0.3.0", "latest-version": "5.1.0", "pupa": "2.1.1", "semver-diff": "3.1.1", "xdg-basedir": "4.0.0"}, "dev": false}, "/upper-case@1.1.3": {"resolution": {"integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA=="}, "dev": false}, "/uri-js@4.4.1": {"resolution": {"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="}, "dependencies": {"punycode": "2.3.1"}, "dev": false}, "/url-parse-lax@1.0.0": {"resolution": {"integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"prepend-http": "1.0.4"}, "dev": false}, "/url-parse-lax@3.0.0": {"resolution": {"integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ=="}, "engines": {"node": ">=4"}, "dependencies": {"prepend-http": "2.0.0"}, "dev": false}, "/url-parse@1.5.10": {"resolution": {"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ=="}, "dependencies": {"querystringify": "2.2.0", "requires-port": "1.0.0"}, "dev": false}, "/user-home@2.0.0": {"resolution": {"integrity": "sha512-KMWqdlOcjCYdtIJpicDSFBQ8nFwS2i9sslAd6f4+CBGcU4gist2REnr2fxj2YocvJFxSF3ZOHLYLVZnUxv4BZQ=="}, "engines": {"node": ">=0.10.0"}, "dependencies": {"os-homedir": "1.0.2"}, "dev": false}, "/user-meta@1.0.0": {"resolution": {"integrity": "sha512-Q/opMgFhVbBkdlTs44UKzV7L5Uj2zrJ4MVPXTTzJmrU1bHb2cX6wJzBIqEf1gROTzZIH8u39WmHsa5EvfnMPrw=="}, "engines": {"node": ">=4"}, "dependencies": {"rc": "1.2.8"}, "dev": false}, "/util-deprecate@1.0.2": {"resolution": {"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="}, "dev": false}, "/validate-npm-package-name@3.0.0": {"resolution": {"integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw=="}, "dependencies": {"builtins": "1.0.3"}, "dev": false}, "/vfile-location@5.0.2": {"resolution": {"integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg=="}, "dependencies": {"@types/unist": "3.0.2", "vfile": "6.0.1"}, "dev": false}, "/vfile-message@3.1.4": {"resolution": {"integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw=="}, "dependencies": {"@types/unist": "2.0.10", "unist-util-stringify-position": "3.0.3"}, "dev": false}, "/vfile-message@4.0.2": {"resolution": {"integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-stringify-position": "4.0.0"}, "dev": false}, "/vfile@5.3.7": {"resolution": {"integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g=="}, "dependencies": {"@types/unist": "2.0.10", "is-buffer": "2.0.5", "unist-util-stringify-position": "3.0.3", "vfile-message": "3.1.4"}, "dev": false}, "/vfile@6.0.1": {"resolution": {"integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw=="}, "dependencies": {"@types/unist": "3.0.2", "unist-util-stringify-position": "4.0.0", "vfile-message": "4.0.2"}, "dev": false}, "/vite-node@1.4.0(sass@1.72.0)": {"resolution": {"integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw=="}, "engines": {"node": "^18.0.0 || >=20.0.0"}, "hasBin": true, "dependencies": {"cac": "6.7.14", "debug": "4.3.4", "pathe": "1.1.2", "picocolors": "1.0.0", "vite": "5.1.6(sass@1.72.0)"}, "transitivePeerDependencies": ["@types/node", "less", "lightningcss", "sass", "stylus", "sugarss", "supports-color", "terser"], "dev": false}, "/vite@5.1.6(sass@1.72.0)": {"resolution": {"integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA=="}, "engines": {"node": "^18.0.0 || >=20.0.0"}, "hasBin": true, "peerDependencies": {"@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0"}, "peerDependenciesMeta": {"@types/node": {"optional": true}, "less": {"optional": true}, "lightningcss": {"optional": true}, "sass": {"optional": true}, "stylus": {"optional": true}, "sugarss": {"optional": true}, "terser": {"optional": true}}, "dependencies": {"esbuild": "0.19.12", "postcss": "8.4.35", "rollup": "4.13.0", "sass": "1.72.0"}, "optionalDependencies": {"fsevents": "2.3.3"}, "dev": false}, "/vitefu@0.2.5(vite@5.1.6)": {"resolution": {"integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q=="}, "peerDependencies": {"vite": "^3.0.0 || ^4.0.0 || ^5.0.0"}, "peerDependenciesMeta": {"vite": {"optional": true}}, "dependencies": {"vite": "5.1.6(sass@1.72.0)"}, "dev": false}, "/vitest@1.4.0(happy-dom@12.10.3)(sass@1.72.0)": {"resolution": {"integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw=="}, "engines": {"node": "^18.0.0 || >=20.0.0"}, "hasBin": true, "peerDependencies": {"@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", "@vitest/browser": "1.4.0", "@vitest/ui": "1.4.0", "happy-dom": "*", "jsdom": "*"}, "peerDependenciesMeta": {"@edge-runtime/vm": {"optional": true}, "@types/node": {"optional": true}, "@vitest/browser": {"optional": true}, "@vitest/ui": {"optional": true}, "happy-dom": {"optional": true}, "jsdom": {"optional": true}}, "dependencies": {"@vitest/expect": "1.4.0", "@vitest/runner": "1.4.0", "@vitest/snapshot": "1.4.0", "@vitest/spy": "1.4.0", "@vitest/utils": "1.4.0", "acorn-walk": "8.3.2", "chai": "4.4.1", "debug": "4.3.4", "execa": "8.0.1", "happy-dom": "12.10.3", "local-pkg": "0.5.0", "magic-string": "0.30.8", "pathe": "1.1.2", "picocolors": "1.0.0", "std-env": "3.7.0", "strip-literal": "2.0.0", "tinybench": "2.6.0", "tinypool": "0.8.2", "vite": "5.1.6(sass@1.72.0)", "vite-node": "1.4.0(sass@1.72.0)", "why-is-node-running": "2.2.2"}, "transitivePeerDependencies": ["less", "lightningcss", "sass", "stylus", "sugarss", "supports-color", "terser"], "dev": false}, "/vscode-languageserver-textdocument@1.0.11": {"resolution": {"integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA=="}, "dev": false}, "/w3c-hr-time@1.0.2": {"resolution": {"integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ=="}, "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dependencies": {"browser-process-hrtime": "1.0.0"}, "dev": false}, "/w3c-xmlserializer@2.0.0": {"resolution": {"integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA=="}, "engines": {"node": ">=10"}, "dependencies": {"xml-name-validator": "3.0.0"}, "dev": false}, "/web-namespaces@2.0.1": {"resolution": {"integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="}, "dev": false}, "/webidl-conversions@5.0.0": {"resolution": {"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="}, "engines": {"node": ">=8"}, "dev": false}, "/webidl-conversions@6.1.0": {"resolution": {"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="}, "engines": {"node": ">=10.4"}, "dev": false}, "/webidl-conversions@7.0.0": {"resolution": {"integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="}, "engines": {"node": ">=12"}, "dev": false}, "/webpack-merge@4.2.2": {"resolution": {"integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g=="}, "dependencies": {"lodash": "4.17.21"}, "dev": false}, "/whatwg-encoding@1.0.5": {"resolution": {"integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw=="}, "dependencies": {"iconv-lite": "0.4.24"}, "dev": false}, "/whatwg-encoding@2.0.0": {"resolution": {"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg=="}, "engines": {"node": ">=12"}, "dependencies": {"iconv-lite": "0.6.3"}, "dev": false}, "/whatwg-mimetype@2.3.0": {"resolution": {"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="}, "dev": false}, "/whatwg-mimetype@3.0.0": {"resolution": {"integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="}, "engines": {"node": ">=12"}, "dev": false}, "/whatwg-url@8.7.0": {"resolution": {"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg=="}, "engines": {"node": ">=10"}, "dependencies": {"lodash": "4.17.21", "tr46": "2.1.0", "webidl-conversions": "6.1.0"}, "dev": false}, "/which-boxed-primitive@1.0.2": {"resolution": {"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg=="}, "dependencies": {"is-bigint": "1.0.4", "is-boolean-object": "1.1.2", "is-number-object": "1.0.7", "is-string": "1.0.7", "is-symbol": "1.0.4"}, "dev": false}, "/which-builtin-type@1.1.3": {"resolution": {"integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"function.prototype.name": "1.1.6", "has-tostringtag": "1.0.2", "is-async-function": "2.0.0", "is-date-object": "1.0.5", "is-finalizationregistry": "1.0.2", "is-generator-function": "1.0.10", "is-regex": "1.1.4", "is-weakref": "1.0.2", "isarray": "2.0.5", "which-boxed-primitive": "1.0.2", "which-collection": "1.0.2", "which-typed-array": "1.1.15"}, "dev": false}, "/which-collection@1.0.2": {"resolution": {"integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"is-map": "2.0.3", "is-set": "2.0.3", "is-weakmap": "2.0.2", "is-weakset": "2.0.3"}, "dev": false}, "/which-module@2.0.1": {"resolution": {"integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="}, "dev": false}, "/which-pm-runs@1.1.0": {"resolution": {"integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="}, "engines": {"node": ">=4"}, "dev": false}, "/which-pm@2.0.0": {"resolution": {"integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w=="}, "engines": {"node": ">=8.15"}, "dependencies": {"load-yaml-file": "0.2.0", "path-exists": "4.0.0"}, "dev": false}, "/which-pm@2.1.1": {"resolution": {"integrity": "sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ=="}, "engines": {"node": ">=8.15"}, "dependencies": {"load-yaml-file": "0.2.0", "path-exists": "4.0.0"}, "dev": false}, "/which-typed-array@1.1.15": {"resolution": {"integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA=="}, "engines": {"node": ">= 0.4"}, "dependencies": {"available-typed-arrays": "1.0.7", "call-bind": "1.0.7", "for-each": "0.3.3", "gopd": "1.0.1", "has-tostringtag": "1.0.2"}, "dev": false}, "/which@1.3.1": {"resolution": {"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="}, "hasBin": true, "dependencies": {"isexe": "2.0.0"}, "dev": false}, "/which@2.0.2": {"resolution": {"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="}, "engines": {"node": ">= 8"}, "hasBin": true, "dependencies": {"isexe": "2.0.0"}, "dev": false}, "/why-is-node-running@2.2.2": {"resolution": {"integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA=="}, "engines": {"node": ">=8"}, "hasBin": true, "dependencies": {"siginfo": "2.0.0", "stackback": "0.0.2"}, "dev": false}, "/widest-line@2.0.1": {"resolution": {"integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA=="}, "engines": {"node": ">=4"}, "dependencies": {"string-width": "2.1.1"}, "dev": false}, "/widest-line@3.1.0": {"resolution": {"integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="}, "engines": {"node": ">=8"}, "dependencies": {"string-width": "4.2.3"}, "dev": false}, "/widest-line@4.0.1": {"resolution": {"integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="}, "engines": {"node": ">=12"}, "dependencies": {"string-width": "5.1.2"}, "dev": false}, "/wrap-ansi@5.1.0": {"resolution": {"integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q=="}, "engines": {"node": ">=6"}, "dependencies": {"ansi-styles": "3.2.1", "string-width": "3.1.0", "strip-ansi": "5.2.0"}, "dev": false}, "/wrap-ansi@7.0.0": {"resolution": {"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="}, "engines": {"node": ">=10"}, "dependencies": {"ansi-styles": "4.3.0", "string-width": "4.2.3", "strip-ansi": "6.0.1"}, "dev": false}, "/wrap-ansi@8.1.0": {"resolution": {"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="}, "engines": {"node": ">=12"}, "dependencies": {"ansi-styles": "6.2.1", "string-width": "5.1.2", "strip-ansi": "7.1.0"}, "dev": false}, "/wrappy@1.0.2": {"resolution": {"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="}, "dev": false}, "/write-file-atomic@2.4.3": {"resolution": {"integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ=="}, "dependencies": {"graceful-fs": "4.2.11", "imurmurhash": "0.1.4", "signal-exit": "3.0.7"}, "dev": false}, "/write-file-atomic@3.0.3": {"resolution": {"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="}, "dependencies": {"imurmurhash": "0.1.4", "is-typedarray": "1.0.0", "signal-exit": "3.0.7", "typedarray-to-buffer": "3.1.5"}, "dev": false}, "/ws@7.5.9": {"resolution": {"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q=="}, "engines": {"node": ">=8.3.0"}, "peerDependencies": {"bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2"}, "peerDependenciesMeta": {"bufferutil": {"optional": true}, "utf-8-validate": {"optional": true}}, "dev": false}, "/xdg-basedir@3.0.0": {"resolution": {"integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ=="}, "engines": {"node": ">=4"}, "dev": false}, "/xdg-basedir@4.0.0": {"resolution": {"integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="}, "engines": {"node": ">=8"}, "dev": false}, "/xml-name-validator@3.0.0": {"resolution": {"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="}, "dev": false}, "/xmlchars@2.2.0": {"resolution": {"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="}, "dev": false}, "/xtend@4.0.2": {"resolution": {"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="}, "engines": {"node": ">=0.4"}, "dev": false}, "/y18n@4.0.3": {"resolution": {"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="}, "dev": false}, "/y18n@5.0.8": {"resolution": {"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="}, "engines": {"node": ">=10"}, "dev": false}, "/yallist@2.1.2": {"resolution": {"integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="}, "dev": false}, "/yallist@3.1.1": {"resolution": {"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="}, "dev": false}, "/yallist@4.0.0": {"resolution": {"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="}, "dev": false}, "/yaml@2.4.1": {"resolution": {"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg=="}, "engines": {"node": ">= 14"}, "hasBin": true, "dev": false}, "/yargs-parser@15.0.3": {"resolution": {"integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA=="}, "dependencies": {"camelcase": "5.3.1", "decamelize": "1.2.0"}, "dev": false}, "/yargs-parser@20.2.9": {"resolution": {"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="}, "engines": {"node": ">=10"}, "dev": false}, "/yargs-parser@21.1.1": {"resolution": {"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="}, "engines": {"node": ">=12"}, "dev": false}, "/yargs@14.2.3": {"resolution": {"integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg=="}, "dependencies": {"cliui": "5.0.0", "decamelize": "1.2.0", "find-up": "3.0.0", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "require-main-filename": "2.0.0", "set-blocking": "2.0.0", "string-width": "3.1.0", "which-module": "2.0.1", "y18n": "4.0.3", "yargs-parser": "15.0.3"}, "dev": false}, "/yargs@16.2.0": {"resolution": {"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="}, "engines": {"node": ">=10"}, "dependencies": {"cliui": "7.0.4", "escalade": "3.1.2", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "20.2.9"}, "dev": false}, "/yargs@17.7.2": {"resolution": {"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="}, "engines": {"node": ">=12"}, "dependencies": {"cliui": "8.0.1", "escalade": "3.1.2", "get-caller-file": "2.0.5", "require-directory": "2.1.1", "string-width": "4.2.3", "y18n": "5.0.8", "yargs-parser": "21.1.1"}, "dev": false}, "/yocto-queue@0.1.0": {"resolution": {"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="}, "engines": {"node": ">=10"}, "dev": false}, "/yocto-queue@1.0.0": {"resolution": {"integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g=="}, "engines": {"node": ">=12.20"}, "dev": false}, "/zod-to-json-schema@3.22.4(zod@3.22.4)": {"resolution": {"integrity": "sha512-2Ed5dJ+n/O3cU383xSY28cuVi0BCQhF8nYqWU5paEpl7fVdqdAmiLdqLyfblbNdfOFwFfi/mqU4O1pwc60iBhQ=="}, "peerDependencies": {"zod": "^3.22.4"}, "dependencies": {"zod": "3.22.4"}, "dev": false}, "/zod@3.22.4": {"resolution": {"integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg=="}, "dev": false}, "/zwitch@2.0.4": {"resolution": {"integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="}, "dev": false}}}


