diff --git a/.gitignore b/.gitignore index 848e08e2e49..63e492ffb81 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ data/pelican_settings.json # this file is generated by the search module and should not be committed search_bundle.js node_modules/ + +attack-style/dist/ +attack-style/docs/ diff --git a/CUSTOMIZING.md b/CUSTOMIZING.md index cbb2ef3d9e4..287af561c98 100644 --- a/CUSTOMIZING.md +++ b/CUSTOMIZING.md @@ -75,8 +75,8 @@ def get_priority(): def get_menu(): return { "display_name": "Name that will be displayed in the navigation menu" - "module_name": "Your module's name", - "url": "/your_module-s_name/", + "module_name": "Your module's name", + "url": "/your_module-s_name/", "external_link": False, "priority": your_module-s_name_config.priority, "children": [ @@ -91,7 +91,7 @@ def get_menu(): "display_name": "Module sub-menu external page", "url": "https://attack.mitre.org", "external_link": True, - "children": [] + "children": [] } ] } diff --git a/LICENSE.txt b/LICENSE.txt index 362f2b1e719..c126b71a5b5 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2024 The MITRE Corporation + Copyright 2025 The MITRE Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/NOTICE.txt b/NOTICE.txt index c1093525c4a..167ea9be128 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -1,4 +1,4 @@ -Copyright 2015-2024 The MITRE Corporation +Copyright 2015-2025 The MITRE Corporation Approved for Public Release; Distribution Unlimited. Case Number 19-3504. diff --git a/README.md b/README.md index 20a8f6c89b0..47320fbba45 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ STIX is designed to improve many different capabilities, such as collaborative t ## Notice -Copyright 2015-2024 The MITRE Corporation +Copyright 2015-2025 The MITRE Corporation Approved for Public Release; Distribution Unlimited. Case Number 19-3504. diff --git a/attack-style/.nvmrc b/attack-style/.nvmrc new file mode 100644 index 00000000000..b009dfb9d9f --- /dev/null +++ b/attack-style/.nvmrc @@ -0,0 +1 @@ +lts/* diff --git a/attack-style/.stylelintrc.json b/attack-style/.stylelintrc.json new file mode 100644 index 00000000000..39bc0d07746 --- /dev/null +++ b/attack-style/.stylelintrc.json @@ -0,0 +1,9 @@ +{ + "extends": [ + "stylelint-config-standard", + "stylelint-config-standard-scss" + ], + "ignoreFiles": [ + "dist/*" + ] +} \ No newline at end of file diff --git a/attack-style/README.md b/attack-style/README.md new file mode 100644 index 00000000000..1d1c04ccfb5 --- /dev/null +++ b/attack-style/README.md @@ -0,0 +1,56 @@ +# ATT&CK Style + +ATT&CK Style is a JavaScript package that builds the CSS styles for the ATT&CK website. +The outputs are simply 2 CSS files: + +* `dist/style-attack.css` +* `dist/style-user.css` + +These files are then copied into `/attack-theme/static/`. +Currently this is done manually - no automation. +But also, the CSS is not updated very often. + +## Installation + +To set up the ATT&CK Style package, follow these steps: + +1. **Prerequisite: Ensure Node.js is Installed**: + + Make sure you have the latest Node.js LTS version installed. + +2. **Navigate to the attack-style Sub-folder**: + + Clone the repository, then change your directory to the attack-style sub-folder. + + ```bash + cd /attack-style + ``` + +3. **Install Dependencies**: + + Run the following command to install the necessary dependencies: + + ```bash + npm install + ``` + +## Build + +1. **Build the CSS Files**: + + Use the following command to compile the SCSS files into CSS. + The CSS output files will be generated in the `dist/` directory. + + ```bash + npm run build + ``` + +2. **Copy CSS Files**: + + Copy both `dist/style-attack.css` and `dist/style-user.css` to `/attack-theme/static/`. + + ```bash + npm run copy + ``` + +The files are now ready to be used in the process to build the ATT&CK website! diff --git a/attack-style/abstracts/_color-functions.scss b/attack-style/abstracts/_color-functions.scss new file mode 100644 index 00000000000..4407f1f3d8b --- /dev/null +++ b/attack-style/abstracts/_color-functions.scss @@ -0,0 +1,55 @@ +@use "sass:color"; +@use "sass:map"; +@use "sass:string"; +@use "variables"; + +// accessor helper for $colors. Gets the color of the named pair +@function color($name) { + @return map.get(map.get(variables.$colors, $name), "color"); +} + +// given a color name, get an alternate version of the color, for patterning +// if the base color is dark, the alternate will be slightly lighter. +// if the base color is light, the alternate will be slightly darker. +// contrast, an optional argument, multiplies to create a more distint or similar color. >1 is more distant, <1 is more similar. +@function color-alternate($name, $contrast: 1) { + @return color.mix(color.invert(color($name)), color($name), $weight: $contrast * 5%); +} + +/// accessor helper for $colors. Gets the on-color of the named pair +@function on-color($name) { + @return map.get(map.get(variables.$colors, $name), "on-color"); +} + +/// given a color-name, get an emphasized version of the on-color. +/// The emphasized on-color is less like the background color. +@function on-color-emphasis($name) { + @return color.mix(color.invert(color($name)), on-color($name)); +} + +// given a color-name, get an deemphasized version of the on-color. +// The deemphasized on-color is more like the background color. +@function on-color-deemphasis($name) { + @return color.mix(color($name), on-color($name), 25%); +} + +// given a color name, compute a border color for the color +@function border-color($name) { + @return color.mix(color.invert(color($name)), color($name), 12.5%); + + // @return rgba(invert(color($name)), 0.125); +} + +// given a color name, compute a border color for the color +@function background-color($name) { + @return color.mix(color.invert(color($name)), color($name), 12.5%); +} + +// escape the color. Note param is a color and not a color name: this is not an accessor to the color map above. +// replaces # with %23 in hex colors +// see https://codepen.io/gunnarbittersmann/pen/BoovjR for explanation of why we have to escape # for the background image +@function escape-color($color) { + $hex: color.ie-hex-str($color); + + @return "%23" + string.slice($string: #{$hex}, $start-at: 4); // skip #AA in #AARRGGBB +} diff --git a/attack-style/abstracts/_font-faces.scss b/attack-style/abstracts/_font-faces.scss new file mode 100644 index 00000000000..8af1361b589 --- /dev/null +++ b/attack-style/abstracts/_font-faces.scss @@ -0,0 +1,42 @@ +@use "sass:list"; +@use "sass:map"; + +$fonts: ( + font-families: ( + "Roboto-Thin", + "Roboto-Light", + "Roboto-Regular", + "Roboto-Medium", + "Roboto-Bold", + "Roboto-Black", + "AlegreyaSans-Regular" + ), + font-weights: ( + 100, + 300, + 400, + 500, + 700, + 900, + 400 + ), + srcs: ( + "fonts/Roboto/Roboto-Thin.ttf", + "fonts/Roboto/Roboto-Light.ttf", + "fonts/Roboto/Roboto-Regular.ttf", + "fonts/Roboto/Roboto-Medium.ttf", + "fonts/Roboto/Roboto-Bold.ttf", + "fonts/Roboto/Roboto-Black.ttf", + "fonts/Alegreya_Sans/AlegreyaSans-Regular.ttf" + ) +); + +/* FONTS */ +@for $i from 1 to list.length(map.get($fonts, "font-families")) { + @font-face { + font-family: list.nth(map.get($fonts, "font-families"), $i); + font-style: normal; + font-weight: list.nth(map.get($fonts, "font-weights"), $i); + src: url(list.nth(map.get($fonts, "srcs"), $i)); + } +} diff --git a/attack-theme/static/style/_misc.scss b/attack-style/abstracts/_utilities.scss similarity index 88% rename from attack-theme/static/style/_misc.scss rename to attack-style/abstracts/_utilities.scss index bcc7f6a8005..23be713c829 100644 --- a/attack-theme/static/style/_misc.scss +++ b/attack-style/abstracts/_utilities.scss @@ -1,3 +1,5 @@ +@use "sass:math"; + // specify a font family for a css block or element @mixin font($primary, $secondary: sans-serif) { font-family: $primary, $secondary; @@ -5,7 +7,7 @@ // change any presicion point to rem for consistency @function to-rem($target-val) { - @return #{$target-val/16}rem; + @return #{math.div($target-val, 16)}rem; } // base for precision point (not used in @media blocks) @@ -17,4 +19,3 @@ @mixin margin($property, $value) { margin-#{$property}: to-rem(24 * $value); } - diff --git a/attack-style/abstracts/_variables.scss b/attack-style/abstracts/_variables.scss new file mode 100644 index 00000000000..bdbc472efa0 --- /dev/null +++ b/attack-style/abstracts/_variables.scss @@ -0,0 +1,80 @@ +@use "sass:map"; +@use "../config.scss" as config; + +/* COLORS */ + +/// ATT&CK Brand colors +$attack-colors: ( + attack-orange: #c63f1f, + attack-blue: #062f4f, + attack-footer: #0b2338, + attack-active: #0156b3 +); + +/// User colors +$user-colors: ( + user-gray: #303435 +); + +/// +/// Colors used across the website. +/// For each color-pair: +/// - "color" refers to the color itself +/// - "on-color" refers to the most readable text-color to appear on top of the color. +/// Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to +/// appear with inner content. For example, "link" is only intended to be used for link text, which inherently +/// cannot have inner text. +/// +$colors: ( + primary: ( + color: if(config.$use-attack-theme, map.get($attack-colors, attack-orange), map.get($user-colors, user-gray)), + on-color: white + ), + // used for header and some nav elements + secondary: + ( + color: if(config.$use-attack-theme, map.get($attack-colors, attack-blue), map.get($user-colors, user-gray)), + on-color: white + ), + // used for some buttons + footer: + ( + color: if(config.$use-attack-theme, map.get($attack-colors, attack-footer), map.get($user-colors, user-gray)), + on-color: #87deff + ), + // used for footer and some buttons + active: + ( + color: if(config.$use-attack-theme, map.get($attack-colors, attack-active), map.get($user-colors, user-gray)), + on-color: #eaeaea + ), + // used for active buttons and sidebar links + body: + ( + color: white, + on-color: #39434c + ), + // primary page body + // example of a dark theme for the site + // body: (color: rgb(50, 50, 50), on-color: #cdcdcd), + link: + ( + color: #4f7cac + ), + // hyperlinks + matrix-header: + ( + color: gray, + on-color: white + ), + // color of matrix headers + // query highlight in the search UI + search-highlight: + ( + color: yellow, + on-color: black + ), + deemphasis: ( + color: #303435 + ) +); diff --git a/attack-style/base/_base.scss b/attack-style/base/_base.scss new file mode 100644 index 00000000000..138b74ef090 --- /dev/null +++ b/attack-style/base/_base.scss @@ -0,0 +1,24 @@ +@use "../abstracts/color-functions"; + +// used in 404 and contact templates +.deemphasis { + color: color-functions.on-color-deemphasis(body); +} + +// background color for the table matrix headers in the home page and the matrices page +.matrix-header { + background-color: color-functions.color(matrix-header); + color: color-functions.on-color(matrix-header); +} + +// background color for the table matrix in the home page +%bg-alternate { + background-color: color-functions.color-alternate(body) !important; +} + +// .bg-alternate { +// background-color: color-functions.color-alternate(body) !important; +// } +.bg-alternate { + @extend %bg-alternate; +} diff --git a/attack-style/base/_typography.scss b/attack-style/base/_typography.scss new file mode 100644 index 00000000000..109184e1b44 --- /dev/null +++ b/attack-style/base/_typography.scss @@ -0,0 +1,12 @@ +@use "../abstracts/color-functions"; + +.text-label { + text-transform: uppercase; + font-size: 14px; +} + +.text-label-small { + font-size: 12px; + color: color-functions.color(deemphasis); + margin-top: -10px; +} diff --git a/attack-style/components/_matrix.scss b/attack-style/components/_matrix.scss new file mode 100644 index 00000000000..0804423c173 --- /dev/null +++ b/attack-style/components/_matrix.scss @@ -0,0 +1,381 @@ +@use "sass:math"; +@use "../abstracts/color-functions"; +@use "../abstracts/utilities"; + +.matrix-container { + border: 1px solid color-functions.border-color(body); + + // border-top-width: 0; + background: color-functions.color(body); + + & + .matrix-container { + margin-top: utilities.to-rem(16); + } + + .matrix-border { + border-left: 1px solid color-functions.border-color(body); + padding-left: 0.5rem; + display: flex; + justify-content: center; + align-items: center; + } + + .matrix-title { + border-bottom: 1px solid color-functions.border-color(body); + margin-bottom: 1rem; + padding-bottom: 0.5rem; + } + + .scroll-indicator-group { + white-space: nowrap; + display: flex; + + .matrix-scroll-box { + flex-grow: 1; + display: inline-block; + } + + .scroll-indicator { + width: 0; + display: inline-block; + position: relative; + + .cover { + width: 50px; + height: 100%; + position: absolute; + pointer-events: none; // doesn't prevent usage of things under the cover + } + + // safari doesn't really work with transparent in gradients, but making something almost transparent works + $safari-transparent: rgba(255, 255, 255, 0.1%); + + &.right { + .cover { + right: 0; + } + + &.show .cover { + background: linear-gradient(to right, $safari-transparent, color-functions.color(body)); + } + } + + &.left { + .cover { + left: 0; + } + + &.show .cover { + background: linear-gradient(to left, $safari-transparent, color-functions.color(body)); + } + } + } + } +} + +$sizeunit: 14px; + +.matrix { + white-space: normal; + line-height: $sizeunit; + + &.side { + // thead { + // background-color: color(matrix-header); + // color: on-color(matrix-header); + // } + // white-space: nowrap; + .tactic { + &:first-child { + padding: 2px 5px 2px 2px; + } + + &:last-child { + padding: 2px 2px 2px 5px; + } + + padding: 2px 5px; + width: 1%; + vertical-align: top; + + // &:not(:last-child):not(.name, .count) { + // border-right: 1px solid border-color(body); + // } + + &:hover:not(.name, .count) { + background: color-functions.background-color(body); + + // Apply background color to child when hovering + .sidebar.expanded .angle { + background: color-functions.background-color(body); + } + } + + &.name, + &.count { + text-align: center; + font-size: $sizeunit + 2px; + } + + &.name { + font-weight: bold; + } + + &.count { + font-size: $sizeunit - 1px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; + } + + .techniques-table { + border-collapse: collapse; + width: 100%; + + tr, + td { + padding: 0; + } + + tr { + height: 1px; + } + } + + .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; + + td { + padding: 0; + vertical-align: top; + + &.technique { + outline: 1px solid color-functions.on-color-deemphasis(body); + outline-offset: -1px; + } + } + } + + .subtechniques { + &.hidden { + display: none; + } + + // expand to entire height of row if it's smaller than supertechnique + display: flex; + flex-direction: column; + height: 100%; + margin-left: -1px; + border-left: 2px solid color-functions.on-color-deemphasis(body); + outline: 1px solid color-functions.on-color-deemphasis(body); + outline-offset: -1px; + white-space: nowrap; + vertical-align: top; + + .subtechnique { + height: 100%; + flex-grow: 1; + } + } + + .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: color-functions.color-alternate(body); + width: 12px; + height: 12px; + font-size: 16px; + line-height: 12px; + } + + .sidebar { + min-width: 8px; + width: 12px; + padding: 0; + background: color-functions.on-color-deemphasis(body); + cursor: pointer; + position: relative; + vertical-align: middle; + + .angle { + display: none; + } + + &.expanded .angle { + margin: 0 auto; // internet explorer and edge compatability requires this for some reason + height: 12px; + display: block; + position: absolute; + background: color-functions.color(body); + + svg { + fill: color-functions.on-color-deemphasis(body); + vertical-align: baseline; + } + + &.top { + top: 0; + } + + &.bottom { + bottom: 0; + } + } + } + } + } + + &.flat { + .tactic { + margin-right: 5px; + width: 1%; + vertical-align: top; + + &.name, + &.count { + text-align: center; + font-size: $sizeunit + 2px; + } + + &.name { + font-weight: bold; + } + + &.count { + font-size: $sizeunit - 1px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; + } + + .subtechniques-row.hidden { + display: none; + } + + .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; + + td { + padding: 0; + vertical-align: top; + + &.sidebar.technique { + min-width: 8px; + width: 12px; + padding: 0; + background: color-functions.on-color-deemphasis(body); + cursor: pointer; + vertical-align: middle; + + .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: color-functions.color-alternate(body); + width: 12px; + height: 9px; + font-size: 16px; + line-height: 12px; + } + } + + &.sidebar.subtechniques { + svg { + fill: color-functions.on-color-deemphasis(body); + vertical-align: baseline; + } + } + + &.sidebar { + border-right: 2px solid color-functions.on-color-deemphasis(body); + } + + &.technique { + outline: 1px solid color-functions.on-color-deemphasis(body); + outline-offset: -1px; + } + } + } + + .more-icon { + transition: all ease 0.125s; + vertical-align: top; + + // TODO icon + transform: scale(0.5) rotate(-90deg); + width: 12px; + height: 12px; + + &.expanded { + transform: scale(0.5); + } + } + } + } + + .technique-cell { + height: 100%; + display: flex; + align-items: center; + background-color: color-functions.color(body); + font-size: $sizeunit - 1px; + line-height: $sizeunit; + + a { + display: block; + width: 100%; + height: 100%; + padding: math.div($sizeunit, 2) 3px; + } + + outline: 1px solid transparent; + outline-offset: -1px; + + &:not(.colored):not(.supertechniquecell) { + outline-color: color-functions.border-color(body); + } + } +} + +.matrix-controls { + margin: auto; + width: 50%; + padding: 1rem; + + button { + border-color: color-functions.border-color(body); + background: color-functions.color(body); + color: color-functions.on-color(body); + + &:hover { + background: color-functions.color-alternate(body, 0.8); + } + } + + .layout-button { + // active layout button should not use the .active style + // to prevent it looking like there's two active items in + // the menu when the user is clicking. Instead use the + // bootstrap hover style. + &:active { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; + } + } +} + +.center-controls .matrix-controls .btn-toolbar { + justify-content: center; +} + +.btn-toolbar { + justify-content: center; +} diff --git a/attack-style/components/_search.scss b/attack-style/components/_search.scss new file mode 100644 index 00000000000..ec18d876a75 --- /dev/null +++ b/attack-style/components/_search.scss @@ -0,0 +1,141 @@ +@use "../abstracts/color-functions"; + +// highlight for found search words in preview and title +.search-word-found { + background: color-functions.color(search-highlight); + color: color-functions.on-color(search-highlight); +} + +.btn-group-text { + padding: 0.25rem, 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; + border: 1px solid transparent; +} + +.overlay.search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1051; // header is 1050 and we need to overlay header + background: rgba(0, 0, 0, 0.35); + padding: 50px; + + .overlay-inner { + border-radius: 25px; + background: color-functions.color(body); + color: color-functions.on-color(body); + width: 100%; + display: flex; + flex-flow: column; + max-height: 100%; + + .search-header { + flex-shrink: 0; + position: relative; + + .search-input { + padding: 10px; + + input { + padding-left: 12.5px; + font-size: 25px; + line-height: 50px; + width: 100%; + border: 0; + background: color-functions.color(body); + color: color-functions.on-color(body); + + &:focus { + outline: none; + } + } + } + + .search-icons { + position: absolute; + top: 0px; + right: 0px; + + > div { + display: inline-block; + } + + .search-parsing-icon { + height: 25px; + width: 25px; + margin-bottom: 8px; + opacity: 0.5; + } + + .close-search-icon { + font-size: 50px; + width: 50px; + line-height: 50px; + text-align: center; + margin: 10px; + opacity: 0.8; + cursor: pointer; + + &:hover { + opacity: 1; + } + } + } + } + + .search-body { + flex: 1 1 auto; + padding: 0 50px; + border-top: 1px solid color-functions.border-color(body); + margin-bottom: 25px; + overflow-y: auto; + + .results { + .search-result:first-child { + margin-top: 1.5rem; + } + } + + .load-more-results { + // button and stuff for showing more results + text-align: center; + } + } + } +} + +.page-search { + float: right; + width: 50%; +} + +// internet explorer compatability override +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .overlay.search .search-body { + flex-basis: 50vh !important; + } +} + +// mobile display search overrides +@media screen and (min-width: 1px) and (max-width: 767.8px) { + .search-input input { + font-size: 20px !important; + line-height: 25px !important; + } + + .close-search-icon { + font-size: 25px !important; + line-height: 25px !important; + width: 25px !important; + } + + .search-parsing-icon { + width: 14px !important; + height: 14px !important; + margin-bottom: 5px !important; + } +} diff --git a/attack-style/components/_tour.scss b/attack-style/components/_tour.scss new file mode 100644 index 00000000000..caed9b782eb --- /dev/null +++ b/attack-style/components/_tour.scss @@ -0,0 +1,43 @@ +@use "../abstracts/color-functions"; + +// .tour-backdrop { +// opacity: 0.3; +// position: fixed; +// } +.popover { + .popover-header { + background: color-functions.color(primary); + color: color-functions.on-color(primary); + } + + box-shadow: 0 0 5px 3px color-functions.color(body); // give the popover a halo for readability + + // darker border + border-color: color-functions.color(primary); + + &.bs-popover-left .arrow::before { + border-left-color: color-functions.color(primary); + } + + &.bs-popover-right .arrow::before { + border-right-color: color-functions.color(primary); + } + + &.bs-popover-top .arrow::before { + border-top-color: color-functions.color(primary); + } + + &.bs-popover-bottom { + .arrow::before, + .arrow::after, + .popover-header::before { + border-bottom-color: color-functions.color(primary); + } + } +} + +.tour-backdrop, +.tour-highlight { + // hide tour backdrop and highlight to prevent animations + opacity: 0; +} diff --git a/attack-style/components/_versioning.scss b/attack-style/components/_versioning.scss new file mode 100644 index 00000000000..c7e72ee7a21 --- /dev/null +++ b/attack-style/components/_versioning.scss @@ -0,0 +1,18 @@ +@use "../abstracts/color-functions"; + +.version-button { + // hide the option not in use + &.permalink .live { + display: none; + } + + &.live .permalink { + display: none; + } +} + +.version-table .table-break-row { + border-right-color: color-functions.color(body); + border-left-color: color-functions.color(body); + padding: 1rem 0; +} diff --git a/attack-style/config.scss b/attack-style/config.scss new file mode 100644 index 00000000000..48d49625aa9 --- /dev/null +++ b/attack-style/config.scss @@ -0,0 +1 @@ +$use-attack-theme: false !default; // set to false by default \ No newline at end of file diff --git a/attack-style/layout/_footer.scss b/attack-style/layout/_footer.scss new file mode 100644 index 00000000000..cd7f7f1cbb4 --- /dev/null +++ b/attack-style/layout/_footer.scss @@ -0,0 +1,112 @@ +@use "sass:color"; +@use "../abstracts/color-functions"; +@use "../abstracts/utilities"; + +/* Footer styling */ +.footer { + background-color: color-functions.color(footer); + color: color-functions.on-color(secondary); + padding: 1rem 3rem; + + @include utilities.font("Roboto-Thin"); + + // place footer at the bottom + &.sticky-footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } + + > .container-fluid { + padding-right: 0 !important; + padding-left: 0 !important; + } + + // space block between text block and buttons in footer + .footer-responsive-break { + display: none; + } + + // place buttons to the right of footer + .footer-float-right-responsive-brand { + float: right; + height: 100%; + display: flex; + align-items: center; + } + + // place button to the right of footer; vertically centered + .footer-float-right-responsive-centered { + display: flex; + justify-content: flex-end; + align-items: center; + } + + .footer-link-group { + display: flex; + flex-direction: column; + justify-content: center; + } + + .footer-link { + color: color-functions.on-color(footer); + + &:hover { + // add some link color to this so that it resembles a link, but is still visible if normal link color is not visible on footer color + color: color.mix(color-functions.on-color(footer), color-functions.color(link)); + } + } +} + +.col { + .col-footer { + border-right: 1px solid; + } +} + +.p-footer { + padding-left: 25px; +} + +.btn-footer { + color: white; + padding: 0.375rem; +} + +.btn-footer:hover { + color: white; +} + +// phones and small tablets view +@media screen and (width <= 47.9875rem) { + .footer { + // space block between text block and buttons in footer + .footer-responsive-break { + display: block !important; + } + + // extend buttons width to 100% in the footer + .footer-float-right-responsive-brand { + float: none !important; + } + + .footer-float-right-responsive-centered { + float: none !important; + display: block !important; + justify-content: none !important; + align-items: none !important; + } + } +} + +/* **** */ + +// Hides the footer when the user tries to print out a page so that the page looks clean and only the relevant information is displayed + +@media print { + .footer { + visibility: hidden; + display: none; + } +} diff --git a/attack-style/layout/_layout.scss b/attack-style/layout/_layout.scss new file mode 100644 index 00000000000..58dd9e6d900 --- /dev/null +++ b/attack-style/layout/_layout.scss @@ -0,0 +1,1669 @@ +@use "sass:color"; +@use "sass:math"; +@use "../abstracts/color-functions"; +@use "../abstracts/utilities"; +@use "../base/base"; + +/* General styling */ +html { + height: 100%; +} + +body { + height: 100%; + background: color-functions.color(body); + color: color-functions.on-color(body); + + @include utilities.font("Roboto-Regular"); + + display: flex; + flex-direction: column; +} + +// footer IE compatability +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + body { + height: auto; // fix footer bug + } +} + +// .maincontent { //grow the page content to fill space before footer +// flex-grow: 1; +// } + +.attack-website-wrapper { + max-height: 100vh; + overflow-y: auto; +} + +h1, +h2, +h3, +h4, +h5 { + @include utilities.font("Roboto-Light"); +} + +strong { + @include utilities.font("Roboto-Bold"); +} + +.jumbotron { + padding: 0; + background: color-functions.color(body); + color: color-functions.on-color(body); + + code { + color: color-functions.on-color-emphasis(body); + background-color: color-functions.color-alternate(body, 2); + border-radius: 3px; + font-family: courier, monospace; + padding: 0 3px; + } +} + +a { + color: color-functions.color(link); + + .anchor::before { + content: ""; + display: block; + margin-top: utilities.to-rem(-80); + position: absolute; + } +} + +.marker-none { + list-style-type: none; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.fs-s { + font-size: small; +} + +.capec-card { + background: rgb(128, 0, 0); + + img { + margin: utilities.to-rem(8); + max-width: utilities.to-rem(160); + max-height: utilities.to-rem(55); + margin-left: auto; + margin-right: auto; + display: block; + } +} + +.maec-card { + background: #212121; + + img { + margin: utilities.to-rem(8); + max-width: utilities.to-rem(146); + margin-left: auto; + margin-right: auto; + display: block; + } +} + +.default-img-size { + width: 100%; + max-width: utilities.to-rem(1000); +} + +.mitre-logo-wtrans { + width: utilities.to-rem(144); + height: utilities.to-rem(66); +} + +// left column in the home page +.quick-links { + width: 100%; + text-align: center; + table-layout: fixed; + + td { + padding: utilities.to-rem(5) 0; + } + + tr + tr { + border-top: 1px solid color-functions.border-color(body); + } +} + +.row-main-page { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +@media screen and (width <= 47.9875rem) { + .row-main-page { + display: inline; + } +} + +// p for home page +.p-line { + p { + border-top: 0.0625rem solid #1c2226; + } +} + +// button style in the side navigation of MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE +.btn-default { + background: color-functions.color(body); + border-color: color-functions.on-color-deemphasis(body); + color: color-functions.on-color(body); + + &:hover { + color: color-functions.on-color-emphasis(body); + } +} + +.website-button { + font-size: 16px; + border-radius: 5px; + cursor: pointer; + position: relative; + overflow: hidden; + font-family: Arial; + display: inline-flex; + align-items: center; + border-style: solid; +} + +.slide-icon-button { + border-style: none; + background: none; +} + +.slide-button { + @extend .website-button; + + border-color: color-functions.color(active); + color: #fff; + background: color-functions.color(active); + padding: 6px 16px; + + a & { + text-decoration: none !important; + } +} + +.slide-button-secondary { + @extend .website-button; + + color: color-functions.color(active); + background: #fff; + border-color: color-functions.color(active); + padding: 6px 16px; + + a & { + text-decoration: none !important; + } +} + +.slide-button-text { + position: relative; +} + +.slide-button-icon { + position: relative; + padding-left: 8px; +} + +.slide-button:hover { + background: color-functions.color(secondary); + border-color: color-functions.color(secondary); +} + +.slide-button-secondary:hover { + background: color-functions.on-color(active); + border-color: color-functions.color(secondary); + color: color-functions.color(secondary); +} + +// used for data sources filter dropdown +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: color-functions.on-color(secondary); + min-width: 160px; + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 20%); +} + +.dropdown:hover .dropdown-content { + display: block; +} + +// placeholder for base style of all navy colored buttons +%button-style { + color: color-functions.on-color(secondary); + border-color: utilities.to-rem(1) solid color-functions.color(secondary); +} + +// navy buttons are in the home page and in MATRICES +.btn-navy { + @extend %button-style; + + background-color: color-functions.color(secondary); + color: color-functions.on-color(secondary); + + &:hover { + // Extending placeholder 'button-style' is necessary to keep on-color white. Else, the on-color will change to the tag on-color when hovering the button. + @extend %button-style; + + background-color: color.scale(color-functions.color(secondary), $lightness: 5%); + background-image: none; + } +} + +// Style for changelog markdown section +.markdown-body { + h1:not(:first-child) { + padding-top: 2rem; + } + + h1 { + padding-bottom: utilities.rem(0.5); + font-size: utilities.rem(1.5); + } + + h2 { + font-size: utilities.rem(1); + } + + h3 { + font-size: utilities.rem(0.8); + } +} + +/* **** */ + +/* Table styling */ +.table, +.blog-post table, +.changelog table { + empty-cells: hide; + + td { + p:last-child { + margin-bottom: 0; + } + + padding: 0.75rem; + vertical-align: top; + } + + th { + padding: utilities.rem(0.3); + vertical-align: top; + font-size: utilities.rem(0.6); + } + + .active { + color: color-functions.color(primary); + } +} + +.blog-post table { + margin-bottom: 1.5rem; +} + +// background color for tables in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE +.table-alternate, +.blog-post table, +.changelog table { + @extend %bg-alternate; + + tbody { + background: color-functions.color(body); + color: color-functions.on-color(body); + } +} + +// table for techniques +.table-techniques { + thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; + } + + table { + border-collapse: collapse; + } + + td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; + } + + tr:last-child { + border-bottom: 1px solid #dfdfdf; + } + + .sub.technique { + border-left: none; + } + + .technique td:first-child { + border-bottom: none; + } + + .sub.technique td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; + } + + .sub.technique td:not(:nth-child(4)) { + color: #4f7cac; + } + + .technique:not(.sub) td:not(:nth-child(3)) { + color: #4f7cac; + } +} + +// Styling for techniques used table +.techniques-used { + table { + border-collapse: collapse; + } + + td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; + } + + tr:last-child { + border-bottom: 1px solid #dfdfdf; + } + + .sub.technique { + border-left: none; + } + + .technique td:first-child { + border-bottom: none; + } + + .technique td:nth-child(2) { + border-bottom: none; + } + + .sub.technique:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; + } + + .sub.technique:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; + } +} + +.techniques-used.background { + thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; + } +} + +// .table td.border { +// border-color: on-color-deemphasis(body); +// } + +// Styling for datasources table +.datasources-table { + table { + border-collapse: collapse; + } + + thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; + } + + td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; + } + + tr:last-child { + border-bottom: 1px solid #dfdfdf; + } + + .datacomponent.datasource { + border-left: none; + } + + .datasource td:first-child { + border-bottom: none; + } + + .datasource td:nth-child(2) { + border-bottom: none; + } + + .datacomponent.datasource:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; + } + + .datacomponent.datasource:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; + } + + .nowrap { + white-space: nowrap; + } +} + +.tables-mobile { + overflow-y: auto; +} + +.table-bordered, +.blog-post table, +.changelog table { + &, + & td, + & th { + border: 1px solid color-functions.border-color(body); + } + + th { + border-bottom: 2px solid color-functions.border-color(body) !important; + } +} + +// border style for empty cells in the home page matrix and in MATRICES +@mixin no-border($property) { + #{$property}: none !important; +} + +// vertically aligned text +@mixin align($text, $vertical) { + text-align: $text !important; + vertical-align: $vertical !important; +} + +// matrix style in home page and in MATRICES +.table-matrix { + @include no-border(border); + + thead th { + @include align(center, middle); + + border: utilities.to-rem(1) solid color-functions.border-color(body) !important; + } + + td, + th { + @include align(center, middle); + @include no-border(border-top); + + padding: utilities.to-rem(2) !important; + font-size: utilities.to-rem(12) !important; + + &.border { + border: utilities.to-rem(1) solid color-functions.border-color(body) !important; + } + + &.no-border { + @include no-border(border); + } + } + + td { + background: color-functions.color(body); + color: color-functions.on-color(body); + } +} + +// table expands/contracts depending on the cell's content +%table-nowrap { + white-space: nowrap; + width: 1%; +} + +// mitigation tables +.table-mitigations { + @extend %table-nowrap; + + th, + td { + @extend %table-nowrap; + } +} + +// number of table rows in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE +.div-count { + margin-top: auto; + margin-bottom: 0; +} + +.table-object-count { + display: flex; + justify-content: flex-end; +} + +// links in header row of matrices in the home page matrix and in MATRICES +.matrix-tactics-url { + color: color-functions.on-color(primary); + + &:visited, + &:hover, + &:active { + color: color-functions.on-color(primary); + } +} + +/* **** */ + +/* BANNER */ +.banner-message { + padding: utilities.to-rem(5) 0; + text-align: center; + background-color: color-functions.color-alternate(body, 2); +} + +// basic banner +.version-banner { + @extend .banner-message; +} + +/* **** */ + +/* IMG/SVG ICON in BANNER */ +.icon-inline { + display: inline-flex; + align-self: center; + + svg, + img { + height: utilities.rem(0.7); + width: utilities.rem(0.7); + fill: currentcolor; + top: utilities.rem(-0.175); + position: relative; + } +} + +/* **** */ + +/* Pre-block in SIGHTINGS */ +// style for inline code blocks +pre { + color: color-functions.on-color(body); + background-color: color-functions.color-alternate(body, 3); + border-radius: 5px; + padding: 1rem; +} + +code { + color: #c63e1f; +} + +/* **** */ + +/* CARDS */ +// cards are used in the General Information, Staying Informed, and Related Projects page, and in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE +.card { + background: color-functions.color(body); + color: color-functions.on-color(body); + border-color: color-functions.border-color(body); +} + +.button-group { + display: flex; + justify-content: end; + + a.button + a.button { + margin-left: 22px; + } + + button { + justify-content: center; + width: 100%; + } + + a.w-40 { + width: 40%; + } +} + +.card-filter { + width: 20%; + top: 9.3rem; + float: right; + background: color-functions.on-color(active); +} + +@media screen and (width <= 90.62rem) { + .card-filter { + display: contents; + } +} + +.card-presentation { + margin-bottom: 30px; +} + +.card-attackcon { + width: 100%; +} + +.card-data { + margin-bottom: utilities.rem(0.2); +} + +.card-header { + color: color-functions.on-color(body); + background: rgba(color-functions.on-color(body), 0.03); + border-bottom-color: color-functions.border-color(body); +} + +a.partial-underline { + text-decoration: none; + + .hover-line { + text-decoration: underline; + } +} + +.contact-card { + border-radius: 0.75em; + overflow: hidden; + + .card-footer { + padding: 0 1.25rem 1.25rem; + + &.button-group { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 12px; + } + } + + .card-footer-no-button { + padding: 0.5rem 1.25rem; + min-height: 4rem; + max-height: fit-content; + } + + .card-header { + padding: 1.25rem 1.25rem 0; + + &.background { + background: color-functions.color(footer); + color: white; + padding-bottom: 1.25rem; + } + } + + .card-header, + .card-footer { + &.no-background { + background: color-functions.color(body); + color: color-functions.on-color(body); + border: unset; + } + } + + .card-body { + p { + margin: 0; + } + + &.background { + background: color-functions.on-color(active); + } + } +} + +.card-body { + // Remove extra whitespace from tables inside of cards + // Source: https://github.com/philipnewcomer/bootstrap4-card-tables/blob/master/src/bootstrap4-card-tables.scss + > .table { + border-right: 0; + border-left: 0; + margin-bottom: 0; + + &:last-child { + border-bottom: 0; + } + + &:not(.table-sm) th, + &:not(.table-sm) td { + padding: 0.75rem 1.25rem; + } + + td:first-child, + th:first-child { + border-left: 0; + } + + td:last-child, + th:last-child { + border-right: 0; + } + + tr:first-child td, + tr:first-child th { + border-top: 0; + } + + tr:last-child td { + border-bottom: 0; + } + } + + .card-header + .table { + border-top: 0; + } +} + +// remove botton margin from last item in the card +.card-data:last-of-type { + margin-bottom: 0; +} + +.card-title { + font-size: utilities.rem(0.8); + color: color-functions.on-color-emphasis(body); +} + +.contact-card-title { + font-size: 1.1rem; + font-weight: bold; +} + +.card-title-icon { + float: right; + color: color-functions.color(active); +} + +/* **** */ + +/* TWITTER */ +// twitter container in the home page +.attack-box { + width: utilities.to-rem(352); + max-width: 100%; + height: utilities.to-rem(480); + margin: 0 auto; + border: 3px solid #dfdfdf; + padding: 3px; + display: flex; + flex-direction: column; + + iframe { + border: 1px solid color-functions.border-color(body) !important; + border-radius: 0.25rem; + } +} + +/* **** */ + +/* BREADCRUMBS */ +.breadcrumb { + font-size: 90%; + background-color: color-functions.color(body); + max-width: 1140px; + padding: 0 15px; + + .breadcrumb-item + .breadcrumb-item::before { + content: ">"; + color: color-functions.on-color-deemphasis(body); + } +} + +/* **** */ + +.nestedlist { + counter-reset: item; +} + +.nestedlist-item { + display: block; +} + +.nestedlist-item::before { + content: counters(item, ".") ". "; + counter-increment: item; +} + +.danger-card { + .card-header { + background: color-functions.color(primary); + color: color-functions.on-color(primary); + } + + border-color: color-functions.color(primary); +} + +/* **** */ + +/* ATT&CKCON */ +// collapsible expansion panels - light +.bg-accord-light { + color: color-functions.on-color(body); + background-color: color-functions.color-alternate(body); +} + +// collapsible expansion panels - dark +.bg-accord-dark { + color: color-functions.on-color(body); + background-color: color-functions.color-alternate(body, 3); +} + +/* **** */ + +/* CONTRIBUTE */ +.contribution-headers { + @include utilities.font("Roboto-Regular"); +} + +.usa-card-group { + display: flex; + flex-direction: row; +} + +.usa-card__header { + @include utilities.font("Roboto-Regular"); + + color: color-functions.color(body); + background: color-functions.color(secondary); + border-bottom-color: color-functions.border-color(body); + border-radius: 0.3rem 0.3rem 0 0; +} + +/* CONTRIBUTE Examples */ +.new-examples { + padding: utilities.to-rem(10) utilities.to-rem(10) 0 utilities.to-rem(10); + width: 100%; + + &.second-example { + margin-top: utilities.to-rem(10); + margin-bottom: utilities.to-rem(20); + } + + .example-container { + padding: utilities.to-rem(15); + + .examples-div { + display: flex; + + .margin-contribute-a { + margin-left: utilities.to-rem(25); + } + + .margin-contribute-b { + margin-left: utilities.to-rem(183); + } + } + + .examples-p { + margin-left: utilities.to-rem(5); + margin-bottom: utilities.to-rem(10); + word-break: break-word; + } + + .nested-examples-div { + padding-left: utilities.to-rem(50); + } + + .example-fields { + @include utilities.font("Roboto-Bold"); + + + ul { + padding-left: utilities.to-rem(100); + } + } + } +} + +/* **** */ + +/* CONTRIBUTORS */ +.scrollable-box { + width: 100%; + height: 500px; + overflow: auto; + + // border: 1px solid black; /* just to show the box */ + padding: utilities.to-rem(15); + background-color: color-functions.color-alternate(body); + border-radius: utilities.to-rem(3); +} + +/* **** */ + +img.yt-core-image { + width: 100%; +} + +.iframe-width { + width: 500px; + height: 275px; +} + +@media screen and (width <= 47.9875rem) { + .iframe-width { + width: 100%; + height: 140px; + } +} + +/* No transition */ +.notransition::after { + transition: none !important; +} + +/* FAQ */ +.faq { + .faq-section { + padding-bottom: 2rem; + } + + .faq-question { + padding: 6px 0; + } + + .relevant-links { + margin-bottom: 1rem; + border-radius: 3px; + + .faq-link ~ .faq-link::before { + content: ", "; + } + } +} + +/* **** */ + +@mixin collapsible($direction) { + display: flex; + flex-direction: row; + + :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; + } + + &:#{$direction}, + &::#{$direction} { + content: ""; + cursor: pointer; + width: utilities.to-rem(24); + height: utilities.to-rem(24); + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='#{color-functions.escape-color(color-functions.on-color(body))}' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; + } + + @if $direction == "before" { + &.collapsed:#{$direction}, + &.collapsed::#{$direction} { + transform: rotate(-90deg); + } + } @else { + &:not(.collapsed):#{$direction}, + &:not(.collapsed)::#{$direction} { + transform: rotate(-180deg); + } + } +} + +.attackcon-columns { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; +} + +@media screen and (width <= 47.9875rem) { + .attackcon-columns { + flex-direction: column; + } +} + +/* Ensure the sponsors block is below and not affected by the top image */ + +/* Card Blocks */ +// container of groups of cards +.card-block { + // style of card headers in collapsable cards in Getting Started and FAQ + .card-header { + h5 { + @include utilities.font("Roboto-Regular"); + } + + @include collapsible("after"); + } + + // style of card titles in Related Projects + .card-title { + display: inline-block; + flex-grow: 1; + + @include utilities.font("Roboto-Regular"); + } +} + +/* **** */ + +/* GENERAL INFORMATION */ +.general-info { + // cards with image in General Information page + .card-img-top { + width: 100%; + height: 15vw; + object-fit: cover; + } + + .graphics .card-header { + flex-grow: 1; + } + + // show entire timeline + .showmore-btn { + display: block !important; + text-align: center; + + &.show { + display: none !important; + } + } +} + +/* **** */ + +/* GETTING STARTED */ +// move video to an item in the getting started list when in mobile or tablet view +.getting-started { + ul:not(.col) { + padding: 0 utilities.to-rem(15); + margin-left: utilities.to-rem(15); + } + + .getting-started-content { + width: 75%; + } + + @media screen and (width <= 90.62rem) { + .getting-started-content { + width: 100%; + } + } + + .getting-started-icon { + color: color-functions.color(primary); + } + + .video-li { + /* don't display the video in the list itself except in mobile layout */ + display: none; + } + + @media screen and (width <= 47.9875rem) { + .row ul.col { + margin-left: utilities.to-rem(30); + } + + .video-col { + display: none; + } + + .video-li { + display: list-item; + } + } +} + +.jump-to-section { + position: -webkit-sticky; + position: sticky; + top: 14rem; + word-wrap: normal; + border-radius: 0.75em; +} + +/* **** */ + +/* Timeline in GENERAL INFORMATION */ +// base style of timeline +@mixin timeline($bg, $w, $h, $z) { + background: $bg; + position: absolute; + width: $w; + height: $h; + z-index: $z; + content: ""; +} + +.timeline { + $timeline-size: 20px; + $timeline-padding: 10px; + $timeline-hidden-height: 300px; + + overflow-y: hidden; + position: relative; + list-style-type: none; + padding-left: 0; + + // left line + &::before { + @include timeline(color-functions.on-color-deemphasis(body), utilities.to-rem(1), 100%, 2); + + left: (0.5 * $timeline-size) + $timeline-padding; + } + + &.collapse { + display: block !important; + } + + // hidden section of the timeline + &:not(.show) { + height: $timeline-hidden-height; + + // creating the 'faded' effect at the of the timeline when a section of the timelien is hidden + &::after { + @include timeline(linear-gradient(to bottom, transparent, color-functions.color(body)), 100%, math.div($timeline-hidden-height, 4), 4); + + bottom: 0; + pointer-events: none; // allow the user to click-through the overlay + } + } + + // milestones in timeline + .timeline-card { + margin: $timeline-size 0; + padding-left: $timeline-size + (2 * $timeline-padding); + + // roundel on the line indicating a milestone + &::before { + @include timeline(color-functions.color(body), $timeline-size, $timeline-size, 3); + + display: inline-block; + border-radius: 50%; + border: utilities.to-rem(2) solid color-functions.on-color-deemphasis(body); + left: $timeline-padding; + } + + // title style of the milestone + .timeline-card-header { + width: 100%; + display: flex; + flex-direction: row; + clear: both; + + .title { + display: inline-block; + flex-grow: 1; + font-size: utilities.rem(0.95); + } + + .date { + display: inline-block; + font-size: utilities.rem(0.95); + text-align: right; + white-space: nowrap; + padding-left: utilities.to-rem(10); + } + } + + // content of each milestone + .timeline-card-body { + padding-top: utilities.to-rem(5); + } + } +} + +/* **** */ + +/* Description formatting in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE */ +.description-body { + line-height: utilities.rem(1.5); +} + +.description-body.in-table { + padding: 0.75rem 1.25rem; + + p { + margin-bottom: 0; + } +} + +.description-body.card-description { + padding: 0.3rem 0 0 0; + + p { + margin-bottom: 0; + } +} + +/* **** */ + +/* External link icon */ +.external-icon { + width: utilities.to-rem(15); + margin-top: utilities.to-rem(-5); +} + +/* **** */ + +/* ATTA&K Logo */ +// attack logo in the home page +.attack-logo-bold { + width: 60%; +} + +// attack logo - menu +.attack-logo { + // vertically center + margin: 8px 0; + display: block; + height: 24px; +} + +/* **** */ + +/* anchor tag to bypass navbar */ +.anchor { + display: block; + position: relative; + top: utilities.to-rem(-66); + visibility: hidden; +} + +.section-view { + .anchor-section { + position: -webkit-sticky; + position: sticky; + top: 4.125rem; + background: color-functions.color(body); + z-index: 100; + margin-bottom: 0; + } + + p { + margin-bottom: 0; + padding-bottom: 0.5rem; + } + + // don't show in mobile view + .section-mobile-view { + display: none; + } + + // show in desktop view + .section-desktop-view { + display: block; + } + + // collapsed view for phones and small tablets + @media screen and (width <= 74.938rem) { + // show collapsed side navigation (mobile view) + .section-mobile-view { + display: block; + } + + // don't show side navigation in desktop view + .section-desktop-view { + display: none; + } + } + + .section-shadow { + border-bottom: 1px solid #dfdfdf !important; + } + + table { + margin-top: -1px; + } +} + +/* **** */ + +// how to display the sidebar +div#sidebars { + display: contents; +} + +/* Plus/Minus expand icons */ +// used in the expandable list items in the side navigation and in the expandable gray blocks in ATT&CKCON +.expand-icon { + font-size: 5%; + color: color-functions.on-color(body); + margin-top: utilities.to-rem(7); +} + +/* **** */ + +/* attackcon page */ +.attackcons { + border-top-width: 0; + + .sponsors { + flex: 1; + padding-left: 25px; + } + + .p-description { + width: 90%; + } + + .sponsors-block { + background: color-functions.on-color(active); + text-align: center; + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + flex-direction: column; + width: 200%; + + .img-container { + margin: 10px; + flex: 1 1 20%; + box-sizing: border-box; + + img { + width: 100%; + margin: auto; + height: auto; + } + } + } + + @media screen and (width <= 47.9875rem) { + .sponsors-block { + width: 100%; + flex-direction: row; + } + } +} + +.support-box { + background-color: color-functions.color-alternate(body, 2); + padding: 1.5em; + border-radius: 0.75em; + width: fit-content; +} + +.sponsor-list { + gap: 1.5em; +} + +.sponsor-square { + padding: 0 !important; + height: 150px; + display: flex; + + a { + display: contents; + } + + img.sponsor-logo { + background-color: color-functions.color(body); + border-radius: 6px; + object-fit: contain; + object-position: center; + } +} + +/* **** */ + +/* training pages */ +.training { + .exercise { + background: color-functions.color-alternate(body); + } +} + +.card-training { + margin-bottom: 30px; + width: 100%; +} + +.training-card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: left; +} + +.training-text-container { + flex: 1; + margin-right: 20px; +} + +.training-header { + display: flex; + justify-content: space-between; +} + +.resources-container { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: 10px; +} + +.resource { + flex: 1; + background-color: color-functions.on-color(active); + padding: 10px; + box-sizing: border-box; +} + +.resource-links { + list-style-type: none; + margin-top: 5px; + padding: 0 !important; + margin-left: 0 !important; +} + +.resource-links li { + margin-bottom: 5px; +} + +.resource-links a { + text-decoration: underline; +} + +/* **** */ + +// Decorative panels used for working-with-attack page + +.decorative-panels { + .decorative-panel { + // display: block; + .decorative-panel-header, + .decorative-panel-body { + padding: 10px; + } + + .decorative-panel-header { + h3, + h4, + .btn { + margin-bottom: 16px; + } + } + + .decorative-panel-body.show { + border-top: 1px solid color-functions.border-color(body); + } + + & + .decorative-panel { + margin-top: 25px; + } + + &:nth-of-type(even) { + border-radius: 8px; + background: color-functions.color-alternate(body); + } + } + + @media screen and (width <= 47.9875rem) { + .row { + display: block; + + &.collapse:not(.show) { + display: none; + } + } + } +} + +.working-with-attack { + .g-24 { + gap: 24px; + } + + .g-12 { + gap: 12px; + } + + .row.panels { + margin: 0; + } + + img { + border-radius: 0.75em; + } + + img.scale { + object-fit: cover; + object-position: left top; + border-radius: unset !important; + border: 1px solid color-functions.border-color(body); + } + + .panel { + padding: 0; + border: 1px solid color-functions.border-color(body); + border-radius: 0.75em; + max-width: 100%; + } + + img + .panel-body { + border-top: 1px solid color-functions.border-color(body); + } + + .panel-body { + p { + margin: 24px 0; + overflow: scroll; + } + + &.fixed-height { + height: 30vh; + } + } + + ul { + margin-bottom: 0; + } + + @media screen and (width <= 61.938rem) { + .panel-body { + &.fixed-height { + min-height: 40vh; + max-height: fit-content; + } + } + } + + .table-of-contents { + position: static; + float: none; + width: 25%; + } +} + +.tip-box { + background: color-functions.on-color(active); + padding: 1rem; +} + +/* Card Blocks */ +// container of groups of cards +.expand-panel { + .card-block { + // style of card headers in collapsable cards in Getting Started and FAQ + .card-header { + h5 { + @include utilities.font("Roboto-Regular"); + } + + @include collapsible("after"); + + &:not(:last-child) { + border-bottom: none; + } + } + + // style of card titles in Related Projects + .card-title { + display: inline-block; + flex-grow: 1; + + @include utilities.font("Roboto-Regular"); + } + + .first-card { + border-bottom: none; + border-radius: 0.25rem 0.25rem 0 0; + } + + .last-card { + border-radius: 0 0 0.25rem 0.25rem; + } + + .middle-card { + border-bottom: none; + border-radius: 0; + } + } +} + +/* **** */ + +// Institutes page breaks when the user tries to print so that all the content gets printed out, not just the first page (if there is more than one page's +// worth of content) +@media print { + * { + overflow: visible !important; + break-before: always !important; + page-break-inside: avoid !important; + } +} diff --git a/attack-style/layout/_nav.scss b/attack-style/layout/_nav.scss new file mode 100644 index 00000000000..85e321a44c3 --- /dev/null +++ b/attack-style/layout/_nav.scss @@ -0,0 +1,377 @@ +@use "layout"; +@use "../abstracts/color-functions"; +@use "../abstracts/utilities"; + +/* Navigation styling */ +// base style for nav-links in the top navigation bar (across the web site) +%ele-state { + border: utilities.to-rem(1) solid transparent; + border-top-left-radius: utilities.rem(-0.05); + border-top-right-radius: utilities.rem(-0.05); + text-decoration: underline; +} + +/* Top NAVIGATION */ // top navigation bar across the web site +.navbar { + background-color: color-functions.color(primary); + z-index: 1; + + // ATT&CK brand in the top navigation bar + .navbar-brand { + font-size: utilities.rem(1.7); + } + + .nav-tabs { + border-bottom: none; + + // list items + .nav-link { + color: color-functions.on-color(primary); + + @include utilities.font("Roboto-Light"); + + &:focus { + color: color-functions.on-color(primary); + + @extend %ele-state; + } + + &:hover:not(.active) { + color: color-functions.on-color(primary); + background-color: transparent; + + @extend %ele-state; + } + + &.active { + color: color-functions.on-color(primary); + background-color: color-functions.color(primary); + + @extend %ele-state; + } + } + + .nav-item.show .nav-link { + color: color-functions.on-color(primary); + background-color: color-functions.color(primary); + border-color: transparent; + } + } + + .search-button { + padding: 0.3rem utilities.to-rem(16); + font-size: 1rem; + border: utilities.to-rem(1) solid color-functions.on-color(primary); + border-radius: 0.25rem; + color: color-functions.on-color(primary); + line-height: utilities.to-rem(24); + opacity: 0.8; + + &:not(:has(.error-icon)):hover { + opacity: 1; + } + + .icon-button { + content: ""; + width: utilities.to-rem(24); + height: utilities.to-rem(24); + background-repeat: no-repeat; + display: inline-block; + vertical-align: middle; + background-position: center; + z-index: 1; + transition: all 0.2s ease; + } + + .search-icon { + cursor: pointer; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='#{color-functions.escape-color(color-functions.on-color(primary))}' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + } + + .error-icon { + cursor: default; + background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg fill='#{color-functions.escape-color(color-functions.on-color(primary))}' xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 96 960 960' width='24'%3e%3cpath d='M479.982 776q14.018 0 23.518-9.482 9.5-9.483 9.5-23.5 0-14.018-9.482-23.518-9.483-9.5-23.5-9.5-14.018 0-23.518 9.482-9.5 9.483-9.5 23.5 0 14.018 9.482 23.518 9.483 9.5 23.5 9.5ZM453 623h60V370h-60v253Zm27.266 353q-82.734 0-155.5-31.5t-127.266-86q-54.5-54.5-86-127.341Q80 658.319 80 575.5q0-82.819 31.5-155.659Q143 347 197.5 293t127.341-85.5Q397.681 176 480.5 176q82.819 0 155.659 31.5Q709 239 763 293t85.5 127Q880 493 880 575.734q0 82.734-31.5 155.5T763 858.316q-54 54.316-127 86Q563 976 480.266 976Zm.234-60Q622 916 721 816.5t99-241Q820 434 721.188 335 622.375 236 480 236q-141 0-240.5 98.812Q140 433.625 140 576q0 141 99.5 240.5t241 99.5Zm-.5-340Z'/%3e%3c/svg%3e"); + } + } +} + +/* **** */ + +.nav, +.faq { + /* NAVIGATION Dropdown */ // dropdowns in top navigation bar + .dropdown:hover > .dropdown-menu { + display: block; + } + + .dropdown-menu { + background-color: color-functions.color(primary); + + .dropdown-item { + color: color-functions.on-color(primary); + + &:hover, + &:focus { + color: color-functions.on-color(primary); + text-decoration: underline; + background-color: transparent; + } + } + } + + /* **** */ + + /* Side NAVIGATION */ + // bold list name for MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE + border-color: color-functions.border-color(body) !important; + + .heading { + font-size: utilities.rem(1.3); + color: color-functions.on-color-deemphasis(body); + letter-spacing: utilities.to-rem(3); + pointer-events: none; + + @media screen and (width <= 74.938rem) { + pointer-events: all; + } + } + + .heading.collapsed .fa-chevron-up, + .heading .fa-chevron-down { + display: none; + } + + .heading.collapsed .fa-chevron-down, + .heading .fa-chevron-up { + display: inline-block; + } + + i.fa-solid { + visibility: hidden; + display: none; + + @media screen and (width <= 74.938rem) { + visibility: visible; + display: contents; + } + } + + .br-mobile { + display: none; + + @media screen and (width <= 74.938rem) { + display: inline-block; + } + } + + // dropdown of the button in the side navigation. This button is in MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE + .heading-dropdown { + font-size: utilities.rem(0.9); + color: color-functions.color(secondary); + letter-spacing: utilities.to-rem(3); + } + + // smaller fon-size and letter spacin for phones and small tablets + @media screen and (width <= 90.62rem) { + // bold list name for MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE + .heading { + font-size: utilities.rem(0.9); + color: color-functions.on-color-deemphasis(body); + letter-spacing: utilities.to-rem(3); + } + + // dropdown of the button in the side navigation. This button is in MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE + .heading-dropdown { + font-size: utilities.rem(0.7); + color: color-functions.on-color(body); + letter-spacing: utilities.to-rem(1); + } + } + + /* **** */ + + // list items + .nav-link { + font-size: utilities.rem(0.7); + padding: utilities.rem(0) utilities.rem(0.7); + color: color-functions.on-color-deemphasis(body); + + &.expand-title { + font-size: utilities.rem(0.8); + color: color-functions.on-color(body); + } + + &.side { + padding: utilities.rem(0) utilities.rem(0); + word-break: break-word; + + &:hover { + background-color: color-functions.color(primary); + color: color-functions.on-color(primary); + } + + &.active { + color: color-functions.color(primary); + background-color: color-functions.color-alternate(body); + border-right: utilities.to-rem(3) solid color-functions.color(primary); + } + } + } +} + +/* **** */ + +.resizer { + width: 2px; + top: 0; + right: 0; + cursor: col-resize; + height: 100%; + position: absolute; + background-color: #dfdfdf; +} + +.data-sources-menu { + padding-top: 15px; +} + +.sidebar.nav { + // max-height: 60vh; + overflow-y: auto; + z-index: 0; // behind the header + min-width: min-content; + max-width: 20vw; + + // Remove overflow and sticky position for mobile view + @media screen and (width <= 74.938rem) { + position: static; + min-width: fit-content; + } + + .sidenav-wrapper { + display: flex; + flex-direction: column; + padding-right: 5px; + padding-left: 1rem; + height: 100%; + + @media screen and (width <= 74.938rem) { + display: block; + } + + .heading { + border-bottom: 1px solid color-functions.color-alternate(body); + flex: 0 1 0; + } + + .checkbox-div { + border-bottom: 1px solid color-functions.color-alternate(body); + flex: 0 1 0; + } + + .sidenav-list { + flex: 1 0 0; + overflow-y: auto; + + .sidenav { + width: 100%; + word-break: break-word; + font-size: utilities.rem(0.8); + + .sidenav-head { + display: flex; + flex-direction: row; + + a, + .expand-button { + // any direct child + cursor: pointer; + color: black; + + &:hover { + background: color-functions.color-alternate(body); + } + } + + a, + span { + padding: utilities.rem(0); + padding-left: 0; + display: inline-block; + flex-grow: 1; + height: 100%; + + &:hover { + text-decoration: none; // disable underline + } + } + + .expand-button { + padding: 5px; + border-left: 1px solid color-functions.color-alternate(body); + display: inline-block; + + @include layout.collapsible("after"); + } + + &.active { + // current page + &, + & > a { + color: color-functions.color(active) !important; + font-weight: bolder; + background: color-functions.on-color(active); + font-family: Roboto-Bold, sans-serif; + } + + // background-color: color-alternate(body); + // border-right: to-rem(3) solid color(primary); + } + } + + .sidenav-body { + padding-left: 0.75rem; + } + + .sidenav { + // nested + padding-left: utilities.to-rem(12); + } + } + } + } +} + +// Hides the navbar when the user tries to print out a page so that the page looks clean and only the relevant information is displayed + +@media print { + .nav { + visibility: hidden; + display: none; + } + + .sidenav { + visibility: hidden; + display: none; + } + + .sidebar.nav { + visibility: hidden; + display: none; + } + + .sidenav-wrapper { + visibility: hidden; + display: none; + } + + .side-nav-desktop-view { + visibility: hidden; + display: none; + } + + .navbar { + visibility: hidden; + display: none; + } +} diff --git a/attack-style/package-lock.json b/attack-style/package-lock.json new file mode 100644 index 00000000000..d6e38e2ee58 --- /dev/null +++ b/attack-style/package-lock.json @@ -0,0 +1,5205 @@ +{ + "name": "attack-style", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "attack-style", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "sass": "^1.83.0", + "sassdoc": "^2.7.4" + }, + "devDependencies": { + "stylelint": "^16.12.0", + "stylelint-config-standard": "^36.0.1", + "stylelint-config-standard-scss": "^14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", + "license": "MIT", + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "license": "MIT", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brace-expansion/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", + "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", + "license": "MIT", + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "license": "MIT" + }, + "node_modules/cacheable-request/node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cdocparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/cdocparser/-/cdocparser-0.13.0.tgz", + "integrity": "sha512-bMi4t0qjeT0xQ8ECBmWcilMYcUNYsERQoatXveMIbItgqliZDCNyv2xfkBoKrs5H08ApeRMoysJLwgPiHtv7HQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2", + "lodash.assign": "^2.4.1", + "strip-indent": "^1.0.0" + } + }, + "node_modules/cdocparser/node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "license": "MIT", + "dependencies": { + "get-stdin": "^4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chroma-js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.4.1.tgz", + "integrity": "sha512-jTwQiT859RTFN/vIf7s+Vl/Z2LcMrvMv3WUFmd/4u76AdlFC0NTNgqEEFPcRiHmAswPsMiQEDZLM8vX8qXpZNQ==" + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", + "license": "MIT" + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/cloneable-readable/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/cloneable-readable/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/cloneable-readable/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha512-jyweV/k0rbv2WK4r9KLayuBrSh2Py0tNmV7LBoSMH4hMQyrG8OPyIOWB2VEx4DJKXWmK4lopYMVvORlDt2S8Aw==", + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/docopt": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz", + "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "license": "BSD-3-Clause" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/ends-with": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ends-with/-/ends-with-0.2.0.tgz", + "integrity": "sha512-lRppY4dK3VkqBdR242sKcAJeYc8Gf/DhoX9AWvWI2RzccmLnqBQfwm2k4oSDv5MPDjUqawCauXhZkyWxkVhRsg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-denodeify": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-denodeify/-/es6-denodeify-0.1.5.tgz", + "integrity": "sha512-731Rf4NqlPvhkT1pIF7r8vZxESJlWocNpXLuyPlVnfEGXlwuJaMvU5WpyyDjpudDC2cgXVX849xljzvQqBg1QQ==", + "license": "Unlicense" + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "license": "MIT" + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", + "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==", + "license": "MIT" + }, + "node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha512-9ztMtDZtSKC78V8mev+k31qaTabbmuH5jatdvPBMikrFHvw5BqlYnQIn/WGK3WHeRooSTkRvLa2IPlaHjPq5Sg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/fs-mkdirp-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-mkdirp-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", + "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/glob-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/glob-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==", + "dependencies": { + "find-index": "^0.1.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "license": "MIT", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "license": "ISC" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, + "node_modules/ignore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "license": "MIT", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT" + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", + "license": "MIT", + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._basebind": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basebind/-/lodash._basebind-2.4.1.tgz", + "integrity": "sha512-VGHm6DH+1UiuafQdE/DNMqxOcSyhRu0xO9+jPDq7xITRn5YOorGrHVQmavMVXCYmTm80YRTZZCn/jTW7MokwLg==", + "license": "MIT", + "dependencies": { + "lodash._basecreate": "~2.4.1", + "lodash._setbinddata": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash._basecreate": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-2.4.1.tgz", + "integrity": "sha512-8JJ3FnMPm54t3BwPLk8q8mPyQKQXm/rt9df+awr4NGtyJrtcCXM3Of1I86S6jVy1b4yAyFBb8wbKPEauuqzRmQ==", + "license": "MIT", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash.isobject": "~2.4.1", + "lodash.noop": "~2.4.1" + } + }, + "node_modules/lodash._basecreatecallback": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatecallback/-/lodash._basecreatecallback-2.4.1.tgz", + "integrity": "sha512-SLczhg860fGW7AKlYcuOFstDtJuQhaANlJ4Y/jrOoRxhmVtK41vbJDH3OefVRSRkSCQo4HI82QVkAVsoGa5gSw==", + "license": "MIT", + "dependencies": { + "lodash._setbinddata": "~2.4.1", + "lodash.bind": "~2.4.1", + "lodash.identity": "~2.4.1", + "lodash.support": "~2.4.1" + } + }, + "node_modules/lodash._basecreatewrapper": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._basecreatewrapper/-/lodash._basecreatewrapper-2.4.1.tgz", + "integrity": "sha512-x2ja1fa/qmzbizuXgVM4QAP9svtMbdxjG8Anl9bCeDAwLOVQ1vLrA0hLb/NkpbGi9evjtkl0aWLTEoOlUdBPQA==", + "license": "MIT", + "dependencies": { + "lodash._basecreate": "~2.4.1", + "lodash._setbinddata": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash._createwrapper": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._createwrapper/-/lodash._createwrapper-2.4.1.tgz", + "integrity": "sha512-5TCfLt1haQpsa7bgLYRKNNE4yqhO4ZxIayN1btQmazMchO6Q8JYFRMqbJ3W+uNmMm4R0Jw7KGkZX5YfDDnywuw==", + "license": "MIT", + "dependencies": { + "lodash._basebind": "~2.4.1", + "lodash._basecreatewrapper": "~2.4.1", + "lodash._slice": "~2.4.1", + "lodash.isfunction": "~2.4.1" + } + }, + "node_modules/lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==", + "license": "MIT" + }, + "node_modules/lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==", + "license": "MIT" + }, + "node_modules/lodash._setbinddata": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._setbinddata/-/lodash._setbinddata-2.4.1.tgz", + "integrity": "sha512-Vx0XKzpg2DFbQw4wrp1xSWd2sfl3W/BG6bucSRZmftS1AzbWRemCmBQDxyQTNhlLNec428PXkuuja+VNBZgu2A==", + "license": "MIT", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash.noop": "~2.4.1" + } + }, + "node_modules/lodash._shimkeys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz", + "integrity": "sha512-lBrglYxLD/6KAJ8IEa5Lg+YHgNAL7FyKqXg4XOUI+Du/vtniLs1ZqS+yHNKPkK54waAgkdUnDOYaWf+rv4B+AA==", + "license": "MIT", + "dependencies": { + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash._slice": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._slice/-/lodash._slice-2.4.1.tgz", + "integrity": "sha512-+odPJa4PE2UgYnQgJgkLs0UD03QU78R2ivhrFnG9GdtYOZdE6ObxOj7KiUEUlqOOgatFT+ZqSypFjDSduTigKg==", + "license": "MIT" + }, + "node_modules/lodash.assign": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-2.4.1.tgz", + "integrity": "sha512-AqQ4AJz5buSx9ELXWt5dONwJyVPd4NTADMKhoVYWCugjoVf172/LpvVhwmSJn4g8/Dc0S8hxTe8rt5Dob3X9KQ==", + "license": "MIT", + "dependencies": { + "lodash._basecreatecallback": "~2.4.1", + "lodash._objecttypes": "~2.4.1", + "lodash.keys": "~2.4.1" + } + }, + "node_modules/lodash.bind": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-2.4.1.tgz", + "integrity": "sha512-hn2VWYZ+N9aYncRad4jORvlGgpFrn+axnPIWRvFxjk6CWcZH5b5alI8EymYsHITI23Z9wrW/+ORq+azrVFpOfw==", + "license": "MIT", + "dependencies": { + "lodash._createwrapper": "~2.4.1", + "lodash._slice": "~2.4.1" + } + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "license": "MIT" + }, + "node_modules/lodash.identity": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.identity/-/lodash.identity-2.4.1.tgz", + "integrity": "sha512-VRYX+8XipeLjorag5bz3YBBRJ+5kj8hVBzfnaHgXPZAVTYowBdY5l0M5ZnOmlAMCOXBFabQtm7f5VqjMKEji0w==", + "license": "MIT" + }, + "node_modules/lodash.isfunction": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "integrity": "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==", + "license": "MIT" + }, + "node_modules/lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==", + "license": "MIT", + "dependencies": { + "lodash._objecttypes": "~2.4.1" + } + }, + "node_modules/lodash.keys": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz", + "integrity": "sha512-ZpJhwvUXHSNL5wYd1RM6CUa2ZuqorG9ngoJ9Ix5Cce+uX7I5O/E06FCJdhSZ33b5dVyeQDnIlWH7B2s5uByZ7g==", + "license": "MIT", + "dependencies": { + "lodash._isnative": "~2.4.1", + "lodash._shimkeys": "~2.4.1", + "lodash.isobject": "~2.4.1" + } + }, + "node_modules/lodash.noop": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-2.4.1.tgz", + "integrity": "sha512-uNcV98/blRhInPUGQEnj9ekXXfG+q+rfoNSFZgl/eBfog9yBDW9gfUv2AHX/rAF7zZRlzWhbslGhbGQFZlCkZA==", + "license": "MIT" + }, + "node_modules/lodash.support": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.support/-/lodash.support-2.4.1.tgz", + "integrity": "sha512-6SwqWwGFHhTXEiqB/yQgu8FYd//tm786d49y7kizHVCJH7zdzs191UQn3ES3tkkDbUddNRfkCRYqJFHtbLnbCw==", + "license": "MIT", + "dependencies": { + "lodash._isnative": "~2.4.1" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/marked": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.3.tgz", + "integrity": "sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/memoize-decorator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/memoize-decorator/-/memoize-decorator-1.0.2.tgz", + "integrity": "sha512-G2vHcq4c+EwnBAOeWCH1mNz99QPCgm4ECjhHOd3SFZm66jVlwhBLdqhCvnHxptaRyZfm8ap3igoeDfrO92+uHQ==", + "license": "MIT" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/multipipe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-1.0.2.tgz", + "integrity": "sha512-6uiC9OvY71vzSGX8lZvSqscE7ft9nPupJ8fMjrCNRAUy2LREUW42UL+V/NTrogr6rFgRydUrCX4ZitfpSNkSCQ==", + "license": "MIT", + "dependencies": { + "duplexer2": "^0.1.2", + "object-assign": "^4.1.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "license": "MIT", + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/ordered-read-streams/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/ordered-read-streams/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "license": "MIT" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "license": "MIT" + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "license": "MIT", + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/remove-bom-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/remove-bom-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "license": "ISC" + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "license": "MIT", + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-wipe": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/safe-wipe/-/safe-wipe-0.2.5.tgz", + "integrity": "sha512-MwTNf4YrRqCHsB5jUzOVdXoRbW4jkhgTvhlyfiaxox8EP7cOCiD4ydMOQCxDPR9KpvwdBSM2dQHScV1m85k8wQ==", + "license": "Unlicense", + "dependencies": { + "extend": "^3.0.2", + "q": "1.*", + "rimraf": "2.*" + } + }, + "node_modules/safe-wipe/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/sass": { + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-convert": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/sass-convert/-/sass-convert-0.5.2.tgz", + "integrity": "sha512-eV9wXZg7MrHmnKLD6WojC/WX7lhLm+PSSLrOukzRIECa04fGbkmFDO9Ot9/82KjzSe+VEClYe9WDKzCuBz30Dg==", + "license": "Unlicense", + "dependencies": { + "concat-stream": "^1.4.7", + "dargs": "^4.0.0", + "ends-with": "^0.2.0", + "es6-denodeify": "^0.1.0", + "es6-promise": "^3.0.2", + "memoize-decorator": "^1.0.2", + "object-assign": "^3.0.0", + "semver": "^5.0.1", + "semver-regex": "^1.0.0", + "through2": "^2.0.0", + "which": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0", + "npm": ">=2.1.0" + } + }, + "node_modules/sass-convert/node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/sass-convert/node_modules/object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sass-convert/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/sass-convert/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/sass-convert/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/sass-convert/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/sassdoc": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/sassdoc/-/sassdoc-2.7.4.tgz", + "integrity": "sha512-/HEjX9pMILkePyC4ZKGhkLqZHJZpsTxFwQIQNsLhV4XHiPKoWHrSmam1pMntM79tcdtBII3JX7ShfyZjHnrkyw==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.2.1", + "babel-runtime": "^6.26.0", + "chalk": "^2.4.2", + "concat-stream": "^2.0.0", + "docopt": "^0.6.1", + "glob": "^7.1.6", + "glob2base": "0.0.12", + "js-yaml": "^3.14.0", + "lodash.difference": "^4.5.0", + "lodash.uniq": "^4.5.0", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "multipipe": "1.0.2", + "rimraf": "^3.0.2", + "safe-wipe": "0.2.5", + "sass-convert": "^0.5.0", + "sassdoc-theme-default": "^2.8.3", + "scss-comment-parser": "^0.8.4", + "strip-indent": "^3.0.0", + "through2": "1.1.1", + "update-notifier": "^4.1.0", + "vinyl-fs": "^3.0.3", + "vinyl-source-stream": "1.1.2", + "vinyl-string": "^1.0.2" + }, + "bin": { + "sassdoc": "bin/sassdoc" + } + }, + "node_modules/sassdoc-extras": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/sassdoc-extras/-/sassdoc-extras-2.5.1.tgz", + "integrity": "sha512-/+ilEnk1H1hG9nympL1GIFWhAczzoclyDzgzfphIg46nsT/dWJuzWYHyzIpduc/nTVwKeQfmTz0ZVvy12QMkrQ==", + "license": "MIT", + "dependencies": { + "marked": "^0.6.2" + } + }, + "node_modules/sassdoc-theme-default": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/sassdoc-theme-default/-/sassdoc-theme-default-2.8.6.tgz", + "integrity": "sha512-s12y6pThpPDm33UScHfnfa/RBs9+gkCxl/YNWDTyLl3a6IxzusEdut1uwv4fpmpaOsTpcjGxZw839Moi4d/3Eg==", + "license": "MIT", + "dependencies": { + "babel-runtime": "^6.22.0", + "chroma-js": "^1.2.2", + "es6-denodeify": "^0.1.0", + "es6-promise": "^4.2.6", + "extend": "^3.0.2", + "fs-extra": "^2.0.0", + "html-minifier": "^3.5.21", + "nunjucks": "^3.1.7", + "sassdoc-extras": "^2.5.0" + } + }, + "node_modules/sassdoc-theme-default/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/sassdoc-theme-default/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sassdoc-theme-default/node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "license": "MIT" + }, + "node_modules/sassdoc-theme-default/node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/sassdoc-theme-default/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/sassdoc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sassdoc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/scss-comment-parser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/scss-comment-parser/-/scss-comment-parser-0.8.4.tgz", + "integrity": "sha512-ERw4BODvM22n8Ke8hJxuH3fKXLm0Q4chfUNHwDSOAExCths2ZXq8PT32vms4R9Om6dffRSXzzGZS1p38UU4EAg==", + "license": "MIT", + "dependencies": { + "cdocparser": "^0.13.0" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha512-1vZcoRC+LPtHFkLUPyrabsATDSHerxW+hJBN8h04HZOZBuewbXaNROtUVdEPrTdZsWNq6sfsXDhd48GB2xTG4g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz", + "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.1.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.1.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.6.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", + "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^14.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-14.0.0.tgz", + "integrity": "sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended-scss": "^14.1.0", + "stylelint-config-standard": "^36.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.11.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", + "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/through2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-1.1.1.tgz", + "integrity": "sha512-zEbpaeSMHxczpTzO1KkMHjBC1enTA68ojeaZGG4toqdASpb9t4xUZaYFBq2/9OHo5nTGFVSYd4c910OR+6wxbQ==", + "license": "MIT", + "dependencies": { + "readable-stream": ">=1.1.13-1 <1.2.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "license": "MIT", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/through2-filter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2-filter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/through2-filter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "license": "MIT" + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", + "license": "MIT", + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/to-through/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/to-through/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "license": "MIT" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "license": "MIT", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "license": "BSD-2-Clause", + "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.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "license": "MIT" + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "license": "MIT", + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "license": "MIT", + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-fs/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/vinyl-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha512-X+1Jq+M6ufv/ky480hndPBsNb0ieqTQkvpakxMTxb7oUlyuNaJKL2HddYUrbTec0Lb0J53JlDiCetcgJ3b3Wmg==", + "license": "MIT", + "dependencies": { + "through2": "^2.0.3", + "vinyl": "^0.4.3" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/vinyl-source-stream/node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "license": "MIT" + }, + "node_modules/vinyl-source-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/vinyl-source-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/vinyl-source-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/vinyl-source-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/vinyl-source-stream/node_modules/vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dependencies": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", + "license": "MIT", + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vinyl-string": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vinyl-string/-/vinyl-string-1.0.2.tgz", + "integrity": "sha512-mDkPUvCM7K9r0WYZKIWc/dfPH8wkJBbe/3wZUU9EJyw3g6VSACg6FLlcZ/QbP1lTSdtBsVjQoYG1a9K0cfoKeQ==", + "license": "MIT", + "dependencies": { + "vinyl": "^1.1.1" + } + }, + "node_modules/vinyl-string/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/vinyl-string/node_modules/clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "license": "MIT" + }, + "node_modules/vinyl-string/node_modules/replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/vinyl-string/node_modules/vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "engines": { + "node": ">= 0.9" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/attack-style/package.json b/attack-style/package.json new file mode 100644 index 00000000000..0dcfc246e2b --- /dev/null +++ b/attack-style/package.json @@ -0,0 +1,27 @@ +{ + "name": "attack-style", + "version": "1.0.0", + "description": "ATT&CK website CSS styles", + "license": "Apache-2.0", + "author": "MITRE ATT&CK", + "type": "commonjs", + "main": "index.js", + "scripts": { + "clean": "rm -rf dist/", + "build": "sass style-attack.scss dist/style-attack.css && sass style-user.scss dist/style-user.css", + "copy": "cp dist/style-attack.css dist/style-user.css ../attack-theme/static/", + "build-copy": "npm run clean && npm run build && npm run copy", + "watch": "sass --watch style-attack.scss dist/style-attack.css && sass --watch style-user.scss dist/style-user.css", + "doc": "sassdoc --verbose --dest docs/ style.scss", + "lint": "stylelint **/*.scss" + }, + "devDependencies": { + "stylelint": "^16.12.0", + "stylelint-config-standard": "^36.0.1", + "stylelint-config-standard-scss": "^14.0.0" + }, + "dependencies": { + "sass": "^1.83.0", + "sassdoc": "^2.7.4" + } +} diff --git a/attack-style/style-attack.scss b/attack-style/style-attack.scss new file mode 100644 index 00000000000..dc269b3418b --- /dev/null +++ b/attack-style/style-attack.scss @@ -0,0 +1,5 @@ +// Set the theme to use ATT&CK colors +@use 'config' with ($use-attack-theme: true); + +// Import the main styles +@use 'style'; \ No newline at end of file diff --git a/attack-style/style-user.scss b/attack-style/style-user.scss new file mode 100644 index 00000000000..9c71194f6f2 --- /dev/null +++ b/attack-style/style-user.scss @@ -0,0 +1,5 @@ +// Set the theme to use user gray colors +@use 'config' with ($use-attack-theme: false); + +// Import the main styles +@use 'style'; diff --git a/attack-style/style.scss b/attack-style/style.scss new file mode 100644 index 00000000000..c8c19234ddd --- /dev/null +++ b/attack-style/style.scss @@ -0,0 +1,24 @@ +// Import Sass utilities and helpers +// Note: The order of imports in this section is important due to dependencies. +// - abstracts/variables must be imported first as it defines variables used by other files. +// - abstracts/color-functions relies on variables and provides functions used by many other files. + +@use "abstracts/variables"; // Define global variables +@use "abstracts/color-functions"; // Functions that use variables and are used by other files +@use "abstracts/utilities"; // General utility functions and mixins +@use "abstracts/font-faces"; // Font-face declarations + +// Import base styles +@use "base/base"; // Base styles for HTML elements +@use "base/typography"; // Typography settings + +// Import layout styles +@use "layout/layout"; // General layout styles +@use "layout/footer"; // Footer-specific styles +@use "layout/nav"; // Navigation-specific styles + +// Import component styles +@use "components/search"; // Search component styles +@use "components/tour"; // Tour component styles +@use "components/matrix"; // Matrix component styles +@use "components/versioning"; // Versioning component styles \ No newline at end of file diff --git a/attack-style/themes/_colors.scss b/attack-style/themes/_colors.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/attack-theme/static/images/homepage/macro-technique-refinement.png b/attack-theme/static/images/homepage/macro-technique-refinement.png new file mode 100644 index 00000000000..9f8baffd7b4 Binary files /dev/null and b/attack-theme/static/images/homepage/macro-technique-refinement.png differ diff --git a/attack-theme/static/style-attack.css b/attack-theme/static/style-attack.css new file mode 100644 index 00000000000..3a75a07d9a1 --- /dev/null +++ b/attack-theme/static/style-attack.css @@ -0,0 +1,2276 @@ +/* COLORS */ +/* FONTS */ +@font-face { + font-family: "Roboto-Thin"; + font-style: normal; + font-weight: 100; + src: url("fonts/Roboto/Roboto-Thin.ttf"); +} +@font-face { + font-family: "Roboto-Light"; + font-style: normal; + font-weight: 300; + src: url("fonts/Roboto/Roboto-Light.ttf"); +} +@font-face { + font-family: "Roboto-Regular"; + font-style: normal; + font-weight: 400; + src: url("fonts/Roboto/Roboto-Regular.ttf"); +} +@font-face { + font-family: "Roboto-Medium"; + font-style: normal; + font-weight: 500; + src: url("fonts/Roboto/Roboto-Medium.ttf"); +} +@font-face { + font-family: "Roboto-Bold"; + font-style: normal; + font-weight: 700; + src: url("fonts/Roboto/Roboto-Bold.ttf"); +} +@font-face { + font-family: "Roboto-Black"; + font-style: normal; + font-weight: 900; + src: url("fonts/Roboto/Roboto-Black.ttf"); +} +.deemphasis { + color: rgb(106.5, 114, 120.75); +} + +.matrix-header { + background-color: gray; + color: white; +} + +.table-alternate, +.blog-post table, +.changelog table, .bg-alternate { + background-color: rgb(242.25, 242.25, 242.25) !important; +} + +.text-label { + text-transform: uppercase; + font-size: 14px; +} + +.text-label-small { + font-size: 12px; + color: #303435; + margin-top: -10px; +} + +/* General styling */ +html { + height: 100%; +} + +body { + height: 100%; + background: white; + color: #39434c; + font-family: "Roboto-Regular", sans-serif; + display: flex; + flex-direction: column; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + body { + height: auto; + } +} +.attack-website-wrapper { + max-height: 100vh; + overflow-y: auto; +} + +h1, +h2, +h3, +h4, +h5 { + font-family: "Roboto-Light", sans-serif; +} + +strong { + font-family: "Roboto-Bold", sans-serif; +} + +.jumbotron { + padding: 0; + background: white; + color: #39434c; +} +.jumbotron code { + color: rgb(28.5, 33.5, 38); + background-color: rgb(229.5, 229.5, 229.5); + border-radius: 3px; + font-family: courier, monospace; + padding: 0 3px; +} + +a { + color: #4f7cac; +} +a .anchor::before { + content: ""; + display: block; + margin-top: -5rem; + position: absolute; +} + +.marker-none { + list-style-type: none; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.fs-s { + font-size: small; +} + +.capec-card { + background: rgb(128, 0, 0); +} +.capec-card img { + margin: 0.5rem; + max-width: 10rem; + max-height: 3.4375rem; + margin-left: auto; + margin-right: auto; + display: block; +} + +.maec-card { + background: #212121; +} +.maec-card img { + margin: 0.5rem; + max-width: 9.125rem; + margin-left: auto; + margin-right: auto; + display: block; +} + +.default-img-size { + width: 100%; + max-width: 62.5rem; +} + +.mitre-logo-wtrans { + width: 9rem; + height: 4.125rem; +} + +.quick-links { + width: 100%; + text-align: center; + table-layout: fixed; +} +.quick-links td { + padding: 0.3125rem 0; +} +.quick-links tr + tr { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} + +.row-main-page { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +@media screen and (width <= 47.9875rem) { + .row-main-page { + display: inline; + } +} +.p-line p { + border-top: 0.0625rem solid #1c2226; +} + +.btn-default { + background: white; + border-color: rgb(106.5, 114, 120.75); + color: #39434c; +} +.btn-default:hover { + color: rgb(28.5, 33.5, 38); +} + +.website-button, .slide-button-secondary, .slide-button { + font-size: 16px; + border-radius: 5px; + cursor: pointer; + position: relative; + overflow: hidden; + font-family: Arial; + display: inline-flex; + align-items: center; + border-style: solid; +} + +.slide-icon-button { + border-style: none; + background: none; +} + +.slide-button { + border-color: #0156b3; + color: #fff; + background: #0156b3; + padding: 6px 16px; +} +a .slide-button { + text-decoration: none !important; +} + +.slide-button-secondary { + color: #0156b3; + background: #fff; + border-color: #0156b3; + padding: 6px 16px; +} +a .slide-button-secondary { + text-decoration: none !important; +} + +.slide-button-text { + position: relative; +} + +.slide-button-icon { + position: relative; + padding-left: 8px; +} + +.slide-button:hover { + background: #062f4f; + border-color: #062f4f; +} + +.slide-button-secondary:hover { + background: #eaeaea; + border-color: #062f4f; + color: #062f4f; +} + +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: white; + min-width: 160px; + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); +} + +.dropdown:hover .dropdown-content { + display: block; +} + +.btn-navy:hover, .btn-navy { + color: white; + border-color: 0.0625rem solid #062f4f; +} + +.btn-navy { + background-color: #062f4f; + color: white; +} +.btn-navy:hover { + background-color: rgb(7.5, 58.75, 98.75); + background-image: none; +} + +.markdown-body h1:not(:first-child) { + padding-top: 2rem; +} +.markdown-body h1 { + padding-bottom: 0.8rem; + font-size: 1.8rem; +} +.markdown-body h2 { + font-size: 1.3rem; +} +.markdown-body h3 { + font-size: 1.1rem; +} + +/* **** */ +/* Table styling */ +.table, +.blog-post table, +.changelog table { + empty-cells: hide; +} +.table td, +.blog-post table td, +.changelog table td { + padding: 0.75rem; + vertical-align: top; +} +.table td p:last-child, +.blog-post table td p:last-child, +.changelog table td p:last-child { + margin-bottom: 0; +} +.table th, +.blog-post table th, +.changelog table th { + padding: 0.6rem; + vertical-align: top; + font-size: 0.9rem; +} +.table .active, +.blog-post table .active, +.changelog table .active { + color: #c63f1f; +} + +.blog-post table { + margin-bottom: 1.5rem; +} + +.table-alternate tbody, +.blog-post table tbody, +.changelog table tbody { + background: white; + color: #39434c; +} + +.table-techniques thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} +.table-techniques table { + border-collapse: collapse; +} +.table-techniques td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.table-techniques tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.table-techniques .sub.technique { + border-left: none; +} +.table-techniques .technique td:first-child { + border-bottom: none; +} +.table-techniques .sub.technique td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} +.table-techniques .sub.technique td:not(:nth-child(4)) { + color: #4f7cac; +} +.table-techniques .technique:not(.sub) td:not(:nth-child(3)) { + color: #4f7cac; +} + +.techniques-used table { + border-collapse: collapse; +} +.techniques-used td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.techniques-used tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.techniques-used .sub.technique { + border-left: none; +} +.techniques-used .technique td:first-child { + border-bottom: none; +} +.techniques-used .technique td:nth-child(2) { + border-bottom: none; +} +.techniques-used .sub.technique:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; +} +.techniques-used .sub.technique:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} + +.techniques-used.background thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} + +.datasources-table table { + border-collapse: collapse; +} +.datasources-table thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} +.datasources-table td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.datasources-table tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.datasources-table .datacomponent.datasource { + border-left: none; +} +.datasources-table .datasource td:first-child { + border-bottom: none; +} +.datasources-table .datasource td:nth-child(2) { + border-bottom: none; +} +.datasources-table .datacomponent.datasource:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; +} +.datasources-table .datacomponent.datasource:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} +.datasources-table .nowrap { + white-space: nowrap; +} + +.tables-mobile { + overflow-y: auto; +} + +.table-bordered, .table-bordered td, .table-bordered th, +.blog-post table, +.blog-post table td, +.blog-post table th, +.changelog table, +.changelog table td, +.changelog table th { + border: 1px solid rgb(223.125, 223.125, 223.125); +} +.table-bordered th, +.blog-post table th, +.changelog table th { + border-bottom: 2px solid rgb(223.125, 223.125, 223.125) !important; +} + +.table-matrix { + border: none !important; +} +.table-matrix thead th { + text-align: center !important; + vertical-align: middle !important; + border: 0.0625rem solid rgb(223.125, 223.125, 223.125) !important; +} +.table-matrix td, +.table-matrix th { + text-align: center !important; + vertical-align: middle !important; + border-top: none !important; + padding: 0.125rem !important; + font-size: 0.75rem !important; +} +.table-matrix td.border, +.table-matrix th.border { + border: 0.0625rem solid rgb(223.125, 223.125, 223.125) !important; +} +.table-matrix td.no-border, +.table-matrix th.no-border { + border: none !important; +} +.table-matrix td { + background: white; + color: #39434c; +} + +.table-mitigations th, +.table-mitigations td, .table-mitigations { + white-space: nowrap; + width: 1%; +} + +.div-count { + margin-top: auto; + margin-bottom: 0; +} + +.table-object-count { + display: flex; + justify-content: flex-end; +} + +.matrix-tactics-url { + color: white; +} +.matrix-tactics-url:visited, .matrix-tactics-url:hover, .matrix-tactics-url:active { + color: white; +} + +/* **** */ +/* BANNER */ +.banner-message, .version-banner { + padding: 0.3125rem 0; + text-align: center; + background-color: rgb(229.5, 229.5, 229.5); +} + +/* **** */ +/* IMG/SVG ICON in BANNER */ +.icon-inline { + display: inline-flex; + align-self: center; +} +.icon-inline svg, +.icon-inline img { + height: 1rem; + width: 1rem; + fill: currentcolor; + top: 0.125rem; + position: relative; +} + +/* **** */ +/* Pre-block in SIGHTINGS */ +pre { + color: #39434c; + background-color: rgb(216.75, 216.75, 216.75); + border-radius: 5px; + padding: 1rem; +} + +code { + color: #c63e1f; +} + +/* **** */ +/* CARDS */ +.card { + background: white; + color: #39434c; + border-color: rgb(223.125, 223.125, 223.125); +} + +.button-group { + display: flex; + justify-content: end; +} +.button-group a.button + a.button { + margin-left: 22px; +} +.button-group button { + justify-content: center; + width: 100%; +} +.button-group a.w-40 { + width: 40%; +} + +.card-filter { + width: 20%; + top: 9.3rem; + float: right; + background: #eaeaea; +} + +@media screen and (width <= 90.62rem) { + .card-filter { + display: contents; + } +} +.card-presentation { + margin-bottom: 30px; +} + +.card-attackcon { + width: 100%; +} + +.card-data { + margin-bottom: 0.5rem; +} + +.card-header { + color: #39434c; + background: rgba(57, 67, 76, 0.03); + border-bottom-color: rgb(223.125, 223.125, 223.125); +} + +a.partial-underline { + text-decoration: none; +} +a.partial-underline .hover-line { + text-decoration: underline; +} + +.contact-card { + border-radius: 0.75em; + overflow: hidden; +} +.contact-card .card-footer { + padding: 0 1.25rem 1.25rem; +} +.contact-card .card-footer.button-group { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 12px; +} +.contact-card .card-footer-no-button { + padding: 0.5rem 1.25rem; + min-height: 4rem; + max-height: fit-content; +} +.contact-card .card-header { + padding: 1.25rem 1.25rem 0; +} +.contact-card .card-header.background { + background: #0b2338; + color: white; + padding-bottom: 1.25rem; +} +.contact-card .card-header.no-background, +.contact-card .card-footer.no-background { + background: white; + color: #39434c; + border: unset; +} +.contact-card .card-body p { + margin: 0; +} +.contact-card .card-body.background { + background: #eaeaea; +} + +.card-body > .table { + border-right: 0; + border-left: 0; + margin-bottom: 0; +} +.card-body > .table:last-child { + border-bottom: 0; +} +.card-body > .table:not(.table-sm) th, .card-body > .table:not(.table-sm) td { + padding: 0.75rem 1.25rem; +} +.card-body > .table td:first-child, +.card-body > .table th:first-child { + border-left: 0; +} +.card-body > .table td:last-child, +.card-body > .table th:last-child { + border-right: 0; +} +.card-body > .table tr:first-child td, +.card-body > .table tr:first-child th { + border-top: 0; +} +.card-body > .table tr:last-child td { + border-bottom: 0; +} +.card-body .card-header + .table { + border-top: 0; +} + +.card-data:last-of-type { + margin-bottom: 0; +} + +.card-title { + font-size: 1.1rem; + color: rgb(28.5, 33.5, 38); +} + +.contact-card-title { + font-size: 1.1rem; + font-weight: bold; +} + +.card-title-icon { + float: right; + color: #0156b3; +} + +/* **** */ +/* TWITTER */ +.attack-box { + width: 22rem; + max-width: 100%; + height: 30rem; + margin: 0 auto; + border: 3px solid #dfdfdf; + padding: 3px; + display: flex; + flex-direction: column; +} +.attack-box iframe { + border: 1px solid rgb(223.125, 223.125, 223.125) !important; + border-radius: 0.25rem; +} + +/* **** */ +/* BREADCRUMBS */ +.breadcrumb { + font-size: 90%; + background-color: white; + max-width: 1140px; + padding: 0 15px; +} +.breadcrumb .breadcrumb-item + .breadcrumb-item::before { + content: ">"; + color: rgb(106.5, 114, 120.75); +} + +/* **** */ +.nestedlist { + counter-reset: item; +} + +.nestedlist-item { + display: block; +} + +.nestedlist-item::before { + content: counters(item, ".") ". "; + counter-increment: item; +} + +.danger-card { + border-color: #c63f1f; +} +.danger-card .card-header { + background: #c63f1f; + color: white; +} + +/* **** */ +/* ATT&CKCON */ +.bg-accord-light { + color: #39434c; + background-color: rgb(242.25, 242.25, 242.25); +} + +.bg-accord-dark { + color: #39434c; + background-color: rgb(216.75, 216.75, 216.75); +} + +/* **** */ +/* CONTRIBUTE */ +.contribution-headers { + font-family: "Roboto-Regular", sans-serif; +} + +.usa-card-group { + display: flex; + flex-direction: row; +} + +.usa-card__header { + font-family: "Roboto-Regular", sans-serif; + color: white; + background: #062f4f; + border-bottom-color: rgb(223.125, 223.125, 223.125); + border-radius: 0.3rem 0.3rem 0 0; +} + +/* CONTRIBUTE Examples */ +.new-examples { + padding: 0.625rem 0.625rem 0 0.625rem; + width: 100%; +} +.new-examples.second-example { + margin-top: 0.625rem; + margin-bottom: 1.25rem; +} +.new-examples .example-container { + padding: 0.9375rem; +} +.new-examples .example-container .examples-div { + display: flex; +} +.new-examples .example-container .examples-div .margin-contribute-a { + margin-left: 1.5625rem; +} +.new-examples .example-container .examples-div .margin-contribute-b { + margin-left: 11.4375rem; +} +.new-examples .example-container .examples-p { + margin-left: 0.3125rem; + margin-bottom: 0.625rem; + word-break: break-word; +} +.new-examples .example-container .nested-examples-div { + padding-left: 3.125rem; +} +.new-examples .example-container .example-fields { + font-family: "Roboto-Bold", sans-serif; +} +.new-examples .example-container .example-fields + ul { + padding-left: 6.25rem; +} + +/* **** */ +/* CONTRIBUTORS */ +.scrollable-box { + width: 100%; + height: 500px; + overflow: auto; + padding: 0.9375rem; + background-color: rgb(242.25, 242.25, 242.25); + border-radius: 0.1875rem; +} + +/* **** */ +img.yt-core-image { + width: 100%; +} + +.iframe-width { + width: 500px; + height: 275px; +} + +@media screen and (width <= 47.9875rem) { + .iframe-width { + width: 100%; + height: 140px; + } +} +/* No transition */ +.notransition::after { + transition: none !important; +} + +/* FAQ */ +.faq .faq-section { + padding-bottom: 2rem; +} +.faq .faq-question { + padding: 6px 0; +} +.faq .relevant-links { + margin-bottom: 1rem; + border-radius: 3px; +} +.faq .relevant-links .faq-link ~ .faq-link::before { + content: ", "; +} + +/* **** */ +.attackcon-columns { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; +} + +@media screen and (width <= 47.9875rem) { + .attackcon-columns { + flex-direction: column; + } +} +/* Ensure the sponsors block is below and not affected by the top image */ +/* Card Blocks */ +.card-block .card-header { + display: flex; + flex-direction: row; +} +.card-block .card-header h5 { + font-family: "Roboto-Regular", sans-serif; +} +.card-block .card-header :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.card-block .card-header:after, .card-block .card-header::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.card-block .card-header:not(.collapsed):after, .card-block .card-header:not(.collapsed)::after { + transform: rotate(-180deg); +} +.card-block .card-title { + display: inline-block; + flex-grow: 1; + font-family: "Roboto-Regular", sans-serif; +} + +/* **** */ +/* GENERAL INFORMATION */ +.general-info .card-img-top { + width: 100%; + height: 15vw; + object-fit: cover; +} +.general-info .graphics .card-header { + flex-grow: 1; +} +.general-info .showmore-btn { + display: block !important; + text-align: center; +} +.general-info .showmore-btn.show { + display: none !important; +} + +/* **** */ +/* GETTING STARTED */ +.getting-started ul:not(.col) { + padding: 0 0.9375rem; + margin-left: 0.9375rem; +} +.getting-started .getting-started-content { + width: 75%; +} +@media screen and (width <= 90.62rem) { + .getting-started .getting-started-content { + width: 100%; + } +} +.getting-started .getting-started-icon { + color: #c63f1f; +} +.getting-started .video-li { + /* don't display the video in the list itself except in mobile layout */ + display: none; +} +@media screen and (width <= 47.9875rem) { + .getting-started .row ul.col { + margin-left: 1.875rem; + } + .getting-started .video-col { + display: none; + } + .getting-started .video-li { + display: list-item; + } +} + +.jump-to-section { + position: -webkit-sticky; + position: sticky; + top: 14rem; + word-wrap: normal; + border-radius: 0.75em; +} + +/* **** */ +/* Timeline in GENERAL INFORMATION */ +.timeline { + overflow-y: hidden; + position: relative; + list-style-type: none; + padding-left: 0; +} +.timeline::before { + background: rgb(106.5, 114, 120.75); + position: absolute; + width: 0.0625rem; + height: 100%; + z-index: 2; + content: ""; + left: 20px; +} +.timeline.collapse { + display: block !important; +} +.timeline:not(.show) { + height: 300px; +} +.timeline:not(.show)::after { + background: linear-gradient(to bottom, transparent, white); + position: absolute; + width: 100%; + height: 75px; + z-index: 4; + content: ""; + bottom: 0; + pointer-events: none; +} +.timeline .timeline-card { + margin: 20px 0; + padding-left: 40px; +} +.timeline .timeline-card::before { + background: white; + position: absolute; + width: 20px; + height: 20px; + z-index: 3; + content: ""; + display: inline-block; + border-radius: 50%; + border: 0.125rem solid rgb(106.5, 114, 120.75); + left: 10px; +} +.timeline .timeline-card .timeline-card-header { + width: 100%; + display: flex; + flex-direction: row; + clear: both; +} +.timeline .timeline-card .timeline-card-header .title { + display: inline-block; + flex-grow: 1; + font-size: 1.25rem; +} +.timeline .timeline-card .timeline-card-header .date { + display: inline-block; + font-size: 1.25rem; + text-align: right; + white-space: nowrap; + padding-left: 0.625rem; +} +.timeline .timeline-card .timeline-card-body { + padding-top: 0.3125rem; +} + +/* **** */ +/* Description formatting in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE */ +.description-body { + line-height: 1.8rem; +} + +.description-body.in-table { + padding: 0.75rem 1.25rem; +} +.description-body.in-table p { + margin-bottom: 0; +} + +.description-body.card-description { + padding: 0.3rem 0 0 0; +} +.description-body.card-description p { + margin-bottom: 0; +} + +/* **** */ +/* External link icon */ +.external-icon { + width: 0.9375rem; + margin-top: -0.3125rem; +} + +/* **** */ +/* ATTA&K Logo */ +.attack-logo-bold { + width: 60%; +} + +.attack-logo { + margin: 8px 0; + display: block; + height: 24px; +} + +/* **** */ +/* anchor tag to bypass navbar */ +.anchor { + display: block; + position: relative; + top: -4.125rem; + visibility: hidden; +} + +.section-view .anchor-section { + position: -webkit-sticky; + position: sticky; + top: 4.125rem; + background: white; + z-index: 100; + margin-bottom: 0; +} +.section-view p { + margin-bottom: 0; + padding-bottom: 0.5rem; +} +.section-view .section-mobile-view { + display: none; +} +.section-view .section-desktop-view { + display: block; +} +@media screen and (width <= 74.938rem) { + .section-view .section-mobile-view { + display: block; + } + .section-view .section-desktop-view { + display: none; + } +} +.section-view .section-shadow { + border-bottom: 1px solid #dfdfdf !important; +} +.section-view table { + margin-top: -1px; +} + +/* **** */ +div#sidebars { + display: contents; +} + +/* Plus/Minus expand icons */ +.expand-icon { + font-size: 5%; + color: #39434c; + margin-top: 0.4375rem; +} + +/* **** */ +/* attackcon page */ +.attackcons { + border-top-width: 0; +} +.attackcons .sponsors { + flex: 1; + padding-left: 25px; +} +.attackcons .p-description { + width: 90%; +} +.attackcons .sponsors-block { + background: #eaeaea; + text-align: center; + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + flex-direction: column; + width: 200%; +} +.attackcons .sponsors-block .img-container { + margin: 10px; + flex: 1 1 20%; + box-sizing: border-box; +} +.attackcons .sponsors-block .img-container img { + width: 100%; + margin: auto; + height: auto; +} +@media screen and (width <= 47.9875rem) { + .attackcons .sponsors-block { + width: 100%; + flex-direction: row; + } +} + +.support-box { + background-color: rgb(229.5, 229.5, 229.5); + padding: 1.5em; + border-radius: 0.75em; + width: fit-content; +} + +.sponsor-list { + gap: 1.5em; +} + +.sponsor-square { + padding: 0 !important; + height: 150px; + display: flex; +} +.sponsor-square a { + display: contents; +} +.sponsor-square img.sponsor-logo { + background-color: white; + border-radius: 6px; + object-fit: contain; + object-position: center; +} + +/* **** */ +/* training pages */ +.training .exercise { + background: rgb(242.25, 242.25, 242.25); +} + +.card-training { + margin-bottom: 30px; + width: 100%; +} + +.training-card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: left; +} + +.training-text-container { + flex: 1; + margin-right: 20px; +} + +.training-header { + display: flex; + justify-content: space-between; +} + +.resources-container { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: 10px; +} + +.resource { + flex: 1; + background-color: #eaeaea; + padding: 10px; + box-sizing: border-box; +} + +.resource-links { + list-style-type: none; + margin-top: 5px; + padding: 0 !important; + margin-left: 0 !important; +} + +.resource-links li { + margin-bottom: 5px; +} + +.resource-links a { + text-decoration: underline; +} + +/* **** */ +.decorative-panels .decorative-panel .decorative-panel-header, +.decorative-panels .decorative-panel .decorative-panel-body { + padding: 10px; +} +.decorative-panels .decorative-panel .decorative-panel-header h3, +.decorative-panels .decorative-panel .decorative-panel-header h4, +.decorative-panels .decorative-panel .decorative-panel-header .btn { + margin-bottom: 16px; +} +.decorative-panels .decorative-panel .decorative-panel-body.show { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} +.decorative-panels .decorative-panel + .decorative-panel { + margin-top: 25px; +} +.decorative-panels .decorative-panel:nth-of-type(even) { + border-radius: 8px; + background: rgb(242.25, 242.25, 242.25); +} +@media screen and (width <= 47.9875rem) { + .decorative-panels .row { + display: block; + } + .decorative-panels .row.collapse:not(.show) { + display: none; + } +} + +.working-with-attack .g-24 { + gap: 24px; +} +.working-with-attack .g-12 { + gap: 12px; +} +.working-with-attack .row.panels { + margin: 0; +} +.working-with-attack img { + border-radius: 0.75em; +} +.working-with-attack img.scale { + object-fit: cover; + object-position: left top; + border-radius: unset !important; + border: 1px solid rgb(223.125, 223.125, 223.125); +} +.working-with-attack .panel { + padding: 0; + border: 1px solid rgb(223.125, 223.125, 223.125); + border-radius: 0.75em; + max-width: 100%; +} +.working-with-attack img + .panel-body { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} +.working-with-attack .panel-body p { + margin: 24px 0; + overflow: scroll; +} +.working-with-attack .panel-body.fixed-height { + height: 30vh; +} +.working-with-attack ul { + margin-bottom: 0; +} +@media screen and (width <= 61.938rem) { + .working-with-attack .panel-body.fixed-height { + min-height: 40vh; + max-height: fit-content; + } +} +.working-with-attack .table-of-contents { + position: static; + float: none; + width: 25%; +} + +.tip-box { + background: #eaeaea; + padding: 1rem; +} + +/* Card Blocks */ +.expand-panel .card-block .card-header { + display: flex; + flex-direction: row; +} +.expand-panel .card-block .card-header h5 { + font-family: "Roboto-Regular", sans-serif; +} +.expand-panel .card-block .card-header :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.expand-panel .card-block .card-header:after, .expand-panel .card-block .card-header::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.expand-panel .card-block .card-header:not(.collapsed):after, .expand-panel .card-block .card-header:not(.collapsed)::after { + transform: rotate(-180deg); +} +.expand-panel .card-block .card-header:not(:last-child) { + border-bottom: none; +} +.expand-panel .card-block .card-title { + display: inline-block; + flex-grow: 1; + font-family: "Roboto-Regular", sans-serif; +} +.expand-panel .card-block .first-card { + border-bottom: none; + border-radius: 0.25rem 0.25rem 0 0; +} +.expand-panel .card-block .last-card { + border-radius: 0 0 0.25rem 0.25rem; +} +.expand-panel .card-block .middle-card { + border-bottom: none; + border-radius: 0; +} + +/* **** */ +@media print { + * { + overflow: visible !important; + break-before: always !important; + page-break-inside: avoid !important; + } +} +/* Footer styling */ +.footer { + background-color: #0b2338; + color: white; + padding: 1rem 3rem; + font-family: "Roboto-Thin", sans-serif; +} +.footer.sticky-footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; +} +.footer > .container-fluid { + padding-right: 0 !important; + padding-left: 0 !important; +} +.footer .footer-responsive-break { + display: none; +} +.footer .footer-float-right-responsive-brand { + float: right; + height: 100%; + display: flex; + align-items: center; +} +.footer .footer-float-right-responsive-centered { + display: flex; + justify-content: flex-end; + align-items: center; +} +.footer .footer-link-group { + display: flex; + flex-direction: column; + justify-content: center; +} +.footer .footer-link { + color: #87deff; +} +.footer .footer-link:hover { + color: rgb(107, 173, 213.5); +} + +.col .col-footer { + border-right: 1px solid; +} + +.p-footer { + padding-left: 25px; +} + +.btn-footer { + color: white; + padding: 0.375rem; +} + +.btn-footer:hover { + color: white; +} + +@media screen and (width <= 47.9875rem) { + .footer .footer-responsive-break { + display: block !important; + } + .footer .footer-float-right-responsive-brand { + float: none !important; + } + .footer .footer-float-right-responsive-centered { + float: none !important; + display: block !important; + justify-content: none !important; + align-items: none !important; + } +} +/* **** */ +@media print { + .footer { + visibility: hidden; + display: none; + } +} +/* Navigation styling */ +.navbar .nav-tabs .nav-link.active, .navbar .nav-tabs .nav-link:hover:not(.active), .navbar .nav-tabs .nav-link:focus { + border: 0.0625rem solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + text-decoration: underline; +} + +/* Top NAVIGATION */ +.navbar { + background-color: #c63f1f; + z-index: 1; +} +.navbar .navbar-brand { + font-size: 2rem; +} +.navbar .nav-tabs { + border-bottom: none; +} +.navbar .nav-tabs .nav-link { + color: white; + font-family: "Roboto-Light", sans-serif; +} +.navbar .nav-tabs .nav-link:focus { + color: white; +} +.navbar .nav-tabs .nav-link:hover:not(.active) { + color: white; + background-color: transparent; +} +.navbar .nav-tabs .nav-link.active { + color: white; + background-color: #c63f1f; +} +.navbar .nav-tabs .nav-item.show .nav-link { + color: white; + background-color: #c63f1f; + border-color: transparent; +} +.navbar .search-button { + padding: 0.3rem 1rem; + font-size: 1rem; + border: 0.0625rem solid white; + border-radius: 0.25rem; + color: white; + line-height: 1.5rem; + opacity: 0.8; +} +.navbar .search-button:not(:has(.error-icon)):hover { + opacity: 1; +} +.navbar .search-button .icon-button { + content: ""; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: middle; + background-position: center; + z-index: 1; + transition: all 0.2s ease; +} +.navbar .search-button .search-icon { + cursor: pointer; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%23FFFFFF' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); +} +.navbar .search-button .error-icon { + cursor: default; + background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg fill='%23FFFFFF' xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 96 960 960' width='24'%3e%3cpath d='M479.982 776q14.018 0 23.518-9.482 9.5-9.483 9.5-23.5 0-14.018-9.482-23.518-9.483-9.5-23.5-9.5-14.018 0-23.518 9.482-9.5 9.483-9.5 23.5 0 14.018 9.482 23.518 9.483 9.5 23.5 9.5ZM453 623h60V370h-60v253Zm27.266 353q-82.734 0-155.5-31.5t-127.266-86q-54.5-54.5-86-127.341Q80 658.319 80 575.5q0-82.819 31.5-155.659Q143 347 197.5 293t127.341-85.5Q397.681 176 480.5 176q82.819 0 155.659 31.5Q709 239 763 293t85.5 127Q880 493 880 575.734q0 82.734-31.5 155.5T763 858.316q-54 54.316-127 86Q563 976 480.266 976Zm.234-60Q622 916 721 816.5t99-241Q820 434 721.188 335 622.375 236 480 236q-141 0-240.5 98.812Q140 433.625 140 576q0 141 99.5 240.5t241 99.5Zm-.5-340Z'/%3e%3c/svg%3e"); +} + +/* **** */ +.nav, +.faq { + /* NAVIGATION Dropdown */ + /* **** */ + /* Side NAVIGATION */ + border-color: rgb(223.125, 223.125, 223.125) !important; + /* **** */ +} +.nav .dropdown:hover > .dropdown-menu, +.faq .dropdown:hover > .dropdown-menu { + display: block; +} +.nav .dropdown-menu, +.faq .dropdown-menu { + background-color: #c63f1f; +} +.nav .dropdown-menu .dropdown-item, +.faq .dropdown-menu .dropdown-item { + color: white; +} +.nav .dropdown-menu .dropdown-item:hover, .nav .dropdown-menu .dropdown-item:focus, +.faq .dropdown-menu .dropdown-item:hover, +.faq .dropdown-menu .dropdown-item:focus { + color: white; + text-decoration: underline; + background-color: transparent; +} +.nav .heading, +.faq .heading { + font-size: 1.6rem; + color: rgb(106.5, 114, 120.75); + letter-spacing: 0.1875rem; + pointer-events: none; +} +@media screen and (width <= 74.938rem) { + .nav .heading, + .faq .heading { + pointer-events: all; + } +} +.nav .heading.collapsed .fa-chevron-up, +.nav .heading .fa-chevron-down, +.faq .heading.collapsed .fa-chevron-up, +.faq .heading .fa-chevron-down { + display: none; +} +.nav .heading.collapsed .fa-chevron-down, +.nav .heading .fa-chevron-up, +.faq .heading.collapsed .fa-chevron-down, +.faq .heading .fa-chevron-up { + display: inline-block; +} +.nav i.fa-solid, +.faq i.fa-solid { + visibility: hidden; + display: none; +} +@media screen and (width <= 74.938rem) { + .nav i.fa-solid, + .faq i.fa-solid { + visibility: visible; + display: contents; + } +} +.nav .br-mobile, +.faq .br-mobile { + display: none; +} +@media screen and (width <= 74.938rem) { + .nav .br-mobile, + .faq .br-mobile { + display: inline-block; + } +} +.nav .heading-dropdown, +.faq .heading-dropdown { + font-size: 1.2rem; + color: #062f4f; + letter-spacing: 0.1875rem; +} +@media screen and (width <= 90.62rem) { + .nav .heading, + .faq .heading { + font-size: 1.2rem; + color: rgb(106.5, 114, 120.75); + letter-spacing: 0.1875rem; + } + .nav .heading-dropdown, + .faq .heading-dropdown { + font-size: 1rem; + color: #39434c; + letter-spacing: 0.0625rem; + } +} +.nav .nav-link, +.faq .nav-link { + font-size: 1rem; + padding: 0.3rem 1rem; + color: rgb(106.5, 114, 120.75); +} +.nav .nav-link.expand-title, +.faq .nav-link.expand-title { + font-size: 1.1rem; + color: #39434c; +} +.nav .nav-link.side, +.faq .nav-link.side { + padding: 0.3rem 0.3rem; + word-break: break-word; +} +.nav .nav-link.side:hover, +.faq .nav-link.side:hover { + background-color: #c63f1f; + color: white; +} +.nav .nav-link.side.active, +.faq .nav-link.side.active { + color: #c63f1f; + background-color: rgb(242.25, 242.25, 242.25); + border-right: 0.1875rem solid #c63f1f; +} + +/* **** */ +.resizer { + width: 2px; + top: 0; + right: 0; + cursor: col-resize; + height: 100%; + position: absolute; + background-color: #dfdfdf; +} + +.data-sources-menu { + padding-top: 15px; +} + +.sidebar.nav { + overflow-y: auto; + z-index: 0; + min-width: min-content; + max-width: 20vw; +} +@media screen and (width <= 74.938rem) { + .sidebar.nav { + position: static; + min-width: fit-content; + } +} +.sidebar.nav .sidenav-wrapper { + display: flex; + flex-direction: column; + padding-right: 5px; + padding-left: 1rem; + height: 100%; +} +@media screen and (width <= 74.938rem) { + .sidebar.nav .sidenav-wrapper { + display: block; + } +} +.sidebar.nav .sidenav-wrapper .heading { + border-bottom: 1px solid rgb(242.25, 242.25, 242.25); + flex: 0 1 0; +} +.sidebar.nav .sidenav-wrapper .checkbox-div { + border-bottom: 1px solid rgb(242.25, 242.25, 242.25); + flex: 0 1 0; +} +.sidebar.nav .sidenav-wrapper .sidenav-list { + flex: 1 0 0; + overflow-y: auto; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav { + width: 100%; + word-break: break-word; + font-size: 1.1rem; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head { + display: flex; + flex-direction: row; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button { + cursor: pointer; + color: black; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a:hover, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:hover { + background: rgb(242.25, 242.25, 242.25); +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head span { + padding: 0.3rem; + padding-left: 0; + display: inline-block; + flex-grow: 1; + height: 100%; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a:hover, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head span:hover { + text-decoration: none; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button { + padding: 5px; + border-left: 1px solid rgb(242.25, 242.25, 242.25); + display: inline-block; + display: flex; + flex-direction: row; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:after, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:not(.collapsed):after, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:not(.collapsed)::after { + transform: rotate(-180deg); +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head.active, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head.active > a { + color: #0156b3 !important; + font-weight: bolder; + background: #eaeaea; + font-family: Roboto-Bold, sans-serif; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-body { + padding-left: 0.75rem; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav { + padding-left: 0.75rem; +} + +@media print { + .nav { + visibility: hidden; + display: none; + } + .sidenav { + visibility: hidden; + display: none; + } + .sidebar.nav { + visibility: hidden; + display: none; + } + .sidenav-wrapper { + visibility: hidden; + display: none; + } + .side-nav-desktop-view { + visibility: hidden; + display: none; + } + .navbar { + visibility: hidden; + display: none; + } +} +.search-word-found { + background: yellow; + color: black; +} + +.btn-group-text { + padding: 0.25rem, 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; + border: 1px solid transparent; +} + +.overlay.search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1051; + background: rgba(0, 0, 0, 0.35); + padding: 50px; +} +.overlay.search .overlay-inner { + border-radius: 25px; + background: white; + color: #39434c; + width: 100%; + display: flex; + flex-flow: column; + max-height: 100%; +} +.overlay.search .overlay-inner .search-header { + flex-shrink: 0; + position: relative; +} +.overlay.search .overlay-inner .search-header .search-input { + padding: 10px; +} +.overlay.search .overlay-inner .search-header .search-input input { + padding-left: 12.5px; + font-size: 25px; + line-height: 50px; + width: 100%; + border: 0; + background: white; + color: #39434c; +} +.overlay.search .overlay-inner .search-header .search-input input:focus { + outline: none; +} +.overlay.search .overlay-inner .search-header .search-icons { + position: absolute; + top: 0px; + right: 0px; +} +.overlay.search .overlay-inner .search-header .search-icons > div { + display: inline-block; +} +.overlay.search .overlay-inner .search-header .search-icons .search-parsing-icon { + height: 25px; + width: 25px; + margin-bottom: 8px; + opacity: 0.5; +} +.overlay.search .overlay-inner .search-header .search-icons .close-search-icon { + font-size: 50px; + width: 50px; + line-height: 50px; + text-align: center; + margin: 10px; + opacity: 0.8; + cursor: pointer; +} +.overlay.search .overlay-inner .search-header .search-icons .close-search-icon:hover { + opacity: 1; +} +.overlay.search .overlay-inner .search-body { + flex: 1 1 auto; + padding: 0 50px; + border-top: 1px solid rgb(223.125, 223.125, 223.125); + margin-bottom: 25px; + overflow-y: auto; +} +.overlay.search .overlay-inner .search-body .results .search-result:first-child { + margin-top: 1.5rem; +} +.overlay.search .overlay-inner .search-body .load-more-results { + text-align: center; +} + +.page-search { + float: right; + width: 50%; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .overlay.search .search-body { + flex-basis: 50vh !important; + } +} +@media screen and (min-width: 1px) and (max-width: 767.8px) { + .search-input input { + font-size: 20px !important; + line-height: 25px !important; + } + .close-search-icon { + font-size: 25px !important; + line-height: 25px !important; + width: 25px !important; + } + .search-parsing-icon { + width: 14px !important; + height: 14px !important; + margin-bottom: 5px !important; + } +} +.popover { + box-shadow: 0 0 5px 3px white; + border-color: #c63f1f; +} +.popover .popover-header { + background: #c63f1f; + color: white; +} +.popover.bs-popover-left .arrow::before { + border-left-color: #c63f1f; +} +.popover.bs-popover-right .arrow::before { + border-right-color: #c63f1f; +} +.popover.bs-popover-top .arrow::before { + border-top-color: #c63f1f; +} +.popover.bs-popover-bottom .arrow::before, +.popover.bs-popover-bottom .arrow::after, +.popover.bs-popover-bottom .popover-header::before { + border-bottom-color: #c63f1f; +} + +.tour-backdrop, +.tour-highlight { + opacity: 0; +} + +.matrix-container { + border: 1px solid rgb(223.125, 223.125, 223.125); + background: white; +} +.matrix-container + .matrix-container { + margin-top: 1rem; +} +.matrix-container .matrix-border { + border-left: 1px solid rgb(223.125, 223.125, 223.125); + padding-left: 0.5rem; + display: flex; + justify-content: center; + align-items: center; +} +.matrix-container .matrix-title { + border-bottom: 1px solid rgb(223.125, 223.125, 223.125); + margin-bottom: 1rem; + padding-bottom: 0.5rem; +} +.matrix-container .scroll-indicator-group { + white-space: nowrap; + display: flex; +} +.matrix-container .scroll-indicator-group .matrix-scroll-box { + flex-grow: 1; + display: inline-block; +} +.matrix-container .scroll-indicator-group .scroll-indicator { + width: 0; + display: inline-block; + position: relative; +} +.matrix-container .scroll-indicator-group .scroll-indicator .cover { + width: 50px; + height: 100%; + position: absolute; + pointer-events: none; +} +.matrix-container .scroll-indicator-group .scroll-indicator.right .cover { + right: 0; +} +.matrix-container .scroll-indicator-group .scroll-indicator.right.show .cover { + background: linear-gradient(to right, rgba(255, 255, 255, 0.001), white); +} +.matrix-container .scroll-indicator-group .scroll-indicator.left .cover { + left: 0; +} +.matrix-container .scroll-indicator-group .scroll-indicator.left.show .cover { + background: linear-gradient(to left, rgba(255, 255, 255, 0.001), white); +} + +.matrix { + white-space: normal; + line-height: 14px; +} +.matrix.side .tactic { + padding: 2px 5px; + width: 1%; + vertical-align: top; +} +.matrix.side .tactic:first-child { + padding: 2px 5px 2px 2px; +} +.matrix.side .tactic:last-child { + padding: 2px 2px 2px 5px; +} +.matrix.side .tactic:hover:not(.name, .count) { + background: rgb(223.125, 223.125, 223.125); +} +.matrix.side .tactic:hover:not(.name, .count) .sidebar.expanded .angle { + background: rgb(223.125, 223.125, 223.125); +} +.matrix.side .tactic.name, .matrix.side .tactic.count { + text-align: center; + font-size: 16px; +} +.matrix.side .tactic.name { + font-weight: bold; +} +.matrix.side .tactic.count { + font-size: 13px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; +} +.matrix.side .tactic .techniques-table { + border-collapse: collapse; + width: 100%; +} +.matrix.side .tactic .techniques-table tr, +.matrix.side .tactic .techniques-table td { + padding: 0; +} +.matrix.side .tactic .techniques-table tr { + height: 1px; +} +.matrix.side .tactic .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; +} +.matrix.side .tactic .supertechnique td { + padding: 0; + vertical-align: top; +} +.matrix.side .tactic .supertechnique td.technique { + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; +} +.matrix.side .tactic .subtechniques { + display: flex; + flex-direction: column; + height: 100%; + margin-left: -1px; + border-left: 2px solid rgb(106.5, 114, 120.75); + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; + white-space: nowrap; + vertical-align: top; +} +.matrix.side .tactic .subtechniques.hidden { + display: none; +} +.matrix.side .tactic .subtechniques .subtechnique { + height: 100%; + flex-grow: 1; +} +.matrix.side .tactic .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: rgb(242.25, 242.25, 242.25); + width: 12px; + height: 12px; + font-size: 16px; + line-height: 12px; +} +.matrix.side .tactic .sidebar { + min-width: 8px; + width: 12px; + padding: 0; + background: rgb(106.5, 114, 120.75); + cursor: pointer; + position: relative; + vertical-align: middle; +} +.matrix.side .tactic .sidebar .angle { + display: none; +} +.matrix.side .tactic .sidebar.expanded .angle { + margin: 0 auto; + height: 12px; + display: block; + position: absolute; + background: white; +} +.matrix.side .tactic .sidebar.expanded .angle svg { + fill: rgb(106.5, 114, 120.75); + vertical-align: baseline; +} +.matrix.side .tactic .sidebar.expanded .angle.top { + top: 0; +} +.matrix.side .tactic .sidebar.expanded .angle.bottom { + bottom: 0; +} +.matrix.flat .tactic { + margin-right: 5px; + width: 1%; + vertical-align: top; +} +.matrix.flat .tactic.name, .matrix.flat .tactic.count { + text-align: center; + font-size: 16px; +} +.matrix.flat .tactic.name { + font-weight: bold; +} +.matrix.flat .tactic.count { + font-size: 13px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; +} +.matrix.flat .tactic .subtechniques-row.hidden { + display: none; +} +.matrix.flat .tactic .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; +} +.matrix.flat .tactic .supertechnique td { + padding: 0; + vertical-align: top; +} +.matrix.flat .tactic .supertechnique td.sidebar.technique { + min-width: 8px; + width: 12px; + padding: 0; + background: rgb(106.5, 114, 120.75); + cursor: pointer; + vertical-align: middle; +} +.matrix.flat .tactic .supertechnique td.sidebar.technique .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: rgb(242.25, 242.25, 242.25); + width: 12px; + height: 9px; + font-size: 16px; + line-height: 12px; +} +.matrix.flat .tactic .supertechnique td.sidebar.subtechniques svg { + fill: rgb(106.5, 114, 120.75); + vertical-align: baseline; +} +.matrix.flat .tactic .supertechnique td.sidebar { + border-right: 2px solid rgb(106.5, 114, 120.75); +} +.matrix.flat .tactic .supertechnique td.technique { + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; +} +.matrix.flat .tactic .more-icon { + transition: all ease 0.125s; + vertical-align: top; + transform: scale(0.5) rotate(-90deg); + width: 12px; + height: 12px; +} +.matrix.flat .tactic .more-icon.expanded { + transform: scale(0.5); +} +.matrix .technique-cell { + height: 100%; + display: flex; + align-items: center; + background-color: white; + font-size: 13px; + line-height: 14px; + outline: 1px solid transparent; + outline-offset: -1px; +} +.matrix .technique-cell a { + display: block; + width: 100%; + height: 100%; + padding: 7px 3px; +} +.matrix .technique-cell:not(.colored):not(.supertechniquecell) { + outline-color: rgb(223.125, 223.125, 223.125); +} + +.matrix-controls { + margin: auto; + width: 50%; + padding: 1rem; +} +.matrix-controls button { + border-color: rgb(223.125, 223.125, 223.125); + background: white; + color: #39434c; +} +.matrix-controls button:hover { + background: rgb(244.8, 244.8, 244.8); +} +.matrix-controls .layout-button:active { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} + +.center-controls .matrix-controls .btn-toolbar { + justify-content: center; +} + +.btn-toolbar { + justify-content: center; +} + +.version-button.permalink .live { + display: none; +} +.version-button.live .permalink { + display: none; +} + +.version-table .table-break-row { + border-right-color: white; + border-left-color: white; + padding: 1rem 0; +} + +/*# sourceMappingURL=style-attack.css.map */ diff --git a/attack-theme/static/style-user.css b/attack-theme/static/style-user.css new file mode 100644 index 00000000000..630f437995a --- /dev/null +++ b/attack-theme/static/style-user.css @@ -0,0 +1,2276 @@ +/* COLORS */ +/* FONTS */ +@font-face { + font-family: "Roboto-Thin"; + font-style: normal; + font-weight: 100; + src: url("fonts/Roboto/Roboto-Thin.ttf"); +} +@font-face { + font-family: "Roboto-Light"; + font-style: normal; + font-weight: 300; + src: url("fonts/Roboto/Roboto-Light.ttf"); +} +@font-face { + font-family: "Roboto-Regular"; + font-style: normal; + font-weight: 400; + src: url("fonts/Roboto/Roboto-Regular.ttf"); +} +@font-face { + font-family: "Roboto-Medium"; + font-style: normal; + font-weight: 500; + src: url("fonts/Roboto/Roboto-Medium.ttf"); +} +@font-face { + font-family: "Roboto-Bold"; + font-style: normal; + font-weight: 700; + src: url("fonts/Roboto/Roboto-Bold.ttf"); +} +@font-face { + font-family: "Roboto-Black"; + font-style: normal; + font-weight: 900; + src: url("fonts/Roboto/Roboto-Black.ttf"); +} +.deemphasis { + color: rgb(106.5, 114, 120.75); +} + +.matrix-header { + background-color: gray; + color: white; +} + +.table-alternate, +.blog-post table, +.changelog table, .bg-alternate { + background-color: rgb(242.25, 242.25, 242.25) !important; +} + +.text-label { + text-transform: uppercase; + font-size: 14px; +} + +.text-label-small { + font-size: 12px; + color: #303435; + margin-top: -10px; +} + +/* General styling */ +html { + height: 100%; +} + +body { + height: 100%; + background: white; + color: #39434c; + font-family: "Roboto-Regular", sans-serif; + display: flex; + flex-direction: column; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + body { + height: auto; + } +} +.attack-website-wrapper { + max-height: 100vh; + overflow-y: auto; +} + +h1, +h2, +h3, +h4, +h5 { + font-family: "Roboto-Light", sans-serif; +} + +strong { + font-family: "Roboto-Bold", sans-serif; +} + +.jumbotron { + padding: 0; + background: white; + color: #39434c; +} +.jumbotron code { + color: rgb(28.5, 33.5, 38); + background-color: rgb(229.5, 229.5, 229.5); + border-radius: 3px; + font-family: courier, monospace; + padding: 0 3px; +} + +a { + color: #4f7cac; +} +a .anchor::before { + content: ""; + display: block; + margin-top: -5rem; + position: absolute; +} + +.marker-none { + list-style-type: none; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.fs-s { + font-size: small; +} + +.capec-card { + background: rgb(128, 0, 0); +} +.capec-card img { + margin: 0.5rem; + max-width: 10rem; + max-height: 3.4375rem; + margin-left: auto; + margin-right: auto; + display: block; +} + +.maec-card { + background: #212121; +} +.maec-card img { + margin: 0.5rem; + max-width: 9.125rem; + margin-left: auto; + margin-right: auto; + display: block; +} + +.default-img-size { + width: 100%; + max-width: 62.5rem; +} + +.mitre-logo-wtrans { + width: 9rem; + height: 4.125rem; +} + +.quick-links { + width: 100%; + text-align: center; + table-layout: fixed; +} +.quick-links td { + padding: 0.3125rem 0; +} +.quick-links tr + tr { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} + +.row-main-page { + display: flex; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +@media screen and (width <= 47.9875rem) { + .row-main-page { + display: inline; + } +} +.p-line p { + border-top: 0.0625rem solid #1c2226; +} + +.btn-default { + background: white; + border-color: rgb(106.5, 114, 120.75); + color: #39434c; +} +.btn-default:hover { + color: rgb(28.5, 33.5, 38); +} + +.website-button, .slide-button-secondary, .slide-button { + font-size: 16px; + border-radius: 5px; + cursor: pointer; + position: relative; + overflow: hidden; + font-family: Arial; + display: inline-flex; + align-items: center; + border-style: solid; +} + +.slide-icon-button { + border-style: none; + background: none; +} + +.slide-button { + border-color: #303435; + color: #fff; + background: #303435; + padding: 6px 16px; +} +a .slide-button { + text-decoration: none !important; +} + +.slide-button-secondary { + color: #303435; + background: #fff; + border-color: #303435; + padding: 6px 16px; +} +a .slide-button-secondary { + text-decoration: none !important; +} + +.slide-button-text { + position: relative; +} + +.slide-button-icon { + position: relative; + padding-left: 8px; +} + +.slide-button:hover { + background: #303435; + border-color: #303435; +} + +.slide-button-secondary:hover { + background: #eaeaea; + border-color: #303435; + color: #303435; +} + +.dropdown { + position: relative; + display: inline-block; +} + +.dropdown-content { + display: none; + position: absolute; + background-color: white; + min-width: 160px; + box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2); +} + +.dropdown:hover .dropdown-content { + display: block; +} + +.btn-navy:hover, .btn-navy { + color: white; + border-color: 0.0625rem solid #303435; +} + +.btn-navy { + background-color: #303435; + color: white; +} +.btn-navy:hover { + background-color: rgb(57.7188118812, 62.5287128713, 63.7311881188); + background-image: none; +} + +.markdown-body h1:not(:first-child) { + padding-top: 2rem; +} +.markdown-body h1 { + padding-bottom: 0.8rem; + font-size: 1.8rem; +} +.markdown-body h2 { + font-size: 1.3rem; +} +.markdown-body h3 { + font-size: 1.1rem; +} + +/* **** */ +/* Table styling */ +.table, +.blog-post table, +.changelog table { + empty-cells: hide; +} +.table td, +.blog-post table td, +.changelog table td { + padding: 0.75rem; + vertical-align: top; +} +.table td p:last-child, +.blog-post table td p:last-child, +.changelog table td p:last-child { + margin-bottom: 0; +} +.table th, +.blog-post table th, +.changelog table th { + padding: 0.6rem; + vertical-align: top; + font-size: 0.9rem; +} +.table .active, +.blog-post table .active, +.changelog table .active { + color: #303435; +} + +.blog-post table { + margin-bottom: 1.5rem; +} + +.table-alternate tbody, +.blog-post table tbody, +.changelog table tbody { + background: white; + color: #39434c; +} + +.table-techniques thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} +.table-techniques table { + border-collapse: collapse; +} +.table-techniques td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.table-techniques tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.table-techniques .sub.technique { + border-left: none; +} +.table-techniques .technique td:first-child { + border-bottom: none; +} +.table-techniques .sub.technique td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} +.table-techniques .sub.technique td:not(:nth-child(4)) { + color: #4f7cac; +} +.table-techniques .technique:not(.sub) td:not(:nth-child(3)) { + color: #4f7cac; +} + +.techniques-used table { + border-collapse: collapse; +} +.techniques-used td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.techniques-used tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.techniques-used .sub.technique { + border-left: none; +} +.techniques-used .technique td:first-child { + border-bottom: none; +} +.techniques-used .technique td:nth-child(2) { + border-bottom: none; +} +.techniques-used .sub.technique:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; +} +.techniques-used .sub.technique:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} + +.techniques-used.background thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} + +.datasources-table table { + border-collapse: collapse; +} +.datasources-table thead tr { + background: #f2f2f2; + border-bottom: 2px solid #dee2e6; +} +.datasources-table td { + vertical-align: top; + padding: 10px; + border: 1px solid #dfdfdf; +} +.datasources-table tr:last-child { + border-bottom: 1px solid #dfdfdf; +} +.datasources-table .datacomponent.datasource { + border-left: none; +} +.datasources-table .datasource td:first-child { + border-bottom: none; +} +.datasources-table .datasource td:nth-child(2) { + border-bottom: none; +} +.datasources-table .datacomponent.datasource:not(.noparent) td:nth-child(2) { + width: 5ex; + border-top: none; + border-bottom: none; +} +.datasources-table .datacomponent.datasource:not(.noparent) td:first-child { + width: 5ex; + border-top: none; + border-bottom: none; +} +.datasources-table .nowrap { + white-space: nowrap; +} + +.tables-mobile { + overflow-y: auto; +} + +.table-bordered, .table-bordered td, .table-bordered th, +.blog-post table, +.blog-post table td, +.blog-post table th, +.changelog table, +.changelog table td, +.changelog table th { + border: 1px solid rgb(223.125, 223.125, 223.125); +} +.table-bordered th, +.blog-post table th, +.changelog table th { + border-bottom: 2px solid rgb(223.125, 223.125, 223.125) !important; +} + +.table-matrix { + border: none !important; +} +.table-matrix thead th { + text-align: center !important; + vertical-align: middle !important; + border: 0.0625rem solid rgb(223.125, 223.125, 223.125) !important; +} +.table-matrix td, +.table-matrix th { + text-align: center !important; + vertical-align: middle !important; + border-top: none !important; + padding: 0.125rem !important; + font-size: 0.75rem !important; +} +.table-matrix td.border, +.table-matrix th.border { + border: 0.0625rem solid rgb(223.125, 223.125, 223.125) !important; +} +.table-matrix td.no-border, +.table-matrix th.no-border { + border: none !important; +} +.table-matrix td { + background: white; + color: #39434c; +} + +.table-mitigations th, +.table-mitigations td, .table-mitigations { + white-space: nowrap; + width: 1%; +} + +.div-count { + margin-top: auto; + margin-bottom: 0; +} + +.table-object-count { + display: flex; + justify-content: flex-end; +} + +.matrix-tactics-url { + color: white; +} +.matrix-tactics-url:visited, .matrix-tactics-url:hover, .matrix-tactics-url:active { + color: white; +} + +/* **** */ +/* BANNER */ +.banner-message, .version-banner { + padding: 0.3125rem 0; + text-align: center; + background-color: rgb(229.5, 229.5, 229.5); +} + +/* **** */ +/* IMG/SVG ICON in BANNER */ +.icon-inline { + display: inline-flex; + align-self: center; +} +.icon-inline svg, +.icon-inline img { + height: 1rem; + width: 1rem; + fill: currentcolor; + top: 0.125rem; + position: relative; +} + +/* **** */ +/* Pre-block in SIGHTINGS */ +pre { + color: #39434c; + background-color: rgb(216.75, 216.75, 216.75); + border-radius: 5px; + padding: 1rem; +} + +code { + color: #c63e1f; +} + +/* **** */ +/* CARDS */ +.card { + background: white; + color: #39434c; + border-color: rgb(223.125, 223.125, 223.125); +} + +.button-group { + display: flex; + justify-content: end; +} +.button-group a.button + a.button { + margin-left: 22px; +} +.button-group button { + justify-content: center; + width: 100%; +} +.button-group a.w-40 { + width: 40%; +} + +.card-filter { + width: 20%; + top: 9.3rem; + float: right; + background: #eaeaea; +} + +@media screen and (width <= 90.62rem) { + .card-filter { + display: contents; + } +} +.card-presentation { + margin-bottom: 30px; +} + +.card-attackcon { + width: 100%; +} + +.card-data { + margin-bottom: 0.5rem; +} + +.card-header { + color: #39434c; + background: rgba(57, 67, 76, 0.03); + border-bottom-color: rgb(223.125, 223.125, 223.125); +} + +a.partial-underline { + text-decoration: none; +} +a.partial-underline .hover-line { + text-decoration: underline; +} + +.contact-card { + border-radius: 0.75em; + overflow: hidden; +} +.contact-card .card-footer { + padding: 0 1.25rem 1.25rem; +} +.contact-card .card-footer.button-group { + display: flex; + justify-content: center; + flex-wrap: wrap; + gap: 12px; +} +.contact-card .card-footer-no-button { + padding: 0.5rem 1.25rem; + min-height: 4rem; + max-height: fit-content; +} +.contact-card .card-header { + padding: 1.25rem 1.25rem 0; +} +.contact-card .card-header.background { + background: #303435; + color: white; + padding-bottom: 1.25rem; +} +.contact-card .card-header.no-background, +.contact-card .card-footer.no-background { + background: white; + color: #39434c; + border: unset; +} +.contact-card .card-body p { + margin: 0; +} +.contact-card .card-body.background { + background: #eaeaea; +} + +.card-body > .table { + border-right: 0; + border-left: 0; + margin-bottom: 0; +} +.card-body > .table:last-child { + border-bottom: 0; +} +.card-body > .table:not(.table-sm) th, .card-body > .table:not(.table-sm) td { + padding: 0.75rem 1.25rem; +} +.card-body > .table td:first-child, +.card-body > .table th:first-child { + border-left: 0; +} +.card-body > .table td:last-child, +.card-body > .table th:last-child { + border-right: 0; +} +.card-body > .table tr:first-child td, +.card-body > .table tr:first-child th { + border-top: 0; +} +.card-body > .table tr:last-child td { + border-bottom: 0; +} +.card-body .card-header + .table { + border-top: 0; +} + +.card-data:last-of-type { + margin-bottom: 0; +} + +.card-title { + font-size: 1.1rem; + color: rgb(28.5, 33.5, 38); +} + +.contact-card-title { + font-size: 1.1rem; + font-weight: bold; +} + +.card-title-icon { + float: right; + color: #303435; +} + +/* **** */ +/* TWITTER */ +.attack-box { + width: 22rem; + max-width: 100%; + height: 30rem; + margin: 0 auto; + border: 3px solid #dfdfdf; + padding: 3px; + display: flex; + flex-direction: column; +} +.attack-box iframe { + border: 1px solid rgb(223.125, 223.125, 223.125) !important; + border-radius: 0.25rem; +} + +/* **** */ +/* BREADCRUMBS */ +.breadcrumb { + font-size: 90%; + background-color: white; + max-width: 1140px; + padding: 0 15px; +} +.breadcrumb .breadcrumb-item + .breadcrumb-item::before { + content: ">"; + color: rgb(106.5, 114, 120.75); +} + +/* **** */ +.nestedlist { + counter-reset: item; +} + +.nestedlist-item { + display: block; +} + +.nestedlist-item::before { + content: counters(item, ".") ". "; + counter-increment: item; +} + +.danger-card { + border-color: #303435; +} +.danger-card .card-header { + background: #303435; + color: white; +} + +/* **** */ +/* ATT&CKCON */ +.bg-accord-light { + color: #39434c; + background-color: rgb(242.25, 242.25, 242.25); +} + +.bg-accord-dark { + color: #39434c; + background-color: rgb(216.75, 216.75, 216.75); +} + +/* **** */ +/* CONTRIBUTE */ +.contribution-headers { + font-family: "Roboto-Regular", sans-serif; +} + +.usa-card-group { + display: flex; + flex-direction: row; +} + +.usa-card__header { + font-family: "Roboto-Regular", sans-serif; + color: white; + background: #303435; + border-bottom-color: rgb(223.125, 223.125, 223.125); + border-radius: 0.3rem 0.3rem 0 0; +} + +/* CONTRIBUTE Examples */ +.new-examples { + padding: 0.625rem 0.625rem 0 0.625rem; + width: 100%; +} +.new-examples.second-example { + margin-top: 0.625rem; + margin-bottom: 1.25rem; +} +.new-examples .example-container { + padding: 0.9375rem; +} +.new-examples .example-container .examples-div { + display: flex; +} +.new-examples .example-container .examples-div .margin-contribute-a { + margin-left: 1.5625rem; +} +.new-examples .example-container .examples-div .margin-contribute-b { + margin-left: 11.4375rem; +} +.new-examples .example-container .examples-p { + margin-left: 0.3125rem; + margin-bottom: 0.625rem; + word-break: break-word; +} +.new-examples .example-container .nested-examples-div { + padding-left: 3.125rem; +} +.new-examples .example-container .example-fields { + font-family: "Roboto-Bold", sans-serif; +} +.new-examples .example-container .example-fields + ul { + padding-left: 6.25rem; +} + +/* **** */ +/* CONTRIBUTORS */ +.scrollable-box { + width: 100%; + height: 500px; + overflow: auto; + padding: 0.9375rem; + background-color: rgb(242.25, 242.25, 242.25); + border-radius: 0.1875rem; +} + +/* **** */ +img.yt-core-image { + width: 100%; +} + +.iframe-width { + width: 500px; + height: 275px; +} + +@media screen and (width <= 47.9875rem) { + .iframe-width { + width: 100%; + height: 140px; + } +} +/* No transition */ +.notransition::after { + transition: none !important; +} + +/* FAQ */ +.faq .faq-section { + padding-bottom: 2rem; +} +.faq .faq-question { + padding: 6px 0; +} +.faq .relevant-links { + margin-bottom: 1rem; + border-radius: 3px; +} +.faq .relevant-links .faq-link ~ .faq-link::before { + content: ", "; +} + +/* **** */ +.attackcon-columns { + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: flex-start; +} + +@media screen and (width <= 47.9875rem) { + .attackcon-columns { + flex-direction: column; + } +} +/* Ensure the sponsors block is below and not affected by the top image */ +/* Card Blocks */ +.card-block .card-header { + display: flex; + flex-direction: row; +} +.card-block .card-header h5 { + font-family: "Roboto-Regular", sans-serif; +} +.card-block .card-header :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.card-block .card-header:after, .card-block .card-header::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.card-block .card-header:not(.collapsed):after, .card-block .card-header:not(.collapsed)::after { + transform: rotate(-180deg); +} +.card-block .card-title { + display: inline-block; + flex-grow: 1; + font-family: "Roboto-Regular", sans-serif; +} + +/* **** */ +/* GENERAL INFORMATION */ +.general-info .card-img-top { + width: 100%; + height: 15vw; + object-fit: cover; +} +.general-info .graphics .card-header { + flex-grow: 1; +} +.general-info .showmore-btn { + display: block !important; + text-align: center; +} +.general-info .showmore-btn.show { + display: none !important; +} + +/* **** */ +/* GETTING STARTED */ +.getting-started ul:not(.col) { + padding: 0 0.9375rem; + margin-left: 0.9375rem; +} +.getting-started .getting-started-content { + width: 75%; +} +@media screen and (width <= 90.62rem) { + .getting-started .getting-started-content { + width: 100%; + } +} +.getting-started .getting-started-icon { + color: #303435; +} +.getting-started .video-li { + /* don't display the video in the list itself except in mobile layout */ + display: none; +} +@media screen and (width <= 47.9875rem) { + .getting-started .row ul.col { + margin-left: 1.875rem; + } + .getting-started .video-col { + display: none; + } + .getting-started .video-li { + display: list-item; + } +} + +.jump-to-section { + position: -webkit-sticky; + position: sticky; + top: 14rem; + word-wrap: normal; + border-radius: 0.75em; +} + +/* **** */ +/* Timeline in GENERAL INFORMATION */ +.timeline { + overflow-y: hidden; + position: relative; + list-style-type: none; + padding-left: 0; +} +.timeline::before { + background: rgb(106.5, 114, 120.75); + position: absolute; + width: 0.0625rem; + height: 100%; + z-index: 2; + content: ""; + left: 20px; +} +.timeline.collapse { + display: block !important; +} +.timeline:not(.show) { + height: 300px; +} +.timeline:not(.show)::after { + background: linear-gradient(to bottom, transparent, white); + position: absolute; + width: 100%; + height: 75px; + z-index: 4; + content: ""; + bottom: 0; + pointer-events: none; +} +.timeline .timeline-card { + margin: 20px 0; + padding-left: 40px; +} +.timeline .timeline-card::before { + background: white; + position: absolute; + width: 20px; + height: 20px; + z-index: 3; + content: ""; + display: inline-block; + border-radius: 50%; + border: 0.125rem solid rgb(106.5, 114, 120.75); + left: 10px; +} +.timeline .timeline-card .timeline-card-header { + width: 100%; + display: flex; + flex-direction: row; + clear: both; +} +.timeline .timeline-card .timeline-card-header .title { + display: inline-block; + flex-grow: 1; + font-size: 1.25rem; +} +.timeline .timeline-card .timeline-card-header .date { + display: inline-block; + font-size: 1.25rem; + text-align: right; + white-space: nowrap; + padding-left: 0.625rem; +} +.timeline .timeline-card .timeline-card-body { + padding-top: 0.3125rem; +} + +/* **** */ +/* Description formatting in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE */ +.description-body { + line-height: 1.8rem; +} + +.description-body.in-table { + padding: 0.75rem 1.25rem; +} +.description-body.in-table p { + margin-bottom: 0; +} + +.description-body.card-description { + padding: 0.3rem 0 0 0; +} +.description-body.card-description p { + margin-bottom: 0; +} + +/* **** */ +/* External link icon */ +.external-icon { + width: 0.9375rem; + margin-top: -0.3125rem; +} + +/* **** */ +/* ATTA&K Logo */ +.attack-logo-bold { + width: 60%; +} + +.attack-logo { + margin: 8px 0; + display: block; + height: 24px; +} + +/* **** */ +/* anchor tag to bypass navbar */ +.anchor { + display: block; + position: relative; + top: -4.125rem; + visibility: hidden; +} + +.section-view .anchor-section { + position: -webkit-sticky; + position: sticky; + top: 4.125rem; + background: white; + z-index: 100; + margin-bottom: 0; +} +.section-view p { + margin-bottom: 0; + padding-bottom: 0.5rem; +} +.section-view .section-mobile-view { + display: none; +} +.section-view .section-desktop-view { + display: block; +} +@media screen and (width <= 74.938rem) { + .section-view .section-mobile-view { + display: block; + } + .section-view .section-desktop-view { + display: none; + } +} +.section-view .section-shadow { + border-bottom: 1px solid #dfdfdf !important; +} +.section-view table { + margin-top: -1px; +} + +/* **** */ +div#sidebars { + display: contents; +} + +/* Plus/Minus expand icons */ +.expand-icon { + font-size: 5%; + color: #39434c; + margin-top: 0.4375rem; +} + +/* **** */ +/* attackcon page */ +.attackcons { + border-top-width: 0; +} +.attackcons .sponsors { + flex: 1; + padding-left: 25px; +} +.attackcons .p-description { + width: 90%; +} +.attackcons .sponsors-block { + background: #eaeaea; + text-align: center; + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + flex-direction: column; + width: 200%; +} +.attackcons .sponsors-block .img-container { + margin: 10px; + flex: 1 1 20%; + box-sizing: border-box; +} +.attackcons .sponsors-block .img-container img { + width: 100%; + margin: auto; + height: auto; +} +@media screen and (width <= 47.9875rem) { + .attackcons .sponsors-block { + width: 100%; + flex-direction: row; + } +} + +.support-box { + background-color: rgb(229.5, 229.5, 229.5); + padding: 1.5em; + border-radius: 0.75em; + width: fit-content; +} + +.sponsor-list { + gap: 1.5em; +} + +.sponsor-square { + padding: 0 !important; + height: 150px; + display: flex; +} +.sponsor-square a { + display: contents; +} +.sponsor-square img.sponsor-logo { + background-color: white; + border-radius: 6px; + object-fit: contain; + object-position: center; +} + +/* **** */ +/* training pages */ +.training .exercise { + background: rgb(242.25, 242.25, 242.25); +} + +.card-training { + margin-bottom: 30px; + width: 100%; +} + +.training-card-body { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: left; +} + +.training-text-container { + flex: 1; + margin-right: 20px; +} + +.training-header { + display: flex; + justify-content: space-between; +} + +.resources-container { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: 10px; +} + +.resource { + flex: 1; + background-color: #eaeaea; + padding: 10px; + box-sizing: border-box; +} + +.resource-links { + list-style-type: none; + margin-top: 5px; + padding: 0 !important; + margin-left: 0 !important; +} + +.resource-links li { + margin-bottom: 5px; +} + +.resource-links a { + text-decoration: underline; +} + +/* **** */ +.decorative-panels .decorative-panel .decorative-panel-header, +.decorative-panels .decorative-panel .decorative-panel-body { + padding: 10px; +} +.decorative-panels .decorative-panel .decorative-panel-header h3, +.decorative-panels .decorative-panel .decorative-panel-header h4, +.decorative-panels .decorative-panel .decorative-panel-header .btn { + margin-bottom: 16px; +} +.decorative-panels .decorative-panel .decorative-panel-body.show { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} +.decorative-panels .decorative-panel + .decorative-panel { + margin-top: 25px; +} +.decorative-panels .decorative-panel:nth-of-type(even) { + border-radius: 8px; + background: rgb(242.25, 242.25, 242.25); +} +@media screen and (width <= 47.9875rem) { + .decorative-panels .row { + display: block; + } + .decorative-panels .row.collapse:not(.show) { + display: none; + } +} + +.working-with-attack .g-24 { + gap: 24px; +} +.working-with-attack .g-12 { + gap: 12px; +} +.working-with-attack .row.panels { + margin: 0; +} +.working-with-attack img { + border-radius: 0.75em; +} +.working-with-attack img.scale { + object-fit: cover; + object-position: left top; + border-radius: unset !important; + border: 1px solid rgb(223.125, 223.125, 223.125); +} +.working-with-attack .panel { + padding: 0; + border: 1px solid rgb(223.125, 223.125, 223.125); + border-radius: 0.75em; + max-width: 100%; +} +.working-with-attack img + .panel-body { + border-top: 1px solid rgb(223.125, 223.125, 223.125); +} +.working-with-attack .panel-body p { + margin: 24px 0; + overflow: scroll; +} +.working-with-attack .panel-body.fixed-height { + height: 30vh; +} +.working-with-attack ul { + margin-bottom: 0; +} +@media screen and (width <= 61.938rem) { + .working-with-attack .panel-body.fixed-height { + min-height: 40vh; + max-height: fit-content; + } +} +.working-with-attack .table-of-contents { + position: static; + float: none; + width: 25%; +} + +.tip-box { + background: #eaeaea; + padding: 1rem; +} + +/* Card Blocks */ +.expand-panel .card-block .card-header { + display: flex; + flex-direction: row; +} +.expand-panel .card-block .card-header h5 { + font-family: "Roboto-Regular", sans-serif; +} +.expand-panel .card-block .card-header :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.expand-panel .card-block .card-header:after, .expand-panel .card-block .card-header::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.expand-panel .card-block .card-header:not(.collapsed):after, .expand-panel .card-block .card-header:not(.collapsed)::after { + transform: rotate(-180deg); +} +.expand-panel .card-block .card-header:not(:last-child) { + border-bottom: none; +} +.expand-panel .card-block .card-title { + display: inline-block; + flex-grow: 1; + font-family: "Roboto-Regular", sans-serif; +} +.expand-panel .card-block .first-card { + border-bottom: none; + border-radius: 0.25rem 0.25rem 0 0; +} +.expand-panel .card-block .last-card { + border-radius: 0 0 0.25rem 0.25rem; +} +.expand-panel .card-block .middle-card { + border-bottom: none; + border-radius: 0; +} + +/* **** */ +@media print { + * { + overflow: visible !important; + break-before: always !important; + page-break-inside: avoid !important; + } +} +/* Footer styling */ +.footer { + background-color: #303435; + color: white; + padding: 1rem 3rem; + font-family: "Roboto-Thin", sans-serif; +} +.footer.sticky-footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; +} +.footer > .container-fluid { + padding-right: 0 !important; + padding-left: 0 !important; +} +.footer .footer-responsive-break { + display: none; +} +.footer .footer-float-right-responsive-brand { + float: right; + height: 100%; + display: flex; + align-items: center; +} +.footer .footer-float-right-responsive-centered { + display: flex; + justify-content: flex-end; + align-items: center; +} +.footer .footer-link-group { + display: flex; + flex-direction: column; + justify-content: center; +} +.footer .footer-link { + color: #87deff; +} +.footer .footer-link:hover { + color: rgb(107, 173, 213.5); +} + +.col .col-footer { + border-right: 1px solid; +} + +.p-footer { + padding-left: 25px; +} + +.btn-footer { + color: white; + padding: 0.375rem; +} + +.btn-footer:hover { + color: white; +} + +@media screen and (width <= 47.9875rem) { + .footer .footer-responsive-break { + display: block !important; + } + .footer .footer-float-right-responsive-brand { + float: none !important; + } + .footer .footer-float-right-responsive-centered { + float: none !important; + display: block !important; + justify-content: none !important; + align-items: none !important; + } +} +/* **** */ +@media print { + .footer { + visibility: hidden; + display: none; + } +} +/* Navigation styling */ +.navbar .nav-tabs .nav-link.active, .navbar .nav-tabs .nav-link:hover:not(.active), .navbar .nav-tabs .nav-link:focus { + border: 0.0625rem solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + text-decoration: underline; +} + +/* Top NAVIGATION */ +.navbar { + background-color: #303435; + z-index: 1; +} +.navbar .navbar-brand { + font-size: 2rem; +} +.navbar .nav-tabs { + border-bottom: none; +} +.navbar .nav-tabs .nav-link { + color: white; + font-family: "Roboto-Light", sans-serif; +} +.navbar .nav-tabs .nav-link:focus { + color: white; +} +.navbar .nav-tabs .nav-link:hover:not(.active) { + color: white; + background-color: transparent; +} +.navbar .nav-tabs .nav-link.active { + color: white; + background-color: #303435; +} +.navbar .nav-tabs .nav-item.show .nav-link { + color: white; + background-color: #303435; + border-color: transparent; +} +.navbar .search-button { + padding: 0.3rem 1rem; + font-size: 1rem; + border: 0.0625rem solid white; + border-radius: 0.25rem; + color: white; + line-height: 1.5rem; + opacity: 0.8; +} +.navbar .search-button:not(:has(.error-icon)):hover { + opacity: 1; +} +.navbar .search-button .icon-button { + content: ""; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: middle; + background-position: center; + z-index: 1; + transition: all 0.2s ease; +} +.navbar .search-button .search-icon { + cursor: pointer; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%23FFFFFF' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); +} +.navbar .search-button .error-icon { + cursor: default; + background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg fill='%23FFFFFF' xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 96 960 960' width='24'%3e%3cpath d='M479.982 776q14.018 0 23.518-9.482 9.5-9.483 9.5-23.5 0-14.018-9.482-23.518-9.483-9.5-23.5-9.5-14.018 0-23.518 9.482-9.5 9.483-9.5 23.5 0 14.018 9.482 23.518 9.483 9.5 23.5 9.5ZM453 623h60V370h-60v253Zm27.266 353q-82.734 0-155.5-31.5t-127.266-86q-54.5-54.5-86-127.341Q80 658.319 80 575.5q0-82.819 31.5-155.659Q143 347 197.5 293t127.341-85.5Q397.681 176 480.5 176q82.819 0 155.659 31.5Q709 239 763 293t85.5 127Q880 493 880 575.734q0 82.734-31.5 155.5T763 858.316q-54 54.316-127 86Q563 976 480.266 976Zm.234-60Q622 916 721 816.5t99-241Q820 434 721.188 335 622.375 236 480 236q-141 0-240.5 98.812Q140 433.625 140 576q0 141 99.5 240.5t241 99.5Zm-.5-340Z'/%3e%3c/svg%3e"); +} + +/* **** */ +.nav, +.faq { + /* NAVIGATION Dropdown */ + /* **** */ + /* Side NAVIGATION */ + border-color: rgb(223.125, 223.125, 223.125) !important; + /* **** */ +} +.nav .dropdown:hover > .dropdown-menu, +.faq .dropdown:hover > .dropdown-menu { + display: block; +} +.nav .dropdown-menu, +.faq .dropdown-menu { + background-color: #303435; +} +.nav .dropdown-menu .dropdown-item, +.faq .dropdown-menu .dropdown-item { + color: white; +} +.nav .dropdown-menu .dropdown-item:hover, .nav .dropdown-menu .dropdown-item:focus, +.faq .dropdown-menu .dropdown-item:hover, +.faq .dropdown-menu .dropdown-item:focus { + color: white; + text-decoration: underline; + background-color: transparent; +} +.nav .heading, +.faq .heading { + font-size: 1.6rem; + color: rgb(106.5, 114, 120.75); + letter-spacing: 0.1875rem; + pointer-events: none; +} +@media screen and (width <= 74.938rem) { + .nav .heading, + .faq .heading { + pointer-events: all; + } +} +.nav .heading.collapsed .fa-chevron-up, +.nav .heading .fa-chevron-down, +.faq .heading.collapsed .fa-chevron-up, +.faq .heading .fa-chevron-down { + display: none; +} +.nav .heading.collapsed .fa-chevron-down, +.nav .heading .fa-chevron-up, +.faq .heading.collapsed .fa-chevron-down, +.faq .heading .fa-chevron-up { + display: inline-block; +} +.nav i.fa-solid, +.faq i.fa-solid { + visibility: hidden; + display: none; +} +@media screen and (width <= 74.938rem) { + .nav i.fa-solid, + .faq i.fa-solid { + visibility: visible; + display: contents; + } +} +.nav .br-mobile, +.faq .br-mobile { + display: none; +} +@media screen and (width <= 74.938rem) { + .nav .br-mobile, + .faq .br-mobile { + display: inline-block; + } +} +.nav .heading-dropdown, +.faq .heading-dropdown { + font-size: 1.2rem; + color: #303435; + letter-spacing: 0.1875rem; +} +@media screen and (width <= 90.62rem) { + .nav .heading, + .faq .heading { + font-size: 1.2rem; + color: rgb(106.5, 114, 120.75); + letter-spacing: 0.1875rem; + } + .nav .heading-dropdown, + .faq .heading-dropdown { + font-size: 1rem; + color: #39434c; + letter-spacing: 0.0625rem; + } +} +.nav .nav-link, +.faq .nav-link { + font-size: 1rem; + padding: 0.3rem 1rem; + color: rgb(106.5, 114, 120.75); +} +.nav .nav-link.expand-title, +.faq .nav-link.expand-title { + font-size: 1.1rem; + color: #39434c; +} +.nav .nav-link.side, +.faq .nav-link.side { + padding: 0.3rem 0.3rem; + word-break: break-word; +} +.nav .nav-link.side:hover, +.faq .nav-link.side:hover { + background-color: #303435; + color: white; +} +.nav .nav-link.side.active, +.faq .nav-link.side.active { + color: #303435; + background-color: rgb(242.25, 242.25, 242.25); + border-right: 0.1875rem solid #303435; +} + +/* **** */ +.resizer { + width: 2px; + top: 0; + right: 0; + cursor: col-resize; + height: 100%; + position: absolute; + background-color: #dfdfdf; +} + +.data-sources-menu { + padding-top: 15px; +} + +.sidebar.nav { + overflow-y: auto; + z-index: 0; + min-width: min-content; + max-width: 20vw; +} +@media screen and (width <= 74.938rem) { + .sidebar.nav { + position: static; + min-width: fit-content; + } +} +.sidebar.nav .sidenav-wrapper { + display: flex; + flex-direction: column; + padding-right: 5px; + padding-left: 1rem; + height: 100%; +} +@media screen and (width <= 74.938rem) { + .sidebar.nav .sidenav-wrapper { + display: block; + } +} +.sidebar.nav .sidenav-wrapper .heading { + border-bottom: 1px solid rgb(242.25, 242.25, 242.25); + flex: 0 1 0; +} +.sidebar.nav .sidenav-wrapper .checkbox-div { + border-bottom: 1px solid rgb(242.25, 242.25, 242.25); + flex: 0 1 0; +} +.sidebar.nav .sidenav-wrapper .sidenav-list { + flex: 1 0 0; + overflow-y: auto; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav { + width: 100%; + word-break: break-word; + font-size: 1.1rem; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head { + display: flex; + flex-direction: row; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button { + cursor: pointer; + color: black; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a:hover, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:hover { + background: rgb(242.25, 242.25, 242.25); +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head span { + padding: 0.3rem; + padding-left: 0; + display: inline-block; + flex-grow: 1; + height: 100%; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head a:hover, +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head span:hover { + text-decoration: none; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button { + padding: 5px; + border-left: 1px solid rgb(242.25, 242.25, 242.25); + display: inline-block; + display: flex; + flex-direction: row; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button :first-child { + cursor: pointer; + display: inline-block; + flex-grow: 1; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:after, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button::after { + content: ""; + cursor: pointer; + width: 1.5rem; + height: 1.5rem; + background-repeat: no-repeat; + display: inline-block; + vertical-align: top; + background-position: center; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='%2339434C' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); + z-index: 1; + transition: all 0.2s ease; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:not(.collapsed):after, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head .expand-button:not(.collapsed)::after { + transform: rotate(-180deg); +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head.active, .sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-head.active > a { + color: #303435 !important; + font-weight: bolder; + background: #eaeaea; + font-family: Roboto-Bold, sans-serif; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav-body { + padding-left: 0.75rem; +} +.sidebar.nav .sidenav-wrapper .sidenav-list .sidenav .sidenav { + padding-left: 0.75rem; +} + +@media print { + .nav { + visibility: hidden; + display: none; + } + .sidenav { + visibility: hidden; + display: none; + } + .sidebar.nav { + visibility: hidden; + display: none; + } + .sidenav-wrapper { + visibility: hidden; + display: none; + } + .side-nav-desktop-view { + visibility: hidden; + display: none; + } + .navbar { + visibility: hidden; + display: none; + } +} +.search-word-found { + background: yellow; + color: black; +} + +.btn-group-text { + padding: 0.25rem, 0.5rem; + font-size: 0.875rem; + line-height: 1.5; + border-radius: 0.2rem; + border: 1px solid transparent; +} + +.overlay.search { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1051; + background: rgba(0, 0, 0, 0.35); + padding: 50px; +} +.overlay.search .overlay-inner { + border-radius: 25px; + background: white; + color: #39434c; + width: 100%; + display: flex; + flex-flow: column; + max-height: 100%; +} +.overlay.search .overlay-inner .search-header { + flex-shrink: 0; + position: relative; +} +.overlay.search .overlay-inner .search-header .search-input { + padding: 10px; +} +.overlay.search .overlay-inner .search-header .search-input input { + padding-left: 12.5px; + font-size: 25px; + line-height: 50px; + width: 100%; + border: 0; + background: white; + color: #39434c; +} +.overlay.search .overlay-inner .search-header .search-input input:focus { + outline: none; +} +.overlay.search .overlay-inner .search-header .search-icons { + position: absolute; + top: 0px; + right: 0px; +} +.overlay.search .overlay-inner .search-header .search-icons > div { + display: inline-block; +} +.overlay.search .overlay-inner .search-header .search-icons .search-parsing-icon { + height: 25px; + width: 25px; + margin-bottom: 8px; + opacity: 0.5; +} +.overlay.search .overlay-inner .search-header .search-icons .close-search-icon { + font-size: 50px; + width: 50px; + line-height: 50px; + text-align: center; + margin: 10px; + opacity: 0.8; + cursor: pointer; +} +.overlay.search .overlay-inner .search-header .search-icons .close-search-icon:hover { + opacity: 1; +} +.overlay.search .overlay-inner .search-body { + flex: 1 1 auto; + padding: 0 50px; + border-top: 1px solid rgb(223.125, 223.125, 223.125); + margin-bottom: 25px; + overflow-y: auto; +} +.overlay.search .overlay-inner .search-body .results .search-result:first-child { + margin-top: 1.5rem; +} +.overlay.search .overlay-inner .search-body .load-more-results { + text-align: center; +} + +.page-search { + float: right; + width: 50%; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .overlay.search .search-body { + flex-basis: 50vh !important; + } +} +@media screen and (min-width: 1px) and (max-width: 767.8px) { + .search-input input { + font-size: 20px !important; + line-height: 25px !important; + } + .close-search-icon { + font-size: 25px !important; + line-height: 25px !important; + width: 25px !important; + } + .search-parsing-icon { + width: 14px !important; + height: 14px !important; + margin-bottom: 5px !important; + } +} +.popover { + box-shadow: 0 0 5px 3px white; + border-color: #303435; +} +.popover .popover-header { + background: #303435; + color: white; +} +.popover.bs-popover-left .arrow::before { + border-left-color: #303435; +} +.popover.bs-popover-right .arrow::before { + border-right-color: #303435; +} +.popover.bs-popover-top .arrow::before { + border-top-color: #303435; +} +.popover.bs-popover-bottom .arrow::before, +.popover.bs-popover-bottom .arrow::after, +.popover.bs-popover-bottom .popover-header::before { + border-bottom-color: #303435; +} + +.tour-backdrop, +.tour-highlight { + opacity: 0; +} + +.matrix-container { + border: 1px solid rgb(223.125, 223.125, 223.125); + background: white; +} +.matrix-container + .matrix-container { + margin-top: 1rem; +} +.matrix-container .matrix-border { + border-left: 1px solid rgb(223.125, 223.125, 223.125); + padding-left: 0.5rem; + display: flex; + justify-content: center; + align-items: center; +} +.matrix-container .matrix-title { + border-bottom: 1px solid rgb(223.125, 223.125, 223.125); + margin-bottom: 1rem; + padding-bottom: 0.5rem; +} +.matrix-container .scroll-indicator-group { + white-space: nowrap; + display: flex; +} +.matrix-container .scroll-indicator-group .matrix-scroll-box { + flex-grow: 1; + display: inline-block; +} +.matrix-container .scroll-indicator-group .scroll-indicator { + width: 0; + display: inline-block; + position: relative; +} +.matrix-container .scroll-indicator-group .scroll-indicator .cover { + width: 50px; + height: 100%; + position: absolute; + pointer-events: none; +} +.matrix-container .scroll-indicator-group .scroll-indicator.right .cover { + right: 0; +} +.matrix-container .scroll-indicator-group .scroll-indicator.right.show .cover { + background: linear-gradient(to right, rgba(255, 255, 255, 0.001), white); +} +.matrix-container .scroll-indicator-group .scroll-indicator.left .cover { + left: 0; +} +.matrix-container .scroll-indicator-group .scroll-indicator.left.show .cover { + background: linear-gradient(to left, rgba(255, 255, 255, 0.001), white); +} + +.matrix { + white-space: normal; + line-height: 14px; +} +.matrix.side .tactic { + padding: 2px 5px; + width: 1%; + vertical-align: top; +} +.matrix.side .tactic:first-child { + padding: 2px 5px 2px 2px; +} +.matrix.side .tactic:last-child { + padding: 2px 2px 2px 5px; +} +.matrix.side .tactic:hover:not(.name, .count) { + background: rgb(223.125, 223.125, 223.125); +} +.matrix.side .tactic:hover:not(.name, .count) .sidebar.expanded .angle { + background: rgb(223.125, 223.125, 223.125); +} +.matrix.side .tactic.name, .matrix.side .tactic.count { + text-align: center; + font-size: 16px; +} +.matrix.side .tactic.name { + font-weight: bold; +} +.matrix.side .tactic.count { + font-size: 13px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; +} +.matrix.side .tactic .techniques-table { + border-collapse: collapse; + width: 100%; +} +.matrix.side .tactic .techniques-table tr, +.matrix.side .tactic .techniques-table td { + padding: 0; +} +.matrix.side .tactic .techniques-table tr { + height: 1px; +} +.matrix.side .tactic .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; +} +.matrix.side .tactic .supertechnique td { + padding: 0; + vertical-align: top; +} +.matrix.side .tactic .supertechnique td.technique { + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; +} +.matrix.side .tactic .subtechniques { + display: flex; + flex-direction: column; + height: 100%; + margin-left: -1px; + border-left: 2px solid rgb(106.5, 114, 120.75); + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; + white-space: nowrap; + vertical-align: top; +} +.matrix.side .tactic .subtechniques.hidden { + display: none; +} +.matrix.side .tactic .subtechniques .subtechnique { + height: 100%; + flex-grow: 1; +} +.matrix.side .tactic .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: rgb(242.25, 242.25, 242.25); + width: 12px; + height: 12px; + font-size: 16px; + line-height: 12px; +} +.matrix.side .tactic .sidebar { + min-width: 8px; + width: 12px; + padding: 0; + background: rgb(106.5, 114, 120.75); + cursor: pointer; + position: relative; + vertical-align: middle; +} +.matrix.side .tactic .sidebar .angle { + display: none; +} +.matrix.side .tactic .sidebar.expanded .angle { + margin: 0 auto; + height: 12px; + display: block; + position: absolute; + background: white; +} +.matrix.side .tactic .sidebar.expanded .angle svg { + fill: rgb(106.5, 114, 120.75); + vertical-align: baseline; +} +.matrix.side .tactic .sidebar.expanded .angle.top { + top: 0; +} +.matrix.side .tactic .sidebar.expanded .angle.bottom { + bottom: 0; +} +.matrix.flat .tactic { + margin-right: 5px; + width: 1%; + vertical-align: top; +} +.matrix.flat .tactic.name, .matrix.flat .tactic.count { + text-align: center; + font-size: 16px; +} +.matrix.flat .tactic.name { + font-weight: bold; +} +.matrix.flat .tactic.count { + font-size: 13px; + border-bottom: 1px solid black; + padding-bottom: 5px; + margin-bottom: 5px; +} +.matrix.flat .tactic .subtechniques-row.hidden { + display: none; +} +.matrix.flat .tactic .supertechnique { + border-collapse: collapse; + width: 100%; + padding: 0; + margin: 0; +} +.matrix.flat .tactic .supertechnique td { + padding: 0; + vertical-align: top; +} +.matrix.flat .tactic .supertechnique td.sidebar.technique { + min-width: 8px; + width: 12px; + padding: 0; + background: rgb(106.5, 114, 120.75); + cursor: pointer; + vertical-align: middle; +} +.matrix.flat .tactic .supertechnique td.sidebar.technique .handle { + text-align: center; + vertical-align: middle; + transform: rotate(-90deg); + color: rgb(242.25, 242.25, 242.25); + width: 12px; + height: 9px; + font-size: 16px; + line-height: 12px; +} +.matrix.flat .tactic .supertechnique td.sidebar.subtechniques svg { + fill: rgb(106.5, 114, 120.75); + vertical-align: baseline; +} +.matrix.flat .tactic .supertechnique td.sidebar { + border-right: 2px solid rgb(106.5, 114, 120.75); +} +.matrix.flat .tactic .supertechnique td.technique { + outline: 1px solid rgb(106.5, 114, 120.75); + outline-offset: -1px; +} +.matrix.flat .tactic .more-icon { + transition: all ease 0.125s; + vertical-align: top; + transform: scale(0.5) rotate(-90deg); + width: 12px; + height: 12px; +} +.matrix.flat .tactic .more-icon.expanded { + transform: scale(0.5); +} +.matrix .technique-cell { + height: 100%; + display: flex; + align-items: center; + background-color: white; + font-size: 13px; + line-height: 14px; + outline: 1px solid transparent; + outline-offset: -1px; +} +.matrix .technique-cell a { + display: block; + width: 100%; + height: 100%; + padding: 7px 3px; +} +.matrix .technique-cell:not(.colored):not(.supertechniquecell) { + outline-color: rgb(223.125, 223.125, 223.125); +} + +.matrix-controls { + margin: auto; + width: 50%; + padding: 1rem; +} +.matrix-controls button { + border-color: rgb(223.125, 223.125, 223.125); + background: white; + color: #39434c; +} +.matrix-controls button:hover { + background: rgb(244.8, 244.8, 244.8); +} +.matrix-controls .layout-button:active { + color: #16181b; + text-decoration: none; + background-color: #f8f9fa; +} + +.center-controls .matrix-controls .btn-toolbar { + justify-content: center; +} + +.btn-toolbar { + justify-content: center; +} + +.version-button.permalink .live { + display: none; +} +.version-button.live .permalink { + display: none; +} + +.version-table .table-break-row { + border-right-color: white; + border-left-color: white; + padding: 1rem 0; +} + +/*# sourceMappingURL=style-user.css.map */ diff --git a/attack-theme/static/style/_colors.scss b/attack-theme/static/style/_colors.scss deleted file mode 100644 index fcc9f2b2483..00000000000 --- a/attack-theme/static/style/_colors.scss +++ /dev/null @@ -1,108 +0,0 @@ -//$use_attack_theme : true; -// end search -// Do not remove previous lines - used to add/remove ATT&CK theme - -/*COLORS*/ - -// ATT&CK Brand colors -$attack-colors: ( - attack-orange: #c63f1f, - attack-blue: #062f4f, - attack-footer:#0b2338, - attack-active: #0156b3 -); -// User colors -$user-colors: ( - user-gray: #303435 -); - -/** - * Colors used across the website. - * For each color-pair: - * - "color" refers to the color itself - * - "on-color" refers to the most readable text-color to appear on top of the color. - * Note: some colors don't define on-colors. This is because, for these colors, they aren't intended to - * appear with inner content. For example, "link" is only intended to be used for link text, which inherently - * cannot have inner text. - */ -$colors: ( - primary: (color: if(variable-exists($name: use_attack_theme), map-get($attack-colors, attack-orange), map-get($user-colors, user-gray)), on-color: white), //used for header and some nav elements - secondary: (color: if(variable-exists($name: use_attack_theme), map-get($attack-colors, attack-blue), map-get($user-colors, user-gray)), on-color: white), //used for some buttons - footer: (color: if(variable-exists($name: use_attack_theme), map-get($attack-colors, attack-footer), map-get($user-colors, user-gray)), on-color: #87deff), //used for footer and some buttons - active: (color: if(variable-exists($name: use_attack_theme), map-get($attack-colors, attack-active), map-get($user-colors, user-gray)), on-color: #eaeaea), //used for active buttons and sidebar links - body: (color: white, on-color: #39434C), //primary page body - // body: (color: rgb(50, 50, 50), on-color: #cdcdcd), //example of a dark theme for the site - link: (color: #4f7cac), //hyperlinks - matrix-header: (color: gray, on-color: white), //color of matrix headers - - //query highlight in the search UI - search-highlight: (color: yellow, on-color: black), - deemphasis: (color: #303435) -); - -// accessor helper for $colors. Gets the color of the named pair -@function color($name) { - @return map-get(map-get($colors, $name), "color"); -} - -// given a color name, get an alternate version of the color, for patterning -// if the base color is dark, the alternate will be slightly lighter. -// if the base color is light, the alternate will be slightly darker. -// contrast, an optional argument, multiplies to create a more distint or similar color. >1 is more distant, <1 is more similar. -@function color-alternate($name, $contrast: 1) { - @return mix(invert(color($name)), color($name), $weight: $contrast * 5%); -} - -// accessor helper for $colors. Gets the on-color of the named pair -@function on-color($name) { - @return map-get(map-get($colors, $name), "on-color"); -} - -// given a color-name, get an emphasized version of the on-color. -// The emphasized on-color is less like the background color. -@function on-color-emphasis($name) { - @return mix(invert(color($name)), on-color($name)); -} -// given a color-name, get an deemphasized version of the on-color. -// The deemphasized on-color is more like the background color. -@function on-color-deemphasis($name) { - @return mix(color($name), on-color($name), 25%); -} - -// given a color name, compute a border color for the color -@function border-color($name) { - @return mix(invert(color($name)), color($name), 12.5%); - // @return rgba(invert(color($name)), 0.125); -} - -// given a color name, compute a border color for the color -@function background-color($name) { - @return mix(invert(color($name)), color($name), 12.5%); -} - -// escape the color. Note param is a color and not a color name: this is not an accessor to the color map above. -// replaces # with %23 in hex colors -// see https://codepen.io/gunnarbittersmann/pen/BoovjR for explanation of why we have to escape # for the background image -@function escape-color($color) { - $hex: ie-hex-str($color); - @return "%23"+ str-slice($string: #{$hex}, $start-at: 4); //skip #AA in #AARRGGBB -} - -// used in 404 and contact templates -.deemphasis { - color: on-color-deemphasis(body); -} - -// background color for the table matrix headers in the home page and the matrices page -.matrix-header { - background-color: color(matrix-header); - color: on-color(matrix-header); -} - -// background color for the table matrix in the home page -.bg-alternate { - background-color: color-alternate(body) !important; -} - - -/******/ diff --git a/attack-theme/static/style/_fonts.scss b/attack-theme/static/style/_fonts.scss deleted file mode 100644 index 7b392130206..00000000000 --- a/attack-theme/static/style/_fonts.scss +++ /dev/null @@ -1,50 +0,0 @@ -$fonts: ( - font-families: ( - "Roboto-Thin", - "Roboto-Light", - "Roboto-Regular", - "Roboto-Medium", - "Roboto-Bold", - "Roboto-Black", - "AlegreyaSans-Regular" - ), - font-weights: ( - 100, - 300, - 400, - 500, - 700, - 900, - 400 - ), - srcs: ( - "fonts/Roboto/Roboto-Thin.ttf", - "fonts/Roboto/Roboto-Light.ttf", - "fonts/Roboto/Roboto-Regular.ttf", - "fonts/Roboto/Roboto-Medium.ttf", - "fonts/Roboto/Roboto-Bold.ttf", - "fonts/Roboto/Roboto-Black.ttf", - "fonts/Alegreya_Sans/AlegreyaSans-Regular.ttf" - ) -); - -/*FONTS*/ -@for $i from 1 to length(map-get($fonts, "font-families")) { - @font-face { - font-family: nth(map-get($fonts, "font-families"), $i); - font-style: normal; - font-weight: nth(map-get($fonts, "font-weights"), $i); - src: url(nth(map-get($fonts, "srcs"), $i)); - } -} - -.text-label { - text-transform: uppercase; - font-size: 14px; -} - -.text-label-small { - font-size: 12px; - color: color(deemphasis); - margin-top: -10px; -} \ No newline at end of file diff --git a/attack-theme/static/style/_footer.scss b/attack-theme/static/style/_footer.scss deleted file mode 100644 index 4d700db2adf..00000000000 --- a/attack-theme/static/style/_footer.scss +++ /dev/null @@ -1,106 +0,0 @@ -/*Footer styling*/ -.footer { - background-color: color(footer); - color: on-color(secondary); - padding: 1rem 3rem; - @include font("Roboto-Thin"); - - // place footer at the bottom - &.sticky-footer { - position: fixed; - bottom: 0; - left: 0; - right: 0; - } - - > .container-fluid { - padding-right: 0 !important; - padding-left: 0 !important; - } - - // space block between text block and buttons in footer - .footer-responsive-break { - display: none; - } - - // place buttons to the right of footer - .footer-float-right-responsive-brand { - float: right; - height: 100%; - display: flex; - align-items: center; - } - - // place button to the right of footer; vertically centered - .footer-float-right-responsive-centered { - display: flex; - justify-content: flex-end; - align-items:center; - } - - .footer-link-group { - display: flex; - flex-direction: column; - justify-content: center; - } - - .footer-link { - color: on-color(footer); - - &:hover { - //add some link color to this so that it resembles a link, but is still visible if normal link color is not visible on footer color - color: mix(on-color(footer), color(link)); - } - } -} - -.col { - .col-footer { - border-right: 1px solid; - } -} - -.p-footer { - padding-left: 25px; -} - -.btn-footer { - color: white; - padding: .375rem; -} - -.btn-footer:hover { - color: white; -} - -// phones and small tablets view -@media screen and (max-width: 47.9875rem) { - .footer { - // space block between text block and buttons in footer - .footer-responsive-break { - display: block !important; - } - - // extend buttons width to 100% in the footer - .footer-float-right-responsive-brand { - float: none !important; - } - - .footer-float-right-responsive-centered { - float: none !important; - display: block !important; - justify-content: none !important; - align-items: none !important; - } - } -} -/******/ - -//Hides the footer when the user tries to print out a page so that the page looks clean and only the relevant information is displayed - -@media print { - .footer { - visibility: hidden; - display: none; - } -} \ No newline at end of file diff --git a/attack-theme/static/style/_layouts.scss b/attack-theme/static/style/_layouts.scss deleted file mode 100644 index 7f67f004d8f..00000000000 --- a/attack-theme/static/style/_layouts.scss +++ /dev/null @@ -1,1516 +0,0 @@ -/*General styling*/ -html { height: 100%; } -body { - height: 100%; - background: color(body); - color: on-color(body); - @include font("Roboto-Regular"); - display: flex; - flex-direction: column; -} -//footer IE compatability -@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { - body { - height: auto; //fix footer bug - } -} -// .maincontent { //grow the page content to fill space before footer -// flex-grow: 1; -// } - -.attack-website-wrapper { - max-height: 100vh; - overflow-y: auto; -} - -h1, -h2, -h3, -h4, -h5 { - @include font("Roboto-Light"); -} - -strong { - @include font("Roboto-Bold"); -} - -.jumbotron { - padding: 0; - background: color(body); - color: on-color(body); - - code { - color: on-color-emphasis(body); - background-color: color-alternate(body, 2); - border-radius: 3px; - font-family: courier, monospace; - padding: 0 3px; - } -} - -a { - color: color(link); - - .anchor::before { - content: ""; - display: block; - margin-top: to-rem(-80); - position: absolute; - } -} - -.marker-none { - list-style-type: none; -} - -.overflow-x-auto { - overflow-x: auto; -} - -.fs-s { - font-size: small; -} - -.capec-card { - background: rgb(128,0,0); - - img { - margin: to-rem(8); - max-width: to-rem(160); - max-height: to-rem(55); - margin-left: auto; - margin-right: auto; - display: block; - } -} - -.maec-card { - background: #212121; - - img { - margin: to-rem(8); - max-width: to-rem(146); - margin-left: auto; - margin-right: auto; - display: block; - } -} - -.default-img-size { - width: 100%; - max-width: to-rem(1000); -} - -.mitre-logo-wtrans { - width: to-rem(144); - height: to-rem(66); -} - -// left column in the home page -.quick-links { - width: 100%; - text-align: center; - table-layout: fixed; - td { - padding: to-rem(5) 0; - } - tr+tr { - border-top: 1px solid border-color(body); - } -} -.row-main-page { - display: flex; - flex-wrap: wrap; - margin-right: -15px; - margin-left: -15px; -} - -@media screen and (max-width: 47.9875rem) { - .row-main-page { - display: inline; - } -} - -// p for home page -.p-line { - p { - border-top: 0.0625rem solid #1c2226; - } -} - -// button style in the side navigation of MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE -.btn-default { - background: color(body); - border-color: on-color-deemphasis(body); - color: on-color(body); - &:hover { - color: on-color-emphasis(body); - } -} - -.website-button { - font-size: 16px; - border-radius: 5px; - cursor: pointer; - position: relative; - overflow: hidden; - font-family: Arial; - display: inline-flex; - align-items: center; - border-style: solid; -} - -.slide-icon-button { - border-style: none; - background: none; -} - -.slide-button { - @extend .website-button; - border-color: color(active); - color: #ffffff; - background: color(active); - padding: 6px 16px; - a & { text-decoration: none !important; } -} - -.slide-button-secondary { - @extend .website-button; - color: color(active); - background: #ffffff; - border-color: color(active); - padding: 6px 16px; - a & { text-decoration: none !important; } -} - -.slide-button-text { - position: relative; -} - -.slide-button-icon { - position: relative; - padding-left: 8px; -} - -.slide-button:hover { - background: color(secondary); - border-color: color(secondary); -} - -.slide-button-secondary:hover { - background: on-color(active); - border-color: color(secondary); - color: color(secondary); -} - -// used for data sources filter dropdown -.dropdown { - position: relative; - display: inline-block; -} - -.dropdown-content { - display: none; - position: absolute; - background-color: on-color(secondary); - min-width: 160px; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); -} - -.dropdown:hover .dropdown-content { - display: block; -} - -// placeholder for base style of all navy colored buttons -%button-style { - color: on-color(secondary); - border-color: to-rem(1) solid color(secondary); -} - -// navy buttons are in the home page and in MATRICES -.btn-navy { - @extend %button-style; - background-color: color(secondary); - color: on-color(secondary); - - &:hover { - // Extending placeholder 'button-style' is necessary to keep on-color white. Else, the on-color will change to the tag on-color when hovering the button. - @extend %button-style; - background-color: scale-color(color(secondary), $lightness: 5%); - background-image: none; - } -} - -// Style for changelog markdown section -.markdown-body { - - h1:not(:first-child) { - padding-top: 2rem; - } - h1 { - padding-bottom: rem(0.5); - font-size: rem(1.5); - } - h2 { - font-size: rem(1.0); - } - h3 { - font-size: rem(0.8); - } -} -/******/ - -/*Table styling*/ -.table, .blog-post table, .changelog table { - empty-cells: hide; - - td { - p:last-child { - margin-bottom: 0; - } - padding: .75rem; - vertical-align: top; - } - th { - padding: rem(0.3); - vertical-align: top; - font-size: rem(0.6); - } - - .active { - color: color(primary); - } -} - -.blog-post table { - margin-bottom: 1.5rem; -} - -// background color for tables in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE -.table-alternate, .blog-post table, .changelog table { - @extend .bg-alternate; - tbody { - background: color(body); - color: on-color(body); - } -} - -// table for techniques -.table-techniques { - - thead tr { - background: #f2f2f2; - border-bottom: 2px solid #dee2e6; - } - table { - border-collapse: collapse; - } - td { - vertical-align: top; - padding: 10px; - border: 1px solid #dfdfdf; - } - tr:last-child { - border-bottom: 1px solid #dfdfdf;; - } - .sub.technique { - border-left: none; - } - .technique td:first-child { - border-bottom: none; - } - .sub.technique td:first-child { - width: 5ex; - border-top: none; border-bottom: none; - } - .sub.technique td:not(:nth-child(4)) { - color: #4f7cac; - } - .technique:not(.sub) td:not(:nth-child(3)) { - color: #4f7cac; - } -} - -// Styling for techniques used table -.techniques-used { - table { - border-collapse: collapse; - } - td { - vertical-align: top; - padding: 10px; - border: 1px solid #dfdfdf; - } - tr:last-child { - border-bottom: 1px solid #dfdfdf;; - } - .sub.technique { - border-left: none; - } - .technique td:first-child { - border-bottom: none; - } - .technique td:nth-child(2) { - border-bottom: none; - } - .sub.technique:not(.noparent) td:nth-child(2) { - width: 5ex; - border-top: none; - border-bottom: none; - } - .sub.technique:not(.noparent) td:first-child { - width: 5ex; - border-top: none; border-bottom: none; - } -} - -.techniques-used.background { - thead tr { - background: #f2f2f2; - border-bottom: 2px solid #dee2e6; - } -} - -// .table td.border { -// border-color: on-color-deemphasis(body); -// } - -// Styling for datasources table -.datasources-table { - table { - border-collapse: collapse; - } - thead tr { - background: #f2f2f2; - border-bottom: 2px solid #dee2e6; - } - td { - vertical-align: top; - padding: 10px; - border: 1px solid #dfdfdf; - } - tr:last-child { - border-bottom: 1px solid #dfdfdf;; - } - .datacomponent.datasource { - border-left: none; - } - .datasource td:first-child { - border-bottom: none; - } - .datasource td:nth-child(2) { - border-bottom: none; - } - .datacomponent.datasource:not(.noparent) td:nth-child(2) { - width: 5ex; - border-top: none; - border-bottom: none; - } - .datacomponent.datasource:not(.noparent) td:first-child { - width: 5ex; - border-top: none; border-bottom: none; - } - - .nowrap { - white-space:nowrap; - } -} - -.tables-mobile { - overflow-y: auto; -} - -.table-bordered, .blog-post table, .changelog table { - &, & td, & th { - border: 1px solid border-color(body); - } - th { - border-bottom: 2px solid border-color(body) !important; - } -} - -// border style for empty cells in the home page matrix and in MATRICES -@mixin no-border($property) { - #{$property}: none !important; -} - -// vertically aligned text -@mixin align($text, $vertical) { - text-align: $text !important; - vertical-align: $vertical !important; -} - -// matrix style in home page and in MATRICES -.table-matrix { - @include no-border(border); - - thead th { - @include align(center, middle); - border: to-rem(1) solid border-color(body) !important; - } - - td, - th { - @include align(center, middle); - @include no-border(border-top); - padding: to-rem(2) !important; - font-size: to-rem(12) !important; - - &.border { - border: to-rem(1) solid border-color(body) !important; - } - - &.no-border { - @include no-border(border); - } - } - - td { - background: color(body); - color: on-color(body); - } -} - -// table expands/contracts depending on the cell's content -%table-nowrap { - white-space: nowrap; - width: 1%; -} - -// mitigation tables -.table-mitigations { - @extend %table-nowrap; - - th, - td { - @extend %table-nowrap; - } -} - - - -// number of table rows in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE -.div-count { - margin-top: auto; - margin-bottom: 0 -} - -.table-object-count { - display: flex; - justify-content: flex-end; -} - -// links in header row of matrices in the home page matrix and in MATRICES -.matrix-tactics-url { - color: on-color(primary); - - &:visited, - &:hover, - &:active { - color: on-color(primary); - } -} -/******/ - -/*BANNER*/ -.banner-message { - padding: to-rem(5) 0; - text-align: center; - background-color: color-alternate(body, 2); -} - -// basic banner -.version-banner { - @extend .banner-message; -} -/******/ - -/*IMG/SVG ICON in BANNER*/ -.icon-inline { - display: inline-flex; - align-self: center; - - svg, - img { - height: rem(0.7); - width: rem(0.7); - fill: currentColor; - top: rem(-0.175); - position: relative; - } -} -/******/ - -/*Pre-block in SIGHTINGS*/ -// style for inline code blocks -pre { - color: on-color(body); - background-color: color-alternate(body, 3); - border-radius: 5px; - padding: 1rem; -} -code { - color: #c63e1f; -} -/******/ - -/*CARDS*/ -// cards are used in the General Information, Staying Informed, and Related Projects page, and in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE -.card { - background: color(body); - color: on-color(body); - border-color: border-color(body); -} - -.button-group { - display: flex; - justify-content: end; - a.button + a.button { - margin-left: 22px; - } - button { - justify-content: center; - width: 100%; - } - a.w-40 { width: 40%; } -} - -.card-filter { - width: 20%; - top: 9.3rem; - float: right; - background: on-color(active); -} - -@media screen and (max-width: 90.62rem) { - .card-filter { - display: contents; - } -} - -.card-presentation { - margin-bottom: 30px; -} - -.card-attackcon { - width: 100%; -} - -.card-data { - margin-bottom: rem(0.2); -} - -.card-header { - color: on-color(body); - background: rgba(on-color(body), 0.03); - border-bottom-color: border-color(body); -} - -a.partial-underline { - text-decoration: none; - .hover-line { - text-decoration: underline; - } -} - -.contact-card { - border-radius: .75em; - overflow: hidden; - .card-footer { - padding: 0 1.25rem 1.25rem; - &.button-group { - display: flex; - justify-content: center; - flex-wrap: wrap; - gap: 12px; - } - } - .card-footer-no-button { - padding: 0.5rem 1.25rem; - min-height: 4rem; - max-height: fit-content; - } - .card-header { - padding: 1.25rem 1.25rem 0; - &.background { - background: color(footer); - color: white; - padding-bottom: 1.25rem; - } - } - .card-header, .card-footer { - &.no-background { - background: color(body); - color: on-color(body); - border: unset; - } - } - .card-body { - p { - margin: 0; - } - &.background { - background: on-color(active); - } - } -} - -.card-body { - // Remove extra whitespace from tables inside of cards - // Source: https://github.com/philipnewcomer/bootstrap4-card-tables/blob/master/src/bootstrap4-card-tables.scss - > .table { - border-right: 0; - border-left: 0; - margin-bottom: 0; - - &:last-child { - border-bottom: 0; - } - - &:not(.table-sm) th, - &:not(.table-sm) td { - padding: 0.75rem 1.25rem; - } - - td:first-child, - th:first-child { - border-left: 0; - } - - td:last-child, - th:last-child { - border-right: 0; - } - - tr:first-child td, - tr:first-child th { - border-top: 0; - } - - tr:last-child td { - border-bottom: 0; - } - } - - .card-header + .table { - border-top: 0; - } -} -// remove botton margin from last item in the card -.card-data:last-of-type { - margin-bottom: 0; -} - -.card-title { - font-size: rem(0.8); - color: on-color-emphasis(body); -} - -.contact-card-title { - font-size: 1.1rem; - font-weight: bold; -} - -.card-title-icon { - float: right; - color: color(active); -} -/******/ - -/*TWITTER*/ -// twitter container in the home page -.attack-box { - width: to-rem(352); - max-width: 100%; - height: to-rem(432); - margin: 0 auto; - border: 3px solid #dfdfdf; - padding: 3px; - display: flex; - flex-direction: column; - iframe { - border: 1px solid border-color(body) !important; - border-radius: .25rem; - } -} - -/******/ - -/*BREADCRUMBS*/ -.breadcrumb { - font-size: 90%; - background-color: color(body); - max-width: 1140px; - padding: 0 15px; - - .breadcrumb-item + .breadcrumb-item::before { - content: ">"; - color: on-color-deemphasis(body); - } -} -/******/ - -.nestedlist { - counter-reset: item; -} - -.nestedlist-item { - display: block; -} - -.nestedlist-item::before { - content: counters(item, ".") ". "; - counter-increment: item; -} - -.danger-card { - .card-header { - background: color(primary); - color: on-color(primary); - } - border-color: color(primary); -} -/******/ - -/*ATT&CKCON*/ -// collapsible expansion panels - light -.bg-accord-light { - color: on-color(body); - background-color: color-alternate(body); -} - -// collapsible expansion panels - dark -.bg-accord-dark { - color: on-color(body); - background-color: color-alternate(body, 3); -} -/******/ - -/*CONTRIBUTE*/ -.contribution-headers { - @include font("Roboto-Regular"); -} - -.usa-card-group { - display: flex; - flex-direction: row; -} - -.usa-card__header { - @include font("Roboto-Regular"); - color: color(body); - background: color(secondary); - border-bottom-color: border-color(body); - border-radius: .3rem .3rem 0 0; -} - - -/*CONTRIBUTE Examples*/ -.new-examples { - padding: to-rem(10) to-rem(10) 0 to-rem(10); - width: 100%; - - &.second-example { - margin-top: to-rem(10); - margin-bottom: to-rem(20); - } - - .example-container { - padding: to-rem(15); - - .examples-div { - display: flex; - - .margin-contribute-a { - margin-left: to-rem(25); - } - - .margin-contribute-b { - margin-left: to-rem(183); - } - } - - .examples-p { - margin-left: to-rem(5); - margin-bottom: to-rem(10); - word-break: break-word; - } - - .nested-examples-div { - padding-left: to-rem(50); - } - - .example-fields { - @include font("Roboto-Bold"); - - + ul { - padding-left: to-rem(100); - } - } - } -} -/******/ - - -/*CONTRIBUTORS*/ -.scrollable-box { - width: 100%; - height: 500px; - overflow: auto; - // border: 1px solid black; /* just to show the box */ - padding: to-rem(15); - background-color: color-alternate(body); - border-radius: to-rem(3); - } -/******/ - -img.yt-core-image { - width: 100%; -} -.iframe-width { - width: 500px; - height: 275px; -} - -@media screen and (max-width: 47.9875rem) { - .iframe-width { - width: 100%; - height: 140px; - } -} - -/* No transition */ -.notransition:after { - transition: none !important; -} - -/*FAQ*/ -.faq { - .faq-section { - padding-bottom: 2rem; - } - .faq-question { - padding: 6px 0; - } - .relevant-links { - margin-bottom: 1rem; - border-radius: 3px; - .faq-link ~ .faq-link::before { - content: ', '; - } - } -} -/******/ - -@mixin collapsible($direction) { - display: flex; - flex-direction: row; - - :first-child { - cursor: pointer; - display: inline-block; - flex-grow: 1; - } - - &:#{$direction}, &::#{$direction} { - content: ""; - cursor: pointer; - width: to-rem(24); - height: to-rem(24); - background-repeat: no-repeat; - display: inline-block; - vertical-align: top; - background-position: center; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='#{escape-color(on-color(body))}' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); - z-index: 1; - transition: all 0.2s ease; - } - - - @if $direction == "before" { - &.collapsed:#{$direction}, &.collapsed::#{$direction} { - transform: rotate(-90deg); - } - } @else { - &:not(.collapsed):#{$direction}, &:not(.collapsed)::#{$direction} { - transform: rotate(-180deg); - } - } -} - -.attackcon-columns { - display: flex; - flex-direction: row; - justify-content: space-between; - align-items: flex-start; -} -@media screen and (max-width: 47.9875rem) { - .attackcon-columns { - flex-direction: column; - } -} - -/* Ensure the sponsors block is below and not affected by the top image */ - -/*Card Blocks*/ -// container of groups of cards -.card-block { - // style of card headers in collapsable cards in Getting Started and FAQ - .card-header { - - h5 { - @include font("Roboto-Regular"); - } - @include collapsible("after"); - } - - // style of card titles in Related Projects - .card-title { - display: inline-block; - flex-grow: 1; - @include font("Roboto-Regular"); - } -} -/******/ - -/*GENERAL INFORMATION*/ -.general-info { - // cards with image in General Information page - .card-img-top { - width: 100%; - height: 15vw; - object-fit: cover; - } - - .graphics .card-header { - flex-grow: 1; - } - - // show entire timeline - .showmore-btn { - display: block !important; - text-align: center; - - &.show { - display: none !important; - } - } -} -/******/ - -/*GETTING STARTED*/ -// move video to an item in the getting started list when in mobile or tablet view -.getting-started { - ul:not(.col) { - padding: 0 to-rem(15); - margin-left: to-rem(15); - } - .getting-started-content { - width:75%; - } - @media screen and (max-width: 90.62rem) { - .getting-started-content { - width:100%; - } - } - .getting-started-icon { - color: color(primary); - } - - .video-li { - /* don't display the video in the list itself except in mobile layout */ - display: none; - } - - @media screen and (max-width: 47.9875rem) { - .row ul.col { - margin-left: to-rem(30); - } - - .video-col { - display: none; - } - - .video-li { - display: list-item; - } - } -} - -.jump-to-section{ - position: -webkit-sticky; - position: sticky; - top: 14rem; - word-wrap: normal; - border-radius: 0.75em; -} -/******/ - -/*Timeline in GENERAL INFORMATION*/ -// base style of timeline -@mixin timeline($bg, $w, $h, $z) { - background: $bg; - position: absolute; - width: $w; - height: $h; - z-index: $z; - content: ""; -} - -.timeline { - $timeline-size: 20px; - $timeline-padding: 10px; - $timeline-hidden-height: 300px; - - overflow-y: hidden; - position: relative; - list-style-type: none; - padding-left: 0; - - // left line - &:before { - @include timeline(on-color-deemphasis(body), to-rem(1), 100%, 2); - left: (0.5 * $timeline-size) + $timeline-padding; - } - - &.collapse { - display: block !important; - } - - // hidden section of the timeline - &:not(.show) { - height: $timeline-hidden-height; - - // creating the 'faded' effect at the of the timeline when a section of the timelien is hidden - &:after { - @include timeline( - linear-gradient(to bottom, transparent, color(body)), - 100%, - $timeline-hidden-height / 4, - 4 - ); - bottom: 0; - pointer-events: none; //allow the user to click-through the overlay - } - } - - // milestones in timeline - .timeline-card { - margin: $timeline-size 0; - padding-left: $timeline-size + (2 * $timeline-padding); - - // roundel on the line indicating a milestone - &:before { - @include timeline(color(body), $timeline-size, $timeline-size, 3); - display: inline-block; - border-radius: 50%; - border: to-rem(2) solid on-color-deemphasis(body); - left: $timeline-padding; - } - - // title style of the milestone - .timeline-card-header { - width: 100%; - display: flex; - flex-direction: row; - clear: both; - - .title { - display: inline-block; - flex-grow: 1; - font-size: rem(0.95); - } - - .date { - display: inline-block; - font-size: rem(0.95); - text-align: right; - white-space: nowrap; - padding-left: to-rem(10); - } - } - - // content of each milestone - .timeline-card-body { - padding-top: to-rem(5); - } - } -} -/******/ - -/*Description formatting in TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE*/ -.description-body { - line-height: rem(1.5); -} - -.description-body.in-table { - padding: 0.75rem 1.25rem; - - p { - margin-bottom: 0; - } -} - -.description-body.card-description { - padding: 0.3rem 0 0 0; - - p { - margin-bottom: 0; - } -} -/******/ - -/*External link icon*/ -.external-icon { - width: to-rem(15); - margin-top: to-rem(-5); -} -/******/ - -/*ATTA&K Logo*/ -// attack logo in the home page -.attack-logo-bold { - width: 60%; -} - -// attack logo - menu -.attack-logo { - // vertically center - margin: 8px 0; - display: block; - height: 24px; -} - -/******/ - -/* anchor tag to bypass navbar */ -.anchor { - display: block; - position: relative; - top: to-rem(-66); - visibility: hidden; -} - -.section-view { - .anchor-section { - position: -webkit-sticky; - position: sticky; - top: 4.125rem; - background: color(body); - z-index: 100; - margin-bottom: 0; - } - - p { - margin-bottom: 0; - padding-bottom: 0.5rem; - } - - // don't show in mobile view - .section-mobile-view { - display: none; - } - - // show in desktop view - .section-desktop-view { - display: block; - } - - // collapsed view for phones and small tablets - @media screen and (max-width: 74.938rem) { - // show collapsed side navigation (mobile view) - .section-mobile-view { - display: block; - } - - // don't show side navigation in desktop view - .section-desktop-view { - display: none; - } - } - - .section-shadow { - border-bottom: 1px solid #dfdfdf !important; - } - - table { - margin-top: -1px; - } -} - -/******/ - -/******/ - -// how to display the sidebar -div#sidebars { - display: contents -} - -/*Plus/Minus expand icons*/ -// used in the expandable list items in the side navigation and in the expandable gray blocks in ATT&CKCON -.expand-icon { - font-size: 5%; - color: on-color(body); - margin-top: to-rem(7); -} -/******/ - -/* attackcon page */ -.attackcons { - border-top-width: 0px; - .sponsors{ - flex: 1; - padding-left: 25px; - } - .p-description{ - width: 90%; - } - .sponsors-block { - background: on-color(active); - text-align: center; - display: flex; - justify-content: space-evenly; - flex-wrap: wrap; - flex-direction: column; - width: 200%; - .img-container { - margin: 10px; - flex: 1 1 20%; - box-sizing: border-box; - img { - width: 100%; - margin: auto; - height: auto; - } - } - } - @media screen and (max-width: 47.9875rem) { - .sponsors-block { - width: 100%; - flex-direction: row; - } - } -} - -.support-box { - background-color: color-alternate(body, 2); - padding: 1.5em; - border-radius: .75em; - width: fit-content; -} - -.sponsor-list { - gap: 1.5em; -} - -.sponsor-square { - padding: 0px !important; - height: 150px; - display: flex; - a { - display: contents; - } - img.sponsor-logo { - background-color: color(body); - border-radius: 6px; - object-fit: contain; - object-position: center; - } -} -/******/ - -/* training pages */ -.training { - .exercise { - background: color-alternate(body); - } -} -.card-training { - margin-bottom: 30px; - width: 100%; -} -.training-card-body { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: left; - } - .training-text-container { - flex: 1; - margin-right: 20px; - } - .training-header { - display: flex; - justify-content: space-between; - } - .resources-container { - display: flex; - flex-wrap: wrap; - flex-direction: row; - gap: 10px; - } - .resource { - flex: 1; - background-color: on-color(active); - padding: 10px; - box-sizing: border-box; - } - .resource-links { - list-style-type: none; - margin-top: 5px; - padding: 0px !important; - margin-left: 0px !important; - } - .resource-links li { - margin-bottom: 5px; - } - .resource-links a { - text-decoration: underline; - } -/******/ - -// Decorative panels used for working-with-attack page - -.decorative-panels { - .decorative-panel { - // display: block; - .decorative-panel-header, .decorative-panel-body { padding: 10px; } - .decorative-panel-header { - h3, h4, .btn { - margin-bottom: 16px; - } - } - - .decorative-panel-body.show { - border-top: 1px solid border-color(body); - } - - - & + .decorative-panel { - margin-top: 25px; - } - - &:nth-of-type(even) { - border-radius: 8px; - background: color-alternate(body); - } - } - @media screen and (max-width: 47.9875rem) { - .row { - display: block; - &.collapse:not(.show) { - display: none; - } - } - } -} - -.working-with-attack { - .g-24 { gap: 24px; } - .g-12 { gap: 12px; } - .row.panels { - margin: 0; - } - img { - border-radius: .75em; - } - img.scale { - object-fit: cover; - object-position: left top; - border-radius: unset !important; - border: 1px solid border-color(body); - } - .panel { - padding: 0; - border: 1px solid border-color(body); - border-radius: .75em; - max-width: 100%; - } - img + .panel-body { - border-top: 1px solid border-color(body); - } - .panel-body { - p { - margin: 24px 0; - overflow: scroll; - } - &.fixed-height { - height: 30vh; - } - } - ul { - margin-bottom: 0; - } - @media screen and (max-width: 61.938rem) { - .panel-body { - &.fixed-height { - min-height: 40vh; - max-height: fit-content; - } - } - } - .table-of-contents { - position: static; - float: none; - width: 25%; - } -} - -.tip-box { - background: on-color(active); - padding: 1rem; -} - -/*Card Blocks*/ -// container of groups of cards -.expand-panel { - .card-block { - // style of card headers in collapsable cards in Getting Started and FAQ - .card-header { - - h5 { - @include font("Roboto-Regular"); - } - @include collapsible("after"); - - &:not(:last-child) { - border-bottom: none; - } - } - - // style of card titles in Related Projects - .card-title { - display: inline-block; - flex-grow: 1; - @include font("Roboto-Regular"); - } - - .first-card { - border-bottom: none; - border-radius: .25rem .25rem 0 0; - } - - .last-card { - border-radius: 0 0 .25rem .25rem; - } - - .middle-card { - border-bottom: none; - border-radius: 0; - } - } -} -/******/ - - -// Institutes page breaks when the user tries to print so that all the content gets printed out, not just the first page (if there is more than one page's -// worth of content) -@media print { - * { - overflow: visible !important; - break-before: always !important; - page-break-inside: avoid !important; - } -} \ No newline at end of file diff --git a/attack-theme/static/style/_matrix.scss b/attack-theme/static/style/_matrix.scss deleted file mode 100644 index 13b7e1cc600..00000000000 --- a/attack-theme/static/style/_matrix.scss +++ /dev/null @@ -1,334 +0,0 @@ -@import "./colors"; - -.matrix-container { - border: 1px solid border-color(body); - // border-top-width: 0; - background: color(body); - &+.matrix-container { - margin-top: to-rem(16); - } - - .matrix-border { - border-left: 1px solid border-color(body); - padding-left: 0.5rem; - display: flex; - justify-content: center; - align-items:center; - } - - .matrix-title { - border-bottom: 1px solid border-color(body); - margin-bottom: 1rem; - padding-bottom: 0.5rem; - } - .scroll-indicator-group { - white-space: nowrap; - display: flex; - .matrix-scroll-box { - flex-grow: 1; - display: inline-block; - } - .scroll-indicator { - width: 0px; - display: inline-block; - position: relative; - .cover { - width: 50px; - height: 100%; - position: absolute; - pointer-events: none; // doesn't prevent usage of things under the cover - } - //safari doesn't really work with transparent in gradients, but making something almost transparent works - $safari-transparent: rgba(255,255,255,0.001); - &.right { - .cover { right: 0; } - &.show .cover { - background: linear-gradient(to right, $safari-transparent, color(body)); - } - } - &.left { - .cover { left: 0; } - &.show .cover { - background: linear-gradient(to left, $safari-transparent, color(body)); - } - } - } - } -} - - - -$sizeunit: 14px; - -.matrix { - white-space: normal; - line-height: $sizeunit; - &.side { - // thead { - // background-color: color(matrix-header); - // color: on-color(matrix-header); - // } - // white-space: nowrap; - .tactic { - &:first-child { - padding: 2px 5px 2px 2px; - } - &:last-child { - padding: 2px 2px 2px 5px; - } - padding: 2px 5px; - width: 1%; - vertical-align: top; - // &:not(:last-child):not(.name, .count) { - // border-right: 1px solid border-color(body); - // } - &:hover:not(.name, .count) { - background: background-color(body); - // Apply background color to child when hovering - .sidebar.expanded .angle { - background: background-color(body); - } - } - &.name, &.count { - text-align: center; - font-size: $sizeunit + 2px; - } - &.name { - font-weight: bold; - } - &.count { - font-size: $sizeunit - 1px; - border-bottom: 1px solid black; - padding-bottom: 5px; - margin-bottom: 5px; - } - .techniques-table { - border-collapse: collapse; - width: 100%; - tr, td { - padding: 0; - } - tr { - height: 1px; - } - } - - .supertechnique { - border-collapse: collapse; - width: 100%; - padding: 0; - margin: 0; - - td { - padding: 0; - vertical-align: top; - - &.technique { - outline: 1px solid on-color-deemphasis(body); - outline-offset: -1px; - } - } - } - .subtechniques { - &.hidden { - display: none; - } - - // expand to entire height of row if it's smaller than supertechnique - display: flex; - flex-direction: column; - height: 100%; - - margin-left: -1px; - border-left: 2px solid on-color-deemphasis(body); - outline: 1px solid on-color-deemphasis(body); - outline-offset: -1px; - white-space: nowrap; - vertical-align: top; - - .subtechnique { - height: 100%; - flex-grow: 1; - } - } - - .handle { - text-align: center; - vertical-align: middle; - transform: rotate(-90deg); - color: color-alternate(body); - - width: 12px; height: 12px; - - font-size: 16px; - line-height: 12px; - - - } - - .sidebar { - min-width: 8px; - width: 12px; - - padding: 0; - background: on-color-deemphasis(body); - cursor: pointer; - position:relative; - vertical-align: middle; - .angle { - display: none; - } - &.expanded .angle { - margin: 0 auto; // internet explorer and edge compatability requires this for some reason - height: 12px; - display:block; - position: absolute; - background: color(body); - svg { - fill: on-color-deemphasis(body); - vertical-align: baseline; - } - &.top { - top: 0px; - } - &.bottom { - bottom: 0px; - } - } - } - } - } - &.flat { - .tactic { - margin-right: 5px; - width: 1%; - vertical-align: top; - - &.name, &.count { - text-align: center; - font-size: $sizeunit + 2px; - } - &.name { - font-weight: bold; - } - &.count { - font-size: $sizeunit - 1px; - border-bottom: 1px solid black; - padding-bottom: 5px; - margin-bottom: 5px; - } - - .subtechniques-row.hidden { - display: none; - } - .supertechnique { - border-collapse: collapse; - width: 100%; - padding: 0; - margin: 0; - td { - padding: 0; - vertical-align: top; - &.sidebar.technique { - min-width: 8px; - width: 12px; - padding: 0; - background: on-color-deemphasis(body); - cursor: pointer; - vertical-align: middle; - .handle { - text-align: center; - vertical-align: middle; - transform: rotate(-90deg); - color: color-alternate(body); - - width: 12px; height: 9px; - - font-size: 16px; - line-height: 12px; - } - } - &.sidebar.subtechniques { - svg { - fill: on-color-deemphasis(body); - vertical-align: baseline; - } - } - &.sidebar { - border-right: 2px solid on-color-deemphasis(body); - } - &.technique { - outline: 1px solid on-color-deemphasis(body); - outline-offset: -1px; - } - } - } - - .more-icon { - transition: all ease 0.125s; - vertical-align: top; - // TODO icon - transform: scale(0.5) rotate(-90deg); - width: 12px; height: 12px; - &.expanded { - transform: scale(0.5); - } - } - } - } - .technique-cell { - height: 100%; - display: flex; - align-items: center; - background-color: color(body); - - font-size: $sizeunit - 1px; - line-height: $sizeunit; - - a { - display: block; - width: 100%; - height: 100%; - padding: $sizeunit /2 3px; - } - - outline: 1px solid transparent; - outline-offset: -1px; - &:not(.colored):not(.supertechniquecell) { outline-color: border-color(body); } - } -} - - - -.matrix-controls { - margin: auto; - width: 50%; - padding: 1rem; - - button { - border-color: border-color(body); - background: color(body); - color: on-color(body); - &:hover { - background: color-alternate(body, 0.8); - } - } - .layout-button { - // active layout button should not use the .active style - // to prevent it looking like there's two active items in - // the menu when the user is clicking. Instead use the - // bootstrap hover style. - &:active { - color: #16181b; - text-decoration: none; - background-color: #f8f9fa; - } - } -} -.center-controls .matrix-controls .btn-toolbar { - justify-content: center; -} - -.btn-toolbar { - justify-content: center; -} \ No newline at end of file diff --git a/attack-theme/static/style/_nav.scss b/attack-theme/static/style/_nav.scss deleted file mode 100644 index 312388d8b26..00000000000 --- a/attack-theme/static/style/_nav.scss +++ /dev/null @@ -1,342 +0,0 @@ -@import "_layouts.scss"; - -/*Navigation styling*/ -// base style for nav-links in the top navigation bar (across the web site) -%ele-state { - border: to-rem(1) solid transparent; - border-top-left-radius: rem(-0.05); - border-top-right-radius: rem(-0.05); - text-decoration: underline; -} - -/*Top NAVIGATION*/ // top navigation bar across the web site -.navbar { - background-color: color(primary); - z-index: 1; - - // ATT&CK brand in the top navigation bar - .navbar-brand { - font-size: rem(1.7); - } - - .nav-tabs { - border-bottom: none; - - // list items - .nav-link { - color: on-color(primary); - @include font("Roboto-Light"); - - &:focus { - color: on-color(primary); - @extend %ele-state; - } - - &:hover:not(.active) { - color: on-color(primary); - background-color: transparent; - @extend %ele-state; - } - - &.active { - color: on-color(primary); - background-color: color(primary); - @extend %ele-state; - } - } - - .nav-item.show .nav-link { - color: on-color(primary); - background-color: color(primary); - border-color: transparent; - } - } - .search-button { - padding: .3rem to-rem(16); - font-size: 1rem; - border: to-rem(1) solid on-color(primary); - border-radius: .25rem; - color: on-color(primary); - line-height: to-rem(24); - - - opacity: 0.8; - - &:not(:has(.error-icon)):hover { opacity: 1;} - - .icon-button { - content: ""; - width: to-rem(24); - height: to-rem(24); - background-repeat: no-repeat; - display: inline-block; - vertical-align: middle; - background-position: center; - z-index: 1; - transition: all 0.2s ease; - } - - .search-icon { - cursor: pointer; - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg fill='#{escape-color(on-color(primary))}' xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E"); - } - - .error-icon { - cursor: default; - background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg fill='#{escape-color(on-color(primary))}' xmlns='http://www.w3.org/2000/svg' height='24' viewBox='0 96 960 960' width='24'%3e%3cpath d='M479.982 776q14.018 0 23.518-9.482 9.5-9.483 9.5-23.5 0-14.018-9.482-23.518-9.483-9.5-23.5-9.5-14.018 0-23.518 9.482-9.5 9.483-9.5 23.5 0 14.018 9.482 23.518 9.483 9.5 23.5 9.5ZM453 623h60V370h-60v253Zm27.266 353q-82.734 0-155.5-31.5t-127.266-86q-54.5-54.5-86-127.341Q80 658.319 80 575.5q0-82.819 31.5-155.659Q143 347 197.5 293t127.341-85.5Q397.681 176 480.5 176q82.819 0 155.659 31.5Q709 239 763 293t85.5 127Q880 493 880 575.734q0 82.734-31.5 155.5T763 858.316q-54 54.316-127 86Q563 976 480.266 976Zm.234-60Q622 916 721 816.5t99-241Q820 434 721.188 335 622.375 236 480 236q-141 0-240.5 98.812Q140 433.625 140 576q0 141 99.5 240.5t241 99.5Zm-.5-340Z'/%3e%3c/svg%3e"); - } - } -} -/******/ - -.nav, -.faq { - - /*NAVIGATION Dropdown*/ // dropdowns in top navigation bar - .dropdown:hover > .dropdown-menu { - display: block; - } - - .dropdown-menu { - background-color: color(primary); - - .dropdown-item { - color: on-color(primary); - - &:hover, - &:focus { - color: on-color(primary); - text-decoration: underline; - background-color: transparent; - } - } - } - /******/ - - /*Side NAVIGATION*/ - // bold list name for MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE - .heading { - font-size: rem(1.3); - color: on-color-deemphasis(body); - letter-spacing: to-rem(3); - pointer-events: none; - @media screen and (max-width: 74.938rem) { - pointer-events: all; - } - } - - .heading.collapsed .fa-chevron-up, - .heading .fa-chevron-down { - display: none; - } - - .heading.collapsed .fa-chevron-down, - .heading .fa-chevron-up { - display: inline-block; - } - - i.fa-solid { - visibility: hidden; - display: none; - @media screen and (max-width: 74.938rem) { - visibility: visible; - display: contents; - } - } - - .br-mobile { - display: none; - @media screen and (max-width: 74.938rem) { - display: inline-block; - } - } - - - // dropdown of the button in the side navigation. This button is in MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE - .heading-dropdown { - font-size: rem(0.9); - color: color(secondary); - letter-spacing: to-rem(3); - } - - border-color: border-color(body) !important; - - // smaller fon-size and letter spacin for phones and small tablets - @media screen and (max-width: 90.62rem) { - // bold list name for MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE - .heading { - font-size: rem(0.9); - color: on-color-deemphasis(body); - letter-spacing: to-rem(3); - } - - // dropdown of the button in the side navigation. This button is in MATRICES, TACTICS, TECHNIQUES, MITIGATIONS, GROUPS, and SOFTWARE - .heading-dropdown { - font-size: rem(0.7); - color: on-color(body); - letter-spacing: to-rem(1); - } - } - - /******/ - - // list items - .nav-link { - font-size: rem(0.7); - padding: rem(0) rem(0.7); - color: on-color-deemphasis(body); - - &.expand-title { - font-size: rem(0.8); - color: on-color(body); - } - - &.side { - padding: rem(0) rem(0); - word-break: break-word; - - &:hover { - background-color: color(primary); - color: on-color(primary); - } - - &.active { - color: color(primary); - background-color: color-alternate(body); - border-right: to-rem(3) solid color(primary); - } - } - } -} -/******/ - -.resizer { - width: 2px; - top: 0; - right: 0; - cursor: col-resize; - height: 100%; - position: absolute; - background-color: #dfdfdf; - } - - .data-sources-menu { - padding-top: 15px; - } - -.sidebar.nav { - // max-height: 60vh; - overflow-y: auto; - z-index: 0; //behind the header - min-width: min-content; - max-width: 20vw; - - // Remove overflow and sticky position for mobile view - @media screen and (max-width: 74.938rem) { - position: static; - min-width: fit-content; - } - - .sidenav-wrapper { - @media screen and (max-width: 74.938rem) { - display: block; - } - height: 100%; - display: flex; - flex-direction: column; - padding-right: 5px; - padding-left: 1rem; - .heading { - border-bottom: 1px solid color-alternate(body); - flex: 0 1 0; - } - .checkbox-div { - border-bottom: 1px solid color-alternate(body); - flex: 0 1 0; - } - .sidenav-list { - flex: 1 0 0; - overflow-y: auto; - .sidenav { - width: 100%; - word-break: break-word; - font-size: rem(0.8); - .sidenav-head { - display: flex; - flex-direction: row; - a, .expand-button { //any direct child - cursor: pointer; - color: black; - &:hover { - background: color-alternate(body); - } - } - a, span { - padding: rem(0); - padding-left: 0px; - display: inline-block; - flex-grow: 1; - height: 100%; - &:hover { - text-decoration: none; //disable underline - } - } - .expand-button { - padding: 5px; - border-left: 1px solid color-alternate(body); - display: inline-block; - @include collapsible("after"); - } - - &.active { //current page - &, &>a { - color: color(active) !important; - font-weight: bolder; - background: on-color(active); - font-family: "Roboto-Bold", sans-serif; - } - // background-color: color-alternate(body); - // border-right: to-rem(3) solid color(primary); - } - - } - .sidenav-body { - padding-left: 0.75rem; - } - .sidenav { //nested - padding-left: to-rem(12); - } - } - } - } -} - - -//Hides the navbar when the user tries to print out a page so that the page looks clean and only the relevant information is displayed - -@media print { - .nav { - visibility: hidden; - display:none; - } - .sidenav { - visibility: hidden; - display:none; - } - .sidebar.nav { - visibility: hidden; - display:none; - } - .sidenav-wrapper { - visibility: hidden; - display:none; - } - .side-nav-desktop-view { - visibility: hidden; - display:none; - } - .navbar { - visibility: hidden; - display:none; - } -} \ No newline at end of file diff --git a/attack-theme/static/style/_search.scss b/attack-theme/static/style/_search.scss deleted file mode 100644 index 25484493d0b..00000000000 --- a/attack-theme/static/style/_search.scss +++ /dev/null @@ -1,115 +0,0 @@ -@import '_colors.scss'; - -// highlight for found search words in preview and title -.search-word-found { - background: color(search-highlight); - color: on-color(search-highlight); -} - -.btn-group-text { - padding: .25rem, .5rem; - font-size: .875rem; - line-height: 1.5; - border-radius: .2rem; - border: 1px solid transparent; -} -.overlay.search { - position: fixed; - top: 0; left: 0; - width: 100%; height: 100%; - z-index: 1051; // header is 1050 and we need to overlay header - background: rgba(0,0,0,0.35); - padding: 50px; - - .overlay-inner { - border-radius: 25px; - background: color(body); - color: on-color(body); - width: 100%; - - display: flex; - flex-flow: column; - max-height: 100%; - - .search-header { - flex-shrink: 0; - position: relative; - .search-input { - padding: 10px; - input { - padding-left: 12.5px; - font-size: 25px; - line-height: 50px; - width: 100%; - border: 0; - background: color(body); - color: on-color(body); - &:focus { - outline: none; - } - - } - } - .search-icons { - position: absolute; - top: 0px; - right: 0px; - >div { - display: inline-block; - } - .search-parsing-icon { - height: 25px; - width: 25px; - margin-bottom: 8px; - opacity: 0.5; - } - .close-search-icon { - font-size: 50px; - width: 50px; line-height: 50px; - text-align: center; - margin: 10px; - - opacity: 0.8; - cursor: pointer; - &:hover { opacity: 1; } - } - } - - } - - .search-body { - flex: 1 1 auto; - padding: 0 50px; - border-top: 1px solid border-color(body); - margin-bottom: 25px; - overflow-y: auto; - - .results { - .search-result:first-child { - margin-top: 1.5rem; - } - } - .load-more-results { //button and stuff for showing more results - text-align: center; - } - - } - } -} - -.page-search { - float: right; - width: 50%; -} - -// internet explorer compatability override -@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { - .overlay.search .search-body { flex-basis: 50vh !important; } -} - -// mobile display search overrides -@media screen and (min-width: 1px) and (max-width: 767.8px) { - .search-input input { font-size: 20px !important; line-height: 25px !important; } - .close-search-icon { font-size: 25px !important; line-height: 25px !important; width: 25px !important; } - .search-parsing-icon { width: 14px !important; height: 14px !important; margin-bottom: 5px !important;} -} \ No newline at end of file diff --git a/attack-theme/static/style/_tour.scss b/attack-theme/static/style/_tour.scss deleted file mode 100644 index 697bd4a9519..00000000000 --- a/attack-theme/static/style/_tour.scss +++ /dev/null @@ -1,28 +0,0 @@ -@import "colors.scss"; -// .tour-backdrop { -// opacity: 0.3; -// position: fixed; -// } -.popover { - .popover-header { - background: color(primary); - color: on-color(primary); - } - - box-shadow: 0 0 5px 3px color(body); // give the popover a halo for readability - - //darker border - border-color: color(primary); - &.bs-popover-left .arrow::before { border-left-color: color(primary); } - &.bs-popover-right .arrow::before { border-right-color: color(primary); } - &.bs-popover-top .arrow::before { border-top-color: color(primary); } - &.bs-popover-bottom { - .arrow::before, .arrow::after, .popover-header::before { - border-bottom-color: color(primary); - } - } -} - -.tour-backdrop, .tour-highlight { //hide tour backdrop and highlight to prevent animations - opacity: 0; -} \ No newline at end of file diff --git a/attack-theme/static/style/_versioning.scss b/attack-theme/static/style/_versioning.scss deleted file mode 100644 index 54c1df682d3..00000000000 --- a/attack-theme/static/style/_versioning.scss +++ /dev/null @@ -1,16 +0,0 @@ -@import "_misc.scss"; - -.version-button { - // hide the option not in use - &.permalink .live { - display: none; - } - &.live .permalink { - display: none; - } -} -.version-table .table-break-row { - border-right-color: color(body); - border-left-color: color(body); - padding: 1rem 0; -} \ No newline at end of file diff --git a/attack-theme/static/style/style.scss b/attack-theme/static/style/style.scss deleted file mode 100644 index f1a6323fe59..00000000000 --- a/attack-theme/static/style/style.scss +++ /dev/null @@ -1 +0,0 @@ -@import "_colors.scss", "_matrix.scss", "_misc.scss", "_nav.scss", "_footer.scss", "_fonts.scss", "_layouts.scss", "_search.scss", "_versioning.scss", "_tour.scss"; diff --git a/attack-theme/static/style/bootstrap-select.min.css b/attack-theme/static/style/vendors/bootstrap-select.min.css similarity index 100% rename from attack-theme/static/style/bootstrap-select.min.css rename to attack-theme/static/style/vendors/bootstrap-select.min.css diff --git a/attack-theme/static/style/bootstrap-tourist.css b/attack-theme/static/style/vendors/bootstrap-tourist.css similarity index 100% rename from attack-theme/static/style/bootstrap-tourist.css rename to attack-theme/static/style/vendors/bootstrap-tourist.css diff --git a/attack-theme/static/style/bootstrap.min.css b/attack-theme/static/style/vendors/bootstrap.min.css similarity index 100% rename from attack-theme/static/style/bootstrap.min.css rename to attack-theme/static/style/vendors/bootstrap.min.css diff --git a/attack-theme/static/style/fontawesome-6.5.1/css/brands.min.css b/attack-theme/static/style/vendors/fontawesome-6.5.1/css/brands.min.css similarity index 100% rename from attack-theme/static/style/fontawesome-6.5.1/css/brands.min.css rename to attack-theme/static/style/vendors/fontawesome-6.5.1/css/brands.min.css diff --git a/attack-theme/static/style/fontawesome-6.5.1/css/fontawesome.min.css b/attack-theme/static/style/vendors/fontawesome-6.5.1/css/fontawesome.min.css similarity index 100% rename from attack-theme/static/style/fontawesome-6.5.1/css/fontawesome.min.css rename to attack-theme/static/style/vendors/fontawesome-6.5.1/css/fontawesome.min.css diff --git a/attack-theme/static/style/fontawesome-6.5.1/css/solid.min.css b/attack-theme/static/style/vendors/fontawesome-6.5.1/css/solid.min.css similarity index 100% rename from attack-theme/static/style/fontawesome-6.5.1/css/solid.min.css rename to attack-theme/static/style/vendors/fontawesome-6.5.1/css/solid.min.css diff --git a/attack-theme/static/style/fontawesome-6.5.1/webfonts/fa-brands-400.woff2 b/attack-theme/static/style/vendors/fontawesome-6.5.1/webfonts/fa-brands-400.woff2 similarity index 100% rename from attack-theme/static/style/fontawesome-6.5.1/webfonts/fa-brands-400.woff2 rename to attack-theme/static/style/vendors/fontawesome-6.5.1/webfonts/fa-brands-400.woff2 diff --git a/attack-theme/static/style/fontawesome-6.5.1/webfonts/fa-solid-900.woff2 b/attack-theme/static/style/vendors/fontawesome-6.5.1/webfonts/fa-solid-900.woff2 similarity index 100% rename from attack-theme/static/style/fontawesome-6.5.1/webfonts/fa-solid-900.woff2 rename to attack-theme/static/style/vendors/fontawesome-6.5.1/webfonts/fa-solid-900.woff2 diff --git a/attack-theme/templates/general/attack-index.html b/attack-theme/templates/general/attack-index.html index 7d2d63b83c3..f5be4ac7dbb 100644 --- a/attack-theme/templates/general/attack-index.html +++ b/attack-theme/templates/general/attack-index.html @@ -59,24 +59,26 @@ --> - -
+ + +

MITRE ATT&CK® is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations. The ATT&CK knowledge base is used as a foundation for the development of specific threat models and methodologies in the private sector, in government, and in the cybersecurity product and service community.

With the creation of ATT&CK, MITRE is fulfilling its mission to solve problems for a safer world — by bringing communities together to develop more effective cybersecurity. ATT&CK is open and available to any person or organization for use at no charge.

- + {% else %}

MITRE ATT&CK® is a globally-accessible knowledge base of adversary tactics and techniques based on real-world observations. The ATT&CK knowledge base is used as a foundation for the development of specific threat models and methodologies in the private sector, in government, and in the cybersecurity product and service community. diff --git a/attack-theme/templates/general/base-template.html b/attack-theme/templates/general/base-template.html index 2b3cd5e3ec6..7ca955c35de 100644 --- a/attack-theme/templates/general/base-template.html +++ b/attack-theme/templates/general/base-template.html @@ -33,16 +33,19 @@ {{ title }} - - - + + + - - - - {% assets "style/style.scss", filters="pyscss", output="style.min.css" %} - - {% endassets %} + + + + {% if ATTACK_BRANDING %} + + {% else %} + + {% endif %} + {% endblock %} @@ -109,7 +112,7 @@

- © 2015 - 2024, The MITRE Corporation. MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation. + © 2015 - 2025, The MITRE Corporation. MITRE ATT&CK and ATT&CK are registered trademarks of The MITRE Corporation.
diff --git a/attack-theme/templates/general/macro-technique-refinement.html b/attack-theme/templates/general/macro-technique-refinement.html new file mode 100644 index 00000000000..d44648f48c8 --- /dev/null +++ b/attack-theme/templates/general/macro-technique-refinement.html @@ -0,0 +1,1736 @@ + + + + + + {% include "general/google-analytics.html" %} + {% include "general/google-site-verification.html" %} + + + + + + + + + + + + Macrotechnique Refinement + + + + + + + +
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + + + + + + + diff --git a/data/resources_navigation.json b/data/resources_navigation.json index c266449492d..5a2ee05d3f4 100644 --- a/data/resources_navigation.json +++ b/data/resources_navigation.json @@ -125,6 +125,12 @@ "path": "/resources/versions/", "children": [] }, + { + "name": "Updates", + "id": "updates", + "path": "/resources/updates/", + "children": [] + }, { "name": "Legal & Branding", "id": "brand", diff --git a/modules/datasources/templates/datasource.html b/modules/datasources/templates/datasource.html index f6e5b33a6d4..a4d78681455 100644 --- a/modules/datasources/templates/datasource.html +++ b/modules/datasources/templates/datasource.html @@ -152,6 +152,9 @@

Data Components

{{parsed.name}}: {{datacomponent.name}}

+
+
+
{% if datacomponent.descr %}
{% if parsed.deprecated %} @@ -160,7 +163,6 @@

{{parsed.name}}: {{datacomponent.name}}

{{clean_output.stixToHTML(datacomponent.descr, parsed.citations)}}
{% endif %} -
diff --git a/modules/groups/groups.py b/modules/groups/groups.py index a0cc86bc066..302695e709a 100644 --- a/modules/groups/groups.py +++ b/modules/groups/groups.py @@ -1,7 +1,6 @@ import json import os from collections.abc import Iterable -from typing import List from loguru import logger @@ -404,7 +403,7 @@ def get_software_table_data(group, reference_list): return data, reference -def update_software_list(pairings: List, software_list: List, reference_list: List, reference: bool, id: str): +def update_software_list(pairings: list, software_list: list, reference_list: list, reference: bool, id: str): """Update the software list with the given pairings. This function iterates through the given pairings and updates the software list with @@ -413,11 +412,11 @@ def update_software_list(pairings: List, software_list: List, reference_list: Li Parameters ---------- - pairings : List + pairings : list A list of dictionaries that contain software and reference data. - software_list : List + software_list : list The list of software to be updated. - reference_list : List + reference_list : list The list of references to be updated. reference : bool Whether the reference section should be included. diff --git a/modules/resources/__init__.py b/modules/resources/__init__.py index 2a7d5b82f68..e1bd244cf5e 100644 --- a/modules/resources/__init__.py +++ b/modules/resources/__init__.py @@ -52,6 +52,12 @@ def get_menu(): "external_link": False, "children": [], }, + { + "display_name": "Updates", + "url": "/resources/updates/", + "external_link": False, + "children": [], + }, { "display_name": "Legal & Branding", "url": "/resources/legal-and-branding/", diff --git a/modules/resources/resources.py b/modules/resources/resources.py index e062b23165a..f79d78488c3 100644 --- a/modules/resources/resources.py +++ b/modules/resources/resources.py @@ -219,6 +219,39 @@ def generate_static_pages(): if not [key["module_name"] for key in modules.run_ptr if key["module_name"] == "versions"]: util.buildhelpers.remove_element_from_sub_menu(resources_config.module_name, "Version History") + + # Below code used to get a list of all updates children + updates_dict_list = {} + updates_name = [] + updates_path = [] + for static_page in os.listdir(static_pages_dir): + with open(os.path.join(static_pages_dir, static_page), "r", encoding="utf8") as md: + content = md.read() + if static_page.startswith("updates-"): + temp_string = static_page.replace(".md", "") + temp_string = temp_string.split("-") + temp_string = temp_string[1].capitalize() + " " + temp_string[2] + updates_name.append(temp_string) + temp_string = static_page.replace(".md", "") + updates_path.append("/resources/updates/" + temp_string + "/") + updates_name.sort(key=lambda date: datetime.strptime(date, "%B %Y"), reverse=True) + updates_path.sort(key=lambda date: datetime.strptime(date, "/resources/updates/updates-%B-%Y/"), reverse=True) + updates_dict_list["updates_name"] = updates_name + updates_dict_list["updates_path"] = updates_path + + # Below code used to add the updates children to the resources sidebar + updates_index = 0 + temp_dict = {} + for i in range(len(site_config.resource_nav["children"])): + if site_config.resource_nav["children"][i]["name"] == "Updates": + updates_index = i + + for i in range(len(updates_dict_list["updates_name"])): + temp_dict["name"] = updates_dict_list["updates_name"][i] + temp_dict["path"] = updates_dict_list["updates_path"][i] + temp_dict["children"] = [] + site_config.resource_nav["children"][updates_index]["children"].append(temp_dict.copy()) + temp_dict = {} for static_page in os.listdir(static_pages_dir): with open(os.path.join(static_pages_dir, static_page), "r", encoding="utf8") as md: diff --git a/modules/site_config.py b/modules/site_config.py index 5f37b60d204..58c618a3047 100644 --- a/modules/site_config.py +++ b/modules/site_config.py @@ -53,19 +53,19 @@ def send_to_pelican(key, value): - """Method to stage key value pairs for pelican use""" + """Stage key value pairs for pelican use.""" staged_pelican[key] = value def check_versions_module(): - """Return if versions module is loaded""" + """Return if versions module is loaded.""" if [key["module_name"] for key in modules.run_ptr if key["module_name"] == "versions"]: return True return False def check_resources_module(): - """Return if resources module is loaded""" + """Return if resources module is loaded.""" if [key["module_name"] for key in modules.run_ptr if key["module_name"] == "resources"]: return True return False @@ -115,7 +115,6 @@ def set_subdirectory(subdirectory_str): # Static style pelican files directory static_style_dir = os.path.join("attack-theme", "static", "style/") - # Link to instance of the ATT&CK Navigator; change for to a custom location navigator_link = "https://mitre-attack.github.io/attack-navigator/" diff --git a/modules/website_build/static_pages/macrotechnique-refinement.md b/modules/website_build/static_pages/macrotechnique-refinement.md new file mode 100644 index 00000000000..6bbf960a916 --- /dev/null +++ b/modules/website_build/static_pages/macrotechnique-refinement.md @@ -0,0 +1,3 @@ +Title: Macrotechnique Refinement +Template: general/macro-technique-refinement +save_as: macro-technique-refinement.html diff --git a/modules/website_build/static_pages/terms-of-use.md b/modules/website_build/static_pages/terms-of-use.md index aa566696e45..f4722b8709d 100644 --- a/modules/website_build/static_pages/terms-of-use.md +++ b/modules/website_build/static_pages/terms-of-use.md @@ -10,7 +10,7 @@ save_as: resources/legal-and-branding/terms-of-use/index.html The MITRE Corporation (MITRE) hereby grants you a non-exclusive, royalty-free license to use ATT&CK® for research, development, and commercial purposes. Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. -"© 2024 The MITRE Corporation. This work is reproduced and distributed with the permission of The MITRE Corporation." +"© 2025 The MITRE Corporation. This work is reproduced and distributed with the permission of The MITRE Corporation." #### DISCLAIMERS diff --git a/modules/website_build/website_build.py b/modules/website_build/website_build.py index b36e54c8fd7..cf58b5299b3 100644 --- a/modules/website_build/website_build.py +++ b/modules/website_build/website_build.py @@ -1,22 +1,25 @@ +import hashlib import json import os import shutil import subprocess -import hashlib from string import Template from loguru import logger import modules -from modules import matrices, site_config, util, resources +from modules import matrices, site_config, util from . import website_build_config def generate_website(): - """Function that generates base template for HTML pages, - generates the index page of the website and - runs pelican content to convert markdown pages into html + """Generate the website. + + This function: + - generates base template for HTML pages + - generates the index page of the website + - runs pelican content to convert markdown pages into html """ logger.info("Generating the website") # Create content pages directory if does not already exist @@ -36,9 +39,7 @@ def generate_website(): generate_static_pages() generate_changelog_page() store_pelican_settings() - override_colors() pelican_content() - reset_override_colors() # this is nice to have if you want to run pelican manually later # remove_pelican_settings() remove_unwanted_output() @@ -47,7 +48,7 @@ def generate_website(): def generate_uuid_from_seeds(content_version, website_version): """ Generate a UUID based on the given content_version and website_version. - + Args: - content_version (str): Semantic version of the content without a leading 'v'. - website_version (str): Semantic version of the website with a leading 'v'. @@ -56,15 +57,15 @@ def generate_uuid_from_seeds(content_version, website_version): - str: A UUID generated based on the two versions. """ # Combine and hash the values - seed = f"{content_version}-{website_version}".encode('utf-8') + seed = f"{content_version}-{website_version}".encode("utf-8") hashed_seed = hashlib.md5(seed).hexdigest() # Convert the first 32 characters of the hash to a UUID format - return '-'.join([hashed_seed[i:i+length] for i, length in zip([0, 8, 12, 16, 20], [8, 4, 4, 4, 12])]) + return "-".join([hashed_seed[i : i + length] for i, length in zip([0, 8, 12, 16, 20], [8, 4, 4, 4, 12])]) def generate_javascript_settings(): - """Creates javascript settings file that will be used to other javascript files""" + """Create JavaScript settings file that will be used to other JavaScript files.""" logger.info("Generating JavaScript settings.js") javascript_settings_file = os.path.join(site_config.javascript_path, "settings.js") @@ -74,7 +75,7 @@ def generate_javascript_settings(): if os.path.exists(javascript_settings_file): with open(javascript_settings_file, "r", encoding="utf8") as js_f: for line in js_f: - if not "base_url" in line and not "build_uuid" in line: + if "base_url" not in line and "build_uuid" not in line: # Copy line to data buffer data += line @@ -92,8 +93,8 @@ def generate_javascript_settings(): js_data = website_build_config.js_dir_settings.substitute({"web_directory": web_dir}) # Use the content and website versions as a seed for the build UUID to ensure that the UUID is idempotent. - CONTENT_VERSION = website_build_config.base_page_data['CONTENT_VERSION'] - WEBSITE_VERSION = website_build_config.base_page_data['WEBSITE_VERSION'] + CONTENT_VERSION = website_build_config.base_page_data["CONTENT_VERSION"] + WEBSITE_VERSION = website_build_config.base_page_data["WEBSITE_VERSION"] build_uuid = generate_uuid_from_seeds(CONTENT_VERSION, WEBSITE_VERSION) @@ -106,7 +107,7 @@ def generate_javascript_settings(): def generate_base_html(): - """Responsible for generating the header and footer of website pages""" + """Responsible for generating the header and footer of website pages.""" logger.info("Generating base.html from template") # Update navigation menu in the case that some module did not generate markdowns website_build_config.base_page_data["NAVIGATION_MENU"] = modules.menu_ptr @@ -136,28 +137,32 @@ def generate_base_html(): with open( os.path.join(website_build_config.template_dir, "base-template.html"), "r", encoding="utf8" - ) as base_template_f: - base_template = base_template_f.read() - base_template = Template(base_template) + ) as base_template_file: + base_template_str = base_template_file.read() + base_template = Template(base_template_str) subs = base_template.substitute(website_build_config.base_page_data) - with open(os.path.join(website_build_config.template_dir, "base.html"), "w", encoding="utf8") as base_template_f: - base_template_f.write(subs) + with open(os.path.join(website_build_config.template_dir, "base.html"), "w", encoding="utf8") as base_file: + base_file.write(subs) + def generate_sidebar_html(): - with open( - os.path.join(website_build_config.template_dir, "sidebar-resources-template.html"), "r", encoding="utf8" - ) as sidebar_template_f: - sidebar_template = sidebar_template_f.read() - sidebar_template = Template(sidebar_template) - subs = sidebar_template.substitute(website_build_config.sidebar_page_data) - - with open(os.path.join(website_build_config.template_dir, "sidebar-resources.html"), "w", encoding="utf8") as sidebar_template_f: - sidebar_template_f.write(subs) + """Create the sidebar html file.""" + with open( + os.path.join(website_build_config.template_dir, "sidebar-resources-template.html"), "r", encoding="utf8" + ) as sidebar_template_f: + sidebar_template = sidebar_template_f.read() + sidebar_template = Template(sidebar_template) + subs = sidebar_template.substitute(website_build_config.sidebar_page_data) + + with open( + os.path.join(website_build_config.template_dir, "sidebar-resources.html"), "w", encoding="utf8" + ) as sidebar_template_f: + sidebar_template_f.write(subs) def generate_index_page(): - """Responsible for creating the landing page""" + """Create the landing page.""" logger.info("Generating index page") data = {} @@ -201,65 +206,15 @@ def generate_index_page(): def store_pelican_settings(): - """Store pelican settings""" + """Store pelican settings.""" logger.info("Storing additional Pelican settings") pelican_settings_f = os.path.join(site_config.data_directory, "pelican_settings.json") with open(pelican_settings_f, "w", encoding="utf8") as json_f: json_f.write(json.dumps(site_config.staged_pelican)) -def override_colors(): - """Override colors scss file if attack brand flag is enabled""" - if site_config.args.attack_brand: - logger.info("Overriding colors for attack-brand") - colors_scss_f = os.path.join(site_config.static_style_dir, "_colors.scss") - - temp_file = "" - with open(colors_scss_f, "r", encoding="utf8") as colors_f: - lines = colors_f.readlines() - - end_search = True - for line in lines: - if end_search and line.startswith("//$use_attack_them"): - temp_file += line[2:] - elif end_search and line.startswith("// end search"): - end_search = False - temp_file += line - else: - temp_file += line - - with open(colors_scss_f, "w", encoding="utf8") as colors_f: - colors_f.write(temp_file) - - -def reset_override_colors(): - """Reset override colors scss file if attack brand flag is enabled""" - if site_config.args.attack_brand: - logger.info("Resetting override colors for using attack-brand") - colors_scss_f = os.path.join(site_config.static_style_dir, "_colors.scss") - - temp_file = "" - with open(colors_scss_f, "r", encoding="utf8") as colors_f: - lines = colors_f.readlines() - - end_search = True - for line in lines: - if end_search and line.startswith("$use_attack_them"): - temp_file += "//" + line - elif end_search and line.startswith("// end search"): - end_search = False - temp_file += line - else: - temp_file += line - - with open(colors_scss_f, "w", encoding="utf8") as colors_f: - colors_f.write(temp_file) - - def generate_changelog_page(): - """Responsible for compiling original changelog markdown into changelog markdown file - for rendering on the HTML - """ + """Responsible for compiling original changelog markdown into changelog markdown file for rendering on the HTML.""" logger.info("Generating Changelog page") current_changelog = None # Read local changelog @@ -302,7 +257,7 @@ def pelican_content(): def remove_pelican_settings(): - """Remove pelican settings""" + """Remove pelican settings.""" logger.info("Removing additional Pelican settings") pelican_settings_f = os.path.join(site_config.data_directory, "pelican_settings.json") if os.path.isfile(pelican_settings_f): @@ -310,7 +265,7 @@ def remove_pelican_settings(): def remove_unwanted_output(): - """Remove unwanted files from the output directory""" + """Remove unwanted files from the output directory.""" logger.info("Removing unwanted files from the output directory") # Files to be deleted: # archives.html, authors.html, categories.html, tags.html, @@ -349,9 +304,7 @@ def remove_unwanted_output(): def generate_static_pages(): - """Reads markdown files from the static pages directory and copies them into - the markdown directory - """ + """Read markdown files from the static pages directory and copies them into the markdown directory.""" logger.info("Generating static pages") # Verify if content/pages directory exists if not os.path.isdir(website_build_config.website_build_markdown_path): diff --git a/pelicanconf.py b/pelicanconf.py index a829b30bd6d..4c74492c07b 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -1,18 +1,16 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # from __future__ import unicode_literals + import os # Need to update path with current directory in order to -# read file with custom jinja filters +# read file with custom jinja filters import sys + sys.path.append('.') import custom_jinja_filters -# import plugins -PLUGIN_PATHS = ['plugins'] -PLUGINS = ['assets'] - AUTHOR = os.environ.get('PELICAN_AUTHOR', 'MITRE') SITENAME = os.environ.get('PELICAN_SITENAME', 'ATT&CK') SITEURL = os.environ.get('PELICAN_SITEURL', '') diff --git a/plugins/assets/README.rst b/plugins/assets/README.rst deleted file mode 100644 index 1e92e545b45..00000000000 --- a/plugins/assets/README.rst +++ /dev/null @@ -1,106 +0,0 @@ -Asset management ----------------- - -This plugin allows you to use the `Webassets`_ module to manage assets such as -CSS and JS files. The module must first be installed:: - - pip install webassets - -The Webassets module allows you to perform a number of useful asset management -functions, including: - -* CSS minifier (``cssmin``, ``yui_css``, ...) -* CSS compiler (``less``, ``sass``, ...) -* JS minifier (``uglifyjs``, ``yui_js``, ``closure``, ...) - -Others filters include CSS URL rewriting, integration of images in CSS via data -URIs, and more. Webassets can also append a version identifier to your asset -URL to convince browsers to download new versions of your assets when you use -far-future expires headers. Please refer to the `Webassets documentation`_ for -more information. - -When used with Pelican, Webassets is configured to process assets in the -``OUTPUT_PATH/theme`` directory. You can use Webassets in your templates by -including one or more template tags. The Jinja variable ``{{ ASSET_URL }}`` can -be used in templates and is relative to the ``theme/`` url. The -``{{ ASSET_URL }}`` variable should be used in conjunction with the -``{{ SITEURL }}`` variable in order to generate URLs properly. For example: - -.. code-block:: jinja - - {% assets filters="cssmin", output="css/style.min.css", "css/inuit.css", "css/pygment-monokai.css", "css/main.css" %} - - {% endassets %} - -... will produce a minified css file with a version identifier that looks like: - -.. code-block:: html - - - -These filters can be combined. Here is an example that uses the SASS compiler -and minifies the output: - -.. code-block:: jinja - - {% assets filters="sass,cssmin", output="css/style.min.css", "css/style.scss" %} - - {% endassets %} - -Another example for Javascript: - -.. code-block:: jinja - - {% assets filters="uglifyjs", output="js/packed.js", "js/jquery.js", "js/base.js", "js/widgets.js" %} - - {% endassets %} - -The above will produce a minified JS file: - -.. code-block:: html - - - -Pelican's debug mode is propagated to Webassets to disable asset packaging -and instead work with the uncompressed assets. - -If you need to create named bundles (for example, if you need to compile SASS -files before minifying with other CSS files), you can use the ``ASSET_BUNDLES`` -variable in your settings file. This is an ordered sequence of 3-tuples, where -the 3-tuple is defined as ``(name, args, kwargs)``. This tuple is passed to the -`environment's register() method`_. The following will compile two SCSS files -into a named bundle, using the ``pyscss`` filter: - -.. code-block:: python - - ASSET_BUNDLES = ( - ('scss', ['colors.scss', 'main.scss'], {'filters': 'pyscss'}), - ) - -Many of Webasset's available compilers have additional configuration options -(i.e. 'Less', 'Sass', 'Stylus', 'Closure_js'). You can pass these options to -Webassets using the ``ASSET_CONFIG`` in your settings file. - -The following will handle Google Closure's compilation level and locate -LessCSS's binary: - -.. code-block:: python - - ASSET_CONFIG = (('closure_compressor_optimization', 'WHITESPACE_ONLY'), - ('less_bin', 'lessc.cmd'), ) - -If you wish to place your assets in locations other than the theme output -directory, you can use ``ASSET_SOURCE_PATHS`` in your settings file to provide -webassets with a list of additional directories to search, relative to the -theme's top-level directory: - -.. code-block:: python - - ASSET_SOURCE_PATHS = [ - 'vendor/css', - 'scss', - ] - -.. _Webassets: https://github.com/miracle2k/webassets -.. _Webassets documentation: http://webassets.readthedocs.org/en/latest/builtin_filters.html -.. _environment's register() method: http://webassets.readthedocs.org/en/latest/environment.html#registering-bundles \ No newline at end of file diff --git a/plugins/assets/__init__.py b/plugins/assets/__init__.py deleted file mode 100644 index 2d56709e666..00000000000 --- a/plugins/assets/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .assets import * \ No newline at end of file diff --git a/plugins/assets/assets.py b/plugins/assets/assets.py deleted file mode 100644 index e204dd65d85..00000000000 --- a/plugins/assets/assets.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Asset management plugin for Pelican -=================================== - -This plugin allows you to use the `webassets`_ module to manage assets such as -CSS and JS files. - -The ASSET_URL is set to a relative url to honor Pelican's RELATIVE_URLS -setting. This requires the use of SITEURL in the templates:: - - - -.. _webassets: https://webassets.readthedocs.org/ - -""" -from __future__ import unicode_literals - -import os -import logging - -from pelican import signals -logger = logging.getLogger(__name__) - -try: - import webassets - from webassets import Environment - from webassets.ext.jinja2 import AssetsExtension -except ImportError: - webassets = None - -def add_jinja2_ext(pelican): - """Add Webassets to Jinja2 extensions in Pelican settings.""" - - if 'JINJA_ENVIRONMENT' in pelican.settings: # pelican 3.7+ - pelican.settings['JINJA_ENVIRONMENT']['extensions'].append(AssetsExtension) - else: - pelican.settings['JINJA_EXTENSIONS'].append(AssetsExtension) - - -def create_assets_env(generator): - """Define the assets environment and pass it to the generator.""" - - theme_static_dir = generator.settings['THEME_STATIC_DIR'] - assets_destination = os.path.join(generator.output_path, theme_static_dir) - generator.env.assets_environment = Environment( - assets_destination, theme_static_dir) - - if 'ASSET_CONFIG' in generator.settings: - for item in generator.settings['ASSET_CONFIG']: - generator.env.assets_environment.config[item[0]] = item[1] - - if 'ASSET_BUNDLES' in generator.settings: - for name, args, kwargs in generator.settings['ASSET_BUNDLES']: - generator.env.assets_environment.register(name, *args, **kwargs) - - if 'ASSET_DEBUG' in generator.settings: - generator.env.assets_environment.debug = generator.settings['ASSET_DEBUG'] - elif logging.getLevelName(logger.getEffectiveLevel()) == "DEBUG": - generator.env.assets_environment.debug = True - - for path in (generator.settings['THEME_STATIC_PATHS'] + - generator.settings.get('ASSET_SOURCE_PATHS', [])): - full_path = os.path.join(generator.theme, path) - generator.env.assets_environment.append_path(full_path) - - -def register(): - """Plugin registration.""" - if webassets: - signals.initialized.connect(add_jinja2_ext) - signals.generator_init.connect(create_assets_env) - else: - logger.warning('`assets` failed to load dependency `webassets`.' - '`assets` plugin not loaded.') diff --git a/requirements.txt b/requirements.txt index ad03bce8f90..8eeef5b83fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,15 +5,13 @@ colorama==0.4.6 future==1.0.0 loguru==0.7.2 mitreattack-python==3.0.8 -pelican==4.8.0 -pyScss==1.4.0 +pelican==4.10.2 python-dotenv==1.0.1 requests==2.32.3 stix2==3.0.1 stix2-validator==3.2.0 toml==0.10.2 towncrier==24.7.1 -webassets==2.0 # dev dependencies black==24.3.0