diff --git a/.github/workflows/brokenLinkCheck.yml b/.github/workflows/brokenLinkCheck.yml new file mode 100644 index 000000000..f86aaef38 --- /dev/null +++ b/.github/workflows/brokenLinkCheck.yml @@ -0,0 +1,18 @@ +name: Check for broken links + +# https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/ + +on: + push: + branches: + - main + +jobs: + + markdown-link-check: + + name: Check for broken links + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: gaurav-nelson/github-action-markdown-link-check@v1 diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml new file mode 100644 index 000000000..002209a49 --- /dev/null +++ b/.github/workflows/markdownlint.yml @@ -0,0 +1,33 @@ +name: Checking Markdown For Errors + +# https://github.blog/2020-08-03-github-actions-improvements-for-fork-and-pull-request-workflows/ + +on: + push: + branches: + - main + - 2.5.x + tags-ignore: + - '**' + + pull_request: + branches: + - main + types: + - open + - synchronize + - reopen + +jobs: + markdownlint: + runs-on: ubuntu-latest + steps: + + - name: Check out code + uses: actions/checkout@v2 + + - name: Run markdownlint-cli + uses: Confectrician/github-action-markdown-cli@v2.0.0 + with: + files: . + config_file: ".markdownlint.yaml" diff --git a/.github/workflows/rebase.yml b/.github/workflows/rebase.yml deleted file mode 100644 index c63426a01..000000000 --- a/.github/workflows/rebase.yml +++ /dev/null @@ -1,18 +0,0 @@ -on: - issue_comment: - types: [created] -name: Automatic Rebase -jobs: - rebase: - name: Rebase - if: github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase') - runs-on: ubuntu-latest - steps: - - name: Checkout the latest code - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - name: Automatic Rebase - uses: cirrus-actions/rebase@1.3.1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 4ddd9cc6d..fd7b917e9 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ project.pbxproj docs addons/integrations vuepress +.DS_Store diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 000000000..cd61b2ece --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,27 @@ +default: true + +# Expect dash usage for unorderd lists +MD004: + style: dash + +# Allow long line lengths +MD013: false + +# Allow duplicate headers for different nesting +MD024: + allow_different_nesting: true + +# Allow Multiple top level headers in the same document +MD025: false + +# Allow trailing punctuation in headers +MD026: false +MD029: + style: one + +# Allow inline HTML +MD033: false + +# Code block style +MD046: + style: fenced diff --git a/.vuepress/add_placeholders.rb b/.vuepress/add_placeholders.rb index 4445600cf..2735c6677 100644 --- a/.vuepress/add_placeholders.rb +++ b/.vuepress/add_placeholders.rb @@ -1,30 +1,34 @@ -# This function will add placeholders for pages that are out of scope of the docs preview - -def add_placeholder_pages() - puts ">>> Adding placeholder pages for preview" - [ - "docs/configuration/iconsets/classic", - "docs/configuration/ui/habmin", - "docs/configuration/ui/habot", - "docs/configuration/ui/basic", - "docs/configuration/ui/classic", - "docs/ecosystem/alexa", - "docs/ecosystem/google-assistant", - "docs/ecosystem/ifttt", - "docs/ecosystem/mycroft", - "addons/integrations/homekit", - "docs/apps/android.md" - ].each { |path| - puts " -> #{path}" - page = path - if (!(path =~ /\.md/)) then - FileUtils.mkdir_p(path) - page = path + "/readme.md" - end - File.open(page, "w+") { |f| - f.puts "# This content is unavailable" - f.puts "" - f.puts "This content is migrated from another repository, and is not included in this preview." - } - } -end +# This function will add placeholders for pages that are out of scope of the docs preview + +def add_placeholder_pages() + puts ">>> Adding placeholder pages for preview" + [ + "addons/integrations/homekit", + "addons/integrations/openhabcloud", + "docs/apps/android.md", + "docs/configuration/habpanel", + "docs/configuration/iconsets/classic", + "docs/ui/components", + "docs/ui/habpanel", + "docs/ui/habpanel/habpanel.md", + "docs/ui/habot", + "docs/ui/basic", + "docs/ecosystem/alexa", + "docs/ecosystem/google-assistant", + "docs/ecosystem/ifttt", + "docs/ecosystem/mycroft", + "docs/installation/openhabian.md" + ].each { |path| + puts " -> #{path}" + page = path + if (!(path =~ /\.md/)) then + FileUtils.mkdir_p(path) + page = path + "/readme.md" + end + File.open(page, "w+") { |f| + f.puts "# This content is unavailable" + f.puts "" + f.puts "This content is migrated from another repository, and is not included in this preview." + } + } +end diff --git a/.vuepress/docs-sidebar.js b/.vuepress/docs-sidebar.js index 894b85e40..be6603e65 100644 --- a/.vuepress/docs-sidebar.js +++ b/.vuepress/docs-sidebar.js @@ -7,7 +7,7 @@ module.exports = [ ] }, { - title: 'Beginner Tutorial', + title: 'Getting Started', collapsable: false, children: [ ['tutorial/', 'Tutorial Overview'], @@ -17,6 +17,10 @@ module.exports = [ 'tutorial/things_advanced', 'tutorial/model', 'tutorial/persistence', + 'tutorial/pages_intro', + 'tutorial/auto_overview', + 'tutorial/item_widgets', + 'tutorial/custom_widgets', /*'tutorial/pages_intro', 'tutorial/pages_widgets', 'tutorial/pages_types', @@ -26,6 +30,22 @@ module.exports = [ 'tutorial/example'*/ ] }, + { + title: 'Installation Guide', + collapsable: false, + children: [ + 'installation/', + ['installation/linux', 'Linux'], + ['installation/windows', 'Windows'], + ['installation/macos', 'macOS'], + 'installation/openhabian', + 'installation/armbian', + 'installation/docker', + 'installation/synology', + // 'installation/qnap', // Remove until we get feedback about the current package state + ['installation/security', 'Security'] + ] + }, { title: 'Concepts', collapsable: false, @@ -38,32 +58,15 @@ module.exports = [ 'concepts/units-of-measurement', // from v2.3 onwards ] }, - { - title: 'Installation Guide', - collapsable: false, - children: [ - 'installation/', - ['installation/linux', 'Linux'], - ['installation/windows', 'Windows'], - ['installation/macos', 'macOS'], - 'installation/openhabian', - 'installation/rasppi', - 'installation/armbian', - 'installation/docker', - 'installation/synology', - // 'installation/qnap', // Remove until we get feedback about the current package state - ['installation/security', 'Security'] - ] - }, { title: 'Configuration Guide', collapsable: false, children: [ ['configuration/', 'Configuration Overview'], + 'configuration/editors', 'configuration/addons', 'configuration/things', 'configuration/items', - 'configuration/sitemaps', 'configuration/persistence', 'configuration/rules-dsl', 'configuration/transformations', @@ -72,25 +75,40 @@ module.exports = [ 'configuration/jsr223', 'configuration/services', 'configuration/multimedia', + ['configuration/restdocs', 'REST API'], + ['configuration/apitokens', 'API Token Generation'], ['configuration/migration/', 'Migration from openHAB 2'] ] }, { - title: 'Interfaces and Ecosystem', + title: 'User Interface Guide', collapsable: false, children: [ - 'configuration/editors', - ['configuration/ui/habot/', 'HABot'], - 'configuration/habpanel', - ['configuration/ui/basic/', 'Basic UI'], + 'ui/', + 'ui/sitemaps', + 'ui/layout-pages', + 'ui/map-pages', + 'ui/floorplan-pages', + 'ui/tabbed-pages', + 'ui/chart-pages', + ['ui/building-pages', 'Building Pages'], + ['ui/components/', 'Component Reference'], + 'ui/habpanel/habpanel', ['apps/android', 'Android App'], 'apps/ios', - 'apps/windows', + 'apps/windows' + ] + }, + { + title: 'Ecosystem', + collapsable: false, + children: [ ['ecosystem/alexa/', 'Amazon Alexa'], ['ecosystem/google-assistant/', 'Google Assistant'], // from v2.3 onwards ['../addons/integrations/homekit/', 'Apple HomeKit'], // ['ecosystem/ifttt/', 'IFTTT'], // Temporary remove until service gets reactivated ['ecosystem/mycroft/', 'Mycroft.AI'], + ['../addons/integrations/openhabcloud/', 'openHAB Cloud'], ] }, { diff --git a/.vuepress/process_file.rb b/.vuepress/process_file.rb index a37d163cd..24d0a1a2e 100644 --- a/.vuepress/process_file.rb +++ b/.vuepress/process_file.rb @@ -57,24 +57,18 @@ def process_file(indir, file, outdir, source) addon_type = outdir_parts[1] addon = file.split('/')[0] source = "" - if addon == "habmin" then - puts " (add-on is habmin)" - source = "https://github.com/openhab/org.openhab.ui.habmin/blob/master/README.md" - elsif addon == "habpanel" then + if addon == "habpanel" then puts " (add-on is habpanel)" - source = "https://github.com/openhab/org.openhab.ui.habpanel/blob/master/README.md" + source = "https://github.com/openhab/openhab-webui/blob/main/bundles/org.openhab.ui.habpanel/README.md" elsif addon == "zigbee" then puts " (add-on is zigbee)" - source = "https://github.com/openhab/org.openhab.binding.zigbee/blob/master/org.openhab.binding.zigbee/README.md" + source = "https://github.com/openhab/org.openhab.binding.zigbee/blob/main/org.openhab.binding.zigbee/README.md" elsif addon == "zwave" && !(file =~ /things/) then puts " (add-on is zwave)" - source = "https://github.com/openhab/org.openhab.binding.zwave/blob/master/README.md" - elsif $esh_features.include?("esh-#{addon_type}-#{addon.gsub('.', '-')}") then - puts " (add-on is from ESH)" - source = "https://github.com/eclipse/smarthome/blob/master/extensions/#{addon_type}/org.eclipse.smarthome.#{addon_type}.#{addon}/README.md" + source = "https://github.com/openhab/org.openhab.binding.zwave/blob/main/README.md" elsif !(file =~ /things/) then puts " (add-on is from openhab-addons)" - source = "https://github.com/openhab/openhab-addons/blob/master/addons/#{addon_type}/org.openhab.#{addon_type}.#{addon}/README.md" + source = "https://github.com/openhab/openhab-addons/blob/main/addons/#{addon_type}/org.openhab.#{addon_type}.#{addon}/README.md" end out.puts "source: #{source}" if source != "" diff --git a/.vuepress/process_main_docs.rb b/.vuepress/process_main_docs.rb index 5c12b4128..8a8e7beab 100644 --- a/.vuepress/process_main_docs.rb +++ b/.vuepress/process_main_docs.rb @@ -3,7 +3,7 @@ require_relative "./process_file.rb" def process_main_docs(docs_source_dir) puts ">>> Migrating the introduction article" - process_file(".", "introduction.md", "docs", "https://github.com/openhab/openhab-docs/blob/master/introduction.md") + process_file(".", "introduction.md", "docs", "https://github.com/openhab/openhab-docs/blob/main/introduction.md") FileUtils.mv("docs/introduction.md", "docs/readme.md") @@ -95,15 +95,13 @@ def process_main_docs(docs_source_dir) puts ">>> Migrating the UI section" - Dir.glob("#{docs_source_dir}/_addons_uis/**") { |path| - next if path =~ /habpanel/ || path =~ /paper/ # Those already have their own article, no need to include the readme... - addon = File.basename(path) - puts " -> #{addon}" - FileUtils.mkdir_p("docs/configuration/ui/" + addon) - process_file("#{docs_source_dir}/_addons_uis", addon + "/readme.md", "docs/configuration/ui", "") - puts " -> images (#{addon})" - FileUtils.cp_r("#{docs_source_dir}/_addons_uis/#{addon}/doc", "docs/configuration/ui/#{addon}") if Dir.exists?("#{docs_source_dir}/_addons_uis/#{addon}/doc") + Dir.glob("#{docs_source_dir}/ui/*.md") { |path| + file = File.basename(path) + puts " -> #{file}" + process_file("#{docs_source_dir}/ui", file, "docs/ui", "#{$docs_repo_root}/ui/#{file}") } + puts " -> images" + FileUtils.cp_r("#{docs_source_dir}/ui/images", "docs/ui/images") diff --git a/.vuepress/public/apple-icon.png b/.vuepress/public/apple-icon.png index f5d659b87..1a626af0e 100644 Binary files a/.vuepress/public/apple-icon.png and b/.vuepress/public/apple-icon.png differ diff --git a/.vuepress/public/logo-white.png b/.vuepress/public/logo-white.png index 96cf4741f..224c85b6d 100644 Binary files a/.vuepress/public/logo-white.png and b/.vuepress/public/logo-white.png differ diff --git a/.vuepress/public/og-image.png b/.vuepress/public/og-image.png index d64b94d10..9bf1cf643 100644 Binary files a/.vuepress/public/og-image.png and b/.vuepress/public/og-image.png differ diff --git a/.vuepress/public/openhab-logo-square.png b/.vuepress/public/openhab-logo-square.png index da0eb36c7..bd3c9fd28 100644 Binary files a/.vuepress/public/openhab-logo-square.png and b/.vuepress/public/openhab-logo-square.png differ diff --git a/.vuepress/public/openhab-logo-top.png b/.vuepress/public/openhab-logo-top.png index 5c5a2a899..163046362 100644 Binary files a/.vuepress/public/openhab-logo-top.png and b/.vuepress/public/openhab-logo-top.png differ diff --git a/.vuepress/public/openhab-logo.png b/.vuepress/public/openhab-logo.png index cd6346381..6866da7b3 100644 Binary files a/.vuepress/public/openhab-logo.png and b/.vuepress/public/openhab-logo.png differ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 542461de4..f70b08df8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,12 +1,12 @@ # Contribution Guidelines -### Pull requests are always welcome +## Pull requests are always welcome We are always thrilled to receive pull requests, and do our best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! We will appreciate it. -### Conventions +## Conventions Fork the repo and make changes on your fork in a feature branch. @@ -28,7 +28,7 @@ comment. Commits that fix or close an issue should include a reference like `Closes #XXX` or `Fixes #XXX`, which will automatically close the issue when merged. -### Sign your work +## Sign your work The sign-off is a simple line at the end of the explanation for the patch, which certifies that you wrote it or otherwise have the right to @@ -36,7 +36,7 @@ pass it on as an open-source patch. The rules are pretty simple: if you can certify the below (from [developercertificate.org](https://developercertificate.org/)): -``` +```text Developer Certificate of Origin Version 1.1 @@ -77,19 +77,19 @@ By making a contribution to this project, I certify that: then you just add a line to every git commit message: - Signed-off-by: Joe Smith +`Signed-off-by: Joe Smith ` using your real name (sorry, no pseudonyms or anonymous contributions.) and an e-mail address under which you can be reached (sorry, no github noreply e-mail addresses (such as username@users.noreply.github.com) or other non-reachable addresses are allowed). -#### Small patch exception +### Small patch exception There are several exceptions to the signing requirement. Currently these are: -* Your patch fixes spelling or grammar errors. -* Your patch is a single line change to documentation. +- Your patch fixes spelling or grammar errors. +- Your patch is a single line change to documentation. ## Community Guidelines @@ -97,22 +97,21 @@ We want to keep the openHAB community awesome, growing and collaborative. We need your help to keep it that way. To help with this we've come up with some general guidelines for the community as a whole: -* Be nice: Be courteous, respectful and polite to fellow community members: no +- Be nice: Be courteous, respectful and polite to fellow community members: no regional, racial, gender, or other abuse will be tolerated. We like nice people way better than mean ones! -* Encourage diversity and participation: Make everyone in our community +- Encourage diversity and participation: Make everyone in our community feel welcome, regardless of their background and the extent of their contributions, and do everything possible to encourage participation in our community. -* Keep it legal: Basically, don't get us in trouble. Share only content that +- Keep it legal: Basically, don't get us in trouble. Share only content that you own, do not share private or sensitive information, and don't break the law. -* Stay on topic: Make sure that you are posting to the correct channel +- Stay on topic: Make sure that you are posting to the correct channel and avoid off-topic discussions. Remember when you update an issue or respond to an email you are potentially sending to a large number of people. Please consider this before you update. Also remember that nobody likes spam. - diff --git a/README.md b/README.md index 5752eca19..63b4990bb 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ We will read about them later. Correct, this is done in the original repository of the add-on. You may want to know how to find the right file in all of those repos? This is fairly easy: -on most of the documentation pages on https://openhab.org/, +on most of the documentation pages on , you will find the following link at the bottom, which will point you directly to the file you want to improve. ![Contribution link to a specific page](./images/contribution_link.png) @@ -96,4 +96,4 @@ In short, the following has to be considered: - Versions like "2.1.0" are marked by git tags. - Based on tags branches like "2.1-patch" are created, to include later discovered changes (like fixed links). -When a version is tagged (or updated), a static version of the website has to be generated and copied into the correct sub-folder, this is currently a manual operation described succinctly here: https://github.com/openhab/website/issues/72 +When a version is tagged (or updated), a static version of the website has to be generated and copied into the correct sub-folder, this is currently a manual operation described succinctly here: diff --git a/_addons_automation/groovyscripting/readme.md b/_addons_automation/groovyscripting/readme.md index 3a9cd1089..70d186d57 100644 --- a/_addons_automation/groovyscripting/readme.md +++ b/_addons_automation/groovyscripting/readme.md @@ -3,7 +3,7 @@ id: groovyscripting label: Groovy Scripting title: Groovy Scripting - Automation type: automation -description: "This add-on provides support for [Groovy](https://groovy-lang.org/) 3.x scripts in openHAB." +description: "This add-on provides support for [Groovy](https://groovy-lang.org/) 3.0.7 that can be used as a scripting language within automation rules and which eliminates the need to manually install Groovy." since: 3x install: auto --- @@ -14,4 +14,44 @@ install: auto # Groovy Scripting -This add-on provides support for [Groovy](https://groovy-lang.org/) 3.x scripts in openHAB. +This add-on provides support for [Groovy](https://groovy-lang.org/) 3.0.7 that can be used as a scripting language within automation rules and which eliminates the need to manually install Groovy. + +## Creating Groovy Scripts + +When this add-on is installed, you can select Groovy as a scripting language when creating a script action within the rule editor of the UI. + +Alternatively, you can create scripts in the `automation/jsr223` configuration directory. +If you create an empty file called `test.groovy`, you will see a log line with information similar to: + +```text + ... [INFO ] [.a.m.s.r.i.l.ScriptFileWatcher:150 ] - Loading script 'test.groovy' +``` + +To enable debug logging, use the [console logging]({{base}}/administration/logging.html) commands to enable debug logging for the automation functionality: + +```text +log:set DEBUG org.openhab.core.automation +``` + +For more information on the available APIs in scripts see the [JSR223 Scripting]({{base}}/configuration/jsr223.html) documentation. + +## Script Examples + +Groovy scripts provide access to almost all the functionality in an openHAB runtime environment. +As a simple example, the following script logs "Hello, World!". +Note that `System.out.println` will usually not work since the output has no terminal to display the text. +The openHAB server uses the [SLF4J](https://www.slf4j.org/) library for logging. + +```groovy +import org.slf4j.LoggerFactory + +LoggerFactory.getLogger("org.openhab.core.automation.examples").info("Hello world!") +``` + +Depending on the openHAB logging configuration, you may need to prefix logger names with `org.openhab.core.automation` for them to show up in the log file (or you modify the logging configuration). + +The script uses the [LoggerFactory](https://www.slf4j.org/apidocs/org/slf4j/Logger.html) to obtain a named logger and then logs a message like: + +```text + ... [INFO ] [.openhab.core.automation.examples:-2 ] - Hello world! +``` diff --git a/_addons_automation/jythonscripting/readme.md b/_addons_automation/jythonscripting/readme.md index 23b3c6fd7..963a0d8cb 100644 --- a/_addons_automation/jythonscripting/readme.md +++ b/_addons_automation/jythonscripting/readme.md @@ -3,7 +3,7 @@ id: jythonscripting label: Jython Scripting title: Jython Scripting - Automation type: automation -description: "This addon provides a [Jython](https://www.jython.org/) 2.7.2 for use with scripted automation and eliminates the need to download Jython and create `EXTRA_JAVA_OPTS` entries for `bootclasspath`, `python.home` and `python.path`." +description: "This add-on provides [Jython](https://www.jython.org/) 2.7.2 that can be used as a scripting language within automation rules and which eliminates the need to download Jython and create `EXTRA_JAVA_OPTS` entries for `bootclasspath`, `python.home` and `python.path`." since: 3x install: auto --- @@ -14,6 +14,57 @@ install: auto # Jython Scripting -This addon provides a [Jython](https://www.jython.org/) 2.7.2 for use with scripted automation and eliminates the need to download Jython and create `EXTRA_JAVA_OPTS` entries for `bootclasspath`, `python.home` and `python.path`. -The `python.home` System property will be set to the path of the add-on. -The `python.path` System property will be set to `$OPENHAB_CONF/automation/lib/python`, but any existing `python.path` will be appended to it. +This add-on provides [Jython](https://www.jython.org/) 2.7.2 that can be used as a scripting language within automation rules and which eliminates the need to download Jython and create `EXTRA_JAVA_OPTS` entries for `bootclasspath`, `python.home` and `python.path`. + +The `python.home` system property is set to the path of the add-on. + +The `python.path` system property is set to `$OPENHAB_CONF/automation/lib/python`, but any existing `python.path` will be appended to it. + +## Creating Jython Scripts + +When this add-on is installed, you can select Jython as a scripting language when creating a script action within the rule editor of the UI. + +Alternatively, you can create scripts in the `automation/jsr223` configuration directory. +If you create an empty file called `test.py`, you will see a log line with information similar to: + +```text + ... [INFO ] [.a.m.s.r.i.l.ScriptFileWatcher:150 ] - Loading script 'test.py' +``` + +To enable debug logging, use the [console logging]({{base}}/administration/logging.html) commands to +enable debug logging for the automation functionality: + +```text +log:set DEBUG org.openhab.core.automation +``` + +## Script Examples + +Jython scripts provide access to almost all the functionality in an openHAB runtime environment. +As a simple example, the following script logs "Hello, World!". +Note that `print` will usually not work since the output has no terminal to display the text. +The openHAB server uses the [SLF4J](https://www.slf4j.org/) library for logging. + +```python +from org.slf4j import LoggerFactory + +LoggerFactory.getLogger("org.openhab.core.automation.examples").info("Hello world!") +``` + +Jython can [import Java classes](https://jython.readthedocs.io/en/latest/ModulesPackages/). +Depending on the openHAB logging configuration, you may need to prefix logger names with `org.openhab.core.automation` for them to show up in the log file (or you modify the logging configuration). + +::: tip Note +Be careful with using wildcards when importing Java packages (e.g., `import org.slf4j.*`). +This will work in some cases, but it might not work in some situations. +It is best to use explicit imports with Java packages. +For more details, see the Jython documentation on +[Java package scanning](https://jython.readthedocs.io/en/latest/ModulesPackages/#java-package-scanning). +::: + +The script uses the [LoggerFactory](https://www.slf4j.org/apidocs/org/slf4j/Logger.html) +to obtain a named logger and then logs a message like: + +```text + ... [INFO ] [.openhab.core.automation.examples:-2 ] - Hello world! +``` diff --git a/_addons_bindings/alarmdecoder/readme.md b/_addons_bindings/alarmdecoder/readme.md index b779b8184..9485d0c6d 100644 --- a/_addons_bindings/alarmdecoder/readme.md +++ b/_addons_bindings/alarmdecoder/readme.md @@ -3,7 +3,7 @@ id: alarmdecoder label: Alarm Decoder title: Alarm Decoder - Bindings type: binding -description: "The [Alarm Decoder](http://www.alarmdecoder.com) from Nu Tech Software Solutions is a hardware adapter that interfaces with Ademco/Honeywell and DSC alarm panels." +description: "The [Alarm Decoder](https://www.alarmdecoder.com) from Nu Tech Software Solutions is a hardware adapter that interfaces with Ademco/Honeywell and DSC alarm panels." since: 3x logo: images/addons/alarmdecoder.png install: auto @@ -15,10 +15,10 @@ install: auto # Alarm Decoder Binding -The [Alarm Decoder](http://www.alarmdecoder.com) from Nu Tech Software Solutions is a hardware adapter that interfaces with Ademco/Honeywell and DSC alarm panels. +The [Alarm Decoder](https://www.alarmdecoder.com) from Nu Tech Software Solutions is a hardware adapter that interfaces with Ademco/Honeywell and DSC alarm panels. It acts essentially like a keypad, reading and writing messages on the serial bus that connects keypads with the main panel. -There are several versions of the adapter available: +There are several versions of the adapter available: * *AD2PI* or *AD2PHAT* - A board that plugs into a Raspberry Pi and offers network-based TCP connectivity * *AD2SERIAL* - Attaches to a host via a serial port @@ -27,8 +27,6 @@ There are several versions of the adapter available: This binding allows openHAB to access the state of wired or wireless contacts and motion detectors connected to supported alarm panels, as well as the state of attached keypads and the messages send to attached LRR devices. Support is also available for sending keypad commands, including special/programmable keys supported by your panel. -For those upgrading from the OH1 version of the binding, the [original OH1 README](https://www.openhab.org/v2.5/addons/bindings/alarmdecoder1/) file is available for reference. - ## Supported Things The binding supports the following thing types: @@ -191,8 +189,8 @@ Thing config file example: ### lrr The `lrr` thing reports messages sent to a Long Range Radio (LRR) or emulated LRR device. -These are normally specifically formatted messages as described in the [SIA DC-05-1999.09](http://www.alarmdecoder.com/wiki/index.php/File:SIA-ContactIDCodes_Protocol.pdf) standard for Contact ID reporting. -They can also, depending on configuration, be other types of messages as described [here](http://www.alarmdecoder.com/wiki/index.php/LRR_Support). +These are normally specifically formatted messages as described in the [SIA DC-05-1999.09](https://www.alarmdecoder.com/wiki/index.php/File:SIA-ContactIDCodes_Protocol.pdf) standard for Contact ID reporting. +They can also, depending on configuration, be other types of messages as described [here](https://www.alarmdecoder.com/wiki/index.php/LRR_Support). For panels that support multiple partitions, the partition for which a given lrr thing will receive messages can be defined. * `partition` (default = 0) Partition for which to receive LRR events (0 = All) @@ -326,3 +324,7 @@ The alarmdecoder device cannot query the panel for the state of individual zones For this reason, the binding puts contacts into the "unknown" state (UNDEF), *until the panel goes into the READY state*. At that point, all contacts for which no update messages have arrived are presumed to be in the CLOSED state. In other words: to get to a clean slate after an openHAB restart, close all doors/windows such that the panel is READY. + +## Reference Information + +The protocol used to communicate with the Alarm Decoder is described [here](https://www.alarmdecoder.com/wiki/index.php/Protocol). diff --git a/_addons_bindings/allplay/readme.md b/_addons_bindings/allplay/readme.md index acb8955e8..fbc6248db 100644 --- a/_addons_bindings/allplay/readme.md +++ b/_addons_bindings/allplay/readme.md @@ -33,7 +33,7 @@ If there is need for another architecture/platform, please open a [ticket on Git ## Supported Things All AllPlay compatible speakers are supported by this binding. -This includes for example the [Panasonic ALL series](http://www.panasonic.com/uk/consumer/home-entertainment/wireless-speaker-systems.html). +This includes for example the [Panasonic ALL series](https://www.panasonic.com/uk/consumer/home-entertainment/wireless-speaker-systems.html). All AllPlay speakers are registered as an audio sink in the framework. ## Discovery diff --git a/_addons_bindings/amazondashbutton/readme.md b/_addons_bindings/amazondashbutton/readme.md index 5ffb84fd7..4e06b8f35 100644 --- a/_addons_bindings/amazondashbutton/readme.md +++ b/_addons_bindings/amazondashbutton/readme.md @@ -90,9 +90,9 @@ A few known operating systems are: ## Setup Dash Button -Setting up your Dash Button is as simple as following the instructions provided by [Amazon](https://www.amazon.com/Dash-Buttons/b?node=10667898011) **EXCEPT FOR THE LAST STEP**. -Follow the instructions to set up the Dash Button in their mobile app. -When you get to the step where it asks you to pick which product you want to map it to, just quit the setup process. +Amazon itself doesn't support Dash Buttons anymore. +Instructions how to use them without having to rely on Amazon's servers can be found at https://blog.christophermullins.com/2019/12/20/rescue-your-amazon-dash-buttons/ - at least for some firmware versions. +Take care to block internet access for the button or it will be bricked. {: #no-phonehome} ## Preventing Communication with Amazon Servers diff --git a/_addons_bindings/amazonechocontrol/readme.md b/_addons_bindings/amazonechocontrol/readme.md index db5ff0e18..82d2481ee 100644 --- a/_addons_bindings/amazonechocontrol/readme.md +++ b/_addons_bindings/amazonechocontrol/readme.md @@ -180,7 +180,7 @@ It will be configured at runtime by using the save channel to store the current | radioStationId | String | R/W | echo, echoshow, echospot, wha | Start playing of a TuneIn radio station by specifying its id or stops playing if an empty string was provided | radio | Switch | R/W | echo, echoshow, echospot, wha | Start playing of the last used TuneIn radio station (works after the radio station started after the openHAB start) | amazonMusicTrackId | String | R/W | echo, echoshow, echospot, wha | Start playing of an Amazon Music track by its id or stops playing if an empty string was provided -| amazonMusicPlayListId | String | W | echo, echoshow, echospot, wha | Write Only! Start playing of an Amazon Music playlist by specifying its id or stops playing if an empty string was provided. Selection will only work in PaperUI +| amazonMusicPlayListId | String | W | echo, echoshow, echospot, wha | Write Only! Start playing of an Amazon Music playlist by specifying its id or stops playing if an empty string was provided. | amazonMusic | Switch | R/W | echo, echoshow, echospot, wha | Start playing of the last used Amazon Music song (works after at least one song was started after the openHAB start) | remind | String | R/W | echo, echoshow, echospot | Write Only! Speak the reminder and sends a notification to the Alexa app (Currently the reminder is played and notified two times, this seems to be a bug in the Amazon software) | nextReminder | DateTime | R | echo, echoshow, echospot | Next reminder on the device @@ -363,7 +363,7 @@ sitemap amazonechocontrol label="Echo Devices" // Change the Place holder with the MAC address shown, if Alexa is connected to the device Selection item=Echo_Living_Room_BluetoothMAC mappings=[ ''='Disconnected', ''='Bluetooth Device 1', ''='Bluetooth Device 2'] - // These are only view of the possible options. Enable ShowIDsInGUI in the binding configuration and look in drop-down-box of this channel in the Paper UI Control section + // These are only view of the possible options. Selection item=Echo_Living_Room_PlayAlarmSound mappings=[ ''='None', 'ECHO:system_alerts_soothing_01'='Adrift', 'ECHO:system_alerts_atonal_02'='Clangy'] Switch item=Echo_Living_Room_Bluetooth @@ -444,7 +444,7 @@ sitemap flashbriefings label="Flash Briefings" ## Smart Home Devices -Note: the cannels of smartHomeDevices and smartHomeDeviceGroup will be created dynamically based on the capabilities reported by the amazon server. This can take a little bit of time. +Note: the channels of smartHomeDevices and smartHomeDeviceGroup will be created dynamically based on the capabilities reported by the amazon server. This can take a little bit of time. The polling interval configured in the Account Thing to get the state is specified in minutes and has a minimum of 10. This means it takes up to 10 minutes to see the state of a channel. The reason for this low interval is, that the polling causes a big server load for the Smart Home Skills. #### Supported Things @@ -461,11 +461,11 @@ The polling interval configured in the Account Thing to get the state is specifi |--------------------------|---------------------------------------------------------------------------| | id | The id of the device or device group | -The only possibility to find out the id is by using the discover function in the PaperUI. You can use then the id, if you want define the Thing in a file. +The only possibility to find out the id is by using the discover function in the UI. You can use then the id, if you want define the Thing in a file. #### Channels -The channels of the smarthome devices will be generated at runtime. Check in the paperUI thing configurations, which channels are created. +The channels of the smarthome devices will be generated at runtime. Check in the UI thing configurations, which channels are created. | Channel Type ID | Item Type | Access Mode | Thing Type | Description |--------------------------|-----------|-------------|-------------------------------|------------------------------------------------------------------------------------------ @@ -520,7 +520,7 @@ Switch Arm_State "State" { channel="amazonechocontrol:smartHomeDevice:account1:s Switch Group_State "On/Off" { channel="amazonechocontrol:smartHomeDeviceGroup:account1:smartHomeDeviceGroup1:powerState" } ``` -The only possibility to find out the id for the smartHomeDevice and smartHomeDeviceGroup Things is by using the discover function in the PaperUI. +The only possibility to find out the id for the smartHomeDevice and smartHomeDeviceGroup Things is by using the discover function. #### smarthome.sitemap: diff --git a/_addons_bindings/autelis/readme.md b/_addons_bindings/autelis/readme.md index b6e6e4d15..a729c16d7 100644 --- a/_addons_bindings/autelis/readme.md +++ b/_addons_bindings/autelis/readme.md @@ -16,12 +16,12 @@ install: auto # Autelis Pool Control Binding Autelis manufactures a network enabled pool interface for many popular pool systems. -See [the Autelis website](https://www.autelis.com) and the [Autelis Command Protocol](http://www.autelis.com/wiki/index.php?title=Pool_Control_(PI)_HTTP_Command_Reference) for more information. +See [the Autelis website](https://www.autelis.com) and the [Autelis Command Protocol](https://www.autelis.com/wiki/index.php?title=Pool_Control_(PI)_HTTP_Command_Reference) for more information. This binding supports: * Jandy and Pentair models -* Read circuit, auxiliary, temperature, pump, chemistry and system values +* Read circuit, auxiliary, temperature, pump, chemistry and system values * Control circuit, auxiliary lighting scenes, and temperature set points diff --git a/_addons_bindings/bigassfan/readme.md b/_addons_bindings/bigassfan/readme.md index 46aa2f53f..52d9d0491 100644 --- a/_addons_bindings/bigassfan/readme.md +++ b/_addons_bindings/bigassfan/readme.md @@ -46,7 +46,7 @@ In the event that any of this information is changed on the device, the thing co ### Manual Thing Creation -Fans and lights can be manually created in the *Paper UI* or *HABmin*, or by placing a *.things* file in the *conf/things* directory. +Fan and light things can be manually created using the *UI*, or by placing a *.things* file in the *conf/things* directory. See example below. ## Device Discovery diff --git a/_addons_bindings/bluetooth.enoceanble/readme.md b/_addons_bindings/bluetooth.enoceanble/readme.md index 4c5ab5b8e..c50426d1d 100644 --- a/_addons_bindings/bluetooth.enoceanble/readme.md +++ b/_addons_bindings/bluetooth.enoceanble/readme.md @@ -71,4 +71,4 @@ demo.items: ``` Dimmer Light_LivingRoom { channel="milight:rgbLed:milight2:4:ledbrightness", channel="bluetooth:ptm215b:bluegiga0:rocker_livingroom:rocker1" [profile="rawrocker-to-on-off"], channel="bluetooth:ptm215b:bluegiga0:rocker_kitchen:rocker1" [profile="rawrocker-to-on-off"] } // We have a combined kitchen / livingroom, so we control the living room lights with switches from the living room and from the kitchen Switch Light_Kitchen { channel="hue:group:1:kitchen-bulbs:switch", channel="bluetooth:ptm215b:bluegiga0:rocker_kitchen:rocker2" [profile="rawrocker-to-on-off"] } -``` \ No newline at end of file +``` diff --git a/_addons_bindings/bluetooth/readme.md b/_addons_bindings/bluetooth/readme.md index df10a7c71..b0403f0be 100644 --- a/_addons_bindings/bluetooth/readme.md +++ b/_addons_bindings/bluetooth/readme.md @@ -87,4 +87,4 @@ sitemap demo label="Main Menu" See also the following extensions for further examples: - \ No newline at end of file + diff --git a/_addons_bindings/bsblan/readme.md b/_addons_bindings/bsblan/readme.md index 095eec209..5c8ad992c 100644 --- a/_addons_bindings/bsblan/readme.md +++ b/_addons_bindings/bsblan/readme.md @@ -3,8 +3,9 @@ id: bsblan label: BSB-LAN title: BSB-LAN - Bindings type: binding -description: "This binding uses the REST API of [BSB-LPB-PPS-LAN](https://github.com/fredlcore/bsb_lan) to obtain data from the device." +description: "This binding uses the REST API of [BSB-LPB-PPS-LAN](https://github.com/fredlcore/BSB-LAN) to obtain data from the device." since: 3x +logo: images/addons/bsblan.png install: auto --- @@ -14,7 +15,7 @@ install: auto # BSB-LAN Binding -This binding uses the REST API of [BSB-LPB-PPS-LAN](https://github.com/fredlcore/bsb_lan) to obtain data from the device. +This binding uses the REST API of [BSB-LPB-PPS-LAN](https://github.com/fredlcore/BSB-LAN) to obtain data from the device. ## Supported Things diff --git a/_addons_bindings/bticinosmarther/readme.md b/_addons_bindings/bticinosmarther/readme.md index 00228e389..1d8cbdedf 100644 --- a/_addons_bindings/bticinosmarther/readme.md +++ b/_addons_bindings/bticinosmarther/readme.md @@ -5,6 +5,7 @@ title: BTicinoSmarther - Bindings type: binding description: "The BTicino Smarther binding implements a bridge to the Legrand/BTicino Smarther v2.0 API and allows you to control your BTicino Smarther chronothermostat units with openHAB, making it possible to discover Smarther units connected to your Legrand/BTicino Smarther account." since: 3x +logo: images/addons/bticinosmarther.png install: auto --- @@ -126,7 +127,7 @@ If you want to later receive push notifications (device status) from Legrand for ![Tutorial 3](doc/images/tutorial-3.png) -Now that you have got your bridge _ONLINE_ it is time to discover your devices! Go to Paper UI Inbox and search for **"BTicino Smarther Chronothermostat"** things. +Now that you have got your bridge _ONLINE_ it is time to discover your devices! Go to Inbox in the UI and search for **"BTicino Smarther Chronothermostat"** things. Any BTicino Smarther Chronothermostat device currently available on your account should show up immediately. If no devices show up you may have to trigger the openHAB discovery several times as bridge will only find active devices known by the Smarther API at the time the discovery is triggered. diff --git a/_addons_bindings/buienradar/readme.md b/_addons_bindings/buienradar/readme.md index 75b0eebce..650619a77 100644 --- a/_addons_bindings/buienradar/readme.md +++ b/_addons_bindings/buienradar/readme.md @@ -34,7 +34,7 @@ No auto-discovery is currently possible. ## Configuration of the thing -The configuration can be done via the Paper UI web interface, or manually by adding a Thing to your `.things` file: +The configuration can be done by adding a Rain Forecast Thing using the UI, or by adding it to a `.things` file: ``` Thing buienradar:rain_forecast:home [ location="52.198864211111925,5.4192629660193585" ] diff --git a/_addons_bindings/caddx/readme.md b/_addons_bindings/caddx/readme.md index 615c5d10b..27c1b62f8 100644 --- a/_addons_bindings/caddx/readme.md +++ b/_addons_bindings/caddx/readme.md @@ -361,4 +361,4 @@ then actions.bypass() end -``` \ No newline at end of file +``` diff --git a/_addons_bindings/cbus/readme.md b/_addons_bindings/cbus/readme.md index 085deba52..431735c11 100644 --- a/_addons_bindings/cbus/readme.md +++ b/_addons_bindings/cbus/readme.md @@ -3,7 +3,7 @@ id: cbus label: C-Bus title: C-Bus - Bindings type: binding -description: "This is the binding for the [Clipsal C-Bus System](http://www2.clipsal.com/cis/technical/product_groups/cbus)." +description: "This is the binding for the [Clipsal C-Bus System](https://www.clipsal.com/products/c-bus-control-and-management-system)." since: 3x install: auto --- @@ -14,36 +14,41 @@ install: auto # C-Bus Binding -This is the binding for the [Clipsal C-Bus System](http://www2.clipsal.com/cis/technical/product_groups/cbus). +This is the binding for the [Clipsal C-Bus System](https://www.clipsal.com/products/c-bus-control-and-management-system). This binding allows you to view and control groups on C-Bus networks from openHAB. ## Configuration -This binding connects to C-Gate software which can be downloaded from the [Clipsal Downloads Site](https://updates.clipsal.com/ClipsalSoftwareDownload/mainsite/cis/technical/index.html). There is information about setting up the C-Gate software in the [CBus Forums](https://www.cbusforums.com/forums/c-bus-toolkit-and-c-gate-software.4). Make sure that the config/access.txt file allows a connection from computer running openHAB. +This binding connects to C-Gate software which can be downloaded from the [Clipsal Downloads Site](https://updates.clipsal.com/ClipsalSoftwareDownload/mainsite/cis/technical/index.html). +There is information about setting up the C-Gate software in the [CBus Forums](https://www.cbusforums.com/forums/c-bus-toolkit-and-c-gate-software.4). +Make sure that the config/access.txt file allows a connection from computer running openHAB. -Whilst all versions of C-Gate should work 2.11.2 contained a fix for handling Indicator Kill messages for trigger groups. Without that they will remain on the last value set and wont match what is shown on CBus devices. +Whilst all versions of C-Gate should work 2.11.2 contained a fix for handling Indicator Kill messages for trigger groups. +Without that they will remain on the last value set and wont match what is shown on CBus devices. First the CGate Connection bridge needs to be configured with the ip address of the computer running the C-Gate software. -After this a Bridge is creaed for each network configured on the CBus Network. The CBus Project Name and the network Id for that network +After this a Bridge is creaed for each network configured on the CBus Network. The CBus Project Name and the network Id for that network ## Supported Things This binding support 6 different things types -| Thing | Type | Description | -|----------------|---------|-----------------------------------| -| cgate | Bridge | This connects to a C-Bus CGate instance to | -| network | Bridge | This connects to a C-Bus Network via a CGate bridge | -| light | Thing | This is for C-Bus lighting groups | -| temperature | Thing | This is for C-Bus temperature groups | -| trigger | Thing | This is for C-Bus trigger groups | -| dali | Thing | This is for C-Bus DALI dimming groups | +| Thing | Type | Description | +|-------------|--------|-----------------------------------------------------| +| cgate | Bridge | This connects to a C-Bus CGate instance to | +| network | Bridge | This connects to a C-Bus Network via a CGate bridge | +| light | Thing | This is for C-Bus lighting groups | +| temperature | Thing | This is for C-Bus temperature groups | +| trigger | Thing | This is for C-Bus trigger groups | +| dali | Thing | This is for C-Bus DALI dimming groups | + +When a discovery scan is started in the UI, Things are discovered for the groups that are found on the CBus network. -The scan within Paper UI will find all the groups on the CBus network and allow Things to be creaed for them. ##Channels -At startup the binding will scan the network for the values of all the groups and set those on the appropriate channels. It is not possible to fetch the value of a Trigger Group so those values will only be updated when a trigger is set on the CBus network. +At startup the binding will scan the network for the values of all the groups and set those on the appropriate channels. +It is not possible to fetch the value of a Trigger Group so those values will only be updated when a trigger is set on the CBus network. ### Lights @@ -121,6 +126,3 @@ sitemap cbusdemo label="CBus Binding Demo" } } ``` - - - diff --git a/_addons_bindings/comfoair/readme.md b/_addons_bindings/comfoair/readme.md index d9c969e4a..8c25318b2 100644 --- a/_addons_bindings/comfoair/readme.md +++ b/_addons_bindings/comfoair/readme.md @@ -5,6 +5,7 @@ title: ComfoAir - Bindings type: binding description: "This binding allows to monitor and control Zehnder ComfoAir serial controlled ventilation systems via RS232 serial connection." since: 3x +logo: images/addons/comfoair.png install: auto --- @@ -18,6 +19,8 @@ This binding allows to monitor and control Zehnder ComfoAir serial controlled ve Though the binding is developed based on the protocol description for Zehnder ComfoAir devices it should also work for mostly identical systems from different manufacturers, like StorkAir WHR930, Wernig G90-380 and Paul Santos 370 DC. It was also successfully tested on a Wernig G90-160. +**NOTE:** This binding does not work with the ComfoAir Q-series (e.g. Q350 or Q450). These ventilation units use a CAN bus for communication and a different protocol. + ### Limitations * Either the ComfoAir binding or the CCEase Comfocontrol can be active, but not together. diff --git a/_addons_bindings/danfossairunit/readme.md b/_addons_bindings/danfossairunit/readme.md index dc1f63b5c..b6fc48c00 100644 --- a/_addons_bindings/danfossairunit/readme.md +++ b/_addons_bindings/danfossairunit/readme.md @@ -61,12 +61,13 @@ These are the available configuration parameters: ### Things -Suppose your autodiscovered air unit is identified by the id "danfossairunit:airunit:-1062731769" (see section "Discovery"). +Suppose your autodiscovered air unit is identified by the id "danfossairunit:airunit:myairunit" (see section "Discovery"). The channel will then be identified by `:#` You can also manually configure your air unit in case you don't want to use autodiscovery (e. g. if you want to have a portable configuration): -Create a new file, e. g. `danfoss.things`, in your _things_ configuration folder: +Create a new file, e. g. `danfoss.things`, in your _things_ configuration folder: + ``` Thing danfossairunit:airunit:myairunit [host="192.168.0.7", refreshInterval=5, @@ -76,12 +77,12 @@ updateUnchangedValuesEveryMillis=30000] ### Items ``` -Dimmer Lueftung_Drehzahl_Manuell "Drehzahl Lüftung %" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:main#manual_fan_speed"} -Number Lueftung_Drehzahl_Supply "Drehzahl Lüftung Zuluft (rpm)" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:main#supply_fan_speed"} -Number Lueftung_Drehzahl_Extract "Drehzahl Lüftung Abluft (rpm)" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:main#extract_fan_speed"} -String Lueftung_Mode "Betriebsart Lüftung" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:main#mode"} -Switch Lueftung_Boost "Stoßlüftung" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:main#boost"} -Switch Lueftung_Bypass "Lüftung Bypass" (All,Lueftung) {channel = "danfossairunit:airunit:-1062731769:recuperator#bypass"} +Dimmer Lueftung_Drehzahl_Manuell "Drehzahl Lüftung %" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:main#manual_fan_speed"} +Number Lueftung_Drehzahl_Supply "Drehzahl Lüftung Zuluft (rpm)" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:main#supply_fan_speed"} +Number Lueftung_Drehzahl_Extract "Drehzahl Lüftung Abluft (rpm)" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:main#extract_fan_speed"} +String Lueftung_Mode "Betriebsart Lüftung" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:main#mode"} +Switch Lueftung_Boost "Stoßlüftung" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:main#boost"} +Switch Lueftung_Bypass "Lüftung Bypass" (All,Lueftung) {channel = "danfossairunit:airunit:myairunit:recuperator#bypass"} ``` ### Sitemap @@ -93,4 +94,4 @@ Text item=Lueftung_Drehzahl_Extract Selection item=Lueftung_Mode mappings=[DEMAND="Bedarfslüftung", OFF="Aus", PROGRAM="Programm", MANUAL="manuell"] Switch item=Lueftung_Boost Switch item=Lueftung_Bypass -``` \ No newline at end of file +``` diff --git a/_addons_bindings/denonmarantz/readme.md b/_addons_bindings/denonmarantz/readme.md index a8815c384..ffe0c10d5 100644 --- a/_addons_bindings/denonmarantz/readme.md +++ b/_addons_bindings/denonmarantz/readme.md @@ -58,7 +58,7 @@ The DenonMarantz AVR supports the following channels (some channels are model sp | Channel Type ID | Item Type | Description | |-------------------------|--------------|--------------| | *General* | | -| general#power | Switch (RW) | Power on/off +| general#power | Switch (RW) | Power on/off | general#surroundProgram | String (R) | current surround program (e.g. STEREO) | general#artist | String (R) | artist of current track | general#album | String (R) | album of current track @@ -82,7 +82,7 @@ The DenonMarantz AVR supports the following channels (some channels are model sp | zone3#volumeDB | Number (RW) | Zone 3 volume in dB (-80 offset) | zone3#mute | Switch (RW) | Zone 3 mute | zone3#input | String (RW) | Zone 3 input -| *Zone 4* | | +| *Zone 4* | | | zone4#power | Switch (RW) | Zone 4 power on/off | zone4#volume | Dimmer (RW) | Zone 4 volume | zone4#volumeDB | Number (RW) | Zone 4 volume in dB (-80 offset) @@ -136,5 +136,4 @@ These resources can be useful to learn what to send using the `command`channel: - [AVR-X2000/E400](http://www2.aerne.com/Public/dok-sw.nsf/0c6187bc750a16fcc1256e3c005a9740/96a2ba120706d10dc1257bdd0033493f/$FILE/AVRX2000_E400_PROTOCOL(10.1.0)_V04.pdf) - [AVR-X4000](https://usa.denon.com/us/product/hometheater/receivers/avrx4000?docname=AVRX4000_PROTOCOL(10%203%200)_V03.pdf) - [AVR-3311CI/AVR-3311/AVR-991](https://www.awe-europe.com/documents/Control%20Docs/Denon/Archive/AVR3311CI_AVR3311_991_PROTOCOL_V7.1.0.pdf) -- [CEOL Piccolo DRA-N5/RCD-N8](http://www.audioproducts.com.au/downloadcenter/products/Denon/CEOLPICCOLOBK/Manuals/DRAN5_RCDN8_PROTOCOL_V.1.0.0.pdf) -- [Marantz Control Protocol (2014+)](http://m.us.marantz.com/DocumentMaster/US/Marantz%202014%20NR%20Series%20-%20SR%20Series%20RS232%20IP%20Protocol.xls) +- [Denon/Marantz Control Protocol] (https://assets.eu.denon.com/DocumentMaster/DE/AVR1713_AVR1613_PROTOCOL_V8.6.0.pdf) diff --git a/_addons_bindings/digiplex/readme.md b/_addons_bindings/digiplex/readme.md index 757c3fffe..d4872170f 100644 --- a/_addons_bindings/digiplex/readme.md +++ b/_addons_bindings/digiplex/readme.md @@ -3,7 +3,7 @@ id: digiplex label: Digiplex/EVO title: Digiplex/EVO - Bindings type: binding -description: "This binding provides integration with Digiplex/EVO alarm systems from [Paradox](http://paradox.com)." +description: "This binding provides integration with Digiplex/EVO alarm systems from [Paradox](https://paradox.com)." since: 3x install: auto --- @@ -14,14 +14,14 @@ install: auto # Digiplex/EVO Binding -This binding provides integration with Digiplex/EVO alarm systems from [Paradox](http://paradox.com). -It utilizes [PRT3 module](http://www.paradox.com/Products/default.asp?CATID=7&SUBCATID=75&PRD=234) for serial communication. +This binding provides integration with Digiplex/EVO alarm systems from [Paradox](https://paradox.com). +It utilizes [PRT3 module](https://www.paradox.com/Products/default.asp?CATID=7&SUBCATID=75&PRD=234) for serial communication. ## Supported Things ### PRT3 Module -Before the binding can be used, a serial adapter must be added manually. Select `PRT3 Module` and enter serial port parameters. +Before the binding can be used, a serial adapter must be added manually. Select `PRT3 Module` and enter serial port parameters. Please refer to PRT3 module manual for instructions how to modify baudrate (default setting is 2400) ## Discovery diff --git a/_addons_bindings/dscalarm/readme.md b/_addons_bindings/dscalarm/readme.md index 411bf7d88..bf0d399f7 100644 --- a/_addons_bindings/dscalarm/readme.md +++ b/_addons_bindings/dscalarm/readme.md @@ -18,7 +18,7 @@ install: auto The DSC PowerSeries Alarm System is a popular do-it-yourself home security system, which can be monitored and controlled remotely through a standard web-browser or mobile device. This is the binding for the DSC PowerSeries Alarm System, utilizing either the EyezOn Envisalink 4/3/2DS interface or the DSC IT-100 RS-232 interface. -It provides connectivity to the DSC Alarm panel via a TCP socket connection to the EyesOn Envisalink 4/3/2DS interface or a RS-232 serial connection to the DSC IT-100 interface. +It provides connectivity to the DSC Alarm panel via a TCP socket connection to the EyesOn Envisalink 4/3/2DS interface or a RS-232 serial connection to the DSC IT-100 interface. Additionally, their is provision to connect to the DSC IT-100 interface through a TCP serial server. ## Supported Things @@ -42,16 +42,16 @@ Most settings are through thing configuration parameters. ## Discovery -The DSC Alarm binding incorporates a discovery modes in order to find DSC Alarm systems. +The DSC Alarm binding incorporates a discovery modes in order to find DSC Alarm systems. There is the Envisalink bridge discovery mode which performs a network query for any Envisalink adapters and adds them to the discovery inbox. -This bridge discovery mode is started manually through Paper UI. +This bridge discovery mode is started manually through the UI. After a bridge is discovered and available to openHAB, the binding will attempt to discover DSC Alarm things and add them to the discovery inbox. The TCP Server bridge does not implement bridge discovery but will utilize thing discovery once it is online. Note: The Envisalink Bridge discovery does a TCP scan across your local network to find the interface. This may create issues on the network so it is suggested that caution be used when trying this discovery. -The recommended method would be to manually add and configure the bridge through the 'dscalarm.thing' file or the Paper UI. +The recommended method would be to manually add and configure the bridge through the 'dscalarm.thing' file or the UI. And then allow the binding to discover the DSC Alarm things. ## Thing Configuration @@ -70,8 +70,8 @@ The following table shows the available configuration parameters for each thing. keypadNo parameters -The binding can be configured manually if discovery is not used. -A thing configuration file in the format 'bindingName.things' would need to be created, and placed in the 'conf/things' folder. +The binding can be configured manually if discovery is not used. +A thing configuration file in the format 'bindingName.things' would need to be created, and placed in the 'conf/things' folder. Here is an example of a thing configuration file called 'dscalarm.things': ```perl @@ -190,7 +190,7 @@ DSC Alarm things support a variety of channels as seen below in the following ta 1=ON
2=Flashing
keypad_lcd_updateStringText Changes of the IT-100 LCD Menu. - keypad_lcd_cursorStringLCD Cursor Position for The IT-100 + keypad_lcd_cursorStringLCD Cursor Position for The IT-100 ##Example diff --git a/_addons_bindings/dsmr/readme.md b/_addons_bindings/dsmr/readme.md index 9f58d5f4f..8e52ada62 100644 --- a/_addons_bindings/dsmr/readme.md +++ b/_addons_bindings/dsmr/readme.md @@ -166,7 +166,7 @@ Bridge dsmr:dsmrBridge:myDSMRDevice [serialPort="/dev/ttyUSB0"] { #### Item configuration -Paper UI. Item configuration can be done in the regular way. +Item configuration can be done in the regular way. Manual configuration: The following channels are supported: @@ -350,7 +350,7 @@ Number:Energy MeterDeliveryTariff1 "Total electricity delivered to the resident ## Determine M-Bus channel -By manually trigger the discovery process, e.g. via PaperUI, you can use the logging to find out a M-Bus channel. Look for the following logfile line: +By manually trigger the discovery process, you can use the logging to find out a M-Bus channel. Look for the following logfile line: ` [INFO ] [] - New compatible meter: [Meter type: M3_V5_0, channel: 1, Meter type: ELECTRICITY_V5, channel: 0]` Here you find the ThingTypeID (it is stated only in capitals) and the M-Bus channel. The above example would lead to the following Thing definition diff --git a/_addons_bindings/dwdpollenflug/readme.md b/_addons_bindings/dwdpollenflug/readme.md index 3fd8ac28c..75b9018ad 100644 --- a/_addons_bindings/dwdpollenflug/readme.md +++ b/_addons_bindings/dwdpollenflug/readme.md @@ -40,9 +40,9 @@ This can be used for `region` things you may add manually. ### Region -| Parameter | Default | Required | Description | -| ---------- | :-----: | :------: | -------------------------------------------------------------------------------------------------------- | -| `regionID` | - | yes | In PaperUI just select the region you want to display data for. For files-configuration see table below. | +| Parameter | Default | Required | Description | +| ---------- | :-----: | :------: | ------------------------------------------------------------------- | +| `regionID` | - | yes | The id of the region. The available options are in the table below. | #### Manual region or partregion selection #### diff --git a/_addons_bindings/folding/readme.md b/_addons_bindings/folding/readme.md index e5c95de14..9e4599632 100644 --- a/_addons_bindings/folding/readme.md +++ b/_addons_bindings/folding/readme.md @@ -3,7 +3,7 @@ id: folding label: Folding@home title: Folding@home - Bindings type: binding -description: "Binding for the [Folding@home](https://folding.stanford.edu/) distributed computing" +description: "Binding for the [Folding@home](https://folding.stanford.edu/) distributed computing software." since: 3x logo: images/addons/folding.png install: auto @@ -15,27 +15,19 @@ install: auto # Folding@home Binding -Binding for the [Folding@home](https://folding.stanford.edu/) distributed computing -software. +Binding for the [Folding@home](https://folding.stanford.edu/) distributed computing software. -This binding can control multiple Folding@home clients and slots, using the TCP -interface. -Clients are modeled as bridges, and support adding any number of slots -(though, usually CPU and GPU). +This binding can control multiple Folding@home clients and slots, using the TCP interface. +Clients are modeled as bridges, and support adding any number of slots (though, usually CPU and GPU). The binding provides control over Run / Pause and Finish. -It polls for the status of the client, updates the run / pause state, and -provides a basic description of the slot. +It polls for the status of the client, updates the run / pause state, and provides a basic description of the slot. -The clients must be added manually in the Paper UI, but the slots for that -client will then appear using auto-discovery. +The clients must be added manually in the UI, but the slots for a client will then appear using auto-discovery. ## Requirements (network access to F@H) -The Folding@home TCP interface is enabled only on localhost by default, without -a password. -In order to allow control of Folding on other machines than the one -running openHAB, it is necessary to configure the Folding client to accept commands -from a non-localhost address. +The Folding@home TCP interface is enabled only on localhost by default, without a password. +In order to allow control of Folding on other machines than the one running openHAB, it is necessary to configure the Folding client to accept commands from a non-localhost address. Here is how to do it in the FAHControl application: - Open FAHControl on the client to be added diff --git a/_addons_bindings/fsinternetradio/readme.md b/_addons_bindings/fsinternetradio/readme.md index dc6ccefdd..de8c4ada6 100644 --- a/_addons_bindings/fsinternetradio/readme.md +++ b/_addons_bindings/fsinternetradio/readme.md @@ -29,7 +29,7 @@ Successfully tested are internet radios: * [TechniSat DIGITRADIO 350 IR and 850](https://www.technisat.com/en_XX/DAB+-Radios-with-Internetradio/352-10996/) * [TTMicro AS Pinell Supersound](https://www.ttmicro.no/radio) * [Revo SuperConnect](https://revo.co.uk/products/) - * [Sangean WFR-28C](http://sg.sangean.com.tw/products/product_category.asp?cid=2) + * [Sangean WFR-28C](https://sg.sangean.com.tw/products/product_category.asp?cid=2) * [Roku SoundBridge M1001](https://soundbridge.roku.com/soundbridge/index.php) * [Dual IR 3a](https://www.dual.de/produkte/digitalradio/radio-station-ir-3a/) * [Teufel 3sixty](https://www.teufel.de/stereo/radio-3sixty-p16568.html) @@ -49,7 +49,7 @@ If your radio is not discovered, please try to access its API via: `http:// If you get a result like `FS_OK 1902014387`, your radio is supported. -If this is the case, please [add your model to this documentation](https://github.com/openhab/openhab-addons/edit/master/bundles/org.openhab.binding.fsinternetradio/README.md) and/or provide discovery information in [this thread](https://community.openhab.org/t/internet-radio-i-need-your-help/2131). +If this is the case, please [add your model to this documentation](https://github.com/openhab/openhab-addons/edit/main/bundles/org.openhab.binding.fsinternetradio/README.md) and/or provide discovery information in [this thread](https://community.openhab.org/t/internet-radio-i-need-your-help/2131). ## Binding Configuration @@ -82,7 +82,7 @@ All devices support some of the following channels: The radio mode depends on the internet radio model (and its firmware version!). This list is just an example how the mapping looks like for some of the devices, please try it out and adjust your sitemap for your particular radio. -| Radio Mode | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 +| Radio Mode | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |--------------------------|----------------|-------------------------|-----------|--------------|-----------|----------|--------------|--------------|-----------|-----------|--------| | Hama IR110 | Internet Radio | Spotify | Player | AUX in | - | - | - | - | - | - |- | | Medion MD87180 | Internet Radio | Music Player (USB, LAN) | DAB Radio | FM Radio | AUX in | - | - | - | - | - |- | diff --git a/_addons_bindings/globalcache/readme.md b/_addons_bindings/globalcache/readme.md index 33d3322c2..46703a5f9 100644 --- a/_addons_bindings/globalcache/readme.md +++ b/_addons_bindings/globalcache/readme.md @@ -127,7 +127,7 @@ parameters for **baud rate**, **flow control**, and **parity** to match the conf ### Manual Thing Creation -Devices can be created in the *Paper UI* or *HABmin*, or by placing a *.things* file in the *conf/things* directory. +Devices can be created in the *UI*, or by placing a *.things* file in the *conf/things* directory. See example below. ### Binding Dependencies @@ -147,7 +147,7 @@ discovery.globalcache:background=false ``` Note that automatic device discovery **will not work** with GC-100's running firmware earlier than v3.0 as those versions do not emit announcement beacons on the multicast address. -GC-100's running firmware earlier than v3.0 must be configured manually, either through *Paper UI* or using a *.things* file. +GC-100's running firmware earlier than v3.0 must be configured manually, either through the *UI* or using a *.things* file. See below. ## Channels and Channel Types @@ -212,7 +212,7 @@ Other settings, such as *Sensor In*, *Sensor Notify*, and *LED Lighting*, may be ## Contact Closure (CC) Channel -A *Contact Closure channel* activates the contact closure (relay) on the iTach or GC-100 device. +A *Contact Closure channel* activates the contact closure (relay) on the iTach or GC-100 device. For example, the following item links to the module 1, connector 1 channel on an iTach CC device. ``` @@ -227,7 +227,7 @@ String MyRelay "My Relay [%s]" (gRelays) { channel="globalcache:itachFlex ## Serial (SL) Channel -An *SL channel* sends serial command strings out the serial connector on the device. +An *SL channel* sends serial command strings out the serial connector on the device. For example, the following item links to the module 1 connector 1 channel on a GC-100-6 device. ``` diff --git a/_addons_bindings/heos/readme.md b/_addons_bindings/heos/readme.md index 62bd94c7d..e1a029630 100644 --- a/_addons_bindings/heos/readme.md +++ b/_addons_bindings/heos/readme.md @@ -48,9 +48,9 @@ __Important!__ Please note that only one bridge is required to establish a connection. Adding a second bridge can cause trouble with the connection. -It is recommended to use the Paper UI to setup the system and add all players and groups. +It is recommended to use the UI to setup the system and add all players and groups. The bridge is discovered through UPnP in the local network. -Once it is added the players and groups are discovered via the bridge and placed in the Paper UI Inbox. +Once it is added the players and groups are discovered via the bridge and placed in the Inbox. ## Binding Configuration @@ -94,7 +94,7 @@ Thing heos:player:player1 "name" [pid="123456789"] PID behind the heos:player:--- should be changed as required. It is recommended to use the Player PID. If the PID isn't known it can be discovered by establishing a Telnet connection (port 1255) to one player and search for available players (Command: heos://player/get_players) within the network. -Another way is to use Paper UI to discover the Player via the bridge and get the PID. +Another way is to use the UI to discover the Player via the bridge and get the PID. For further details refer to the [HEOS CLI](https://rn.dmglobal.com/euheos/HEOS_CLI_ProtocolSpecification.pdf) specification. ### Group Configuration @@ -105,8 +105,9 @@ Player have the following configuration parameter |----------------- |------------------------------------------------------------------------------------- | --------- | | members | The members of the groups. These are the player IDs. IDs have to be separated by ";" | yes | -If you use Paper UI to manage your Things (which is the preferred way), you can also set up your group automatically from Paper UI. -Groups will automatically appear in the Inbox if that Group is active. To do this, build your Group from the HEOS app, then the group will appear in the Inbox. +Groups will automatically appear in the Inbox if that Group is active. +To do this, build your Group from the HEOS app, then the group will appear in the Inbox. + ``` Thing heos:group:group1 "name" [members="45345634;35534567"] ``` diff --git a/_addons_bindings/icloud/readme.md b/_addons_bindings/icloud/readme.md index 8f391f216..70e245497 100644 --- a/_addons_bindings/icloud/readme.md +++ b/_addons_bindings/icloud/readme.md @@ -83,7 +83,7 @@ Bridge icloud:account:myaccount [appleId="mail@example.com", password="secure", } ``` -The device ID can be found in the Paper UI inbox. +The device ID can be found in the Inbox after it has been discovered. The information *@ "World"* is optional. ### icloud.items diff --git a/_addons_bindings/innogysmarthome/readme.md b/_addons_bindings/innogysmarthome/readme.md index f00fdf192..d25808251 100644 --- a/_addons_bindings/innogysmarthome/readme.md +++ b/_addons_bindings/innogysmarthome/readme.md @@ -120,7 +120,7 @@ When `invert` is `true` than `0` on innogy is `UP` and `100` is `DOWN`. ### Configuring the SmartHome Controller (SHC) -The SmartHome Controller (SHC) can be configured in the Paper UI as follows: +The SmartHome Controller (SHC) can be configured in the UI as follows: After the "innogy SmartHome Controller" is added via the Inbox, edit the controller and add the "Authorization code" by following the hints in the description. Save your changes. @@ -131,7 +131,7 @@ Be sure it is connected to the Internet. Authorization is done as oauth2 workflow with the innogy API. -To receive the auth-code, go to one of the following URLs depending on your brand and login with your credentials (you can find this link also in the SHC thing in Paper UI, if you edit it): +To receive the auth-code, go to one of the following URLs depending on your brand and login with your credentials (you can find this link also in the SHC thing in the UI, if you edit it): https://auth.services-smarthome.de/AUTH * [innogy SmartHome authorization page](https://auth.services-smarthome.de/AUTH/authorize?response_type=code&client_id=24635748&redirect_uri=https%3A%2F%2Fwww.openhab.org%2Foauth%2Finnogy%2Finnogy-smarthome.html&scope&lang=de-DE) * [SmartHome Austria authorization page](https://auth.services-smarthome.de/AUTH/authorize?response_type=code&client_id=24635749&redirect_uri=https%3A%2F%2Fwww.openhab.org%2Foauth%2Finnogy%2Fsmarthome-austria.html&scope&lang=de-DE) @@ -153,9 +153,9 @@ All devices bound to the bridge are found by the discovery service once the SHC As device discovery is not implemented as a background service, you should start it manually in the Inbox to find all devices. Now you can add all devices from your Inbox as things. -### Manual configuration +### File based configuration -As an alternative to the automatic discovery process and graphical configuration using Paper UI, innogy things can be configured manually. +As an alternative to using automatic discovery, innogy things can be configured using .things files. The innogy SmartHome Controller (SHC) can be configured using the following syntax: ``` @@ -178,7 +178,7 @@ All other innogy devices can be added using the following syntax: Thing WDS "" @ "" [ id="" ] ``` -The device ID (e.g. e9a74941a3807b57332214f346fb1129) can be found in the Paper UI inbox, as you find it below all things there in the form `innogysmarthome:::` (example: `innogysmarthome:WSC2:SMARTHOME01:e9a74941a3807b57332214f346fb1129`). +The device ID (e.g. e9a74941a3807b57332214f346fb1129) can be found in the Inbox, as you find it below all things there in the form `innogysmarthome:::` (example: `innogysmarthome:WSC2:SMARTHOME01:e9a74941a3807b57332214f346fb1129`). However, a full example .things configuration look like this: @@ -242,7 +242,7 @@ end ## Resolving certificate issues -If the bridge stays offline with the following status shown in the Paper UI, the reason could be an expired certificate: +If the bridge stays offline with the following status shown in the UI, the reason could be an expired certificate: `OFFLINE - COMMUNICATION_ERROR sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target` diff --git a/_addons_bindings/insteon/readme.md b/_addons_bindings/insteon/readme.md index 3c8cdac43..6beaae048 100644 --- a/_addons_bindings/insteon/readme.md +++ b/_addons_bindings/insteon/readme.md @@ -18,7 +18,7 @@ install: auto Insteon is a home area networking technology developed primarily for connecting light switches and loads. Insteon devices send messages either via the power line, or by means of radio frequency (RF) waves, or both (dual-band. A considerable number of Insteon compatible devices such as switchable relays, thermostats, sensors etc are available. -More about Insteon can be found on [Wikipedia](http://en.wikipedia.org/wiki/Insteon). +More about Insteon can be found on [Wikipedia](https://en.wikipedia.org/wiki/Insteon). This binding provides access to the Insteon network by means of either an Insteon PowerLinc Modem (PLM), a legacy Insteon Hub 2242-222 or the current 2245-222 Insteon Hub. The modem can be connected to the openHAB server either via a serial port (Model 2413S) or a USB port (Model 2413U. @@ -373,7 +373,7 @@ Switch fOutBot "Front Outlet Bottom" { channel="insteon:device:home:AAB ``` This will give you individual control of each outlet. - + ### Mini Remotes Link the mini remote to be a controller of the modem by using the set button. @@ -495,7 +495,7 @@ Put something like this into your .items file: Switch doorLock "Front Door [MAP(lock.map):%s]" { channel="insteon:device:home:AABBCC:switch" } ``` -and create a file "lock.map" in the transforms directory with these entries: +and create a file "lock.map" in the transforms directory with these entries: ``` ON=Lock @@ -710,7 +710,7 @@ See the example below: **Items** -``` +``` Number:Power iMeterWatts "iMeter [%d watts]" { channel="insteon:device:home:AABBCC:watts" } Number:Energy iMeterKwh "iMeter [%.04f kWh]" { channel="insteon:device:home:AABBCC:kWh" } Switch iMeterUpdate "iMeter Update" { channel="insteon:device:home:AABBCC:update" } @@ -835,7 +835,7 @@ See [logging in openHAB](https://www.openhab.org/docs/administration/logging.htm ### Device Permissions / Linux Device Locks When openHAB is running as a non-root user (Linux/OSX) it is important to ensure it has write access not just to the PLM device, but to the os lock directory. -Under openSUSE this is `/run/lock` and is managed by the **lock** group. +Under openSUSE this is `/run/lock` and is managed by the **lock** group. Example commands to grant openHAB access (adjust for your distribution): @@ -866,7 +866,7 @@ Where the `my_own_devices.xml` file defines a new device like this: ``` -Finding the Insteon product key can be tricky since Insteon has not updated the product key table (http://www.insteon.com/pdf/insteon_devcats_and_product_keys_20081008.pdf) since 2008. +Finding the Insteon product key can be tricky since Insteon has not updated the product key table (https://www.insteon.com/pdf/insteon_devcats_and_product_keys_20081008.pdf) since 2008. If a web search does not turn up the product key, make one up, starting with "F", like: F00.00.99. Avoid duplicate keys by finding the highest fake product key in the `device_types.xml` file, and incrementing by one. diff --git a/_addons_bindings/km200/readme.md b/_addons_bindings/km200/readme.md index 03e6b16f2..c08a222d1 100644 --- a/_addons_bindings/km200/readme.md +++ b/_addons_bindings/km200/readme.md @@ -23,19 +23,19 @@ It is possible to receive and send parameters like string or float values. This binding supports 11 different things types -| Thing | Paper UI Only | Description | -| ---------------- | ------------- |---------------------------------------------------------- | -| `appliance` | | The appliance (The heater inside of this heating system). | -| `dhwCircuit` | | A hot water circuit. | -| `gateway` | | The gateway. (The connected KM200/100/50 device). | -| `heatingCircuit` | | A heating circuit. | -| `heatSource` | | The heat source. | -| `holidayMode` | | The holiday modes configuration. | -| `sensor` | | The sensors. | -| `solarCircuit` | | A solar circuit. | -| `system` | | The system without sensors and appliance. | -| `notification` | | The notifications. | -| `switchProgram` | X | A switch program. | +| Thing | UI Only | Description | +|------------------|:-------:|-----------------------------------------------------------| +| `appliance` | | The appliance (The heater inside of this heating system). | +| `dhwCircuit` | | A hot water circuit. | +| `gateway` | | The gateway. (The connected KM200/100/50 device). | +| `heatingCircuit` | | A heating circuit. | +| `heatSource` | | The heat source. | +| `holidayMode` | | The holiday modes configuration. | +| `sensor` | | The sensors. | +| `solarCircuit` | | A solar circuit. | +| `system` | | The system without sensors and appliance. | +| `notification` | | The notifications. | +| `switchProgram` | X | A switch program. | ### KM 50/100/200 @@ -61,9 +61,9 @@ The *kmdevice* bridge requires the following configuration parameters: ### Channels -This binding creates the channels depending on the connected heating system fully automatically. -These channels depend on the connected heating system. -You can see the complete list of supported channels of the thing in the Paper UI. +This binding creates the channels depending on the connected heating system fully automatically. +These channels depend on the connected heating system. +You can see the complete list of supported channels of the thing in the UI. There is no official documentation for the parameters available from Buderus, so the names of the channels is all that reflects their purpose. ## Full Examples diff --git a/_addons_bindings/knx/readme.md b/_addons_bindings/knx/readme.md index 7d7d7351c..a6874a2a7 100644 --- a/_addons_bindings/knx/readme.md +++ b/_addons_bindings/knx/readme.md @@ -16,7 +16,7 @@ install: auto # KNX Binding -The openHAB KNX binding allows to connect to [KNX Home Automation](https://www.knx.org/) installations. +The openHAB KNX binding allows to connect to [KNX Home Automation](https://www.knx.org/) installations. Switching lights on and off, activating your roller shutters or changing room temperatures are only some examples. To access your KNX bus you either need a gateway device which is connected to the KNX bus and allows computers to access the bus communication. @@ -32,7 +32,7 @@ There is an *ip* bridge to connect to KNX IP Gateways, and a *serial* bridge for ## Binding Configuration -The binding itself does not require any special configuration. +The binding itself does not require any special configuration. ## Bridges @@ -224,11 +224,11 @@ Only add parameters to the Bridge and Thing configuration if you know exactly wh knx.things: ```xtend -Bridge knx:ip:bridge [ +Bridge knx:ip:bridge [ type="ROUTER", autoReconnectPeriod=60 //optional, do not set <30 sec. ] { - Thing device knx_device "knx_device_name" @ "knx_device_group_in_paperui" [ + Thing device knx_device "knx_device_name" @ "knx_device_group" [ //readInterval=3600 //optional, only used if reading values are present ] { //Items configurations @@ -241,12 +241,12 @@ Bridge knx:ip:bridge [ knx.things: ```xtend -Bridge knx:ip:bridge [ +Bridge knx:ip:bridge [ type="TUNNEL", ipAddress="192.168.0.111", autoReconnectPeriod=60 //optional, do not set <30 sec. ] { - Thing device knx_device "knx_device_name" @ "knx_device_group_in_paperui" [ + Thing device knx_device "knx_device_name" @ "knx_device_group" [ //readInterval=3600 //optional, only used if reading values are present ] { //Items configurations @@ -258,14 +258,14 @@ Bridge knx:ip:bridge [ ```xtend //TUNNEL -Bridge knx:ip:bridge [ - type="TUNNEL", - ipAddress="192.168.0.10", - portNumber=3671, +Bridge knx:ip:bridge [ + type="TUNNEL", + ipAddress="192.168.0.10", + portNumber=3671, localIp="192.168.0.11", - readingPause=50, - responseTimeout=10, - readRetriesLimit=3, + readingPause=50, + responseTimeout=10, + readRetriesLimit=3, autoReconnectPeriod=60, localSourceAddr="0.0.0" ] { @@ -286,14 +286,14 @@ Bridge knx:ip:bridge [ } //ROUTER -Bridge knx:ip:bridge [ - type="ROUTER", - ipAddress="224.0.23.12", - portNumber=3671, +Bridge knx:ip:bridge [ + type="ROUTER", + ipAddress="224.0.23.12", + portNumber=3671, localIp="192.168.0.11", - readingPause=50, - responseTimeout=10, - readRetriesLimit=3, + readingPause=50, + responseTimeout=10, + readRetriesLimit=3, autoReconnectPeriod=60, localSourceAddr="0.0.0" ] {} @@ -323,7 +323,7 @@ sitemap knx label="KNX Demo Sitemap" { Slider item=demoDimmer Text item=demoString Text item=demoDatetime - } + } } ``` @@ -333,11 +333,11 @@ sitemap knx label="KNX Demo Sitemap" { control.things: ```xtend -Bridge knx:serial:bridge [ - serialPort="/dev/ttyAMA0", - readingPause=50, - responseTimeout=10, - readRetriesLimit=3, +Bridge knx:serial:bridge [ + serialPort="/dev/ttyAMA0", + readingPause=50, + responseTimeout=10, + readRetriesLimit=3, autoReconnectPeriod=60 ] { Thing device generic { @@ -350,9 +350,9 @@ Bridge knx:serial:bridge [ } } -Bridge hue:bridge:bridge "Philips Hue Bridge" [ - ipAddress="...", - userName="..." +Bridge hue:bridge:bridge "Philips Hue Bridge" [ + ipAddress="...", + userName="..." ] { Thing 0210 1 "Color Lamp" [ lightId="1" ] } diff --git a/_addons_bindings/lametrictime/readme.md b/_addons_bindings/lametrictime/readme.md index 0ade1c57c..40f3ca02b 100644 --- a/_addons_bindings/lametrictime/readme.md +++ b/_addons_bindings/lametrictime/readme.md @@ -140,7 +140,7 @@ They exist as one-way communication only. ## How Tos The following configuration examples assume the device was added with the thing id `lametrictime:device:demo`. -Replace the thing id in all the configurations with your real thing id which can be looked up via Paper UI. +Replace the thing id in all the configurations with your real thing id which can be looked up the UI. ### Notifications diff --git a/_addons_bindings/lcn/readme.md b/_addons_bindings/lcn/readme.md index 7270c8797..95dd59ade 100644 --- a/_addons_bindings/lcn/readme.md +++ b/_addons_bindings/lcn/readme.md @@ -3,7 +3,7 @@ id: lcn label: LCN title: LCN - Bindings type: binding -description: "[Local Control Network (LCN)](http://www.lcn.eu) is a building automation system for small and very large installations." +description: "[Local Control Network (LCN)](https://www.lcn.eu) is a building automation system for small and very large installations." since: 3x logo: images/addons/lcn.png install: auto @@ -15,11 +15,11 @@ install: auto # LCN Binding -[Local Control Network (LCN)](http://www.lcn.eu) is a building automation system for small and very large installations. +[Local Control Network (LCN)](https://www.lcn.eu) is a building automation system for small and very large installations. It is capable of controlling lights, shutters, access control etc. and can process data from several sensor types. It has been introduced in 1992. -A broad range of glass key panels, displays, remote controls, sensors and in- and outputs exist. +A broad range of glass key panels, displays, remote controls, sensors and in- and outputs exist. The system can handle up to 30,000 bus members, called modules. LCN modules are available for DIN rail and in-wall mounting and feature versatile interfaces. The bus modules and most of the accessories are developed, manufactured and assembled in Germany. @@ -58,7 +58,7 @@ Examples for PCK gateways are the *LCN-PCHK* software running on Windows or Linu For each LCN bus, interfaced to openHAB, a PCK gateway needs to be added to openHAB as a *Thing*. -Several PCK gateways can be added to openHAB to control multiple LCN busses in distinct locations. +Several PCK gateways can be added to openHAB to control multiple LCN busses in distinct locations. The minimum recommended version is LCN-PCHK 2.8 (older versions will also work, but lack some functionality). Visit [https://www.lcn.eu](https://www.lcn.eu) for updates. @@ -212,7 +212,7 @@ The binary sensor Channels provide the boolean parameter `invertState`, which ca LCN transponder readers or fingerprint readers can be integrated in openHAB e.g. for access control. The transponder function must be enabled in the module's I-port properties within *LCN-PRO*. - + Example: When the transponder card with the ID "12ABCD" is seen by the reader connected to LCN module "S000M011", the item "M10_Relay7" is switched on: ``` @@ -311,7 +311,7 @@ When no *ramp* parameter is specified or no profile is configured, the ramp is 0 The ramp parameter is not available for Color *Item*s. ``` -// Dim output 2 in 0.25s +// Dim output 2 in 0.25s Switch M10_Output2 {channel="lcn:module:b827ebfea4bb:S000M010:output#2"[profile="lcn:output", ramp=0.25]} // with ramp of 0.25s (smallest value) // Dim output 3 in 486s Dimmer M10_Output3 {channel="lcn:module:b827ebfea4bb:S000M010:output#3"[profile="lcn:output", ramp=486]} // with ramp of 486s (biggest value) @@ -401,7 +401,7 @@ This action has also effect, if the given output is off. The output will be dimm ``` rule "Flicker output 1 when window opens" when - Item M10_BinarySensor5 changed to OPEN + Item M10_BinarySensor5 changed to OPEN then val actions = getActions("lcn","lcn:module:b827ebfea4bb:S000M010") // output=1, depth=2=100%, ramp=0=2s, count=3 @@ -422,7 +422,7 @@ When programming a "Relay Timer" *Action*, the following parameters need to be s ``` rule "Start relay timer for led driver when dummy switch changed" when - Item Dummy_Switch changed + Item Dummy_Switch changed then val actions = getActions("lcn","lcn:module:b827ebfea4bb:17B4196847") // relayNumber=3, duration=90 @@ -444,7 +444,7 @@ Config `.things` ``` Bridge lcn:pckGateway:myPCHK [ hostname="192.168.123.123", port=4114, username="myUser", password="myPassword", mode="native200" ] { Thing module M99 "M99 MyModule" [ moduleId=99, segmentId=0 ] { - Channels: + Channels: Rollershutter : rollershutterrelay#1 "My twisted rollershutter relay" [ invertUpDown = true ] Contact : binarysensor#6 [ invertState=true ] Number : rvarsetpoint#1 [ unit="temperature" ] @@ -470,7 +470,7 @@ Dimmer M10_OutputAll3 {channel="lcn:module:b827ebfea4bb:S000M010:output#1"[profi Dimmer M10_Outputs12b {channel="lcn:module:b827ebfea4bb:S000M010:output#1"[profile="lcn:output", controlOutputs12=true, ramp=0.25]} // Dimmer Outputs: RGB Control -Color M10_Color {channel="lcn:module:b827ebfea4bb:S000M010:output#color"[profile="lcn:output"]} +Color M10_Color {channel="lcn:module:b827ebfea4bb:S000M010:output#color"[profile="lcn:output"]} // Roller Shutter on Output 1+2 Rollershutter M10_RollershutterOutput1 {channel="lcn:module:b827ebfea4bb:S000M010:rollershutteroutput#1"} @@ -535,39 +535,39 @@ sitemap lcn label="My home automation" { Default item=M10_Output1 label="Output 1" Default item=M10_Output2 label="Output 2" Default item=M10_Output3 label="Output 3" - + // Dimmer Outputs: Control all simultaneously. Status of Output 1 is visualized. Default item=M10_OutputAll1 label="All Outputs ramp=0 since firmware 180501" Default item=M10_OutputAll2 label="All Outputs ramp=250ms all firmwares" Default item=M10_OutputAll3 label="All Outputs ramp>=500ms since firmware 180501" - + // Dimmer Outputs: Control outputs 1+2 simultaneously. Status of Output 1 is visualized. Only ramps of 0s or 0.25s are supported. Default item=M10_Outputs12a label="Outputs 1+2 Ramp=0" Default item=M10_Outputs12b label="Outputs 1+2 Ramp=0.25s" - + // Dimmer Outputs: RGB Control Colorpicker item=M10_Color - + // Roller Shutter on Outputs 1+2 Default item=M10_RollershutterOutput1 label="Roller Shutter on Output 1+2" - + // Relays Default item=M10_Relay1 label="Relay 1" - + // Roller Shutter on Relays Default item=M10_RollershutterRelay1 label="Roller Shutter on Relay 1-2" - + // LEDs Switch item=M10_LED1 label="LED 1" mappings=[ON=ON, OFF=OFF] // Don't display "Blink" or "Flicker" Switch item=M10_LED2 label="LED 2" - + // Logic Operations (legacy name: "Sums") Default item=M10_Logic1 label="Logic Operation 1" Default item=M10_Logic2 label="Logic Operation 2" - + // Binary Sensors (Channels 1-3 of LCN-B3I are mapped to BinarySensor6, BinarySensor7, BinarySensor8) - Default item=M10_BinarySensor1 label="Binary Sensor 1" - + Default item=M10_BinarySensor1 label="Binary Sensor 1" + // Variables Setpoint item=M10_Variable1 label="Variable 1" Default item=M10_Variable2 label="Variable 2" @@ -580,21 +580,21 @@ sitemap lcn label="My home automation" { Default item=M10_Variable9 label="Variable 9" Default item=M10_Variable10 label="Variable 10" Default item=M10_Variable11 label="Variable 11" - + // Regulators Setpoint item=M10_R1VarSetpoint label="R1Var Setpoint" step=1 minValue=-10.0 Default item=M10_R1VarLock label="R1Var Lock" // Lock state of R1Var - + // Thresholds Setpoint item=M10_ThresholdRegister1_Threshold1 label="Threshold Register 1 Threshold 1" Setpoint item=M10_ThresholdRegister4_Threshold2 label="Threshold Register 4 Threshold 2" - + // S0 Counters Default item=M10_S0Counter1 label="S0 Counter 1" - + // Key Locks Default item=M10_KeyLockA1 label="Locked State Key A1" Default item=M10_KeyLockD5 label="Locked State Key D5" - } + } } ``` diff --git a/_addons_bindings/lgtvserial/readme.md b/_addons_bindings/lgtvserial/readme.md index 768ff5607..3646d8390 100644 --- a/_addons_bindings/lgtvserial/readme.md +++ b/_addons_bindings/lgtvserial/readme.md @@ -38,7 +38,6 @@ Tested and developed with : ## Discovery No discovery supported, manual configuration is required. -The things may be configured through the Paper UI. ## Thing Configuration @@ -152,6 +151,6 @@ Here's a list of all the LG TV commands added to the binding, in channel type id [4] -[5] Manual LV series, LK series, PW series and PZ series +[5] Manual LV series, LK series, PW series and PZ series -[6] Manual for LD series, LE series, LX series and PK series +[6] Manual for LD series, LE series, LX series and PK series diff --git a/_addons_bindings/lirc/readme.md b/_addons_bindings/lirc/readme.md index f9f9f5a3d..e1ab95b22 100644 --- a/_addons_bindings/lirc/readme.md +++ b/_addons_bindings/lirc/readme.md @@ -3,7 +3,7 @@ id: lirc label: LIRC title: LIRC - Bindings type: binding -description: "This binding integrates infrared transceivers through [LIRC](http://www.lirc.org) or [WinLIRC](http://winlirc.sourceforge.net)." +description: "This binding integrates infrared transceivers through [LIRC](https://www.lirc.org) or [WinLIRC](http://winlirc.sourceforge.net)." since: 3x logo: images/addons/lirc.png install: auto @@ -15,7 +15,7 @@ install: auto # LIRC Binding -This binding integrates infrared transceivers through [LIRC](http://www.lirc.org) or [WinLIRC](http://winlirc.sourceforge.net). +This binding integrates infrared transceivers through [LIRC](https://www.lirc.org) or [WinLIRC](http://winlirc.sourceforge.net). A list of remote configuration files for LIRC is available [here](http://lirc-remotes.sourceforge.net/remotes-table.html). diff --git a/_addons_bindings/logreader/readme.md b/_addons_bindings/logreader/readme.md index d0635c4b9..d55fb1dad 100644 --- a/_addons_bindings/logreader/readme.md +++ b/_addons_bindings/logreader/readme.md @@ -113,15 +113,15 @@ rule "LogReader" end ``` -Use the rules with your Telegram Bot (need openHAB Telegram Action installed and configured) +Use the rules with your Telegram Bot (need openHAB Telegram Binding installed and configured) ```xtend rule "LogReader" when Channel 'logreader:reader:openhablog:newErrorEvent' triggered then - // do something - sendTelegram("bot3", "*ERROR* LogReader Event!\n%s Errors are in the log! Here is the last row of it:\n`%s`", logreaderErrors.state.toString, logreaderLastError.state.toString) + val telegramAction = getActions("telegram","telegram:telegramBot:myBot") + telegramAction.sendTelegram("*ERROR* LogReader Event!\n%s Errors are in the log! Here is the last row of it:\n`%s`", logreaderErrors.state.toString, logreaderLastError.state.toString) end ``` diff --git a/_addons_bindings/magentatv/readme.md b/_addons_bindings/magentatv/readme.md index 11b7f42e9..4bdfad244 100644 --- a/_addons_bindings/magentatv/readme.md +++ b/_addons_bindings/magentatv/readme.md @@ -14,7 +14,7 @@ install: auto # MagentaTV Binding -This binding allows controlling the Deutsche Telekom Magenta TV Media Receiver series MR4xx and MR2xx (Telekom NGTV / Huawei Envision platform). +This binding allows controlling the Deutsche Telekom Magenta TV Media Receiver series MR4xx and MR2xx (Telekom NGTV / Huawei Envision platform). The binding does NOT support MR3xx/1xx (old Entertain system based on Microsoft technology)! Media Receivers are automatically discovered. @@ -50,7 +50,7 @@ The binding uses the network settings in openHAB's system configuration to deter The device can't be discovered if the openHAB system and receiver are not on the same network (IP/Netmask). In this case you need to add the Thing manually or use textual configuration (.things). -If you are running openHAB in a Docker container you need to make sure that UPnP discovery is available and network interfaces +If you are running openHAB in a Docker container you need to make sure that UPnP discovery is available and network interfaces ## Receiver Standby Mode @@ -63,10 +63,10 @@ The Media receiver has 3 different standby modes, which can be selected in the r |Shutdown |Powering off shuts down the receiver, so that it can be awakened only with the power button.| `Standby` provides the best results, because the binding can wake up the receiver (Power On/Off). -`Suspend/Resume` requires a Wake-on-LAN packet, which can take longer. +`Suspend/Resume` requires a Wake-on-LAN packet, which can take longer. `Shutdown` turns the receiver off, which requires a manual power-on. -There is no way to detect the "display status" of the receiver. +There is no way to detect the "display status" of the receiver. The binding detects Power-Off with the MR401B/MR201 by listening to UPnP events, but can't verify the status when started. You need to take care on the current status if you power on/off the receiver from scenes. Check the current status before sending the POWER button, because POWER is a toggle, not ON or OFF (see sample rules). @@ -77,7 +77,7 @@ Check the current status before sending the POWER button, because POWER is a tog |----------------|----------------------------------------------------------------------------------------------------------------| |accountName |Login Name (email), should be the registered e-mail address for the Telekom Kundencenter | |accountPassword |Account password (same as for the Kundencenter) | -|userId |The technical userId required for the pairing process, see section "Retrieving userId" | +|userId |The technical userId required for the pairing process, see section "Retrieving userId" | |ipAddress |IP address of the receiver, usually discovered by UPnP | |port |Port to reach the remote service, usually 8081 for the MR401/MR201 or 49152 for MR400/200 | |udn |UPnP Unique Device Name - a hex ID, which includes the 12 digit MAC address at the end (parsed by the binding) | @@ -109,13 +109,13 @@ Edit thing configuration and copy this value to the field userId ``` On successful login the console will show the User ID value. Copy&Paste this value to the Thing configuration (parameter `userId`) of the receiver. -If you have multiple receivers under the same MagentaTV subscription you can use this value for all of them. +If you have multiple receivers under the same MagentaTV subscription you can use this value for all of them. 2. Provide your credentials in the UI -If you do not want to use the openHAB console, you can also setup the credentials in the Thing configuration +If you do not want to use the openHAB console, you can also setup the credentials in the Thing configuration -- Account Name (`accountName`) is your Login Name for the Telekom Kundencenter (registered email address) +- Account Name (`accountName`) is your Login Name for the Telekom Kundencenter (registered email address) - Account Password (`accountPassword`) is the corresponding password. The binding uses these credentials to login to your account, retrieves the `userId` parameter and sets it in the Thing configuration. @@ -131,12 +131,12 @@ For security reasons the credentials are automatically deleted from the thing co | |key |String |Send key code to the receiver (see code table below) | | |mute |Switch |Mute volume (mute the speaker) | |status |playMode |String |Current play mode - this info is not reliable | -| |channelCode |Number  |The channel code from the EPG. | +| |channelCode |Number |The channel code from the EPG. | |program |title |String |Title of the running program or video being played | | |text |String |Some description (as reported by the receiver, could be empty) | | |start |DateTime |Time when the program started | | |position |Number |Position in minutes within a movie. | -| |duration |Number |Remaining time in minutes, usually not updated for TV program | +| |duration |Number |Remaining time in minutes, usually not updated for TV program | Please note: @@ -144,6 +144,7 @@ Please note: The binding tries to detect and maintain the correct state, but due to device limitations this is not always possible. Make sure the receiver's and binding's state are in sync when OH is restarted (binding assumes state is OFF). - Channels receiving event information get updated when changing the channel or playing a video. + There is no way to read the current status, therefore they don't get initialized on startup nor being updated in real-time. The player channel supports the following actions: @@ -193,8 +194,8 @@ The player channel supports the following actions: | MUTE | Mute speakers | | CHUP | Channel up | | CHDOWN | Channel down | -| PLAY | Play | -| PAUSE | Play | +| PLAY | Play | +| PAUSE | Play | | STOP | Stop playing | | RECORD | Start recording | | REWIND | Rewind | @@ -206,7 +207,7 @@ The player channel supports the following actions: | PAIR | Re-pair with the receiver | In addition you could send any key code in the 0xHHHH format., refer to -[Key Codes for Magenta/Huawei Media Receiver](http://support.huawei.com/hedex/pages/DOC1100366313CEH0713H/01/DOC1100366313CEH0713H/01/resources/dsv_hdx_idp/DSV/en/en-us_topic_0094619112.html) +[Key Codes for Magenta/Huawei Media Receiver](https://support.huawei.com/hedex/pages/DOC1100366313CEH0713H/01/DOC1100366313CEH0713H/01/resources/dsv_hdx_idp/DSV/en/en-us_topic_0094619112.html) ## Full Configuraton Example @@ -215,7 +216,7 @@ In addition you could send any key code in the 0xHHHH format., refer to ``` Thing magentatv:receiver:XXXXXXXXXXX "MagentaTV" [ udn="XXXXXXXXXXX", -ipAddress="xxx.xxx.xxx.xxx", +ipAddress="xxx.xxx.xxx.xxx", accountName="xxxxxx.xxxx@t-online.de", accountPassword="xxxxxxxxxx" ] @@ -331,7 +332,7 @@ Beginning with models 401/201 and new the binding is able to detect the Power-OF } ``` -to switch it ON and +to switch it ON and ``` if (MagentaTV_Power.state != OFF) { diff --git a/_addons_bindings/max/readme.md b/_addons_bindings/max/readme.md index c0266fe44..196ef8dff 100644 --- a/_addons_bindings/max/readme.md +++ b/_addons_bindings/max/readme.md @@ -3,7 +3,7 @@ id: max label: MAX! title: MAX! - Bindings type: binding -description: "This is the binding for the [eQ-3 MAX! Home Solution](http://www.eq-3.de/)." +description: "This is the binding for the [eQ-3 MAX! Home Solution](https://www.eq-3.de/)." since: 3x logo: images/addons/max.png install: auto @@ -15,7 +15,7 @@ install: auto # MAX! Binding -This is the binding for the [eQ-3 MAX! Home Solution](http://www.eq-3.de/). +This is the binding for the [eQ-3 MAX! Home Solution](https://www.eq-3.de/). This binding allows you to integrate, view and control the MAX! Thermostats, Ecoswitch and Shuttercontact things. ## Supported Things @@ -37,7 +37,7 @@ If for any reason you need to manually define the Things and you are not exactly ## Discovery When the bindings discovery is triggered, the network is queried for the existence of a MAX! Cube LAN gateway. -When the Cube is found, it will become available in the inbox. +When the Cube is found, it will become available in the inbox. After the Cube `bridge` is available in openHAB, all the devices connected to it are discovered and added to the inbox. diff --git a/_addons_bindings/miele/readme.md b/_addons_bindings/miele/readme.md index 7f4be8d18..59b32bc5d 100644 --- a/_addons_bindings/miele/readme.md +++ b/_addons_bindings/miele/readme.md @@ -70,7 +70,7 @@ Thing coffeemachine coffeemachine [uid="001d63fffe020505#190"] ## Channels -The definition of the channels in use can best be checked in the [source repository](https://github.com/openhab/openhab-addons/tree/master/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing). +The definition of the channels in use can best be checked in the [source repository](https://github.com/openhab/openhab-addons/tree/main/bundles/org.openhab.binding.miele/src/main/resources/OH-INF/thing). ## Example diff --git a/_addons_bindings/modbus.e3dc/readme.md b/_addons_bindings/modbus.e3dc/readme.md index f305e77b1..09478de54 100644 --- a/_addons_bindings/modbus.e3dc/readme.md +++ b/_addons_bindings/modbus.e3dc/readme.md @@ -3,8 +3,9 @@ id: modbus.e3dc label: E3DC title: E3DC - Bindings type: binding -description: "" +description: "Integrates the Home Power Plants from E3/DC GmbH into openHAB." since: 3x +logo: images/addons/modbus.e3dc.png install: manual --- @@ -14,8 +15,6 @@ install: manual # E3DC - - Integrates the Home Power Plants from E3/DC GmbH into openHAB. See [E3DC Website](https://www.e3dc.com/) to find more informations about the device. The Power Plant handles all your Electrical Energy Resources like Photovoltaic Producers, Battery Storage, Wallbox Power Supply, Household Consumption and even more. @@ -99,32 +98,32 @@ The E3DC device offers quite an amount of channels. For clustering 4 Channel Gro ### Channel Group _Power Block_ -| Channel Label | Channel Group ID | Channel ID | Type | Description | -|-------------------------------|-------------------|------------------------------|------------------------|------------------------------| -| PV Output | power | pv-power-supply | Number:Power | Photovoltaic Power Production | -| Battery Discharge | power | battery-power-supply | Number:Power | Battery discharges and provides Power | -| Battery Charge | power | battery-power-consumption | Number:Power | Battery charges and consumes Power | -| Household Consumption | power | household-power-consumption | Number:Power | Household consuming Power | -| Grid Power Consumption | power | grid-power-consumption | Number:Power | Grid Power is needed in order to satisfy your overall Power consumption | -| Grid Power Supply | power | grid-power-supply | Number:Power | More Photovoltaic Power is produced than needed. Additional Power is provided towards the Grid | -| External Power Supply | power | external-power-supply | Number:Power | Power produced by an external device which is attached to your E3DC device | -| Wallbox Power Consumption | power | wallbox-power-consumption | Number:Power | Power consumption of attached Wallboxes | -| Wallbox PV Power Consumption | power | wallbox-pv-power-consumption | Number:Power | Photovoltaic Power consumption (PV plus Battery) of attached Wallboxes | -| Autarky | power | autarky-channel | Number:Dimensionless | Your current Autarky Level in Percent | -| Self Consumption | power | self-consumption | Number:Dimensionless | Your current Photovoltaic Self Consumption Level in Percent | -| Battery State Of Charge | power | battery-soc | Number:Dimensionless | Charge Level of your attached Battery in Percent | +| Channel Label | Channel Group ID | Channel ID | Type | Description | +|-------------------------------|-------------------|------------------------------|------------------------|----------------------------------------------------------------------------------------| +| PV Output | power | pv-power-supply | Number:Power | Photovoltaic Power Production | +| Battery Discharge | power | battery-power-supply | Number:Power | Battery discharges and provides Power | +| Battery Charge | power | battery-power-consumption | Number:Power | Battery charges and consumes Power | +| Household Consumption | power | household-power-consumption | Number:Power | Household consuming Power | +| Grid Power Consumption | power | grid-power-consumption | Number:Power | More Photovoltaic Power is produced than needed. Additional Power is consumed by Grid | +| Grid Power Supply | power | grid-power-supply | Number:Power | Grid Power is needed in order to satisfy your overall Power consumption | +| External Power Supply | power | external-power-supply | Number:Power | Power produced by an external device which is attached to your E3DC device | +| Wallbox Power Consumption | power | wallbox-power-consumption | Number:Power | Power consumption of attached Wallboxes | +| Wallbox PV Power Consumption | power | wallbox-pv-power-consumption | Number:Power | Photovoltaic Power consumption (PV plus Battery) of attached Wallboxes | +| Autarky | power | autarky-channel | Number:Dimensionless | Your current Autarky Level in Percent | +| Self Consumption | power | self-consumption | Number:Dimensionless | Your current Photovoltaic Self Consumption Level in Percent | +| Battery State Of Charge | power | battery-soc | Number:Dimensionless | Charge Level of your attached Battery in Percent | ### Channel Group _String Details Block_ -| Channel Label | Channel Group ID | Channel ID | Type | Description | -|-----------------------|------------------|--------------------|---------------------------|------------------------------| -| String 1 Potential | strings | string1-dc-voltage | Number:ElectricPotential | Voltage on String 1 | -| String 2 Potential | strings | string2-dc-voltage | Number:ElectricPotential | Voltage on String 2 | -| String 3 Potential | strings | string3-dc-voltage | Number:ElectricPotential | Voltage on String 3 | -| String 1 Current | strings | string1-dc-current | Number:ElectricCurrent | Current on String 1 | -| String 2 Current | strings | string2-dc-current | Number:ElectricCurrent | Current on String 2 | -| String 3 Current | strings | string3-dc-current | Number:ElectricCurrent | Current on String 3 | +| Channel Label | Channel Group ID | Channel ID | Type | Description | +|-----------------------|------------------|--------------------|---------------------------|----------------------------| +| String 1 Potential | strings | string1-dc-voltage | Number:ElectricPotential | Voltage on String 1 | +| String 2 Potential | strings | string2-dc-voltage | Number:ElectricPotential | Voltage on String 2 | +| String 3 Potential | strings | string3-dc-voltage | Number:ElectricPotential | Voltage on String 3 | +| String 1 Current | strings | string1-dc-current | Number:ElectricCurrent | Current on String 1 | +| String 2 Current | strings | string2-dc-current | Number:ElectricCurrent | Current on String 2 | +| String 3 Current | strings | string3-dc-current | Number:ElectricCurrent | Current on String 3 | | String 1 Power | strings | string1-dc-output | Number:Power | Power produced by String 1 | | String 2 Power | strings | string2-dc-output | Number:Power | Power produced by String 2 | | String 3 Power | strings | string3-dc-output | Number:Power | Power produced by String 3 | @@ -189,18 +188,18 @@ String E3DC_ModelName "E3DC Model" (e3dc) String E3DC_Firmware "E3DC Modbus ID" (e3dc) { channel="modbus:e3dc:device:powerplant:info#firmware-release" } String E3DC_SerialNumber "E3DC Modbus ID" (e3dc) { channel="modbus:e3dc:device:powerplant:info#serial-number" } -Number:Power E3DC_PVPower "E3DC PV Power" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#pv-power-supply" } -Number:Power E3DC_BatteryDischarge "E3DC Battery Discharge" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-power-supply" } -Number:Power E3DC_BatteryCharge "E3DC Battery Charge" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-power-consumption" } -Number:Power E3DC_Household "E3DC Household Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#household-power-consumption" } -Number:Power E3DC_GridConsumption "E3DC Grid Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#grid-power-consumption" } -Number:Power E3DC_GridSupply "E3DC Grid Supply " (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#grid-power-supply" } -Number:Power E3DC_ExternalSupply "E3DC External Supply" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#external-power-supply" } -Number:Power E3DC_WallboxConsumption "E3DC Wallbox Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#wallbox-power-consumption" } -Number:Power E3DC_WallboxPVConsumption "E3DC Wallbox PV Consumption" (e3dc) { channel="modbus:e3dc:device:powerplant:power#wallbox-pv-power-consumption" } -Number:Dimensionless E3DC_AutarkyLevel "E3DC Autarky Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#autarky" } -Number:Dimensionless E3DC_SelfConsumptionLevel "E3DC Self Consumption Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#self-consumption" } -Number:Dimensionless E3DC_BatterySOC "E3DC Battery SOC" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-soc" } +Number:Power E3DC_PVPower "E3DC PV Power" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#pv-power-supply" } +Number:Power E3DC_BatteryDischarge "E3DC Battery Discharge" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-power-supply" } +Number:Power E3DC_BatteryCharge "E3DC Battery Charge" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-power-consumption" } +Number:Power E3DC_Household "E3DC Household Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#household-power-consumption" } +Number:Power E3DC_GridConsumption "E3DC Power to Grid" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#grid-power-consumption" } +Number:Power E3DC_GridSupply "E3DC Power from Grid" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#grid-power-supply" } +Number:Power E3DC_ExternalSupply "E3DC External Supply" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#external-power-supply" } +Number:Power E3DC_WallboxConsumption "E3DC Wallbox Consumption" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#wallbox-power-consumption" } +Number:Power E3DC_WallboxPVConsumption "E3DC Wallbox PV Consumption" (e3dc) { channel="modbus:e3dc:device:powerplant:power#wallbox-pv-power-consumption" } +Number:Dimensionless E3DC_AutarkyLevel "E3DC Autarky Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#autarky" } +Number:Dimensionless E3DC_SelfConsumptionLevel "E3DC Self Consumption Level" (e3dc) { channel="modbus:e3dc:device:powerplant:power#self-consumption" } +Number:Dimensionless E3DC_BatterySOC "E3DC Battery SOC" (e3dc,persist) { channel="modbus:e3dc:device:powerplant:power#battery-soc" } Switch E3DC_WB_Available "E3DC WB available" (e3dc) { channel="modbus:e3dc-wallbox:device:powerplant:wallbox0:wb-available" } Switch E3DC_WB_Sunmode "E3DC WB Sunmode" (e3dc) { channel="modbus:e3dc-wallbox:device:powerplant:wallbox0:wb-sunmode" } @@ -346,7 +345,7 @@ I like the Grafana approach and I used the [InfluxDB & Grafana Tutorial](https:/ from the Community to set this up. I prepared my machine and I'm quite pleased with the results. - + In the above picture there are two graphs @@ -382,6 +381,6 @@ Items { Having these values in the timeline you're able to cross check how the forecast influences the Photovoltaic Production. - + I personally would like to have more steering control of the E3DC to react on such forecast e.g. "stop charging the car if it gets too cloudy" diff --git a/_addons_bindings/modbus.sunspec/readme.md b/_addons_bindings/modbus.sunspec/readme.md index 0acedaf61..45094063e 100644 --- a/_addons_bindings/modbus.sunspec/readme.md +++ b/_addons_bindings/modbus.sunspec/readme.md @@ -123,7 +123,7 @@ This group contains summarized values for the power meter over all phases. | ac-total-reactive-power | Number:Power | Total Reactive Power over all phases (W) | | ac-average-power-factor | Number:Dimensionless | Average AC Power Factor over all phases (%) | | ac-total-exported-real-energy | Number:Energy | Total Real Energy Exported over all phases (Wh) | -| ac-total-imported-real-energy | Number:Energy | Total Real Energy Imported over all phases (Wh) | +| ac-total-imported-real-energy | Number:Energy | Total Real Energy Imported over all phases (Wh) | | ac-total-exported-apparent-energy | Number:Energy | Total Apparent Energy Exported over all phases (VAh) | | ac-total-imported-apparent-energy | Number:Energy | Total Apparent Energy Imported over all phases (VAh) | | ac-total-imported-reactive-energy-q1 | Number:Energy | Total Reactive Energy Imported Quadrant 1 over all phases (VARh) | @@ -148,7 +148,7 @@ acPhaseC: available only for inverter-three-phase type inverters. | Channel ID | Item Type | Description | |----------------------|--------------------------|---------------------------------------------------------------------| -| ac-phase-current | Number:ElectricCurrent | Actual current over this phase in Watts | +| ac-phase-current | Number:ElectricCurrent | Actual current over this phase in Ampere | | ac-voltage-to-next | Number:ElectricPotential | Voltage of this phase relative to the next phase, or to the ground in case of single phase inverter. Note: some single phase SolarEdge inverters incorrectly use this value to report the voltage to neutral value| | ac-voltage-to-n | Number:ElectricPotential | Voltage of this phase relative to the ground | diff --git a/_addons_bindings/mpd/readme.md b/_addons_bindings/mpd/readme.md index 5dc9d2f64..053569d9f 100644 --- a/_addons_bindings/mpd/readme.md +++ b/_addons_bindings/mpd/readme.md @@ -3,7 +3,7 @@ id: mpd label: MPD title: MPD - Bindings type: binding -description: "[Music Player Daemon (MPD)](http://www.musicpd.org/) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol." +description: "[Music Player Daemon (MPD)](https://www.musicpd.org/) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol." since: 3x install: auto --- @@ -14,7 +14,7 @@ install: auto # MPD Binding -[Music Player Daemon (MPD)](http://www.musicpd.org/) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol. +[Music Player Daemon (MPD)](https://www.musicpd.org/) is a flexible, powerful, server-side application for playing music. Through plugins and libraries it can play a variety of sound files while being controlled by its network protocol. With the openHAB MPD binding you can control Music Player Daemons. diff --git a/_addons_bindings/mqtt.generic/readme.md b/_addons_bindings/mqtt.generic/readme.md index 037d9b7ad..1d7220a43 100644 --- a/_addons_bindings/mqtt.generic/readme.md +++ b/_addons_bindings/mqtt.generic/readme.md @@ -5,7 +5,6 @@ title: MQTT Things and Channels - Bindings type: binding description: "MQTT is one of the most commonly used protocols in IoT (Internet of Things) projects. It stands for Message Queuing Telemetry Transport." since: 3x -logo: images/addons/mqtt.generic.png install: manual --- @@ -57,7 +56,7 @@ binding can unfortunately not provide any auto-discovery means. If you use an open source IoT device, the chances are high, that it has the MQTT convention Homie or HomeAssistant implemented. Those conventions specify the topic topology and allow auto discovery. Please have a look at the specific openHAB bindings. - + ## Supported Things Because of the very generic structure of MQTT, this binding allows you to add an arbitrary number @@ -86,15 +85,15 @@ You can add the following channels: ## Channel Configuration -* __stateTopic__: The MQTT topic that represents the state of the thing. This can be empty, the thing channel will be a state-less trigger then. You can use a wildcard topic like "sensors/+/event" to retrieve state from multiple MQTT topics. -* __transformationPattern__: An optional transformation pattern like [JSONPath](http://goessner.net/articles/JsonPath/index.html#e2) that is applied to all incoming MQTT values. -* __transformationPatternOut__: An optional transformation pattern like [JSONPath](http://goessner.net/articles/JsonPath/index.html#e2) that is applied before publishing a value to MQTT. +* __stateTopic__: The MQTT topic that represents the state of the thing. This can be empty, the thing channel will be a state-less trigger then. You can use a wildcard topic like "sensors/+/event" to retrieve state from multiple MQTT topics. +* __transformationPattern__: An optional transformation pattern like [JSONPath](https://goessner.net/articles/JsonPath/index.html#e2) that is applied to all incoming MQTT values. +* __transformationPatternOut__: An optional transformation pattern like [JSONPath](https://goessner.net/articles/JsonPath/index.html#e2) that is applied before publishing a value to MQTT. * __commandTopic__: The MQTT topic that commands are send to. This can be empty, the thing channel will be read-only then. Transformations are not applied for sending data. * __formatBeforePublish__: Format a value before it is published to the MQTT broker. The default is to just pass the channel/item state. If you want to apply a prefix, say "MYCOLOR,", you would use "MYCOLOR,%s". Currently only "%s" is supported. * __postCommand__: If `true`, the received MQTT value will not only update the state of linked items, but command it. The default is `false`. - You usually need this to be `true` if your item is also linked to another channel, say a KNX actor, and you want a received MQTT payload to command that KNX actor. -* __retained__: The value will be published to the command topic as retained message. A retained value stays on the broker and can even be seen by MQTT clients that are subscribing at a later point in time. + You usually need this to be `true` if your item is also linked to another channel, say a KNX actor, and you want a received MQTT payload to command that KNX actor. +* __retained__: The value will be published to the command topic as retained message. A retained value stays on the broker and can even be seen by MQTT clients that are subscribing at a later point in time. * __qos__: QoS of this channel. Overrides the connection QoS (defined in broker connection). * __trigger__: If `true`, the state topic will not update a state, but trigger a channel instead. @@ -117,7 +116,7 @@ If you always require an integer, please use the formatter. You can connect this channel to a Number item. ### Channel Type "dimmer" - + * __on__: An optional string (like "ON"/"Open") that is recognized as minimum. * __off__: An optional string (like "OFF"/"Close") that is recognized as maximum. * __min__: A required minimum value. @@ -181,16 +180,16 @@ The channel expects values on the corresponding MQTT topic to be in this format You can connect this channel to a Location item. The channel will publish the location as comma separated list to the MQTT broker, -e.g. "112,54,123" for latitude, longitude, altitude. The altitude is optional. +e.g. "112,54,123" for latitude, longitude, altitude. The altitude is optional. -The channel expects values on the corresponding MQTT topic to be in this format as well. +The channel expects values on the corresponding MQTT topic to be in this format as well. ### Channel Type "image" You can connect this channel to an Image item. This is a read-only channel. The channel expects values on the corresponding MQTT topic to contain the binary -data of a bmp, jpg, png or any other format that the installed java runtime supports. +data of a bmp, jpg, png or any other format that the installed java runtime supports. ### Channel Type "datetime" @@ -199,7 +198,7 @@ You can connect this channel to a DateTime item. The channel will publish the date/time in the format "yyyy-MM-dd'T'HH:mm" for example 2018-01-01T12:14:00. If you require another format, please use the formatter. -The channel expects values on the corresponding MQTT topic to be in this format as well. +The channel expects values on the corresponding MQTT topic to be in this format as well. ### Channel Type "rollershutter" @@ -280,19 +279,19 @@ Here are a few examples: - For an output of *May 23, 1995* use "%1$**tb** %1$**te**,%1$**tY**". - For an output of *23.05.1995* use "%1$**td**.%1$**tm**.%1$**tY**". - For an output of *23:15* use "%1$**tH**:%1$**tM**". - + Default pattern applied for each type: | Type | Parameter | Pattern | Comment | | ---------------- | --------------------------------- | ------------------- | ------- | -| __string__ | String | "%s" | -| __number__ | BigDecimal | "%f" | The default will remove trailing zeros after the decimal point. -| __dimmer__ | BigDecimal | "%f" | The default will remove trailing zeros after the decimal point. -| __contact__ | String | -- | No pattern supported. Always **on** and **off** strings. -| __switch__ | String | -- | No pattern supported. Always **on** and **off** strings. +| __string__ | String | "%s" | +| __number__ | BigDecimal | "%f" | The default will remove trailing zeros after the decimal point. +| __dimmer__ | BigDecimal | "%f" | The default will remove trailing zeros after the decimal point. +| __contact__ | String | -- | No pattern supported. Always **on** and **off** strings. +| __switch__ | String | -- | No pattern supported. Always **on** and **off** strings. | __colorRGB__ | BigDecimal, BigDecimal, BigDecimal| "%1$d,%2$d,%3$d" | Parameters are **red**, **green** and **blue** components. | __colorHSB__ | BigDecimal, BigDecimal, BigDecimal| "%1$d,%2$d,%3$d" | Parameters are **hue**, **saturation** and **brightness** components. | __location__ | BigDecimal, BigDecimal | "%2$f,%3$f,%1$f" | Parameters are **altitude**, **latitude** and **longitude**, altitude is only in default pattern, if value is not '0'. -| __image__ | -- | -- | No publishing supported. +| __image__ | -- | -- | No publishing supported. | __datetime__ | ZonedDateTime | "%1$tY-%1$tm-%1$tdT%1$tH:%1$tM:%1$tS.%1$tN" | Trailing zeros of the nanoseconds are removed. | __rollershutter__| String | "%s" | No pattern supported. Always **up**, **down**, **stop** string or integer percent value. @@ -301,4 +300,4 @@ Any outgoing value transformation will **always** result in a __string__ value. ## Troubleshooting * If you get the error "No MQTT client": Please update your installation. -* If you use the Mosquitto broker: Please be aware that there is a relatively low setting for retained messages. At some point messages will just not being delivered anymore: Change the setting. +* If you use the Mosquitto broker: Please be aware that there is a relatively low setting for retained messages. If at some point messages stop being delivered change the setting. diff --git a/_addons_bindings/mqtt/readme.md b/_addons_bindings/mqtt/readme.md index 2899b4e2a..a31c96d23 100644 --- a/_addons_bindings/mqtt/readme.md +++ b/_addons_bindings/mqtt/readme.md @@ -21,8 +21,7 @@ install: auto MQTT is a server/client architecture. A server, also called broker is not provided within this binding. -You can use any of the freely available MQTT Brokers like [Mosquitto](https://mosquitto.org/) -or [Moquette](https://moquette-io.github.io/moquette/) or install the [included Moquette broker](https://www.openhab.org/addons/integrations/mqttembeddedbroker/) as add-on. +You can use any of the freely available MQTT Brokers like [Mosquitto](https://mosquitto.org/). This particular binding allows to configure connections to brokers via openHAB Things. This binding does NOT allow you to link Channels to MQTT topics or perform auto-discovery of available @@ -85,7 +84,4 @@ Configuration parameters are: * __stateTopic__: This channel will trigger on this MQTT topic. This topic can contain wildcards like + and # for example "all/in/#" or "sensors/+/config". * __payload__: An optional condition on the value of the MQTT topic that must match before this channel is triggered. -## Legacy MQTT1-Binding - -This binding is not supposed to run in parallel to the old mqtt1-binding. -Please uninstall the old binding before installing this binding. +Note for new users - direct broker Bridge channels are rarely needed. You almost certainly will want to be using one of the binding extensions, or the generic Things and Channels features for most devices or services. diff --git a/_addons_bindings/netatmo/readme.md b/_addons_bindings/netatmo/readme.md index 69c918d4f..7452493d6 100644 --- a/_addons_bindings/netatmo/readme.md +++ b/_addons_bindings/netatmo/readme.md @@ -22,7 +22,7 @@ The Netatmo binding integrates the following Netatmo products: - *Indoor Camera / Welcome*. Reports last event and persons at home, consult picture and video from event/camera. - *Outdoor Camera / Presence*. Reports last event, consult picture and video from event/camera. -See http://www.netatmo.com/ for details on their product. +See https://www.netatmo.com/ for details on their product. Please note, recent Netatmo thermostats are not supported because they require the Energy API which is not yet implemented in the binding. Only older Netatmo thermostats compatible with the Thermostat API are supported. @@ -84,7 +84,7 @@ You will define here public way to access your openHAB server: http(s)://xx.yy.zz.ww:8080 ``` -Your Netatmo App will be configured automatically by the bridge to the endpoint : +Your Netatmo App will be configured automatically by the bridge to the endpoint : ``` http(s)://xx.yy.zz.ww:8080/netatmo/%id%/camera @@ -102,7 +102,7 @@ First login with your user. Then some examples of the documentation contain the **real results** of your weather station. In order to try the examples, you need the `device_id` of your Netatmo station. You can find it in the configuration menu of the app (android or apple). -Get the IDs of your devices (indoor, outdoor, rain gauge) +Get the IDs of your devices (indoor, outdoor, rain gauge) [here](https://dev.netatmo.com/resources/technical/reference/weather/getstationsdata). `main_device` is the ID of the "main device", the indoor sensor. @@ -231,7 +231,7 @@ All these channels are read only. ### Weather Station Outdoor module -Example item for the **outdoor module** +Example item for the **outdoor module** ``` Number Netatmo_Outdoor_Temperature "Temperature" { channel = "netatmo:NAModule1:home:outside:Temperature" } @@ -283,7 +283,7 @@ All these channels are read only. ### Weather Station Additional Indoor module -Example item for the **indoor module** +Example item for the **indoor module** ``` Number Netatmo_Indoor2_Temperature "Temperature" { channel = "netatmo:NAModule4:home:insidesupp:Temperature" } @@ -783,7 +783,7 @@ sitemap netatmo label="Netatmo" { Text item=Indoor_Location Text item=Indoor_LastStatusStore } - Frame label="Outdoor" { + Frame label="Outdoor" { Text item=Outdoor_Temperature Text item=Outdoor_TempTrend Text item=Outdoor_Humidity @@ -813,7 +813,7 @@ sitemap netatmo label="Netatmo" { If you want to evaluate this binding but have not got a Netatmo station yourself yet, you can add the Netatmo office in Paris to your account: -http://www.netatmo.com/en-US/addguest/index/TIQ3797dtfOmgpqUcct3/70:ee:50:00:02:20 +https://www.netatmo.com/en-US/addguest/index/TIQ3797dtfOmgpqUcct3/70:ee:50:00:02:20 # Icons diff --git a/_addons_bindings/nibeheatpump/readme.md b/_addons_bindings/nibeheatpump/readme.md index 75e2f11e1..5d4a68abf 100644 --- a/_addons_bindings/nibeheatpump/readme.md +++ b/_addons_bindings/nibeheatpump/readme.md @@ -16,7 +16,7 @@ install: auto # Nibe Heatpump Binding The Nibe Heatpump binding is used to get live data from Nibe heat pumps without using an expensive MODBUS40 adapter. -This binding is compatible with the F750, F1145, F1245, F1155, F1255 and F470 heat pump models. +This binding is compatible with the F750, F1145, F1245, F1155, F1255, F470 and SMO40 heat pump models. The binding supports data telegrams (containing a maximum of 20 registers) from the heat pump. The binding can also read other registers from the pump. @@ -45,6 +45,9 @@ This binding supports direct serial port connection (RS-485 adapter needed) to h | f470-serial | Serial port connected F470 Heat Pumps | | f470-udp | UDP connected Nibe F470 Heat Pumps | | f470-simulator | Simulator for Nibe F470 Heat Pumps | +| smo40-serial | Serial port connected SMO40 controller | +| smo40-udp | UDP connected Nibe SMO40 controller | +| smo40-simulator | Simulator for Nibe SMO40 controller | ## Discovery @@ -74,7 +77,7 @@ An Arduino-based solution has been tested with Arduino uno + RS485 and Ethernet The [ProDiNo](https://www.kmpelectronics.eu/en-us/products/prodinoethernet.aspx) NetBoards are also supported. A ProDiNo has an Ethernet and RS-485 port on the board. -Arduino code is available [here](https://github.com/openhab/openhab-addons/tree/master/bundles/org.openhab.binding.nibeheatpump/contrib/NibeGW/Arduino/NibeGW). +Arduino code is available [here](https://github.com/openhab/openhab-addons/tree/main/bundles/org.openhab.binding.nibeheatpump/contrib/NibeGW/Arduino/NibeGW). Arduino code can be build via Arduino IDE. For more details see [www.arduino.cc](https://www.arduino.cc/en/Main/Software). @@ -82,7 +85,7 @@ NibeGW configuration (such IP addresses, ports, etc) can be adapted directly by ### Raspberry Pi (or other Linux/Unix based boards) -C code is available [here](https://github.com/openhab/openhab-addons/tree/master/bundles/org.openhab.binding.nibeheatpump/contrib/NibeGW/RasPi). +C code is available [here](https://github.com/openhab/openhab-addons/tree/main/bundles/org.openhab.binding.nibeheatpump/contrib/NibeGW/RasPi). To build the C code use: @@ -1911,3 +1914,12 @@ This binding currently supports following channels for F1x55 pump models: | 49380 | Switch | 0 | 1 | Setting | External ERS 3 accessory bypass at heat | | | 49381 | Switch | 0 | 1 | Setting | External ERS 2 accessory bypass at heat | | | 49430 | Number | 0 | 255 | Setting | AUX ERS Fire Place Guard | | + + +### SMO40 + +To keep this documentation light, all parameters are documented in the NIBE ModbusManager except of: +| Channel Type ID | Item Type | Min | Max | Type | Description | Values | +|-----------------|-----------|-------------|------------|---------|----------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 45780 | Number | 0 | 120 | Setting | Silent Mode Frequency 1 (defined in the service-menu) | | +| 49806 | Number | 0 | 120 | Setting | Silent Mode Frequency 2 (defined in the service-menu) | | diff --git a/_addons_bindings/nikohomecontrol/readme.md b/_addons_bindings/nikohomecontrol/readme.md index 58bfe5e72..4eae84ed6 100644 --- a/_addons_bindings/nikohomecontrol/readme.md +++ b/_addons_bindings/nikohomecontrol/readme.md @@ -307,7 +307,7 @@ Bridge nikohomecontrol:bridge2:nhc2 [ addr="192.168.0.70", port=8884, password=" dimmer 3 "DiningRoom" [ actionId="abcdef01-abcd-1234-ab98-abcdef012345", step=5 ] blind 4 [ actionId="abcdef01-abcd-1234-ab98-abcdefabcdef" ] thermostat 5 [ thermostatId="abcdef01-abcd-1234-ab98-012345abcdef", overruleTime=10 ] - electricitymeter 6 [ energyMeterId="abcdef01-abcd-1234-cd56-ffee34567890" ] + energymeter 6 [ energyMeterId="abcdef01-abcd-1234-cd56-ffee34567890" ] } Bridge nikohomecontrol:bridge:nhc3 [ addr="192.168.0.110" ] { diff --git a/_addons_bindings/nuki/readme.md b/_addons_bindings/nuki/readme.md index a6747dbc4..ca1147bfc 100644 --- a/_addons_bindings/nuki/readme.md +++ b/_addons_bindings/nuki/readme.md @@ -108,7 +108,7 @@ sitemap nuki label="Nuki Smart Lock" { Switch item=Frontdoor_Lock } Frame label="Channel State used for lock actions" { - Switch item=Frontdoor_State mappings=[2="Unlock", 7="Unlatch", 1002="LnGo", 1007="LnGoU", 4="Lock"] + Switch item=Frontdoor_LockState mappings=[2="Unlock", 7="Unlatch", 1002="LnGo", 1007="LnGoU", 4="Lock"] } Frame label="Channel State" { Text item=Frontdoor_LockState label="Lock State [MAP(nukilockstates.map):%s]" diff --git a/_addons_bindings/ojelectronics/readme.md b/_addons_bindings/ojelectronics/readme.md index 928831266..89cb1ba6b 100644 --- a/_addons_bindings/ojelectronics/readme.md +++ b/_addons_bindings/ojelectronics/readme.md @@ -75,7 +75,7 @@ This example shows how to configure the OJElecttronics binding. ### demo.things ``` -Binding ojelectronics:ojcloud:myCloud "My Cloud" @ "My Home" [ userName="MyUserName" password="MyPassword" apiKey="The Key" ] { +Bridge ojelectronics:ojcloud:myCloud "My Cloud" @ "My Home" [ userName="MyUserName", password="MyPassword", apiKey="The Key" ] { Thing owd5 myThermostat [ serialNumber="123" ] } ``` @@ -83,8 +83,8 @@ Binding ojelectronics:ojcloud:myCloud "My Cloud" @ "My Home" [ userName="MyUserN ### demo.items ``` -Number Bath_Floor_Temperature "Bathroom: Floor Temperature" {channel="ojelectronics:owd5:myThermostat:floorTemperature"} -String Bath_Mode "Bathroom: Mode" {channel="ojelectronics:owd5:myThermostat:regulationMode"} +Number Bath_Floor_Temperature "Bathroom: Floor Temperature" {channel="ojelectronics:owd5:myCloud:myThermostat:floorTemperature"} +String Bath_Mode "Bathroom: Mode" {channel="ojelectronics:owd5:myCloud:myThermostat:regulationMode"} ``` ### demo.sitemap diff --git a/_addons_bindings/onewire/readme.md b/_addons_bindings/onewire/readme.md index bfaf7328b..96f54c419 100644 --- a/_addons_bindings/onewire/readme.md +++ b/_addons_bindings/onewire/readme.md @@ -33,19 +33,15 @@ The `owserver` is the bridge that connects to an existing OWFS installation. ### Things -There are different types of things: the simple one (`basic`), multisensors built around the DS1923/DS2438 chip (`ms-tx`) and more advanced sensors from Elaborated Networks (www.wiregate.de) (`ams`, `bms`), Embedded Data System (www.embeddeddatasystems.com)(`edsenv`) and Brain4Home (www.brain4home.eu) (`bae091x`). - -** Important: Breaking Change ** - -The thing types `ms-th`, `ms-tv`, `counter2`, `digitalio`, `digitalio2`, `digitalio8`, `ibutton`, `temperature` have been removed. +There are different types of things: the simple one (`basic`), multisensors built around the DS1923/DS2438 chip (`ms-tx`) and more advanced sensors from Elaborated Networks (www.wiregate.de) (`ams`, `bms`), Embedded Data System (www.embeddeddatasystems.com)(`edsenv`) and Brain4Home (`bae091x`). ## Discovery -Discovery is supported for things. You have to add the bridges manually. +Discovery is supported for things. You have to add the bridges manually. ## Thing Configuration -It is strongly recommended to use discovery and Paper UI for thing configuration. +It is strongly recommended to add things using discovery and configure them using the UI. Please note that: * All things need a bridge. @@ -64,7 +60,7 @@ The `address` parameter is used to denote the location of the owserver instance. It supports both, a hostname or an IP address. The `port` parameter is used to adjust non-standard OWFS installations. -It defaults to `4304`, which is the default of each OWFS installation. +It defaults to `4304`, which is the default of each OWFS installation. Bridges of type `owserver` are extensible with channels of type `owfs-number` and `owfs-string`. diff --git a/_addons_bindings/oppo/readme.md b/_addons_bindings/oppo/readme.md index e504bfc6a..e048fa337 100644 --- a/_addons_bindings/oppo/readme.md +++ b/_addons_bindings/oppo/readme.md @@ -58,7 +58,7 @@ The thing has the following configuration parameters: | Address | host | Host name or IP address of the Oppo player or serial over IP device. | host name or ip | | Port | port | Communication port for using serial over IP. Leave blank if using direct IP connection to the player. | ip port number | | Serial Port | serialPort | Serial port to use for directly connecting to the Oppo player | a comm port name | -| Verbose Mode | verboseMode | (Optional) If true, the player will send time updates every second. If set false, the binding polls the player every 15 seconds. | Boolean; default false | +| Verbose Mode | verboseMode | (Optional) If true, the player will send time updates every second. If set false, the binding polls the player every 10 seconds. | Boolean; default false | Some notes: @@ -68,9 +68,10 @@ Some notes: * The UDP-20x series should be fully functional over direct IP connection but this was not able to be tested by the developer. * As previously noted, when using verbose mode, the player will send time code messages once per second while playback is ongoing. * Be aware that this could cause performance impacts to your openHAB system. -* In non-verbose (the default), the binding will poll the player every 15 seconds to update play time, track and chapter information instead. +* In non-verbose (the default), the binding will poll the player every 10 seconds to update play time, track and chapter information instead. * In order for the direct IP connection to work while the player is turned off, the Standby Mode setting must be set to "Quick Start" in the Device Setup menu. * Likewise if the player is turned off, it may not be discoverable by the Binding's discovery scan. +* If the player is switched off when the binding first starts up or if power to the player is ever interrupted, up to 30 seconds may elapse before the binding begins to update when the player is switched on. * If you experience any issues using the binding, first ensure that the player's firmware is up to date with the latest available version (especially on the older models). * For the older models, some of the features in the control API were added after the players were shipped. * Available HDMI modes for BDP-83 & BDP-9x: AUTO, SRC, 1080P, 1080I, 720P, SDP, SDI diff --git a/_addons_bindings/paradoxalarm/readme.md b/_addons_bindings/paradoxalarm/readme.md index a66653a7d..0ba3626be 100644 --- a/_addons_bindings/paradoxalarm/readme.md +++ b/_addons_bindings/paradoxalarm/readme.md @@ -61,6 +61,7 @@ Currently binding supports the following panels: EVO192, EVO48(not tested), EVO9 |communicationState | Shows the communication status to Paradox. Different from Bridge status. Bridge may be online and able to receive commands but communication may be offline due to various reasons. Possible values [Offline, Online] | #### Communication command channel allowed values + | Value | Description | |--------|------------------------------------------------------------------------------------| | LOGOUT | Logs out and disconnects from Paradox alarm system | @@ -75,6 +76,7 @@ Currently binding supports the following panels: EVO192, EVO48(not tested), EVO9 | disarmEnabled | Optional boolean flag. Valid for partitions. When set to true the command DISARM will be allowed for the partition where the flag is enabled. CAUTION: Enabling DISARM command can be dangerous. If attacker can gain access to your openHAB (via API or UI), this command can be used to disarm your armed partition (area) | ### Panel channels: + | Channel | Type | Description | |--------------------------|----------------------------|-------------------------------------------------------------------------------------------| | state | String | Overall panel state | @@ -188,11 +190,13 @@ Currently binding supports the following panels: EVO192, EVO48(not tested), EVO9 } } ``` + ## Acknowledgements + This binding would not be possible without the reverse engineering of the byte level protocol and the development by other authors in python, C# and other languages. Many thanks to the following authors and their respective GitHub repositories for their development that helped in creating this binding: João Paulo Barraca - https://github.com/ParadoxAlarmInterface/pai Jean Henning - repository not available -Tertuish - https://github.com/Tertiush/ParadoxIP150v2 / https://github.com/Tertiush/ParadoxIP150 \ No newline at end of file +Tertuish - https://github.com/Tertiush/ParadoxIP150v2 / https://github.com/Tertiush/ParadoxIP150 diff --git a/_addons_bindings/robonect/readme.md b/_addons_bindings/robonect/readme.md index 3605c551a..f3e2b9b0b 100644 --- a/_addons_bindings/robonect/readme.md +++ b/_addons_bindings/robonect/readme.md @@ -3,7 +3,7 @@ id: robonect label: Robonect title: Robonect - Bindings type: binding -description: "Robonect is a piece of hardware which has to be put into your Husqvarna, Gardena and other branded automower and makes" +description: "Robonect is a piece of hardware which has to be put into your Husqvarna, Gardena and other branded automower and makes it accessible in your internal network." since: 3x install: auto --- @@ -14,16 +14,14 @@ install: auto # Robonect Binding -Robonect is a piece of hardware which has to be put into your Husqvarna, Gardena and other branded automower and makes -it accessible in your internal network. +Robonect is a piece of hardware which has to be put into your Husqvarna, Gardena and other branded automower and makes it accessible in your internal network. More details about the Robonect module can be found at [robonect.de](https://forum.robonect.de/) -This binding integrates mowers having the robonect module installed as a thing into the home automation solution, allowing to -control the mower and react on mower status changes in rules. +This binding integrates mowers having the robonect module installed as a thing into the home automation solution, allowing to control the mower and react on mower status changes in rules. ## Supported Things -The binding exposes just one Thing type which is the `mower`. +The binding supports one Thing type which is the `mower`. Tested mowers @@ -37,11 +35,11 @@ Tested mowers ## Discovery -Robonect does not support automatic discovery. So the thing has to be added manually either via Paper UI or things configuration. +Automatic discovery is not supported. ## Thing Configuration -following configuration settings are supported for the `mower` thing. +The following configuration settings are supported for the `mower` thing. | parameter name | mandatory | description | |----------------|-----------|---------------------------------------------------------------------------------------------------| @@ -53,7 +51,7 @@ following configuration settings are supported for the `mower` thing. | timezone | no | the timezone as configured in Robonect on the robot (default: Europe/Berlin) | -An example things configuration might look like +An example things configuration might look like: ```java Thing robonect:mower:automower "Mower" @ "Garden" [ host="192.168.2.1", pollInterval="5", user="gardener", password = "cutter"] @@ -85,7 +83,7 @@ Thing robonect:mower:automower "Mower" @ "Garden" [ host="192.168.2.1", pollInte ### Offline Trigger Channel -This channel s triggered if the mower is longer than the configured `offlineTriggerTimeout` offline. +This channel s triggered if the mower is longer than the configured `offlineTriggerTimeout` offline. This may indicate that the mower may stuck somewhere in error state but does not have a signal. ## Full Example diff --git a/_addons_bindings/senechome/readme.md b/_addons_bindings/senechome/readme.md index 123922938..8f1490de6 100644 --- a/_addons_bindings/senechome/readme.md +++ b/_addons_bindings/senechome/readme.md @@ -141,4 +141,4 @@ Text label="Power Grid"{ Default item=SenecLiveGridExport } } -``` \ No newline at end of file +``` diff --git a/_addons_bindings/somfymylink/readme.md b/_addons_bindings/somfymylink/readme.md index 93ecca7b8..7911c6120 100644 --- a/_addons_bindings/somfymylink/readme.md +++ b/_addons_bindings/somfymylink/readme.md @@ -70,4 +70,4 @@ The following channels are supported by the binding. Note that specific weather Bridge somfymylink:mylink:mylink1 "myLink Bridge" @ "Office" [ ipAddress="192.168.1.1", systemId="mysystemidhere" ] { Thing shade shade1 "Living Room" [ targetId="CC114A21.1" ] } -``` \ No newline at end of file +``` diff --git a/_addons_bindings/systeminfo/readme.md b/_addons_bindings/systeminfo/readme.md index 0ffd79b96..f3ff1cb39 100644 --- a/_addons_bindings/systeminfo/readme.md +++ b/_addons_bindings/systeminfo/readme.md @@ -191,7 +191,7 @@ OSHI project has a good support and regularly updates the library with fixes to In order to update the version used in the binding, follow these easy steps: -- Go to the [OSHI GitHub repo](https://github.com/oshi/oshi) and download the newest version available of the module oshi-core or download the jar from the [Maven Central](http://search.maven.org/#search%7Cga%7C1%7Coshi-). Check if the versions of the OSHI dependencies as well (jna and jna-platform) are changed; +- Go to the [OSHI GitHub repo](https://github.com/oshi/oshi) and download the newest version available of the module oshi-core or download the jar from the [Maven Central](https://search.maven.org/#search%7Cga%7C1%7Coshi-). Check if the versions of the OSHI dependencies as well (jna and jna-platform) are changed; - Replace the jars in lib folder; - Modify the .classpath file with the new versions of the jars; - Modify the header Bundle-ClassPath in the META-INF/MANIFEST.MF. diff --git a/_addons_bindings/touchwand/readme.md b/_addons_bindings/touchwand/readme.md index ee8b03326..d5dcf7b42 100644 --- a/_addons_bindings/touchwand/readme.md +++ b/_addons_bindings/touchwand/readme.md @@ -16,15 +16,15 @@ install: auto Touchwand Wanderfull™ Hub basic is a plug & play Z-Wave based controller that uses Wi-Fi and Bluetooth to easily connect all smart home components. TouchWand products are compatible with most major Z-Wave products, IP controlled devices and KNX devices, providing the ideal solution for building all-inclusive full-featured smart homes. -[TouchWand.com](http://www.touchwand.com) +[TouchWand.com](https://www.touchwand.com) -![Touchwand Wanderfull™ Hub](http://www.touchwand.com/wp-content/uploads/2017/12/hub-toch-1.png) +![Touchwand Wanderfull™ Hub](https://www.touchwand.com/wp-content/uploads/2017/12/hub-toch-1.png) ## Supported Things This binding supports switches, shutters dimmers alarm sensors and wall controllers configured in Touchwand Wanderfull™ Hub Controller. -## Control and Status +## Control and Status 1. **switch** - control - ON/OFF 2. **shutter** - control - UP/DOWN/STOP @@ -38,7 +38,7 @@ After adding TouchWand Hub the auto discovery will add all switches dimmers alar ## Bridge Configuration -**Touchwand Wanderfull™** Hub Controller need to be added manually by IP address. The controller requires **username** and **password** +**Touchwand Wanderfull™** Hub Controller need to be added manually by IP address. The controller requires **username** and **password** | Parameter | Description | Units | required | |-------------------|-----------------------------------------------------------------------|---------|----------| @@ -55,13 +55,13 @@ After adding TouchWand Hub the auto discovery will add all switches dimmers alar No thing configuration is needed -## Channels +## Channels note **Touchwand Wanderfull™** supports various types of alarm sensors such as water leak, door/window sensor and motion sensor. Alarm Sensor thing represents a generic sensor, relevant sensor channels will be displayed once a sensor is added as a Thing. -| Channel Type ID | Item Type | Description +| Channel Type ID | Item Type | Description |-------------------|--------------------|-----------------------------------------------------------------------| | switch | Switch | This channel supports switching the device on and off. | | shutter | Rollershutter | This channel controls the shutter position | @@ -82,9 +82,9 @@ Alarm Sensor thing represents a generic sensor, relevant sensor channels will be ### touchwand.things -Things can be defined manually -The syntax for touchwand this is - +Things can be defined manually +The syntax for touchwand this is + ```xtend Thing :: "Label" @ "Location" ``` diff --git a/_addons_bindings/upb/readme.md b/_addons_bindings/upb/readme.md index 236ba8cfc..8eb758908 100644 --- a/_addons_bindings/upb/readme.md +++ b/_addons_bindings/upb/readme.md @@ -5,6 +5,7 @@ title: UPB - Bindings type: binding description: "Universal Powerline Bus (UPB) is a protocol for communication over household electrical wiring." since: 3x +logo: images/addons/upb.png install: auto --- diff --git a/_addons_bindings/venstarthermostat/readme.md b/_addons_bindings/venstarthermostat/readme.md index ede5a84f3..1af341137 100644 --- a/_addons_bindings/venstarthermostat/readme.md +++ b/_addons_bindings/venstarthermostat/readme.md @@ -3,7 +3,7 @@ id: venstarthermostat label: Venstar Thermostat title: Venstar Thermostat - Bindings type: binding -description: "The Venstar Thermostat binding supports an interface to WiFi enabled ColorTouch and Explorer thermostats manufactured by [Venstar](http://www.venstar.com)." +description: "The Venstar Thermostat binding supports an interface to WiFi enabled ColorTouch and Explorer thermostats manufactured by [Venstar](https://www.venstar.com)." since: 3x install: auto --- @@ -14,32 +14,32 @@ install: auto # Venstar Thermostat Binding -The Venstar Thermostat binding supports an interface to WiFi enabled ColorTouch and Explorer thermostats manufactured by [Venstar](http://www.venstar.com). +The Venstar Thermostat binding supports an interface to WiFi enabled ColorTouch and Explorer thermostats manufactured by [Venstar](https://www.venstar.com). Venstar WiFi enabled thermostats provide a local API that this binding uses -to communicate with the thermostat. This binding does not require "cloud" +to communicate with the thermostat. This binding does not require "cloud" access and may be used independently of Venstar's Skyport cloud services. -The Local API is not enabled by default, so you will need to set up your +The Local API is not enabled by default, so you will need to set up your thermostat by configuring its WiFi connection and enabling the Local API. In -order for the binding to connect, you will need to enable HTTPS support and +order for the binding to connect, you will need to enable HTTPS support and set a username and password. While it is possible to enable the Local API without HTTPS and authentication, the binding doesn't support it, in an effort to provide as secure an installation as possible. When you've set the username and password, make a note of these, as you'll need -to enter them in the thermostat configuration in openHAB. +to enter them in the thermostat configuration in openHAB. ## Supported Things | Thing Type | Description | |----------------------|-----------------------------------------------------------------------------------| -| colorTouchThermostat | A Venstar [ColorTouch](http://www.venstar.com/thermostats/colortouch/) thermostat | +| colorTouchThermostat | A Venstar [ColorTouch](https://www.venstar.com/thermostats/colortouch/) thermostat | ## Discovery Once the binding is installed it will attempt to auto discovery Venstar thermostats located on the local network. -These will appear as Things in the system Inbox. +These will appear as Things in the system Inbox. After adding the Inbox item, enter the user name and password from the physical thermostat in the Thing's configuration. ## Thing Configuration @@ -70,7 +70,7 @@ After adding the Inbox item, enter the user name and password from the physical ## Example -### thermostat.things +### thermostat.things ``` Thing venstarthermostat:colorTouchThermostat:001122334455 "Venstar Thermostat (Guest)" [ username="admin", password="secret", url="https://192.168.1.100", refresh=30 ] @@ -95,7 +95,7 @@ sitemap demo label="Venstar Color Thermostat Demo" { Frame { Setpoint item=Guest_HVAC_HeatSetpoint minValue=50 maxValue=99 - Setpoint item=Guest_HVAC_CoolSetpoint minValue=50 maxValue=99 + Setpoint item=Guest_HVAC_CoolSetpoint minValue=50 maxValue=99 Switch item=Guest_HVAC_Mode mappings=[off=Off,heat=Heat,cool=Cool,auto=Auto] Text item=Guest_HVAC_State } diff --git a/_addons_bindings/zwave/readme.md b/_addons_bindings/zwave/readme.md index 5663b82ca..4a1d9d721 100644 --- a/_addons_bindings/zwave/readme.md +++ b/_addons_bindings/zwave/readme.md @@ -86,9 +86,9 @@ Sets the nightly heal time (in hours). The inclusion mode setting allows the user to set how the controller will initiate inclusion when discovery is initiated. There are three options available -: -* Low Power Inclusion: In this mode devices must be within 1 meter of the controller to be included. -* High Power Inclusion: In this mode devices must be able to communicate directly with the controller, so can be 10 to 15 meters from the controller under most conditions. -* Network Wide Inclusion: In this mode devices can be anywhere in the network. This mode +* [`0`] Low Power Inclusion: In this mode devices must be within 1 meter of the controller to be included. +* [`1`] High Power Inclusion: In this mode devices must be able to communicate directly with the controller, so can be 10 to 15 meters from the controller under most conditions. +* [`2`] Network Wide Inclusion: In this mode devices can be anywhere in the network. This mode #### Secure Inclusion Mode [security_inclusionmode] @@ -420,30 +420,22 @@ To disable debug logging, enter the following command -: log:set INFO org.openhab.binding.zwave ``` -By default, this will put all logging into the standard ```openhab.log``` file. If you prefer to have all ZWave logging in a separate file, put this in your ```userdata/etc/org.ops4j.pax.logging.cfg``` file. +By default, this will put all logging into the standard ```openhab.log``` file. If you prefer to have all ZWave logging in a separate file, put this in your ```userdata/etc/log4j2.xml``` file. ``` -### Zwave custom logger -log4j2.logger.Zwave.name = org.openhab.binding.zwave -log4j2.logger.Zwave.level = DEBUG -log4j2.logger.Zwave.additivity = false -log4j2.logger.Zwave.appenderRefs = Zwave -log4j2.logger.Zwave.appenderRef.Zwave.ref = ZWAVE + + + + -### Zwave custom appender -log4j2.appender.Zwave.name = ZWAVE -log4j2.appender.Zwave.type = RollingRandomAccessFile -log4j2.appender.Zwave.fileName = ${openhab.logdir}/zwave.log -log4j2.appender.Zwave.filePattern = ${openhab.logdir}/zwave.log.%i -log4j2.appender.Zwave.immediateFlush = true -log4j2.appender.Zwave.append = true -log4j2.appender.Zwave.layout.type = PatternLayout -log4j2.appender.Zwave.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5.5p] [%-50.50c] - %m%n -log4j2.appender.Zwave.policies.type = Policies -log4j2.appender.Zwave.policies.size.type = SizeBasedTriggeringPolicy -log4j2.appender.Zwave.policies.size.size = 10MB -log4j2.appender.Zwave.strategy.type = DefaultRolloverStrategy -log4j2.appender.Zwave.strategy.max = 10 + + + + + + + + ``` An online viewer that presents the logs in a clearer way in order to help with their understanding, is available [here](https://opensmarthouse.org/utilities/logviewer/zwave/). diff --git a/_addons_bindings/zway/doc/GETTING_STARTED.md b/_addons_bindings/zway/doc/GETTING_STARTED.md deleted file mode 100644 index 44fbc4618..000000000 --- a/_addons_bindings/zway/doc/GETTING_STARTED.md +++ /dev/null @@ -1,72 +0,0 @@ -# Getting Started - -# Prepare Z-Way Server - -1. [Download](https://razberry.z-wave.me/z-way-server/) Z-Way v2.2.3 or newer (further information about installing Z-Way you can find [here](http://razberry.z-wave.me/index.php?id=24)) - -# Prepare openHAB - -1. [Download](https://www.openhab.org/download/) openHAB 2 (further information about installing openHAB you can find [here](https://www.openhab.org/docs/installation/)) -2. Install Z-Way Binding - - via Extension Manager - - via Download - - ```shell - cd /opt/openhab2/addons - sudo wget https://github.com/openhab/openhab-addons/files/636686/org.openhab.binding.zway-2.0.0-SNAPSHOT.zip - sudo unzip org.openhab.binding.zway-2.0.0-SNAPSHOT.zip - sudo rm org.openhab.binding.zway-2.0.0-SNAPSHOT.zip - ``` - -3. Start openHAB by running `start.bat` or `start.sh` -4. The first start may take up to 5 minutes. You should reach openHAB2 at `http://localhost:8080` - -# Configure Z-Way in openHAB - -## Create and configure a Z-Way Bridge - -Open the *Paper UI* - -![openHAB Home](images/getting-started/01-openHAB-Home.png) - -Open the *Inbox* and create a Z-Way Server - -![openHAB Inbox](images/getting-started/02-Inbox.png) - -![openHAB Inbox](images/getting-started/03-Create-bridge.png) - -Open the *Configuration* - *Things* and select Z-Way Server - -![openHAB Thing details](images/getting-started/05-Bridge-details.png) - -Change configuration: In order for the Observer mechanism works, the IP address, port and protocol of both systems are required. - -- **Z-Way Server** - - **IP address** (default: localhost) - - **port** (default: 8083) - - **protocol** (default: http) - - **username** (default: admin) - - **password** must be set (no default value) -- **options** - - **polling interval** (default: 3600) in seconds - -**The following picture is no longer up to date!** -![openHAB Thing settings](images/getting-started/06-Bridge-settings.png) - -## Create and configure Z-Way Devices - -Open the *Inbox* and start manually the *Discovery* for the Z-Way Binding. The *Discovery* must be started manually at this point, because the *Discovery* is running only every 4 minutes. The start time of the interval is the creation of Z-Way Server, even if the configuration is not yet complete. After the Z-Way Server is fully configured, the interval must be awaited or started manually. - -![openHAB Discovery](images/getting-started/07-Device-discovery.png) - -![openHAB Discovery](images/getting-started/08-Device-discovery.png) - -Create *Things* from the *Discovery Results* - -![openHAB Inbox](images/getting-started/09-Create-device.png) - -Example: openHAB *Thing* compared to the equivalent Z-Way *Devices* - -![openHAB Thing](images/getting-started/10-Z-Way-device.png) - -![Z-Way Devices](images/getting-started/11-Z-Way-device.png) diff --git a/_addons_bindings/zway/doc/images/getting-started/01-openHAB-Home.png b/_addons_bindings/zway/doc/images/getting-started/01-openHAB-Home.png deleted file mode 100644 index 9a38a615b..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/01-openHAB-Home.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/02-Inbox.png b/_addons_bindings/zway/doc/images/getting-started/02-Inbox.png deleted file mode 100644 index 06d814da7..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/02-Inbox.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/03-Create-bridge.png b/_addons_bindings/zway/doc/images/getting-started/03-Create-bridge.png deleted file mode 100644 index 8c74a49ae..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/03-Create-bridge.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/04-Open-bridge-details.png b/_addons_bindings/zway/doc/images/getting-started/04-Open-bridge-details.png deleted file mode 100644 index eef9a06b7..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/04-Open-bridge-details.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/05-Bridge-details.png b/_addons_bindings/zway/doc/images/getting-started/05-Bridge-details.png deleted file mode 100644 index 89f6a7802..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/05-Bridge-details.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/06-Bridge-settings.png b/_addons_bindings/zway/doc/images/getting-started/06-Bridge-settings.png deleted file mode 100644 index 97574dc54..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/06-Bridge-settings.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/07-Device-discovery.png b/_addons_bindings/zway/doc/images/getting-started/07-Device-discovery.png deleted file mode 100644 index a225a89a4..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/07-Device-discovery.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/08-Device-discovery.png b/_addons_bindings/zway/doc/images/getting-started/08-Device-discovery.png deleted file mode 100644 index 949e9f374..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/08-Device-discovery.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/09-Create-device.png b/_addons_bindings/zway/doc/images/getting-started/09-Create-device.png deleted file mode 100644 index 879b05bac..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/09-Create-device.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/10-Z-Way-device.png b/_addons_bindings/zway/doc/images/getting-started/10-Z-Way-device.png deleted file mode 100644 index b70480bf6..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/10-Z-Way-device.png and /dev/null differ diff --git a/_addons_bindings/zway/doc/images/getting-started/11-Z-Way-device.png b/_addons_bindings/zway/doc/images/getting-started/11-Z-Way-device.png deleted file mode 100644 index 36b65ffa2..000000000 Binary files a/_addons_bindings/zway/doc/images/getting-started/11-Z-Way-device.png and /dev/null differ diff --git a/_addons_bindings/zway/readme.md b/_addons_bindings/zway/readme.md index bebbb06e4..8d45d8bd1 100644 --- a/_addons_bindings/zway/readme.md +++ b/_addons_bindings/zway/readme.md @@ -177,10 +177,6 @@ Unsupported Z-Way device types: Camera, SensorMultiline, Text. The integration o The locations of the Z-Way devices are loaded during the discovery. Based on the location ID of Z-Way device, the name of the Z-Way room is then allocated to the location property of the thing. -## Example - -Because textual configuration isn't useful, follow the instructions in the [Getting Started](doc/GETTING_STARTED.md) document. - ## Developer stuff ### Known issues diff --git a/_addons_iconsets/classic/src/main/resources/icons/pantry.svg b/_addons_iconsets/classic/src/main/resources/icons/pantry.svg index c5f9eb965..ee16bd3b5 100644 --- a/_addons_iconsets/classic/src/main/resources/icons/pantry.svg +++ b/_addons_iconsets/classic/src/main/resources/icons/pantry.svg @@ -1,10 +1,10 @@ + - diff --git a/_addons_ios/alexa-skill/readme.md b/_addons_ios/alexa-skill/readme.md index 1dae608f3..ee22efa0c 100644 --- a/_addons_ios/alexa-skill/readme.md +++ b/_addons_ios/alexa-skill/readme.md @@ -1,7 +1,7 @@ --- layout: documentation title: Amazon Alexa Smart Home Skill -source: https://github.com/openhab/openhab-alexa/blob/master/USAGE.md +source: https://github.com/openhab/openhab-alexa/blob/main/USAGE.md description: "Alexa is an intelligent personal assistant developed by Amazon and designed to run on smart speakers and devices such as the Amazon Echo and Dot." --- @@ -68,7 +68,12 @@ The skill connects your openHAB setup through the [myopenHAB.org](http://myopenH ## Requirements -* [openHAB Cloud Connector](http://docs.openhab.org/addons/ios/openhabcloud/readme.html) configured using myopenHAB.org +::: tip +This integration relies on the cloud connector addon. +More information can be found in the corresponding [docs page](https://www.openhab.org/link/openhabcloud). +::: + +* openHAB Cloud Connector configured using myopenHAB.org * Amazon account * Amazon Echo, Amazon Echo Dot or compatible Alexa device diff --git a/_addons_ios/google-assistant/readme.md b/_addons_ios/google-assistant/readme.md index 2018e88db..45ebc0f45 100644 --- a/_addons_ios/google-assistant/readme.md +++ b/_addons_ios/google-assistant/readme.md @@ -13,69 +13,317 @@ This guide describes step by step how to use the [openHAB Google Assistant Smart With the Action you can voice control your openHAB items and it supports lights, plugs, switches, thermostats and many more. The openHAB Action comes with multiple language support like English, German or French language. -# General Configuration Instructions +If you have any issues, questions or an idea for additional features, please take a look at the [repository on GitHub](https://github.com/openhab/openhab-google-assistant). -## Requirements +## General Configuration Instructions -* [openHAB Cloud Connector](http://docs.openhab.org/addons/ios/openhabcloud/readme.html) configured using myopenHAB.org. (Items DO NOT need to be exposed to and will not show up on myopenHAB.org, this is only needed for the IFTTT service!) -* Google account. -* Google Home, Google Home mini, Google Nest or the Google Assistant on your phone. +::: tip +This integration relies on the cloud connector addon. +More information can be found in the corresponding [docs page](https://www.openhab.org/link/openhabcloud). +::: -## Item configuration -In openHAB 2 items are exposed via [metadata](https://www.openhab.org/docs/configuration/items.html#item-definition-and-syntax). +### Requirements -Currently the following metadata values are supported (also depending on Googles API capabilities): +* The openHAB Cloud Connector configured using myopenHAB.org (Items DO NOT need to be exposed to and will not show up on myopenHAB.org, this is only required for the IFTTT service!) +* A Google account +* A Google Home/Nest Voice Assistant Device or the Google Assistant on your phone -* `Switch / Dimmer / Color { ga="Light" }` -* `Switch { ga="Switch" [ inverted=true ] }` (all Switch items can use the inverted option) -* `Switch { ga="Outlet" }` -* `Switch { ga="Coffee_Maker" }` -* `Switch { ga="WaterHeater" }` -* `Switch { ga="Fireplace" }` -* `Switch { ga="Valve" }` -* `Switch { ga="Sprinkler" }` -* `Switch { ga="Vacuum" }` -* `Switch { ga="Scene" }` -* `Switch { ga="Lock" [ tfaAck=true ] }` -* `Switch { ga="SecuritySystem" [ tfaPin="1234" ] }` -* `Dimmer { ga="Speaker" }` -* `Switch / Dimmer { ga="Fan" [ speeds="0=away:zero,50=default:standard:one,100=high:two", lang="en", ordered=true ] }` (for Dimmer the options have to be set) -* `Switch / Dimmer { ga="Hood" }` -* `Switch / Dimmer { ga="AirPurifier" }` -* `Rollershutter { ga="Awning" [ inverted=true ] }` (all Rollershutter items can use the inverted option) -* `Rollershutter { ga="Blinds" }` -* `Rollershutter { ga="Curtain" }` -* `Rollershutter { ga="Door" }` -* `Rollershutter { ga="Garage" }` -* `Rollershutter { ga="Gate" }` -* `Rollershutter { ga="Pergola" }` -* `Rollershutter { ga="Shutter" }` -* `Rollershutter { ga="Window" }` -* `Group { ga="Thermostat" [ modes="..." ] }` -* `Number { ga="thermostatTemperatureAmbient" }` as part of Thermostat group -* `Number { ga="thermostatHumidityAmbient" }` as part of Thermostat group -* `Number { ga="thermostatTemperatureSetpoint" }` as part of Thermostat group -* `Number / String { ga="thermostatMode" }` as part of Thermostat group -* `String { ga="Camera" [ protocols="hls,dash" ] }` +### Item configuration -_\* All Rollershutter devices can also be used with a Switch item with the limitation of only supporting open and close states._ +To expose [items](https://www.openhab.org/docs/concepts/items.html) to Google Assistent you will need to add [metadata](https://www.openhab.org/docs/concepts/items.html#item-metadata) in the `ga` namespace. -Example item configuration: - ``` - Switch KitchenLights "Kitchen Lights" (gKitchen) { ga="Switch" } - Dimmer BedroomLights "Bedroom Lights" (gBedroom) { ga="Light" } - Color LivingroomLights "Livingroom Lights" (gLivingroom) { ga="Light" } - Switch SceneMovie "Livingroom Scene Movie" (gLivingroom) { synonyms="Movie Scene", ga="Scene" } - Switch CristmasTree "Cristmas Tree" (gLivingroom) { ga="Outlet" } - Switch DoorLock "Door Lock" { ga="Lock" } +Currently the following devices are supported (also depending on Google's API capabilities): - //Thermostat Setup (Google requires a mode, even if you manually set it up in openHAB) - Group g_HK_Basement_TSTAT "Basement Thermostat" { ga="Thermostat" [ useFahrenheit=true ] } - Number HK_Basement_Mode "Basement Heating/Cooling Mode" (g_HK_Basement_TSTAT) { ga="thermostatMode" } - Number HK_Basement_Setpoint "Basement Setpoint" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureSetpoint" } - Number HK_Basement_Temp "Basement Temperature" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureAmbient" } - Number HK_Basement_Humid "Basement Humidity" (g_HK_Basement_TSTAT) { ga="thermostatHumidityAmbient" } - ``` +_Hint: The value of `ga` is **not** case-sensitive._ + +#### `Switch` + +| | | +|---|---| +| **Device Type** | [Switch](https://developers.google.com/assistant/smarthome/guides/switch) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/onoff) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `inverted=true/false` | + +**Example:** + +```shell +Switch { ga="Switch" [ inverted=false ] } +``` + +#### `Light` + +| | | +|---|---| +| **Device Type** | [Light](https://developers.google.com/assistant/smarthome/guides/light) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/onoff), [ColorSetting](https://developers.google.com/assistant/smarthome/traits/colorsetting), [Brightness](https://developers.google.com/assistant/smarthome/traits/brightness) (depending on used item type) | +| **Supported Items** | Switch, Dimmer, Color | +| **Configuration** | (optional) `inverted=true/false`
(optional) `colorTemperatureRange="minK,maxK"` | + +```shell +Switch { ga="Light" [ inverted=true ] } +Dimmer { ga="Light" } +Color { ga="Light" [ colorTemperatureRange="2000,9000" ] } +``` + +#### `Light as Group with separate Color and Brightness` + +| | | +|---|---| +| **Device Type** | [Light](https://developers.google.com/assistant/smarthome/guides/light) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/onoff), [ColorSetting](https://developers.google.com/assistant/smarthome/traits/colorsetting), [Brightness](https://developers.google.com/assistant/smarthome/traits/brightness) | +| **Supported Items** | Group as `light` with two Number or Dimmer members as `lightBrightness` & `lightColorTemperature` | +| **Configuration** | (optional) `useKelvin=true/false`
(optional) `colorTemperatureRange="minK,maxK"`
_Hint: if you do not set `useKelvin=true` then `colorTemperatureRange` is required_ | + +```shell +Group lightGroup { ga="Light" [ useKelvin=true, colorTemperatureRange="2000,9000" ] } +Dimmer brightnessItem (lightGroup) { ga="lightBrightness" } +Number colorItem (lightGroup) { ga="lightColorTemperature" } +``` + +#### `Scene` + +| | | +|---|---| +| **Device Type** | [Scene](https://developers.google.com/assistant/smarthome/guides/scene) | +| **Supported Traits** | [Scene](https://developers.google.com/assistant/smarthome/traits/scene) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `sceneReversible=true/false` | + +```shell +Switch { ga="Scene" [ sceneReversible=false ] } +``` + +#### `Outlet`, `Coffee_Maker`, `WaterHeater`, `Fireplace` + +| | | +|---|---| +| **Device Type** | [Outlet](https://developers.google.com/assistant/smarthome/guides/outlet), [Coffee_Maker](https://developers.google.com/assistant/smarthome/guides/coffeemaker), [WaterHeater](https://developers.google.com/assistant/smarthome/guides/outlet), [Fireplace](https://developers.google.com/assistant/smarthome/guides/fireplace) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/onoff) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `inverted=true/false` | + +```shell +Switch { ga="Outlet" [ inverted=true ] } +Switch { ga="Coffee_Maker" [ inverted=true ] } +Switch { ga="WaterHeater" [ inverted=false ] } +Switch { ga="Fireplace" } +``` + +#### `Valve` + +| | | +|---|---| +| **Device Type** | [Valve](https://developers.google.com/assistant/smarthome/guides/valve) | +| **Supported Traits** | [OpenClose](https://developers.google.com/assistant/smarthome/traits/openclose) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `inverted=true/false` | + +```shell +Switch { ga="Valve" [ inverted=true ] } +``` + +#### `Sprinkler`, `Vacuum` + +| | | +|---|---| +| **Device Type** | [Sprinkler](https://developers.google.com/assistant/smarthome/guides/sprinkler), [Vacuum](https://developers.google.com/assistant/smarthome/guides/vacuum) | +| **Supported Traits** | [StartStop](https://developers.google.com/assistant/smarthome/traits/startstop) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `inverted=true/false` | + +```shell +Switch { ga="Sprinkler" [ inverted=true ] } +Switch { ga="Vacuum" [ inverted=false ] } +``` + +#### `Lock` + +| | | +|---|---| +| **Device Type** | [Lock](https://developers.google.com/assistant/smarthome/guides/lock) | +| **Supported Traits** | [LockUnlock](https://developers.google.com/assistant/smarthome/traits/lockunlock) | +| **Supported Items** | Contact (no device control), Switch | +| **Configuration** | (optional) `ackNeeded=true/false`
(optional) `pinNeeded="1234"` | + +```shell +Switch { ga="Lock" [ ackNeeded=true ] } +Switch { ga="Lock" [ pinNeeded="1234" ] } +``` + +#### `SecuritySystem` + +| | | +|---|---| +| **Device Type** | [SecuritySystem](https://developers.google.com/assistant/smarthome/guides/securitysystem) | +| **Supported Traits** | [ArmDisarm](https://developers.google.com/assistant/smarthome/traits/armdisarm) | +| **Supported Items** | Switch | +| **Configuration** | (optional) `ackNeeded=true/false`
(optional) `pinNeeded="1234"` | + +```shell +Switch { ga="SecuritySystem" [ pinNeeded="1234" ] } +``` + +#### `Camera` + +| | | +|---|---| +| **Device Type** | [Camera](https://developers.google.com/assistant/smarthome/guides/camera) | +| **Supported Traits** | [CameraStream](https://developers.google.com/assistant/smarthome/traits/camerastream) | +| **Supported Items** | String | +| **Configuration** | (optional) `protocols="hls,dash,smooth_stream,progressive_mp4"` _(choose suitable)_ | + +```shell +String { ga="Camera" [ protocols="hls,dash" ] } +``` + +#### `Speaker` (volume control only) + +| | | +|---|---| +| **Device Type** | [Speaker](https://developers.google.com/assistant/smarthome/guides/speaker) | +| **Supported Traits** | [Volume](https://developers.google.com/assistant/smarthome/traits/volume) | +| **Supported Items** | Dimmer | +| **Configuration** | (optional) `volumeDefaultPercentage="20"`
(optional) `levelStepSize="5"`
(optional) `volumeMaxLevel="100"` | + +```shell +Dimmer { ga="Speaker" [ volumeDefaultPercentage="50", levelStepSize="10", volumeMaxLevel="90" ] } +``` + +#### `TV` + +| | | +|---|---| +| **Device Type** | [TV](https://developers.google.com/assistant/smarthome/guides/tv) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/onoff), [Volume](https://developers.google.com/assistant/smarthome/traits/volume), [TransportControl](https://developers.google.com/assistant/smarthome/traits/transportcontrol), [InputSelector](https://developers.google.com/assistant/smarthome/traits/inputselector), [AppSelector](https://developers.google.com/assistant/smarthome/traits/appselector), [Channel](https://developers.google.com/assistant/smarthome/traits/channel) (depending on used members) | +| **Supported Items** | Group as `TV` with the following optional members: Switch as `tvPower`, Switch as `tvMute`, Dimmer as `tvVolume`, String as `tvChannel`, String as `tvInput`, String as `tvApplication`, Player as `tvTransport` | +| **Configuration** | (optional) `volumeDefaultPercentage="20"`
(optional) `levelStepSize="5"`
(optional) `volumeMaxLevel="100"`
(optional) `transportControlSupportedCommands="NEXT,PREVIOUS,PAUSE,RESUME"`
(optional) `availableChannels="channelNumber=channelId=channelName:channelSynonym:...,..."`
(optional) `availableInputs="inputKey=inputName:inputSynonym:...,..."`
(optional) `availableApplications="applicationKey=applicationName:applicationSynonym:...,..."`
(optional) `lang="en"` | + +```shell +Group tvGroup { ga="TV" [ volumeDefaultPercentage="20", levelStepSize="10", volumeMaxLevel="100", transportControlSupportedCommands="NEXT,PREVIOUS,PAUSE,RESUME", availableChannels="1=Channel1=NBC,2=Channel2=CBS", availableInputs="hdmi1=xbox:gaming,hdmi2=settopbox", availableApplications: "youtube=YouTube:Tube,netflix=Netflix:Chill" ] } +Switch powerItem (tvGroup) { ga="tvPower" } +Switch muteItem (tvGroup) { ga="tvMute" } +Dimmer volumeItem (tvGroup) { ga="tvVolume" } +String channelItem (tvGroup) { ga="tvChannel" } +String inputItem (tvGroup) { ga="tvInput" } +String applicationItem (tvGroup) { ga="tvApplication" } +Player transportItem (tvGroup) { ga="tvTransport" } +``` + +#### `Fan`, `Hood`, `AirPurifier` + +| | | +|---|---| +| **Device Type** | [Fan](https://developers.google.com/assistant/smarthome/guides/fan), [Hood](https://developers.google.com/assistant/smarthome/guides/hood), [AirPurifier](https://developers.google.com/assistant/smarthome/guides/airpurifier) | +| **Supported Traits** | [OnOff](https://developers.google.com/assistant/smarthome/traits/OnOff), [FanSpeed](https://developers.google.com/assistant/smarthome/traits/fanspeed) (depending on used item type) | +| **Supported Items** | Switch (no speed control), Dimmer | +| **Configuration** | (optional) `speeds="0=away:zero,50=default:standard:one,100=high:two"`
(optional) `lang="en"`
(optional) `ordered=true/false`
_Hint: if you are using a Dimmer then `speeds` is required_ | + +Fans (and similar device types, like AirPurifier or Hood) support the `FanSpeed` trait. +With that you will be able to set up and use human speakable modes, e.g. "fast" for 100% or "slow" for 25%. + +`speeds` will be a comma-separated list of modes with a percentage number followed by an equal sign and different aliases for that mode after a colon. +So here both "high" and "two" would set the speed to 100%. +You are also able to define the language of those aliases. +The option `ordered` will tell the system that your list is ordered and you will then be able to also say "faster" or "slower" and Google will use the next or previous speed. + +```shell +Dimmer { ga="Fan" [ speeds="0=away:zero,50=default:standard:one,100=high:two", lang="en", ordered=true ] } +Switch { ga="Hood" } +Dimmer { ga="AirPurifier" [ speeds="0=off,50=mid,100=high" ] } +``` + +#### `Awning`, `Blinds`, `Curtain`, `Door`, `Garage`, `Gate`, `Pergola`, `Shutter`, `Window` + +| | | +|---|---| +| **Device Type** | [Awning](https://developers.google.com/assistant/smarthome/guides/awning), [Blinds](https://developers.google.com/assistant/smarthome/guides/blinds), [Curtain](https://developers.google.com/assistant/smarthome/guides/curtain), [Door](https://developers.google.com/assistant/smarthome/guides/door), [Garage](https://developers.google.com/assistant/smarthome/guides/garage), [Gate](https://developers.google.com/assistant/smarthome/guides/gate), [Pergola](https://developers.google.com/assistant/smarthome/guides/pergola), [Shutter](https://developers.google.com/assistant/smarthome/guides/shutter), [Window](https://developers.google.com/assistant/smarthome/guides/window) | +| **Supported Traits** | [OpenClose](https://developers.google.com/assistant/smarthome/traits/openclose), [StartStop](https://developers.google.com/assistant/smarthome/traits/startstop) | +| **Supported Items** | Contact (no device control), Switch (no open percentage), Rollershutter | +| **Configuration** | (optional) `inverted=true/false` | + +Blinds and simiar devices should always use the `Rollershutter` item type for proper functionallity. +Since Google and openHAB use the oposite percentage value for "opened" and "closed", the action will tranlate this automatically. +If the values are still inverted in your case, you can state the `inverted=true` option for all `Rollershutter` items. + +Since Google only tells the open percentage (and not the verb "close" or "down"), it can not be differentiated between saying "set blind to 100%" or "open blind". +Therefore, it is not possible to "not invert" the verbs, if the user chooses to invert the numbers. + +```shell +Rollershutter { ga="Awning" } +Rollershutter { ga="Blinds" [ inverted=true ] } +Rollershutter { ga="Curtain" } +Switch { ga="Door" } +Rollershutter { ga="Garage" } +Contact { ga="Gate" } +Rollershutter { ga="Pergola" } +Rollershutter { ga="Shutter" } +Rollershutter { ga="Window" } +``` + +#### `TemperatureSensor` + +| | | +|---|---| +| **Device Type** | [Sensor](https://developers.google.com/assistant/smarthome/guides/sensor) | +| **Supported Traits** | [TemperatureControl](https://developers.google.com/assistant/smarthome/traits/temperaturecontrol) | +| **Supported Items** | Number | +| **Configuration** | (optional) `useFahrenheit=true/false` | + +```shell +Number { ga="TemperatureSensor" [ useFahrenheit=true ] } +``` + +#### `Thermostat` + +| | | +|---|---| +| **Device Type** | [Thermostat](https://developers.google.com/assistant/smarthome/guides/thermostat) | +| **Supported Traits** | [TemperatureSetting](https://developers.google.com/assistant/smarthome/traits/temperaturesetting) | +| **Supported Items** | Group as `Thermostat` with the following optional members: Number as `thermostatTemperatureAmbient`, Number as `thermostatTemperatureSetpoint`, Number as `thermostatTemperatureSetpointLow`, Number as `thermostatTemperatureSetpointHigh`, Number as `thermostatHumidityAmbient`, String or Number as `thermostatMode` | +| **Configuration** | (optional) `useFahrenheit=true/false`
(optional) `thermostatTemperatureRange="10,30"`
(optional) `modes="off=OFF:WINDOW_OPEN,heat=COMFORT:BOOST,eco=ECO,on=ON,auto"` | + +Thermostat requires a group of items to be properly configured to be used with Google Assistant. The default temperature unit is Celsius. +To change the temperature unit to Fahrenheit, add the config option `useFahrenheit=true` to the thermostat group. +To set the temperature range your thermostat supports, add the config option `thermostatTemperatureRange="10,30"` to the thermostat group. +If your thermostat supports a range for the setpoint you can use both `thermostatTemperatureSetpointLow` and `thermostatTemperatureSetpointHigh` instead of the single `thermostatTemperatureSetpoint` item. + +If your thermostat does not have a mode, you should create one and manually assign a value (e.g. heat, cool, on, etc.) to have proper functionality. + +To map the [default thermostat modes of Google](https://developers.google.com/assistant/smarthome/traits/temperaturesetting.html) (on, off, heat, cool, etc.) to custom ones for your specific setup, you can use the `modes` config option on the thermostat group. +E.g. `[ modes="off=OFF:WINDOW_OPEN,heat=COMFORT:BOOST,eco=ECO,on=ON,auto" ]` will enable the following five modes in Google Home `"off, heat, eco, on, auto"` that will be translated to `"OFF, COMFORT, ECO, ON, auto"`. You can specify alternative conversions using the colon sign, so that in the former example "BOOST" in openHAB would also be translated to "heat" in Google. For the translation of Google modes to openHAB always the first option after the equal sign is used. +By default the integration will provide `"off,heat,cool,on,heatcool,auto,eco"`. + +You can also set up a Thermostat for using it as a temperature sensor. To do so, create a Thermostat group and only add one item member as "thermostatTemperatureAmbient". +However, it is recommended to prefer the `TemperatureSensor` type for simple temperature reports (but currently there is no UI support in Google Home). + +```shell +Group thermostatGroup { ga="Thermostat" [ modes="off=OFF:WINDOW_OPEN,heat=COMFORT:BOOST,eco=ECO,on=ON,auto", thermostatTemperatureRange="10,30", useFahrenheit=false ] } +Number ambientItem (thermostatGroup) { ga="thermostatTemperatureAmbient" } +Number humidityItem (thermostatGroup) { ga="thermostatHumidityAmbient" } +Number setpointItem (thermostatGroup) { ga="thermostatTemperatureSetpoint" } +Number setpointItemLow (thermostatGroup) { ga="thermostatTemperatureSetpointLow" } +Number setpointItemHigh (thermostatGroup) { ga="thermostatTemperatureSetpointHigh" } +String modeItem (thermostatGroup) { ga="thermostatMode" } +``` + +#### `Sensor` + +| | | +|---|---| +| **Device Type** | [Sensor](https://developers.google.com/assistant/smarthome/guides/sensor) | +| **Supported Traits** | [SensorState](https://developers.google.com/assistant/smarthome/traits/sensorstate) | +| **Supported Items** | Number, Dimmer | +| **Configuration** |`sensorName="SmokeLevel"`
`valueUnit="PARTS_PER_MILLION"`
`states="no smoke=10,smoke detected=50,high=90"` | + +Please see the [SensorState documentation](https://developers.google.com/assistant/smarthome/traits/sensorstate) for more details on configuration options. +For now only exact matches of the numeric value will report the descriptive state value. + +```shell +Number { ga="Sensor" [ sensorName="AirQuality", valueUnit="AQI", states="good=10,moderate=50,poor=90" ] } +``` + +### Addtional Information Item labels are not mandatory in openHAB, but for the Google Assistant Action they are absolutely necessary! @@ -87,23 +335,33 @@ Furthermore, you can state synonyms for the device name: `Switch KitchenLight "K To ease setting up new devices you can add a room hint: `[ roomHint="Living Room" ]`. +For devices supporting the OpenClose trait, the attributes `[ discreteOnly=false, queryOnly=false ]` can be configured. -NOTE: metadata is not (yet?) available via paperUI. Either you create your items via ".items" files, or you can: -- add metadata via console: - ``` - smarthome:metadata add BedroomLights ga Light - ``` +* `discreteOnly` defaults to false. When set to true, this indicates that the device must either be fully open or fully closed (that is, it does not support values between 0% and 100%). An example of such a device may be a valve. +* `queryOnly` defaults to false. Is set to true for `Contact` items. Indicates if the device can only be queried for state information and cannot be controlled. Sensors that can only report open state should set this field to true. -- add metadata using the REST API: - ``` - PUT /rest/items/BedroomLights/metadata/ga +--- - { - "value": "Light" - } - ``` +NOTE: metadata is not available via paperUI in openHAB v2. Either you create your items via ".items" files, or you can: -### Special item configurations +* add metadata via console: + + ```shell + smarthome:metadata add BedroomLights ga Light + ``` + +* add metadata using the REST API: + + ```js + PUT /rest/items/BedroomLights/metadata/ga + + { + "value": "Light" + } + ``` + +NOTE: Please be aware that for backward compatibilty also the former usage of tags (ref. [Google Assistant Action Documentation v2.5](https://www.openhab.org/v2.5/docs/ecosystem/google-assistant/)) to specify items to be exposed to Google Assistent is supported and may cause unexpected behavior. +Items that contain tags that refer to a valid Google Assistent device will be exposed regardless of having metadata set. E.g.: `Switch MyBulb ["Lighting"]`. #### Two-Factor-Authentication @@ -117,53 +375,10 @@ _pinNeeded_: "A two-factor authentication that requires a personal identificatio Example: +```shell +Switch DoorLock "Front Door" { ga="Lock" [ ackNeeded=true ] } +Switch HouseAlarm "House Alarm" { ga="SecuritySystem" [ pinNeeded="1234" ] } ``` -Switch DoorLock "Front Door" { ga="Lock" [ tfaAck=true ] } -Switch HouseAlarm "House Alarm" { ga="SecuritySystem" [ tfaPin="1234" ] } -``` - -#### Thermostats - -Thermostat requires a group of items to be properly configured to be used with Google Assistant. The default temperature unit is Celsius. `{ ga="Thermostat" }` - -To change the temperature unit to Fahrenheit, add the config option `[ useFahrenheit=true ]` to the thermostat group. -To set the temperature range your thermostat supports, add the config option `[ thermostatTemperatureRange="10,30" ]` to the thermostat group. - -There must be at least three items as members of the group: - -* (Mandatory) Mode: Number (Zwave THERMOSTAT_MODE Format) or String (off, heat, cool, on, ...). `{ ga="thermostatMode" }` -* (Mandatory) Temperature Ambient: Number. `{ ga="thermostatTemperatureAmbient" }` -* (Mandatory) Temperature Setpoint: Number. `{ ga="thermostatTemperatureSetpoint" }` -* (Optional) Temperature Setpoint High: Number. `{ ga="thermostatTemperatureSetpointHigh" }` -* (Optional) Temperature Setpoint Low: Number. `{ ga="thermostatTemperatureSetpointLow" }` -* (Optional) Humidity Ambient: Number. `{ ga="thermostatHumidityAmbient" }` - -If your thermostat does not have a mode, you should create one and manually assign a value (e.g. heat, cool, on, etc.) to have proper functionality. - -To map the [default thermostat modes of Google](https://developers.google.com/assistant/smarthome/traits/temperaturesetting.html) (on, off, heat, cool, etc.) to custom ones for your specific setup, you can use the _modes_ config option on the thermostat group. -E.g. `[ modes="off=OFF:WINDOW_OPEN,heat=COMFORT:BOOST,eco=ECO,on=ON,auto" ]` will enable the following five modes in Google Home `"off, heat, eco, on, auto"` that will be translated to `"OFF, COMFORT, ECO, ON, auto"`. You can specify alternative conversions using the colon sign, so that in the former example "BOOST" in openHAB would also be translated to "heat" in Google. For the translation of Google modes to openHAB always the first option after the equal sign is used. -By default the integration will provide `"off,heat,cool,on,heatcool,auto,eco"`. - -You can also set up a Thermostat for using it as a temperature sensor. To do so, create a Thermostat group and only add one item member as "thermostatTemperatureAmbient". - -#### Fans - -_Fans_ (and similar device types, like _AirPurifier_ or _Hood_) support the _FanSpeed_ trait. -With that you will be able to set up and use human speakable modes, e.g. "fast" for 100% or "slow" for 25%. - -To set up those modes use a _Dimmer_ item and the following metadata config: `[ speeds="0=away:zero,50=default:standard:one,100=high:two", lang="en", ordered=true ]`. - -_speeds_ will be a comma-separated list of modes with a percentage number followed by an equal sign and different aliases for that mode after a colon. -So here both "high" and "two" would set the speed to 100%. -You are also able to define the language of those aliases. -The option _ordered_ will tell the system that your list is ordered and you will then be able to also say "faster" or "slower" and Google will use the next or previous speed. - -#### Blinds and similar devices - -Blinds should always use the `Rollershutter` item type. -Since Google and openHAB use the oposite percentage value for "opened" or "closed", the action will tranlate this automatically. -If the values are still inverted in your case, you can state the `[ inverted=true ]` option for all `Rollershutter` items. - ## Setup & Usage on Google Assistant App @@ -207,48 +422,50 @@ If the values are still inverted in your case, you can state the `[ inverted=tru ![openHAB Google App](images/Screenshot_10.png) ![openHAB Google App](images/Screenshot_11.png) - ## Example Voice Commands Here are some example voice commands: - * Turn on Office Lights. - * Dim/Brighten Office Lights (increments 15%). - * Set Office Lights to 35%. - * Open/Close the blinds - * Turn off Pool Waterfall. - * Turn on House Fan. - * Turn on Home Theater Scene. - * Set Basement Thermostat to 15 degrees. - * What is the current Basement Thermostat Temperature? +* Turn on Office Lights. +* Dim/Brighten Office Lights (increments 15%). +* Set Office Lights to 35%. +* Open/Close the blinds +* Turn off Pool Waterfall. +* Turn on House Fan. +* Turn on Home Theater Scene. +* Set Basement Thermostat to 15 degrees. +* What is the current Basement Thermostat Temperature? - ## Frequently Asked Question +## Frequently Asked Question - My New items did not appear in the Google Home app. +My New items did not appear in the Google Home app. - * Say: Hey Google, sync my devices. +* Say: Hey Google, sync my devices. - I'm not able to connect openHAB to Google Home. +I'm not able to connect openHAB to Google Home. * Check, recheck and after that check again your items! * The items that you want to expose to Google Assistant should have the right metadata assigned. * The items that you want to expose to Google Assistant must have a item label! [Item Definition and Syntax](https://www.openhab.org/docs/configuration/items.html#item-definition-and-syntax) * If you expose thermostats make sure than you have: - * A group item with the metadata value { ga="Thermostat" } - * A number or string item with the metadata value { ga="thermostatMode" } as part of the thermostat group - * A number item with the metadata value { ga="thermostatTemperatureAmbient" } as part of the thermostat group - * A number item with the metadata value { ga="thermostatTemperatureSetpoint" } as part of the thermostat group - ``` - Group g_HK_Basement_TSTAT "Basement Thermostat" { ga="Thermostat" [ useFahrenheit=true ] } - Number HK_Basement_Mode "Basement Heating/Cooling Mode" (g_HK_Basement_TSTAT) { ga="thermostatMode" } - Number HK_Basement_Setpoint "Basement Setpoint" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureSetpoint" } - Number HK_Basement_Temp "Basement Temperature" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureAmbient" } + * A Group item with the metadata value `{ ga="Thermostat" }` + * A Number or String item with the metadata value `{ ga="thermostatMode" }` as part of the thermostat group + * A Number item with the metadata value `{ ga="thermostatTemperatureAmbient" }` as part of the thermostat group + * A Number item with the metadata value `{ ga="thermostatTemperatureSetpoint" }` as part of the thermostat group + + ```shell + Group g_HK_Basement_TSTAT "Basement Thermostat" { ga="Thermostat" [ useFahrenheit=true ] } + Number HK_Basement_Mode "Basement Heating/Cooling Mode" (g_HK_Basement_TSTAT) { ga="thermostatMode" } + Number HK_Basement_Setpoint "Basement Setpoint" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureSetpoint" } + Number HK_Basement_Temp "Basement Temperature" (g_HK_Basement_TSTAT) { ga="thermostatTemperatureAmbient" } ``` + * If none of the above solutions works for you: * Remove all the metadata. * Make a new .item file with 1 item to expose. - ``` + + ```shell Switch TestLight "Test Light" { ga="Switch" } ``` - * Relink your account. + * Relink your account. diff --git a/_addons_ios/hueemulation/readme.md b/_addons_ios/hueemulation/readme.md index d4f2e1cd7..a20f7e7ec 100644 --- a/_addons_ios/hueemulation/readme.md +++ b/_addons_ios/hueemulation/readme.md @@ -172,11 +172,13 @@ You must either ``` server { listen 80; - proxy_pass http://localhost:8080/; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; + location / { + proxy_pass http://localhost:8080/; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } } ``` * or let openHAB run on port 80 (the entire java process requires elevated privileges). diff --git a/_addons_ios/imperihome/readme.md b/_addons_ios/imperihome/readme.md index 2e40effd7..11adcade3 100644 --- a/_addons_ios/imperihome/readme.md +++ b/_addons_ios/imperihome/readme.md @@ -19,19 +19,19 @@ It creates a REST service at _/imperihome/iss_ that implements the [ImperiHome S ## Installation -The ImperiHome integration service can be installed through the Paper UI. Navigate to Add-ons > Misc and click Install. - - +The ImperiHome integration service can be installed through the "Misc" add-ons category in the UI. ## Configuration ### openHAB Add-on -To configure the ImperiHome integration add-on in openHAB, create a _imperihome.cfg_ file in the _conf/services_ directory. The following configuration options can be used: +To configure the ImperiHome integration add-on in openHAB, create a _imperihome.cfg_ file in the _conf/services_ directory. +The following configuration options can be used: **System ID** -The ImperiHome integration service identifies itself to ImperiHome using a system ID. By default the unique identifier of your openHAB installation is used. To override the ID, use the _system.id_ configuration option. +The ImperiHome integration service identifies itself to ImperiHome using a system ID. +By default the unique identifier of your openHAB installation is used. To override the ID, use the _system.id_ configuration option. ``` system.id=my-openhab-123 @@ -58,7 +58,8 @@ Add a new system (+) and choose 'ImperiHome Standard System' as the object type. Now enter the URL to your openHAB instance as Local URL, followed by _/imperihome/iss_. For example, if your openHAB instance is running at __, the Local URL would be __. -If you have port forwarding or similar set up to access your openHAB from the internet, you can also fill the Remote URL in the same way. For example: __. +If you have port forwarding or similar set up to access your openHAB from the internet, you can also fill the Remote URL in the same way. +For example: __. _Warning_: this service provides no authentication mechanism, so anyone could use the API to control your system when accessible from the internet. Add a secure proxy or use the openHAB Cloud proxy to protect your system ([more information](https://www.openhab.org/docs/installation/security.html)). @@ -87,7 +88,6 @@ If you have defined your Items in _.items_ files, tags can be added using: ``` syntax (after the _(Groups)_ and before the _{channel}_). -If you created your items another way, e.g. using the Paper UI, [HABmin](/docs/configuration/ui/habmin/) allows you to modify the tags. ### Tag: _type_ diff --git a/_addons_ios/metrics/doc/dashboard.json b/_addons_ios/metrics/doc/dashboard.json new file mode 100644 index 000000000..a1607fd3a --- /dev/null +++ b/_addons_ios/metrics/doc/dashboard.json @@ -0,0 +1,4574 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "limit": 100, + "name": "Annotations & Alerts", + "showIn": 0, + "type": "dashboard" + }, + { + "datasource": "Prometheus", + "enable": true, + "expr": "resets(process_uptime_seconds{application=\"$application\", instance=\"$instance\"}[1m]) > 0", + "iconColor": "rgba(255, 96, 96, 1)", + "name": "Restart Detection", + "showIn": 0, + "step": "1m", + "tagKeys": "restart-tag", + "textFormat": "uptime reset", + "titleFormat": "Restart" + } + ] + }, + "description": "Dashboard for Micrometer instrumented applications (Java, Spring Boot, Micronaut)", + "editable": true, + "gnetId": 4701, + "graphTooltip": 1, + "id": 28, + "iteration": 1611523771130, + "links": [], + "panels": [ + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 125, + "panels": [ + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 65, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": 2, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 75, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})*100/sum(jvm_memory_max_bytes{application=\"$application\",instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "Non-Heap used", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": null, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 157, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "30s", + "targets": [ + { + "expr": "sum(increase(event_count_total{topic=~\"openhab/items/.*/state\"}[1h]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "$__interval", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "openHAB item state updates (last hour)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "rgba(50, 172, 45, 0.97)", + "rgba(237, 129, 40, 0.89)", + "rgba(245, 54, 54, 0.9)" + ], + "datasource": "Prometheus", + "decimals": 0, + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 3, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 158, + "interval": null, + "links": [], + "mappingType": 2, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "70%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + }, + { + "from": "-99999999999999999999999999999999", + "text": "N/A", + "to": "0" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "targets": [ + { + "expr": "sum(increase(openhab_rule_runs_total[1h]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A", + "step": 14400 + } + ], + "thresholds": "70,90", + "title": "openHAB rule runs (last hour)", + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "x", + "value": "" + } + ], + "valueName": "current" + } + ], + "repeat": null, + "title": "Quick Facts", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 141, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 2 + }, + "hiddenSeries": false, + "id": 143, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(openhab_rule_runs_total[5m])) by (rulename)", + "interval": "", + "legendFormat": "{{rulename}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "openHAB rule runs", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "backgroundColor": "rgba(128,128,128,0.1)", + "colorMaps": [ + { + "color": "#CCC", + "text": "N/A" + }, + { + "color": "#37872D", + "text": "ACTIVE" + }, + { + "color": "#E02F44", + "text": "STOPPING" + } + ], + "crosshairColor": "#8F070C", + "datasource": "Prometheus", + "display": "timeline", + "expandFromQueryS": 0, + "extendLastValue": true, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 16, + "w": 6, + "x": 12, + "y": 2 + }, + "highlightOnMouseover": true, + "id": 147, + "legendSortBy": "-ms", + "lineColor": "rgba(0,0,0,0.1)", + "metricNameColor": "#000000", + "pluginVersion": "7.3.2", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "rowHeight": 30, + "showLegend": true, + "showLegendNames": true, + "showLegendPercent": true, + "showLegendValues": true, + "showTimeAxis": true, + "targets": [ + { + "expr": "openhab_bundle_state", + "interval": "", + "legendFormat": "{{bundle}}", + "refId": "A" + } + ], + "textSize": 16, + "textSizeTime": 12, + "timeFrom": null, + "timeOptions": [ + { + "name": "Years", + "value": "years" + }, + { + "name": "Months", + "value": "months" + }, + { + "name": "Weeks", + "value": "weeks" + }, + { + "name": "Days", + "value": "days" + }, + { + "name": "Hours", + "value": "hours" + }, + { + "name": "Minutes", + "value": "minutes" + }, + { + "name": "Seconds", + "value": "seconds" + }, + { + "name": "Milliseconds", + "value": "milliseconds" + } + ], + "timePrecision": { + "name": "Minutes", + "value": "minutes" + }, + "timeShift": null, + "timeTextColor": "#d8d9da", + "title": "openHAB bundle state", + "type": "natel-discrete-panel", + "units": "short", + "useTimePrecision": false, + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "UNINSTALLED", + "value": "1" + }, + { + "op": "=", + "text": "INSTALLED", + "value": "2" + }, + { + "op": "=", + "text": "RESOLVED", + "value": "4" + }, + { + "op": "=", + "text": "STARTING", + "value": "8" + }, + { + "op": "=", + "text": "STOPPING", + "value": "16" + }, + { + "op": "=", + "text": "ACTIVE", + "value": "32" + } + ], + "valueTextColor": "#000000", + "writeAllValues": false, + "writeLastValue": true, + "writeMetricNames": true + }, + { + "backgroundColor": "rgba(128,128,128,0.1)", + "colorMaps": [ + { + "color": "#CCC", + "text": "N/A" + }, + { + "color": "#E02F44", + "text": "OFFLINE" + }, + { + "color": "#FF780A", + "text": "UNKNOWN" + }, + { + "color": "#37872D", + "text": "ONLINE" + } + ], + "crosshairColor": "#8F070C", + "datasource": "Prometheus", + "display": "timeline", + "expandFromQueryS": 0, + "extendLastValue": true, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 16, + "w": 6, + "x": 18, + "y": 2 + }, + "highlightOnMouseover": true, + "id": 148, + "legendSortBy": "-ms", + "lineColor": "rgba(0,0,0,0.1)", + "metricNameColor": "#000000", + "pluginVersion": "7.3.2", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "rowHeight": 30, + "showLegend": true, + "showLegendNames": true, + "showLegendPercent": true, + "showLegendValues": true, + "showTimeAxis": true, + "targets": [ + { + "expr": "openhab_thing_state", + "interval": "", + "legendFormat": "{{thing}}", + "refId": "A" + } + ], + "textSize": 16, + "textSizeTime": 12, + "timeFrom": null, + "timeOptions": [ + { + "name": "Years", + "value": "years" + }, + { + "name": "Months", + "value": "months" + }, + { + "name": "Weeks", + "value": "weeks" + }, + { + "name": "Days", + "value": "days" + }, + { + "name": "Hours", + "value": "hours" + }, + { + "name": "Minutes", + "value": "minutes" + }, + { + "name": "Seconds", + "value": "seconds" + }, + { + "name": "Milliseconds", + "value": "milliseconds" + } + ], + "timePrecision": { + "name": "Minutes", + "value": "minutes" + }, + "timeShift": null, + "timeTextColor": "#d8d9da", + "title": "openHAB thing state", + "type": "natel-discrete-panel", + "units": "short", + "useTimePrecision": false, + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + }, + { + "op": "=", + "text": "UNINITIALIZED", + "value": "0" + }, + { + "op": "=", + "text": "INITIALIZING", + "value": "1" + }, + { + "op": "=", + "text": "UNKNOWN", + "value": "2" + }, + { + "op": "=", + "text": "ONLINE", + "value": "3" + }, + { + "op": "=", + "text": "OFFLINE", + "value": "4" + }, + { + "op": "=", + "text": "REMOVING", + "value": "5" + }, + { + "op": "=", + "text": "REMOVED", + "value": "6" + } + ], + "valueTextColor": "#000000", + "writeAllValues": false, + "writeLastValue": true, + "writeMetricNames": true + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 145, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(rate(event_count_total[5m])) by (topic)", + "interval": "", + "legendFormat": "{{topic}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "openHAB event counts", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 18 + }, + "hiddenSeries": false, + "id": 150, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/.*remaining.*/", + "yaxis": 2 + }, + { + "alias": "/.*max.*/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "executor_pool_max_threads{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Pool max threads - {{name}}", + "refId": "A" + }, + { + "expr": "executor_active_threads{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Active threads count - {{name}}", + "refId": "B" + }, + { + "expr": "rate(executor_completed_tasks_total{pool=\"$threadpool\"}[5m])", + "interval": "", + "legendFormat": "Completed tasks rate - {{name}}", + "refId": "C" + }, + { + "expr": "executor_pool_core_threads{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Pool core threads - {{name}}", + "refId": "D" + }, + { + "expr": "executor_pool_size_threads{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Pool size - {{name}}", + "refId": "F" + }, + { + "expr": "executor_queue_remaining_tasks{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Queue remaining tasks - {{name}}", + "refId": "G" + }, + { + "expr": "executor_queued_tasks{pool=\"$threadpool\"}", + "interval": "", + "legendFormat": "Queued tasks - {{name}}", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "openHAB thread pool stats", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "openHAB metrics", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 127, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 3 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 3 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Non-Heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 3 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "committed", + "refId": "B", + "step": 2400 + }, + { + "expr": "sum(jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\"})", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "max", + "refId": "C", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "JVM Total", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "repeat": null, + "title": "JVM Memory", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 128, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 11 + }, + "hiddenSeries": false, + "id": 106, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "system", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "process_cpu_usage{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process", + "refId": "B" + }, + { + "expr": "avg_over_time(process_cpu_usage{application=\"$application\", instance=\"$instance\"}[1h])", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "process-1h", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "decimals": 1, + "format": "percentunit", + "label": "", + "logBase": 1, + "max": "1", + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 11 + }, + "hiddenSeries": false, + "id": 93, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "system_load_average_1m{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "system-1m", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "system_cpu_count{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "cpus", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Load", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "decimals": 1, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 11 + }, + "hiddenSeries": false, + "id": 32, + "legend": { + "avg": false, + "current": true, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_live_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "live", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_threads_daemon_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "daemon", + "metric": "", + "refId": "B", + "step": 2400 + }, + { + "expr": "jvm_threads_peak_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "peak", + "refId": "C", + "step": 2400 + }, + { + "expr": "process_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "process", + "refId": "D", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Threads", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": { + "blocked": "#bf1b00", + "new": "#fce2de", + "runnable": "#7eb26d", + "terminated": "#511749", + "timed-waiting": "#c15c17", + "waiting": "#eab839" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 11 + }, + "hiddenSeries": false, + "id": 124, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_threads_states_threads{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{state}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Thread States", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "repeat": null, + "title": "JVM Misc", + "type": "row" + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 4 + }, + "id": 129, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 5 + }, + "hiddenSeries": false, + "id": 3, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_heap", + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "G1 Eden Space", + "value": "G1 Eden Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 5 + }, + "hiddenSeries": false, + "id": 159, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "G1 Old Gen", + "value": "G1 Old Gen" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 5 + }, + "hiddenSeries": false, + "id": 160, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 3, + "scopedVars": { + "jvm_memory_pool_heap": { + "selected": false, + "text": "G1 Survivor Space", + "value": "G1 Survivor Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_heap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_heap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "repeat": "persistence_counts", + "title": "JVM Memory Pools (Heap)", + "type": "row" + }, + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 130, + "panels": [], + "repeat": null, + "title": "JVM Memory Pools (Non-Heap)", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 6 + }, + "hiddenSeries": false, + "id": 78, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": "jvm_memory_pool_nonheap", + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Metaspace", + "value": "Metaspace" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 6 + }, + "hiddenSeries": false, + "id": 161, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "Compressed Class Space", + "value": "Compressed Class Space" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 6 + }, + "hiddenSeries": false, + "id": 162, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "CodeHeap 'profiled nmethods'", + "value": "CodeHeap 'profiled nmethods'" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 13 + }, + "hiddenSeries": false, + "id": 163, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "CodeHeap 'non-profiled nmethods'", + "value": "CodeHeap 'non-profiled nmethods'" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 13 + }, + "hiddenSeries": false, + "id": 164, + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "maxPerRow": 3, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeatIteration": 1611523771130, + "repeatPanelId": 78, + "scopedVars": { + "jvm_memory_pool_nonheap": { + "selected": false, + "text": "CodeHeap 'non-nmethods'", + "value": "CodeHeap 'non-nmethods'" + } + }, + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 1800 + }, + { + "expr": "jvm_memory_committed_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "commited", + "metric": "", + "refId": "B", + "step": 1800 + }, + { + "expr": "jvm_memory_max_bytes{application=\"$application\", instance=\"$instance\", id=~\"$jvm_memory_pool_nonheap\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 2, + "legendFormat": "max", + "metric": "", + "refId": "C", + "step": 1800 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "$jvm_memory_pool_nonheap", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "mbytes", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 20 + }, + "id": 131, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 21 + }, + "hiddenSeries": false, + "id": 98, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{action}} ({{cause}})", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Collections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ops", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 21 + }, + "hiddenSeries": false, + "id": 101, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_pause_seconds_sum{application=\"$application\", instance=\"$instance\"}[1m])/rate(jvm_gc_pause_seconds_count{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "avg {{action}} ({{cause}})", + "refId": "A" + }, + { + "expr": "jvm_gc_pause_seconds_max{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "max {{action}} ({{cause}})", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Pause Durations", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "s", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 21 + }, + "hiddenSeries": false, + "id": 99, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(jvm_gc_memory_allocated_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "allocated", + "refId": "A" + }, + { + "expr": "rate(jvm_gc_memory_promoted_bytes_total{application=\"$application\", instance=\"$instance\"}[1m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "promoted", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Allocated/Promoted", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "Bps", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "repeat": null, + "title": "Garbage Collection", + "type": "row" + }, + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 132, + "panels": [], + "repeat": null, + "title": "Classloading", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "id": 37, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_classes_loaded_classes{application=\"$application\", instance=\"$instance\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "loaded", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Classes loaded", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "id": 38, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "delta(jvm_classes_loaded_classes{application=\"$application\",instance=\"$instance\"}[1m])", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "delta-1m", + "metric": "", + "refId": "A", + "step": 1200 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Class delta", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "ops", + "short" + ], + "yaxes": [ + { + "decimals": null, + "format": "short", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 133, + "panels": [], + "repeat": null, + "title": "Buffer Pools", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "id": 33, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 30 + }, + "hiddenSeries": false, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"direct\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Direct Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 30 + }, + "hiddenSeries": false, + "id": 85, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_memory_used_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "used", + "metric": "", + "refId": "A", + "step": 2400 + }, + { + "expr": "jvm_buffer_total_capacity_bytes{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "capacity", + "metric": "", + "refId": "B", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "Prometheus", + "editable": true, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "grid": { + "leftLogBase": 1, + "leftMax": null, + "leftMin": null, + "rightLogBase": 1, + "rightMax": null, + "rightMin": null + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 30 + }, + "hiddenSeries": false, + "id": 84, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.3.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "jvm_buffer_count_buffers{application=\"$application\", instance=\"$instance\", id=\"mapped\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "count", + "metric": "", + "refId": "A", + "step": 2400 + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mapped Buffers", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "x-axis": true, + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "y-axis": true, + "y_formats": [ + "short", + "short" + ], + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "30s", + "schemaVersion": 26, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allFormat": "glob", + "allValue": null, + "datasource": "Prometheus", + "definition": "", + "error": null, + "hide": 0, + "includeAll": false, + "label": "Instance", + "multi": false, + "multiFormat": "glob", + "name": "instance", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\"}, instance)", + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "error": null, + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_heap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"heap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allFormat": "glob", + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "Prometheus", + "definition": "", + "error": null, + "hide": 0, + "includeAll": true, + "label": "JVM Memory Pools Non-Heap", + "multi": false, + "multiFormat": "glob", + "name": "jvm_memory_pool_nonheap", + "options": [], + "query": "label_values(jvm_memory_used_bytes{application=\"$application\", instance=\"$instance\", area=\"nonheap\"},id)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 2, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": true, + "text": "scheduler", + "value": "scheduler" + }, + "datasource": "Prometheus", + "definition": "label_values(executor_pool_max_threads,pool)", + "error": null, + "hide": 0, + "includeAll": false, + "label": null, + "multi": false, + "name": "threadpool", + "options": [ + { + "selected": false, + "text": "file-processing", + "value": "file-processing" + }, + { + "selected": false, + "text": "safeCall", + "value": "safeCall" + }, + { + "selected": false, + "text": "thingManager", + "value": "thingManager" + }, + { + "selected": false, + "text": "lsp", + "value": "lsp" + }, + { + "selected": false, + "text": "ConfigStatusService", + "value": "ConfigStatusService" + }, + { + "selected": false, + "text": "discovery", + "value": "discovery" + }, + { + "selected": true, + "text": "scheduler", + "value": "scheduler" + }, + { + "selected": false, + "text": "common", + "value": "common" + } + ], + "query": "label_values(executor_pool_max_threads,pool)", + "refresh": 0, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": true, + "text": "", + "value": "" + }, + "error": null, + "hide": 2, + "label": null, + "name": "application", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "skipUrlSync": false, + "type": "constant" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "now": true, + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "openHAB metrics", + "uid": "g5NVJ0Dik", + "version": 30 +} \ No newline at end of file diff --git a/_addons_ios/metrics/doc/grafana-1.png b/_addons_ios/metrics/doc/grafana-1.png new file mode 100644 index 000000000..786e0c4a6 Binary files /dev/null and b/_addons_ios/metrics/doc/grafana-1.png differ diff --git a/_addons_ios/metrics/doc/grafana-2.png b/_addons_ios/metrics/doc/grafana-2.png new file mode 100644 index 000000000..bfe3d7192 Binary files /dev/null and b/_addons_ios/metrics/doc/grafana-2.png differ diff --git a/_addons_ios/metrics/doc/grafana-3.png b/_addons_ios/metrics/doc/grafana-3.png new file mode 100644 index 000000000..01b501220 Binary files /dev/null and b/_addons_ios/metrics/doc/grafana-3.png differ diff --git a/_addons_ios/metrics/readme.md b/_addons_ios/metrics/readme.md new file mode 100644 index 000000000..5afa86777 --- /dev/null +++ b/_addons_ios/metrics/readme.md @@ -0,0 +1,113 @@ +--- +id: metrics +label: Metrics service +title: Metrics service - System Integrations +type: io +description: "The metrics service provides" +since: 3x +install: manual +--- + + + +{% include base.html %} + +# Metrics service + +The metrics service provides + +* an additional REST endpoint to retrieve openHAB core metrics from. This can be used as scrape target for pull-based monitoring systems like [Prometheus](https://prometheus.io/). +* optionally configurable services to export openHAB core metrics to push-based monitoring systems like [InfluxDB](https://www.influxdata.com/). + +## Precondition + +The openHAB core metrics must be available (at least OH version 3.1). + +## Provided metrics + +Currently the following metrics are provided: + +- openHAB events counts (per topic) +- openHAB bundle states +- openHAB thing states +- openHAB rule runs (per rule) +- openHAB threadpool stats (per scheduler) +- JVM stats including metrics of + - class loader + - memory + - GarbageCollector + - OS (system load, CPU) + - thread metrics + +## Configuration + +The configuration for the metrics service is available in the openHAB UI under Settings | Other Services | Metrics service. +Support for pull-based monitoring systems (e. g. Prometheus) is always enabled, since it doesn't imply any significant overhead when not used. +Support for push-based monitoring systems (e. g. InfluxDB) have to be enabled separately. + +The following configuration parameters can be set: + +|Config param|Description|Default value| +|--|--|--| +|influxMetricsEnabled|Enable the Influx (www.influxdata.com) metrics. Further configuration of the InfluxDB instance necessary.|false| + +Refer to the corresponding monitoring system sections for monitoring system specific configuration parameters. + +### Supported monitoring systems + +For a start, the following formats are supported: + +### Prometheus + +Once the IO addon is installed, the Prometheus endpoint will be available under: +_:8080/rest/metrics/prometheus_ + +Refer to the [Prometheus](https://prometheus.io/) documentation on how to setup a Prometheus instance and add a scrape configuration. A typical scrape config could look like this (excerpt from `/etc/prometheus/prometheus.yml`): + +````shell +scrape_configs: + - job_name: 'openhab' + scrape_interval: 1m + scheme: http + metrics_path: /rest/metrics/prometheus + static_configs: + - targets: + - 'openhab.local:8080' +```` + +Replace `openhab.local` by the openhab host. + +#### Available configuration parameters + +There are no Prometheus specific configuration paramters. + +### InfluxDB + +The InfluxDB exporter service will start as soon as the _influxMetricsEnabled_ configuration parameter is set to true. + +#### Available configuration parameters + +|Config param|Description|Default value| +|--|--|--| +|influxURL|The URL of the InfluxDB instance. Defaults to http://localhost:8086|http://localhost:8086| +|influxDB|The name of the database to use. Defaults to "openhab".|openhab| +|influxUsername|InfluxDB user name|n/a| +|influxPassword|The InfluxDB password (no default).|n/a| +|influxUpdateIntervalInSeconds|Controls how often metrics are exported to InfluxDB (in seconds). Defaults to 300|300| + +## Additional metric formats + +The metrics service was implemented using [Micrometer](https://micrometer.io), which supports a number of [monitoring systems](https://micrometer.io/docs) +It should be possible to add any of these, especially the ones using a pull mechanism ("scraping") like Prometheus does. + +## Grafana + +You can now visualize the results in Grafana. Micrometer provides a public [Grafana dashboard here](https://grafana.com/grafana/dashboards/4701). +I adapted it a little bit to include the openHAB metrics. You can download it here [Dashboard](doc/dashboard.json). +This has been tested with Prometheus - for other monitoring systems adaptions to the dashboard might be necessary. + +Here are some screenshots: + +![Grafana (1)](doc/grafana-1.png) +![Grafana (2)](doc/grafana-2.png) +![Grafana (3)](doc/grafana-3.png) diff --git a/_addons_ios/neeo/doc/cfg.png b/_addons_ios/neeo/doc/cfg.png deleted file mode 100644 index 17cd177eb..000000000 Binary files a/_addons_ios/neeo/doc/cfg.png and /dev/null differ diff --git a/_addons_ios/neeo/readme.md b/_addons_ios/neeo/readme.md index 7ca54501e..4420d1b1d 100644 --- a/_addons_ios/neeo/readme.md +++ b/_addons_ios/neeo/readme.md @@ -411,9 +411,7 @@ The following changes have occurred: ## Configuration -After installing this add-on, you will find configuration options in the Paper UI under _Configuration->Services->IO->NEEO Integration_: - -![Configuration](doc/cfg.png) +After installing this add-on, you can configure the integration using the "NEEO Integration" settings in the UI. Alternatively, you can configure the settings in the file `conf/services/neeo.cfg`: diff --git a/_addons_ios/openhabcloud/contrib/doc/cfg.png b/_addons_ios/openhabcloud/contrib/doc/cfg.png index 9720dd4ff..961fd5835 100644 Binary files a/_addons_ios/openhabcloud/contrib/doc/cfg.png and b/_addons_ios/openhabcloud/contrib/doc/cfg.png differ diff --git a/_addons_ios/openhabcloud/readme.md b/_addons_ios/openhabcloud/readme.md index ead4054f4..cb33aef8b 100644 --- a/_addons_ios/openhabcloud/readme.md +++ b/_addons_ios/openhabcloud/readme.md @@ -25,6 +25,12 @@ The openHAB Cloud service (and thus the connector to it) is useful for different * It serves as a connector to Google Cloud Messaging (GCM) and Apple Push Notifications (APN) for pushing notifications to mobile phone apps. * It brings integration possibilities with services that require an OAuth2 authentication against a web server, such as IFTTT or Amazon Alexa Skills. +## Installation via UI + +* Open the openHAB web portal and login as an administrator. +* Click on Settings, followed by Misc (in the Add-ons section) +* Using the + button on the bottom right you can install the openHAB Cloud Add-on + ## UUID and Secret To authenticate with the openHAB Cloud service the add-on generates two values when the add-on is installed. @@ -40,12 +46,12 @@ Location of UUID and Secret: | File | Regular Installation | APT Installation | |--------|------------------------------|---------------------------------------| -| UUID | userdata/uuid | /var/lib/openhab2/uuid | -| Secret | userdata/openhabcloud/secret | /var/lib/openhab2/openhabcloud/secret | +| UUID | userdata/uuid | /var/lib/openhab/uuid | +| Secret | userdata/openhabcloud/secret | /var/lib/openhab/openhabcloud/secret | ## Configuration -After installing this add-on, you will find configuration options in the Paper UI under _Configuration->Services->IO->openHAB Cloud_: +After installing this add-on, you will find configuration options in the openHAB portal under _Settings -> Other Services -> openHAB Cloud_: ![Configuration](contrib/doc/cfg.png) @@ -79,3 +85,5 @@ Alternatively, you can configure the settings in the file `conf/services/openhab ``` Note: The exposed items will show up after they receive an update to their state. + +Note: In order to use an openHAB UI via the Cloud Connector exposing items is not neccessary. Administrative actions are limited to creating things, items and rules, deleting them is inhibited via the Cloud Connector. diff --git a/_addons_persistences/jdbc/readme.md b/_addons_persistences/jdbc/readme.md index ed2105290..ca42958b0 100644 --- a/_addons_persistences/jdbc/readme.md +++ b/_addons_persistences/jdbc/readme.md @@ -58,13 +58,15 @@ This service can be configured in the file `services/jdbc.cfg`. | user | | if needed | database user name | | password | | if needed | database user password | | errReconnectThreshold | 0 | No | when the service is deactivated (0 means ignore) | -| sqltype.CALL | `VARCHAR(200)` | No | All `sqlType` options allow you to change the SQL data type used to store values for different openHAB item states. See the following links for further information: [mybatis](https://mybatis.github.io/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html) [H2](http://www.h2database.com/html/datatypes.html) [PostgresSQL](http://www.postgresql.org/docs/9.3/static/datatype.html) | +| sqltype.CALL | `VARCHAR(200)` | No | All `sqlType` options allow you to change the SQL data type used to store values for different openHAB item states. See the following links for further information: [mybatis](https://mybatis.github.io/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html) [H2](https://www.h2database.com/html/datatypes.html) [PostgresSQL](https://www.postgresql.org/docs/9.3/static/datatype.html) | | sqltype.COLOR | `VARCHAR(70)` | No | see above | | sqltype.CONTACT | `VARCHAR(6)` | No | see above | | sqltype.DATETIME | `DATETIME` | No | see above | | sqltype.DIMMER | `TINYINT` | No | see above | -| sqltype.LOCATION | `VARCHAR(30)` | No | see above | +| sqltype.IMAGE | `VARCHAR(65500)` | No | see above | +| sqltype.LOCATION | `VARCHAR(50)` | No | see above | | sqltype.NUMBER | `DOUBLE` | No | see above | +| sqltype.PLAYER | `VARCHAR(20)` | No | see above | | sqltype.ROLLERSHUTTER | `TINYINT` | No | see above | | sqltype.STRING | `VARCHAR(65500)` | No | see above | | sqltype.SWITCH | `VARCHAR(6)` | No | see above | @@ -140,7 +142,7 @@ The SQL types `DECIMAL` or `NUMERIC` are precise, but to work with `DOUBLE` is The results of database queries of number items are rounded to three decimal places by default. With `numberDecimalcount` decimals can be changed. -Especially if sql types `DECIMAL` or `NUMERIC` are used for `sqltype.NUMBER`, rounding can be disabled by setting `numberDecimalcount=-1`. +Especially if sql types `DECIMAL` or `NUMERIC` are used for `sqltype.NUMBER`, rounding can be disabled by setting `numberDecimalcount=-1`. ### For Developers @@ -170,7 +172,7 @@ Used a script like this: ``` var count = 0; rule "DB STRESS TEST" -when +when Time cron "30 * * * * ?" then if( count = 24) count = 0 diff --git a/_addons_persistences/mongodb/readme.md b/_addons_persistences/mongodb/readme.md index 3d4f341cf..d657efaef 100644 --- a/_addons_persistences/mongodb/readme.md +++ b/_addons_persistences/mongodb/readme.md @@ -26,6 +26,9 @@ This service can be configured in the file `services/mongodb.cfg`. | ---------- | ------- | :------: | ---------------------------------------------------------------------------- | | url | | Yes | connection URL to address MongoDB. For example, `mongodb://localhost:27017` | | database | | Yes | database name | -| collection | | Yes | collection name | +| collection | | Yes | set collection to "" if it shall generate a collection per item | + +If you have a username and password it looks like this: url = mongodb://[username]:[password]@[localhost]:27017/[database] +The database is required: https://mongodb.github.io/mongo-java-driver/3.9/javadoc/com/mongodb/MongoClientURI.html All item and event related configuration is done in the file `persistence/mongodb.persist`. diff --git a/_addons_transformations/javascript/readme.md b/_addons_transformations/javascript/readme.md index 5db00085b..d558e7202 100644 --- a/_addons_transformations/javascript/readme.md +++ b/_addons_transformations/javascript/readme.md @@ -34,6 +34,7 @@ transform/getValue.js: ``` ## Test JavaScript + You can use online JavaScript testers to validate your script. E.g. https://www.webtoolkitonline.com/javascript-tester.html diff --git a/_addons_transformations/map/readme.md b/_addons_transformations/map/readme.md index 93fd948bb..8ad968f19 100644 --- a/_addons_transformations/map/readme.md +++ b/_addons_transformations/map/readme.md @@ -14,7 +14,8 @@ install: auto # Map Transformation Service -Transforms the input by mapping it to another string. It expects the mappings to be read from a file which is stored under the `transform` folder. +Transforms the input by mapping it to another string. It expects the mappings to be read from a file which is stored under the `transform` folder. +The file name must have the `.map` extension. This file should be in property syntax, i.e. simple lines with "key=value" pairs. The file format is documented [here](https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html#load-java.io.Reader-). diff --git a/_addons_uis/basic/readme.md b/_addons_uis/basic/readme.md index 19efa129f..49726684a 100644 --- a/_addons_uis/basic/readme.md +++ b/_addons_uis/basic/readme.md @@ -18,9 +18,9 @@ The Basic UI is a web interface based on Material Design Lite from Google. ### Features -* Responsive layout suitable for various screen sizes -* AJAX navigation -* Live update +- Responsive layout suitable for various screen sizes +- AJAX navigation +- Live update ### Configuration @@ -37,7 +37,7 @@ org.openhab.basicui:iconType=svg The Basic UI has a default layout showing all things and their corresponding items. You may create your own sitemaps and access them through the basic UI in 2 ways. -1. Set the default sitemap via the Paper UI via Configuration -> Services -> Basic UI -> Configure, and set the Default Sitemap name. +1. Set the default sitemap via the UI via Settings -> Basic UI -> Configure, and set the Default Sitemap name. 2. Passing the "sitemap" parameter to the URL used to access the server. diff --git a/_addons_uis/habpanel/doc/habpanel.md b/_addons_uis/habpanel/doc/habpanel.md index 340df1ad6..f7502fc93 100644 --- a/_addons_uis/habpanel/doc/habpanel.md +++ b/_addons_uis/habpanel/doc/habpanel.md @@ -1,7 +1,7 @@ --- layout: documentation title: HABPanel -source: https://github.com/openhab/org.openhab.ui.habpanel/blob/master/doc/habpanel.md +source: https://github.com/openhab/openhab-webui/blob/main/bundles/org.openhab.ui.habpanel/doc/habpanel.md --- {% include base.html %} diff --git a/_addons_uis/org.openhab.ui/doc/components/images/examplerequired.png b/_addons_uis/org.openhab.ui/doc/components/images/examplerequired.png new file mode 100644 index 000000000..4a86e2d3e Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/examplerequired.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/header.png b/_addons_uis/org.openhab.ui/doc/components/images/header.png new file mode 100644 index 000000000..389dbed02 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/header.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-block/header.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-block/header.png new file mode 100644 index 000000000..3d7247a04 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-block/header.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-block/oh-block-editor.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-block/oh-block-editor.png new file mode 100644 index 000000000..f9438b202 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-block/oh-block-editor.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-analyzer.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-analyzer.png new file mode 100644 index 000000000..df3015670 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-analyzer.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-command.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-command.png new file mode 100644 index 000000000..7d9349119 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-command.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-group.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-group.png new file mode 100644 index 000000000..ace0e3d83 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-group.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-navigate.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-navigate.png new file mode 100644 index 000000000..1432bc862 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-navigate.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-options.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-options.png new file mode 100644 index 000000000..4fb414597 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-options.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-photos.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-photos.png new file mode 100644 index 000000000..9961383bc Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-photos.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-toggle.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-toggle.png new file mode 100644 index 000000000..71560741d Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-toggle.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-url.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-url.png new file mode 100644 index 000000000..a4b73aed6 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/action-url.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/bogob.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/bogob.png new file mode 100644 index 000000000..3f5e0e104 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/bogob.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/header.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/header.png new file mode 100644 index 000000000..04a82faaf Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/header.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-button/keypad.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/keypad.png new file mode 100644 index 000000000..2e7c828d3 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-button/keypad.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/images/oh-gauge/header.png b/_addons_uis/org.openhab.ui/doc/components/images/oh-gauge/header.png new file mode 100644 index 000000000..1c6644525 Binary files /dev/null and b/_addons_uis/org.openhab.ui/doc/components/images/oh-gauge/header.png differ diff --git a/_addons_uis/org.openhab.ui/doc/components/index.md b/_addons_uis/org.openhab.ui/doc/components/index.md new file mode 100644 index 000000000..62be4f9ca --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/index.md @@ -0,0 +1,141 @@ +--- +title: Component Reference +description: Index of all components defined in openHAB's main UI +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/src/index.md +--- + +# Component Reference + +## System Widget Library + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-button`](./oh-button.html) | [Button](./oh-button.html) | Button performing an action | +| [`oh-chart`](./oh-chart.html) | [Chart](./oh-chart.html) | Visualize series of data | +| [`oh-colorpicker`](./oh-colorpicker.html) | [Colorpicker](./oh-colorpicker.html) | Control to pick a color | +| [`oh-gauge`](./oh-gauge.html) | [Gauge](./oh-gauge.html) | Circular or semi-circular read-only gauge | +| [`oh-icon`](./oh-icon.html) | [Icon](./oh-icon.html) | Display an openHAB icon | +| [`oh-image`](./oh-image.html) | [Image](./oh-image.html) | Displays an image from a URL or an item | +| [`oh-input`](./oh-input.html) | [Input](./oh-input.html) | Displays an input field, used to set a variable | +| [`oh-knob`](./oh-knob.html) | [Knob](./oh-knob.html) | Knob control, allow to change a number value on a circular track | +| [`oh-link`](./oh-link.html) | [Link](./oh-link.html) | Link performing an action | +| [`oh-list`](./oh-list.html) | [List](./oh-list.html) | List control, hosts list items | +| [`oh-player`](./oh-player.html) | [Media player](./oh-player.html) | Media player controls, with previous track/pause/play/next buttons | +| [`oh-repeater`](./oh-repeater.html) | [Repeater](./oh-repeater.html) | Iterate over an array and repeat the children components in the default slot | +| [`oh-rollershutter`](./oh-rollershutter.html) | [Rollershutter](./oh-rollershutter.html) | Rollershutter control, with up/down/stop buttons | +| [`oh-slider`](./oh-slider.html) | [Slider](./oh-slider.html) | Slider control, allows to pick a number value on a scale | +| [`oh-stepper`](./oh-stepper.html) | [Stepper](./oh-stepper.html) | Stepper control, allows to input a number or decrement/increment it using buttons | +| [`oh-swiper`](./oh-swiper.html) | [Swiper](./oh-swiper.html) | Swiper control, allows to display multiple swipeable slides | +| [`oh-toggle`](./oh-toggle.html) | [Toggle](./oh-toggle.html) | Toggle control, allows to switch on or off | +| [`oh-trend`](./oh-trend.html) | [Trend line](./oh-trend.html) | Trend line to display the overall recent evoluation of an item | +| [`oh-video`](./oh-video.html) | [Video](./oh-video.html) | Displays a video player from a URL or an item | +| [`oh-webframe`](./oh-webframe.html) | [Web frame](./oh-webframe.html) | Displays a web page in a frame | + + +## Standard Widget Library (Standalone Cards) + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-clock-card`](./oh-clock-card.html) | [Digital Clock Card](./oh-clock-card.html) | Display a digital clock in a card | +| [`oh-colorpicker-card`](./oh-colorpicker-card.html) | [Color Picker Card](./oh-colorpicker-card.html) | Display a color picker in a card | +| [`oh-gauge-card`](./oh-gauge-card.html) | [Gauge Card](./oh-gauge-card.html) | Display a read-only gauge in a card to visualize a quantifiable item | +| [`oh-image-card`](./oh-image-card.html) | [Image Card](./oh-image-card.html) | Display an image (URL or Image item ) in a card | +| [`oh-input-card`](./oh-input-card.html) | [Input Card](./oh-input-card.html) | Display an input in a card | +| [`oh-knob-card`](./oh-knob-card.html) | [Knob Card](./oh-knob-card.html) | Display a knob in a card to visualize and control a quantifiable item | +| [`oh-label-card`](./oh-label-card.html) | [Label Card](./oh-label-card.html) | Display the state of an item in a card | +| [`oh-list-card`](./oh-list-card.html) | [List Card](./oh-list-card.html) | Display a list in a card | +| [`oh-player-card`](./oh-player-card.html) | [Player Card](./oh-player-card.html) | Display player controls in a card | +| [`oh-rollershutter-card`](./oh-rollershutter-card.html) | [Rollershutter Card](./oh-rollershutter-card.html) | Display rollershutter controls in a card | +| [`oh-slider-card`](./oh-slider-card.html) | [Slider Card](./oh-slider-card.html) | Display a slider in a card to control an item | +| [`oh-stepper-card`](./oh-stepper-card.html) | [Stepper Card](./oh-stepper-card.html) | Display a stepper in a card to control an item | +| [`oh-swiper-card`](./oh-swiper-card.html) | [Swiper Card](./oh-swiper-card.html) | Display a swiper allowing to browse slides, in a card | +| [`oh-toggle-card`](./oh-toggle-card.html) | [Toggle Card](./oh-toggle-card.html) | Display a toggle swtich in a card to send ON/OFF commands | +| [`oh-video-card`](./oh-video-card.html) | [Video Card](./oh-video-card.html) | Display a video (URL or URL from String item) in a card | +| [`oh-webframe-card`](./oh-webframe-card.html) | [Web Frame Card](./oh-webframe-card.html) | Display a web page in a card | + + +## Standard Widget Library (List Items) + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-colorpicker-item`](./oh-colorpicker-item.html) | [Color Picker List Item](./oh-colorpicker-item.html) | Display a color picker in a list | +| [`oh-input-item`](./oh-input-item.html) | [Input List Item](./oh-input-item.html) | Display an input field in a list | +| [`oh-label-item`](./oh-label-item.html) | [Label List Item](./oh-label-item.html) | Display the state of an item in a list | +| [`oh-list-item`](./oh-list-item.html) | [List Item](./oh-list-item.html) | A list item | +| [`oh-player-item`](./oh-player-item.html) | [Player List Item](./oh-player-item.html) | Display player controls in a list | +| [`oh-rollershutter-item`](./oh-rollershutter-item.html) | [Rollershutter List Item](./oh-rollershutter-item.html) | Display rollershutter controls in a list | +| [`oh-slider-item`](./oh-slider-item.html) | [Slider List Item](./oh-slider-item.html) | Display a slider control in a list | +| [`oh-stepper-item`](./oh-stepper-item.html) | [Stepper List Item](./oh-stepper-item.html) | Display a stepper control in a list | +| [`oh-toggle-item`](./oh-toggle-item.html) | [Toggle List Item](./oh-toggle-item.html) | Display a toggle switch in a list | + + +## Standard Widget Library (Cells) + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-cell`](./oh-cell.html) | [Cell](./oh-cell.html) | A regular or expandable cell | +| [`oh-colorpicker-cell`](./oh-colorpicker-cell.html) | [Colorpicker Cell](./oh-colorpicker-cell.html) | A cell expanding to a color picker | +| [`oh-knob-cell`](./oh-knob-cell.html) | [Knob Cell](./oh-knob-cell.html) | A cell expanding to a knob control | +| [`oh-label-cell`](./oh-label-cell.html) | [Label Cell](./oh-label-cell.html) | A cell with a big label to show a short item state value | +| [`oh-rollershutter-cell`](./oh-rollershutter-cell.html) | [Rollershutter Cell](./oh-rollershutter-cell.html) | A cell expanding to rollershutter controls | +| [`oh-slider-cell`](./oh-slider-cell.html) | [Slider Cell](./oh-slider-cell.html) | A cell expanding to a big vertical slider | + + +## Layout Components + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-block`](./oh-block.html) | [Layout Grid Block](./oh-block.html) | A block in a grid layout | +| [`oh-grid-col`](./oh-grid-col.html) | [Layout Grid Column](./oh-grid-col.html) | A column in a grid layout | +| [`oh-grid-row`](./oh-grid-row.html) | [Layout Grid Row](./oh-grid-row.html) | A row in a grid layout | +| [`oh-masonry`](./oh-masonry.html) | [Masonry Layout](./oh-masonry.html) | Arranges widgets automatically depending on the screen size | + + +## Map Page & Markers + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-map-circle-marker`](./oh-map-circle-marker.html) | [Circle Marker](./oh-map-circle-marker.html) | A circle on a map, to represent a radius | +| [`oh-map-marker`](./oh-map-marker.html) | [Map Marker](./oh-map-marker.html) | An icon on a map | +| [`oh-map-page`](./oh-map-page.html) | [Map page](./oh-map-page.html) | Displays markers on a map | + + +## Floorplan Page & Markers + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-plan-marker`](./oh-plan-marker.html) | [Floor Plan Marker](./oh-plan-marker.html) | A marker on a floor plan | +| [`oh-plan-page`](./oh-plan-page.html) | [Floor plan](./oh-plan-page.html) | Displays markers on an image overlay | + + +## Chart Page & Components + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-chart-page`](./oh-chart-page.html) | [Chart Page](./oh-chart-page.html) | Visualize historical series | +| [`oh-chart-grid`](./oh-chart-grid.html) | [Cartesian Grid](./oh-chart-grid.html) | | +| [`oh-category-axis`](./oh-category-axis.html) | [Category Axis](./oh-category-axis.html) | | +| [`oh-value-axis`](./oh-value-axis.html) | [Value Axis](./oh-value-axis.html) | | +| [`oh-time-axis`](./oh-time-axis.html) | [Time Axis](./oh-time-axis.html) | | +| [`oh-calendar-axis`](./oh-calendar-axis.html) | [Calendar](./oh-calendar-axis.html) | | +| [`oh-data-series`](./oh-data-series.html) | [Data Series](./oh-data-series.html) | | +| [`oh-time-series`](./oh-time-series.html) | [Time Series](./oh-time-series.html) | | +| [`oh-aggregate-series`](./oh-aggregate-series.html) | [Aggregate Series](./oh-aggregate-series.html) | | +| [`oh-calendar-series`](./oh-calendar-series.html) | [Calendar Series](./oh-calendar-series.html) | | +| [`oh-chart-tooltip`](./oh-chart-tooltip.html) | [Tooltip](./oh-chart-tooltip.html) | | +| [`oh-chart-visualmap`](./oh-chart-visualmap.html) | [Visual Map](./oh-chart-visualmap.html) | | +| [`oh-chart-datazoom`](./oh-chart-datazoom.html) | [Data Zoom](./oh-chart-datazoom.html) | | +| [`oh-chart-legend`](./oh-chart-legend.html) | [Legend](./oh-chart-legend.html) | | +| [`oh-chart-title`](./oh-chart-title.html) | [Title](./oh-chart-title.html) | | +| [`oh-chart-toolbox`](./oh-chart-toolbox.html) | [Toolbox](./oh-chart-toolbox.html) | | + + +## Home Page Cards + +| Component | Name | Description | +|--------|------|-------------| +| [`oh-location-card`](./oh-location-card.html) | [Location Card](./oh-location-card.html) | A card showing model items in a certain location | +| [`oh-equipment-card`](./oh-equipment-card.html) | [Equipment Class Card](./oh-equipment-card.html) | A card showing model items belonging to a certain equipment class | +| [`oh-property-card`](./oh-property-card.html) | [Property Card](./oh-property-card.html) | A card showing model items related to a certain property | + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-aggregate-series.md b/_addons_uis/org.openhab.ui/doc/components/oh-aggregate-series.md new file mode 100644 index 000000000..65ae601bc --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-aggregate-series.md @@ -0,0 +1,192 @@ +--- +title: oh-aggregate-series - Aggregate Series +component: oh-aggregate-series +label: Aggregate Series +description: Reference documentation for the oh-aggregate-series component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-aggregate-series.md +prev: /docs/ui/components/ +--- + +# oh-aggregate-series - Aggregate Series + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + + + The item whose persisted data to display + + + + + The identifier of the persistence service to retrieve the data from. Leave blank to the use the default. + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Unit). + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Amount). + + + + + + + + + + + + + The type of the series.
Note: heatmap needs a configured visual map and is not supported for time series +
+ + + + + + +
+ + + The largest data point cluster size.
It should be consistent with the chart type, and match the type of a category axis where this series will appear. +
+ + + + + + + + +
+ + + The smallest data point cluster size.
Set only when you have 2 category axes (for instance day of the week and hour of the day), and make sure to match the type of the 2nd axis. +
+ + + + + + + + +
+ + + Enable when the first dimension should be mapped to the Y axis instead of the X axis + + + + + How to reduce the data points in a same aggregation cluster to a single value. If not specified, the average function will be used. + + + + + + + + + + + + +
+
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the X axis for this series + + + + + The index of the Y axis for this series + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-block.md b/_addons_uis/org.openhab.ui/doc/components/oh-block.md new file mode 100644 index 000000000..c82f4c2e8 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-block.md @@ -0,0 +1,132 @@ +--- +title: oh-block - Layout Grid Block +component: oh-block +label: Layout Grid Block +description: A block in a grid layout +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-block.md +prev: /docs/ui/components/ +--- + +# oh-block - Layout Grid Block + +![oh-block header](./images/oh-block/header.png) + +[[toc]] + +## Usage / reference documents + +Grids elements provide a way to organize and position other visual components on the page in relation to each other. +Some of the key design concepts are explored [here (print)](https://visme.co/blog/layout-design/) or [here (UI design)](https://material.io/design/layout/responsive-layout-grid.html). + +In openHAB grid is used within [layout pages](../layout-pages.html) to organize and align controls. +Grids can also be used to layout the controls that make up a custom widget. +Both layout pages and individual controls can be made [responsive](/docs/ui/layout-pages.html#designing-responsive-layout-pages)) (their design changes based on the screen size). +A layout that is optimal on a mobile phone screen is often not on a laptop or large monitor. + +::: warning Widget design +`oh-block`, [`oh-grid-row`](./oh-grid-row.html) and [`oh-grid-col`](./oh-grid-col.html) are used for layout page design. +These controls are not suitable when designing custom widgets. +Use the [f7-block](https://v5.framework7.io/vue/block.html), [f7-row](https://v5.framework7.io/vue/grid.html) and [f7-column](https://v5.framework7.io/vue/grid.html) to organize components in custom widget designs. +::: + +* Layout pages are discussed within the main documentation [here](/docs/ui/layout-pages.html). +* `oh-block` is the root a container object for [`oh-grid-row`](./oh-grid-row.html)/[`oh-grid-col`](./oh-grid-col.html) objects (which in turn, host the controls that provide the user interface). +* An `oh-block` is created in a layout page each time you click the `Add Block` button in the page design window. At least one block is required for each layout page. +* You can view / edit the layout page code by clicking the `Code` tab when in page design view (Administration/Settings/Pages). + +![Layout page code editor](./images/oh-block/oh-block-editor.png) + +* These components are based upon the corresponding [Framework 7 (v5) block control](https://v5.framework7.io/docs/block.html). +* Component styles are applied by the [Framework 7 CSS variables](https://v5.framework7.io/docs/block.html#css-variables). +Not all styles are implemented/available for use in this customised version of the control. +For guidance on how to customise styles see the [CSS Styles](https://openhab.org/docs/ui/building-pages.html#css-variables) section. + +::: tip +Grid is not a table! +Grid components are virtual containers, so you can not view them or add borders as you would be able to do with a HTML table. +::: + +## Configuration + + + +### General +
+ + + + Title of the block, displayed above it + + + +
+ + + + +### Inherited Properties + +The configuration is passed to the underlying `f7-block` component from Framework7 v5, however there are no compatible scalar properties available, due to the application specific purpose for this control. + +### Slots + +#### `default` + +Hosts all child content to be placed within this container. + +## Examples + +### Header Image Source Code + +This example code generates the example block and grid image used at the top of this page: + +::: details YAML + +```yaml{4-8} +config: + label: testGrid +blocks: + - component: oh-block + config: + title: Here is a BLOCK with a TITLE + slots: + default: + - component: oh-grid-row + config: {} + slots: + default: [] + - component: oh-grid-cells + config: {} + slots: + default: + - component: oh-cell + config: {} + - component: oh-cell + config: {} + - component: oh-cell + config: {} + - component: oh-cell + config: {} + - component: oh-grid-row + config: {} + slots: + default: + - component: oh-grid-col + config: {} + slots: + default: + - component: oh-label-card + config: {} + - component: oh-grid-col + config: {} + slots: + default: + - component: oh-label-card + config: {} +masonry: [] +``` +::: + +## Community Resources + +* Got a cool example from the Community pages? Use the GitHub edit page link to add links to this page! diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-button.md b/_addons_uis/org.openhab.ui/doc/components/oh-button.md new file mode 100644 index 000000000..4ebd48d9a --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-button.md @@ -0,0 +1,990 @@ +--- +title: oh-button - Button +component: oh-button +label: Button +description: Button performing an action +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-button.md +prev: /docs/ui/components/ +--- + +# oh-button - Button + + +Button performing an action + + +[![oh-button header](./images/oh-button/header.png)](#header) + +[[toc]] + +## Usage / reference documents + +* The `oh-button` component is based upon the [Framework 7 Vue button control (`f7-button`)](https://v5.framework7.io/vue/button.html). +* Component styles are applied by the [Framework 7 CSS variables](https://v5.framework7.io/docs/button.html#css-variables). For guidance on how to customise styles see the [CSS Styles](https://openhab.org/docs/ui/building-pages.html#css-variables) section. +* Use the [`f7-segmented`](#f7-segmented) wrapper component to group buttons together. Buttons with the property `active: true` set will be highlighted/marked as selected. + +## Configuration + + +### General +
+ + + + Button label + + + + + Makes button round + + + + + Makes button large + + + + + Makes button small + + + + + Makes button filled with color + + + + + Makes button raised + + + + + Makes button outline + + + + + Button is active (when part of a f7-segmented + + + + + Framework7 icon to display (Framework7 icon) + + + + + Material design icon to display + + + + + Not applicable to openHAB icons + + + + + Size of the icon in px + + + + + Button tooltip text to show on button hover/press + + + + + Name of the variable to set on input change + + + + + Name of the variable to clear after performing the action + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + +### Inherited Properties + +The configuration is passed to the underlying `f7-button` component from Framework7 v5. +All compatible scalar [properties](https://v5.framework7.io/vue/button.html#button-properties) (except functions) not listed above are available for use. + +### Slots + +#### `default` + +The contents of the button. + +## Examples + +### Header Image Source Code + +This example code generates the button image used at the top of this page: + +::: details YAML + +```yaml +uid: oh-button +tags: [] +timestamp: Feb 9, 2021, 5:42:56 PM +component: f7-card +config: + title: oh-button +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + height: 230px + padding-bottom: 20px + slots: + default: + - component: oh-button + config: + width: 400px + text: Basic button + - component: oh-button + config: + width: 400px + text: Rounded + Outline + round: true + outline: true + - component: oh-button + config: + text: Large + outline: true + large: true + grid-colum: 3 + grid-row: 1 + - component: oh-button + config: + text: Small + Outline + outline: true + small: true + - component: oh-button + config: + text: Filled + fill: true + - component: oh-button + config: + text: Raised + fill: true + raised: true + - component: oh-button + config: + text: Outline + outline: true + - component: oh-button + config: + text: f7 icon + iconF7: arrow_right_arrow_left_square_fill + tooltip: Click to view f7 icons + action: url + actionUrl: https://framework7.io/icons/ + - component: oh-button + config: + text: Material icon + iconMaterial: fingerprint + tooltip: Click to view Material icons + action: url + actionUrl: https://material.io/resources/icons/ + - component: oh-button + config: + text: Icon color + iconMaterial: power_settings_new + iconColor: green + - component: oh-button + config: + text: 40px icon, with custom button height to fit it! + outline: true + fill: true + iconMaterial: report_problem + iconSize: 40 + style: + height: 80px + width: 300px + white-space: normal + - component: oh-button + config: + text: Tooltip - hover over me + tooltip: Don't Panic + - component: oh-button + config: + text: Set variable 'myVariable' + variable: myVariable + action: variable + actionVariable: myVariable + actionVariableValue: 1 + - component: oh-button + config: + text: Clear variable 'myVariable' + clearVariable: myVariable + action: variable + actionVariable: myVariable + - component: f7-segmented + slots: + default: + - component: oh-button + config: + text: Option 1 + outline: true + style: + width: 200px + - component: oh-button + config: + text: Option 2 (Active) + outline: true + active: true + style: + width: 200px + - component: oh-button + config: + text: Option 3 + outline: true + style: + width: 200px +``` +::: + +### action: navigate + +![action navigate](./images/oh-button/action-navigate.png) + +`action: navigate` allows you to navigate to another page (Administration -> Settings -> Pages) within the openHAB application. +The target page is specified with the name of the page in the `actionPage` property. +For example to create a button to take users to the main overview (home) page, set `actionPage: page:overview`. +The value after the `page:` is the page **ID** not the page **Label**. + +::: details YAML + +``` yaml{26-27} +uid: oh-button-action-navigate +tags: [] +timestamp: Feb 15, 2021, 8:32:44 PM +component: f7-card +config: + title: "oh-button > action: navigate" +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: oh-button + config: + width: 400px + iconF7: house_fill + text: Home Page + outline: true + action: navigate + actionPage: page:overview + style: + width: 250px +``` +::: + +### action: command + +![action command](./images/oh-button/action-command.png) + +`action: command` allows you to send a command `actionCommand` to an item, specified in the `actionItem`. +This example shows how to send ON and OFF commands to an item e.g. a light, using two buttons. + +::: details YAML + +``` yaml{40-43,50-53} +uid: oh-button-action-command +tags: [] +props: + parameters: + - context: item + description: Select the item to use with these buttons. + label: Item + name: item + required: true + type: TEXT + groupName: general + parameterGroups: + - name: general + label: Display options +timestamp: Feb 15, 2021, 9:21:10 PM +component: f7-card +config: + title: "oh-button > action: command" + footer: Set the properties to any item that accepts an ON/OFF commands +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: f7-segmented + slots: + default: + - component: oh-button + config: + text: On + outline: true + action: command + actionItem: =props.item + actionCommand: ON + active: "=(items[props.item].state === 'ON') ? true : false" + style: + width: 100px + - component: oh-button + config: + text: Off + outline: true + action: command + actionItem: =props.item + actionCommand: OFF + active: "=(items[props.item].state === 'OFF') ? true : false" + style: + width: 100px +``` +::: + +### action: toggle + +![action toggle](./images/oh-button/action-toggle.png) + +`action: toggle` is used to change any item that supports two states e.g. a lamp that is either ON or OFF or blinds that are OPEN or CLOSED. +Use `actionCommand` and `actionCommandAlt` to specify the commands to switch between. + +If you need the item to change to more than two states e.g. a dimmable light, see the [previous example](#action-command) and specify a button for each of the dimming levels required e.g. 0%, 25%, 50% 75%, 100% or use [`actionOptions`](#action-options) to select the required option. + +::: details YAML + +``` yaml{37-40} +uid: oh-button-action-toggle +tags: [] +props: + parameters: + - context: item + description: Select the item to use with these buttons. + label: Item + name: item + required: true + type: TEXT + groupName: general + parameterGroups: + - name: general + label: Display options +timestamp: Feb 15, 2021, 9:55:56 PM +component: f7-card +config: + title: "oh-button > action: toggle" + footer: Set the properties to any item that accepts an ON/OFF commands +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: oh-button + config: + text: Off + outline: true + action: toggle + actionItem: =props.item + actionCommand: ON + actionCommandAlt: OFF + style: + width: 100px +``` +::: + +### action: options + +
+
+ +![action options](./images/oh-button/action-options.png) + +`action: options` provides the ability to send a command from a list of options. Options are displayed at the bottom of the screen when the button is clicked. Options are specified either in the `actionOptions` property or if this is omitted from the `Command Options` metadata specified on the item. + +::: details YAML + +``` yaml +uid: oh-button-action-options +tags: [] +props: + parameters: + - context: item + description: Select the item to use with these buttons. + label: Item + name: item + required: true + type: TEXT + groupName: general + parameterGroups: + - name: general + label: Display options +timestamp: Feb 15, 2021, 11:57:34 PM +component: f7-card +config: + title: "oh-button > action: options" + footer: Set the properties to any item that accepts percentage commands e.g. dimmable light +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: left + padding: 20px + slots: + default: + - component: f7-segmented + slots: + default: + - component: oh-button + config: + text: Dimming Level + outline: true + action: options + actionOptions: 0=Off, 25=25%, 50=50%, 75=75%, 100=Full + actionItem: =props.item + style: + width: 300px +``` +::: + +### action: rule + +`action: rule` is used with the `actionRule` property to run a rule (Administration > Settings > Rules). + +::: details YAML + +``` yaml {5,39-40} +uid: oh-button-action-rule +tags: [] +props: + parameters: + - context: rule + description: Click the button to run a rule. + label: Rule Name + name: rule + required: true + type: TEXT + groupName: general + parameterGroups: + - name: general + label: Display options +timestamp: Feb 16, 2021, 12:10:45 AM +component: f7-card +config: + title: "oh-button > action: rule" + footer: Set the properties to a rule to run. +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: left + padding: 20px + slots: + default: + - component: f7-segmented + slots: + default: + - component: oh-button + config: + text: Run automation rule + fill: true + action: rule + actionRule: =props.rule + style: + width: 300px +``` +::: + +### action: popup / action: popover / action: sheet + +The popup, popover and sheet actions provide a way to display user interface pages in specific window formats. +Typically these screens are used to display additional detail or access additional settings that have been omitted for brevity from the parent page. + +Pages should normally be specifically designed for your chosen display method. +The popover area favours organisation of widgets in columns, but the sheet window occupies the full width of the lower part of the screen and therefore a horizontal layout is preferable. + +The example code simply displays a copy of your main 'Overview' page (as all users have this page) in each window style. +As this page is rarely designed with this purpose in mind the design challenge is usually clear! + +* `action: popup` is used with the `actionModal` property to open a page as a modal popup window in the centre of the screen. +Clicking on the `Back` button or anywhere else on the screen will close the popup window. +* `action: popover` is used with the `actionModal` property to open a page as a modal popup window as a vertical rectangle to the left of the screen (over the menu area, if displayed). +* `action: sheet` is used with the `actionModal` property to open a page as a modal popup windows as a horizontal rectangle across the bottom of the screen. + +::: details YAML +``` yaml +uid: oh-button-action-popup-popover-sheet +tags: [] +timestamp: Feb 16, 2021, 1:01:08 AM +component: f7-card +config: + title: "oh-button > action: popup | action: popover | action: sheet" + footer: Set the properties to any item that accepts percentage commands e.g. dimmable light +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + justify-content: left + padding: 20px + slots: + default: + - component: oh-button + config: + text: Open PopUp + outline: true + action: popup + actionModal: page:overview + style: + width: 300px + margin-right: 10px + - component: oh-button + config: + text: Open PopOver + outline: true + action: popover + actionModal: page:overview + style: + width: 300px + margin-right: 10px + - component: oh-button + config: + text: Open Sheet + outline: true + action: sheet + actionModal: page:overview + style: + width: 300px +``` +::: + +### action: photos + +![action photos](./images/oh-button/action-photos.png) + +`action: photos` allows you to open a [Framework 7 (v5) Photo Browser object](https://v5.framework7.io/vue/photo-browser.html). +This component displays a collection of photos and video images. +Photos can be zoomed and panned. +Typical applications for this control include the display of security camera images or videos. + +`actionPhotos` accepts a YAML or JSON object that specifies the URL or HTML and captions for your images and videos. + +``` yaml + actionPhotos: + - url: http://openhabian:8080/static/photos/image1.jpg + caption: Image 1 + - url: http://openhabian:8080/static/photos/image2.jpg + - html: + caption: Garden Camera +``` + +The `actionPhotoBrowserConfig` accepts a YAML or JSON array that specifies the configuration properties for the Photo Browser object. + +``` yaml + actionPhotoBrowserConfig: + exposition: false + type: popup + theme: dark +``` + +::: details YAML + +Amend the file names / URL to your image file names before testing! +Nothing will be displayed if the image/video locations are not valid. + +``` yaml +uid: oh-button-action-photos +tags: [] +timestamp: Feb 16, 2021, 3:17:05 PM +component: f7-card +config: + title: "oh-button > action: photos" + footer: Click to open the Photo Browser dialogue +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: oh-button + config: + text: Camera 1 + outline: true + action: photos + actionItem: =props.item + actionPhotos: + - url: http://openhabian:8080/static/photos/image1.jpg + caption: Image 1 + - url: http://openhabian:8080/static/photos/image2.jpg + - html: + caption: Garden Camera + actionPhotoBrowserConfig: + exposition: false + type: popup + theme: dark +``` +::: + +### action: group + +![action-group](./images/oh-button/action-group.png) + +`action: group` opens a popup which displays the items that are members of the group specified by the `actionGroupPopupItem`. + +::: details YAML + +Change `actionGroupPopupItem` property to a value that matches a group defined in your own configuration. + +``` yaml +uid: oh-button-action-group +tags: [] +timestamp: Feb 16, 2021, 4:20:16 PM +component: f7-card +config: + title: "oh-button > action: group" + footer: Click to show the items in the Lounge +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: oh-button + config: + text: Lounge + outline: true + action: group + actionGroupPopupItem: gLounge +``` +::: + +### action: analyzer + +![action-analyzer](./images/oh-button/action-analyzer.png) + +`action: analyzer` opens a popup which displays a graph based on the values of the items listed in `actionAnalyzerItems`. +Multiple items can be specified in `actionAnalyzerItems` using the YAML list format i.e. `[item1,item2,item3]`. + +`actionAnalyzerChartType` specifies the initial period to analyze. +If no value is specified initial period is dynamic. +Periods can be adjusted after the graph is displayed, using the standard controls. + +`actionAnalyzerCoordSystem` specifies the initial coordinate system of the analyzer. +Only time is supported for dynamic periods. + +::: warning Beware NULL values +If your graph does not display any data, check that none of items added to the graph are NULL. +A single NULL item prevents all data from being displayed. +::: + +::: details YAML +Change `actionAnalyzerItems` property to a value that matches an item defined in your own configuration. + +``` yaml +uid: oh-button-action-analyzer +tags: [] +timestamp: Feb 16, 2021, 5:37:45 PM +component: f7-card +config: + title: "oh-button > action: analyzer" + footer: Click to analyze ground floor HVAC temperatures +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + flex-wrap: wrap + justify-content: space-between + align-content: space-between + padding: 20px + slots: + default: + - component: oh-button + config: + text: HVAC Ground Floor + fill: true + action: analyzer + actionAnalyzerItems: [ZWaveNode002StellaZThermostaticValve_Sensortemperature, ZWaveNode005StellaZThermostaticValve_Sensortemperature] +``` +::: + +### action: url + +![action-url](./images/oh-button/action-url.png) + +`action: url` navigates to the web page specified in the `actionUrl` property. `actionUrlSameWindow` set to `true` to open in the same window, or `false` to open in a seperate window\tab. + +::: details YAML +``` yaml +uid: oh-button-action-url +tags: [] +timestamp: Feb 16, 2021, 6:52:30 PM +component: f7-card +config: + title: "oh-button > action: url" + footer: Click to open the specified website +slots: + default: + - component: f7-block + config: + class: bog + style: + display: flex + justify-content: left + padding: 20px + slots: + default: + - component: oh-button + config: + text: OpenHAB Community + fill: true + action: url + actionUrl: https://community.openhab.org/ + actionUrlSameWindow: false + style: + width: 300px + margin-right: 10px + - component: oh-button + config: + text: Documentation (same window) + fill: true + action: url + actionUrl: https://www.openhab.org/docs/ + actionUrlSameWindow: treu + style: + width: 300px + margin-right: 10px +``` +::: + +### action: variable + + + +`action: variable` creates and/or sets the variable specified in `actionVariable` to the value specified in `actionVariableValue`. Variables are stored in the `vars` object and can be accessed by other objects using `vars.[your variable name]`. + +::: details YAML +``` yaml +TBA +``` +::: + +## Community Resources + +![UI Widget: Keypad](./images/oh-button/keypad.png) + +[UI Widget: Keypad](https://community.openhab.org/t/ui-widget-keypad/106820) - using `action: command` and `action: variable`, this widget will allow users to enter a numerical PIN code (plus * and #) and send a command with the result to a predefined item when pressing the Send button. + +![Big Ol' Grid O' Buttons](./images/oh-button/bogob.png) + +[BoGoB: Big Ol' Grid O' Buttons](https://community.openhab.org/t/bogob-big-ol-grid-o-buttons-is-this-even-possible-yes-yes-it-is/115343/7) - using the `oh-button` and `oh-repeater` objects together with YAML arrays to create large grids of buttons (emulating remote control operation). + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-calendar-axis.md b/_addons_uis/org.openhab.ui/doc/components/oh-calendar-axis.md new file mode 100644 index 000000000..caf7906a6 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-calendar-axis.md @@ -0,0 +1,109 @@ +--- +title: oh-calendar-axis - Calendar +component: oh-calendar-axis +label: Calendar +description: Reference documentation for the oh-calendar-axis component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-calendar-axis.md +prev: /docs/ui/components/ +--- + +# oh-calendar-axis - Calendar + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + + + + + +
+ +### Name Display +
+ + +
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the grid for this axis + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-calendar-series.md b/_addons_uis/org.openhab.ui/doc/components/oh-calendar-series.md new file mode 100644 index 000000000..bc90fec9d --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-calendar-series.md @@ -0,0 +1,154 @@ +--- +title: oh-calendar-series - Calendar Series +component: oh-calendar-series +label: Calendar Series +description: Reference documentation for the oh-calendar-series component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-calendar-series.md +prev: /docs/ui/components/ +--- + +# oh-calendar-series - Calendar Series + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + + + The item whose persisted data to display + + + + + The identifier of the persistence service to retrieve the data from. Leave blank to the use the default. + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Unit). + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Amount). + + + + + + + + + + + + + The type of the series.
Note: heatmap needs a configured visual map and is not supported for time series +
+ + + + +
+ + + How to reduce the data points in a same aggregation cluster to a single value. If not specified, the average function will be used. + + + + + + + + + + + + +
+
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the calendar for this series + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-category-axis.md b/_addons_uis/org.openhab.ui/doc/components/oh-category-axis.md new file mode 100644 index 000000000..5bf6f2a0b --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-category-axis.md @@ -0,0 +1,169 @@ +--- +title: oh-category-axis - Category Axis +component: oh-category-axis +label: Category Axis +description: Reference documentation for the oh-category-axis component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-category-axis.md +prev: /docs/ui/components/ +--- + +# oh-category-axis - Category Axis + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + + + Type of categories to display + + + + + + + + + + + + Format of weekdays labels + + + + + + + + + + Check to start the week on Sundays instead of Mondays + + + + + Format of months labels + + + + + + + +
+ +### Name Display +
+ + + + Location of axis name + + + + + + + + + + Gap between axis name and axis line. + + + + + Rotation of axis name + + + +
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the grid for this axis + + + + + The index of the grid for this axis + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-cell.md new file mode 100644 index 000000000..031ff421f --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-cell.md @@ -0,0 +1,303 @@ +--- +title: oh-cell - Cell +component: oh-cell +label: Cell +description: A regular or expandable cell +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-cell.md +prev: /docs/ui/components/ +--- + +# oh-cell - Cell + + + +[[toc]] + + + + +A regular or expandable cell + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ +### Trend Line +
+ + Trend Line Background Options + + + Item to show as a trend line in the background + + + + + Thickness of the trend line + + + + + Width of the trend line (leave blank to set automatically) + + + + + Colors of the trend line (see vue-trend) + + + + + Amount of minutes between each point of the trendline (default: 60). Affected by persistence strategies different from "every minute" + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-datazoom.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-datazoom.md new file mode 100644 index 000000000..0c3d81337 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-datazoom.md @@ -0,0 +1,113 @@ +--- +title: oh-chart-datazoom - Data Zoom +component: oh-chart-datazoom +label: Data Zoom +description: Reference documentation for the oh-chart-datazoom component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-datazoom.md +prev: /docs/ui/components/ +--- + +# oh-chart-datazoom - Data Zoom + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Type: slider (default) or inside (allows to zoom with the mousewheel or a pinch gesture) + + + + + + + + + Whether to show or not this component + + + + + + + + + +
+ +### Position +
+ + Applicable only to slider types + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-grid.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-grid.md new file mode 100644 index 000000000..eef15e935 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-grid.md @@ -0,0 +1,112 @@ +--- +title: oh-chart-grid - Cartesian Grid +component: oh-chart-grid +label: Cartesian Grid +description: Reference documentation for the oh-chart-grid component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-grid.md +prev: /docs/ui/components/ +--- + +# oh-chart-grid - Cartesian Grid + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + + + Whether the grid region contains the axis tick labels + + + +
+ +### Position +
+ + Each parameter accepts pixel values or percentages. Additionally, top accepts "top", "middle" and "bottom" to align the component vertically, and left accepts "left", "center" and "right" to align the component horizontally + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-legend.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-legend.md new file mode 100644 index 000000000..c8ee070b6 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-legend.md @@ -0,0 +1,116 @@ +--- +title: oh-chart-legend - Legend +component: oh-chart-legend +label: Legend +description: Reference documentation for the oh-chart-legend component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-legend.md +prev: /docs/ui/components/ +--- + +# oh-chart-legend - Legend + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Whether to show or not this component + + + + + + + + + +
+ +### Position +
+ + Each parameter accepts pixel values or percentages. Additionally, top accepts "top", "middle" and "bottom" to align the component vertically, and left accepts "left", "center" and "right" to align the component horizontally + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-page.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-page.md new file mode 100644 index 000000000..6a9e3f833 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-page.md @@ -0,0 +1,120 @@ +--- +title: oh-chart-page - Chart Page +component: oh-chart-page +label: Chart Page +description: Visualize historical series +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-page.md +prev: /docs/ui/components/ +--- + +# oh-chart-page - Chart Page + + + +[[toc]] + + + + +Visualize historical series + + +## Configuration + + + +### General +
+ + + + Define a fixed period for the chart, aligned at the beginning of the period, e.g. January 1st at midnight for a year chart. If not set (or set to dynamic), the length of the period will be configurable but certain combinations like aggregated series might not work + + + + + + + + + + + + + The initial period for the chart + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-title.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-title.md new file mode 100644 index 000000000..e2014f015 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-title.md @@ -0,0 +1,114 @@ +--- +title: oh-chart-title - Title +component: oh-chart-title +label: Title +description: Reference documentation for the oh-chart-title component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-title.md +prev: /docs/ui/components/ +--- + +# oh-chart-title - Title + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Whether to show or not this component + + + + + + + +
+ +### Position +
+ + Each parameter accepts pixel values or percentages. Additionally, top accepts "top", "middle" and "bottom" to align the component vertically, and left accepts "left", "center" and "right" to align the component horizontally + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-toolbox.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-toolbox.md new file mode 100644 index 000000000..9cc9f0a0a --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-toolbox.md @@ -0,0 +1,119 @@ +--- +title: oh-chart-toolbox - Toolbox +component: oh-chart-toolbox +label: Toolbox +description: Reference documentation for the oh-chart-toolbox component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-toolbox.md +prev: /docs/ui/components/ +--- + +# oh-chart-toolbox - Toolbox + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Whether to show or not this component + + + + + + + + + + + + +
+ +### Position +
+ + Each parameter accepts pixel values or percentages. Additionally, top accepts "top", "middle" and "bottom" to align the component vertically, and left accepts "left", "center" and "right" to align the component horizontally + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-tooltip.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-tooltip.md new file mode 100644 index 000000000..b7ec0e5b7 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-tooltip.md @@ -0,0 +1,102 @@ +--- +title: oh-chart-tooltip - Tooltip +component: oh-chart-tooltip +label: Tooltip +description: Reference documentation for the oh-chart-tooltip component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-tooltip.md +prev: /docs/ui/components/ +--- + +# oh-chart-tooltip - Tooltip + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Whether to show or not this component + + + + + + + + + + + Keep the tooltip within the chart bounds + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart-visualmap.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart-visualmap.md new file mode 100644 index 000000000..9e37eb665 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart-visualmap.md @@ -0,0 +1,168 @@ +--- +title: oh-chart-visualmap - Visual Map +component: oh-chart-visualmap +label: Visual Map +description: Reference documentation for the oh-chart-visualmap component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart-visualmap.md +prev: /docs/ui/components/ +--- + +# oh-chart-visualmap - Visual Map + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + Whether to show or not this component + + + +
+ +### Boundaries +
+ + Values considered in range for this visual map (by default [0, 200])
These cannot be determined from the series and have to be defined manually! + + + Minimum boundary + + + + + Maximum boundary + + +
+
+ +### Appearance +
+ + + + Type of visual map - continuous or piecewise + + + + + + + + + + + + + + + Show handles to filter data in continuous mode + + + + + Number of pieces in piecewise mode + + + + + Choose from a selection of preset color palettes for the values in range. The default is a yellow (low) to red (high) gradient + + + + + + + + +
+ +### Position +
+ + Each parameter accepts pixel values or percentages. Additionally, top accepts "top", "middle" and "bottom" to align the component vertically, and left accepts "left", "center" and "right" to align the component horizontally + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-chart.md b/_addons_uis/org.openhab.ui/doc/components/oh-chart.md new file mode 100644 index 000000000..c8bc859f3 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-chart.md @@ -0,0 +1,120 @@ +--- +title: oh-chart - Chart +component: oh-chart +label: Chart +description: Visualize series of data +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-chart.md +prev: /docs/ui/components/ +--- + +# oh-chart - Chart + + + +[[toc]] + + + + +Visualize series of data + + +## Configuration + + + +### General +
+ + + + Define a fixed period for the chart, aligned at the beginning of the period, e.g. January 1st at midnight for a year chart. If not set (or set to dynamic), the length of the period will be configurable but certain combinations like aggregated series might not work + + + + + + + + + + + + + The initial period for the chart + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-clock-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-clock-card.md new file mode 100644 index 000000000..be9513990 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-clock-card.md @@ -0,0 +1,326 @@ +--- +title: oh-clock-card - Digital Clock Card +component: oh-clock-card +label: Digital Clock Card +description: Display a digital clock in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-clock-card.md +prev: /docs/ui/components/ +--- + +# oh-clock-card - Digital Clock Card + + + +[[toc]] + + + + +Display a digital clock in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Clock +
+ + + + Time format, see dayjs docs + + + + + + + + + + Background style (in CSS "background" attribute format) + + + + + Time font size (e.g. "34px") + + + + + Time font weight (e.g. "normal" or "bold") + + + + + Show the current date in addition to the time + + + + + Date format, see dayjs docs + + + + + + + + + + Where to show the date + + + + + + + + + Date font size (e.g. "34px") + + + + + Date font weight (e.g. "normal" or "bold") + + + +
+ +### Action +
+ + Action to perform when the clock is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-card.md new file mode 100644 index 000000000..670599caa --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-card.md @@ -0,0 +1,141 @@ +--- +title: oh-colorpicker-card - Color Picker Card +component: oh-colorpicker-card +label: Color Picker Card +description: Display a color picker in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-colorpicker-card.md +prev: /docs/ui/components/ +--- + +# oh-colorpicker-card - Color Picker Card + + + +[[toc]] + + + + +Display a color picker in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Color picker +
+ + + + Item to control + + + + + Modules to display + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-cell.md new file mode 100644 index 000000000..137fd4dd5 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-cell.md @@ -0,0 +1,300 @@ +--- +title: oh-colorpicker-cell - Colorpicker Cell +component: oh-colorpicker-cell +label: Colorpicker Cell +description: A cell expanding to a color picker +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-colorpicker-cell.md +prev: /docs/ui/components/ +--- + +# oh-colorpicker-cell - Colorpicker Cell + + + +[[toc]] + + + + +A cell expanding to a color picker + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Color Picker +
+ + + + Item to control + + + + + Modules to display + + + + + + + + + + + + + + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-item.md new file mode 100644 index 000000000..bea393146 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker-item.md @@ -0,0 +1,146 @@ +--- +title: oh-colorpicker-item - Color Picker List Item +component: oh-colorpicker-item +label: Color Picker List Item +description: Display a color picker in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-colorpicker-item.md +prev: /docs/ui/components/ +--- + +# oh-colorpicker-item - Color Picker List Item + + + +[[toc]] + + + + +Display a color picker in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Color picker +
+ + + + Item to control + + + + + Modules to display + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker.md b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker.md new file mode 100644 index 000000000..7da356349 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-colorpicker.md @@ -0,0 +1,109 @@ +--- +title: oh-colorpicker - Colorpicker +component: oh-colorpicker +label: Colorpicker +description: Control to pick a color +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-colorpicker.md +prev: /docs/ui/components/ +--- + +# oh-colorpicker - Colorpicker + + + +[[toc]] + + + + +Control to pick a color + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Modules to display + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-data-series.md b/_addons_uis/org.openhab.ui/doc/components/oh-data-series.md new file mode 100644 index 000000000..d9bff2d08 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-data-series.md @@ -0,0 +1,95 @@ +--- +title: oh-data-series - Data Series +component: oh-data-series +label: Data Series +description: Reference documentation for the oh-data-series component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-data-series.md +prev: /docs/ui/components/ +--- + +# oh-data-series - Data Series + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + The type of the series.
Note: heatmap needs a configured visual map and is not supported for time series +
+ + + + +
+
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-equipment-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-equipment-card.md new file mode 100644 index 000000000..3063ba2cb --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-equipment-card.md @@ -0,0 +1,128 @@ +--- +title: oh-equipment-card - Equipment Class Card +component: oh-equipment-card +label: Equipment Class Card +description: A card showing model items belonging to a certain equipment class +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-equipment-card.md +prev: /docs/ui/components/ +--- + +# oh-equipment-card - Equipment Class Card + + + +[[toc]] + + + + +A card showing model items belonging to a certain equipment class + + +## Configuration + + + +### Model Card +
+ + General settings for this card + + + Title of the card + + + + + Subtitle of the card + + + + + Color of the card's background; if unset, choose automatically from built-in defaults for certain semantic classes + + + + + + + + + + + + + + + + + + + + + URL of an image to display in the background + + + + + Display the text in black (for light backgrounds) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-gauge-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-gauge-card.md new file mode 100644 index 000000000..d1531a643 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-gauge-card.md @@ -0,0 +1,213 @@ +--- +title: oh-gauge-card - Gauge Card +component: oh-gauge-card +label: Gauge Card +description: Display a read-only gauge in a card to visualize a quantifiable item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-gauge-card.md +prev: /docs/ui/components/ +--- + +# oh-gauge-card - Gauge Card + + + +[[toc]] + + + + +Display a read-only gauge in a card to visualize a quantifiable item + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Gauge +
+ + Parameters are passed to the underlying Gauge control + + + Item to control + + + + + Minimum value (default 0) + + + + + Maximum value (default 100) + + + + + Type of the gauge + + + + + + + + + Value, if the item is not set - between min & max (for instance, defined with an expression) + + + + + Visual size of the control in px (default 200) + + + + + Gauge background color. Can be any valid color string, e.g. #ff00ff, rgb(0,0,255), etc. + + + + + Main border/stroke background color + + + + + Main border/stroke color + + + + + Main border/stroke width + + + + + Value text, if the item is not set (for instance, defined with an expression) + + + + + Value text color + + + + + Value text font size + + + + + Value text font weight + + + + + Label text, displayed below the value (optional) + + + + + Label text color + + + + + Label text font size + + + + + Label text font weight + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-gauge.md b/_addons_uis/org.openhab.ui/doc/components/oh-gauge.md new file mode 100644 index 000000000..ef0f33444 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-gauge.md @@ -0,0 +1,180 @@ +--- +title: oh-gauge - Gauge +component: oh-gauge +label: Gauge +description: Circular or semi-circular read-only gauge +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-gauge.md +prev: /docs/ui/components/ +--- + +# oh-gauge - Gauge + + + +[[toc]] + + + + +Circular or semi-circular read-only gauge + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Minimum value (default 0) + + + + + Maximum value (default 100) + + + + + Type of the gauge + + + + + + + + + Value, if the item is not set - between min & max (for instance, defined with an expression) + + + + + Visual size of the control in px (default 200) + + + + + Gauge background color. Can be any valid color string, e.g. #ff00ff, rgb(0,0,255), etc. + + + + + Main border/stroke background color + + + + + Main border/stroke color + + + + + Main border/stroke width + + + + + Value text, if the item is not set (for instance, defined with an expression) + + + + + Value text color + + + + + Value text font size + + + + + Value text font weight + + + + + Label text, displayed below the value (optional) + + + + + Label text color + + + + + Label text font size + + + + + Label text font weight + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-grid-col.md b/_addons_uis/org.openhab.ui/doc/components/oh-grid-col.md new file mode 100644 index 000000000..497f0e074 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-grid-col.md @@ -0,0 +1,260 @@ +--- +title: oh-grid-col - Layout Grid Column +component: oh-grid-col +label: Layout Grid Column +description: A column in a grid layout +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-grid-col.md +prev: /docs/ui/components/ +--- + +# oh-grid-col - Layout Grid Column + + + +[[toc]] + + + + +A column in a grid layout + + +## Configuration + + + +### General +
+ + + + Standard Width + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Column width when app width >= 480px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Column width when app width >= 568px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Column width when app width >= 720px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Column width when app width >= 1024px + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Column width when app width >= 1200px + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-grid-layout.md b/_addons_uis/org.openhab.ui/doc/components/oh-grid-layout.md new file mode 100644 index 000000000..58892f337 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-grid-layout.md @@ -0,0 +1,143 @@ +--- +title: oh-grid-layout - Fixed Grid Layout +component: oh-grid-layout +label: Fixed Grid Layout +description: Arranges widgets on a grid of squares with user-defined sizes +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-grid-layout.md +prev: /docs/ui/components/ +--- + +# oh-grid-layout - Fixed Grid Layout + + + +[[toc]] + + + + +Arranges widgets on a grid of squares with user-defined sizes + + +## Configuration + + + +### Layout Settings +
+ + + + Number of columns across the page (default 16, limited to a minimum widget width of 50px) + + + + + Margin between items and to screen (default 10) + + + + + Automatically align items from top to bottom (default false) + + + +
+ +### Screen Settings +
+ + + + Screen width in pixels (default 1280) + + + + + Screen height in pixels (default 720) + + + + + Scale content to other screen widths (can lead to unexpected styling issues) (default false) + + + +
+ +### Appearance +
+ + + + Hide navigation bar on top when page is displayed (You can additionally hide the sidebar using its pin icon) (default false) + + + + + Don't show a menu icon in the top left corner when the sidebar is closed (default false) + + + + + Show a fullscreen icon on the top right corner (default false) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-grid-row.md b/_addons_uis/org.openhab.ui/doc/components/oh-grid-row.md new file mode 100644 index 000000000..8bdc1a8a8 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-grid-row.md @@ -0,0 +1,80 @@ +--- +title: oh-grid-row - Layout Grid Row +component: oh-grid-row +label: Layout Grid Row +description: A row in a grid layout +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-grid-row.md +prev: /docs/ui/components/ +--- + +# oh-grid-row - Layout Grid Row + + + +[[toc]] + + + + +A row in a grid layout + + +## Configuration + + + + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-icon.md b/_addons_uis/org.openhab.ui/doc/components/oh-icon.md new file mode 100644 index 000000000..71ff39d89 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-icon.md @@ -0,0 +1,282 @@ +--- +title: oh-icon - Icon +component: oh-icon +label: Icon +description: Display an openHAB icon +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-icon.md +prev: /docs/ui/components/ +--- + +# oh-icon - Icon + + + +[[toc]] + + + + +Display an openHAB icon + + +## Configuration + + + +### General +
+ + + + openHAB icon + + + + + + + Type of data that might be entered: see MDN docs + + + + + Placeholder text + + + + + Display input clear button + + + + + Makes input outline + + + + + Display an error message if left empty + + + + + Link the input value to the state of this item + + + + + Value when not found in item state or variable + + + + + Name of the variable to set when the input changes + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-image-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-image-card.md new file mode 100644 index 000000000..908e87779 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-image-card.md @@ -0,0 +1,292 @@ +--- +title: oh-image-card - Image Card +component: oh-image-card +label: Image Card +description: Display an image (URL or Image item ) in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-image-card.md +prev: /docs/ui/components/ +--- + +# oh-image-card - Image Card + + + +[[toc]] + + + + +Display an image (URL or Image item ) in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Image +
+ + + + Image item to show - preferred if the image changes + + + + + URL to show (if item if not specified) + + + + + Load the image only when in view + + + + + Transition the image with a fade-in effect after it has loaded + + + + + Refresh interval in milliseconds + + + +
+ +### Action +
+ + Action to perform when the image is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-image.md b/_addons_uis/org.openhab.ui/doc/components/oh-image.md new file mode 100644 index 000000000..cea05bbe8 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-image.md @@ -0,0 +1,260 @@ +--- +title: oh-image - Image +component: oh-image +label: Image +description: Displays an image from a URL or an item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-image.md +prev: /docs/ui/components/ +--- + +# oh-image - Image + + + +[[toc]] + + + + +Displays an image from a URL or an item + + +## Configuration + + + +### General +
+ + + + Image item to show - preferred if the image changes + + + + + URL to show (if item if not specified) + + + + + Load the image only when in view + + + + + Transition the image with a fade-in effect after it has loaded + + + + + Refresh interval in milliseconds + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-input-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-input-card.md new file mode 100644 index 000000000..d358cfe01 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-input-card.md @@ -0,0 +1,183 @@ +--- +title: oh-input-card - Input Card +component: oh-input-card +label: Input Card +description: Display an input in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-input-card.md +prev: /docs/ui/components/ +--- + +# oh-input-card - Input Card + + + +[[toc]] + + + + +Display an input in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Input +
+ + + + Input name + + + + + Type of input (see f7 input docs) + + + + + Type of data that might be entered (see MDN docs) + + + + + Placeholder text + + + + + Display Send button to update the state with a command (needs a configured item) + + + + + Display input clear button when applicable + + + + + Makes input outline + + + + + Display an error message if left empty + + + + + When enabled, input value will be validated based on input type + + + + + Only validate when focus moves away from input field + + + + + Link the input value to the state of this item + + + + + Default value when not found in item state or variable + + + + + Name of the variable to set when the input changes + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-input-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-input-item.md new file mode 100644 index 000000000..a1dd04be0 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-input-item.md @@ -0,0 +1,188 @@ +--- +title: oh-input-item - Input List Item +component: oh-input-item +label: Input List Item +description: Display an input field in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-input-item.md +prev: /docs/ui/components/ +--- + +# oh-input-item - Input List Item + + + +[[toc]] + + + + +Display an input field in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Input +
+ + + + Input name + + + + + Type of input (see f7 input docs) + + + + + Type of data that might be entered (see MDN docs) + + + + + Placeholder text + + + + + Display Send button to update the state with a command (needs a configured item) + + + + + Display input clear button when applicable + + + + + Makes input outline + + + + + Display an error message if left empty + + + + + When enabled, input value will be validated based on input type + + + + + Only validate when focus moves away from input field + + + + + Link the input value to the state of this item + + + + + Default value when not found in item state or variable + + + + + Name of the variable to set when the input changes + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-input.md b/_addons_uis/org.openhab.ui/doc/components/oh-input.md new file mode 100644 index 000000000..eaaad4a55 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-input.md @@ -0,0 +1,151 @@ +--- +title: oh-input - Input +component: oh-input +label: Input +description: Displays an input field, used to set a variable +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-input.md +prev: /docs/ui/components/ +--- + +# oh-input - Input + + + +[[toc]] + + + + +Displays an input field, used to set a variable + + +## Configuration + + + +### General +
+ + + + Input name + + + + + Type of input (see f7 input docs) + + + + + Type of data that might be entered (see MDN docs) + + + + + Placeholder text + + + + + Display Send button to update the state with a command (needs a configured item) + + + + + Display input clear button when applicable + + + + + Makes input outline + + + + + Display an error message if left empty + + + + + When enabled, input value will be validated based on input type + + + + + Only validate when focus moves away from input field + + + + + Link the input value to the state of this item + + + + + Default value when not found in item state or variable + + + + + Name of the variable to set when the input changes + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-knob-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-knob-card.md new file mode 100644 index 000000000..310ac886f --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-knob-card.md @@ -0,0 +1,174 @@ +--- +title: oh-knob-card - Knob Card +component: oh-knob-card +label: Knob Card +description: Display a knob in a card to visualize and control a quantifiable item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-knob-card.md +prev: /docs/ui/components/ +--- + +# oh-knob-card - Knob Card + + + +[[toc]] + + + + +Display a knob in a card to visualize and control a quantifiable item + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Knob +
+ + Parameters are passed to the underlying Knob control + + + Item to control + + + + + Minimum value (default 0) + + + + + Maximum value (default 100) + + + + + Minimum interval between values (default 1) + + + + + Disable the slider (usually set via an expression since the value will not be displayed when disabled) + + + + + Visual size of the control in px (or % if responsive is true) + + + + + Color of the value arc (HTML value, default #409eff) + + + + + Color of the rest of the control (HTML value, default #dcdfe6) + + + + + Color of the value text (HTML value, default #000000) + + + + + Thickness of the arcs, default 17 + + + + + Size the control using percentages instead of pixels + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-knob-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-knob-cell.md new file mode 100644 index 000000000..423f3b8db --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-knob-cell.md @@ -0,0 +1,332 @@ +--- +title: oh-knob-cell - Knob Cell +component: oh-knob-cell +label: Knob Cell +description: A cell expanding to a knob control +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-knob-cell.md +prev: /docs/ui/components/ +--- + +# oh-knob-cell - Knob Cell + + + +[[toc]] + + + + +A cell expanding to a knob control + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Knob +
+ + + + Item to control + + + + + Minimum value (default 0) + + + + + Maximum value (default 100) + + + + + Minimum interval between values (default 1) + + + + + Disable the slider (usually set via an expression since the value will not be displayed when disabled) + + + + + Visual size of the control in px (or % if responsive is true) + + + + + Color of the value arc (HTML value, default #409eff) + + + + + Color of the rest of the control (HTML value, default #dcdfe6) + + + + + Color of the value text (HTML value, default #000000) + + + + + Thickness of the arcs, default 17 + + + + + Size the control using percentages instead of pixels + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-knob.md b/_addons_uis/org.openhab.ui/doc/components/oh-knob.md new file mode 100644 index 000000000..b6992fae2 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-knob.md @@ -0,0 +1,146 @@ +--- +title: oh-knob - Knob +component: oh-knob +label: Knob +description: Knob control, allow to change a number value on a circular track +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-knob.md +prev: /docs/ui/components/ +--- + +# oh-knob - Knob + + + +[[toc]] + + + + +Knob control, allow to change a number value on a circular track + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Minimum value (default 0) + + + + + Maximum value (default 100) + + + + + Minimum interval between values (default 1) + + + + + Disable the slider (usually set via an expression since the value will not be displayed when disabled) + + + + + Visual size of the control in px (or % if responsive is true) + + + + + Color of the value arc (HTML value, default #409eff) + + + + + Color of the rest of the control (HTML value, default #dcdfe6) + + + + + Color of the value text (HTML value, default #000000) + + + + + Thickness of the arcs, default 17 + + + + + Size the control using percentages instead of pixels + + + + + Name of the variable to set on input change + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-label-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-label-card.md new file mode 100644 index 000000000..2cce314c1 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-label-card.md @@ -0,0 +1,345 @@ +--- +title: oh-label-card - Label Card +component: oh-label-card +label: Label Card +description: Display the state of an item in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-label-card.md +prev: /docs/ui/components/ +--- + +# oh-label-card - Label Card + + + +[[toc]] + + + + +Display the state of an item in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ +### Label +
+ + Parameters of the label + + + Item to display + + + + + Display this text (or expression result) instead of the item's state + + + + + Background style (in CSS "background" attribute format) + + + + + Font size (e.g. "34px") + + + + + Font weight (e.g. "normal" or "bold") + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Size of the icon in px + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + + + Display label below icon + + + +
+ +### Trend Line +
+ + Show a trend line in the background + + + Item to show as a trend line in the background + + + + + Thickness of the trend line + + + + + Width of the trend line (leave blank to set automatically) + + + + + Colors of the trend line (see vue-trend) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-label-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-label-cell.md new file mode 100644 index 000000000..c63bd81ad --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-label-cell.md @@ -0,0 +1,314 @@ +--- +title: oh-label-cell - Label Cell +component: oh-label-cell +label: Label Cell +description: A cell with a big label to show a short item state value +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-label-cell.md +prev: /docs/ui/components/ +--- + +# oh-label-cell - Label Cell + + + +[[toc]] + + + + +A cell with a big label to show a short item state value + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Label +
+ + + + Item to display + + + + + Display this text (or expression result) instead of the item's state + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ +### Trend Line +
+ + Trend Line Background Options + + + Item to show as a trend line in the background + + + + + Thickness of the trend line + + + + + Width of the trend line (leave blank to set automatically) + + + + + Colors of the trend line (see vue-trend) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-label-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-label-item.md new file mode 100644 index 000000000..33f143f67 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-label-item.md @@ -0,0 +1,277 @@ +--- +title: oh-label-item - Label List Item +component: oh-label-item +label: Label List Item +description: Display the state of an item in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-label-item.md +prev: /docs/ui/components/ +--- + +# oh-label-item - Label List Item + + + +[[toc]] + + + + +Display the state of an item in a list + + +## Configuration + + + +### General +
+ + + + Item to display + + + +
+ +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-link.md b/_addons_uis/org.openhab.ui/doc/components/oh-link.md new file mode 100644 index 000000000..d1f45299d --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-link.md @@ -0,0 +1,285 @@ +--- +title: oh-link - Link +component: oh-link +label: Link +description: Link performing an action +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-link.md +prev: /docs/ui/components/ +--- + +# oh-link - Link + + + +[[toc]] + + + + +Link performing an action + + +## Configuration + + + +### General +
+ + + + Link label + + + + + Framework7 icon to display (Framework7 icon) + + + + + Material design icon to display + + + + + Color of the icon + + + + + Size of the icon in px + + + + + Text to display in a badge on the opposite side of the item (set either this or "after") + + + + + Color of the badge + + + + + Button tooltip text to show on button hover/press + + + + + Name of the variable to set on input change + + + + + Name of the variable to clear after performing the action + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-list-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-list-card.md new file mode 100644 index 000000000..a199c418b --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-list-card.md @@ -0,0 +1,133 @@ +--- +title: oh-list-card - List Card +component: oh-list-card +label: List Card +description: Display a list in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-list-card.md +prev: /docs/ui/components/ +--- + +# oh-list-card - List Card + + + +[[toc]] + + + + +Display a list in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### List +
+ + + + Use for simple lists + + + + + Use for list with rich list items with icons + + + + + Use for lists with accordion (collapsible) items + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-list-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-list-item.md new file mode 100644 index 000000000..a6cdf040c --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-list-item.md @@ -0,0 +1,298 @@ +--- +title: oh-list-item - List Item +component: oh-list-item +label: List Item +description: A list item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-list-item.md +prev: /docs/ui/components/ +--- + +# oh-list-item - List Item + + + +[[toc]] + + + + +A list item + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ +### Badge +
+ + + + Text to display in a badge on the opposite side of the item (set either this or "after") + + + + + Color of the badge + + + +
+ +### List Button Settings +
+ + + + This item will be styled as a list button (clickable link). All other options except title and color will be ignored. + + + + + Color (for list buttons) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-list.md b/_addons_uis/org.openhab.ui/doc/components/oh-list.md new file mode 100644 index 000000000..4b2baa478 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-list.md @@ -0,0 +1,101 @@ +--- +title: oh-list - List +component: oh-list +label: List +description: List control, hosts list items +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-list.md +prev: /docs/ui/components/ +--- + +# oh-list - List + + + +[[toc]] + + + + +List control, hosts list items + + +## Configuration + + + +### General +
+ + + + Use for simple lists + + + + + Use for list with rich list items with icons + + + + + Use for lists with accordion (collapsible) items + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-location-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-location-card.md new file mode 100644 index 000000000..9e8ad2ae6 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-location-card.md @@ -0,0 +1,160 @@ +--- +title: oh-location-card - Location Card +component: oh-location-card +label: Location Card +description: A card showing model items in a certain location +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-location-card.md +prev: /docs/ui/components/ +--- + +# oh-location-card - Location Card + + + +[[toc]] + + + + +A card showing model items in a certain location + + +## Configuration + + + +### Model Card +
+ + General settings for this card + + + Title of the card + + + + + Subtitle of the card + + + + + Color of the card's background; if unset, choose automatically from built-in defaults for certain semantic classes + + + + + + + + + + + + + + + + + + + + + URL of an image to display in the background + + + + + Display the text in black (for light backgrounds) + + + +
+ +### Card at-a-glance badges +
+ + + + Do not examine items to display badges - can help with performance if you don't need them. + + + + + Select the badges you wish to show in the header of the card. Display all if none are selected. + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-map-circle-marker.md b/_addons_uis/org.openhab.ui/doc/components/oh-map-circle-marker.md new file mode 100644 index 000000000..cb852fcaa --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-map-circle-marker.md @@ -0,0 +1,279 @@ +--- +title: oh-map-circle-marker - Circle Marker +component: oh-map-circle-marker +label: Circle Marker +description: A circle on a map, to represent a radius +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-map-circle-marker.md +prev: /docs/ui/components/ +--- + +# oh-map-circle-marker - Circle Marker + + + +[[toc]] + + + + +A circle on a map, to represent a radius + + +## Configuration + + + +### Marker +
+ + General marker settings + + + The label on the marker + + + + + The color of the circle (e.g. "blue", "red", "yellow"...) + + + +
+ +### Center Position +
+ + + + The Location item this marker will be centered on + + + + + The fixed position of the marker if no item is configured or its coordinates are invalid + + + +
+ +### Radius +
+ + Radius of the circle + + + The item whose state holds the radius of the circle, in meters + + + + + The fixed radius of the circle in meters if no item is configured or its state is invalid + + + +
+ +### Action +
+ + Action to perform when the circle is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-map-marker.md b/_addons_uis/org.openhab.ui/doc/components/oh-map-marker.md new file mode 100644 index 000000000..a87cf1d21 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-map-marker.md @@ -0,0 +1,263 @@ +--- +title: oh-map-marker - Map Marker +component: oh-map-marker +label: Map Marker +description: An icon on a map +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-map-marker.md +prev: /docs/ui/components/ +--- + +# oh-map-marker - Map Marker + + + +[[toc]] + + + + +An icon on a map + + +## Configuration + + + +### Marker +
+ + General marker settings + + + The label on the marker + + + + + Use oh:iconName (openHAB icon) + + + +
+ +### Position +
+ + Position + + + The Location item this marker will be centered on + + + + + The fixed position of the marker if no item is configured or its coordinates are invalid + + + +
+ +### Action +
+ + Action to perform when the marker is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-map-page.md b/_addons_uis/org.openhab.ui/doc/components/oh-map-page.md new file mode 100644 index 000000000..bc5abc81e --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-map-page.md @@ -0,0 +1,118 @@ +--- +title: oh-map-page - Map page +component: oh-map-page +label: Map page +description: Displays markers on a map +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-map-page.md +prev: /docs/ui/components/ +--- + +# oh-map-page - Map page + + + +[[toc]] + + + + +Displays markers on a map + + +## Configuration + + + +### General +
+ + + + The center to use when no markers are present or have valid positions + + + + + The zoom level to use when no markers are present or have valid positions + + + + + Disable the ability to zoom and drag + + + + + Change zoom levels without animation, can also avoid graphic glitches with persistent tooltips + + + + + + + The provider of tiles to use for the background of the map. Use one from Leaflet Providers, Some providers will not work until you set options, like access tokens, in the tileLayerProviderOptions parameter (in Code view). See here for more info. The default is CartoDB, the variant depending on the dark mode setting. + + + + + The provider of tiles to use for the overlay layer above the background of the map. Use one from Leaflet Providers, Some providers will not work until you set options, like access tokens, in the overlayTileLayerProviderOptions parameter (in Code view). See here for more info. + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-masonry.md b/_addons_uis/org.openhab.ui/doc/components/oh-masonry.md new file mode 100644 index 000000000..4db66bd65 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-masonry.md @@ -0,0 +1,95 @@ +--- +title: oh-masonry - Masonry Layout +component: oh-masonry +label: Masonry Layout +description: Arranges widgets automatically depending on the screen size +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-masonry.md +prev: /docs/ui/components/ +--- + +# oh-masonry - Masonry Layout + + + +[[toc]] + + + + +Arranges widgets automatically depending on the screen size + + +## Configuration + + + +### General +
+ + + + Choose the implementation of the masonry layout + + + + + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-plan-marker.md b/_addons_uis/org.openhab.ui/doc/components/oh-plan-marker.md new file mode 100644 index 000000000..9bde44ac9 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-plan-marker.md @@ -0,0 +1,322 @@ +--- +title: oh-plan-marker - Floor Plan Marker +component: oh-plan-marker +label: Floor Plan Marker +description: A marker on a floor plan +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-plan-marker.md +prev: /docs/ui/components/ +--- + +# oh-plan-marker - Floor Plan Marker + + + +[[toc]] + + + + +A marker on a floor plan + + +## Configuration + + + +### Marker Settings +
+ + + + The name of the marker (for identification) + + + + + The coordinates of this marker in the floor plan Coordinate Reference System; usually set by dragging the marker at design time + + + + + The item whose state to display on this marker + + + +
+ +### Icon +
+ + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + + + Size of the icon in pixels (40 by default) + + + + + Color of the icon (for Framework7/Material icons); use expression for dynamic colors + + + +
+ +### Tooltip +
+ + You can customize the styles further with CSS attributes in the tooltipStyle parameter (in YAML only) + + + The tooltip text - leave blank to display the state of the item + + + + + + + Put the tooltip text directly over the plan instead of displaying an icon + + + + + Font size of the tooltip text + + + + + Color of the tooltip + + + +
+ +### Zoom Visibility +
+ + Hide this marker outside certain zoom labels + + + Visible only when zoomed to above this level (no limit if empty) + + + + + Visible only when zoomed to below this level (no limit if empty) + + + +
+ +### Action +
+ + Action to perform when the marker is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-plan-page.md b/_addons_uis/org.openhab.ui/doc/components/oh-plan-page.md new file mode 100644 index 000000000..db07857ea --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-plan-page.md @@ -0,0 +1,129 @@ +--- +title: oh-plan-page - Floor plan +component: oh-plan-page +label: Floor plan +description: Displays markers on an image overlay +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-plan-page.md +prev: /docs/ui/components/ +--- + +# oh-plan-page - Floor plan + + + +[[toc]] + + + + +Displays markers on an image overlay + + +## Configuration + + + +### General +
+ + + + The URL of the image to display as background + + + + + The width of the image (by default 1000 pixels). Please specify if the image is not square to compute the aspect ratio + + + + + The height of the image (by default 1000 pixels). Please specify if the image is not square to compute the aspect ratio + + + + + Disable the ability to zoom and drag + + + + + Change zoom levels without animation, can also avoid graphic glitches with persistent tooltips + + + + + + + Color outside the bounds of the image. "Black or White" means it will be black in dark mode and white in light mode + + + + + + + + + + + Apply an invert filter to the image in dark mode - use with images in black & white or grayscale for best results + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-player-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-player-card.md new file mode 100644 index 000000000..ac2621bf7 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-player-card.md @@ -0,0 +1,144 @@ +--- +title: oh-player-card - Player Card +component: oh-player-card +label: Player Card +description: Display player controls in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-player-card.md +prev: /docs/ui/components/ +--- + +# oh-player-card - Player Card + + + +[[toc]] + + + + +Display player controls in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Player Controls +
+ + + + Player item to control + + + + + Show Rewind and Fast Forward buttons + + + +
+ +### Currently playing track information +
+ + + + Item holding the artist name + + + + + Item holding the track name + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-player-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-player-item.md new file mode 100644 index 000000000..015c7c629 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-player-item.md @@ -0,0 +1,149 @@ +--- +title: oh-player-item - Player List Item +component: oh-player-item +label: Player List Item +description: Display player controls in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-player-item.md +prev: /docs/ui/components/ +--- + +# oh-player-item - Player List Item + + + +[[toc]] + + + + +Display player controls in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Player Controls +
+ + + + Player item to control + + + + + Show Rewind and Fast Forward buttons + + + +
+ +### Currently playing track information +
+ + + + Item holding the artist name + + + + + Item holding the track name + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-player.md b/_addons_uis/org.openhab.ui/doc/components/oh-player.md new file mode 100644 index 000000000..f6993bc02 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-player.md @@ -0,0 +1,96 @@ +--- +title: oh-player - Media player +component: oh-player +label: Media player +description: Media player controls, with previous track/pause/play/next buttons +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-player.md +prev: /docs/ui/components/ +--- + +# oh-player - Media player + + + +[[toc]] + + + + +Media player controls, with previous track/pause/play/next buttons + + +## Configuration + + + +### General +
+ + + + Player item to control + + + + + Show Rewind and Fast Forward buttons + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-property-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-property-card.md new file mode 100644 index 000000000..c9793b9c6 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-property-card.md @@ -0,0 +1,128 @@ +--- +title: oh-property-card - Property Card +component: oh-property-card +label: Property Card +description: A card showing model items related to a certain property +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-property-card.md +prev: /docs/ui/components/ +--- + +# oh-property-card - Property Card + + + +[[toc]] + + + + +A card showing model items related to a certain property + + +## Configuration + + + +### Model Card +
+ + General settings for this card + + + Title of the card + + + + + Subtitle of the card + + + + + Color of the card's background; if unset, choose automatically from built-in defaults for certain semantic classes + + + + + + + + + + + + + + + + + + + + + URL of an image to display in the background + + + + + Display the text in black (for light backgrounds) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-repeater.md b/_addons_uis/org.openhab.ui/doc/components/oh-repeater.md new file mode 100644 index 000000000..bf1247aea --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-repeater.md @@ -0,0 +1,174 @@ +--- +title: oh-repeater - Repeater +component: oh-repeater +label: Repeater +description: Iterate over an array and repeat the children components in the default slot +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-repeater.md +prev: /docs/ui/components/ +--- + +# oh-repeater - Repeater + + + +[[toc]] + + + + +Iterate over an array and repeat the children components in the default slot + + +## Configuration + + + +### General +
+ + + + Name of the variable holding the current element in the iteration, it will be propagated to the children components in the default slot. 2 additional variables with the "_idx" and "_source" suffixes will also be defined to hold the current index and source array, respectively. + + + + + What to iterate on + + + + + + + + + + + + + Source array (for "array" source type) + + + + + Start of range (for "range" source type) + + + + + End of range (for "range" source type) + + + + + Step of range (for "range" source type) + + + + + Group item to whose members will be iterated (for "itemsInGroup" source type) + + + + + Iterate over items with the given tags (comma-separated, for "itemsWithTags" source type) + + + + + Iterate over the state options or command options of this item (for "itemStateOptions" or "itemCommandOptions" source type) + + + + + Fetch the metadata from these namespaces (for "itemsInGroup" and "itemsWithTags" source types) + + + + + Specify an expression WITHOUT THE = PREFIX to filter the resulting array + + + + + Specify an expression WITHOUT THE = PREFIX to transform the resulting array elements + + + + + The child components will be wrapped in a ul HTML elements instead of a div + + + + + Add these CSS classes to the container + + + + + Add these CSS styles to the container + + + + + Render all children directly under the repeater's parent, without any container + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-card.md new file mode 100644 index 000000000..194349190 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-card.md @@ -0,0 +1,184 @@ +--- +title: oh-rollershutter-card - Rollershutter Card +component: oh-rollershutter-card +label: Rollershutter Card +description: Display rollershutter controls in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-rollershutter-card.md +prev: /docs/ui/components/ +--- + +# oh-rollershutter-card - Rollershutter Card + + + +[[toc]] + + + + +Display rollershutter controls in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Orientation +
+ + + + Vertical orientation + + + +
+ +### Rollershutter Controls +
+ + + + Rollershutter item to control + + + + + Icons to use for the UP/DOWN buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Icons to use for the STOP button + + + + + + + + + + + + + + + Display state value inside the STOP button instead of icon + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-cell.md new file mode 100644 index 000000000..e2ade4ad3 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-cell.md @@ -0,0 +1,332 @@ +--- +title: oh-rollershutter-cell - Rollershutter Cell +component: oh-rollershutter-cell +label: Rollershutter Cell +description: A cell expanding to rollershutter controls +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-rollershutter-cell.md +prev: /docs/ui/components/ +--- + +# oh-rollershutter-cell - Rollershutter Cell + + + +[[toc]] + + + + +A cell expanding to rollershutter controls + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Roller Shutter +
+ + + + Rollershutter item to control + + + + + Icons to use for the UP/DOWN buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Icons to use for the STOP button + + + + + + + + + + + + + + + Display state value inside the STOP button instead of icon + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-item.md new file mode 100644 index 000000000..577d7e037 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter-item.md @@ -0,0 +1,189 @@ +--- +title: oh-rollershutter-item - Rollershutter List Item +component: oh-rollershutter-item +label: Rollershutter List Item +description: Display rollershutter controls in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-rollershutter-item.md +prev: /docs/ui/components/ +--- + +# oh-rollershutter-item - Rollershutter List Item + + + +[[toc]] + + + + +Display rollershutter controls in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Orientation +
+ + + + Vertical orientation + + + +
+ +### Rollershutter Controls +
+ + + + Rollershutter item to control + + + + + Icons to use for the UP/DOWN buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Icons to use for the STOP button + + + + + + + + + + + + + + + Display state value inside the STOP button instead of icon + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter.md b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter.md new file mode 100644 index 000000000..0d59a380a --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-rollershutter.md @@ -0,0 +1,141 @@ +--- +title: oh-rollershutter - Rollershutter +component: oh-rollershutter +label: Rollershutter +description: Rollershutter control, with up/down/stop buttons +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-rollershutter.md +prev: /docs/ui/components/ +--- + +# oh-rollershutter - Rollershutter + + + +[[toc]] + + + + +Rollershutter control, with up/down/stop buttons + + +## Configuration + + + +### General +
+ + + + Rollershutter item to control + + + + + Icons to use for the UP/DOWN buttons + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Icons to use for the STOP button + + + + + + + + + + + + + + + Display state value inside the STOP button instead of icon + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-slider-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-slider-card.md new file mode 100644 index 000000000..201fa46b5 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-slider-card.md @@ -0,0 +1,168 @@ +--- +title: oh-slider-card - Slider Card +component: oh-slider-card +label: Slider Card +description: Display a slider in a card to control an item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-slider-card.md +prev: /docs/ui/components/ +--- + +# oh-slider-card - Slider Card + + + +[[toc]] + + + + +Display a slider in a card to control an item + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Slider +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the slider vertically + + + + + Display a label above the slider knob while sliding + + + + + Display a scale on the slider + + + + + Number of (major) scale markers + + + + + Number of scale minor markers between each major marker + + + + + Text to append to the label while dragging the cursor + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-slider-cell.md b/_addons_uis/org.openhab.ui/doc/components/oh-slider-cell.md new file mode 100644 index 000000000..d7a192c26 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-slider-cell.md @@ -0,0 +1,327 @@ +--- +title: oh-slider-cell - Slider Cell +component: oh-slider-cell +label: Slider Cell +description: A cell expanding to a big vertical slider +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-slider-cell.md +prev: /docs/ui/components/ +--- + +# oh-slider-cell - Slider Cell + + + +[[toc]] + + + + +A cell expanding to a big vertical slider + + +## Configuration + + + +### Cell +
+ + General settings of the cell + + + Header of the cell + + + + + Title of the cell + + + + + Subtitle of the cell + + + + + Footer of the cell + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Color to use when highlighted + + + + + Expression to determine when the card should be highlighted. If blank, determine automatically from the primary bound item if applicable. + + + +
+ +### Slider +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the slider vertically + + + + + Display a label above the slider knob while sliding + + + + + Display a scale on the slider + + + + + Number of (major) scale markers + + + + + Number of scale minor markers between each major marker + + + + + Text to append to the label while dragging the cursor + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-slider-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-slider-item.md new file mode 100644 index 000000000..dcfeb272a --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-slider-item.md @@ -0,0 +1,173 @@ +--- +title: oh-slider-item - Slider List Item +component: oh-slider-item +label: Slider List Item +description: Display a slider control in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-slider-item.md +prev: /docs/ui/components/ +--- + +# oh-slider-item - Slider List Item + + + +[[toc]] + + + + +Display a slider control in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Slider +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the slider vertically + + + + + Display a label above the slider knob while sliding + + + + + Display a scale on the slider + + + + + Number of (major) scale markers + + + + + Number of scale minor markers between each major marker + + + + + Text to append to the label while dragging the cursor + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-slider.md b/_addons_uis/org.openhab.ui/doc/components/oh-slider.md new file mode 100644 index 000000000..c5cb77713 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-slider.md @@ -0,0 +1,141 @@ +--- +title: oh-slider - Slider +component: oh-slider +label: Slider +description: Slider control, allows to pick a number value on a scale +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-slider.md +prev: /docs/ui/components/ +--- + +# oh-slider - Slider + + + +[[toc]] + + + + +Slider control, allows to pick a number value on a scale + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the slider vertically + + + + + Display a label above the slider knob while sliding + + + + + Display a scale on the slider + + + + + Number of (major) scale markers + + + + + Number of scale minor markers between each major marker + + + + + Text to append to the label while dragging the cursor + + + + + Name of the variable to set on input change + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-stepper-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-stepper-card.md new file mode 100644 index 000000000..e055fbe3a --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-stepper-card.md @@ -0,0 +1,178 @@ +--- +title: oh-stepper-card - Stepper Card +component: oh-stepper-card +label: Stepper Card +description: Display a stepper in a card to control an item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-stepper-card.md +prev: /docs/ui/components/ +--- + +# oh-stepper-card - Stepper Card + + + +[[toc]] + + + + +Display a stepper in a card to control an item + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Stepper +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the buttons without the value in the middle + + + + + Smaller size + + + + + Larger size + + + + + Fill the buttons with the primary color + + + + + Display the buttons with a raised style + + + + + Display the buttons with a rounded style + + + + + Continue to increase/decrease the value while the buttons keep being pressed + + + + + Speed up the increase/decrease over time while the buttons keep being pressed + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-stepper-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-stepper-item.md new file mode 100644 index 000000000..5bfe453b8 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-stepper-item.md @@ -0,0 +1,183 @@ +--- +title: oh-stepper-item - Stepper List Item +component: oh-stepper-item +label: Stepper List Item +description: Display a stepper control in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-stepper-item.md +prev: /docs/ui/components/ +--- + +# oh-stepper-item - Stepper List Item + + + +[[toc]] + + + + +Display a stepper control in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Stepper +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the buttons without the value in the middle + + + + + Smaller size + + + + + Larger size + + + + + Fill the buttons with the primary color + + + + + Display the buttons with a raised style + + + + + Display the buttons with a rounded style + + + + + Continue to increase/decrease the value while the buttons keep being pressed + + + + + Speed up the increase/decrease over time while the buttons keep being pressed + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-stepper.md b/_addons_uis/org.openhab.ui/doc/components/oh-stepper.md new file mode 100644 index 000000000..2be5730eb --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-stepper.md @@ -0,0 +1,151 @@ +--- +title: oh-stepper - Stepper +component: oh-stepper +label: Stepper +description: Stepper control, allows to input a number or decrement/increment it using buttons +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-stepper.md +prev: /docs/ui/components/ +--- + +# oh-stepper - Stepper + + + +[[toc]] + + + + +Stepper control, allows to input a number or decrement/increment it using buttons + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Minimum value + + + + + Maximum value + + + + + Minimum interval between values + + + + + Display the buttons without the value in the middle + + + + + Smaller size + + + + + Larger size + + + + + Fill the buttons with the primary color + + + + + Display the buttons with a raised style + + + + + Display the buttons with a rounded style + + + + + Continue to increase/decrease the value while the buttons keep being pressed + + + + + Speed up the increase/decrease over time while the buttons keep being pressed + + + + + Name of the variable to set on input change + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-swiper-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-swiper-card.md new file mode 100644 index 000000000..de2012b93 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-swiper-card.md @@ -0,0 +1,133 @@ +--- +title: oh-swiper-card - Swiper Card +component: oh-swiper-card +label: Swiper Card +description: Display a swiper allowing to browse slides, in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-swiper-card.md +prev: /docs/ui/components/ +--- + +# oh-swiper-card - Swiper Card + + + +[[toc]] + + + + +Display a swiper allowing to browse slides, in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Swiper +
+ + + + Enable pagination + + + + + Enable navigation + + + + + Enable scrollbar + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-swiper.md b/_addons_uis/org.openhab.ui/doc/components/oh-swiper.md new file mode 100644 index 000000000..119203a90 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-swiper.md @@ -0,0 +1,101 @@ +--- +title: oh-swiper - Swiper +component: oh-swiper +label: Swiper +description: Swiper control, allows to display multiple swipeable slides +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-swiper.md +prev: /docs/ui/components/ +--- + +# oh-swiper - Swiper + + + +[[toc]] + + + + +Swiper control, allows to display multiple swipeable slides + + +## Configuration + + + +### General +
+ + + + Enable pagination + + + + + Enable navigation + + + + + Enable scrollbar + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-time-axis.md b/_addons_uis/org.openhab.ui/doc/components/oh-time-axis.md new file mode 100644 index 000000000..0b159a83c --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-time-axis.md @@ -0,0 +1,128 @@ +--- +title: oh-time-axis - Time Axis +component: oh-time-axis +label: Time Axis +description: Reference documentation for the oh-time-axis component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-time-axis.md +prev: /docs/ui/components/ +--- + +# oh-time-axis - Time Axis + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + +
+ +### Name Display +
+ + + + Location of axis name + + + + + + + + + + Gap between axis name and axis line. + + + + + Rotation of axis name + + + +
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the grid for this axis + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-time-series.md b/_addons_uis/org.openhab.ui/doc/components/oh-time-series.md new file mode 100644 index 000000000..4aa74476e --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-time-series.md @@ -0,0 +1,146 @@ +--- +title: oh-time-series - Time Series +component: oh-time-series +label: Time Series +description: Reference documentation for the oh-time-series component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-time-series.md +prev: /docs/ui/components/ +--- + +# oh-time-series - Time Series + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + + + The item whose persisted data to display + + + + + The identifier of the persistence service to retrieve the data from. Leave blank to the use the default. + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Unit). + + + + + Offset to subtract from the displayed period, use if you want to do period comparisons (see also Offset Amount). + + + + + + + + + + + + + The type of the series.
Note: heatmap needs a configured visual map and is not supported for time series +
+ + + + + + +
+
+
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the X axis for this series + + + + + The index of the Y axis for this series + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-toggle-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-toggle-card.md new file mode 100644 index 000000000..f839509bc --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-toggle-card.md @@ -0,0 +1,128 @@ +--- +title: oh-toggle-card - Toggle Card +component: oh-toggle-card +label: Toggle Card +description: Display a toggle swtich in a card to send ON/OFF commands +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-toggle-card.md +prev: /docs/ui/components/ +--- + +# oh-toggle-card - Toggle Card + + + +[[toc]] + + + + +Display a toggle swtich in a card to send ON/OFF commands + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Toggle +
+ + + + Item to control + + + + + Color of the control (supported values: red, green, blue, pink, yellow, orange, purple, deeppurple, lightblue, teal, lime, deeporange, gray, white, black) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-toggle-item.md b/_addons_uis/org.openhab.ui/doc/components/oh-toggle-item.md new file mode 100644 index 000000000..6cb4ae995 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-toggle-item.md @@ -0,0 +1,133 @@ +--- +title: oh-toggle-item - Toggle List Item +component: oh-toggle-item +label: Toggle List Item +description: Display a toggle switch in a list +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-toggle-item.md +prev: /docs/ui/components/ +--- + +# oh-toggle-item - Toggle List Item + + + +[[toc]] + + + + +Display a toggle switch in a list + + +## Configuration + + + +### List Item +
+ + General settings of the list item + + + Title of the item + + + + + Subtitle of the item + + + + + Text to display on the opposite side of the item (set either this or a badge) + + + + + Use oh:iconName (openHAB icon), f7:iconName (Framework7 icon) or material:iconName (Material icon) + + + + + Not applicable to openHAB icons + + + + + Use the state of the item to get a dynamic icon (for openHAB icons only) + + + +
+ +### Toggle +
+ + + + Item to control + + + + + Color of the control (supported values: red, green, blue, pink, yellow, orange, purple, deeppurple, lightblue, teal, lime, deeporange, gray, white, black) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-toggle.md b/_addons_uis/org.openhab.ui/doc/components/oh-toggle.md new file mode 100644 index 000000000..cf5944fbf --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-toggle.md @@ -0,0 +1,101 @@ +--- +title: oh-toggle - Toggle +component: oh-toggle +label: Toggle +description: Toggle control, allows to switch on or off +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-toggle.md +prev: /docs/ui/components/ +--- + +# oh-toggle - Toggle + + + +[[toc]] + + + + +Toggle control, allows to switch on or off + + +## Configuration + + + +### General +
+ + + + Item to control + + + + + Color of the control (supported values: red, green, blue, pink, yellow, orange, purple, deeppurple, lightblue, teal, lime, deeporange, gray, white, black) + + + + + Name of the variable to set on input change + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-trend.md b/_addons_uis/org.openhab.ui/doc/components/oh-trend.md new file mode 100644 index 000000000..60c1c49a0 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-trend.md @@ -0,0 +1,106 @@ +--- +title: oh-trend - Trend line +component: oh-trend +label: Trend line +description: Trend line to display the overall recent evoluation of an item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-trend.md +prev: /docs/ui/components/ +--- + +# oh-trend - Trend line + + + +[[toc]] + + + + +Trend line to display the overall recent evoluation of an item + + +## Configuration + + + +### General +
+ + + + Item to show as a trend line in the background + + + + + Thickness of the trend line + + + + + Width of the trend line (leave blank to set automatically) + + + + + Colors of the trend line (see vue-trend) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-value-axis.md b/_addons_uis/org.openhab.ui/doc/components/oh-value-axis.md new file mode 100644 index 000000000..abff707b3 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-value-axis.md @@ -0,0 +1,143 @@ +--- +title: oh-value-axis - Value Axis +component: oh-value-axis +label: Value Axis +description: Reference documentation for the oh-value-axis component +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-value-axis.md +prev: /docs/ui/components/ +--- + +# oh-value-axis - Value Axis + + + +[[toc]] + + + + + + + +## Configuration + + + +### General +
+ + + + A name which will appear on tooltips and labels + + + + + Minimum boundary + + + + + Maximum boundary + + + + + If checked the scale will not necessarily include the origin (has no effect if min or max are set explicitely) + + + +
+ +### Name Display +
+ + + + Location of axis name + + + + + + + + + + Gap between axis name and axis line. + + + + + Rotation of axis name + + + +
+ +### Axis and Coordinate System Assignments +
+ + + + The index of the grid for this axis + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-video-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-video-card.md new file mode 100644 index 000000000..180bb2611 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-video-card.md @@ -0,0 +1,143 @@ +--- +title: oh-video-card - Video Card +component: oh-video-card +label: Video Card +description: Display a video (URL or URL from String item) in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-video-card.md +prev: /docs/ui/components/ +--- + +# oh-video-card - Video Card + + + +[[toc]] + + + + +Display a video (URL or URL from String item) in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + +
+ +### Video +
+ + + + Item containing the address of the video + + + + + URL to show (if item if not specified) + + + + + Content Type of the video, for example video/mp4 (optional) + + + + + Hide the control buttons of the video + + + + + Does not start playing the video automatically + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-video.md b/_addons_uis/org.openhab.ui/doc/components/oh-video.md new file mode 100644 index 000000000..fffa18e29 --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-video.md @@ -0,0 +1,260 @@ +--- +title: oh-video - Video +component: oh-video +label: Video +description: Displays a video player from a URL or an item +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-video.md +prev: /docs/ui/components/ +--- + +# oh-video - Video + + + +[[toc]] + + + + +Displays a video player from a URL or an item + + +## Configuration + + + +### General +
+ + + + Item containing the address of the video + + + + + URL to show (if item if not specified) + + + + + Content Type of the video, for example video/mp4 (optional) + + + + + Hide the control buttons of the video + + + + + Does not start playing the video automatically + + + +
+ +### Action +
+ + Action to perform when the element is clicked + + + Type of action to perform + + + + + + + + + + + + + + + + + + + + URL to navigate to + + + + + Open the URL in the same tab/window instead of a new one. This will exit the app. + + + + + Item to perform the action on + + + + + Command to send to the item. If "toggle item" is selected as the action, only send the command when the state is different + + + + + Command to send to the item when "toggle item" is selected as the action, and the item's state is equal to the command above + + + + + Comma-separated list of options; if omitted, retrieve the command options from the item dynamically. Use value=label format to provide a label different than the option. + + + + + Rule to run + + + + + Page to navigate to + + + + + Use a specific page transition animation + + + + + + + + + + + + + + + Page or widget to display in the modal + + + + + Configuration (prop values) for the target modal page or widget + + + + + Array of URLs or objects representing the images. Auto-refresh is not supported.
Edit in YAML or provide a JSON array, e.g.
[ "url1", { "item": "ImageItem1", "caption": "Camera" } ]
Objects are in the photos array format with an additional item property to specify an item to view. +
+
+ + + Configuration for the photo browser.
Edit in YAML or provide a JSON object, e.g.
{ "exposition": false, "type": "popup", "theme": "dark" }
See photo browser parameters (not all are supported). +
+
+ + + Group item whose members to show in a popup + + + + + Start analyzing with the specified (set of) item(s) + + + + + The initial analyzing period - dynamic or a predefined fixed period: day, week, month or year + + + + + + + + + + + + The initial coordinate system of the analyzer - time, aggregate or calendar (only time is supported for dynamic periods) + + + + + + + + + + Shows a toast popup when the action has been executed. Can either be a text to show or a JSON object including some of the supported parameters + + + + + The variable name to set + + + + + The value to set the variable to + + +
+
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-webframe-card.md b/_addons_uis/org.openhab.ui/doc/components/oh-webframe-card.md new file mode 100644 index 000000000..bbaa4f7be --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-webframe-card.md @@ -0,0 +1,133 @@ +--- +title: oh-webframe-card - Web Frame Card +component: oh-webframe-card +label: Web Frame Card +description: Display a web page in a card +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-webframe-card.md +prev: /docs/ui/components/ +--- + +# oh-webframe-card - Web Frame Card + + + +[[toc]] + + + + +Display a web page in a card + + +## Configuration + + + +### Card +
+ + Parameters of the card + + + Title of the card + + + + + Footer of the card + + + + + Do not render the card border + + + + + Do not render a shadow effect to the card + + + + + Show the card outline + + + + + Show borders around the frame + + + +
+ +### Web Frame +
+ + + + URL to show in the frame + + + + + Height of the frame (by default 300px) + + + +
+ + + + + + + + + + + diff --git a/_addons_uis/org.openhab.ui/doc/components/oh-webframe.md b/_addons_uis/org.openhab.ui/doc/components/oh-webframe.md new file mode 100644 index 000000000..c86c58daa --- /dev/null +++ b/_addons_uis/org.openhab.ui/doc/components/oh-webframe.md @@ -0,0 +1,96 @@ +--- +title: oh-webframe - Web frame +component: oh-webframe +label: Web frame +description: Displays a web page in a frame +source: https://github.com/openhab/openhab-webui/edit/main/bundles/org.openhab.ui/doc/components/oh-webframe.md +prev: /docs/ui/components/ +--- + +# oh-webframe - Web frame + + + +[[toc]] + + + + +Displays a web page in a frame + + +## Configuration + + + +### General +
+ + + + URL to show in the frame + + + + + Height of the frame (by default 300px) + + + +
+ + + + + + + + + + + diff --git a/_addons_voices/googletts/readme.md b/_addons_voices/googletts/readme.md index f9b8c37bc..a1151b445 100644 --- a/_addons_voices/googletts/readme.md +++ b/_addons_voices/googletts/readme.md @@ -42,12 +42,12 @@ Before you can integrate this service with your Google Cloud Text-to-Speech, you * Set up authentication: * Go to the "APIs & Services" -> "Credentials" page in the GCP Console and your project. [link](https://console.cloud.google.com/apis/credentials) * From the "Create credentials" drop-down list, select "OAuth client ID. - * Select application type "Other" and enter a name into the "Name" field. + * Select application type "TV and Limited Input" and enter a name into the "Name" field. * Click Create. A pop-up appears, showing your "client ID" and "client secret". ## Service Configuration -Using your favorite configuration UI (e.g. Paper UI) edit **Services / Voice / Google Cloud Text-to-Speech** settings and set: +Using your favorite configuration UI to edit **Settings / Other Services - Google Cloud Text-to-Speech** and set: * **Client Id** - Google Cloud Platform OAuth 2.0-Client Id. * **Client Secret** - Google Cloud Platform OAuth 2.0-Client Secret. @@ -69,7 +69,7 @@ Make sure to disable this setting again so the cache is maintained after restart Using your favorite configuration UI: -* Edit **System** settings. -* Edit **Voice** settings. +* Go to **Settings**. +* Edit **System Services - Voice**. * Set **Google Cloud** as **Default Text-to-Speech**. -* Choose default voice for the setup. +* Choose your preferred **Default Voice** for your setup. diff --git a/_addons_voices/mactts/readme.md b/_addons_voices/mactts/readme.md index 2abb4bc69..a7eff6cae 100644 --- a/_addons_voices/mactts/readme.md +++ b/_addons_voices/mactts/readme.md @@ -5,7 +5,6 @@ title: macOS Text-to-Speech - Voices type: voice description: "The macOS Text-to-Speech (TTS) service uses the macOS 'say' command for producing spoken text." since: 3x -logo: images/addons/mactts.png install: auto --- diff --git a/_addons_voices/pollytts/readme.md b/_addons_voices/pollytts/readme.md index 8a52d53e5..b54dbe30e 100644 --- a/_addons_voices/pollytts/readme.md +++ b/_addons_voices/pollytts/readme.md @@ -37,7 +37,7 @@ To use the service you will need the **access key**, **secret key** and **server ## Service Configuration -Using your favorite configuration UI (e.g. Paper UI) edit **Services/Voice/Polly Text-to-Speech** settings and set: +The following configurations can be edited using the "Polly Text-to-Speech" settings in the UI: * **Access Key** - The AWS credentials access key (required). * **Secret Key** - The AWS credentials secret key (required). diff --git a/_thing_types/org.openhab.binding.zwave/src/main/resources/OH-INF/thing/zooz/zen16_1_10.xml b/_thing_types/org.openhab.binding.zwave/src/main/resources/OH-INF/thing/zooz/zen16_1_10.xml deleted file mode 100644 index 6478bdb1e..000000000 --- a/_thing_types/org.openhab.binding.zwave/src/main/resources/OH-INF/thing/zooz/zen16_1_10.xml +++ /dev/null @@ -1,451 +0,0 @@ - - - - - -

Overview

Features

  • Powerful dry contact relays to control loads up to 15 A and 20 A
  • Perfect for outdoor lighting, pool pumps, garage door, or gas fireplace
  • Control up to 3 connected loads independently or together
  • Z-Wave or optional wall switch control (toggle or momentary type)
  • Built-in timers for each relay to simplify automation
  • Remembers and restores on/off status after power failure
  • Built-in Z-Wave Plus signal repeater to extend network range
  • Powered by 12-24 V DC/AC or USB C port for easy set-up
  • Wall mounting and minimal design for clean installation
  • S2 security protocol and the latest 500 Z-Wave chip

Specifications

  • Model Number: ZEN16
  • Z-Wave Signal Frequency: 908.42 MHz
  • Power: 12-24 V DC/AC or USB C
  • Maximum Load: Relay 1: 15A (HP), R2: 15A (HP), R3: 20A (HP)
  • Range: Up to 100 feet line of sight
  • Operating Temperature: 32-104° F (0-40° C)
  • Installation and Use: Indoor only

Inclusion Information

  1. Start Z-Wave inclusion.
  2. Quickly press the Z-Wave button 3 times.

The LED indicator will blink to signal communication and remain on for 2 seconds to confirm inclusion.


Exclusion Information

  1. Start Z-Wave inclusion.
  2. Quickly press the Z-Wave button 3 times.

The LED indicator will blink to signal communication and remain on for 2 seconds to confirm inclusion.


Wakeup Information


- ]]>
- Battery - - - - - - - COMMAND_CLASS_SWITCH_BINARY - - - - - - COMMAND_CLASS_SWITCH_MULTILEVEL - COMMAND_CLASS_SWITCH_MULTILEVEL - - - - - - COMMAND_CLASS_SCENE_ACTIVATION - - - - - - COMMAND_CLASS_SENSOR_BINARY - - - - - - COMMAND_CLASS_METER;type=E_KWh - - - - - - COMMAND_CLASS_METER;type=E_KVAh - - - - - - COMMAND_CLASS_METER;type=E_W - - - - - COMMAND_CLASS_BATTERY - - - - - - COMMAND_CLASS_SWITCH_BINARY:1 - - - - - - COMMAND_CLASS_SWITCH_BINARY:2 - - - - - - COMMAND_CLASS_SWITCH_BINARY:3 - - - - - - - Zooz - ZEN16 - 027A - A000:A055 - 1.10 - 1.30 - 1326 - 1 - - - - - - - - setup - - - - - link - - - - - - - Set the on off status for the relays after power failure - 1 - - - - - - - - false - - - - -

Overview

Press and hold the Z-Wave button for 5 seconds to change mode manually

- ]]>
- 2 - - - - - - - false -
- - - -

Overview

Click-click’n’hold the Z-Wave button for 5 seconds to change mode manually.

- ]]>
- 2 - - - - - - - false -
- - - -

Overview

Click-click-click’n’hold the Z-Wave button for 5 seconds to change mode manually

- ]]>
- 2 - - - - - - - false -
- - - -

Overview

Choose if you want the LED indicator to turn on when any of the relays are on or if all of them are off, or if you want it to remain on or off at all times.

Click the Z-Wave button 5 times quickly to change mode manually

- ]]>
- 0 - - - - - - - false -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 1 to automatically turn off once it has been turned on. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 1 to automatically turn on once it has been turned off. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 2 to automatically turn off once it has been turned on. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 2 to automatically turn on once it has been turned off. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 3 to automatically turn off once it has been turned on. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Use this parameter to set the time after which you want the device connected to Relay 3 to automatically turn on once it has been turned off. The number entered as value corresponds to the number of minutes.

- ]]>
- 0 - - - -
- - - -

Overview

Enable or disable physical on/off control of Relay 1 from the wall switch connected to Sw1 terminal. If disabled, you’ll only be able to control the connected device via Z-Wave.

- ]]>
- 1 - - - - - false -
- - - -

Overview

Enable or disable physical on/off control of Relay 2 from the wall switch connected to Sw2 terminal. If disabled, you’ll only be able to control the connected device via Z-Wave.

- ]]>
- 1 - - - - - false -
- - - -

Overview

Enable or disable physical on/off control of Relay 3 from the wall switch connected to Sw3 terminal. If disabled, you’ll only be able to control the connected device via Z-Wave.

- ]]>
- 1 - - - - - false -
- - - -

Overview


- ]]>
- 0 - - - - - -
- - - - Use this parameter to choose between seconds, minutes, or hours to be used as the auto timer-on unit for Relay 1 - 0 - - - - - - - - - - Use this parameter to choose between seconds, minutes, or hours to be used as the auto timer-off unit for Relay 2 - 0 - - - - - - - - - - Use this parameter to choose between seconds, minutes, or hours to be used as the auto timer-on unit for Relay 2 - 0 - - - - - - false - - - - - Use this parameter to choose between seconds, minutes, or hours to be used as the auto timer-off unit for Relay 3 - 0 - - - - - - - - - - Use this parameter to choose between seconds, minutes, or hours to be used as the auto timer-on unit for Relay 3 - 0 - - - - - - - - - - Decide whether you'd like Relay 1 to be normally open (NO) or normally closed (NC) - 0 - - - - - - - - - - Decide whether you'd like Relay 2 to be normally open (NO) or normally closed (NC) - 0 - - - - - - - - - - Decide whether you'd like Relay 3 to be normally open (NO) or normally closed (NC) - 0 - - - - - - - - - - Sync Relay 1 and Relay 2 together to prevent them from being activated at the same time - 0 - - - - - - - - - - - - - - Send BASIC_SET reports when operated manually - 5 - - - - - Send BASIC_SET reports when operated manually - 5 - - - - - Send BASIC_SET reports when operated manually - 5 - - - - - - true - - -
- -
- -
diff --git a/addons/actions.md b/addons/actions.md index 2c3276fc1..62da8e978 100644 --- a/addons/actions.md +++ b/addons/actions.md @@ -3,8 +3,6 @@ layout: documentation title: Actions --- -{% include base.html %} - # Actions Actions are predefined methods that are called from openHAB rules and scripts. @@ -57,8 +55,40 @@ One can configure whether specific log entries are logged out and where they get ### Exec Actions -- `executeCommandLine(String commandLine)`: Executes a command on the command line without waiting for the command to complete -- `executeCommandLine(Duration.fromSeconds(timeout), String commandLine)`: Executes a command on the command and waits `timeout` seconds for the command to complete, returning the output from the command as a String +You have different options to execute a command through an action. + +- `executeCommandLine(String commandLine)`: Executes a command on the command line without waiting for the command to complete. + For example you could run `executeCommandLine("path/to/my/script.sh")` which then would be executed and the rule would continue processing. + +- `executeCommandLine(Duration.ofSeconds(timeout), String commandLine)`: Executes a command on the command and waits `timeout` seconds for the command to complete, returning the output from the command as a String. + For example you could run `var ScriptResponse = executeCommandLine(Duration.ofSeconds(60), "path/to/my/script.sh");` would get executed and wait 1 minute for the output to be responded back and write it into the `ScriptResponse` variable. + +Other Durations than `ofSeconds` units are possible too. +Check out the [Java Documentation](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/Duration.html?is-external=true) for possible units. + +#### Scripts with parameters + +Let's assume that your `path/to/my/script.sh`-Script needs two item states to process them with some calculation. +In console you would call it like + +```text +path/to/my/script.sh itemState1 itemState2 +``` + +To solve this constellation within a rule you have to add one argument per script parameter to the function. +The script above would be configured like shown below. + +```text +// When you are not interested in the script output +executeCommandLine("path/to/my/script.sh", itemState1, itemState2); + +// When you need the output in your further rule processing +var ScriptResponse = executeCommandLine(Duration.ofSeconds(60), "path/to/my/script.sh", itemState1, itemState2); + +// Space separated constants must be given as separate parameters as well +// e.g. path/to/your/script.sh xyz fred.file +var ScriptResponse = executeCommandLine(Duration.ofSeconds(60), "path/to/your/script.sh", "xyz", "fred.file"); +``` ### HTTP Actions @@ -78,11 +108,36 @@ All HTTP Actions can have a last `timeout` parameter added in ms. eg. `sendHttpP ::: For example: + ```javascript val headers = newHashMap("Cache-control" -> "no-cache") val output = sendHttpGetRequest("https://example.com/?id=1", headers, 1000) ``` +### Semantics + +One can use Semantics features in Rules. +E.g. determine the location of an Item. +Regardless if it is a Point, an Equipment or a Location itself. +Therefore openHAB provides a bunch methods to be used in Rules. + +#### Rules DSL + +- `boolean isLocation(Item)` - checks if the given Item is is a Location +- `boolean isEquipment(Item)` - checks if the given Item is is an Equipment +- `boolean isPoint(Item)` - checks if the given Item is is a Point +- `Item getLocation(Item)` - gets the Location Item of the Item, returns the related Location Item of the Item or `null` +- `Class getLocationType(Item)` - gets the Location type of the Item, returns the related Location type of the Item or `null` +- `Item getEquipment(Item)` - gets the Equipment Item an Item belongs to, returns the related Equipment Item of the Item or `null` +- `Class getEquipmentType(Item)` - gets the Equipment type an Item belongs to, returns the related Equipment type of the Item or `null` +- `Class getPointType(Item)` - gets the Point type of an Item, returns the related Point type of the Item or `null` +- `Class getPropertyType(Item)` - gets the Property type an Item relates to, returns the related Property type of the Item or `null` +- `Class getSemanticType(Item)` - gets the semantic type of an Item (i.e. a sub-type of Location, Equipment or Point) + +#### Scripted Automation + +One must import the Semantics Action and then call the above functions using `Semantics.`, for example `Semantics.getLocation(Item)`. + ### Timers `createTimer(AbstractInstant instant, Procedure procedure)`: schedules a block of code to execute at a future time @@ -92,18 +147,38 @@ val output = sendHttpGetRequest("https://example.com/?id=1", headers, 1000) For example: -```javascript -var Timer myTimer = createTimer(now.plusMinutes(5), [ | - logInfo("rules", "Timer activated") -]) +```php +var Timer myTimer = null + +rule "timer example" +when + Item YourItem changed +then + if (YourItem.state == ON) { + if (myTimer !== null) { + logInfo("rules", "Timer rescheduled") + myTimer.reschedule(now.plusMinutes(5)) + } else { + myTimer = createTimer(now.plusMinutes(5), [ | + logInfo("rules", "Timer activated") + //Do something... + ]) + logInfo("rules", "Timer created") + } + } else { + logInfo("rules", "Timer canceled") + myTimer.cancel() + myTimer = null + } +end ``` The Timer object supports the following methods: -- `cancel`: prevents the scheduled timer from executing -- `isActive`: returns true if the timer will be executed as scheduled, i.e. it has not been cancelled or completed -- `isRunning`: returns true if the code is currently executing (i.e. the timer activated the code but it is not done running) -- `hasTerminated`: returns true if the code has run and completed +- `cancel`: prevents the scheduled timer from executing. Most of the time `cancel` is used used in conjunction with setting the timer handler to `null` as a convenient indicator that some previously defined timer is now finished with. However setting the handler to `null` does not interact with the timer itself. +- `isActive`: returns true if the timer will be executed as scheduled, i.e. it has not been cancelled or completed. +- `isRunning`: returns true if the code is currently executing (i.e. the timer activated the code but it is not done running). +- `hasTerminated`: returns true if the code has run and completed. - `reschedule(AbstractInstant instant)`: reschedules the timer to execute at the new time. If the Timer has terminated this method does nothing. ### Thing Status Action @@ -130,6 +205,7 @@ if ((thingStatusInfo !== null) && (thingStatusInfo.getStatus().toString() == "ON ``` ### openHAB Subsystem Actions + openHAB has several subsystems that can be accessed from Rules. These include persistence, see [Persistence Extensions in Scripts and Rules]({{base}}/configuration/persistence.html#persistence-extensions-in-scripts-and-rules), transformations, scripts. - `callScript(String scriptName)`: Calls a script which must be located in the `$OPENHAB_CONF/scripts` folder. @@ -154,6 +230,7 @@ Three different actions are available: - `sendLogNotification(message)`: Sends a log notification to the `notifications` list at your openHAB Cloud instance. Notifications are NOT sent to any registered devices For each of the three actions, there's another variant accepting an icon name and a severity: + - `sendNotification(emailAddress, message, icon, severity)` - `sendBroadcastNotification(message, icon, severity)` - `sendLogNotification(message, icon, severity)` @@ -161,12 +238,13 @@ For each of the three actions, there's another variant accepting an icon name an Icon and severity can potentially be used by cloud instance clients (such as the openHAB apps for Android or iOS) to be displayed in the list of notifications. The parameters for these actions have the following meaning: + - `emailAddress`: String containing the email address the target user is registered with in the cloud instance - `message`: String containing the notification message text - `icon`: String containing the icon name (as described in [Items]({{base}}/configuration/items.html#icons)) - `severity`: String containing a description of the severity of the incident -**Example** +### Example ```javascript rule "Front Door Notification" @@ -177,7 +255,7 @@ then end ``` -For information on making use of the [openHAB Cloud service](https://github.com/openhab/openhab-cloud/blob/master/README.md) hosted by the [openHAB Foundation e.V.](https://www.openhabfoundation.org/), visit the [myopenhab.org website](https://www.myopenhab.org). +For information on making use of the [openHAB Cloud service](https://github.com/openhab/openhab-cloud/blob/main/README.md) hosted by the [openHAB Foundation e.V.](https://www.openhabfoundation.org/), visit the [myopenhab.org website](https://www.myopenhab.org). ## Ephemeris @@ -185,7 +263,7 @@ Ephemeris is a way to determine what type of day today or a number of days befor For example, a way to determine if today is a weekend, a bank holiday, someone’s birthday, trash day, etc. The default bank holidays and configuration syntax is defined by the [Jollyday library](https://github.com/svendiedrichsen/jollyday). -### Actions +### Actions Examples #### Rules DSL @@ -266,6 +344,7 @@ dayset-workday=[MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY] dayset-weekend=[SATURDAY,SUNDAY] dayset-trash=[MONDAY] ``` + #### Custom Bank Holidays In addition to the ability to define custom daysets, one can define a custom list of holidays or other important days. @@ -286,13 +365,14 @@ The following is an example listing a few custom days. ``` + For further examples and to find the list of elements to reference holidays that require more complicated calculations (e.g. holidays based on a lunar calendar, Easter, etc.) see the [XSD that defines the structures of the XML](https://github.com/svendiedrichsen/jollyday/blob/b78fa20e75d48bdf14e3fa8107befe44e3bacf3a/src/main/xsd/Holiday.xsd) or the XML file for your country or others. You can place these XML files anywhere on your file system that openHAB has permission to read. In the calls to the Actions, use the fully qualified path. We recommend placing these custom files somewhere inside your `$OH_CONF` folder, such as `$OH_CONF/services`. -#### Localisation +#### Localization Ephemeris supports translation of holidays into many languages. Localization support files can be found in the [GitHub repo](https://github.com/svendiedrichsen/jollyday/tree/master/src/main/resources/descriptions). Currently these language supports are available: @@ -307,9 +387,9 @@ Feel free to extent this list by providing additional language support files. To enable localization, -* copy the file for your language to your OH setup. - * again a folder in `$OH_CONF` folder, such as `$OH_CONF/services` is proposed. -* use function 'Ephemeris.getHolidayDescription' to convert the name according to your localization file. +- copy the file for your language to your OH setup. + - again a folder in `$OH_CONF` folder, such as `$OH_CONF/services` is proposed. +- use function 'Ephemeris.getHolidayDescription' to convert the name according to your localization file. ## Installable Actions diff --git a/addons/bindings.md b/addons/bindings.md index 40b263b5e..561bf2423 100644 --- a/addons/bindings.md +++ b/addons/bindings.md @@ -3,8 +3,6 @@ layout: documentation title: Bindings --- -{% include base.html %} - # Bindings Bindings connect your smart home's devices and technologies to openHAB. @@ -36,7 +34,7 @@ Bindings connect your smart home's devices and technologies to openHAB.

Most bindings developed for openHAB 1 can also be used in openHAB 2. - These bindings are connected directly to items by editing text files. + These bindings are connected directly to items by editing text files.

diff --git a/addons/index.md b/addons/index.md index 98828f7d6..30d7f493f 100644 --- a/addons/index.md +++ b/addons/index.md @@ -1,115 +1,7 @@ --- -layout: documentation +layout: redirected +sitemap: false +redirect_to: /configuration/addons.html --- -{% include base.html %} - -# Add-ons - -All add-ons for openHAB 2 are part of the distribution. -This includes all 2.x Bindings as well as all 1.x add-ons that were reported to be compatible. -There are several ways you can install an add-on. -These are described under *Installation of Add-ons* below - -| Add-on Type | Description | -|-----------------------------------------|---------------------------------------------------------------------------------------------------------------------------| -| [Bindings](/addons/#bindings) | Bindings integrate physical hardware, external systems and web services in openHAB | -| [User Interfaces]({{base}}/configuration/#versatility) | User interfaces are either native smartphone apps or web applications that access the openHAB server through the REST API | -| [Persistence](/addons/#persistence) | Persistence services allow openHAB to store time series data for history-based actions or statistics | -| [Actions](/addons/#actions) | Actions are predefined methods for openHAB rules and scripts | -| [Transformations](/addons/#transform) | Transformations are used to translate between technical and human-readable values for Items | -| [Voice Services](/addons/#voice) | Services that provide voice enabling features, such as text-to-speech, speech-to-text etc. | -| [3rd Party System Integration](/addons/#ios) | Expose openHAB to external systems | - -## Installation of Add-ons - -Depending on the [package]({{base}}/configuration/packages.html) you have chosen during your first time setup, there are already some pre-installed add-ons. -Additional add-ons can be installed in the different ways, described below. - -### Through Paper UI - -Navigate to the add-ons section. -Search for the desired add-on in the categories and press install. - -![installing Add-ons through Paper UI](images/index_installation_paperui.gif) - -### Through Configuration Files - -For this installation option you need to know the `id` of the desired add-on, e.g., network or mqtt1. - -You can find it out with the following command within [openHAB console]({{base}}/administration/console.html): - -```sh -feature:list | grep ^openhab -``` - -A list of all available add-ons starting with "openhab" will be returned. -It could look similar to this example: - -```text -... -openhab-transformation-xslt | 0.9.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | XSLT Transformation -openhab-voice-mactts | 0.9.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | macOS Text-to-Speech -openhab-binding-amazondashbutton | 2.0.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | Amazon Dash Button Binding -openhab-binding-astro | 2.0.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | Astro Binding -openhab-binding-autelis | 2.0.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | Autelis Binding -openhab-binding-avmfritz | 2.0.0.SNAPSHOT | | Uninstalled | openhab-aggregate-xml | AVM Fritz!Box Binding -... -openhab-binding-network │ 2.2.0 │ │ Uninstalled │ openhab-addons-2.2.0 │ Network Binding -... -``` - -According to the [naming convention for bundles]({{base}}/administration/bundles.html#naming-convention-for-bundles) the *id* for the shown example is *network*. - -Another way to find the correct `id` is to look at the URL of the add-on documentation page. -For example the url for the [mqtt Binding documentation]({{base}}/addons/bindings/mqtt1/readme.html) is - -```text -https://docs.openhab.org/addons/bindings/mqtt1/readme.html -``` - -In this case, the `id` would be "mqtt1". -Did you notice the trailing *1* in this id? -This is because the mqtt Binding is a 1.x add-on. - -The trailing `1` has to be appended for `binding`- and `misc`-addons. -It is *not needed* for other addon types like `persistence`. - -With this information we can now edit the *addons.cfg* file in the `$OPENHAB_CONF/services` folder on the machine you are running openHAB on. -The path is depending on your installation. -You can find out the correct locations on the corresponding documentation pages, e.g. [Linux]({{base}}/installation/linux.html#file-locations) or [Windows]({{base}}/installation/windows.html#file-locations). - -The file could look like this (depending on your chosen package and already installed add-ons): - -```text -package = standard -ui = basic,paper,habpanel -action = pushover -binding = astro,mqtt1 -transformation = jsonpath -persistence = influxdb -misc = restdocs -``` - -To install the network Binding like we want in this example, we just need to add the id *network* to the Binding section. - -```text -binding = astro,mqtt1,network -``` - -After saving the file, the add-on will be installed. - - -### Through manually provided add-ons - -> Attention: -> This option is adressed to advanced users. -> Installing add-os with a `.jar`file can lead to problems, because add-on dependencies may not be installed. -> Please make sure to use this option only in special cases (like add-on testing for an upcoming version) or when you know what you are doing. - -For this installation option you need a bundles `.jar` file. -One way of retrieving those files is mentiones above in the openHAB console part. - -Place the `.jar` file in the `addons` folder on the machine you are running openHAB on. -As described already for the addons.cfg option, the path is depending on your installation. -Place the .jar file in the folder Additional add-on files as described in File Locations ([Linux]({{base}}/installation/linux.html#file-locations), [Windows]({{base}}/installation/windows.html#file-locations) or [macOS]({{base}}/installation/macos.html#file-locations)). + \ No newline at end of file diff --git a/addons/io.md b/addons/io.md index 7d069e18b..2aedabec7 100644 --- a/addons/io.md +++ b/addons/io.md @@ -3,13 +3,11 @@ layout: documentation title: System Integrations --- -{% include base.html %} - # System Integrations openHAB supports services that enable integration with various technologies that don't fall into other add-on categories. -Most of the systems mentioned below are integrated via a *Misc* add-on, installed e.g. through Paper UI. +Most of the systems mentioned below are integrated via a *Misc* add-on, installed e.g. through UI. Detailed instructions and requirements may be found in the corresponding documentation pages. \ No newline at end of file diff --git a/addons/uis/apps/android.md b/addons/uis/apps/android.md index 1d2d5ef96..ee4b85c04 100644 --- a/addons/uis/apps/android.md +++ b/addons/uis/apps/android.md @@ -1,7 +1,7 @@ --- layout: documentation title: Android App -source: https://github.com/openhab/openhab-android/blob/master/docs/USAGE.md +source: https://github.com/openhab/openhab-android/blob/main/docs/USAGE.md --- {% include base.html %} @@ -104,10 +104,10 @@ then logInfo("alarm", "Scheduling alarm for {} ({})", newState.toLocaleZone, epoch) if (timerAlarm !== null) { logInfo("alarm", "Reschedule alarm") - timerAlarm.reschedule(new DateTime(epoch)) + timerAlarm.reschedule(newState.toLocaleZone.zonedDateTime) } else { logInfo("alarm", "New alarm") - timerAlarm = createTimer(new DateTime(epoch), [ | + timerAlarm = createTimer(newState.toLocaleZone.zonedDateTime, [ | // Turn on stuff, e.g. radio or light logInfo("alarm", "Alarm expired") timerAlarm = null @@ -305,7 +305,7 @@ Please refer to the [openhab-android project on GitHub](https://github.com/openh ### I don't receive any notifications -Please have a look at the "Push notification status" on the About screen in the app. +Please have a look at the notification status on the settings screen in the app. If it claims that your device is successfully registered at FCM, please open an issue on [openhab-android project on GitHub](https://github.com/openhab/openhab-android) or create a thread in the forum. ### My notifications are delayed @@ -325,7 +325,7 @@ This has a few disadvantages: ### My voice command rule isn't run -Please make sure `Default Human Language Interpreter` is set to `Rule-based Interpreter` (http://openhab:8080/paperui/index.html#/configuration/system) and `Rule Voice Interpreter` => `Configure` => Select correct item (http://openhab:8080/paperui/index.html#/configuration/services?tab=voice). +Please make sure that `Default Human Language Interpreter` is set to `Rule-based Interpreter` (http://openhab:8080/#!/settings/services/org.openhab.voice) and that the correct Item is selected at `Other Services` => `Rule Voice Interpreter` => `Voice Command Item` (http://openhab:8080/#!/settings/services/org.openhab.rulehli/select/). ### Chart loading is too slow diff --git a/addons/uis/apps/images/download-for-windows.png b/addons/uis/apps/images/download-for-windows.png index 35ba1d21e..854812808 100644 Binary files a/addons/uis/apps/images/download-for-windows.png and b/addons/uis/apps/images/download-for-windows.png differ diff --git a/addons/uis/apps/images/download-on-the-app-store.png b/addons/uis/apps/images/download-on-the-app-store.png index 5fc6d4494..171298ba9 100644 Binary files a/addons/uis/apps/images/download-on-the-app-store.png and b/addons/uis/apps/images/download-on-the-app-store.png differ diff --git a/addons/uis/apps/images/ios01.png b/addons/uis/apps/images/ios01.png index d9d517b2e..9f283b6f3 100644 Binary files a/addons/uis/apps/images/ios01.png and b/addons/uis/apps/images/ios01.png differ diff --git a/addons/uis/apps/images/ios02.png b/addons/uis/apps/images/ios02.png index d5736092e..2e9e3939d 100644 Binary files a/addons/uis/apps/images/ios02.png and b/addons/uis/apps/images/ios02.png differ diff --git a/addons/uis/apps/images/ios03.png b/addons/uis/apps/images/ios03.png index b53f43a75..55c59dc4a 100644 Binary files a/addons/uis/apps/images/ios03.png and b/addons/uis/apps/images/ios03.png differ diff --git a/addons/uis/apps/images/main_menu.png b/addons/uis/apps/images/main_menu.png index 3c09ef7f1..86972bbb3 100644 Binary files a/addons/uis/apps/images/main_menu.png and b/addons/uis/apps/images/main_menu.png differ diff --git a/addons/uis/apps/images/widget_overview.png b/addons/uis/apps/images/widget_overview.png index 37b8dfac2..0be6f88af 100644 Binary files a/addons/uis/apps/images/widget_overview.png and b/addons/uis/apps/images/widget_overview.png differ diff --git a/addons/uis/apps/ios.md b/addons/uis/apps/ios.md index a1aa40a0d..2563c92e4 100644 --- a/addons/uis/apps/ios.md +++ b/addons/uis/apps/ios.md @@ -3,8 +3,6 @@ layout: documentation title: iOS App --- -{% include base.html %} - # iOS App diff --git a/addons/uis/apps/windows.md b/addons/uis/apps/windows.md index 910e703d2..7f07fa042 100644 --- a/addons/uis/apps/windows.md +++ b/addons/uis/apps/windows.md @@ -3,8 +3,6 @@ layout: documentation title: Windows 10 App --- -{% include base.html %} - # Windows 10 App We provide a native Windows 10 app for openHAB, compatible with Windows laptops, desktops, tablets and phones (Xbox, Raspberry Pi and Holographic coming soon). diff --git a/addons/voices.md b/addons/voices.md index 864cabc15..810aac6e5 100644 --- a/addons/voices.md +++ b/addons/voices.md @@ -3,8 +3,6 @@ layout: documentation title: Voice Services --- -{% include base.html %} - # Available Voice Services | Voice Service | Description | diff --git a/administration/bundles.md b/administration/bundles.md index 86e578574..7a6f54a05 100644 --- a/administration/bundles.md +++ b/administration/bundles.md @@ -3,48 +3,52 @@ layout: documentation title: Bundle Management --- -{% include base.html %} - # Bundle Management -The [Karaf console](console.html) offers various commands to manage bundles. Most of these commands are not needed in the normal (non-developer) use of openHAB. However some basic commands are needed when dealing with some expert user situations like testing a binding. +The [console](console.html) offers various commands to manage bundles, among other things. +Most of these commands are not needed in the normal (non-developer) use of openHAB. +However some basic console commands may be needed when dealing with certain advanced user situations, such as when testing a newly developed or patched binding. ## List Bundles -The _bundle:list_ command returns a list of all currently installed bundles including their version. +The _bundle:list_ command returns a list of all currently installed bundles and their states, names, and versions. +The core openHAB system is composed of many bundles. +There will also be a bundle for each add-on, such a binding, that you have installed. +A state of "Active" means the bundle is running. ```text openhab> bundle:list START LEVEL 100 , List Threshold: 50 ID | State | Lvl | Version | Name ----------------------------------------------------------------------------------------------------- - 10 | Active | 80 | 2.3.0.201506221200 | JAX-RS Gson Provider - 11 | Active | 80 | 5.3.1.201602281253 | OSGi JAX-RS Connector - 12 | Active | 80 | 2.3.1 | Gson - 13 | Active | 80 | 18.0.0 | Guava: Google Core Libraries for Java - 14 | Active | 80 | 3.0.0.v201312141243 | Google Guice (No AOP) + 22 │ Active │ 80 │ 2.10.3 │ Jackson-annotations + 23 │ Active │ 80 │ 2.10.3 │ Jackson-core + 24 │ Active │ 80 │ 2.10.3 │ jackson-databind + 25 │ Active │ 80 │ 2.10.3 │ Jackson-dataformat-YAML + 26 │ Active │ 80 │ 2.10.3 │ Jackson datatype: JSR310 + 27 │ Active │ 80 │ 2.8.2.v20180104-1110 │ Gson: Google Json Library for Java ... -209 | Active | 80 | 2.0.0.b3 | Network Binding +209 | Active | 80 | 3.0.0 | openHAB Add-ons :: Bundles :: Network Binding ``` ## Start/Stop Bundles -Stoping a bundle is done with the command _stop_ and the ID of the bundle: +Stopping a bundle is done using the command _stop_ and the ID of the bundle: ```text openhab> bundle:stop 209 openhab> bundle:list ... -209 | Resolved | 80 | 2.0.0.b3 | Network Binding +209 | Resolved | 80 | 3.0.0 | openHAB Add-ons :: Bundles :: Network Binding ``` -The _start_ command works accordingly: +Starting a bundle is done using the _start_ command and the ID of the bundle: ```text openhab> bundle:start 209 openhab> bundle:list ... -209 | Active | 80 | 2.0.0.b3 | Network Binding +209 | Active | 80 | 3.0.0 | openHAB Add-ons :: Bundles :: Network Binding ``` ## Naming Convention For Bundles @@ -58,20 +62,18 @@ Bundles are named according to the following convention: where - **prefix** is the first element to categorize the bundle. - For addons this is `org.openhab`. -- **type** is the add-on type, e.g. "binding" or "ui" + For addons this is `org.openhab`. +- **type** is the add-on type, e.g. "binding", "persistence", or "ui" - **id** is the identifier for this bundle -The naming convention has many effects you may not have noticed before, but used already. -For example in the Paper UI the *sorted tabs* for all bindings are generated automatically based on the bundle naming. - -In many places (e.g. logging) you will also have the **package namespace** as an identifier. -You can find it as the *Symbolic name* of the bundle with the following command: +These bundle names are used in many places in openHAB, such as in various configuration files. +Logging also makes extensive use of this **package namespace**. +You can see these names listed as the *Symbolic names* of bundles by using the ```-s``` option of _bundle:list_: ```text openhab> bundle:list -s - ID | State | Lvl | Version | Name | Symbolic name ------------------------------------------------------------------------------------------------------------------------ + ID | State | Lvl | Version | Symbolic name +---------------------------------------------------------------------------------------------- ... -209 | Active | 80 | 2.1.0 | Network Binding | org.openhab.binding.network +209 | Active | 80 | 3.0.0 | org.openhab.binding.network ``` diff --git a/administration/console.md b/administration/console.md index a7aebbb17..7cd02aac5 100644 --- a/administration/console.md +++ b/administration/console.md @@ -3,29 +3,27 @@ layout: documentation title: The Console --- -{% include base.html %} - # The Console -The console offers the option to: +The console offers the ability to: -* Monitor the [log](logging.html#karaf-console) in realtime -* Manage [bundles](bundles.html) -* Execute [runtime commands](runtime.html) +- Monitor the [log](logging.html#karaf-console) in realtime +- Manage [bundles](bundles.html) +- Execute [runtime commands](runtime.html) ## Accessing the Console -The method to access the console depends on how openHAB was started. +The method used to access the console depends on how openHAB was started. -* When started in interactive mode using the provided command line scripts (e.g. `start.sh` or `start.bat`), openHAB naturally transitions directly to the console prompt. -* When started as a service (i.e. when openHAB is running as a background process), access to the console is given by running the `$OPENHAB_RUNTIME/bin/client` (`client.bat` for Windows) script or by [connecting via SSH](#connecting-via-ssh). -Linux package based installations can also use the command `openhab-cli console`. +- When started in interactive mode using the provided command line scripts (e.g. `start.sh` or `start.bat`), openHAB naturally transitions directly to the console prompt. +- When started as a service (i.e. when openHAB is running as a background process), access to the console is given by running the `$OPENHAB_RUNTIME/bin/client` (`client.bat` for Windows) script or by [connecting via SSH](#connecting-via-ssh). + Linux package based installations can also use the command `openhab-cli console`. The default username/password is **openhab:habopen**, so enter `habopen` at the password prompt. ### Connecting via SSH -The console can also be reached via secure shell connection ([SSH](https://en.wikipedia.org/wiki/Secure_Shell)). +The console can also be reached via a secure shell ([SSH](https://en.wikipedia.org/wiki/Secure_Shell)) connection. To reach the console using SSH, use the following command to connect to the localhost interface on TCP port 8101: @@ -34,7 +32,7 @@ ssh -p 8101 openhab@localhost ``` ::: tip Note -By default, connection is only allowed from localhost, i.e. only from the machine running openHAB. +By default, connections are only allowed from localhost, i.e. only from the machine running openHAB. Connections are intentionally not allowed from remote hosts due to security concerns. To change this, see [Bind Console to All Interfaces](#bind-console-to-all-interfaces). ::: @@ -69,17 +67,16 @@ If this happens, simply try connecting again until successful. After successful connection and authentication, the console will appear: ```text - __ _____ ____ - ____ ____ ___ ____ / / / / | / __ ) - / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __ | -/ /_/ / /_/ / __/ / / / __ / ___ |/ /_/ / -\____/ .___/\___/_/ /_/_/ /_/_/ |_/_____/ - /_/ 2.2.0 - Release Build + _ _ _ ____ + ___ ___ ___ ___ | | | | / \ | __ ) + / _ \ / _ \ / _ \ / _ \ | |_| | / _ \ | _ \ + | (_) | (_) | __/| | | || _ | / ___ \ | |_) ) + \___/| __/ \___/|_| |_||_| |_|/_/ \_\|____/ + |_| 3.0.0 - Release Build -Hit '' for a list of available commands +Use '' for a list of available commands and '[cmd] --help' for help on a specific command. -Hit '' or type 'system:shutdown' or 'logout' to shutdown openHAB. +To exit, use '' or 'logout'. openhab> ``` @@ -112,10 +109,12 @@ Another useful feature is the combination of the `|` (pipe) and `grep` functiona ```text openhab> bundle:list | grep openHAB -164 | Active | 90 | 2.0.0.201607210102 | openHAB Core -165 | Active | 80 | 2.0.0.201607210102 | openHAB Karaf Integration -195 | Active | 80 | 2.0.0.201607210102 | openHAB 1.x Compatibility Layer -196 | Active | 80 | 2.0.0.201607210102 | openHAB REST Documentation +128 x Active x 80 x 3.0.0 x openHAB Core :: Bundles :: Core +129 x Active x 80 x 3.0.0 x openHAB Core :: Bundles :: Audio +130 x Active x 80 x 3.0.0 x openHAB Core :: Bundles :: JAAS Authentication +131 x Active x 80 x 3.0.0 x openHAB Core :: Bundles :: OAuth2Client +132 x Active x 80 x 3.0.0 x openHAB Core :: Bundles :: Automation +... ``` The session is ended by using the logout command: @@ -124,7 +123,7 @@ The session is ended by using the logout command: openhab> logout ``` -Learn about all available commands by using the initially introduced `help` command. +Learn about all of the available commands by using the `help` command. ## Modifying the Console Settings @@ -139,22 +138,22 @@ The pertinent files controlling console settings are stored under `$OPENHAB_USER | `org.apache.karaf.shell.cfg` | Controls most console settings | | `users.properties` | Stores console password | -The exact locations of these files will vary based on your platform and installation method, e.g. `/var/lib/openhab2/etc/` or `openhab2/userdata/etc/`. +The exact locations of these files will vary based on your platform and installation method, e.g. `/var/lib/openhab/etc/` or `openhab/userdata/etc/`. Be aware that the these files may get overwritten when upgrading openHAB. -To add custom parameters or overwrite the default values, you can change the configuration file `runtime.cfg` which can be found in the `$OPENHAB_CONF/services` directory, e.g. `/etc/openhab2/services/runtime.cfg`. +To add custom parameters or overwrite the default values, you can change the configuration file `runtime.cfg` which can be found in the `$OPENHAB_CONF/services` directory, e.g. `/etc/openhab/services/runtime.cfg`. ### Changing the Password The password is stored in the file `users.properties`, located in the `etc` directory as [mentioned above](#console-settings-files-and-directories). -By default, the line with the password contains the text `openhab = `, followed by the current password (e.g. `habopen`) or a password hash (e.g. `{CRYPT}4AE1A0FD...{CRYPT}`). +By default, the line with the password contains the text `openhab =`, followed by the current password (e.g. `habopen`) or a password hash (e.g. `{CRYPT}4AE1A0FD...{CRYPT}`). To change the authentication password edit the file manually, replacing the password or password hash (including `{CRYPT}`) with your new password in clear text. Alternately, run the following Linux shell command, which will perform the replacement for you. Substitute `securePassword` with your desired password. ```shell -sudo sed -i -e "s/openhab = .*,/openhab = securePassword,/g" /var/lib/openhab2/etc/users.properties +sudo sed -i -e "s/openhab = .*,/openhab = securePassword,/g" /var/lib/openhab/etc/users.properties ``` Depending on your system, you may have to [change the directory](#console-settings-files-and-directories) at the end of the command. @@ -163,14 +162,14 @@ Please restart openHAB for the changes to take effect. The clear text password w ### Bind Console to All Interfaces The network interface configuration is defined in the file `org.apache.karaf.shell.cfg`, located in the `etc` directory as [mentioned above](#console-settings-files-and-directories). -As this file may get overwritten when upgrading openHAB, you can change this parameter in the `runtime.cfg` file which can be found in the `$OPENHAB_CONF/services` directory, e.g. `/etc/openhab2/services/runtime.cfg`. +As this file may get overwritten when upgrading openHAB, you can change this parameter in the `runtime.cfg` file which can be found in the `$OPENHAB_CONF/services` directory, e.g. `/etc/openhab/services/runtime.cfg`. The `sshHost` entry controls the interface address to bind to. `sshHost = 127.0.0.1` (localhost) is the default due to obvious security reasons. -If you are on a local network or you are fully aware of all risks of exposing your system to the public, you can change the bind address. +If you are on a secure network or you are fully aware of all of the risks of exposing your system to the public, you can change the bind address. Replace the `sshHost` IP `127.0.0.1` by `0.0.0.0` to bind to all available network interfaces. -Please be aware, that the console will now be accessible from all devices in your subnet and is only secured by the password defined in `users.properties` (same path). -You should thereby [change the password](#changing-the-password). +Please be aware that the console will now be accessible from all devices in your subnet and only secured by the password defined in `users.properties` (same path). +You should therefore [change the password](#changing-the-password)! Depending on your network configuration the console may also be exposed to the public internet, so check your routing and firewall configuration. To enable binding to all interfaces, uncomment the line @@ -179,21 +178,18 @@ To enable binding to all interfaces, uncomment the line in `services/runtime.cfg`. - ### Change the Port Number The SSH port configuration is done through the file `org.apache.karaf.shell.cfg`, located in the `etc` directory as [mentioned above](#console-settings-files-and-directories). The `sshPort` entry controls the port number. -`sshPort = 8101` is the default, but can be changed to any available port per your choosing. +`sshPort = 8101` is the default, but can be changed to any available port of your choosing. Alternately, run the following Linux shell command, which will perform the replacement for you. Substitute `1234` with your desired port number. Depending on your system, you may have to substitute [the directory](#console-settings-files-and-directories) at the end of the command. -```shell -sudo sed -i -e "s/sshPort = .*/sshPort = 1234/g" /var/lib/openhab2/etc/org.apache.karaf.shell.cfg -``` +```sudo sed -i -e "s/sshPort = .*/sshPort = 1234/g" /var/lib/openhab/etc/org.apache.karaf.shell.cfg``` ----- +## More Information Please check the [Apache Karaf reference](https://karaf.apache.org/manual/latest/) for more details. diff --git a/administration/images/new_json_file.png b/administration/images/new_json_file.png index 9907dc808..26cc2f6db 100644 Binary files a/administration/images/new_json_file.png and b/administration/images/new_json_file.png differ diff --git a/administration/images/ui_add_thing.png b/administration/images/ui_add_thing.png index 92ec0da34..b1bb00bcb 100644 Binary files a/administration/images/ui_add_thing.png and b/administration/images/ui_add_thing.png differ diff --git a/administration/images/ui_edit_thing.png b/administration/images/ui_edit_thing.png index 64d7e126e..b9a52014f 100644 Binary files a/administration/images/ui_edit_thing.png and b/administration/images/ui_edit_thing.png differ diff --git a/administration/index.md b/administration/index.md index 3de9dead3..20ba26c18 100644 --- a/administration/index.md +++ b/administration/index.md @@ -3,8 +3,6 @@ layout: documentation title: Advanced Functionality and Administrative Tasks --- -{% include base.html %} - # Advanced Functionality and Administrative Tasks As a runtime environment openHAB uses [Apache Karaf](https://karaf.apache.org), a modern and polymorphic container for hosting Java applications. diff --git a/administration/jsondb.md b/administration/jsondb.md index 875fe1109..ce5b82189 100644 --- a/administration/jsondb.md +++ b/administration/jsondb.md @@ -3,8 +3,6 @@ layout: documentation title: JsonDB Storage --- -{% include base.html %} - # JsonDB Storage JsonDB provides a system database for storage of configuration data. @@ -40,13 +38,13 @@ Most data stored in the database is written in a way that should be understandab As stated above, the files are only read during system startup - therefore if you change a file you will need to stop openHAB, make your changes and restart the system for the changes to take effect. ----- +--- openHAB stores configuration information in JSON (JavaScript Object Notation) formatted (structured) text files located in the `OPENHAB_USERDATA/jsondb/` directory. ## Storage Scope -All configuration information regarding _**Items, Links, and Things**_ are defined via the User Interfaces (Paper UI, HABmin, REST) or via internal openHAB services. +All configuration information regarding _**Items, Links, and Things**_ are defined via the User Interfaces (UI, REST) or via internal openHAB services. ::: tip Note The JSON DB does NOT store information for manually configured _**Items, Links, or Things**_, since these are already stored in files within the `OPENHAB_CONF` sub-directories (e.g. `/etc/openhab/items/`). @@ -55,6 +53,7 @@ The JSON DB does NOT store information for manually configured _**Items, Links, ## Storage Purpose JSON DB Storage can be used for: + - Backup: Maintains a copy of your configurations in the `OPENHAB_USERDATA/jsondb/backup` directory - Troubleshooting: Allows the user to interact with the configurations that were automatically generated via the UIs - Advanced administration: Gives the possibility to manually define configuration parameters within the `*.json` files @@ -65,11 +64,11 @@ openHAB writes the `*.json` files every time a change is made via the User Inter openHAB _**reads the `*.json` files only once at startup**_. So, if you edit them manually, you should restart openHAB. The system employs two write mechanisms to improve performance where there are multiple writes in a short time. When the service is closed, all open services are written to disk. -The parameters for the two mechanisms may be modified in Paper UI :arrow_right: Configuration :arrow_right: System :arrow_right: Json Storage +The parameters for the two mechanisms may be modified in UI :arrow_right: Settings :arrow_right: Json Storage 1. _Write delay_ (defaults to 500 ms): Sets the time to wait before writing changes to disk. -This can reduce the number of writes when many changes are being introduced within a short period, and -2. _Maximum write delay_ (defaults to 30000 ms): Sets the maximum period the service will wait to write data in cases where changes are happening continually. + This can reduce the number of writes when many changes are being introduced within a short period, and +1. _Maximum write delay_ (defaults to 30000 ms): Sets the maximum period the service will wait to write data in cases where changes are happening continually. The service keeps up to five backups of each table. The outdated file is copied to the backup folder and then that file is overwritten with the new content. @@ -78,6 +77,7 @@ The outdated file is copied to the backup folder and then that file is overwritt The JsonDB Storage resides in the `OPENHAB_USERDATA/jsondb/` directory. The full directory path depends on the installation method: + - Linux Repository Installation: `/var/lib/openhab/jsondb/` - Linux Manual Installation: `/opt/openhab/userdata/jsondb/` - Windows (Manual) Installation: `C:\openHAB\userdata\jsondb\` @@ -86,13 +86,12 @@ Within the `OPENHAB_USERDATA/jsondb/` directory, you will find the following fil | Filename | _Contents_ | |-----------------------------------------------------------------|---------------------------------------| -| org.openhab.config.discovery.**DiscoveryResult.json** | _Results of Paper UI Discovery_ | +| org.openhab.config.discovery.**DiscoveryResult.json** | _Results of UI Discovery_ | | org.openhab.core.items.**Item.json** | _Items configurations_ | | org.openhab.core.thing.link.**ItemChannelLink.json** | _Item to Channel Link configurations_ | | org.openhab.core.thing.link.**ItemThingLink.json** | _Item to Thing Link configurations_ | | org.openhab.core.thing.**Thing.json** | _Things configurations_ | - ## Example Use In this example, we will use the Network Binding (2.0) to Search for Things, add a new Thing to openHAB and then modify its parameters to check the information that is stored in the JsonDB. @@ -103,7 +102,7 @@ Step 1. Add new Thing (name: `ISP_Gateway`) from UI: Step 2. Check the contents of the `OPENHAB_USERDATA/jsondb/org.openhab.core.thing.Thing.json` file: -``` +```json root@rpi3:~# more /var/lib/openhab/jsondb/org.openhab.core.thing.Thing.json { "network:device:172_16_13_254": { @@ -188,10 +187,12 @@ root@rpi3:~# more /var/lib/openhab/jsondb/org.openhab.core.thing.Thing.json } ``` -Step 3. Using Paper UI :arrow_right: Configuration :arrow_right: Things, edit the new `ISP_Gateway` Thing and modify the following parameters: +Step 3. Using UI :arrow_right: Settings :arrow_right: Things, edit the new `ISP_Gateway` Thing and modify the following parameters: + - Location (from unset to `MyHome`) - Retry (from 1 to 3) - Timeout (from 5000 to 10000) + and save: ![Edit_Thing_UI](./images/ui_edit_thing.png) diff --git a/administration/logging.md b/administration/logging.md index 7cf9affe2..75683b003 100644 --- a/administration/logging.md +++ b/administration/logging.md @@ -3,8 +3,6 @@ layout: documentation title: Logging --- -{% include base.html %} - # Logging in openHAB This article describes the logging functionality in openHAB. @@ -13,7 +11,7 @@ This includes how to access logging information and configure logging for user-d There are two ways to check log entries: 1. Through files stored on the **file system** -2. During runtime in the **Karaf Console** +1. During runtime in the **Karaf Console** ## Filesystem @@ -41,7 +39,7 @@ The log shell provides the following commands: For example, the following command enables real-time monitoring of the default log: -``` +```shell openhab> log:tail 20:38:00.031 [DEBUG] [sistence.rrd4j.internal.RRD4jService] - Stored 'Temperature_FF_Child' with state '19.1' in rrd4j database 20:38:00.032 [DEBUG] [sistence.rrd4j.internal.RRD4jService] - Stored 'Temperature_FF_Bed' with state '19.5' in rrd4j database @@ -51,7 +49,7 @@ openhab> log:tail A useful feature is that filters can be applied: -``` +```shell openhab> log:tail org.openhab.io.rest.core.item.ItemResource 20:36:52.879 [DEBUG] [thome.io.rest.core.item.ItemResource] - Received HTTP POST request at 'items/Light_FF_Bath_Ceiling' with value 'ON'. 20:36:53.545 [DEBUG] [thome.io.rest.core.item.ItemResource] - Received HTTP POST request at 'items/Light_FF_Bath_Ceiling' with value 'OFF'. @@ -98,10 +96,13 @@ The levels build a hierarchy with **ERROR** logging critical messages only and * Setting the log level to **DEFAULT** will log to the level defined in the package.subpackage (in most cases a binding). If the name of `package.subpackage` is not known, the name can be found out in the console: + ```text list -s ``` + returns a list of all modules and the last column contains the information about the symbolic name of the bundle: + ```text openhab> list -s START LEVEL 100 , List Threshold: 50 @@ -115,16 +116,27 @@ START LEVEL 100 , List Threshold: 50 24 │ Active │ 80 │ 3.0.0.v201312141243 │ com.google.inject ``` + The list can be also filtered with grep. To find out the Z-Wave binding the following command can be used -```Text + +```shell openhab> list -s | grep zwave 253 x Active x 80 x 2.5.5 x org.openhab.binding.zwave - ``` +Here are some popular loggers: + +| Logger | Logged when … | +|---------------------------------------|--------------------------------------------------------------------| +| `openhab.event.ItemStateChangedEvent` | … an Item is updated with a new value | +| `openhab.event.ItemStateEvent` | … an Item is updated with the old or a new value | +| `openhab.event.ThingStatusInfoEvent` | … a Thing updates its status (e.g. ONLINE, OFFLINE) | +| `org.openhab.binding.[bindingname]` | … the binding issued a log message | +| `org.openhab.core.thing` | … a Thing changes its lifecycle state (e.g. initializing, dispose) | + The following example sets the logging for the Z-Wave binding to **DEBUG** -```text +```shell log:set DEBUG org.openhab.binding.zwave ``` @@ -149,17 +161,18 @@ logDebug("heating", "Bedroom: Temperature: {}, Mode: {}", Bedroom_Temp.state, Be The main package of all script/rules based log entries is predefined as `org.openhab.core.model.script`. The chosen subpackage is appended to the end of the main package. It can be useful for filtering or package-based log level settings. -For example you can use `log:set info org.openhab.core.model.script` and `log:set info org.openhab.core.model.script.heating` while you work on the heating rules to get debug level output for heating rules and only info level for the rest of your rules files so you don't flood the log with too many entries that are irrelevant at that point in time. +For example you can use `log:set info org.openhab.core.model.script` and `log:set debug org.openhab.core.model.script.heating` while you work on the heating rules to get debug level output for heating rules and only info level for the rest of your rules files so you don't flood the log with too many entries that are irrelevant at that point in time. An example output of the last log statement above is: -``` +```shell 2016-06-04 16:28:39.482 [DEBUG] [org.openhab.core.model.script.heating] Bedroom: Temperature 21.3°C, Mode NORMAL ``` Note that, in the last example above, inclusion and formatting of values is done using [Java Formatter String Syntax](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html). ## Log4j configuration and logging into separate files + By default, all log entries are saved in the file `openhab.log` and event-specific entries are saved in `events.log`. Additional log files can be defined in order to write specifics logs to a separate place. diff --git a/administration/runtime.md b/administration/runtime.md index ed13fa0bf..e8702da5d 100644 --- a/administration/runtime.md +++ b/administration/runtime.md @@ -3,41 +3,38 @@ layout: documentation title: Runtime Commands --- -{% include base.html %} - # Runtime Commands It is possible to query and even change the state of entities like items or things. Therefore the console offers commands in various areas: {::options toc_levels="3..4"/} -* TOC +- TOC {:toc} ::: tip Note Some of the described commands are executed on the internal database and could break your installation. Please use this functionality only if you know what you are doing! ::: - ## Examples Query an item's state: -``` +```shell openhab> openhab:status Heating_GF_Corridor OFF ``` Changing an item's state: -``` +```shell openhab> openhab:send Heating_GF_Corridor ON Command has been sent successfully. ``` Get help for a command: -``` +```shell openhab> help openhab:send Usage: openhab:send - sends a command for an item ``` diff --git a/administration/serial.md b/administration/serial.md index fb7ac9914..8538fe47a 100644 --- a/administration/serial.md +++ b/administration/serial.md @@ -3,8 +3,6 @@ layout: documentation title: Serial Port Configuration --- -{% include base.html %} - # Serial Port Configuration Without correct configuration, bindings using serial devices might not be able to open the serial port for communication, and you will see an error message in the logs. @@ -23,18 +21,18 @@ openHABian comes with a menu option to configure the serial ports automatically. If you can see issues related to opening the serial port with Linux, and you are using **non standard serial ports** (e.g. `/dev/ttyAMA0`) you might have to configure openHAB to detect and access the port correctly: -* Adapt Java command line arguments to include `-Dgnu.io.rxtx.SerialPorts=/dev/ttyAMA0` (where `/dev/ttyAMA0` is the serial port). If you have multiple serial ports to configure, separate them with colon (`:`). Depending on openHAB installation method, you should modify `start.sh`, `start_debug.sh`, `start.bat`, or `start_debug.bat` (standalone/manual installation) or `EXTRA_JAVA_OPTS` in `/etc/default/openhab2` (Debian installation) -* Depending on Linux distribution, you might need to add the user running openHAB to `dialout` user group.With Debian openHAB installation: `sudo usermod -a -G dialout openhab`. The user will need to logout from all login instances and log back in to see their new group added. If the user added to this group still cannot get permission, rebooting the box to ensure the new group permission is attached to the user is suggested. -* When using more than one USB-Serial converters, it may happen that the `/dev/ttyUSB0` device is named `/dev/ttyUSB1` after a reboot. To prevent this problem, alias names can be assigned to serial devices by adding them to `/etc/udev/rules.d/99-com.rules`. Example: +- Adapt Java command line arguments to include `-Dgnu.io.rxtx.SerialPorts=/dev/ttyAMA0` (where `/dev/ttyAMA0` is the serial port). If you have multiple serial ports to configure, separate them with colon (`:`). Depending on openHAB installation method, you should modify `start.sh`, `start_debug.sh`, `start.bat`, or `start_debug.bat` (standalone/manual installation) or `EXTRA_JAVA_OPTS` in `/etc/default/openhab` (Debian installation) +- Depending on Linux distribution, you might need to add the user running openHAB to `dialout` user group.With Debian openHAB installation: `sudo usermod -a -G dialout openhab`. The user will need to logout from all login instances and log back in to see their new group added. If the user added to this group still cannot get permission, rebooting the box to ensure the new group permission is attached to the user is suggested. +- When using more than one USB-Serial converters, it may happen that the `/dev/ttyUSB0` device is named `/dev/ttyUSB1` after a reboot. To prevent this problem, alias names can be assigned to serial devices by adding them to `/etc/udev/rules.d/99-com.rules`. Example: -```bash +```shell SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AE01F0PD", SYMLINK+="ttyMySensors" SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{serial}=="0001", SYMLINK+="ttyCulStick" ``` You need to find relevant pieces of information using e.g. `udevadm` command line utility: -``` +```shell udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0) ``` diff --git a/appendix/contributing.md b/appendix/contributing.md index 5663b9439..4f0be49d2 100644 --- a/appendix/contributing.md +++ b/appendix/contributing.md @@ -3,8 +3,6 @@ layout: documentation title: Contributing to openHAB --- -{% include base.html %} - # Contributing to openHAB openHAB is a community effort and everyone can take part in that. @@ -20,8 +18,8 @@ When no solution was found, use the table below to determine where your issue sh | Issue | Where to report | |--------------------------------------------------------------|--------------------------------------------------------------------| -| Problems and feature requests for openHAB 1 add-ons | [openHAB](https://github.com/openhab/openhab/issues) | -| Problems and feature requests for openHAB 2 add-ons | [openHAB2](https://github.com/openhab/openhab2/issues) | +| Problems and feature requests for openHAB 1 add-ons | [openHAB 1](https://github.com/openhab/openhab/issues) | +| Problems and feature requests for openHAB 2 add-ons | [openHAB 2+](https://github.com/openhab/openhab-addons/issues) | | Issues related to the runtime environment, IDE and packaging | [openHAB-distro](https://github.com/openhab/openhab-distro/issues) | | Issues related to the core openHAB bundles | [openHAB-core](https://github.com/kaikreuzer/openhab-core/issues) | @@ -36,20 +34,20 @@ We want to keep the openHAB community awesome, growing and collaborative. We need your help to keep it that way. To help with this we've come up with some general guidelines for the community as a whole: -* **Be nice:** Be courteous, respectful and polite to fellow community members: no +- **Be nice:** Be courteous, respectful and polite to fellow community members: no regional, racial, gender, or other abuse will be tolerated. We like nice people way better than mean ones! -* **Encourage diversity and participation:** Make everyone in our community +- **Encourage diversity and participation:** Make everyone in our community feel welcome, regardless of their background and the extent of their contributions, and do everything possible to encourage participation in our community. -* **Keep it legal:** Basically, don't get us in trouble. Share only content that +- **Keep it legal:** Basically, don't get us in trouble. Share only content that you own, do not share private or sensitive information, and don't break the law. -* **Stay on topic:** Make sure that you are posting to the correct channel +- **Stay on topic:** Make sure that you are posting to the correct channel and avoid off-topic discussions. Remember when you update an issue or respond to an email you are potentially sending to a large number of people. Please consider this before you update. Also remember that diff --git a/appendix/help.md b/appendix/help.md index 6abc08c4c..b40554ac5 100644 --- a/appendix/help.md +++ b/appendix/help.md @@ -3,21 +3,18 @@ layout: documentation title: Finding Help and FAQs --- -{% include base.html %} - # Finding Help openHAB is surrounding by an amazing community helping new users, discussing problems and providing tutorials and examples. Join today and find answers for all details of openHAB: -* [community.openhab.org](https://community.openhab.org) - +- [community.openhab.org](https://community.openhab.org) # FAQs - Frequently Asked Questions In the community forum you'll also find a list of recurring questions with short answers, commonly known as FAQs. Check there before posting your own questions and feel free to add questions and answers: -* [openHAB 2 FAQs at community.openhab.org](https://community.openhab.org/t/frequently-asked-questions/17727) +- [openHAB 2 FAQs at community.openhab.org](https://community.openhab.org/t/frequently-asked-questions/17727) {% include contribution-wanted.html %} diff --git a/concepts/audio.md b/concepts/audio.md index 13ff28178..dff1687fe 100644 --- a/concepts/audio.md +++ b/concepts/audio.md @@ -3,40 +3,38 @@ layout: documentation title: Audio & Voice --- -{% include base.html %} - # Audio & Voice Audio and voice features are an important aspect of any smart home solution as it is a very natural way to interact with the user. openHAB has a very modular architecture that enables many different use cases. -At its core, there is the notion of an *audio stream*. -Audio streams are provided by *audio sources* and consumed by *audio sinks*. +At its core, there is the notion of an *audio stream*. +Audio streams are provided by *audio sources* and consumed by *audio sinks*. -![](images/audio.png) +![audio](images/audio.png) - *Audio Streams* are essentially byte streams with a given *audio format*. -They do not need to be limited in size, i.e. it is allowed to have continuous streams, e.g. the input from a microphone or from an Internet radio station. + They do not need to be limited in size, i.e. it is allowed to have continuous streams, e.g. the input from a microphone or from an Internet radio station. - *Audio Formats* define the container (e.g. WAV), encoding, bit rate, sample frequency and depth and the bit order (little or big endian). -- *Audio Sources* are services that are capable of producing audio streams. -They can support different formats and provide a stream in a requested format upon request. -Typical audio source services are microphones. Typically, a continuous stream is expected from them. -- *Audio Sinks* are services that accept audio streams of certain formats. -Typically, these are expected to play the audio stream, i.e. they are some kind of speaker or media device. -- *Text-to-Speech* (TTS) services are similar to audio sources with respect to the ability to create audio streams. -The difference is that they take a string as an input and will synthesize this string to a spoken text using a given voice. -TTS services can provide information about the voices that they support and the locale that those voices are associated with. -Each voice supports exactly one locale. -- *Speech-to-Text* (STT) services are similar to audio sinks, but they do not simply play back the stream, but convert it to a plain string. -They provide information about supported formats and locales. +- *Audio Sources* are services that are capable of producing audio streams. + They can support different formats and provide a stream in a requested format upon request. + Typical audio source services are microphones. Typically, a continuous stream is expected from them. +- *Audio Sinks* are services that accept audio streams of certain formats. + Typically, these are expected to play the audio stream, i.e. they are some kind of speaker or media device. +- *Text-to-Speech* (TTS) services are similar to audio sources with respect to the ability to create audio streams. + The difference is that they take a string as an input and will synthesize this string to a spoken text using a given voice. + TTS services can provide information about the voices that they support and the locale that those voices are associated with. + Each voice supports exactly one locale. +- *Speech-to-Text* (STT) services are similar to audio sinks, but they do not simply play back the stream, but convert it to a plain string. + They provide information about supported formats and locales. As plain text from an STT service is often not very useful, there is additionally the concept of a *human language interpreter*: -![](images/hli.png) +![hli](images/hli.png) -A *Human Language Interpreter* takes a string as an input. -It then derives actions from it (like sending commands to devices) and/or replies with a string, which opens the possibility to realize conversations. -As such an interpreter is not directly linked to audio streams, but operates on strings only, this can be the basis for any kind of assistant, e.g. for chat bots using the console, XMPP, Twitter or other messaging services. +A *Human Language Interpreter* takes a string as an input. +It then derives actions from it (like sending commands to devices) and/or replies with a string, which opens the possibility to realize conversations. +As such an interpreter is not directly linked to audio streams, but operates on strings only, this can be the basis for any kind of assistant, e.g. for chat bots using the console, XMPP, Twitter or other messaging services. -Applications can dynamically choose which services to use, so that different sinks can be used for different use cases. +Applications can dynamically choose which services to use, so that different sinks can be used for different use cases. Defaults can be set as a configuration for all those services in case an application does not ask for any specific service. diff --git a/concepts/categories.md b/concepts/categories.md index ee1f4e969..7b4759e82 100644 --- a/concepts/categories.md +++ b/concepts/categories.md @@ -3,8 +3,6 @@ layout: documentation title: Categories --- -{% include base.html %} - # Categories Categories in openHAB are used to provide meta information about Things, Channels, etc. UIs can use this information to render specific icons or provide a search functionality to for example filter all Things for a certain category. @@ -23,34 +21,34 @@ The list of all predefined categories can be found in our categories overview: | Category | Description | Icon Example | |------------------|------------------------------------------------------------------------------------------------------|-----------------| -| Battery | Batteries, Energy Storages | ![](/iconsets/classic/battery.png) | -| Blinds | Roller shutters, window blinds, etc. | ![](/iconsets/classic/blinds.png) | -| Camera | All kinds of cameras | ![](/iconsets/classic/camera.png) | +| Battery | Batteries, Energy Storages | ![battery](/iconsets/classic/battery.png) | +| Blinds | Roller shutters, window blinds, etc. | ![blinds](/iconsets/classic/blinds.png) | +| Camera | All kinds of cameras | ![camera](/iconsets/classic/camera.png) | | Car | Smart Cars | | | CleaningRobot | Vacuum robots, mopping robots, etc. | | -| Door | Door | ![](/iconsets/classic/door.png) | -| FrontDoor | Front Door | ![](/iconsets/classic/frontdoor.png) | -| GarageDoor | Garage Door | ![](/iconsets/classic/garagedoor.png) | +| Door | Door | ![door](/iconsets/classic/door.png) | +| FrontDoor | Front Door | ![frontdoor](/iconsets/classic/frontdoor.png) | +| GarageDoor | Garage Door | ![garagedoor](/iconsets/classic/garagedoor.png) | | HVAC | Air condition devices, Fans | | | Inverter | Power inverter, such as solar inverters etc. | | -| LawnMower | Lawn mowing robots, etc. | ![](/iconsets/classic/lawnmower.png) | -| Lightbulb | Devices that illuminate something, such as bulbs, etc. | ![](/iconsets/classic/lightbulb.png) | -| Lock | Devices whose primary pupose is locking something | ![](/iconsets/classic/lock.png) | +| LawnMower | Lawn mowing robots, etc. | ![lawnmower](/iconsets/classic/lawnmower.png) | +| Lightbulb | Devices that illuminate something, such as bulbs, etc. | ![lightbulb](/iconsets/classic/lightbulb.png) | +| Lock | Devices whose primary pupose is locking something | ![lock](/iconsets/classic/lock.png) | | MotionDetector | Motion sensors/detectors | | | NetworkAppliance | Bridges/Gateway need to access other devices like used by Philips Hue for example, Routers, Switches | | -| PowerOutlet | Small devices to be plugged into a power socket in a wall which stick there | ![](/iconsets/classic/poweroutlet.png) | -| Projector | Devices that project a picture somewhere | ![](/iconsets/classic/projector.png) | +| PowerOutlet | Small devices to be plugged into a power socket in a wall which stick there | ![poweroutlet](/iconsets/classic/poweroutlet.png) | +| Projector | Devices that project a picture somewhere | ![projector](/iconsets/classic/projector.png) | | RadiatorControl | Controls on radiators used to heat up rooms | | -| Receiver | Audio/Video receivers, i.e. radio receivers, satelite or cable receivers, recorders, etc. | ![](/iconsets/classic/receiver.png) | -| Screen | Devices that are able to show a picture | ![](/iconsets/classic/screen.png) | +| Receiver | Audio/Video receivers, i.e. radio receivers, satelite or cable receivers, recorders, etc. | ![receiver](/iconsets/classic/receiver.png) | +| Screen | Devices that are able to show a picture | ![screen](/iconsets/classic/screen.png) | | Sensor | Device used to measure something | | -| Siren | Siren used by Alarm systems | ![](/iconsets/classic/siren.png) | +| Siren | Siren used by Alarm systems | ![siren](/iconsets/classic/siren.png) | | SmokeDetector | Smoke detectors | | | Speaker | Devices that are able to play sounds | | -| WallSwitch | Any device attached to the wall that controls a binary status of something, for ex. a light switch | ![](/iconsets/classic/wallswitch.png) | +| WallSwitch | Any device attached to the wall that controls a binary status of something, for ex. a light switch | ![wallswitch](/iconsets/classic/wallswitch.png) | | WebService | Account with credentials for a website | | -| Window | Window | ![](/iconsets/classic/window.png) | -| WhiteGood | Devices that look like Waschingmachines, Dishwashers, Dryers, Fridges, Ovens, etc. | ![](/iconsets/classic/whitegood.png) | +| Window | Window | ![window](/iconsets/classic/window.png) | +| WhiteGood | Devices that look like Waschingmachines, Dishwashers, Dryers, Fridges, Ovens, etc. | ![whitegood](/iconsets/classic/whitegood.png) | ### Channel Group Categories @@ -62,72 +60,72 @@ The Channel type definition allows to specify a category. A Binding should classify each Channel into one of the existing categories or leave the category blank, if there is no good match. There are different types of categories for Channels, which are listed below. -#### Widgets +### Widgets | Category | Icon Example | |---------------|------------------------------------------| -| Colorpicker | ![](/iconsets/classic/colorpicker.png) | -| Number | ![](/iconsets/classic/number.png) | -| Rollershutter | ![](/iconsets/classic/rollershutter.png) | -| Slider | ![](/iconsets/classic/slider.png) | -| Switch | ![](/iconsets/classic/switch.png) | -| Text | ![](/iconsets/classic/text.png) | -| Group | ![](/iconsets/classic/group.png) | +| Colorpicker | ![colorpicker](/iconsets/classic/colorpicker.png) | +| Number | ![number](/iconsets/classic/number.png) | +| Rollershutter | ![rollershutter](/iconsets/classic/rollershutter.png) | +| Slider | ![slider](/iconsets/classic/slider.png) | +| Switch | ![switch](/iconsets/classic/switch.png) | +| Text | ![text](/iconsets/classic/text.png) | +| Group | ![group](/iconsets/classic/group.png) | #### Weather | Category | Icon Example | |-------------|----------------------------------------| -| Sun | ![](/iconsets/classic/sun.png) | -| Moon | ![](/iconsets/classic/moon.png) | -| Clouds | ![](/iconsets/classic/clouds.png) | -| Sun_Clouds | ![](/iconsets/classic/sun_clouds.png) | -| Rain | ![](/iconsets/classic/rain.png) | -| Snow | ![](/iconsets/classic/snow.png) | -| Wind | ![](/iconsets/classic/wind.png) | -| Humidity | ![](/iconsets/classic/humidity.png) | -| Temperature | ![](/iconsets/classic/temperature.png) | +| Sun | ![sun](/iconsets/classic/sun.png) | +| Moon | ![moon](/iconsets/classic/moon.png) | +| Clouds | ![clouds](/iconsets/classic/clouds.png) | +| Sun_Clouds | ![sun_clouds](/iconsets/classic/sun_clouds.png) | +| Rain | ![rain](/iconsets/classic/rain.png) | +| Snow | ![snow](/iconsets/classic/snow.png) | +| Wind | ![wind](/iconsets/classic/wind.png) | +| Humidity | ![humidity](/iconsets/classic/humidity.png) | +| Temperature | ![temperature](/iconsets/classic/temperature.png) | #### Properties | Category | Icon Example | |------------------|---------------------------------------------| -| BatteryLevel | ![](/iconsets/classic/batterylevel.png) | -| LowBattery | ![](/iconsets/classic/lowbattery.png) | -| CarbonDioxide | ![](/iconsets/classic/carbondioxide.png) | -| Energy | ![](/iconsets/classic/energy.png) | -| Gas | ![](/iconsets/classic/gas.png) | -| Oil | ![](/iconsets/classic/oil.png) | -| Water | ![](/iconsets/classic/water.png) | -| Light | ![](/iconsets/classic/light.png) | -| ColorLight | ![](/iconsets/classic/colorlight.png) | -| Temperature | ![](/iconsets/classic/temperature.png) | -| Smoke | ![](/iconsets/classic/smoke.png) | -| SoundVolume | ![](/iconsets/classic/soundvolume.png) | -| Pressure | ![](/iconsets/classic/pressure.png) | -| Fire | ![](/iconsets/classic/fire.png) | -| Motion | ![](/iconsets/classic/motion.png) | -| QualityOfService | ![](/iconsets/classic/qualityofservice.png) | -| Moisture | ![](/iconsets/classic/moisture.png) | -| Noise | ![](/iconsets/classic/noise.png) | -| Flow | ![](/iconsets/classic/flow.png) | -| Price | ![](/iconsets/classic/price.png) | -| Time | ![](/iconsets/classic/time.png) | +| BatteryLevel | ![batterylevel](/iconsets/classic/batterylevel.png) | +| LowBattery | ![lowbattery](/iconsets/classic/lowbattery.png) | +| CarbonDioxide | ![carbondioxide](/iconsets/classic/carbondioxide.png) | +| Energy | ![energy](/iconsets/classic/energy.png) | +| Gas | ![gas](/iconsets/classic/gas.png) | +| Oil | ![oil](/iconsets/classic/oil.png) | +| Water | ![water](/iconsets/classic/water.png) | +| Light | ![light](/iconsets/classic/light.png) | +| ColorLight | ![colorlight](/iconsets/classic/colorlight.png) | +| Temperature | ![temperature](/iconsets/classic/temperature.png) | +| Smoke | ![smoke](/iconsets/classic/smoke.png) | +| SoundVolume | ![soundvolume](/iconsets/classic/soundvolume.png) | +| Pressure | ![pressure](/iconsets/classic/pressure.png) | +| Fire | ![fire](/iconsets/classic/fire.png) | +| Motion | ![motion](/iconsets/classic/motion.png) | +| QualityOfService | ![qualityofservice](/iconsets/classic/qualityofservice.png) | +| Moisture | ![moisture](/iconsets/classic/moisture.png) | +| Noise | ![noise](/iconsets/classic/noise.png) | +| Flow | ![flow](/iconsets/classic/flow.png) | +| Price | ![price](/iconsets/classic/price.png) | +| Time | ![time](/iconsets/classic/time.png) | #### Control | Category | Icon Example | |--------------|-----------------------------------------| -| Heating | ![](/iconsets/classic/heating.png) | -| MediaControl | ![](/iconsets/classic/mediacontrol.png) | -| MoveControl | ![](/iconsets/classic/movecontrol.png) | -| Zoom | ![](/iconsets/classic/zoom.png) | +| Heating | ![heating](/iconsets/classic/heating.png) | +| MediaControl | ![mediacontrol](/iconsets/classic/mediacontrol.png) | +| MoveControl | ![movecontrol](/iconsets/classic/movecontrol.png) | +| Zoom | ![zoom](/iconsets/classic/zoom.png) | #### Purpose | Category | Icon Example | |----------|-------------------------------------| -| Alarm | ![](/iconsets/classic/alarm.png) | -| Presence | ![](/iconsets/classic/presence.png) | -| Vacation | ![](/iconsets/classic/vacation.png) | -| Party | ![](/iconsets/classic/party.png) | +| Alarm | ![alarm](/iconsets/classic/alarm.png) | +| Presence | ![presence](/iconsets/classic/presence.png) | +| Vacation | ![vacation](/iconsets/classic/vacation.png) | +| Party | ![party](/iconsets/classic/party.png) | diff --git a/concepts/diagrams/event_interfaces.png b/concepts/diagrams/event_interfaces.png index 818902a9e..f854af6be 100644 Binary files a/concepts/diagrams/event_interfaces.png and b/concepts/diagrams/event_interfaces.png differ diff --git a/concepts/diagrams/status_transitions.png b/concepts/diagrams/status_transitions.png index f9f50f05c..97beb7ddd 100644 Binary files a/concepts/diagrams/status_transitions.png and b/concepts/diagrams/status_transitions.png differ diff --git a/concepts/discovery.md b/concepts/discovery.md index 974811e9e..e319ccf61 100644 --- a/concepts/discovery.md +++ b/concepts/discovery.md @@ -3,15 +3,13 @@ layout: documentation title: Thing Discovery --- -{% include base.html %} - # Thing Discovery Many devices, technologies and systems can be automatically discovered on the network or browsed through some API. It therefore makes a lot of sense to use these features for a smart home solution. openHAB bindings therefore implement _Discovery Services_ for Things, which provide _Discovery Results_. All _Discovery Results_ are regarded as suggestions to the user and are put into the _inbox_. -### Background Discovery +## Background Discovery Some discovery services support automatic discovery in the background, while for others a scan needs to be triggered manually. Services that support background discovery usually have it enabled by default. diff --git a/concepts/images/audio.png b/concepts/images/audio.png index 0b371f980..f960ba50a 100644 Binary files a/concepts/images/audio.png and b/concepts/images/audio.png differ diff --git a/concepts/images/hli.png b/concepts/images/hli.png index 5123f807d..a6ee9918f 100644 Binary files a/concepts/images/hli.png and b/concepts/images/hli.png differ diff --git a/concepts/images/thing-devices-1.png b/concepts/images/thing-devices-1.png index 46ff96d38..acd7a5cab 100644 Binary files a/concepts/images/thing-devices-1.png and b/concepts/images/thing-devices-1.png differ diff --git a/concepts/index.md b/concepts/index.md index 780a3fd29..b18acc471 100644 --- a/concepts/index.md +++ b/concepts/index.md @@ -3,8 +3,6 @@ layout: documentation title: Concepts --- -{% include base.html %} - # Concepts When first thinking about your home automation system, it may be helpful to bear in mind that there are two ways of thinking about or viewing your system: the physical view and the functional view. @@ -44,7 +42,7 @@ Channels may be linked to multiple Items and Items may be linked to multiple Cha To illustrate these concepts, consider the example below of a two-channel actuator that controls two lights: -![](images/thing-devices-1.png) +![thing-devices-1](images/thing-devices-1.png) The actuator is a Thing that might be installed in an electrical cabinet. It has a physical address and it must be configured in order to be used (remember the physical view introduced at the beginning of this article). diff --git a/concepts/items.md b/concepts/items.md index 7aec64753..de879e80a 100644 --- a/concepts/items.md +++ b/concepts/items.md @@ -3,15 +3,13 @@ layout: documentation title: Items --- -{% include base.html %} - # Items openHAB has a strict separation between the physical world (the "Things", see below) and the application, which is built around the notion of "Items" (also called the virtual layer). Items represent functionality that is used by the application (mainly user interfaces or automation logic). Items have a state and are used through events. - + The following Item types are currently available (alphabetical order): | Item Name | Description | Command Types | @@ -38,11 +36,12 @@ Cyclic membership is not forbidden but strongly not recommended. User interfaces might display Group Items as single entries and provide navigation to its members. Example for a Group Item as a simple collection of other Items: -``` + +```shell Group groundFloor Switch kitchenLight (groundFloor) Switch livingroomLight (groundFloor) -``` +``` ### Derive Group State from Member Items @@ -64,10 +63,10 @@ For available Group functions and examples see [Configuration Guide](../configur `DateTimeType` objects are parsed using Java's `SimpleDateFormat.parse()` using the first matching pattern: 1. `yyyy-MM-dd'T'HH:mm:ss.SSSZ` -2. `yyyy-MM-dd'T'HH:mm:ss.SSSz` -3. `yyyy-MM-dd'T'HH:mm:ss.SSSX` -4. `yyyy-MM-dd'T'HH:mm:ssz` -5. `yyyy-MM-dd'T'HH:mm:ss` +1. `yyyy-MM-dd'T'HH:mm:ss.SSSz` +1. `yyyy-MM-dd'T'HH:mm:ss.SSSX` +1. `yyyy-MM-dd'T'HH:mm:ssz` +1. `yyyy-MM-dd'T'HH:mm:ss` | Literal | Standard | Example | |---------|--------------------|---------------------------------------| @@ -124,25 +123,26 @@ Here is a short table demonstrating conversions for the examples above: ## Item Metadata -Sometimes additional information is required to be attached to Items for certain use-cases. +Sometimes additional information is required to be attached to Items for certain use-cases. This could be an application which needs some hints in order to render the Items in a generic way, or an integration with voice controlled assistants, or any other services which access the Items and need to understand their "meaning". -Such metadata can be attached to Items using disjunct namespaces so they won't conflict with each other. -Each metadata entry has a main value and optionally additional key/value pairs. -There can be metadata attached to an Item for as many namespaces as desired, like in the following example: +Such metadata can be attached to Items using disjunct namespaces so they won't conflict with each other. +Each metadata entry has a main value and optionally additional key/value pairs. +There can be metadata attached to an Item for as many namespaces as desired, like in the following example: - Switch MyFan "My Fan" { homekit="Fan.v2", alexa="Fan" [ type="oscillating", speedSteps=3 ] } +Switch MyFan "My Fan" { homekit="Fan.v2", alexa="Fan" [ type="oscillating", speedSteps=3 ] } The metdata can be included with the channel linking, an Alexa metadata mapping is added after the channel linking separated with a comma in the example for a ZWave switch below. -``` + +```shell Switch LightSwitch "Light Switch" {channel="zwave:device:22c99d1e:node3:switch_binary", alexa="PowerController.powerState"} -``` +``` The metadata can be maintained via a dedicated REST endpoint and is included in the `EnrichedItemDTO` responses. -Extensions which can infer some metadata automatically need to implement and register a `MetadataProvider` service in order to make them available to the system. -They may provision them from any source they like and also dynamically remove or add data. +Extensions which can infer some metadata automatically need to implement and register a `MetadataProvider` service in order to make them available to the system. +They may provision them from any source they like and also dynamically remove or add data. They are also not restricted to a single namespace. -The `MetadataRegistry` provides access for all extensions which need to read the Item metadata programmatically. +The `MetadataRegistry` provides access for all extensions which need to read the Item metadata programmatically. It is the central place where additional information about Items is kept. diff --git a/concepts/profiles.md b/concepts/profiles.md index 5fa9efda5..71a76a27e 100644 --- a/concepts/profiles.md +++ b/concepts/profiles.md @@ -5,30 +5,30 @@ title: Profiles # Profiles -The communication between the framework and the Thing handlers is managed by the "Communication Manager", which in turn uses "Profiles" to determined what exactly needs to be done. +The communication between the framework and the Thing handlers is managed by the "Communication Manager", which in turn uses "Profiles" to determined what exactly needs to be done. This provides some flexibility to influence these communication paths. -By their nature, profiles are correlated to links between Items and Channels (i.e. `ItemChannelLinks`). So if one Channel is linked to several Items it also will have several profile instances, each handling the communication to exactly one of these Items. -The same applies for the situation where one Item is linked to multiple Channels. +By their nature, profiles are correlated to links between Items and Channels (i.e. `ItemChannelLinks`). So if one Channel is linked to several Items it also will have several profile instances, each handling the communication to exactly one of these Items. +The same applies for the situation where one Item is linked to multiple Channels. -Profiles are created by ProfileFactories and are retained for the lifetime of their link. -This means that they are allowed to retain a transient state, like e.g. the timestamp of the the last event or the last state. +Profiles are created by ProfileFactories and are retained for the lifetime of their link. +This means that they are allowed to retain a transient state, like e.g. the timestamp of the the last event or the last state. With this, it is possible to take into account the temporal dimension when calculating the appropriate action in any situation. There exist two different kinds of profiles: state and trigger profiles. -### State Profiles +## State Profiles -State profiles are responsible for communication between Items and their corresponding state Channels (`ChannelKind.STATE`). +State profiles are responsible for communication between Items and their corresponding state Channels (`ChannelKind.STATE`). Their purpose is to forward state updates and commands to and from the Thing handlers. -### Trigger Profiles +## Trigger Profiles -Trigger Channels (`ChannelKind.TRIGGER`) by themselves do not maintain a state (as by their nature they only fire events). -With the help of trigger profiles they can be linked to Items anyway. -Hence the main purpose of a trigger profile is to calculate a state based on the fired events. -This state then is forwarded to the linked Item by sending `ItemStateEvents`. +Trigger Channels (`ChannelKind.TRIGGER`) by themselves do not maintain a state (as by their nature they only fire events). +With the help of trigger profiles they can be linked to Items anyway. +Hence the main purpose of a trigger profile is to calculate a state based on the fired events. +This state then is forwarded to the linked Item by sending `ItemStateEvents`. -Trigger profiles are powerful means to implement some immediate, straight-forward logic without the need to write any rules. +Trigger profiles are powerful means to implement some immediate, straight-forward logic without the need to write any rules. Apart from that, they do not pass any commands or state updates to and from the Thing handler as by their nature trigger Channels are not capable of handling these. diff --git a/concepts/things.md b/concepts/things.md index 2114a4f85..9145e3409 100644 --- a/concepts/things.md +++ b/concepts/things.md @@ -12,7 +12,7 @@ From a user perspective, they are relevant for the setup and configuration proce Things can have configuration properties, which can be optional or mandatory. Such properties can be basic information like an IP address, an access token for a web service or a device specific configuration that alters its behavior. -### Channels +## Channels Things provide "Channels", which represent the different functions the Thing provides. Where the Thing is the physical entity or source of information, the Channel is a concrete function from this Thing. @@ -23,17 +23,16 @@ Channels are linked to Items, where such links are the glue between the virtual Once such a link is established, a Thing reacts to events sent for an item that is linked to one of its Channels. Likewise, it actively sends out events for Items linked to its Channels. -### Bridges +## Bridges A special type of Thing is a "bridge". Bridges are Things that need to be added to the system in order to gain access to other Things. A typical example of a bridge is an IP gateway for some non-IP based home automation system or a web service configuration with authentication information which every Thing from this web service might need. -### Discovery +## Discovery As many Things can be automatically discovered, there are special mechanisms available that deal with the handling of [automatically discovered Things](discovery.html). - ## Thing Status Each Thing has a status object, which helps to identify possible problems with the device or service. @@ -93,4 +92,3 @@ The following table lists the different status details for each status: REMOVING NONENo further status details available. REMOVED NONENo further status details available. - diff --git a/concepts/units-of-measurement.md b/concepts/units-of-measurement.md index e8e011b60..0f61aa41a 100644 --- a/concepts/units-of-measurement.md +++ b/concepts/units-of-measurement.md @@ -3,8 +3,6 @@ layout: documentation title: Units Of Measurement --- -{% include base.html %} - # Units Of Measurement To express measured values in a scientific correct unit the framework supports units of measurement. @@ -41,29 +39,30 @@ The unit given in the state description is parsed and then used for conversion ( The framework assumes that the unit to parse is always the last token in the state description. If the parsing failed the locale-based default conversion takes place. - Number:Temperature temperature "Outside [%.2f °F]" { channel="...:current#temperature" } +`Number:Temperature temperature "Outside [%.2f °F]" { channel="...:current#temperature" }` In the example the `NumberItem` is specified to bind to Channels which offer values from the dimension `Temperature`. Without the dimension information the `NumberItem` only will receive updates of type `DecimalType` without a unit and any conversion. The state description defines two decimal places for the value and the fix unit °F. In case the state description should display the unit the binding delivers or the framework calculates through locale-based conversion the pattern will look like this: - "Outside [%.2f %unit%]" +`"Outside [%.2f %unit%]"` The special placeholder `%unit%` will then be replaced by the actual unit symbol. The placeholder `%unit%` can be placed anywhere in the state description. -#### Defining ChannelTypes +### Defining ChannelTypes In order to match `NumberItems` and Channels and define a default state description with unit placeholder the Channel also has to provide an Item type which includes the dimension information: - - - Number:Temperature - - Current temperature - - +```xml + + Number:Temperature + + Current temperature + + +``` The state description pattern "%.1f %unit%" describes the value format as floating point with one decimal place and also the special placeholder for the unit. @@ -80,7 +79,6 @@ The `org.openhab.core.library.dimension` and `javax.measure.quantity` packages p All units which are currently supported by default are listed in the tables below. - Imperial (base unit symbols): | Type | Unit | Symbol | @@ -213,7 +211,8 @@ Binary Prefixes: | Yobi | Yi | 2⁸⁰ | To use the prefixes simply add the prefix to the unit symbol - for example: -* milliAmpere - `mA` -* centiMetre - `cm` -* kiloWatt - `kW` -* KibiByte - `KiB` + +- milliAmpere - `mA` +- centiMetre - `cm` +- kiloWatt - `kW` +- KibiByte - `KiB` diff --git a/configuration/addons.md b/configuration/addons.md index 68f5aef72..60ff48c0e 100644 --- a/configuration/addons.md +++ b/configuration/addons.md @@ -2,8 +2,6 @@ layout: documentation --- -{% include base.html %} - # Installation of Add-ons Add-ons can be installed in different ways, described below. @@ -14,7 +12,7 @@ Log into your admin account (if not already done). Navigate to `Settings` and have a look for the add-ons section. Search for the desired add-on in the categories and press install. -![installing Add-ons through Paper UI](./images/InstallAddonsThroughUi.gif) +![installing Add-ons through UI](./images/InstallAddonsThroughUi.gif) ## Through Configuration Files @@ -72,7 +70,6 @@ binding = astro,network After saving the file, the add-on will be installed. - ## Through manually provided add-ons ::: warning Attention diff --git a/configuration/apitokens.md b/configuration/apitokens.md new file mode 100644 index 000000000..ae363143e --- /dev/null +++ b/configuration/apitokens.md @@ -0,0 +1,39 @@ +--- +layout: documentation +title: openHAB API tokens +--- + +# openHAB API tokens + +API tokens are an authentication method, like an username and password. +Usually you would use an API token to authenticate an external service or script. + +## Generate an API token + +Sign in to openHAB with your administrator username and password, by clicking on the sign-in button (bottem left). + +After signing in, click again on the profile button to access your profile page. +Click on Create new API token. + +![apitoken login](images/apitoken_login.png) + +Use your admin username and password and fill in the token name (e.g. the service you want to gain access for) and a Token Scope. + +![Create token](images/apitoken_create_token.png) + +Now the token is created. +Copy the complete token. + +![Token](images/apitoken_token.png) + +This token is in the used service your username, leave the password empty. +As example, below in NodeRed configuration the generated token is used as username. + +![Example](images/apitoken_example.png) + +## Overview of generated tokens + +In your profile overview page you can find an overview of generated tokens. +Additionally, they can be deleted here. + +![Overview](images/apitoken_overview_tokens.png) diff --git a/configuration/editors.md b/configuration/editors.md index 1c01b902d..b7437cfc1 100644 --- a/configuration/editors.md +++ b/configuration/editors.md @@ -3,8 +3,6 @@ layout: documentation title: Editors --- -{% include base.html %} - # Editors - Different Ways to Simplify Your Textual Configuration Currently there are several existing solutions, that can help you configuring your openHAB instance in a textual way. @@ -15,7 +13,7 @@ This documentation page can give you some guidance in choosing the right one for - TOC {:toc} -### Network Preparations +## Network Preparations Any editors used to configure openHAB need to be able to access the configuration files on the remote openHAB host. @@ -27,6 +25,7 @@ If you are using [openHABian]({{base}}/installation/openhabian.html), the networ *Attention Windows users:* Directly accessing network shares (UNC paths) is often not supported. Please be sure to mount the network share to a drive letter. {: #openhab-vscode} + ## openHAB VS Code Extension openHAB VS Code is an extension for the [Visual Studio Code](https://code.visualstudio.com) editor. @@ -37,10 +36,11 @@ You can find it in the [Microsoft Visual Studio Marketplace](https://marketplace ### Installation 1. Install [Visual Studio Code](https://code.visualstudio.com/Download) on your desktop computer (not on the openHAB host) -2. Open the extension sidebar. ![openHAB VS Code Extension alternative installation](images/vscode_extensiontab_icon.png) -3. Search for openHAB and install the extension. +1. Open the extension sidebar. + ![openHAB VS Code Extension alternative installation](images/vscode_extensiontab_icon.png) +1. Search for openHAB and install the extension. -[Visit the Extensions GitHub Page for further Informations](https://github.com/openhab/openhab-vscode/blob/master/README.md "GitHub Repo for the VS Code Extension") +[Visit the Extensions GitHub Page for further Informations](https://github.com/openhab/openhab-vscode/blob/main/README.md "GitHub Repo for the VS Code Extension") ### Rule Validation @@ -50,6 +50,7 @@ The validation needs a running openHAB installation in your environment and can You can find all important information in the extensions [readme file](https://github.com/openhab/openhab-vscode#validating-the-rules). {: #others} + ## Other Editor Integrations The here summarized projects provide syntax highlighting for different text editors, but have no _on top_ functionality. @@ -60,6 +61,7 @@ mcedit is an editor which comes with mc (Midnight Commander). You can find the syntax files and installation instructions on [openhab-mcedit](https://github.com/CWempe/openhab-mcedit). {: #notepadpp} + ### Notepad++ Notepad++ is a free source code editor for Windows. @@ -85,4 +87,3 @@ You can find the syntax file and installation instructions on [openhab-syntax-te BBEdit is a text and code editor for macOS and the offical successor of TextWrangler. You can find the syntax file and installation instructions on [BBEdit-openHAB-language](https://github.com/mjmeijer/BBEdit-openHAB-language). - diff --git a/configuration/habmin.md b/configuration/habmin.md deleted file mode 100644 index 64a56079f..000000000 --- a/configuration/habmin.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -layout: documentation -title: Configuration though HABmin ---- - -{% include base.html %} - -# Configuration through HABmin - -HABmin is a modern, professional and portable user interface for openHAB, -providing both user and administrative functions (eg sitemaps for users, and configuration utilities -to aid setup). - -Please refer to the [HABmin Addon documentation]({{docu}}/addons/uis/habmin/readme.html). - -{% include contribution-wanted.html %} diff --git a/configuration/habpanel.md b/configuration/habpanel.md index 340df1ad6..f7502fc93 100644 --- a/configuration/habpanel.md +++ b/configuration/habpanel.md @@ -1,7 +1,7 @@ --- layout: documentation title: HABPanel -source: https://github.com/openhab/org.openhab.ui.habpanel/blob/master/doc/habpanel.md +source: https://github.com/openhab/openhab-webui/blob/main/bundles/org.openhab.ui.habpanel/doc/habpanel.md --- {% include base.html %} diff --git a/configuration/images/apitoken_create_token.png b/configuration/images/apitoken_create_token.png new file mode 100644 index 000000000..cbaf50a6f Binary files /dev/null and b/configuration/images/apitoken_create_token.png differ diff --git a/configuration/images/apitoken_example.png b/configuration/images/apitoken_example.png new file mode 100644 index 000000000..f897fde8c Binary files /dev/null and b/configuration/images/apitoken_example.png differ diff --git a/configuration/images/apitoken_login.png b/configuration/images/apitoken_login.png new file mode 100644 index 000000000..3e0a4b6f8 Binary files /dev/null and b/configuration/images/apitoken_login.png differ diff --git a/configuration/images/apitoken_overview_tokens.png b/configuration/images/apitoken_overview_tokens.png new file mode 100644 index 000000000..e0dd5a591 Binary files /dev/null and b/configuration/images/apitoken_overview_tokens.png differ diff --git a/configuration/images/apitoken_token.png b/configuration/images/apitoken_token.png new file mode 100644 index 000000000..889d6aaa1 Binary files /dev/null and b/configuration/images/apitoken_token.png differ diff --git a/configuration/images/eclipseiotmarket_addons.png b/configuration/images/eclipseiotmarket_addons.png index 90482346d..8c4400ac9 100644 Binary files a/configuration/images/eclipseiotmarket_addons.png and b/configuration/images/eclipseiotmarket_addons.png differ diff --git a/configuration/images/eclipseiotmarket_configuration.png b/configuration/images/eclipseiotmarket_configuration.png index 0c94169f9..8df56768c 100644 Binary files a/configuration/images/eclipseiotmarket_configuration.png and b/configuration/images/eclipseiotmarket_configuration.png differ diff --git a/configuration/images/eclipseiotmarket_listings.png b/configuration/images/eclipseiotmarket_listings.png index 1ec0ae04d..54e3782bb 100644 Binary files a/configuration/images/eclipseiotmarket_listings.png and b/configuration/images/eclipseiotmarket_listings.png differ diff --git a/configuration/images/paperui1.png b/configuration/images/paperui1.png index 49515eec2..15c10ac7f 100644 Binary files a/configuration/images/paperui1.png and b/configuration/images/paperui1.png differ diff --git a/configuration/images/paperui2.png b/configuration/images/paperui2.png index c42cec58e..6c321e10d 100644 Binary files a/configuration/images/paperui2.png and b/configuration/images/paperui2.png differ diff --git a/configuration/images/paperui3.png b/configuration/images/paperui3.png index 2e4df575a..3f86311a0 100644 Binary files a/configuration/images/paperui3.png and b/configuration/images/paperui3.png differ diff --git a/configuration/images/ruleengine.png b/configuration/images/ruleengine.png index f7bd7c80c..6b1e4fc75 100644 Binary files a/configuration/images/ruleengine.png and b/configuration/images/ruleengine.png differ diff --git a/configuration/images/rules_ng_addons.png b/configuration/images/rules_ng_addons.png deleted file mode 100644 index a1a759ae4..000000000 Binary files a/configuration/images/rules_ng_addons.png and /dev/null differ diff --git a/configuration/images/rules_ng_new_rule.png b/configuration/images/rules_ng_new_rule.png deleted file mode 100644 index d40318ccd..000000000 Binary files a/configuration/images/rules_ng_new_rule.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_colorpicker.png b/configuration/images/sitemap_demo_colorpicker.png deleted file mode 100644 index 82702496a..000000000 Binary files a/configuration/images/sitemap_demo_colorpicker.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_colors.png b/configuration/images/sitemap_demo_colors.png deleted file mode 100644 index dc0d735a5..000000000 Binary files a/configuration/images/sitemap_demo_colors.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_frame.png b/configuration/images/sitemap_demo_frame.png deleted file mode 100644 index f4b2d1271..000000000 Binary files a/configuration/images/sitemap_demo_frame.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_fullexample.png b/configuration/images/sitemap_demo_fullexample.png deleted file mode 100644 index 4083a15c2..000000000 Binary files a/configuration/images/sitemap_demo_fullexample.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_group.png b/configuration/images/sitemap_demo_group.png deleted file mode 100644 index a1678eef4..000000000 Binary files a/configuration/images/sitemap_demo_group.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_image.png b/configuration/images/sitemap_demo_image.png deleted file mode 100644 index 04e900716..000000000 Binary files a/configuration/images/sitemap_demo_image.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_mapview.png b/configuration/images/sitemap_demo_mapview.png deleted file mode 100644 index cbd28dd50..000000000 Binary files a/configuration/images/sitemap_demo_mapview.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_selection.png b/configuration/images/sitemap_demo_selection.png deleted file mode 100644 index 0307395cb..000000000 Binary files a/configuration/images/sitemap_demo_selection.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_setpoint.png b/configuration/images/sitemap_demo_setpoint.png deleted file mode 100644 index b94bf2198..000000000 Binary files a/configuration/images/sitemap_demo_setpoint.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_slider.png b/configuration/images/sitemap_demo_slider.png deleted file mode 100644 index d41b46e69..000000000 Binary files a/configuration/images/sitemap_demo_slider.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_switch1.png b/configuration/images/sitemap_demo_switch1.png deleted file mode 100644 index 40fb622b1..000000000 Binary files a/configuration/images/sitemap_demo_switch1.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_switch2.png b/configuration/images/sitemap_demo_switch2.png deleted file mode 100644 index 9c103cb92..000000000 Binary files a/configuration/images/sitemap_demo_switch2.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_text.png b/configuration/images/sitemap_demo_text.png deleted file mode 100644 index 92d407ab2..000000000 Binary files a/configuration/images/sitemap_demo_text.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_video.png b/configuration/images/sitemap_demo_video.png deleted file mode 100644 index 0f5a8c754..000000000 Binary files a/configuration/images/sitemap_demo_video.png and /dev/null differ diff --git a/configuration/images/sitemap_demo_webview.png b/configuration/images/sitemap_demo_webview.png deleted file mode 100644 index 0d83b2f09..000000000 Binary files a/configuration/images/sitemap_demo_webview.png and /dev/null differ diff --git a/configuration/images/smarthome-designer-05.png b/configuration/images/smarthome-designer-05.png index 580cabc83..e7637e3dc 100644 Binary files a/configuration/images/smarthome-designer-05.png and b/configuration/images/smarthome-designer-05.png differ diff --git a/configuration/images/smarthome-designer-10.png b/configuration/images/smarthome-designer-10.png index 2fa5de50c..564c577b7 100644 Binary files a/configuration/images/smarthome-designer-10.png and b/configuration/images/smarthome-designer-10.png differ diff --git a/configuration/images/smarthome-designer-15.png b/configuration/images/smarthome-designer-15.png index 77d9daeb7..238c6ae77 100644 Binary files a/configuration/images/smarthome-designer-15.png and b/configuration/images/smarthome-designer-15.png differ diff --git a/configuration/images/smarthome-designer-20.png b/configuration/images/smarthome-designer-20.png index a4d370ce3..90d7dc525 100644 Binary files a/configuration/images/smarthome-designer-20.png and b/configuration/images/smarthome-designer-20.png differ diff --git a/configuration/images/ui_rules_dsl_test_example.png b/configuration/images/ui_rules_dsl_test_example.png index 2441efcfb..2797d4770 100644 Binary files a/configuration/images/ui_rules_dsl_test_example.png and b/configuration/images/ui_rules_dsl_test_example.png differ diff --git a/configuration/images/ui_rules_dsl_test_example_action.png b/configuration/images/ui_rules_dsl_test_example_action.png index 30ace8caa..6a4deaa09 100644 Binary files a/configuration/images/ui_rules_dsl_test_example_action.png and b/configuration/images/ui_rules_dsl_test_example_action.png differ diff --git a/configuration/images/ui_rules_dsl_test_example_dsl.png b/configuration/images/ui_rules_dsl_test_example_dsl.png index d34c00a1d..5c21810ac 100644 Binary files a/configuration/images/ui_rules_dsl_test_example_dsl.png and b/configuration/images/ui_rules_dsl_test_example_dsl.png differ diff --git a/configuration/images/vscode_extensiontab_icon.png b/configuration/images/vscode_extensiontab_icon.png index db4f5dced..120164f84 100644 Binary files a/configuration/images/vscode_extensiontab_icon.png and b/configuration/images/vscode_extensiontab_icon.png differ diff --git a/configuration/index.md b/configuration/index.md index 7c8e7d01b..5039b95cf 100644 --- a/configuration/index.md +++ b/configuration/index.md @@ -18,7 +18,6 @@ In order to represent all of these, openHAB defines the following base component - [Things](things.html) - Your devices represented in openHAB - [Items](items.html) - properties and capabilities of your Things - [Groups](items.html#groups) - collections or categories containing Items -- [Sitemaps](sitemaps.html) - User-defined frontend interfaces to arrange Groups, Items and more - [Transformations](transform.html) - Helper functions to transform your data - [Persistence](persistence.html) - Services to store data over time - [Rules](rules-dsl.html) - Automation logic, the "smart" in your Smart Home! @@ -27,6 +26,12 @@ In order to represent all of these, openHAB defines the following base component The individual articles have all the details needed to understand the concepts behind these building blocks for your Smart Home. For more details on the basic concepts behind openHAB, please visit the [Concepts Overview page](/docs/concepts/index.html). +::: tip + +This section does not cover building user interfaces; this subject has its own section: [User Interfaces](/docs/ui/) + +::: + ## Versatility openHAB 3 provides a _single_ graphical user interface to modify settings, to manage your components and rules, and to provide a UI for users. @@ -34,11 +39,12 @@ openHAB 3 provides a _single_ graphical user interface to modify settings, to ma While there are no full-scale starter and migration tutorials available yet, see the [recording of the recent 2020 openHAB virtual meetup](https://www.youtube.com/watch?v=pwZ8AOwRDEk) for a tour of the new Main UI (starting at 26:26). ::: tip Important changes for openHAB 2 users
-PaperUI and HABmin are no longer supported, they are replaced by the new Main UI. +PaperUI and HABmin are no longer supported, they are replaced by the new Main UI.
It also provides flexible charting now so you won't require Grafana or a similar external tool any more.
-v1 bindings are no longer available. The expire binding's functionality is now part of the core (item configuration stays the same).
+v1 bindings are no longer available, see [this list](https://github.com/openhab/openhab-addons/issues/6179#migrated) what has been migrated to OH3.
+The expire binding's functionality is now part of the core (item configuration stays the same).
File-based configuration is still available, but we recommend that everyone start over with a fresh setup built using the new Main UI.
-_Note there is an option in Main UI to bulk create Items where you can copy'n'paste the contents of your .items files._ +_Note there is an option in Main UI to bulk create Items where you can copy'n'paste the contents of your `.items` files._ ::: @@ -86,7 +92,7 @@ _Note there is an option in Main UI to bulk create Items where you can copy'n'pa - + @@ -128,11 +134,11 @@ _Note there is an option in Main UI to bulk create Items where you can copy'n'pa ### Textual vs. Graphical Configuration -In openHAB 1.x, smart home configuration was done via configuration files only. +In openHAB 1, smart home configuration was done via configuration files only. openHAB 2 added the general administrative web interface "Paper UI", and openHAB 3 now further streamlines input capabilities with "Main UI". Things and Items can still be defined either in configuration files or via the GUI. We highly recommend adding them to the [system database](/docs/administration/jsondb.html) via Main UI, though. -Note there is an option in Main UI to bulk create Things and Items by copy and pasting the contents of existing .things/.items files. +Note there is an option in Main UI to bulk create Items by copy and pasting the contents of existing `.items` files. Bulk delete is there, too. _Be sure to try out Semantic Modeling in Main UI_. @@ -157,15 +163,14 @@ All text files must be created with UTF-8 encoding. When using Visual Studio Cod Here are some hints to avoid some common pitfalls when starting out. -* Start by modelling your house using a Semantic Model in Main UI. +- Start by modelling your house using a Semantic Model in Main UI. Use it to create groups for rooms and apply proper semantic tags right away. - This will ultimately save a lot of setup work, as it will allow for group functions such as "switch off lights in _kitchen_" or _ground floor_ or _house_" and + This will ultimately save a lot of setup work, as it will allow for group functions such as "switch off lights in _kitchen_" or _ground floor_ or _house_ and also enable voice assistants to properly execute your instructions. Be careful to apply a consistent naming scheme right in the beginning. -* Use Main UI to manage Things. Remember that once initially configured, their configuration will not change much over time. -* Run autodiscovery for _Things_ wherever offered so that you don't have to enter all of them manually -* Also use Main UI to manage Items. +- Use Main UI to manage Things. Remember that once initially configured, their configuration will not change much over time. +- Run autodiscovery for _Things_ wherever offered so that you don't have to enter all of them manually +- Also use Main UI to manage Items. You can use the import function to import `.items` files or snippets taken from other sources like the openHAB community forum. -* Use VS code extensions to [edit rules, items and sitemap files](editors.html). +- Use VS code extensions to [edit rules, items and sitemap files](editors.html). You can also use any text editor or cloud based tool, but VS code extensions will work locally and help you by highlighting and cross-checking the file syntax. - diff --git a/configuration/items.md b/configuration/items.md index 769588715..13aad2f95 100644 --- a/configuration/items.md +++ b/configuration/items.md @@ -3,8 +3,6 @@ layout: documentation title: Items --- -{% include base.html %} - # Items In openHAB Items represent all properties and capabilities of the user’s home automation. @@ -32,9 +30,9 @@ For example, an Item bound to a sensor receives updated sensor readings and an I There are two methods for defining Items: -1. Through UI +1. Through UI -2. Through text `.items` files located in the `$OPENHAB_CONF/items` folder. +1. Through text `.items` files located in the `$OPENHAB_CONF/items` folder. Files here must have the extension `.items`; you may create as many `.items` files as needed. However, each Item must be unique across all `.items` files. Refer to the [installation docs]({{base}}/installation/index.html) to determine your specific installation's folder structure. @@ -51,6 +49,7 @@ It's recommended to edit `.items` files using one of the [openHAB supporting edi Doing so will provide you with full IDE support including features such as syntax checking, and context assistance. {: #syntax} + ## Item Definition and Syntax Items are defined using the following syntax: @@ -68,7 +67,7 @@ itemtype itemname "labeltext [stateformat]" (group1, group2, ...) ["t **Examples:** ```java -Switch Kitchen_Light "Kitchen Light" {mqtt="<[...], >[...]" } +Switch Kitchen_Light "Kitchen Light" {channel="mqtt:topic:..." } String Bedroom_Sonos_CurrentTitle "Title [%s]" (gBedRoom) {channel="sonos:..."} Number Bathroom_WashingMachine_Power "Power [%.0f W]" (gPower) {channel="homematic:..."} @@ -89,6 +88,7 @@ The last example above defines an Item with the following fields: The remainder of this article provides additional information regarding Item definition fields. {: #type} + ### Type The Item type defines what kind of state can be stored in that Item and which commands the Item will accept. @@ -145,6 +145,7 @@ In the example above, if you move the Slider widget to 60%, move the Switch to O --> {: #name} + ### Name The Item name is used to uniquely identify an Item. @@ -164,14 +165,14 @@ An Item naming scheme with a physical or logical top-down will ensure you can ea The following naming style guide is recommended: -- Words build a physical or logical hierarchy +- Words build a physical or logical hierarchy -- Every word of the Item name starts with an uppercase letter +- Every word of the Item name starts with an uppercase letter -- Words should be separated by an underscore character, except for words that logically belong together +- Words should be separated by an underscore character, except for words that logically belong together -- Names that reoccur frequently, such as the names of rooms or appliances, may be abbreviated to reduce overall name length. -(Example: Bathroom = BR) +- Names that reoccur frequently, such as the names of rooms or appliances, may be abbreviated to reduce overall name length. + (Example: Bathroom = BR) Examples: @@ -187,9 +188,9 @@ Examples: Users are encouraged to apply the style guide above to group names as well as Item names. Two naming schemes are established in the community for Group names: -1. Use a plural word form (e.g. Batteries) where possible. +1. Use a plural word form (e.g. Batteries) where possible. Otherwise the word "Group" may be appended for clarity. -2. Prepend a lowercase "g" to the name (e.g. gBattery) +1. Prepend a lowercase "g" to the name (e.g. gBattery) | Group Name | Interpretation | |-------------------------------------------|-----------------------------------------------------------------------| @@ -199,6 +200,7 @@ Two naming schemes are established in the community for Group names: | "`Livingroom`" or "`gLR`" | Group for *all* Items (including lights) belonging to the living room | {: #label} + ### Label Label text is used to describe an Item in a human-readable way. @@ -215,28 +217,31 @@ Number Livingroom_Temperature "Temperature [%.1f °C]" Channel labels can be overwritten by Item definitions and Item labels can be overwritten in [Sitemaps]({{base}}/configuration/sitemaps.html#element-types). {: #state} + ### State The state of an Item depends on the Item type, the Channel bound to the Item, and internal or external events. A analogy can be drawn between the state of an Item and the value of a variable in a computer program. {: #item-state} + #### Item State This section provides information about what a user can expect regarding the behavior of the state of an Item. -- Items are created with a state of `NULL` +- Items are created with a state of `NULL` -- Operations in openHAB such as a user interacting with the Item using the Basic UI, or a Binding updating the state of an Item will change the state of the Item +- Operations in openHAB such as a user interacting with the Item using the Basic UI, or a Binding updating the state of an Item will change the state of the Item -- An Item's state may also be set through a Binding which may be reacting to changes in the real world +- An Item's state may also be set through a Binding which may be reacting to changes in the real world -- A Binding may set the state of an Item to `UNDEF` if it looses communications with a Thing (for example, a Z-wave doorbell with a dead battery). -The Binding may also set the state to `UNDEF` if an error exists in the binding configuration, or under other conditions +- A Binding may set the state of an Item to `UNDEF` if it looses communications with a Thing (for example, a Z-wave doorbell with a dead battery). + The Binding may also set the state to `UNDEF` if an error exists in the binding configuration, or under other conditions *N.B.* Many openHAB users find that it can be very useful to use [Persistence](/addons/#persistence) and [System started]({{base}}/configuration/rules-dsl.html#system-based-triggers) rules so that their systems behaves in a predictable way after an openHAB restart. {: #command-vs-status} + #### Command vs. Status Users should bear in mind the difference between an Item used to send a command to a Thing, and an Item that reflects the status of a real-world Thing in the UI. @@ -258,6 +263,7 @@ Then you add the light-level Item to your UI. Now when you send the Switch Item command, and you see a corresponding increase in light level in the room, you know for sure that your command has been received and acted upon, because you have a return status Item in your UI. {: #state-presentation} + #### State Presentation The Item definition determines the Item's textual state presentation, e.g., regarding formatting, decimal places, unit display and more. @@ -286,6 +292,7 @@ Location My_Location "My Location [%2$s°N %3$s°E %1$sm]" // e.g. ``` {: #state-transformation} + #### State Transformation Transformations can be used in the state part of an Item, to translate the raw state of an Item into another language, or to convert technical values into human readable information. @@ -299,6 +306,7 @@ Contact Livingroom_Window "Ventana del salón [MAP(window_esp.map):%s]" Please refer to the article on [Transformations](/docs/configuration/transformations.html) for more usage details and a list of available transformation services. {: #icons} + ### Icons The icon name is used by openHAB to select the image to display next to an Item name when using one of openHAB's UIs, e.g. Basic UI. @@ -332,6 +340,7 @@ Note that image files with the wrong file ending will be ignored. Users may substitute their own icon for an icon from the default icon set by placing a file in the `$OPENHAB_CONF/icons/classic/` folder with the same filename as the name of the icon being substituted. {: #icons-dynamic} + #### Dynamic Icons Some icons are dynamically selected by openHAB depending on the Item's state. @@ -353,15 +362,15 @@ Dynamic icon filenames follow the pattern below: Dynamic icon sets may consist of as many state-specific icon files as needed. Each set must meet the following criteria: -- A default icon is mandatory. +- A default icon is mandatory. The default icon filename is the name of the icon without a hyphen or state (e.g. `switch.svg`) -- Icon filenames must follow the naming restrictions given for [icons](#icons) above +- Icon filenames must follow the naming restrictions given for [icons](#icons) above -- The state name must reflect the Item's raw state. +- The state name must reflect the Item's raw state. [Transformations](#state-transformation) applied in the state presentation definition of the Item have no influence on icon selection. -- The state portion of the icon name must be in lowercase letters +- The state portion of the icon name must be in lowercase letters **Example:** @@ -403,6 +412,7 @@ For a dimmable light (0-100%), you might provide icons as in the example: Just as with regular icons, user-defined dynamic icon sets may be configured via the custom icons folder `$OPENHAB_CONF/icons/classic/`. {: #groups} + ### Groups The Group is a special Item type that can be used to define a category or collection into which you can combine other Items or Groups. @@ -416,12 +426,12 @@ Group groupname ["labeltext"] [] [(group1, group2, ...)] The Group item is commonly used to define hierarchies of Items from different perspectives. For example: -- Location-oriented or physical perspective: - - Floors in your house → Rooms on that floor → An appliance in that room... +- Location-oriented or physical perspective: + - Floors in your house → Rooms on that floor → An appliance in that room... -- Functional or logical perspective: - - Maintenance Group → All battery states → Individual battery states in percentage - - Further examples: all lights, all room temperatures, combined power consumption +- Functional or logical perspective: + - Maintenance Group → All battery states → Individual battery states in percentage + - Further examples: all lights, all room temperatures, combined power consumption These relationships can be exploited in [Sitemaps]({{base}}/configuration/sitemaps.html) or in [automation rules]({{base}}/configuration/rules-dsl.html) to navigate through the hierarchically organized Items or to perform computations and updates on subsets of similar Items. @@ -455,6 +465,7 @@ Because of the hierarchical structure of your group items, the rule will be clea Additionally, the rule will not need to be modified when a new Item is added to the `Temperatures` group. {: #group-type} + ### Derive Group State from Member Items As you are now aware, an Item can have a state (e.g. "ON", "OFF"). @@ -492,13 +503,13 @@ Incompatible Item types within a Group may result in the invalid aggregation res Examples for derived states on Group Items when declared in the Item DSL: ```java -Group:Number Lights "Active Lights [%d]" // e.g. "2" -Group:Switch:OR(ON,OFF) Lights "Active Lights [%d]" // e.g. ON and "2" -Group:Switch:AND(ON,OFF) Lights "Active Lights [%d]" // e.g. ON and "2" -Group:Number:AVG Temperatures "All Room Temperatures [%.1f °C]" // e.g. "21.3 °C" -Group:DateTime:EARLIEST LatestUpdate "Latest Update [%1$tY.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" -Group:DateTime:LATEST LastSeen "Last Seen [%1$tY.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" -Group:String:COUNT("OFFLINE") OfflineDevices "Offline Devices [%d]" // e.g. "2" +Group:Number Lights "Active Lights [%d]" // e.g. "2" +Group:Switch:OR(ON,OFF) Lights "Active Lights [%d]" // e.g. ON and "2" +Group:Switch:AND(ON,OFF) Lights "Active Lights [%d]" // e.g. ON and "2" +Group:Number:AVG Temperatures "All Room Temperatures [%.1f °C]" // e.g. "21.3 °C" +Group:DateTime:EARLIEST LatestUpdate "Latest Update [%1$tY.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" +Group:DateTime:LATEST LastSeen "Last Seen [%1$tY.%1$tm.%1$tY %1$tH:%1$tM:%1$tS]" +Group:String:COUNT("OFFLINE") OfflineDevices "Offline Devices [%d]" // e.g. "2" ``` The first three examples above compute the number of active lights and store them as group state. @@ -518,6 +529,7 @@ The `EARLIEST` function returns `now().minusDays(10)`, the `LATEST` function ret The last Group counts all members of it matching the given regular expression, here any character or state (simply counts all members). {: #tags} + ### Tags Tags added to an Item definition allow a user to characterize the specific nature of the Item beyond its basic Item type. @@ -538,6 +550,7 @@ Tags will be ignored if no Items in the openHAB installation support it. See the [Hue Emulation Service](/addons/integrations/hueemulation/) or [HomeKit Add-on](/addons/integrations/homekit/) documentation for more details. {: #binding} + ### Binding Configuration One of the greatest strengths of an openHAB automation system is the sheer number of devices you can interact with. @@ -558,11 +571,11 @@ Each Thing has one or more Channels, and Items are linked to one or more Channel There are two different kinds of channels: - State Channels will, as soon as linked to the Item, update the state of it and/or listen for Commands you send to it. -For example, if you have a `Player` Item, a State Channel could be responsible for propagating the state of an audio player (`PLAYING`, `PAUSED`) to your Item as well as listening for proper Commands (`PLAY`, `PAUSE`, `PREVIOUS`, `NEXT`) + For example, if you have a `Player` Item, a State Channel could be responsible for propagating the state of an audio player (`PLAYING`, `PAUSED`) to your Item as well as listening for proper Commands (`PLAY`, `PAUSE`, `PREVIOUS`, `NEXT`) - Trigger Channels will only send events that won't have any effect on the Item unless you treat them with Rules or use a Trigger Profile to do state changes or commands based on your event. -For example, when you use a Binding that integrates buttons or wall switches, a Trigger Channel could be responsible for sending a `PRESSED` event when someone is pressing the button of the device. -This event on its own won't change anything on the Item, but you could use, for example, the Trigger Profile "rawbutton-toggle-switch" to toggle a lamp on or off when the button is clicked. -Also, you could e.g. define a Rule that is triggered by this event and calculates the color of the lamp based on the sun position. + For example, when you use a Binding that integrates buttons or wall switches, a Trigger Channel could be responsible for sending a `PRESSED` event when someone is pressing the button of the device. + This event on its own won't change anything on the Item, but you could use, for example, the Trigger Profile "rawbutton-toggle-switch" to toggle a lamp on or off when the button is clicked. + Also, you could e.g. define a Rule that is triggered by this event and calculates the color of the lamp based on the sun position. Some Bindings support automatic discovery of Things, in which case discovered Things will appear in the Inbox in the UI. Once accepted, the new Thing will appear under Settings > Things. @@ -604,13 +617,16 @@ Commands and Updates from and to these Items will be combined, and can be used i Example: ```java -Switch Office_PC {channel="lgwebos:WebOSTV:01dd3ac4-62f4-7505-208b-12345679", channel="network:servicedevice:6d5de4e65d"} +Switch Office_PC { + channel="lgwebos:WebOSTV:01dd3ac4-62f4-7505-208b-12345679", + channel="network:servicedevice:6d5de4e65d" +} ``` The first example shows a symbiosis of the LG webOS Binding and the Wake-on-LAN Binding to interact with a TV. - {: #autoupdate} + #### Parameter `autoupdate` When left as default, openHAB's `autoupdate` function attempts to predict the outcome of a *command* on the Item *state*. @@ -626,6 +642,7 @@ Switch Garage_Gate {channel="xxx", autoupdate="false"} ``` {: #expire} + #### Parameter `expire` This parameter allows to post an update or command to an item after a period of time has passed. @@ -635,7 +652,7 @@ Any future expiring update or command is cancelled, if the item receives an upda The parameter accepts a duration of time that can be a combination of hours, minutes and seconds in the format -``` +```shell expire="1h 30m 45s" expire="1h05s" expire="55h 59m 12s" @@ -647,7 +664,7 @@ Whitespaces are allowed between the sections. This duration can optionally be followed by a comma and the state or command to post, when the timer expires. If this optional section is not present, it defaults to the Undefined (`UnDefType.UNDEF`) state. -``` +```shell Player MyPlayer { expire="1h,command=STOP" } // send STOP command after one hour Number MyChannel { expire="5m,state=0" } // update state to 0 after five minutes String MyMessage { expire="3m12s,Hello" } // update state to Hello after three minutes and 12 seconds @@ -667,7 +684,7 @@ You can use *State Profiles* on State Channels and *Trigger Profiles* on Trigger Profiles can be specified as a parameter for a given Channel on the Item configuration: ```java - MyItem { channel="::MyThing:myChannel"[profile="", ="MyValue", ...]} + MyItem { channel="::MyThing:myChannel"[profile="system:", ="MyValue", ...]} ``` There are some built-in Profiles available which are described in the table below. @@ -678,12 +695,15 @@ If this is the case, you will find those within the documentation of the Binding Also, all [Transformation Services](/addons/#transform) provide a State Profile which allows you to do the transformation already on item-level instead doing it with a [Sitemap]({{base}}/configuration/sitemaps.html). You can find the documentation of these Profiles within the [Add-On documentation of the Transformation Service](/addons/#transform) you would like to use. -| ID | Type | Supported Item Types | Description | +| Profile ID | Type | Supported Item Types | Description | |-----------------------------------------------------------------------------------------------|---------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `default` | State | All | If you don't specify any Profile, this Profile will be used. For State Channels, this means that states and commands are just propagated from the Channel to the Item and vice versa without any changes. For Trigger Channels, the Default Profile won't change anything on the Item. | | `follow` | State | All | If one device should "follow" the actions of another device, this can be used. The term "follow" in this case means that any state that is sent to an Item will be forwarded from this Item to any linked Channel with the `follow` Profile. It takes state updates on an Item and sends them as a command onto the Channel. In the direction from the ThingHandler towards the Item, this Profile ignores state updates. | | `hysteresis` | State | Switch | The `hysteresis` Profile can be configured via three parameters: `lower` (**mandatory**) `QuantityType` or `DecimalType`, `upper` (optional) `QuantityType` or `DecimalType`, `inverted` (optional) `boolean`. This Profile can be used to trigger alarms when number values exceed a given `lower` bound - sends `ON` to the Switch Item. By defining an additional `upper` bound it can provide kind of anti-flapping. The `inverted` parameter negates the resulting State of the Switch. | -| `offset` | State | Number | An offset can be specified via the parameter `offset` which has to be a `QuantityType` or `DecimalType`. The specificed offset will be applied to the value from the device before it arrives at the Item. | +| `offset` | State | Number | An offset can be specified via the parameter `offset` which has to be a `QuantityType` or `DecimalType`. The specified offset will be applied to the value from the device before it arrives at the Item. | +| `range` | State | Switch | The `range` Profile can be used to trigger alarms when number values exceed given limits (`lower` and `upper` bounds). It sends ON to a Switch Item. There are three parameters: `lower` and `upper` (**mandatory**) `QuantityType` or `DecimalType` and `inverted` (optional) `boolean`. | +| `timestamp-update` | State | DateTime | This Profile will update a DateTime Item to track every update of the state of a given Channel, whatever the state is. | +| `timestamp-change` | State | DateTime | This Profile will update a DateTime Item to track every change of the state of a given Channel. | | `rawbutton-on-off-switch` | Trigger | Color, Dimmer, Switch | This Profile can only be used on Channels of the type `system.rawbutton`. On those Channels, it will set the Item state to `ON` when a `PRESSED` event arrives and to `OFF` when a `RELEASED` event arrives. | | `rawbutton-toggle-player` | Trigger | Player | This Profile can only be used on Channels of the type `system.rawbutton`. On those Channels, it will toggle the Player Item state between `PLAY` and `PAUSE` when `PRESSED` events arrive. | | `rawbutton-toggle-rollershutter` | Trigger | Rollershutter | This Profile can only be used on Channels of the type `system.rawbutton`. On those Channels, it will toggle the Rollershutter Item state between `UP` and `DOWN` when `PRESSED` events arrive. | @@ -692,16 +712,15 @@ You can find the documentation of these Profiles within the [Add-On documentatio | `rawrocker-to-dimmer` | Trigger | Dimmer | Same as `rawrocker-to-on-off`, but additionally it allows to dim by holding the respective button. Technically, this Profile sends an `INCREASE` or `DECREASE` Command every 500 milliseconds while you hold. | | `rawrocker-to-play-pause`, `rawrocker-to-next-previous` and `rawrocker-to-rewind-fastforward` | Trigger | Player | These Profiles can only be used on Channels of the type `system.rawrocker` and Player Items. They will convert a press on the first rocker button to an `PLAY` / `NEXT` / `FASTFORWARD` command while the second one will be converted to an `PAUSE` / `PREVIOUS` / `REWIND` command. | | `rawrocker-to-stop-move` and `rawrocker-to-up-down` | Trigger | Rollershutter | These Profiles can only be used on Channels of the type `system.rawrocker` and Rollershutter Items. They will convert a press on the first rocker button to an `MOVE` / `UP` command while the second one will be converted to an `STOP` / `DOWN` command. | -| `timestamp-update` | State | All | This Profile will update a DateTime Item to track every update of the state of a given Channel, whatever the state is. | -| `timestamp-change` | State | All | This Profile will update a DateTime Item to track every change of the state of a given Channel. | -##### Example 1 +##### Basic Example You have an Item called `Bedroom_Light` that is connected to a Hue lamp ```java Color Bedroom_Light { channel="hue:0210:1:bulb1:color" } ``` + and a [Rule]({{base}}/configuration/rules-dsl.html) to toggle this light with a serial button: ```java @@ -718,22 +737,32 @@ end Instead of using this Rule, you can also use the `rawbutton-toggle-switch` Profile in combination with [Multi-Channel Linking](#multi-binding-channel-linkage): ```java -Color Bedroom_Light { channel="hue:0210:1:bulb1:color", channel="serialbutton:button:mybutton:button" [profile="rawbutton-toggle-switch"] } +Color Bedroom_Light { + channel="hue:0210:1:bulb1:color", + channel="serialbutton:button:mybutton:button" [profile="system:rawbutton-toggle-switch"] +} ``` This will make your Rule obsolete. So with Profiles, you can significantly reduce the amount of Rules you need for your Smart Home which helps you to keep your configuration short and clear. -##### Example 2 +##### Advanced Examples ```java +/** Hysteresis Profile **/ Number:Temperature Outdoor_Temperature { channel="openweathermap:weather-and-forecast:api:local:current#temperature" } // Triggers a temperature high alarm (Switch = ON) as of 30 °c and stays ON until temperature drops below 29 °C -Switch Outdoor_Temperature_High_Alert { channel="openweathermap:weather-and-forecast:api:local:current#temperature" [profile="hysteresis", lower="29 °C", upper="30 °C"] } +Switch Outdoor_Temperature_High_Alert { channel="openweathermap:weather-and-forecast:api:local:current#temperature" [profile="system:hysteresis", lower="29 °C", upper="30 °C"] } // Temperture low alert below 0 °C -Switch Outdoor_Temperature_Low_Alert { channel="openweathermap:weather-and-forecast:api:local:current#temperature" [profile="hysteresis", lower="0 °C", inverted=true] } +Switch Outdoor_Temperature_Low_Alert { channel="openweathermap:weather-and-forecast:api:local:current#temperature" [profile="system:hysteresis", lower="0 °C", inverted=true] } -// Indicates a battery low alarm if battery level drops below 15 +/** Battery Level Profile **/ Number Battery_Level { channel="serialbutton:button:mybutton:battery-level" } -Switch Low_Battery { channel="serialbutton:button:mybutton:battery-level", [profile="hysteresis", lower=15, inverted=true] } +// Indicates a battery low alarm if battery level drops below 15 +Switch Low_Battery { channel="serialbutton:button:mybutton:battery-level" [profile="system:hysteresis", lower=15, inverted=true] } + +/** Range Profile **/ +Number:Dimensionless Outdoor_Humidity { channel="openweathermap:weather-and-forecast:api:local:current#humidity" } +// Triggers a humidity low / high alarm (Switch = ON) if humidity drops below 40 % or exceeds 60 % +Switch Outdoor_Humidity_Alert { channel="openweathermap:weather-and-forecast:api:local:current#humidity" [profile="system:range", lower="40 %", upper="60 %", inverted=true] } ``` diff --git a/configuration/jsr223.md b/configuration/jsr223.md index 52ea1a5ee..bfa821a36 100644 --- a/configuration/jsr223.md +++ b/configuration/jsr223.md @@ -3,8 +3,6 @@ layout: documentation title: JSR223 Scripting --- -{% include base.html %} - # JSR223 Scripting ::: tip Note @@ -30,6 +28,7 @@ New APIs are planned to be implemented in the future, which will provide standar :::: tabs ::: tab JavaScript + ```js 'use strict'; @@ -54,10 +53,11 @@ sRule.setTriggers([ automationManager.addRule(sRule); ``` + ::: - ::: tab Jython + ```python scriptExtension.importPreset("RuleSupport") scriptExtension.importPreset("RuleSimple") @@ -79,9 +79,11 @@ sRule.setTriggers([ automationManager.addRule(sRule) ``` + ::: ::: tab Groovy + ```groovy import org.openhab.core.automation.* import org.openhab.core.automation.module.script.rulesupport.shared.simple.* @@ -105,6 +107,7 @@ sRule.setTriggers([ automationManager.addRule(sRule) ``` + ::: :::: @@ -113,27 +116,29 @@ automationManager.addRule(sRule) Scripts should be placed in the `${OPENHAB_CONF}/automation/jsr223/` directory. This directory will vary, [based on the type of openHAB installation used](https://www.openhab.org/docs/installation/linux.html#installation). -For example, Linux installations created with a package installer will use `/etc/openhab2/automation/jsr223/`, and manual installations will use `/opt/openhab2/conf/automation/jsr223/`. +For example, Linux installations created with a package installer will use `/etc/openhab/automation/jsr223/`, and manual installations will use `/opt/openhab/conf/automation/jsr223/`. -When openHAB starts, scripts will be loaded in an order based on their file name. -If the scripts have the same name, which should rarely happen, the parent directories will be considered in the sort. +When openHAB starts, scripts are loaded at start level 40 by default (in no particular order). +The start level for each script can be overriden by specifying a start level either in the filename (`./my_script.sl50.py`) or containing directory (`./sl50/my_script.py`). +The runtime provides no explicit dependency mechanism or ordering, yet scripts are loaded one at a time so can be ordered via start level if desired. For example, with the following scripts and directory structure... ```text ├── automation/jsr223 │   ├── dir1 -│   │   ├── 001_script.py -│   │   └── script.py -│   ├── 001_script.py -│   ├── dir2 -│   │   ├── 002_script.py -│   │   └── script.py +│   │   ├── script_a.py +│   │   └── script_b.py +│   ├── script.sl38.py +│   ├── sl30 +│   │   ├── script_x.py +│   │   └── script_y.py │   └── script.py ``` -... the load order will be: `/001_script.py`, `/dir1/001_script.py`, `/dir2/002_script.py`, `/script.py`, `/dir1/script.py`, `/dir2/script.py`. +... the load order will be: (`sl30/script_x.py` & `sl30/script_y.py`) at start level 30, `script.sl38.py` at start level 38, then (`/dir1/script_a.py`, `/dir1/script_b.py`, `script.py`) at start level 40. +The script file watching mechanism itself is activated at start level 20, so scripts cannot be executed earlier than this. - +Note that prior to openHAB 3, script ordering was performed alphanumerically based on file path. This is no longer supported as of openHAB 3. ### `ScriptExtension` Objects (all JSR223 languages) @@ -146,8 +151,6 @@ The `default` preset is preloaded, so it does not require importing. - [`RuleSupport`](#rulesupport_presets) - [`RuleFactories`](#rulefactories_presets) - - #### Default Preset (`importPreset` not required) | Variable | Description | @@ -212,8 +215,6 @@ The `default` preset is preloaded, so it does not require importing. | `scriptExtension` | (internal) For loading script presets. | | `se` | Alias for `scriptExtension` | - - ##### `events` operations - `events.postUpdate(String, String)` @@ -227,8 +228,6 @@ The `default` preset is preloaded, so it does not require importing. - `events.storeStates(Item...)` - `events.restoreStates(Map)` - - #### RuleSimple Preset These variables and classes are loaded using: @@ -252,8 +251,6 @@ See language-specific documentation for examples. | TriggerType | `org.openhab.core.automation.type.TriggerType` | | Visibility | `org.openhab.core.automation.Visibility` enum | - - #### `RuleSupport` Preset These variables and classes are loaded using: @@ -276,8 +273,6 @@ scriptExtension.importPreset("RuleSupport") | automationManager | Instance for managing rules and other openHAB module instances. (e.g., `addRule`) | | ruleRegistry | `org.openhab.core.automation.Rule` | - - #### `RuleFactories` Preset >Note: Advanced usage @@ -292,73 +287,58 @@ scriptExtension.importPreset("RuleFactories") | `ConditionHandlerFactory` | `org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedConditionHandlerFactory` | | `TriggerHandlerFactory` | `org.openhab.core.automation.module.script.rulesupport.shared.factories.ScriptedTriggerHandlerFactory` | - - ### `TriggerType` Objects (all JSR223 languages) The following trigger types are defined by openHAB (custom triggers can also be defined) and take the specified configuration parameters. All parameters are Strings. Read the JSR223 language specific documentation for examples of using these `TriggerType` objects. -
- timer.GenericCronTrigger +::: details timer.GenericCronTrigger | Parameter | Description | |-----------|-------------| | `cronExpression` | The cron expression | -
- -
- timer.TimeOfDayTrigger +::: +::: details timer.TimeOfDayTrigger | Parameter | Description | |-----------|-------------| | `time` | The time in "hh:mm" format | -
- -
- core.ItemCommandTrigger +::: +::: details core.ItemCommandTrigger | Parameter | Description | |-----------|-------------| | `itemName` | The name of the `Item` | | `command` | The `Command` (optional) | -
- -
- core.ItemStateUpdateTrigger +::: +::: details core.ItemStateUpdateTrigger | Parameter | Description | |-----------|-------------| | `itemName` | The name of the `Item` | | `state` | The `State` (optional) | -
- -
- core.ItemStateChangeTrigger +::: +::: details core.ItemStateChangeTrigger | Parameter | Description | |-----------|-------------| | `itemName` | The name of the `Item` | | `previousState` | The previous `State` (optional) | | `state` | The `State` (optional) | -
- -
- core.ChannelEventTrigger +::: +::: details core.ChannelEventTrigger | Parameter | Description | |-----------|-------------| | `channelUID` | The `ChannelUID` of the `Channel` | | `event` | The `Channel` trigger `Event` (optional) | -
- -
- core.GenericEventTrigger +::: +::: details core.GenericEventTrigger | Parameter | Description | |-----------|-------------| | `eventTopic` | Default: "openhab/\*"

Events can also be filtered, e.g.
Item events: "openhab/items/\*/"
Channel events: "openhab/channels/\*/triggered"
Thing events: "openhab/things/\*/" | | `eventSource` | `Item` name, `ChannelUID`, `ThingUID`, etc. | | `eventTypes` | `ItemCommandEvent`, `ItemStateEvent`, `ItemStateChangedEvent`, `GroupItemStateChangedEvent`, `ItemAddedEvent`, `ItemRemovedEvent`, `ThingAddedEvent`, `ThingRemovedEvent`, `ThingStatusInfoChangedEvent`, `ThingStatusInfoEvent`, `ThingUpdatedEvent`, etc. | -
+::: diff --git a/configuration/migration/index.md b/configuration/migration/index.md index bd885bf71..e03bc4ae4 100644 --- a/configuration/migration/index.md +++ b/configuration/migration/index.md @@ -7,36 +7,41 @@ description: Description of Beaking Changes and needed steps for a proper Migrat # Migrating from openHAB 2 to openHAB 3 There are different approaches to get your openHAB 2 Environment upgraded to openHAB 3. -You could start with a fresh isntall and migrate your environment step-by-step or you can upgrade your rinnung environment and change your configuration where needed. +You could start with a fresh install and migrate your environment step-by-step or you can upgrade your running environment and change your configuration where needed. -Since this is a major version release you have to pay attention to some `Breaking Changes` that may affect your environment too. -You can find a general note on the `Breaking Changes` here: -https://github.com/openhab/openhab-distro/wiki/Breaking-Changes-in-openHAB-3 +Since this is a major version release you have to pay attention to some **Breaking Changes** that may affect your environment too. +You can find a general note on the **Breaking Changes** here: + Please read them carefully and check if you are affected by some of the changes, like the changes to some rules namespaces and the handling of time functions. Below you can find some general informations for the technical upgrade process to openHAB 3. Please be aware of possible changes needed for your specific environment in case of the breaking changes after upgrading. -## Upgrade Process for different instalaltion variants +## Upgrade Process for different installation variants ### openHABian If you are working with an [openHABian](https://www.openhab.org/docs/installation/openhabian.html) setup, the upgrade is quite easy. Regardless of if you are currently using the openHAB 2.5 stable release or one of the latest 3.0.0 SNAPSHOT or milestone builds, switching to openHAB 3.0.0 stable is done in just a few steps: 1. Connect to the SSH command line and execute: `sudo openhabian-config` -2. When being asked, answer that you want to update. -3. Select the menu entry"03 - Install openHAB" option. +1. When being asked, answer that you want to update. +1. Select the menu entry"03 - Install openHAB" option. ### Package-based Installations -Since the openHAB 2 Linux `openhab2*` packages used folder names like `/etc/openhab2` we used this opportunity to remove the version out of anything the packages provides, including the name of the package itself. Some files such as `openhab-cli` didn't use any version in the naming at all, and therefore haven't moved anywhere. +Since the openHAB 2 Linux `openhab2*` packages used folder names like `/etc/openhab2` we used this opportunity to remove the version out of anything the packages provides, including the name of the package itself. +Some files such as `openhab-cli` didn't use any version in the naming at all, and therefore haven't moved anywhere. Unfortunately, it means that in terms of openHAB 2 and openHAB 3, you cannot install both at the same time and openHAB 2 will not automatically update to openHAB 3, but if you use the commands to install openHAB 3 whilst openHAB 2 is installed, then the configs will copy across automatically. +Please be aware that system configuration done for openHAB 2 is not copied across automatically. +E.g. if you have changed /etc/default/openhab2, similar changes in /etc/default/openhab might be required. #### Backup first -If you've got an existing openHAB 2 installation, back it up before you do anything. `openhab-cli backup [filepath]/[filename].zip` will create a zip file which can be used to restore the same version of openHAB later using `openhab-cli restore [filepath]/[filename].zip`. Put the file somewhere not related to openHAB, such as your own home directory (e.g. `/home/pi/`). You should probably do your usual OS backup too to make sure you can get back to where you left off. +If you've got an existing openHAB 2 installation, back it up before you do anything. `openhab-cli backup [filepath]/[filename].zip` will create a zip file which can be used to restore the same version of openHAB later using `openhab-cli restore [filepath]/[filename].zip`. +Put the file somewhere not related to openHAB, such as your own home directory (e.g. `/home/pi/`). +You should probably do your usual OS backup too to make sure you can get back to where you left off. #### Prerequisites @@ -46,18 +51,18 @@ You must also be on the relevant repository for openHAB, this hasn't changed for For DEB based installers (apt), your `.list` file should contain the line: -``` -deb https://dl.bintray.com/openhab/apt-repo2 stable main +```shell +deb https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main ``` -For RPM based installers (yum), your `.repo` file should contain: +For RPM based installers (yum/dnf), your `.repo` file should contain: -``` +```shell [openHAB-Stable] name=openHAB Stable -baseurl=https://dl.bintray.com/openhab/rpm-repo2/stable +baseurl=https://openhab.jfrog.io/artifactory/openhab-linuxpkg-rpm/stable gpgcheck=1 -gpgkey=https://bintray.com/user/downloadSubjectPublicKey?username=openhab +gpgkey=https://openhab.jfrog.io/artifactory/api/gpg/key/public enabled=1 ``` @@ -71,7 +76,7 @@ With `openhab2` still installed: ##### APT (Debian / Ubuntu and derivatives) -``` +```shell sudo apt update sudo apt install openhab ``` @@ -80,14 +85,14 @@ The system will ask you if you want to remove `openhab2` as part of this, and yo You can get rid of openHAB2 leftover configuration files by using the `sudo apt purge openhab2` command, but this also gets rid of the `openhab` user, to fix this issue you should follow this with: -``` +```shell sudo apt install --reinstall openhab sudo openhab-cli reset-ownership ``` ##### DNF (RedHat, CentOS, Fedora, etc.) -``` +```shell sudo dnf --allowerasing install openhab ``` @@ -96,7 +101,8 @@ DNF does not replace configuration files for you by default, have a look at the ##### YUM (Older RedHat, CentOS, Fedora, etc.) The equivalent command should be: -``` + +```shell sudo yum swap openhab2 openhab ``` @@ -114,7 +120,7 @@ After a successful install, you can use commands like `sudo systemctl start open ##### APT (Debian / Ubuntu and derivatives) -```sh +```shell sudo apt purge openhab2 sudo apt update sudo apt install openhab @@ -122,12 +128,12 @@ sudo apt install openhab ##### YUM or DNF (RedHat, CentOS, Fedora, etc) -```sh +```shell sudo dnf remove openhab2 sudo dnf install openhab ``` + Replace "dnf" with "yum" for older Red Hat based OSes. - ### Manual Installations @@ -138,20 +144,20 @@ Official update scripts are available that let you update your 2.x installation #### Linux/MacOS 1. Change to your openHAB root directory (e.g. `cd /opt/openhab`) -2. Create a backup by calling `sudo ./runtime/bin/backup`. -2. Run the update command: +1. Create a backup by calling `sudo ./runtime/bin/backup`. +1. Run the update command: - ``` + ```shell sudo ./runtime/bin/update 3.0.0 ``` #### Windows 1. Make a backup of your openHAB installation folder. -2. Run PowerShell as an administrator and change to your openHAB root directory (e.g. `cd C:\openHAB`) -3. Run the update command: +1. Run PowerShell as an administrator and change to your openHAB root directory (e.g. `cd C:\openHAB`) +1. Run the update command: - ``` -. .\runtime\bin\update.ps1 -Update-openHAB -OHVersion 3.0.0 + ```shell + . .\runtime\bin\update.ps1 + Update-openHAB -OHVersion 3.0.0 ``` diff --git a/configuration/multimedia.md b/configuration/multimedia.md index 70aa773c1..7616238e7 100644 --- a/configuration/multimedia.md +++ b/configuration/multimedia.md @@ -3,8 +3,6 @@ layout: documentation title: Multimedia --- -{% include base.html %} - # Multimedia ## Volume @@ -27,11 +25,10 @@ There are different options for output devices (so called audio sinks): The distribution comes with these options built-in: -| Output Device | Audio Sink | Description | -|---------------------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `javasound` | System Speaker | This uses the JRE sound drivers to play audio to the local sound interface. | -| `enhancedjavasound` | System Speaker (with mp3 support) | This uses the JRE sound drivers plus an additional 3rd party library, which adds support for mp3 files. | -| `webaudio` | Web Audio | Convenient, if sounds should not be played on the server, but on the client: This sink sends the audio stream through HTTP to web clients, which then cause it to be played back by the browser. Obviously, the browser needs to be opened and have a compatible openHAB UI running. Currently, this feature is supported by Paper UI and HABPanel. | +| Output Device | Audio Sink | Description | +|---------------------|-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `enhancedjavasound` | System Speaker (with mp3 support) | This uses the JRE sound drivers plus an additional 3rd party library, which adds support for mp3 files. | +| `webaudio` | Web Audio | Convenient, if sounds should not be played on the server, but on the client: This sink sends the audio stream through HTTP to web clients, which then cause it to be played back by the browser. Obviously, the browser needs to be opened and have a compatible openHAB UI running. Currently, this feature is only supported by HABPanel. | Additionally, certain bindings register their supported devices as audio sinks, e.g. Sonos speakers. @@ -42,11 +39,10 @@ To check, which audio sinks are available, you can use the console: ```text openhab> openhab:audio sinks enhancedjavasound -javasound webaudio ``` -You can define the default audio sink either by textual configuration in `$OPENHAB_CONF/services/runtime.cfg` or in the Paper UI in `Configuration->System->Audio`. +You can define the default audio sink either by textual configuration in `$OPENHAB_CONF/services/runtime.cfg` or in the UI in `Settings->Audio`. In order to play a sound, you can use the following command on the console: @@ -60,13 +56,13 @@ openhab> openhab:audio stream example.com Alternatively the [`playSound()`](https://openhab.org/javadoc/latest/org/openhab/core/model/script/actions/audio#playSound(java.lang.String)) or [`playStream()`](https://openhab.org/javadoc/latest/org/openhab/core/model/script/actions/audio#playStream(java.lang.String)) functions can be used in DSL rules: -- `playSound(String filename)` : plays a sound from the sounds folder to the default sink -- `playSound(String filename, PercentType volume)` : plays a sound with the given volume from the sounds folder to the default sink -- `playSound(String sink, String filename)` : plays a sound from the sounds folder to the given sink(s) -- `playSound(String sink, String filename, PercentType volume)` : plays a sound with the given volume from the sounds folder to the given sink(s) +- `playSound(String filename)` : plays a sound from the sounds folder to the default sink +- `playSound(String filename, PercentType volume)` : plays a sound with the given volume from the sounds folder to the default sink +- `playSound(String sink, String filename)` : plays a sound from the sounds folder to the given sink(s) +- `playSound(String sink, String filename, PercentType volume)` : plays a sound with the given volume from the sounds folder to the given sink(s) -- `playStream(String url)` : plays an audio stream from an url to the default sink (set url to `null` if streaming should be stopped) -- `playStream(String sink, String url)` : plays an audio stream from an url to the given sink(s) (set url to `null` if streaming should be stopped) +- `playStream(String url)` : plays an audio stream from an url to the default sink (set url to `null` if streaming should be stopped) +- `playStream(String sink, String url)` : plays an audio stream from an url to the given sink(s) (set url to `null` if streaming should be stopped) #### Examples @@ -99,7 +95,7 @@ mactts:Ioana Ioana (ro_RO) mactts:Kanya Kanya (th_TH) ``` -You can define a default TTS service and a default voice to use either by textual configuration in `$OPENHAB_CONF/services/runtime.cfg` or in the Paper UI in `Configuration->System->Voice`. +You can define a default TTS service and a default voice to use either by textual configuration in `$OPENHAB_CONF/services/runtime.cfg` or in the UI in `Settings->Voice`. In order to say a text, you can enter such a command on the console (The default voice and default audio sink will be used): @@ -126,10 +122,7 @@ If no voice or no audio sink is provided, the default voice and default audio si ### Speech-to-Text Although there are already interfaces defined in openHAB for speech-to-text, up to now there is no add-on available for this functionality. -So the only choice that is available right now is to use the Android voice recognition feature that is built into the openHAB Android app. - -The Android app is [not yet adapted to the openHAB 2 voice features](https://github.com/openhab/openhab-android/issues/242). -To still use the voice feature you will need to have a String item with the name "VoiceCommand" defined, to which the app sends any recognized text as a string command. +So the only choice that is available right now is to use the Android voice recognition feature that is built into the openHAB app for Android. ### Human Language Interpreter @@ -137,10 +130,11 @@ Human language interpreters are meant to process prose that e.g. is a result of There are two implementations available by default: -| Interpreter | Type | Description | -|-------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `rulehli` | Rule-based Interpreter | This mimics the behavior of the Android app - it sends the string as a command to a (configurable, default is "VoiceCommand") item and expects a rule to pick it up and further process it. | -| `system` | Built-in Interpreter | This is a simple implementation that understands basic home automation commands like "turn on the light" or "stop the music". It currently supports only English, German and French and the vocabulary is still very limited. The exact syntax still needs to be documented, for the moment you need to refer to the [source code](https://github.com/openhab/openhab-core/blob/master/bundles/org.openhab.core.voice/src/main/java/org/openhab/core/voice/internal/text/StandardInterpreter.java#L48). | +| Interpreter | Type | Description | +|-------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `rulehli` | Rule-based Interpreter | This mimics the behavior of the Android app - it sends the string as a command to a (configurable, default is "VoiceCommand") item and expects a rule to pick it up and further process it. | +| `system` | Built-in Interpreter | This is a simple implementation that understands basic home automation commands like "turn on the light" or "stop the music". It currently supports only English, German and French and the vocabulary is still very limited. The exact syntax still needs to be documented, for the moment you need to refer to the [source code](https://github.com/openhab/openhab-core/blob/main/bundles/org.openhab.core.voice/src/main/java/org/openhab/core/voice/internal/text/StandardInterpreter.java#L42). | +| `opennlp` | HABot OpenNLP Interpreter | A machine-learning natural language processor based on Apache OpenNLP for intent classification and entity extraction. | To test the interpreter, you can enter such a command on the console (assuming you have an item with label 'light'): diff --git a/configuration/paperui.md b/configuration/paperui.md deleted file mode 100644 index 025b15a6e..000000000 --- a/configuration/paperui.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -layout: documentation -title: Configuration though Paper UI ---- - -{% include base.html %} - -# Configuration though Paper UI - -The Paper UI is a new interface that helps setting up and configuring your openHAB instance. -It does not (yet) cover all aspects, so you still need to resort to textual configuration files, but it already offers the following: - -- Add-on management: - Easily install or uninstall openHAB add-ons - ![extensions](images/paperui1.png) - -- Thing discovery: - See devices and services found on your network and add them to your setup. - ![discovery](images/paperui2.png) - -- Linking items to channels: - Instead of adding a binding configuration to your item file, you can directly link Thing channels to your items. - ![links](images/paperui3.png) - -Note that you still need to define your items, sitemaps, persistence configurations and rules in the according config files (as done in openHAB 1). Such functionality will be added bit by bit to the Paper UI only. - -Here you can find a small screencast about the Paper UI: - -[![Paper UI](https://img.youtube.com/vi/MV2a5qwtmRE/0.jpg)](https://www.youtube.com/watch?v=MV2a5qwtmRE) - -{% include contribution-wanted.html %} diff --git a/configuration/persistence.md b/configuration/persistence.md index 00d5f47eb..ad33189ae 100644 --- a/configuration/persistence.md +++ b/configuration/persistence.md @@ -3,8 +3,6 @@ layout: documentation title: Persistence --- -{% include base.html %} - # Persistence openHAB can store data over time; this is known as persistence. @@ -22,8 +20,8 @@ Please refer to the [available persistence service add-on](/addons/#persistence) It is important to select a default persistence service. You should do this even if you have only one persistence add-on installed. -To select a default persistence service, in paper UI, select Configuration and then System from the side menu. -Scroll down to "Persistence", and select your default service from the drop-down list. +To select a default persistence service, in UI, select `Settings->Persistence`. +Select your default service from the drop-down list. Note that you must first install a persistence add-on before you make this selection. Be sure to save your choice once you have selected your default service. @@ -67,6 +65,7 @@ The following strategies are defined internally and may be used in place of `str - `restoreOnStartup`: load and initialize the last persisted state of the Item on openHAB startup (if the Item state is undefined (`UNDEF`)). #### Cron Persistence Triggers + openHAB uses [Quartz](https://www.quartz-scheduler.org/documentation) for time-related cron events. See the [Rules article]({{base}}/configuration/rules-dsl.html#time-based-triggers) for more information. @@ -88,8 +87,9 @@ where `` is a comma-separated list consisting of one or more of the fo - `*` - this line should apply to all items in the system - `` a single Item identified by its name. This Item can be a group Item. But note that only the group value will be persisted. The value of the individual group members will not be persisted using this option. -- `*` - all members of this group will be persisted, but not the group itself. If no strategies are provided, the default strategies that are declared in the first section are applied. Optionally, an alias may be provided if the persistence service requires special names (e.g. a table to be used in a database, a feed id for an IoT service, etc.) -Note that * is NOT a wildcard match character in this context. +- `*` - all members of this group will be persisted, but not the group itself. If no strategies are provided, the default strategies that are declared in the first section are applied. + Optionally, an alias may be provided if the persistence service requires special names (e.g. a table to be used in a database, a feed id for an IoT service, etc.) + Note that `*` is NOT a wildcard match character in this context. The example `Items` section below takes advantage of a `default` entry in the `Strategies` section. Assume the `Strategies` section contains the line: @@ -151,8 +151,8 @@ Items { item1, item2 : strategy = everyChange, restoreOnStartup } ``` -It is usually not necessary to restore all Items since there is a good chance that they are no longer accurate (switches may have been toggled, sensor values are likely to have changed), and the restoration may result in unwanted rule actions. +It is usually not necessary to restore all Items since there is a good chance that they are no longer accurate (switches may have been toggled, sensor values are likely to have changed), and the restoration may result in unwanted rule actions. ## Persistence Extensions in Scripts and Rules @@ -193,7 +193,7 @@ These extensions use the default persistence service. (Refer to 'Default Persistence Service' above to configure this.) You may specify a different persistence service by appending a String as an optional additional parameter at the end of the extension. -#### Examples +### Examples To persist an Item called `Lights` in an rrd4j database, you would enter the following: `Lights.persist("rrd4j")` diff --git a/configuration/restdocs.md b/configuration/restdocs.md new file mode 100644 index 000000000..790464449 --- /dev/null +++ b/configuration/restdocs.md @@ -0,0 +1,90 @@ +--- +layout: documentation +title: openHAB REST API +--- + +# openHAB REST API + +Through the openHAB [REST API](https://en.wikipedia.org/wiki/REST_API) most aspects of the openHAB system can be readily accessed by other programs. +This includes for example, the access to all data related to Items, Things and Bindings as well as the capabilities to invoke actions that can change the state of Items or influence the behavior of other elements of openHAB. +Interactions with the REST API are based on the http protocol. +Access over the Internet to the REST API is possible, but this represents a significant security risk. +Users are encouraged to [ensure safe and secure connections](/docs/installation/security.html). +Be aware that the documentation of the REST API may not be automatically installed, but once installed it is accessible through the openHAB dashboard. + +## REST API Examples + +- Retrieve openHAB data from external applications +- Inject data and trigger events in openHAB from external applications (for example, some motion detectors or surveillance cameras) +- Inspect openHAB Bindings/Things or Items, learn about current states, parameters or problems +- Interacting with openHAB from other programs; many programming languages and automation tools can easily make use of REST API +- Using third party software on cell phones, such as tasker to [open your garage door](https://community.openhab.org/t/triggering-items-using-openhab-2s-rest-api-from-tasker/14027) + +The openHAB REST API is excellently documented with detailled use instructions. +It would vastly exceed this space to present all possible examples. +Nevertheless, here is some examples using [curl](https://en.wikipedia.org/wiki/CURL), a common command line tool available for many platforms: + +- Switching ```My_Item``` OFF by issuing an http [POST](https://en.wikipedia.org/wiki/POST_(HTTP)) request: + + ```bash + curl -X POST --header "Content-Type: text/plain" --header "Accept: application/json" -d "OFF" "http://{openHAB_IP}:8080/rest/items/My_Item" + ``` + +- Setting a Contact item ```My_Item``` to CLOSED by issuing an http PUT request to ```My_Item/state```: + + ```bash + curl -X PUT --header "Content-Type: text/plain" --header "Accept: application/json" -d "CLOSED" "http://{openHAB_IP}:8080/rest/items/My_Item/state" + ``` + +- Retrieving a list of all Items and Groups by issuing a GET request: + + ```bash + curl -X GET --header "Accept: application/json" "http://{openHAB_IP}:8080/rest/items?recursive=false" + ``` + +- Retrieving a list of all sitemaps by issuing a GET request: + + ```bash + curl -X GET --header "Accept: application/json" "http://{openHAB_IP}:8080/rest/sitemaps" + ``` + +- Subscription to events: + + ```bash + # ThingStatusInfoChangedEvent - The status of a thing changed. + curl "http://{openHAB_IP}:8080/rest/events?topics=smarthome/things/{thingUID}/statuschanged" + + # ChannelTriggeredEvent - A channel has been triggered. + curl "http://{openHAB_IP}:8080/rest/events?topics=smarthome/channels/{channelUID}/triggered" + ``` + +The commands above have been copied from the REST API documentation for illustration. + +## Rest Api Explorer + +You can try and validate rest api calles from within the openHAB UI. +Just log in with an admin user, navigate to `Developer Tools -> API Explorer` and start exploring. + +## Authentication + +Starting with version 3, openHAB supports password protection for sensible contents such as parts of the semantic model. +To access this kind of information, the REST API provides the common mechanism [Basic authentication](https://en.wikipedia.org/wiki/Basic_access_authentication) and [OAuth authorization](https://en.wikipedia.org/wiki/OAuth). +Both mechanisms can be used out of the box by the most programming languages and frameworks, but with regard to the `curl` examples from above, there are two alternative ways of authenticating yourself: + +### With username/password + +To the complete command, **add `-u {USER_NAME}`,** then enter your password as prompted. +You can also do this in a single, non-interactive command, in this case **add `-u {USER_NAME}:{PASSWORD}` instead.** + +**Note:** This approach uses basic authentication which needs to be enabled in the `org.openhab.restauth` settings (accessible under Main UI > Settings > API Security). + +### With an API token + +This method is often recommended in order to keep your passwords safe and avoid to store them without encryption in any public places. +To authenticate with an API token, **add `-u '{API_TOKEN}:'` to the commandline.** + +You can manage all access tokens in your profile settings in the Main UI. + +## Additional Considerations + +The REST API also supports server-push supporting subscriptions on change notification for certain resources. diff --git a/configuration/rules-dsl.md b/configuration/rules-dsl.md index f709740e9..f83c533d0 100644 --- a/configuration/rules-dsl.md +++ b/configuration/rules-dsl.md @@ -3,8 +3,6 @@ layout: documentation title: Rules --- -{% include base.html %} - # Textual Rules "Rules" are used for automating processes: Each rule can be triggered, which invokes a script that performs any kinds of tasks, e.g. turn on lights by modifying your items, do mathematical calculations, start timers etcetera. @@ -22,7 +20,7 @@ On this page you will learn how to leverage its functionality to do *real* home ### File Location Rules are placed in the folder `$OPENHAB_CONF/rules`. -The [demo setup](https://demo.openhab.org) already comes with a demo file called [`demo.rules`](https://github.com/openhab/openhab-distro/blob/master/features/distro-resources/src/main/resources/rules/demo.rules), which has a couple of examples that can be a good starting point. +The [demo setup](https://demo.openhab.org) already comes with a demo file called [`demo.rules`](https://github.com/openhab/openhab-distro/blob/main/distributions/openhab-demo/src/main/resources/conf/rules/demo.rules), which has a couple of examples that can be a good starting point. A rule file can contain multiple rules. All rules of a file share a common execution context, i.e. they can access and exchange variables with each other. @@ -120,6 +118,7 @@ end - `` - Contains the logic that should be executed when a trigger condition is met, see the [script](#scripts) section for details on its syntax. {: #rule-triggers} + ### Rule Triggers Before a rule starts working, it has to be triggered. @@ -135,6 +134,7 @@ There are different categories of rule triggers: Here are the details for each category: {: #event-based-triggers} + ### Event-based Triggers You can listen to commands for a specific item, on status updates or on status changes (an update might leave the status unchanged). @@ -153,6 +153,7 @@ When using the `received command` trigger, the Rule might trigger **before** the Therefore, if the Rule needs to know what the command was, use the [implicit variable]({{base}}/configuration/rules-dsl.html#implicit-variables-inside-the-execution-block) `receivedCommand` instead of `.state`. {: #member-of-triggers} + ### Member of Triggers As with Item based event-based triggers discussed above, you can listen for commands, status updates, or status changes on the members of a given Group. @@ -172,9 +173,10 @@ Also, as with Item event-based triggers, when using `received command`, the Rule So in Rules where the Rule needs to know what the command was, use the `receivedCommand` implicit variable instead of `triggeringItem.state`. {: #time-based-triggers} + ### Time-based Triggers -You can either use some pre-defined expressions for timers or use a [cron expression](https:////www.quartz-scheduler.org/documentation/quartz-2.2.2/tutorials/tutorial-lesson-06.html) instead: +You can either use some pre-defined expressions for timers or use a [cron expression](https://www.quartz-scheduler.org/documentation/quartz-2.2.2/tutorials/tutorial-lesson-06.html) instead: ```java Time is midnight @@ -185,23 +187,24 @@ Time cron "" A cron expression takes the form of six or optionally seven fields: 1. Seconds -2. Minutes -3. Hours -4. Day-of-Month -5. Month -6. Day-of-Week -7. Year (optional field) +1. Minutes +1. Hours +1. Day-of-Month +1. Month +1. Day-of-Week +1. Year (optional field) -You may use [CronMaker](https://www.cronmaker.com/) or the generator at [FreeFormatter.com](https://www.freeformatter.com/cron-expression-generator-quartz.html) to generate cron expressions. +You may use the generator at [FreeFormatter.com](https://www.freeformatter.com/cron-expression-generator-quartz.html) to generate your cron expressions. {: #system-based-triggers} + ### System-based Triggers -Two system-based triggers are provided as described in the table below: +One system-based trigger is provided as described in the table below: | Trigger | Description | |-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| System started | System started is triggered upon openHAB startup, after the rule file containing the System started trigger is modified, or after item(s) are modified in a .items file. | +| System started | `System started` is triggered upon openHAB startup. In openHAB version 2, `System started` is also triggered after the rule file containing the System started trigger is modified, or after item(s) are modified in a .items file. | You may wish to use the 'System started' trigger to initialize values at startup if they are not already set. @@ -218,7 +221,24 @@ then end ``` +In openHAB version 3 the System-based Trigger for startlevel had been added, values depends on the startlevel: + +```text +00 - OSGi framework has been started. +10 - OSGi application start level has been reached, i.e. bundles are activated. +20 - Model entities (items, things, links, persist config) have been loaded, both from db as well as files. +30 - Item states have been restored from persistence service, where applicable. +40 - Rules are loaded and parsed, both from db as well as dsl and script files. +50 - Rule engine has executed all "system started" rules and is active. +70 - User interface is up and running. (planned, not included yet) +80 - All things have been initialized. (planned, not included yet) +100 - Startup is fully complete. +``` + +Startlevels (logically only if startlevel >= 40) are only available in UI-Rules, not in DSL-Rules with textual configuration. + {: #thing-based-triggers} + ### Thing-based Triggers Your rules can take actions based upon status updates or status changes generated by Things. @@ -235,7 +255,7 @@ You can find all the possible values for status from [Thing Status](/docs/concep And refer to [Thing Status Action](/docs/configuration/actions.html#thing-status-action) to find how to get thing status in the script. The `thingUID` is the identifier assigned to the Thing, manually in your configuration or automatically during auto discovery. -You can find it from PaperUI or from Karaf remote console. +You can find it from UI or from Karaf remote console. For example, one z-wave device can be "zwave:device:c5155aa4:node14". ::: tip Note @@ -243,6 +263,7 @@ You need to use quotes around `thingUID` if it contains special characters such ::: {: #channel-based-triggers} + ### Channel-based Triggers Some add-ons provide trigger channels. @@ -279,6 +300,7 @@ end ``` {: #scripts} + ## Scripts The expression language used within scripts is the same that is used in the Xtend language - see the [documentation of expressions](https://www.eclipse.org/xtend/documentation/203_xtend_expressions.html) on the Xtend homepage. @@ -302,6 +324,7 @@ if (Temperature.state < 20) { ``` {: #manipulating-item-states} + ### Manipulating Item States Rules are often used to manipulate the state of an Item, for example switching lights on and off under certain conditions. @@ -321,12 +344,14 @@ The following table summarizes the impact of the two manipulator commands on the **Beware:** In most cases, a rule with a trigger of `received update` will fire following the command `sendCommand` as: + - openHAB auto-updates the status of Items for which the item definition does not contain `autoupdate="false"` - the Thing sends a status update to the Item. Besides the specific manipulator command methods `MyItem.sendCommand()` and `MyItem.postUpdate()`, generic manipulators in the form of `sendCommand(MyItem, )` and `postUpdate(MyItem, )` are available. The specific versions is normally recommended. {: #sendcommand-method-vs-action} + #### MyItem.sendCommand("new state") versus sendCommand(MyItem, "new state") Using the methods `MyItem.sendCommand()` and `MyItem.postUpdate()` is often preferable. @@ -345,8 +370,9 @@ Using `Myitem.sendCommand(new_state)` or `Myitem.postUpdate(new_state)` will, in The Action `sendCommand(MyItem, new_state)` does not provide the same flexibilty. For example, if `new_state` is typed as a primitive (e.g., `var int new_state = 3`) and myItem is of the Object type Dimmer: -* the following command ***will fail***: ~~sendCommand(MyItem, new_state)~~. -* However, the following command **will work**: `MyItem.sendCommand(new_state)`. + +- the following command ***will fail***: ~~sendCommand(MyItem, new_state)~~. +- However, the following command **will work**: `MyItem.sendCommand(new_state)`. Using `MyItem.postUpdate(new_state)` or `MyItem.sendCommand(new_state)` will create the most stable code. It provides by far the best option for avoiding most problems. @@ -362,6 +388,7 @@ sendCommand("My_Lamp_" + index, ON) ``` {: #using-state-of-items-in-rules} + ### Using the States of Items in Rules Often it is desired to calculate other values from Item states or to compare Item states against other values @@ -376,6 +403,7 @@ This section differentiates between command type and state type. For ease of reading, it is possible to simply add “type” to the end of a command type thereby obtaining the state type. For example, a Color Item can receive an OnOffType, IncreaseDecreaseType, PercentType, or HSBType. Therefore the following are all valid commands one can send to a Color Item: + - `MyColorItem.sendCommand(ON)` - `MyColorItem.sendCommand(INCREASE)` - `MyColorItem.sendCommand(new PercentType(50))` @@ -395,11 +423,12 @@ There are two ways to discover these methods: - Use the [openHAB VS Code Extension](/docs/configuration/editors.html#editors.html#openhab-vs-code-extension) and the `` key combo to list all the available methods - Look at the JavaDocs for the given type. -For example, the [JavaDoc for HSBType](https://openhab.org/javadoc/latest/org/openhab/core/library/types/hsbtype) shows getRed, getBlue, and getGreen methods. -These methods can be called in Rules-DSL without the "get" part in name as in `(MyColorItem.state as HSBType).red)`. -They retrieve the state of MyColorItem and then casts it as HSBType to be able to use the methods associated with the HSBType. + For example, the [JavaDoc for HSBType](https://openhab.org/javadoc/latest/org/openhab/core/library/types/hsbtype) shows `getRed`, `getBlue`, and `getGreen` methods. + These methods can be called in Rules-DSL without the `get` part in name as in `(MyColorItem.state as HSBType).red)`. + They retrieve the state of MyColorItem and then casts it as HSBType to be able to use the methods associated with the HSBType. {: #conversions} + #### Working with Item States: Conversions *Reminder: For a complete and up-to-date list of what item types are currently allowed in openHAB and the command types each item can accept refer to the section on [items in the openHAB documentation]({{base}}/concepts/items.html).* @@ -554,7 +583,7 @@ DecimalType and QuantityType are also java.lang.Number so all the conversions li Here some other commonly needed conversions: -* For DecimalType states: +- For DecimalType states: ```java // convert integer_number to string containing hex_code @@ -569,17 +598,21 @@ var myNumber = Long.parseLong(hex, 16) as Number var DecimalType parsedResult = new DecimalType(Long.parseLong(hex_code, 16)) ``` -* For QuantityType states: +- For QuantityType states: ```java // define a QuantityType variable var myTemperature = 20|°C -// convert a quantity state into a different unit: -var fahrenheit = myTemperature.toUnit("°F") +// get units in text +var myUnits = myTemperature.getUnit.toString // gives "°C" -// convert scalar value to DecimalType +// convert a quantity state into a different unit: +var fahrenheit = myTemperature.toUnit("°F") // will contain quantity 68°F + +// convert quantity value to DecimalType var myDecimal = new DecimalType(fahrenheit.doubleValue) // myDecimal == 68 +var myCentigrade = fahrenheit.toUnit("°C").toBigDecimal // 20 // access scalar values as int, double, float var myInt = fahrenheit.intValue @@ -588,6 +621,10 @@ var myfloat = fahrenheit.floatValue // check if a number item state is a QuantityType var isQuantity = myItem.state instanceof QuantityType + +// comparing Quantities +// Tempting ... if (fahrenheit > 10) but NO!! that will not work as expected +if (fahrenheit > 10|°C) { logInfo("test, "It's warm.") } ``` Other useful conversions can be found under Dimmer Item. @@ -596,6 +633,30 @@ One warning comes with DecimalType (also holds true for QuantityType). The full explanation is [beyond the scope of this introduction](https://community.openhab.org/t/ambiguous-feature-call-whats-wrong-designer-user-or-bug/9477/4). To avoid an error mentioning an "Ambiguous Method Call" always cast the state of a DecimalType to a Number, not DecimalType. +Take care with maths around Quantity Types. While you can freely mix units in many cases, there are pitfalls. + +```java +// add a QuantityType variable +var miles = 2|mi +var metres = 10|m +var distance = miles + metres // result 2.0062 mi +// The result uses units of first given quantity + +var area = metres * metres // result 100 m² +// New appropriate units are used for result + +var fahr = 68|°F +var centi = 1|°C +var sumTemps = fahr + centi // result 101.80 °F +// Probably not what you expected +// Temperatures are always absolute, not interval or increment scale. +// 1°C has been converted to 33.8°F, not to the interval 1.8°F + +// There is a mathematical trick for this +var increment = fahr + centi - 0|°C // result 69.80 °F +// "subtracting zero" fixes the offset in the different scales +``` + ##### Player Item The Player item allows to control players (e.g. audio players) with commands such as Play, Pause, Next, Previous, Rewind and Fastforward. @@ -634,7 +695,7 @@ val stateAsString = MyStringItem.state.toString In case an item returns a string containing a value as a hexadecimal number, it can be converted to an integer by using -``` +```shell //Loading hexvalue from string val itemvalue = new java.math.BigDecimal(Integer::parseInt(myHexValue, 16)) ``` @@ -649,7 +710,6 @@ One can convert from ON and OFF to 1 and 0 with code similar to: val SwitchNum = if (MySwitchItem.state == ON) 1 else 0 ``` - #### Deeper Dive While interacting with Item states, care must be taken to understand the difference between Objects and primitives. @@ -688,6 +748,7 @@ Each of these separate methods is individually written to handle all of these di MyItem will automatically apply the method that corresponds to the argument type. {: #implicit-variables} + ### Implicit Variables inside the Execution Block Besides the implicitly available variables for items and commands/states, rules can have additional pre-defined variables, depending on their triggers: @@ -700,13 +761,14 @@ Besides the implicitly available variables for items and commands/states, rules - `receivedEvent` - implicitly available in every rule that has a channel-based trigger. {: #return} + ### Early returns It is possible to return early from a rule, not executing the rest of the statements like this: ```java if (Temperature.state > 20) { - return; + return; } Heating.sendCommand(ON) ``` @@ -714,6 +776,7 @@ Heating.sendCommand(ON) Caveat: Please note the semicolon after the return statement which terminates the command without an additional argument. {: #concurrency-guard} + ### Concurrency Guard If a rule triggers on UI events it may be necessary to guard against concurrency. @@ -737,6 +800,7 @@ end ``` {: #transformations} + ### Transformations openHAB [Transformation services](/addons/#transform) can be used in rules to transform/translate/convert data. @@ -782,8 +846,8 @@ finally { For all available Transformation services please refer to the list of [Transformation Add-ons](/addons/#transform). - {: #logging} + ### Logging You can emit log messages from your rules to aid debugging. @@ -863,7 +927,7 @@ rule "Start wake up light on sunrise" when Channel "astro:sun:home:rise#event" triggered then - switch(receivedEvent.getEvent()) { + switch(receivedEvent) { case "START": { Light.sendCommand(ON) } diff --git a/configuration/rules-ng.md b/configuration/rules-ng.md index 3d1fa0b07..75340f770 100644 --- a/configuration/rules-ng.md +++ b/configuration/rules-ng.md @@ -3,31 +3,22 @@ layout: documentation title: Next-Gen Rules --- -{% include base.html %} +:::tip +This information is for advanced users. +If your are looking for general rules explanations have a look at our [Rules](https://www.openhab.org/docs/configuration/rules-dsl.html) article. +::: # Next-Generation Rule Engine -[![experimental](https://badges.github.io/stability-badges/dist/experimental.svg)](https://github.com/badges/stability-badges) - -Since openHAB 2.4 another Rule Engine has been added. It works fundamentally different than what you find with our current [Rules](https://www.openhab.org/docs/configuration/rules-dsl.html). It allows Rules to be edited in a graphical fashion and to interact with [JSR223 Scripts (Javascript, Jypthon, etc)](https://www.openhab.org/docs/configuration/jsr223.html). - - -## Installation - -Install the rule engine from Add-ons → Misc → Rule Engine (Experimental). - -![rule engine addon](images/rules_ng_addons.png) - -When you now refresh your browser, you will see a `Rules` menu appearing in the main menu of Paper UI. - -![new rule](images/rules_ng_new_rule.png) +Since openHAB 2.4 another Rule Engine has been added. +It allows Rules to be edited in a graphical fashion and to interact with [JSR223 Scripts (Javascript, Jypthon, etc)](https://www.openhab.org/docs/configuration/jsr223.html). ## Concept In general this rule engine aims to support rules defined with syntax similar to: ```text -ON item_id state changed IF item_id.state == desired_value THEN item_id2.state = desired_value2 +ON item_id state changed IF item_id.state == desired_value THEN item_id2.state = desired_value2 ``` A rule consists of basic information like name, tags and a description. The main building blocks of rules are modules however, and each rule consists of one or more instances of each of the following modules: @@ -54,43 +45,50 @@ Those use predefined configurations and/or modified module input/output objects. A given **Module type** has the following elements: - uid - unique id - label - localizable text - description - localizable text - configDescriptions - list of meta data for the configuration properties - input variables - list of meta data for the supported input objects - output variables - list of meta data for the supported output objects +```text +uid - unique id +label - localizable text +description - localizable text +configDescriptions - list of meta data for the configuration properties +input variables - list of meta data for the supported input objects +output variables - list of meta data for the supported output objects +``` **configDescriptions** has the following metadata defined for each property: - name - type - one of the following "text", "integer", "decimal", "boolean" - label - localizable text - description - localizable text - required - boolean flag indicating if this configuration property can be optional and thus it can be ommited in the rule, by default required is false - defaultValue - default value for the configuration property when not specified in the rule +```text +name +type - one of the following "text", "integer", "decimal", "boolean" +label - localizable text +description - localizable text +required - boolean flag indicating if this configuration property can be optional and thus it can be ommited in the rule, by default required is false +defaultValue - default value for the configuration property when not specified in the rule +``` **Input property** has the following metadata: - name - type - fully qualified name of Java class ("java.lang.Integer") - label - localizable text - description - localizable text - defaultValue - default value for the configuration property when not specified in the rule - tags - shows how to be considered a given value. For example, as a Temperature - +```text +name +type - fully qualified name of Java class ("java.lang.Integer") +label - localizable text +description - localizable text +defaultValue - default value for the configuration property when not specified in the rule +tags - shows how to be considered a given value. For example, as a Temperature +``` **Output property** has the following metadata: - name - type - fully qualified name of Java class ("java.lang.Integer") - label - localizable text - description - localizable text - defaultValue - default value for the configuration property when not specified in the rule - reference - which means the property value can be specified as a reference to configuration parameter or input parameter - tags - shows how a given value should be considered (e.g. as a Temperature) +```text +name +type - fully qualified name of Java class ("java.lang.Integer") +label - localizable text +description - localizable text +defaultValue - default value for the configuration property when not specified in the rule +reference - which means the property value can be specified as a reference to configuration parameter or input parameter +tags - shows how a given value should be considered (e.g. as a Temperature) +``` -**Supported Types** +### Supported Types The types supported in the **input/output** objects can be any string and the following validation is performed: @@ -109,15 +107,15 @@ The types in the **Configuration** object are restricted to the following: **JSON schemas for:** - * [module types](../../schemas/ModuleTypes_schema.json) - * [rule templates](../../schemas/Templates_schema.json) - * [rule instances](../../schemas/Rules_schema.json) +- [module types](../../schemas/ModuleTypes_schema.json) +- [rule templates](../../schemas/Templates_schema.json) +- [rule instances](../../schemas/Rules_schema.json) ### Sample Rules - * **Sample rule instance referencing module types:** +- **Sample rule instance referencing module types:** -``` +```json { "uid":"sample.rule1", "name":"SampleRule", @@ -157,16 +155,16 @@ The types in the **Configuration** object are restricted to the following: } ``` - * **Sample module types:** +- **Sample module types:** -``` -"triggers":[ - { +```json +"triggers":[ + { "uid":"SampleTrigger", "label":"SampleTrigger label", "description":"Sample Trigger description.", - "outputs":[ - { + "outputs":[ + { "name":"triggerOutput", "type":"java.lang.String", "label":"TriggerOutput label", @@ -176,12 +174,12 @@ The types in the **Configuration** object are restricted to the following: } ] }, - { + { "uid":"CompositeSampleTrigger", "label":"CompositeTrigger label", "description":"Composite Trigger description.", - "outputs":[ - { + "outputs":[ + { "name":"compositeTriggerOutput", "type":"java.lang.String", "label":"compositeTriggerOutput label", @@ -189,8 +187,8 @@ The types in the **Configuration** object are restricted to the following: "reference":"compositeChildTrigger1.triggerOutput" } ], - "children":[ - { + "children":[ + { "id":"compositeChildTrigger1", "type":"SampleTrigger" } @@ -199,28 +197,28 @@ The types in the **Configuration** object are restricted to the following: ] ``` -``` - "conditions":[ - { +```json + "conditions":[ + { "uid":"SampleCondition", "label":"SampleCondition label", "description":"Sample Condition description", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"operator", "type":"TEXT", "description":"Valid operators are =,>,<,!=", "required":true }, - { + { "name":"constraint", "type":"TEXT", "description":"Right operand which is compared with the input.", "required":true } ], - "inputs":[ - { + "inputs":[ + { "name":"conditionInput", "type":"java.lang.String", "label":"ConditionInput label", @@ -232,14 +230,14 @@ The types in the **Configuration** object are restricted to the following: ] ``` -``` -"actions":[ - { +```json +"actions":[ + { "uid":"SampleAction", "label":"SampleAction label", "description":"Sample Action description.", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"message", "type":"TEXT", "label":"message label", @@ -249,12 +247,12 @@ The types in the **Configuration** object are restricted to the following: } ] }, - { + { "uid":"CompositeSampleAction", "label":"CompositeAction label", "description":"Composite Action description.", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"compositeMessage", "type":"TEXT", "label":"custom message label", @@ -263,8 +261,8 @@ The types in the **Configuration** object are restricted to the following: "required":false } ], - "inputs":[ - { + "inputs":[ + { "name":"compositeActionInput", "type":"java.lang.String", "label":"ActionInput label", @@ -272,18 +270,18 @@ The types in the **Configuration** object are restricted to the following: "required":true } ], - "children":[ - { + "children":[ + { "id":"SampleAction1", "type":"SampleAction", - "configuration":{ + "configuration":{ "message":"$compositeMessage" } }, - { + { "id":"SampleAction2", "type":"SampleAction", - "configuration":{ + "configuration":{ "message":"$compositeActionInput" } } @@ -296,46 +294,46 @@ The types in the **Configuration** object are restricted to the following: There are several ways to add new rules: - * using **JAVA API** from package: **org.openhab.automation.api**; - * using **text console commands: openhab:automation**; - * using **resource bundles** that provide moduletypes, rules and rule templates stored in **.json** files; - * using **REST API** - see the next chapter bellow. +- using **JAVA API** from package: **org.openhab.automation.api**; +- using **text console commands: openhab:automation**; +- using **resource bundles** that provide moduletypes, rules and rule templates stored in **.json** files; +- using **REST API** - see the next chapter bellow. ## REST API -* http:///rest/module-types - lists module types. -* http:///rest/templates" - lists rule templates. -* http:///rest/rules - lists rule instances. +- `http:///rest/module-types` - lists module types. +- `http:///rest/templates` - lists rule templates. +- `http:///rest/rules` - lists rule instances. -#### /rest/templates +### /rest/templates - - GET /rest/templates - returns all registered rule templates. - - GET /rest/templates/{templateUID} - returned response includes only the content of the specified template. +- GET /rest/templates - returns all registered rule templates. +- GET /rest/templates/{templateUID} - returned response includes only the content of the specified template. -#### /rest/module-types +### /rest/module-types - - GET /rest/module-types - returns all registered module types. - - optional parameter 'type' with possible values: 'trigger', 'condition' or 'action' - filters the response to include only module definitions of specified type. - - optional parameter 'tags' - filters the response to include only module types which have specified tags. - - GET /rest/module-types/{moduleTypeUID} - returned response includes only the content of the specified module type. - -#### /rest/rules +- GET /rest/module-types - returns all registered module types. +- optional parameter 'type' with possible values: 'trigger', 'condition' or 'action' - filters the response to include only module definitions of specified type. +- optional parameter 'tags' - filters the response to include only module types which have specified tags. +- GET /rest/module-types/{moduleTypeUID} - returned response includes only the content of the specified module type. - - GET /rest/rules - returns all registered rule instances. - - POST /rest/rules - adds new rule instance to the rule registry. - - DELETE /rest/rules/{ruleUID} - deletes the specified rule instance. - - PUT /rest/rules/{ruleUID} - updates the specified rule instance. - - PUT /rest/rules/{ruleUID}/enable - enable/disable specified rule instance. - - PUT /rest/rules/{ruleUID}/runnow - executes actions of specified rule instance. - - GET /rest/rules/{ruleUID}/config - returns the configuration of the specified rule instance. - - PUT /rest/rules/{ruleUID}/config - updates the configuration of the specified rule instance. - - GET /rest/rules/{ruleUID}/triggers - returns the triggers defined for the specified rule instance. - - GET /rest/rules/{ruleUID}/conditions - returns the conditions defined for the specified rule instance. - - GET /rest/rules/{ruleUID}/actions - returns the actions defined for the specified rule instance. - - GET /rest/rules/{ruleUID}/{moduleCategory}/{id} - returns module instance with specified id and category {triggers/conditions/actions} of the specified rule. - - GET /rest/rules/{ruleUID}/{moduleCategory}/{id}/config - returns the configuration of the specified module instance. - - GET /rest/rules/{ruleUID}/{moduleCategory}/{id}/config/{param} - returns the value of specified module configuration parameter (media type is text/plain). - - PUT /rest/rules/{ruleUID}/{moduleCategory}/{id}/config/{param} - updates the value of specified module configuration parameter (media type is text/plain). +### /rest/rules + +- GET /rest/rules - returns all registered rule instances. +- POST /rest/rules - adds new rule instance to the rule registry. +- DELETE /rest/rules/{ruleUID} - deletes the specified rule instance. +- PUT /rest/rules/{ruleUID} - updates the specified rule instance. +- PUT /rest/rules/{ruleUID}/enable - enable/disable specified rule instance. +- PUT /rest/rules/{ruleUID}/runnow - executes actions of specified rule instance. +- GET /rest/rules/{ruleUID}/config - returns the configuration of the specified rule instance. +- PUT /rest/rules/{ruleUID}/config - updates the configuration of the specified rule instance. +- GET /rest/rules/{ruleUID}/triggers - returns the triggers defined for the specified rule instance. +- GET /rest/rules/{ruleUID}/conditions - returns the conditions defined for the specified rule instance. +- GET /rest/rules/{ruleUID}/actions - returns the actions defined for the specified rule instance. +- GET /rest/rules/{ruleUID}/{moduleCategory}/{id} - returns module instance with specified id and category {triggers/conditions/actions} of the specified rule. +- GET /rest/rules/{ruleUID}/{moduleCategory}/{id}/config - returns the configuration of the specified module instance. +- GET /rest/rules/{ruleUID}/{moduleCategory}/{id}/config/{param} - returns the value of specified module configuration parameter (media type is text/plain). +- PUT /rest/rules/{ruleUID}/{moduleCategory}/{id}/config/{param} - updates the value of specified module configuration parameter (media type is text/plain). ## JAVA API @@ -346,36 +344,35 @@ There are several ways to add new rules: `org.openhab.automation.template.TemplateRegistry` - provides functionality to get templates from the Rule Engine. - ## Text console commands -`automation listModuleTypes [-st] ` - lists all Module Types. If filter is present, lists only matching Module Types. +`automation listModuleTypes [-st] ` - lists all Module Types. If filter is present, lists only matching Module Types. -`automation listTemplates [-st] ` - lists all Templates. If filter is present, lists only matching Templates. +`automation listTemplates [-st] ` - lists all Templates. If filter is present, lists only matching Templates. -`automation listRules [-st] `- lists all Rules. If filter is present, lists only matching Rules. +`automation listRules [-st] `- lists all Rules. If filter is present, lists only matching Rules. -`automation removeModuleTypes [-st] ` - Removes the Module Types, loaded from the given url. +`automation removeModuleTypes [-st] ` - Removes the Module Types, loaded from the given url. -`automation removeTemplates [-st] ` - Removes the rule, specified by given UID. +`automation removeRule [-st] ` - Removes the rule, specified by given UID. -`automation removeRules [-st] `- Removes the rules. If filter is present, removes only matching Rules. +`automation removeRules [-st] `- Removes the rules. If filter is present, removes only matching Rules. -`automation importModuleTypes [-p] [-st] ` - Imports Module Types from given url. If parser type missing, "json" parser will be set as default. +`automation importModuleTypes [-p] [-st] ` - Imports Module Types from given url. If parser type missing, "json" parser will be set as default. -`automation importTemplates [-p] [-st] ` - Imports Templates from given url. If parser type missing, "json" parser will be set as default. +`automation importTemplates [-p] [-st] ` - Imports Templates from given url. If parser type missing, "json" parser will be set as default. -`automation importRules [-p] [-st] ` - Imports Rules from given url. If parser type missing, "json" parser will be set as default. +`automation importRules [-p] [-st] ` - Imports Rules from given url. If parser type missing, "json" parser will be set as default. -`automation exportModuleTypes [-p] [-st] ` - Exports Module Types in a file. If parser type missing, "json" parser will be set as default. +`automation exportModuleTypes [-p] [-st] ` - Exports Module Types in a file. If parser type missing, "json" parser will be set as default. -`automation exportTemplates [-p] [-st] ` - Exports Templates in a file. If parser type missing, "json" parser will be set as default. +`automation exportTemplates [-p] [-st] ` - Exports Templates in a file. If parser type missing, "json" parser will be set as default. -`automation exportRules [-p] [-st] ` - Exports Rules in a file. If parser type missing, "json" parser will be set as default. +`automation exportRules [-p] [-st] ` - Exports Rules in a file. If parser type missing, "json" parser will be set as default. -`automation enableRule [-st] ` - Enables the Rule, specified by given UID. +`automation enableRule [-st] ` - Enables the Rule, specified by given UID. The use of the 'enable' argument is optional, and will accept a boolean value. If used, the command will enable (true) or disable (false) the Rule. If it is not used, the command will return the current status of the Rule. @@ -397,51 +394,51 @@ The rule template is used only once when the rule is imported in the Rule Engine After that the reference from the rule instance to the rule template is removed and a given rule may exist even if the rule template is removed or modified. This will not have any impact on the already imported rules. - * **Sample rule instance referencing rule template:** +- **Sample rule instance referencing rule template:** -``` - { +```json + { "uid": "sample.rulebytemplate", "name": "RuleByTemplate", "templateUID": "SampleRuleTemplate", - "tags": [ + "tags": [ "rule", "template" ], - "configuration": { + "configuration": { "condition_operator": "!=", "condition_constraint": "template" } } ``` - * **Sample rule template:** +- **Sample rule template:** -``` - { +```json + { "uid":"SampleRuleTemplate", "description":"Sample Rule Template", - "tags":[ + "tags":[ "sample", "rule", "template" ], - "configDescriptions":[ + "configDescriptions":[ { - "name":"condition_operator", + "name":"condition_operator", "type": "TEXT", "description": "Valid operators are =,>,<,!=", "required": true }, { - "name":"condition_constraint", + "name":"condition_constraint", "type": "TEXT", "description": "Right operand which is compared with the input.", "required": true } ], - "triggers": [ - { + "triggers": [ + { "id": "CompositeSampleTriggerTemplateID", "type": "CompositeSampleTrigger", "label": "Sample Trigger", @@ -464,7 +461,7 @@ This will not have any impact on the already imported rules. } ], "actions": [ - { + { "id": "CompositeActionTemplateID", "type": "CompositeSampleAction", "label": "Sample Action", @@ -472,7 +469,7 @@ This will not have any impact on the already imported rules. "configuration": { "compositeMessage": "Hello World!!!" }, - "inputs": { + "inputs": { "compositeActionInput": "CompositeSampleTriggerTemplateID.compositeTriggerOutput" } } @@ -487,98 +484,101 @@ The above example uses two rule configuration properties: ### GenericEventTrigger -GenericEventTrigger has 3 configuration paramters: `eventTopic`,` eventSource` and `eventTypes` and one output: 'event'. +GenericEventTrigger has 3 configuration paramters: `eventTopic`,`eventSource` and `eventTypes` and one output: 'event'. +```json +{ + "uid":"GenericEventTrigger", + "label":"Basic Event Trigger", + "description":"Triggers Rules on Events", + "configDescriptions":[ { - "uid":"GenericEventTrigger", - "label":"Basic Event Trigger", - "description":"Triggers Rules on Events", - "configDescriptions":[ - { - "name":"eventTopic", - "type":"TEXT", - "label":"Topic", - "description":"This is the topic, the trigger will listen to: >>openhab/*<<", - "required":true, - "defaultValue":"openhab/*" - }, - { - "name":"eventSource", - "type":"TEXT", - "label":"Source", - "description":"This is the source of the event (eg. item name)", - "required":true, - "defaultValue":"" - }, - { - "name":"eventTypes", - "type":"TEXT", - "label":"Event Type", - "description":"the event type, the trigger should listen to. Multiple types can be specified comma-separated", - "required":true, - "defaultValue":"" - } - ], - "outputs":[ - { - "name":"event", - "type":"org.openhab.core.events.Event", - "label":"Event", - "description":"The events which was sent.", - "reference":"event" - } - ] + "name":"eventTopic", + "type":"TEXT", + "label":"Topic", + "description":"This is the topic, the trigger will listen to: >>openhab/*<<", + "required":true, + "defaultValue":"openhab/*" + }, + { + "name":"eventSource", + "type":"TEXT", + "label":"Source", + "description":"This is the source of the event (eg. item name)", + "required":true, + "defaultValue":"" + }, + { + "name":"eventTypes", + "type":"TEXT", + "label":"Event Type", + "description":"the event type, the trigger should listen to. Multiple types can be specified comma-separated", + "required":true, + "defaultValue":"" } - + ], + "outputs":[ + { + "name":"event", + "type":"org.openhab.core.events.Event", + "label":"Event", + "description":"The events which was sent.", + "reference":"event" + } + ] +} +``` ### GenericCompareCondition This module type is used to compare a value against a configuration property using an operator like `<, >, =`. The value to be compared can be specified either as an input or as a configuration property. - { - "uid":"GenericCompareCondition", - "label":"CompareCondition", - "description":"configurable compare condition", - "configDescriptions":[ - { - "name":"inputproperty", - "label":"Input property", - "type":"TEXT", - "description":"property of the input to be compared", - "required":false - }, - { - "name":"right", - "type":"TEXT", - "label":"compare with", - "description":"the value to be compared with the input", - "required":true - }, - { - "name":"operator", - "type":"TEXT", - "description":"the compare operator, allowed are <, >, =", - "required":true, - "defaultValue":"=" - } - ], - "inputs": [ - { - "name":"input", - "type": "java.lang.Object", - "label": "input", - "description": "The input which will be compared.", - "required":true - } - ] - } +```json +{ + "uid":"GenericCompareCondition", + "label":"CompareCondition", + "description":"configurable compare condition", + "configDescriptions":[ + { + "name":"inputproperty", + "label":"Input property", + "type":"TEXT", + "description":"property of the input to be compared", + "required":false + }, + { + "name":"right", + "type":"TEXT", + "label":"compare with", + "description":"the value to be compared with the input", + "required":true + }, + { + "name":"operator", + "type":"TEXT", + "description":"the compare operator, allowed are <, >, =", + "required":true, + "defaultValue":"=" + } + ], + "inputs": [ + { + "name":"input", + "type": "java.lang.Object", + "label": "input", + "description": "The input which will be compared.", + "required":true + } + ] +} +``` ## Providing new Module Types -The rule engine is pluggable - any OSGi bundle can provide implementation for triggers, actions and condition module types and their corresponding metatype definition in JSON format. +The rule engine is pluggable - any OSGi bundle can provide implementation for triggers, actions and condition module types and their corresponding metatype definition in JSON format. -The extension bundle should register the service ModuleHandlerFactory (`org.openhab.automation.handler.ModuleHandlerFactory`) +The extension bundle should register the service ModuleHandlerFactory (`org.openhab.automation.handler.ModuleHandlerFactory`) and implement the necessary methods for creation of instances of the supported module handlers: - `org.openhab.automation.handler.TriggerHandler` @@ -590,44 +590,45 @@ and implement the necessary methods for creation of instances of the supported m Another way to extend the supported module types is by defining composite module types as an extension of the system module types. The composite module type wraps one or more instances of a system module type and defines new configuration parameters, inputs and outputs. - +```json +{ + "uid":"ItemStateChangeTrigger", + "label":"Item State Trigger", + "description":"This triggers a rule if an items state changed", + "configDescriptions":[ { - "uid":"ItemStateChangeTrigger", - "label":"Item State Trigger", - "description":"This triggers a rule if an items state changed", - "configDescriptions":[ - { - "name":"itemName", - "type":"TEXT", - "context":"item", - "label":"item name", - "description":"the name of the item which's state change should be observed", - "required":true - } - ], - "children":[ - { - "id":"itemStateChangeTriggerID", - "type":"GenericEventTrigger", - "configuration":{ - "eventSource":"$itemName", - "eventTopic":"openhab/items/*", - "eventTypes":"ItemStateEvent" - } - } - ], - "outputs":[ - { - "name":"event", - "type":"org.openhab.core.events.Event", - "description":"the event of the item state change", - "label":"event", - "reference":"itemStateChangeTriggerID.event" - } - ] + "name":"itemName", + "type":"TEXT", + "context":"item", + "label":"item name", + "description":"the name of the item which's state change should be observed", + "required":true } + ], + "children":[ + { + "id":"itemStateChangeTriggerID", + "type":"GenericEventTrigger", + "configuration":{ + "eventSource":"$itemName", + "eventTopic":"openhab/items/*", + "eventTypes":"ItemStateEvent" + } + } + ], + "outputs":[ + { + "name":"event", + "type":"org.openhab.core.events.Event", + "description":"the event of the item state change", + "label":"event", + "reference":"itemStateChangeTriggerID.event" + } + ] +} +``` This example demonstrates a new module type *ItemStateChangeTrigger* which wraps the system module type *GenericEventTrigger*. It defines the new configuration property `itemName` which is used as the `eventSource` property of the *GenericEventTrigger*. The other config parameters `eventTopic` and `eventTypes` are staticly defined. -The composite module type can also have inputs and outputs and can use a reference to map them to inputs and outputs of the nested system module type(s). +The composite module type can also have inputs and outputs and can use a reference to map them to inputs and outputs of the nested system module type(s). diff --git a/configuration/services.md b/configuration/services.md index a0bcdcc21..cc26f520d 100644 --- a/configuration/services.md +++ b/configuration/services.md @@ -3,8 +3,6 @@ layout: documentation title: Services --- -{% include base.html %} - # Services {% include contribution-wanted.html %} diff --git a/configuration/things.md b/configuration/things.md index 45ed55e08..f365004e6 100644 --- a/configuration/things.md +++ b/configuration/things.md @@ -3,8 +3,6 @@ layout: documentation title: Things --- -{% include base.html %} - # Things [Things]({{base}}/concepts/things.html) represent the physical layer of an openHAB system. @@ -33,11 +31,11 @@ From then on, everything else is configured at the application layer for that en From start to finish, the process for fully configuring a physical entity represented by a Thing looks like this: 1. Identify the binding required for the Thing -2. Install the binding if it has not already been installed -3. Define and configure the Thing -4. Identify the Channels provided by the Thing -5. [Add Items]({{base}}/configuration/items.html) and link them to the Thing's Channels -6. At this point Items can be used to control the Thing or consume its information in e.g. [Sitemaps]({{base}}/configuration/sitemaps.html) or [Rules]({{base}}/configuration/rules-dsl.html) +1. Install the binding if it has not already been installed +1. Define and configure the Thing +1. Identify the Channels provided by the Thing +1. [Add Items]({{base}}/configuration/items.html) and link them to the Thing's Channels +1. At this point Items can be used to control the Thing or consume its information in e.g. [Sitemaps]({{base}}/configuration/sitemaps.html) or [Rules]({{base}}/configuration/rules-dsl.html) There are two methods for defining Things provided by the various bindings: through [discovery]({{base}}/concepts/discovery.html) or by manual definition in configuration text files. @@ -58,10 +56,10 @@ Newly discovered Things can be added to the system from the inbox using the UI. Things that are added to openHAB from the inbox are maintained in an internal database as opposed to a manually defined `.things` file (see below). Unlike manually defined Things, if a Thing has configurable properties, these properties can be set through a user interface. -**Attention:** It has to be noted, that Things and Items added through Paper UI / discovery to the internal database will **not** be written to configuration files. +**Attention:** It has to be noted, that Things and Items added through the UI / discovery to the internal database will **not** be written to configuration files. Things and Items definitions can be distributed and mixed among the internal database and manually defined text files. -See the [configuration tutorial]({{base}}/tutorials/beginner/configuration.html) for a step-by-step guide on how to configure Things using discovery. +See the [beginer tutorial]({{base}}/tutorials/things_simple.html) for a step-by-step guide on how to configure Things using discovery. ### Defining Things Using Files @@ -84,7 +82,6 @@ To help organizing your things, you also may define a location (`Location` in th Inside the square brackets configuration parameters of the thing are defined. The type of the configuration parameter is determined by the binding and must be specified accordingly in the DSL. - **Examples:** ```xtend @@ -110,8 +107,8 @@ Bridges can be defined together with contained things. The following configurati ```xtend Bridge hue:bridge:mybridge [ ipAddress="192.168.3.123" ] { - Thing 0210 bulb1 [ lightId="1" ] - Thing 0210 bulb2 [ lightId="2" ] + Thing 0210 bulb1 [ lightId="1" ] + Thing 0210 bulb2 [ lightId="2" ] } ``` @@ -160,11 +157,11 @@ It is also possible to add additional channels to existing things and for bindin ```xtend Thing yahooweather:weather:losangeles [ location=2442047, unit="us", refresh=120 ] { - Channels: - State String : customChannel1 "My Custom Channel" [ - configParameter="Value" - ] - State Number : customChannel2 [] + Channels: + State String : customChannel1 "My Custom Channel" [ + configParameter="Value" + ] + State Number : customChannel2 [] } ``` @@ -176,11 +173,11 @@ As state channels are the default channels, you can omit the `State` keyword, th ```xtend Thing yahooweather:weather:losangeles [ location=2442047, unit="us", refresh=120 ] { - Channels: - String : customChannel1 "My Custom Channel" [ - configParameter="Value" - ] - Number : customChannel2 [] + Channels: + String : customChannel1 "My Custom Channel" [ + configParameter="Value" + ] + Number : customChannel2 [] } ``` @@ -190,10 +187,10 @@ You may optionally give the channel a proper label (like “My Custom Channel” ```xtend Thing yahooweather:weather:losangeles [ location=2442047, unit="us", refresh=120 ] { - Channels: - Trigger String : customChannel1 [ - configParameter="Value" - ] + Channels: + Trigger String : customChannel1 [ + configParameter="Value" + ] } ``` @@ -235,11 +232,11 @@ If you decide not to, then the label from the referenced channel type definition ### Linking Items -Items can be linked to Channels of discovered or manually defined Things inside Paper UI or inside configuration files. +Items can be linked to Channels of discovered or manually defined Things inside UI or inside configuration files. For more details about Item definition and usage, please refer to the [Items configuration article]({{base}}/configuration/items.html). It is important to note, that Channels of discovered Things can also be linked to Items defined in `.items` files. -In order to link a Thing to an Item in an `.items` file, open the Thing in Paper UI under *Configuration → Things*. +In order to link a Thing to an Item in an `.items` file, open the Thing in UI under `Settings → Things`. In the list of Thing Channels, look for the Channel you wish to link to an Item and copy the Channel's ID. For instance, a Z-Wave switch might have a Switch Channel that has an ID like this: diff --git a/configuration/transform.md b/configuration/transform.md index ee0749d1a..64300739c 100644 --- a/configuration/transform.md +++ b/configuration/transform.md @@ -3,8 +3,6 @@ layout: documentation title: Transformations Configuration --- -{% include base.html %} - # Transformations Configuration Transformations are used to translate data from a cluttered or technical raw value to a processed or human-readable representation. diff --git a/developers/audio/index.md b/developers/audio/index.md index 48a310405..061d774ab 100644 --- a/developers/audio/index.md +++ b/developers/audio/index.md @@ -3,8 +3,6 @@ layout: developersguide title: Audio & Voice --- -{% include base.html %} - # Audio & Voice openHAB provides a modular architecture that enables all kinds of different use cases. @@ -20,11 +18,10 @@ The framework itself can handle multiple audio sinks at the same time. The distribution comes with these built-in audio sinks options: -| Output device | Audio sink | Description | -|-------------------|-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| javasound | System Speaker | This uses the JRE sound drivers to play audio to the local sound interface. | -| enhancedjavasound | System Speaker (with mp3 support) | This uses the JRE sound drivers plus an additional 3rd party library, which adds support for mp3 files. | -| webaudio | Web Audio | If sounds should not be played on the server but on the client: This sink sends the audio stream through HTTP to web clients, which then cause it to be played back by the browser. The browser needs to be opened and have a compatible UI running. Currently this feature is supported by Paper UI and HABPanel. | +| Output device | Audio sink | Description | +|-------------------|-----------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| enhancedjavasound | System Speaker (with mp3 support) | This uses the JRE sound drivers plus an additional 3rd party library, which adds support for mp3 files. | +| webaudio | Web Audio | If sounds should not be played on the server but on the client: This sink sends the audio stream through HTTP to web clients, which then cause it to be played back by the browser. The browser needs to be opened and have a compatible UI running. Currently this feature is only supported by HABPanel. | The framework is able to play sound either from the file system, from URLs (e.g. Internet radio streams) or generated by text-to-speech engines (which are available as optional Voice add-ons). diff --git a/developers/bindings/binding-xml.md b/developers/bindings/binding-xml.md index 1bea59cd4..02ee57ea4 100644 --- a/developers/bindings/binding-xml.md +++ b/developers/bindings/binding-xml.md @@ -3,7 +3,7 @@ layout: developersguide title: Binding Descriptions --- -## Binding Definitions +# Binding Definitions Every binding has to provide meta information such as binding id or name. @@ -16,8 +16,7 @@ The full Java API for binding definitions can be found in the Java package `org. For the declarative way, you add your binding information in form of a `binding.xml` file to the bundle's folder `/src/main/resources/OH-INF/binding/binding.xml`. - -### XML Structure for Binding Definitions +## XML Structure for Binding Definitions ```xml @@ -51,7 +50,6 @@ For the declarative way, you add your binding information in form of a `binding. | config-description-ref | The reference to a configuration description for the binding within the ConfigDescriptionRegistry | optional | | config-description-ref.uri | The URI of the configuration description for the binding within the ConfigDescriptionRegistry | mandatory | - The full XML schema for binding definitions is specified in the [Binding XSD](https://openhab.org/schemas/binding-1.0.0.xsd) file. **Hints:** @@ -59,10 +57,9 @@ The full XML schema for binding definitions is specified in the [Binding XSD](ht - The attribute `uri` in the section `config-description` is optional, it *should not* be specified in binding definition files because it's an embedded configuration. If the `uri` is *not* specified, the configuration description is registered as `binding:bindingID`, otherwise the given `uri` is used. - If a configuration description is already specified somewhere else and the binding wants to (re-)use it, a `config-description-ref` should be used instead. - Normally the service id must not be defined, because it is implicitly set to "binding.<binding.id>". -A binding can register an OSGi service which implements the ManagedService interface and define the service.pid as e.g."binding.hue" to receive the configuration. + A binding can register an OSGi service which implements the ManagedService interface and define the service.pid as e.g."binding.hue" to receive the configuration. - -### Example +## Example The following code gives an example for a binding definition. diff --git a/developers/bindings/config-xml.md b/developers/bindings/config-xml.md index 15087bc4e..9461c931d 100644 --- a/developers/bindings/config-xml.md +++ b/developers/bindings/config-xml.md @@ -3,8 +3,6 @@ layout: developersguide title: Configuration Descriptions --- -{% include base.html %} - # Configuration Descriptions Specific services or bindings usually require a configuration to be operational in a meaningful way. @@ -31,9 +29,10 @@ The description can include limited HTML to enhance the display of this informat The following HTML tags are allowed -: ```,
, ,

,

,

,

,

,
, ,

, , , , ,

    ,
      ,
    1. ```. These must be inside the XML escape sequence - eg. -``````. +``. ## XML Structure for Configuration Descriptions + ```xml
- + @@ -147,10 +146,10 @@ Further, the item context can contain criteria to filter the li In the case of above filter only those items will be shown that satisfy the filter's conditions. The above filter is evaluated as follows: -``` +```text (type=Switch OR type=Dimmer) AND (tag=Light OR tag=Heating) - ``` + Similarly, the Channel context can contain criteria to filter channels based on kind field. The value of kind can either be STATE or TRIGGER. For example: @@ -163,6 +162,7 @@ For example: Groups allow parameters to be grouped together into logical blocks so that the user can find the parameters they are looking for. A parameter can be placed into a group so that the UI knows how to display the information. +
✔️ transform/*.map *.js filestransform/*.map*.js files
Define Persistenceparameter.maxThe maximum value for numeric types, or the maximum length of strings. Note that the value of any options may be outside of this value (optional).
parameter.stepThe value granularity for a numeric value (optional).
parameter.patternThe regular expression for a text type (optional).
parameter.requiredSpecifies whether the value is required (optional).
parameter.requiredSpecifies whether the value is required (optional, default: false).
parameter.readOnlySpecifies whether the value is read-only (optional).
parameter.multipleSpecifies whether multiple selections of options are allowed (optional).
parameter.groupNameSets a group name for this parameter (optional).
@@ -177,7 +177,7 @@ The full XML schema for configuration descriptions is specified in the [openHAB **Hints:** - Although the attribute `uri` is optional, it *must* be specified in configuration description files. -Only for embedded configuration descriptions in documents for binding definitions and `Thing` type descriptions, the attribute is optional. + Only for embedded configuration descriptions in documents for binding definitions and `Thing` type descriptions, the attribute is optional. ## Example diff --git a/developers/bindings/faq.md b/developers/bindings/faq.md index 5b3c7adca..6d737d82e 100644 --- a/developers/bindings/faq.md +++ b/developers/bindings/faq.md @@ -3,54 +3,49 @@ layout: developersguide title: FAQ --- -{% include base.html %} - # Frequently Asked Questions (FAQs) Here is a list of frequently asked questions around the development of bindings. If you do not find an answer to your question, do not hesitate to ask it on the support forum. -### Structuring Things and Thing Types +## Structuring Things and Thing Types + +1. _I am implementing a binding for system X. Shall I design this as one Thing or as a Bridge with multiple Things for the different functionalities?_ -1. _I am implementing a binding for system X. -Shall I design this as one Thing or as a Bridge with multiple Things for the different functionalities?_ - In general, both options are valid: 1. You have one Thing which has channels for all your actors, sensors and other functions - 2. You have one Bridge and an additional Thing for every actor and sensor and they would hold the channels + 1. You have one Bridge and an additional Thing for every actor and sensor and they would hold the channels The preferred architecture is the latter, if this is feasible. This means that the physical devices should be represented by a Thing each. This only makes sense if your system allows you to identify the different physical devices at all. Especially, such an architecture is useful if you can do a discovery of new devices that could then be presented to the user/admin. - + If your system does not provide you any possibility to get hold of such information, but rather only shows you a "logical" view of it, then 1) is also a valid option to pursue. - -2. _Do I have to create XML files in `OH-INF/thing` for all devices or is there any other option?_ + +1. _Do I have to create XML files in `OH-INF/thing` for all devices or is there any other option?_ No, the XML files are only one way to describe your devices. - Alternatively, you can implement your own [ThingTypeProvider](https://github.com/openhab/openhab-core/blob/master/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/binding/ThingTypeProvider.java), through which you can provide thing descriptions in a programmatic way. + Alternatively, you can implement your own [ThingTypeProvider](https://github.com/openhab/openhab-core/blob/main/bundles/org.openhab.core.thing/src/main/java/org/openhab/core/thing/binding/ThingTypeProvider.java), through which you can provide thing descriptions in a programmatic way. Nonetheless, the static XML descriptions of thing types can be picked up for documentation generation and other purposes. - So whenever possible, static XML descriptions should be provided. + So whenever possible, static XML descriptions should be provided. -3. _For my system XY, there are so many different variants of devices. -Do I really need to define a thing type for every single one of them?_ +1. _For my system XY, there are so many different variants of devices. Do I really need to define a thing type for every single one of them?_ Thing types are important if you have no chance to request any structural information about the devices from your system and if you need users to manually chose a thing to add or configure (i.e. there is also no automatic discovery). The thing types that you provide will be the list the user can choose from. If your system supports auto-discovery and you can also dynamically construct things (and their channels) from structural information that you can access during runtime, there is in theory no need to provide any thing type description at all. Nonetheless, static descriptions of thing types have the advantage that the user knows which kind of devices are supported, no matter if he has a device at home or not - so you should at least have static XML descriptions for the devices that are known to you at implementation time. - -4. _I have a device that can have different firmware versions with slightly different functionality. -Should I create one or two thing types for it?_ - + +1. _I have a device that can have different firmware versions with slightly different functionality. Should I create one or two thing types for it?_ + If the firmware version makes a huge difference for the device (and can be seen as a different model of it), then it is ok to have different things defined. If the list of channels can be determined by knowing the firmware revision, this is good. If you can only determine the existing channels by querying the device itself, it might be the better option to have only one thing type and construct its channels upon first access. -5. _When creating a Thing through my ThingHanderFactory, does it exactly have to have the channels that are defined in the thing type description?_ - +1. _When creating a Thing through my ThingHanderFactory, does it exactly have to have the channels that are defined in the thing type description?_ + It must at least have the channels that are defined in its thing type (and they are already automatically added by the super() implementation). Nonetheless, you are free to add any number of additional channels to the thing. diff --git a/developers/bindings/images/concept.png b/developers/bindings/images/concept.png index e3ba3a66d..03698ef06 100644 Binary files a/developers/bindings/images/concept.png and b/developers/bindings/images/concept.png differ diff --git a/developers/bindings/images/thing_life_cycle_shutdown.png b/developers/bindings/images/thing_life_cycle_shutdown.png index 9f43da302..c036fefe3 100644 Binary files a/developers/bindings/images/thing_life_cycle_shutdown.png and b/developers/bindings/images/thing_life_cycle_shutdown.png differ diff --git a/developers/bindings/images/thing_life_cycle_startup.png b/developers/bindings/images/thing_life_cycle_startup.png index 16d4266f6..ea5102898 100644 Binary files a/developers/bindings/images/thing_life_cycle_startup.png and b/developers/bindings/images/thing_life_cycle_startup.png differ diff --git a/developers/bindings/images/things.png b/developers/bindings/images/things.png index d51f5bab9..2b0fe9050 100644 Binary files a/developers/bindings/images/things.png and b/developers/bindings/images/things.png differ diff --git a/developers/bindings/index.md b/developers/bindings/index.md index 55656d992..954fc7d64 100644 --- a/developers/bindings/index.md +++ b/developers/bindings/index.md @@ -3,9 +3,8 @@ layout: developersguide title: Bindings --- -{% include base.html %} - # Developing a Binding + {:.no_toc} A binding is an extension to openHAB that integrates an external system like a software service or a hardware device. @@ -19,7 +18,8 @@ It makes sense to briefly read over all sections to make you familiar with what During development you might come back with specific questions. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## Structure of a Binding @@ -117,16 +117,16 @@ For an example, our exemplary Weather binding starts and stops a scheduled job t The startup of a handler is divided in two essential steps: 1. Handler is registered: `ThingHandler` instance is created by a `ThingHandlerFactory` and tracked by the framework. -In addition, the handler can be registered as a service if required, e.g. as `FirmwareUpdateHandler` or `ConfigStatusProvider`. + In addition, the handler can be registered as a service if required, e.g. as `FirmwareUpdateHandler` or `ConfigStatusProvider`. -2. Handler is initialized: `ThingHandler.initialize()` is called by the framework in order to initialize the handler. -This method is only called if all 'required' configuration parameters of the Thing are present. -The handler is ready to work (methods like `handleCommand`, `handleUpdate` or `thingUpdated` can be called). +1. Handler is initialized: `ThingHandler.initialize()` is called by the framework in order to initialize the handler. + This method is only called if all 'required' configuration parameters of the Thing are present. + The handler is ready to work (methods like `handleCommand`, `handleUpdate` or `thingUpdated` can be called). -The diagram below illustrates the startup of a handler in more detail. -The life cycle is controlled by the `ThingManager`. + The diagram below illustrates the startup of a handler in more detail. + The life cycle is controlled by the `ThingManager`. -![thing_life_cycle_startup](images/thing_life_cycle_startup.png) + ![thing_life_cycle_startup](images/thing_life_cycle_startup.png) The `ThingManager` mediates the communication between a `Thing` and a `ThingHandler` from the binding. The `ThingManager` creates for each Thing a `ThingHandler` instance using a `ThingHandlerFactory`. @@ -153,11 +153,11 @@ After the handler is initialized, the handler must be ready to handle methods ca The shutdown of a handler is also divided in two essential steps: 1. Handler is unregistered: `ThingHandler` instance is no longer tracked by the framework. -The `ThingHandlerFactory` can unregister handler services (e.g. `FirmwareUpdateHandler` or `ConfigStatusProvider`) if registered, or release resources. + The `ThingHandlerFactory` can unregister handler services (e.g. `FirmwareUpdateHandler` or `ConfigStatusProvider`) if registered, or release resources. -2. Handler is disposed: `ThingHandler.disposed()` method is called. -The framework expects `dispose()` to be non-blocking and to return quickly. -For longer running disposals, the implementation has to take care of scheduling a separate job. +1. Handler is disposed: `ThingHandler.disposed()` method is called. + The framework expects `dispose()` to be non-blocking and to return quickly. + For longer running disposals, the implementation has to take care of scheduling a separate job. ![thing_life_cycle_shutdown](images/thing_life_cycle_shutdown.png) @@ -208,8 +208,8 @@ Inside the `handleCommand` method binding specific logic can be executed. The ThingHandler implementation must be prepared to -* handle different command types depending on the item types, that are defined by the channels, -* be called at the same time from different threads. +- handle different command types depending on the item types, that are defined by the channels, +- be called at the same time from different threads. If an exception is thrown in the method, it will be caught by the framework and logged as an error. So it is better to handle communication errors within the binding and to update the thing status accordingly. @@ -220,19 +220,19 @@ The following code block shows a typical implementation of the `handleCommand` m @Override public void handleCommand(ChannelUID channelUID, Command command) { try { - switch (channelUID.getId()) { - case CHANNEL_TEMPERATURE: - if(command instanceof OnOffType.class) { - // binding specific logic goes here - SwitchState deviceSwitchState = convert((OnOffType) command); - updateDeviceState(deviceSwitchState); - } - break; - // ... - } - statusUpdated(ThingStatus.ONLINE); - } catch(DeviceCommunicationException ex) { - // catch exceptions and handle it in your binding + switch (channelUID.getId()) { + case CHANNEL_TEMPERATURE: + if(command instanceof OnOffType.class) { + // binding specific logic goes here + SwitchState deviceSwitchState = convert((OnOffType) command); + updateDeviceState(deviceSwitchState); + } + break; + // ... + } + statusUpdated(ThingStatus.ONLINE); + } catch(DeviceCommunicationException ex) { + // catch exceptions and handle it in your binding statusUpdated(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, ex.getMessage()); } } @@ -299,7 +299,11 @@ Of course, the polling job must be cancelled in the dispose method: ```java @Override public void dispose() { - pollingJob.cancel(true); + final job = pollingJob; + if (job != null) { + job.cancel(true); + pollingJob = null; + } } ``` @@ -356,11 +360,11 @@ All other states are managed by the framework. Furthermore bindings can specify a localized description of the thing status by providing the reference of the localization string, e.g @text/rate_limit. The corresponding handler is able to provide placeholder values as a JSON-serialized array of strings: -``` +```text @text/rate_limit ["60", "10", "@text/hour"] ``` -``` +```text rate_limit=Device is blocked by remote service for {0} minutes. Maximum limit of {1} configuration changes per {2} has been exceeded. For further info please refer to device vendor. @@ -407,7 +411,7 @@ The following example shows how to modify two properties of a thing: ```java protected void devicePropertiesChanged(DeviceInfo deviceInfo) { - Map properties = editProperties(); + Map properties = editProperties(); properties.put(Thing.PROPERTY_SERIAL_NUMBER, deviceInfo.getSerialNumber()); properties.put(Thing.PROPERTY_FIRMWARE_VERSION, deviceInfo.getFirmwareVersion()); updateProperties(properties); @@ -501,7 +505,6 @@ Therefore, the `BridgeHandler` interface extends the `ThingHandler` interface. openHAB provides an abstract implementation of the `BridgeHandler` interface named `BaseBridgeHandler`. It is recommended to use this class, because it covers a lot of common logic. - ### Life cycle A `BridgeHandler` has the same life cycle than a `ThingHandler` (created by a `ThingHandlerFactory`, well defined life cycle by handler methods `initialize()` and `dispose()`, see chapter [Life Cycle](#lifecycle)). @@ -534,12 +537,12 @@ A *ThingHandler* as handler for the thing entity can provide the configuration s For things that are created by sub-classes of the `BaseThingHandlerFactory` the provider is already automatically registered as an OSGi service if the concrete thing handler implements the configuration status provider interface. Currently the framework provides two base thing handler implementations for the configuration status provider interface: -* `org.openhab.core.thing.binding.ConfigStatusThingHandler` extends the `BaseThingHandler` and is to be used if the configuration status is to be provided for thing entities -* `org.openhab.core.thing.binding.ConfigStatusBridgeHandler` extends the `BaseBridgeHandler` and is to be used if the configuration status is to be provided for bridge entities +- `org.openhab.core.thing.binding.ConfigStatusThingHandler` extends the `BaseThingHandler` and is to be used if the configuration status is to be provided for thing entities +- `org.openhab.core.thing.binding.ConfigStatusBridgeHandler` extends the `BaseBridgeHandler` and is to be used if the configuration status is to be provided for bridge entities Sub-classes of these handlers must only override the operation `getConfigStatus` to provide the configuration status in form of a collection of `org.openhab.core.config.core.status.ConfigStatusMessage`s. -#### Internationalization +#### Internationalization of Config Status Messages The framework will take care of internationalizing messages. @@ -548,10 +551,10 @@ The actual message key is built by the operation `withMessageKeySuffix(String)` As a result depending on the type of the message the final constructed message keys are: -* config-status.information.any-suffix -* config-status.warning.any-suffix -* config-status.error.any-suffix -* config-status.pending.any-suffix +- config-status.information.any-suffix +- config-status.warning.any-suffix +- config-status.error.any-suffix +- config-status.pending.any-suffix ## Handling Thing / Bridge Removal @@ -572,9 +575,9 @@ Quite often the device or service you expose via openHAB Things allows certain a Examples are: -* Reboot / Restart device -* Start searching for new lights for a Hue lights bridge -* Send message (via E-Mail / SMS Gateway service / Instant Messanger) +- Reboot / Restart device +- Start searching for new lights for a Hue lights bridge +- Send message (via E-Mail / SMS Gateway service / Instant Messanger) If you implement the `ThingActions` interface, you can tell the framework about your Thing related actions. @@ -817,7 +820,7 @@ There is no explicit end to an active scan and discovery results can be provided If you would like assistance with enforcing a scan end pass a timeout to the `AbstractDiscoveryService` constructor. `stopScan` will then be called on your discovery service upon timeout expiration allowing you to stop your scan however needed. If a timeout is specified the scan will be considered active until the timeout expires even if `startScan` completed beforehand. -In particular UIs such as the Paper UI will show the scan as in progress throughout the timeout. +In particular UIs the scan will be shown as in progress throughout the timeout. If you override `stopScan` don't forget to call `super.stopScan` as `AbstractDiscoveryService` performs some cleanup in its version. If the timeout is set to 0 `stopScan` will not be called. @@ -834,7 +837,7 @@ If this behavior is not appropriate for the implemented discovery service, one c } ``` -### Internationalization +### Internationalization of Discovery result labels The framework will take care of internationalizing labels of discovery results if you extend the `AbstractDiscoveryService`. See [i18n](../utils/i18n.html#discovery) for more information. @@ -848,6 +851,7 @@ The devoloper has to take care about that. protected @NonNullByDefault({}) TranslationProvider i18nProvider; protected @NonNullByDefault({}) LocaleProvider localeProvider; ``` + ::: ### UPnP Discovery @@ -855,21 +859,32 @@ The devoloper has to take care about that. UPnP discovery is implemented in the framework as `UpnpDiscoveryService`. It is widely used in bindings. To facilitate the development, binding developers only need to implement a `UpnpDiscoveryParticipant`. -Here the developer only needs to implement three simple methods: +Here the developer only needs to implement three simple methods, and may optionally implement a fourth: - `getSupportedThingTypeUIDs` - Returns the list of thing type UIDs that this participant supports. -The discovery service uses this method of all registered discovery participants to return the list of currently supported thing type UIDs. + The discovery service uses this method of all registered discovery participants to return the list of currently supported thing type UIDs. - `getThingUID` - Creates a thing UID out of the UPnP result or returns `null` if this is not possible. -This method is called from the discovery service during result creation to provide a unique thing UID for the result. + This method is called from the discovery service during result creation to provide a unique thing UID for the result. - `createResult` - Creates the `DiscoveryResult` out of the UPnP result. -This method is called from the discovery service to create the actual discovery result. -It uses the `getThingUID` method to create the thing UID of the result. + This method is called from the discovery service to create the actual discovery result. + It uses the `getThingUID` method to create the thing UID of the result. +- `getRemovalGracePeriodSeconds` (OPTIONAL) - Returns an additional grace period delay in seconds before the device will be removed from the Inbox. + This method is called when the discovery service is about to remove a Thing from the Inbox. + Some bindings handle devices that can sometimes be a bit late in sending their 'ssdp:alive' notifications even though they have not really gone offline. + This means that the device is repeatedly removed from, and (re)added to, the Inbox. + To prevent this, a binding may OPTIONALLY implement this method to specify an additional delay period (grace period) to wait before the device is removed from the Inbox. The following example shows the implementation of the UPnP discovery participant for the Hue binding, the `HueBridgeDiscoveryParticipant`. ```java public class HueBridgeDiscoveryParticipant implements UpnpDiscoveryParticipant { + private long removalGracePeriodSeconds = 50; + + @Reference + @Nullable + ConfigurationAdmin configAdmin; + @Override public Set getSupportedThingTypeUIDs() { return Collections.singleton(THING_TYPE_BRIDGE); @@ -907,6 +922,25 @@ public class HueBridgeDiscoveryParticipant implements UpnpDiscoveryParticipant { } return null; } + + // Implementating this method is OPTIONAL + // If not implemented, the 'default' method returns 0 by default + @Override + public long getRemovalGracePeriodSeconds(RemoteDevice device) { + if (configAdmin != null) { + try { + Configuration conf = configAdmin.getConfiguration("binding.hue"); + Dictionary properties = conf.getProperties(); + Object property = properties.get(HueBindingConstants.REMOVAL_GRACE_PERIOD); + if (property != null) { + removalGracePeriodSeconds = Integer.valueOf(property.toString()).longValue(); + } + } catch (IOException | IllegalStateException | NullPointerException | NumberFormatException e) { + // fall through to pre-initialised (default) value + } + } + return removalGracePeriodSeconds; + } } ``` @@ -918,16 +952,55 @@ Here the developer only needs to implement four simple methods: - `getServiceType` - Defines the [mDNS service type](https://www.dns-sd.org/ServiceTypes.html). - `getSupportedThingTypeUIDs` - Returns the list of thing type UIDs that this participant supports. -The discovery service uses this method of all registered discovery participants to return the list of currently supported thing type UIDs. + The discovery service uses this method of all registered discovery participants to return the list of currently supported thing type UIDs. - `getThingUID` - Creates a thing UID out of the mDNS service info or returns `null` if this is not possible. -This method is called from the discovery service during result creation to provide a unique thing UID for the result. + This method is called from the discovery service during result creation to provide a unique thing UID for the result. - `createResult` - Creates the `DiscoveryResult` out of the mDNS result. -This method is called from the discovery service to create the actual discovery result. -It uses the `getThingUID` method to create the thing UID of the result. + This method is called from the discovery service to create the actual discovery result. + It uses the `getThingUID` method to create the thing UID of the result. -### Discovery that is bound to a Thing +### Discovery that is bound to a Bridge -TODO +When the discovery process is dependent on a configured bridge the discovery service must be bound to the bridge handler. +Binding additional services to a handler can be achieved by implementing the service as a `ThingHandlerService`. + +Instead of using the Component annotation your discovery service implements the `ThingHandlerService`. +It should extend the `AbstractDiscoveryService` (which implements `DiscoveryService`) just like a normal service: + +```java +public class extends AbstractDiscoveryService + implements ThingHandlerService { +``` + +The interface `ThingHandlerService` has 2 methods to pass the handler of the bridge. +A typical implementation is: + +```java + @Override + public void setThingHandler(@Nullable ThingHandler handler) { + if (handler instanceof ) { + bridgeHandler = () handler; + } + } + + @Override + public @Nullable ThingHandler getThingHandler() { + return bridgeHandler; + } +``` + +The `setThingHandler` is called by the openHAB framework and give you access to the binding bridge handler. +The handler can be used to get the bridge UID or to get access to the configured device connected to the bridge handler. + +In the bridge handler you need to activate the thing handler service. +This is done by implementing the `getServices` method in your bridge handler: + +```java + @Override + public Collection> getServices() { + return Collections.singleton(.class); + } +``` ## Frequently asked questions / FAQ @@ -937,17 +1010,17 @@ Various binding related questions are answered in our [Binding development FAQ]( Once you are happy with your implementation, you need to integrate it in the Maven build and add it to the official distro. -* Add a new line in the [bundle pom.xml](https://github.com/openhab/openhab-addons/blob/master/bundles/pom.xml). -* Add a new line in the [binding pom.xml](https://github.com/openhab/openhab-addons/blob/master/bom/openhab-addons/pom.xml). -* If you have a dependency on a transport bundle (e.g. upnp, mdns or serial) or an external library, +- Add a new line in the [bundle pom.xml](https://github.com/openhab/openhab-addons/blob/main/bundles/pom.xml). +- Add a new line in the [binding pom.xml](https://github.com/openhab/openhab-addons/blob/main/bom/openhab-addons/pom.xml). +- If you have a dependency on a transport bundle (e.g. upnp, mdns or serial) or an external library, make sure to add a line for this dependency in the `/src/main/feature/feature.xml` file in your binding folder. See the other bindings as an example. -* Add your binding to the [CODEOWNERS](https://github.com/openhab/openhab-addons/blob/master/CODEOWNERS) file so that you get notified by Github when someone adds a pull request towards your binding. +- Add your binding to the [CODEOWNERS](https://github.com/openhab/openhab-addons/blob/main/CODEOWNERS) file so that you get notified by Github when someone adds a pull request towards your binding. > Please make sure you add the above entries at their alphabetically correct position! Before you create a pull request on GitHub, you should now run -``` +```bash mvn clean install ``` @@ -955,8 +1028,14 @@ from the repository root to ensure that the build works smoothly (that step take The build includes [Tooling for static code analysis](https://github.com/openhab/static-code-analysis) that will validate your code against the openHAB Coding Guidelines and some additional best practices. Please fix all the priority 1 issues and all issues with priority 2 and 3 that are relevant (if you have any doubt don't hesitate to ask). +to You can always run the above command from within your bindings directory to speed the build up and fix and check reported errors. +Formatting error can be fixed by + +```bash +mvn spotless:apply +``` Re-run the build to confirm that the checks are passing. If it does, it is time to [contribute your work](../contributing.html)! diff --git a/developers/bindings/thing-xml.md b/developers/bindings/thing-xml.md index c05cde355..fd6111c86 100644 --- a/developers/bindings/thing-xml.md +++ b/developers/bindings/thing-xml.md @@ -3,9 +3,8 @@ layout: developersguide title: Thing Descriptions --- -{% include base.html %} - # Binding Definitions + {:.no_toc} In order to work with *Things* and *Channels*, some meta information about them is needed. @@ -14,7 +13,8 @@ These are provided through 'ThingType' and 'ChannelType' definitions, which describe details about their functionality and configuration options. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## ThingTypeProvider / ChannelTypeProvider @@ -43,7 +43,7 @@ Which Things can be associated through which bridge type is defined within the d Some sample description Lightbulb - ... + ... ``` @@ -123,27 +123,28 @@ The following XML snippet shows a system channel type definition and thing type There exist system-wide channel types that are available by default: -| Channel Type ID | Reference typeId | Item Type | Category | Description | -|----------------------|-----------------------------|----------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| signal-strength | system.signal-strength | Number | QualityOfService | Represents signal strength of a device as a Number with values 0, 1, 2, 3 or 4; 0 being worst strength and 4 being best strength. | -| low-battery | system.low-battery | Switch | Battery | Represents a low battery warning with possible values on (low battery) and off (battery ok). | -| battery-level | system.battery-level | Number | Battery | Represents the battery level as a percentage (0-100%). Bindings for things supporting battery level in a different format (e.g. 4 levels) should convert to a percentage to provide a consistent battery level reading. | -| power | system.power | Switch | - | Turn a device on/off. | -| brightness | system.brightness | Dimmer | Light | Brightness of a bulb (0-100%). | -| color | system.color | Color | ColorLight | Color of a bulb. | -| color-temperature | system.color-temperature | Dimmer | ColorLight | Color temperature of a bulb (0-100%). 0% should be the coldest setting (highest Kelvin value). | -| location | system.location | Location | - | Location in lat.,lon.,height coordinates. | -| motion | system.motion | Switch | Motion | Motion detected by the device (ON if motion is detected). | -| mute | system.mute | Switch | SoundVolume | Turn on/off the volume of a device. | -| volume | system.volume | Dimmer | SoundVolume | Change the sound volume of a device (0-100%). | -| media-control | system.media-control | Player | MediaControl | Control for a media player. | -| media-title | system.media-title | String | - | Title of a (played) media file. | -| media-artist | system.media-artist | String | - | Artist of a (played) media file. | -| outdoor-temperature | system.outdoor-temperature | Number:Temperature | Temperature | Current outdoor temperature. | -| wind-direction | system.wind-direction | Number:Angle | Wind | Wind direction in degrees (0-360°). | -| wind-speed | system.wind-speed | Number:Speed | Wind | Wind speed | -| atmospheric-humidity | system.atmospheric-humidity | Number:Dimensionless | Humidity | Atmospheric humidity in percent. | -| barometric-pressure | system.barometric-pressure | Number:Pressure | Pressure | Barometric pressure | +| Channel Type ID | Reference typeId | Item Type | Category | Description | +|-----------------------|------------------------------|----------------------|------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| signal-strength | system.signal-strength | Number | QualityOfService | Represents signal strength of a device as a Number with values 0, 1, 2, 3 or 4; 0 being worst strength and 4 being best strength. | +| low-battery | system.low-battery | Switch | LowBattery | Represents a low battery warning with possible values on (low battery) and off (battery ok). | +| battery-level | system.battery-level | Number | Battery | Represents the battery level as a percentage (0-100%). Bindings for things supporting battery level in a different format (e.g. 4 levels) should convert to a percentage to provide a consistent battery level reading. | +| power | system.power | Switch | Switch | Turn a device on/off. | +| brightness | system.brightness | Dimmer | Light | Brightness of a bulb (0-100%). | +| color | system.color | Color | ColorLight | Color of a bulb. | +| color-temperature | system.color-temperature | Dimmer | ColorLight | Color temperature of a bulb (0-100%). 0% should be the coldest setting (highest Kelvin value), 100 the warmest. | +| color-temperature-abs | system.color-temperature-abs | Number | ColorLight | Color temperature of a bulb in Kelvin (1000K-10000K). | +| location | system.location | Location | - | Location in lat.,lon.,height coordinates. | +| motion | system.motion | Switch | Motion | Motion detected by the device (ON if motion is detected). | +| mute | system.mute | Switch | SoundVolume | Turn on/off the volume of a device. | +| volume | system.volume | Dimmer | SoundVolume | Change the sound volume of a device (0-100%). | +| media-control | system.media-control | Player | MediaControl | Control for a media player. | +| media-title | system.media-title | String | - | Title of a (played) media file. | +| media-artist | system.media-artist | String | - | Artist of a (played) media file. | +| outdoor-temperature | system.outdoor-temperature | Number:Temperature | Temperature | Current outdoor temperature. | +| wind-direction | system.wind-direction | Number:Angle | Wind | Wind direction in degrees (0-360°). | +| wind-speed | system.wind-speed | Number:Speed | Wind | Wind speed | +| atmospheric-humidity | system.atmospheric-humidity | Number:Dimensionless | Humidity | Atmospheric humidity in percent. | +| barometric-pressure | system.barometric-pressure | Number:Pressure | Pressure | Barometric pressure | For further information about categories see the [categories page](../../concepts/categories.html). @@ -221,7 +222,6 @@ This library is still in development., and only a very small set of tags are def | TargetTemperature | Number, Number:Temperature | A target temperature that should engage a thermostats heating and cooling actions. | | CurrentHumidity | Number | An accessory that provides a single read-only value indicating the relative humidity. | - ### State Description The state description allows to specify restrictions and additional information for the state of an item, that is linked to the channel. @@ -232,17 +232,17 @@ The following XML snippet shows the definition for a temperature actuator channe ``` -* The attributes `min` and `max` can only be declared for channel with the item type `Number`. +- The attributes `min` and `max` can only be declared for channel with the item type `Number`. It defines the range of the numeric value. The Java data type is a BigDecimal. For example user interfaces can create sliders with an appropriate scale based on this information. -* The `step` attribute can be declared for `Number` and `Dimmer` items and defines what is the minimal step size that can be used. -* The `readonly` attribute can be used for all item types and defines if the state of an item can be changed. +- The `step` attribute can be declared for `Number` and `Dimmer` items and defines what is the minimal step size that can be used. +- The `readonly` attribute can be used for all item types and defines if the state of an item can be changed. For all sensors the `readonly` attribute should be set to `true`. -* The `pattern` attribute can be used for `Number` and `String` items. +- The `pattern` attribute can be used for `Number` and `String` items. It gives user interface a hint how to render the item. The format of the pattern must be compliant to the [Java Number Format](https://docs.oracle.com/javase/tutorial/java/data/numberformat.html). - The pattern can be localized (see also [Internationalization](../../features/internationalization.html)). + The pattern can be localized (see also [Internationalization](../utils/i18n.html)). The special pattern placeholder `%unit%` is used for channels which bind to items of type `Number:` which define a dimension for unit support. These channels will send state updates of type [QuantityType](../../concepts/units-of-measurement.html#quantitytype) and the unit is then rendered for the placeholder. @@ -287,8 +287,9 @@ The following XML snippet defines a list of commands: ``` The user interface can use these values to render -* a drop down and also represent the current state or -* as push buttons to simply send a command to the ThingHandler. + +- a drop down and also represent the current state or +- as push buttons to simply send a command to the ThingHandler. The option labels can also be localized. @@ -479,7 +480,7 @@ To define such thing meta data the thing type definition provides the possibilit ZigBee ... - ... + ... ``` @@ -533,12 +534,12 @@ If a configuration parameter will be used, then its respective `parameter` shall ... uniqueId ... - - - - The Unique Id for Representation Property - - + + + + The Unique Id for Representation Property + + ... ``` @@ -549,10 +550,11 @@ The label and descriptions for things, channels and config descriptions should f The label should be short so that for most UIs it does not spread across multiple lines. Guideline is 2-3 words with up to 25 chars. Labels should be capitalized using the following rules: -* Always capitalize the first and the last word. -* Lowercase articles, coordinating conjunctions, and prepositions (`a, an, the, and, as, but, by, for, from, in, into, like, near, nor, of, onto, or, out, over, past, so, till, to, up, upon, with, yet`). -* Capitalize all other words. -* Brand- or product names that starts with a lowercase character can be written using their official spelling. + +- Always capitalize the first and the last word. +- Lowercase articles, coordinating conjunctions, and prepositions (`a, an, the, and, as, but, by, for, from, in, into, like, near, nor, of, onto, or, out, over, past, so, till, to, up, upon, with, yet`). +- Capitalize all other words. +- Brand- or product names that starts with a lowercase character can be written using their official spelling. The description can contain longer text to describe the thing in more detail. Limited use of HTML tags is permitted to enhance the description - if a long description is provided, the first line should be kept short, and a line break (```
```) placed at the end of the line to allow UIs to display a short description in limited space. @@ -592,15 +594,14 @@ In this example, an auto update policy is defined for the channel type, but is o The following policies are supported: -* **veto**: No automatic state update should be sent by the framework. +- **veto**: No automatic state update should be sent by the framework. The thing handler will make sure it sends a state update and it can do it better than just converting the command to a state. -* **default**: The binding does not care and the framework may do what it deems to be right. +- **default**: The binding does not care and the framework may do what it deems to be right. The state update which the framework will send out normally will correspond the command state anyway. This is the default if no other policy is set explicitly. -* **recommend**: An automatic state update should be sent by the framework because no updates are sent by the binding. +- **recommend**: An automatic state update should be sent by the framework because no updates are sent by the binding. This usually is the case when devices don't expose their current state to the handler. - ## Bridges and Thing Descriptions Every binding has to provide meta information about which bridges and/or *Thing*s it provides and how their relations to each other are structured. @@ -612,7 +613,6 @@ The meta information of all bridges and *Thing*s is accessible through the `org. Bridge and *Thing* descriptions must be placed as XML file(s) (with the ending `.xml`) in the bundle's folder `/OH-INF/thing/`. The full Java API for bridge and *Thing* descriptions can be found in the Java package `org.openhab.core.thing.type`. - ### XML Structure for Thing Descriptions ```xml @@ -756,7 +756,7 @@ The full Java API for bridge and *Thing* descriptions can be found in the Java p - + String String @@ -839,7 +839,6 @@ The full Java API for bridge and *Thing* descriptions can be found in the Java p | Property | Description | | |-----------------------------|----------------------------------------------|--------| | channel-group-type.id | An identifier for the channel group type | mandatory | -| channel-group-type.advanced | The flag indicating if this channel group contains advanced functionalities which should be typically not shown in the basic view of user interfaces | optional, default: false | | label | A human-readable label for the channel group | mandatory | | description | A human-readable description for the channel group | optional | | category | The category for the channel group, e.g. TEMPERATURE | optional | @@ -847,12 +846,11 @@ The full Java API for bridge and *Thing* descriptions can be found in the Java p | channel.id | An identifier of the channel the bridge/Thing provides | mandatory | | channel.typeId | An identifier of the channel type definition the bridge/Thing provides | mandatory | - -The full XML schema for Thing type descriptions is specified in the
openHAB thing description XSD file. +The full XML schema for Thing type descriptions is specified in the [https://openhab.org/schemas/thing-description-1.0.0.xsd](https://openhab.org/schemas/thing-description-1.0.0.xsd) openHAB thing description XSD file. **Hints:** - Any identifiers of the types are automatically mapped to unique identifiers: `bindingID:id`. - The attribute `uri` in the section `config-description` is optional, it *should not* be specified in bridge/*Thing*/channel type definition files because it's an embedded configuration. -If the `uri` is *not* specified, the configuration description is registered as `thing-type:bindingID:id` or `channel-type:bindingID:id` otherwise the given `uri` is used.s + If the `uri` is *not* specified, the configuration description is registered as `thing-type:bindingID:id` or `channel-type:bindingID:id` otherwise the given `uri` is used.s - If a configuration description is already specified somewhere else and the bridge/*Thing*/channel type wants to (re-)use it, a `config-description-ref` should be used instead. diff --git a/developers/buildsystem.md b/developers/buildsystem.md index 733033d27..a3e580734 100644 --- a/developers/buildsystem.md +++ b/developers/buildsystem.md @@ -3,8 +3,6 @@ layout: developersguide title: Build System --- -{% include base.html %} - # Build System The buildsystem is based on maven. @@ -22,9 +20,10 @@ This section talks about some common buildsystem related topics and also some qu Generally all dependencies should be OSGi-bundles and available on JCenter. ### External dependency -In most cases they should be referenced in the project POM with scope `provided`: -``` +In most cases they should be referenced in the project POM with scope `compile`: + +```xml foo.bar @@ -39,31 +38,32 @@ These dependencies are embedded in the resulting bundle automatically. There are two exceptions: -1) Dependencies to other openHAB bundles (e.g. `org.openhab.addons.bundles/org.openhab.binding.bluetooth/2.5.0-SNAPSHOT` or `org.openhab.addons.bundles/org.openhab.transform.map/2.5.0-SNAPSHOT`). -2) Bundles that are used by more than one binding (e.g. Netty-bundles like `io.netty/netty-common/4.1.34.Final`). +1. Dependencies to other openHAB bundles (e.g. `org.openhab.addons.bundles/org.openhab.binding.bluetooth/2.5.0-SNAPSHOT` or `org.openhab.addons.bundles/org.openhab.transform.map/2.5.0-SNAPSHOT`). +1. Bundles that are used by more than one binding (e.g. Netty-bundles like `io.netty/netty-common/4.1.34.Final`). Dependencies on other openHAB bundles should have the scope `provided`. To ensure that they are available at runtime they also need to be added to the `feature.xml`: -``` +```xml mvn:org.openhab.addons.bundles/org.openhab.binding.bluetooth/2.5.0-SNAPSHOT ``` ### Internal dependency In two cases libraries can be added to the `/lib` directory: + 1. The bundle is not available for download -2. The bundle is not an OSGi bundle but needs to be used for integration tests. -Unlike Karaf, BND is not able to wrap bundles on its own. -In this case the binding works as wrapper. -You need add the library and export all needed packages manually. +1. The bundle is not an OSGi bundle but needs to be used for integration tests. + Unlike Karaf, BND is not able to wrap bundles on its own. + In this case the binding works as wrapper. + You need add the library and export all needed packages manually. The build system automatically picks up all JAR files in `/lib` and embeds them in the new bundle. In this case they must not be added to the feature. -If the bundles manifest is not properly exporting all needed packages, you can import them manually by adding +If the bundles manifest is not properly exporting all needed packages, you can import them manually by adding -``` +```xml netty-common @@ -77,7 +77,7 @@ If you only depend on shared bundles you can also omit the exclusion statement a If the imported packages need to be exposed to other bundles (e.g. case 2 above), this has to be done manually by adding -``` +```xml foo.bar.*;version="1.0.0" @@ -102,14 +102,14 @@ The need to be added to the feature to make them available at runtime. Two cases need to be treated differently: 1. Bundles that have a core feature are referenced by the feature (e.g. `openhab-runtime-jna` or `openhab-transport-upnp`). -2. Bundles that do not have a core feature are added directly (e.g. `mvn:commons-codec/commons-codec/1.10`). +1. Bundles that do not have a core feature are added directly (e.g. `mvn:commons-codec/commons-codec/1.10`). ### Multi-Bundle Features / Sub-Bundles In some cases a binding consists of several bundles (e.g. `mqtt`). The `feature.xml` of the sub-bundle (e.g. `mqtt.homie`) needs to add all bundles from the parent-bundle to make sure that the feature verification suceeds: -``` +```xml openhab-transport-mqtt mvn:org.openhab.addons.bundles/org.openhab.binding.mqtt/${project.version} ``` @@ -117,7 +117,7 @@ The `feature.xml` of the sub-bundle (e.g. `mqtt.homie`) needs to add all bundles To make sure that all sub-bundles are installed together with the main-bundle, the `feature.xml` of the bundles needs to be excluded from the aggregation. Therefore an exclusion needs to be added to `features/openhab-addons/pom.xml` (starting from l. 47): -``` +```xml ``` diff --git a/developers/contributing.md b/developers/contributing.md index a2cae7b4d..1ed25a0fb 100644 --- a/developers/contributing.md +++ b/developers/contributing.md @@ -3,17 +3,15 @@ layout: developersguide title: Contribution --- -{% include base.html %} - # Contributing to the Development of openHAB ## The Repositories The main parts of openHAB can be found in the following repositories: -* [openHAB Core](https://github.com/openhab/openhab-core): This repo contains the core framework bundles of which the openHAB runtime is constructed. -* [openHAB Add-ons](https://github.com/openhab/openhab-addons): Add-ons (such as bindings, voice services, etc.) of openHAB can be found within this repository. -* [openHAB Distro](https://github.com/openhab/openhab-distro): This repo contains all parts that are required for assembling the binary distribution of openHAB. +- [openHAB Core](https://github.com/openhab/openhab-core): This repo contains the core framework bundles of which the openHAB runtime is constructed. +- [openHAB Add-ons](https://github.com/openhab/openhab-addons): Add-ons (such as bindings, voice services, etc.) of openHAB can be found within this repository. +- [openHAB Distro](https://github.com/openhab/openhab-distro): This repo contains all parts that are required for assembling the binary distribution of openHAB. Besides those "main" repositories, there are a dozen further ones, which are not listed here in detail - just [check out the list](https://github.com/openhab) and you will find separate repos for openHAB Cloud, the Alexa skill, the Google Action, the Android and iOS apps, the Zigbee and ZWave bindings, HABPanel and HABot and many more. If you want to get involved with any of these, best check their respective README and CONTRIBUTING files in the root of the repos. @@ -41,13 +39,13 @@ This gives other contributors a chance to point you in the right direction, give feedback on your design, and maybe point out if someone else is working on the same thing. -### Create Issues... +### Create Issues Any significant improvement should be documented as a GitHub issue in the [appropriate repository](#the-repositories) before anybody starts working on it. -### ...but Check for Existing Issues First! +### ...but Check for Existing Issues First Please take a moment to check that an issue doesn't already exist documenting your bug report or improvement proposal. If it does, it @@ -89,11 +87,6 @@ sure to post a comment after pushing. The new commits will show up in the pull request automatically, but the reviewers will not be notified unless you comment. -Before the pull request is merged, make sure that you squash your commits into -logical units of work using `git rebase -i` and `git push -f`. After every -commit the test suite should be passing. Include documentation changes in the -same commit so that a revert would remove all traces of the feature or fix. - Commits that fix or close an issue should include a reference like `Closes #XXX` or `Fixes #XXX`, which will automatically close the issue when merged. @@ -101,8 +94,6 @@ or `Fixes #XXX`, which will automatically close the issue when merged. openHAB maintainers use the [GitHub review feature](https://help.github.com/articles/about-pull-request-reviews/) to indicate acceptance. - - ### Sign your Work The sign-off is a simple line at the end of the explanation for the @@ -111,7 +102,7 @@ pass it on as an open-source patch. The rules are pretty simple: if you can certify the below (from [developercertificate.org](https://developercertificate.org/)): -``` +```text Developer Certificate of Origin Version 1.1 @@ -152,7 +143,9 @@ By making a contribution to this project, I certify that: then you just add a line to every git commit message: - Signed-off-by: Joe Smith + ```text + Signed-off-by: Joe Smith + ``` using your real name (sorry, no pseudonyms or anonymous contributions.) and an e-mail address under which you can be reached (sorry, no github noreply e-mail @@ -163,42 +156,46 @@ Additionally can also sign off commits automatically by adding the `-s` or `--si If your commit contains code from others as well, please ensure that they certify the DCO as well and add them with an "Also-By" line to your commit message: - Also-by: Ted Nerd - Also-by: Sue Walker - Signed-off-by: Joe Smith +```text + Also-by: Ted Nerd + Also-by: Sue Walker + Signed-off-by: Joe Smith +``` #### Small Patch Exception There are several exceptions to the signing requirement. Currently these are: -* Your patch fixes spelling or grammar errors. -* Your patch is a single line change to documentation. +- Your patch fixes spelling or grammar errors. +- Your patch is a single line change to documentation. ### How can I Become a Maintainer? -* Step 1: learn the component inside out -* Step 2: make yourself useful by contributing code, bugfixes, support etc. -* Step 3: volunteer [in the community] (https://community.openhab.org/c/development/misc) or in the appropriate GitHub project and have a [maintainer](governance.html#maintainers) [nominate you](governance.html#nominations). +- Step 1: learn the component inside out +- Step 2: make yourself useful by contributing code, bugfixes, support etc. +- Step 3: volunteer [in the community] () or in the appropriate GitHub project and have a [maintainer](governance.html#maintainers) [nominate you](governance.html#nominations). Don't forget: being a maintainer is a time investment. Make sure you will have time to make yourself available. You don't have to be a maintainer to make a difference on the project! ### Contributing to the Documentation + Sharing your knowledge through documentation contributions is incredibly valuable for the community allowing everybody to benefit from your lessons learned. If you are not yet ready to contribute code don't let that stop you from contributing to the documentation. Documentation change requests are very easy. No need to file an issue. You don't even need to know Git. -* Create a GitHub account and configure your full name in your profile. -* Go to the documentation page that you want to update and click on "Edit this page on GitHub" at the bottom. -* GitHub will bring up a web editor where you can enter your desired changes. -* You can preview your changes under the "Preview changes" tab. -* Add a title and optional description for your proposed change at the bottom of the editor. -* The [sign off rules](#sign-your-work) described above do apply to documentation contributions as well. -Simply add an empty line and the sign off statement "Signed-off-by: Joe Smith \" at the end of your change description at the bottom of the editor. -Note that as per the rules you have to provide your full name in the sign off and that full name has to match the name you configured in your GitHub profile for the DCO check to succeed. -* Click the "Propose file change" button at the bottom of the editor, then click "Create pull request" on the next page, and then on the summary page click "Create pull request" one more time. + +- Create a GitHub account and configure your full name in your profile. +- Go to the documentation page that you want to update and click on "Edit this page on GitHub" at the bottom. +- GitHub will bring up a web editor where you can enter your desired changes. +- You can preview your changes under the "Preview changes" tab. +- Add a title and optional description for your proposed change at the bottom of the editor. +- The [sign off rules](#sign-your-work) described above do apply to documentation contributions as well. + Simply add an empty line and the sign off statement "Signed-off-by: Joe Smith \" at the end of your change description at the bottom of the editor. + Note that as per the rules you have to provide your full name in the sign off and that full name has to match the name you configured in your GitHub profile for the DCO check to succeed. +- Click the "Propose file change" button at the bottom of the editor, then click "Create pull request" on the next page, and then on the summary page click "Create pull request" one more time. If you prefer to use Git you can of course use the code contribution process for documentation contributions as well. @@ -208,20 +205,20 @@ We want to keep the openHAB community awesome, growing and collaborative. We need your help to keep it that way. To help with this we've come up with some general guidelines for the community as a whole: -* Be nice: Be courteous, respectful and polite to fellow community members: no +- Be nice: Be courteous, respectful and polite to fellow community members: no regional, racial, gender, or other abuse will be tolerated. We like nice people way better than mean ones! -* Encourage diversity and participation: Make everyone in our community +- Encourage diversity and participation: Make everyone in our community feel welcome, regardless of their background and the extent of their contributions, and do everything possible to encourage participation in our community. -* Keep it legal: Basically, don't get us in trouble. Share only content that +- Keep it legal: Basically, don't get us in trouble. Share only content that you own, do not share private or sensitive information, and don't break the law. -* Stay on topic: Make sure that you are posting to the correct channel +- Stay on topic: Make sure that you are posting to the correct channel and avoid off-topic discussions. Remember when you update an issue or respond to an email you are potentially sending to a large number of people. Please consider this before you update. Also remember that diff --git a/developers/extensionservices/index.md b/developers/extensionservices/index.md index f1872431c..4bfdc0745 100644 --- a/developers/extensionservices/index.md +++ b/developers/extensionservices/index.md @@ -3,8 +3,6 @@ layout: developersguide title: Extension service --- -{% include base.html %} - # Extension service openHAB comes with an API that allows implementing a service that manages the installed extensions within a solution. diff --git a/developers/governance.md b/developers/governance.md index 09a9dd52e..d6f452e57 100644 --- a/developers/governance.md +++ b/developers/governance.md @@ -4,13 +4,12 @@ title: Governance license: Parts of this page have been derived from the EPLv2 licensed https://www.eclipse.org/projects/handbook --- -{% include base.html %} - # Governance of the openHAB Project ## Principles The guiding principles for openHAB are the "open source rules of engagement", which comprise: + - Transparency - Openness - Meritocracy @@ -40,6 +39,7 @@ The maintainers are the ones with write access to the repository and they are re ### Responsibilities Maintainers take care of the respective repository, i.e. they + - define coding guidelines - decide the architecture and features of the code - review PRs diff --git a/developers/guidelines.md b/developers/guidelines.md index 220c5ee1f..860ab227f 100644 --- a/developers/guidelines.md +++ b/developers/guidelines.md @@ -3,9 +3,8 @@ layout: developersguide title: Coding Guidelines --- -{% include base.html %} - # Coding Guidelines + {:.no_toc} The following guidelines apply to all (Java) code of the openHAB project. @@ -18,14 +17,15 @@ To speed up the contribution process, we therefore advice to go through this che If you are just keen on binding development, you may skip this document first and come back later. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## A. Directory and File Layout The structure of a binding follows the structure of a typical OSGi bundle project. -``` +```text |- doc Images and other assets used in the Readme.md |- src/main |---- feature @@ -52,7 +52,7 @@ The structure of a binding follows the structure of a typical OSGi bundle projec |- README.md The file describing your binding ``` -* Every Java file must have a license header. You can run ```mvn license:format``` on the root of the repo to automatically add missing headers. +- Every Java file must have a license header. You can run ```mvn license:format``` on the root of the repo to automatically add missing headers. ## B. Code formatting rules & style @@ -64,30 +64,33 @@ Rules are enforced as part of the build process using [Spotless Maven Plugin](ht To check if your code is following the code style run `mvn spotless:check`. If Maven prints `[INFO] Spotless check skipped` then run `mvn spotless:check -Dspotless.check.skip=false` instead as the check isn't mandatory yet. To reformat you code run `mvn spotless:apply` -Code styles files are located in here: https://github.com/openhab/static-code-analysis/tree/master/codestyle/src/main/resources +Code styles files are located in here: #### Java Code The rules are defined using the Eclipse Java Formatter definitions. There are plugins available for several IDEs that support these definitons. -* Official [openHAB Eclipse IDE setup](ide/eclipse.html) is preconfigured -* Eclipse standalone installation - - You can manually import [openhab_codestyle.xml](https://raw.githubusercontent.com/openhab/static-code-analysis/master/codestyle/src/main/resources/openhab_codestyle.xml) via `Eclipse Preferences -> Java -> Code Style -> Formatter` and [openhab.importorder](https://raw.githubusercontent.com/openhab/static-code-analysis/master/codestyle/src/main/resources/openhab.importorder) via `Eclipse Preferences -> Java -> Code Style -> Organize Imports` -* IntelliJ using plugin https://plugins.jetbrains.com/plugin/6546-eclipse-code-formatter - - Same files as for the Eclipse standalone installation. Be sure to follow *all* the plugin configuration steps. +- Official [openHAB Eclipse IDE setup](ide/eclipse.html) is preconfigured +- Eclipse standalone installation + - You can manually import [openhab_codestyle.xml](https://raw.githubusercontent.com/openhab/static-code-analysis/main/codestyle/src/main/resources/openhab_codestyle.xml) via `Eclipse Preferences -> Java -> Code Style -> Formatter` and [openhab.importorder](https://raw.githubusercontent.com/openhab/static-code-analysis/main/codestyle/src/main/resources/openhab.importorder) via `Eclipse Preferences -> Java -> Code Style -> Organize Imports` +- IntelliJ using plugin + - Same files as for the Eclipse standalone installation. Be sure to follow *all- the plugin configuration steps. #### XML files -* Maven `pom.xml` files shall have 2 space indentation -* Other `xml` files shall have 1 tab indentation -* Line length shall be 120 characters +- Maven `pom.xml` files shall have 2 space indentation +- Other `xml` files shall have 1 tab indentation +- Line length shall be 120 characters -The rules are defined at https://github.com/openhab/static-code-analysis/tree/master/codestyle/src/main/resources for the Eclipse WTP formatter, but will have to be manually entered into your IDE. +The rules are defined at for the Eclipse WTP formatter, but will have to be manually entered into your IDE. ### Java Coding Style -* The [Java naming conventions](https://java.about.com/od/javasyntax/a/nameconventions.htm) should be used for source files. -* Generics must be used where applicable. See example below: +- The [Java naming conventions](https://java.about.com/od/javasyntax/a/nameconventions.htm) should always be used and are descibed in detail at the link, a quick summary is: + - Channel IDs: `lowerCamelCase` + - Variables: `lowerCamelCase` + - Constants: `ALL_UPPER_CASE` +- Generics must be used where applicable. See example below: ```java public static boolean isEqual(GenericsType g1, GenericsType g2){ @@ -95,9 +98,9 @@ public static boolean isEqual(GenericsType g1, GenericsType g2){ } ``` -* Code MUST not show any warnings. +- Code MUST not show any warnings. Warnings that cannot be circumvented should be suppressed by using the `@SuppressWarnings` annotation. -* Your classes are generally organised within an internal package +- Your classes are generally organised within an internal package ```java org.openhab.binding.coolbinding.internal @@ -107,9 +110,9 @@ org.openhab.binding.coolbinding.internal.discovery Remember that classes that are meant to be used by scripts or other bindings must be non internal. -* Every class, except data-transfer-objects (DTO), must be annotated with `@NonNullByDefault`. +- Every class, except data-transfer-objects (DTO), must be annotated with `@NonNullByDefault`. For details see [Null annotation](#null-annotations). -* OSGi Declarative Services annotations are to be used +- OSGi Declarative Services annotations are to be used ```java @Component(service=MyCoolService.class) @@ -123,10 +126,10 @@ public class MyCoolService { JavaDoc is required to describe the purpose and usage of every: -* class, -* interface, -* enumeration (except inner classes and enums), -* constant, field and method with visibility of default, protected or public. +- class, +- interface, +- enumeration (except inner classes and enums), +- constant, field and method with visibility of default, protected or public. An @author tag is required within the JavaDoc for every author who made a substantial contribution to the file. New @author tags should be placed below the older ones. @@ -135,9 +138,11 @@ Data-transfer-objects (DTOs map from Json/XML to Java classes) do not require Ja ## D. Language Levels and Libraries 1. openHAB generally targets the long time supported Java 11 releases with the following restrictions: - * To allow optimized runtimes, the set of Java packages to be used is further restricted to [Compact Profile 2](https://www.oracle.com/technetwork/java/embedded/resources/tech/compact-profiles-overview-2157132.html). -2. The [OSGi Core Release 7](https://osgi.org/download/r7/osgi.core-7.0.0.pdf) with [OSGI Compendium Release 7](https://osgi.org/download/r7/osgi.cmpn-7.0.0.pdf) is targeted, and newer features should not be used. -3. [slf4j](http://slf4j.org) is used for logging. + +- To allow optimized runtimes, the set of Java packages to be used is further restricted to [Compact Profile 2](https://www.oracle.com/technetwork/java/embedded/resources/tech/compact-profiles-overview-2157132.html). + +1. The [OSGi Core Release 7](https://osgi.org/download/r7/osgi.core-7.0.0.pdf) with [OSGI Compendium Release 7](https://osgi.org/download/r7/osgi.cmpn-7.0.0.pdf) is targeted, and newer features should not be used. +1. [slf4j](http://slf4j.org) is used for logging. You might also have the need to use other libraries for specific use cases like XML processing, networking etc. See [Default libraries](#default-libraries) for more details. @@ -145,15 +150,15 @@ See [Default libraries](#default-libraries) for more details. ## E. Runtime Behavior 1. Overridden methods from abstract classes or interfaces are expected to return fast unless otherwise stated in their JavaDoc. -Expensive operations should therefore rather be scheduled as a job. -2. Creation of threads must be avoided. -Instead, resort into using existing schedulers which use pre-configured thread pools. -If there is no suitable scheduler available, start a discussion in the forum about it rather than creating a thread by yourself. -For periodically executed jobs that do not require a fixed rate [scheduleWithFixedDelay](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)) should be preferred over [scheduleAtFixedRate](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)). -3. Bundles need to cleanly start and stop without throwing exceptions or malfunctioning. -This can be tested by manually starting and stopping the bundle from the console (```stop ``` resp. ```start ```). -4. Bundles must not require any substantial CPU time. -Test this e.g. using "top" or VisualVM and compare CPU utilization with your bundle stopped vs. started. + Expensive operations should therefore rather be scheduled as a job. +1. Creation of threads must be avoided. + Instead, resort into using existing schedulers which use pre-configured thread pools. + If there is no suitable scheduler available, start a discussion in the forum about it rather than creating a thread by yourself. + For periodically executed jobs that do not require a fixed rate [scheduleWithFixedDelay](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleWithFixedDelay(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)) should be preferred over [scheduleAtFixedRate](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)). +1. Bundles need to cleanly start and stop without throwing exceptions or malfunctioning. + This can be tested by manually starting and stopping the bundle from the console (```stop ``` resp. ```start ```). +1. Bundles must not require any substantial CPU time. + Test this e.g. using "top" or VisualVM and compare CPU utilization with your bundle stopped vs. started. ## F. Logging @@ -162,7 +167,7 @@ The logger that is used allows logging at multiple severity levels (trace, info, Most of the time, a level of `warn` or `debug` will be used. Please remember that every logging statement adds to code size and runtime cost. -* Loggers should be [non-static](http://slf4j.org/faq.html#declared_static), `final` when ever possible and have the name `logger`. +- Loggers should be [non-static](http://slf4j.org/faq.html#declared_static), `final` when ever possible and have the name `logger`. ```java class MyCoolClass { @@ -170,7 +175,7 @@ class MyCoolClass { } ``` -* Parametrized logging must be used (instead of string concatenation). +- Parametrized logging must be used (instead of string concatenation). ```java void myFun() { @@ -180,9 +185,9 @@ void myFun() { } ``` -* Exceptions with stacktraces in the log are considered to be bugs in your binding that should be reported and fixed. -If you add an exception as a last parameter to the logging, the stack trace will be printed. -Configuration errors by users should only print log messages about what's wrong. In that case you would use `e.getMessage()`. +- Exceptions with stacktraces in the log are considered to be bugs in your binding that should be reported and fixed. + If you add an exception as a last parameter to the logging, the stack trace will be printed. + Configuration errors by users should only print log messages about what's wrong. In that case you would use `e.getMessage()`. ```java void myFun() { @@ -194,7 +199,7 @@ void myFun() { } ``` -* Logging is not a replacement for using the debugger. +- Logging is not a replacement for using the debugger. ```java void myFun() { @@ -204,7 +209,7 @@ void myFun() { } ``` -* Logging is not a replacement to use respective `update*` methods of the framework +- Logging is not a replacement to use respective `update*` methods of the framework ```java void myFun() { @@ -218,28 +223,28 @@ As every bundle is only one out of many, logging should be done very scarce. It should be up to the user to increase the logging level for specific bundles, packages or classes if necessary. This means in detail: -* `error` logging should only be used +- `error` logging should only be used - to inform the user that something is tremendously wrong in the setup, the system cannot function normally anymore, and there is a need for immediate action. - in case some code fails irrecoverably and the user should report it as a severe bug. -* `warn` logging should only be used +- `warn` logging should only be used - to inform the user that something seems to be wrong in the overall setup, but the system can nonetheless function as normal, - in recoverable situations when a section of code that is not accessed under normal operating conditions is reached. -* `info` logging should be used sparsely. +- `info` logging should be used sparsely. e.g. a newly started component or a user file that has been loaded. -* `debug` logging should be used for detailed logging +- `debug` logging should be used for detailed logging - to give the user debug information in cases of unexpected behavior. - to log exceptions in case of temporary problems, like connection problems. In case of such exceptions this should be reflected in an updated state of the binding. -* `trace` logging should be used for verbose debug logging. +- `trace` logging should be used for verbose debug logging. For example printing output values that can be large, but can help when debugging changed external apis. In general bindings should NOT log to error/warn if e.g. connections are dropped - this is considered to be an external problem and from a system perspective to be a normal and expected situation. -The correct way to inform users about such events is to update the Thing status accordingl +The correct way to inform users about such events is to update the Thing status accordingly. Note that all events (including Thing status events) are anyhow already logged. @@ -260,7 +265,7 @@ This sections provides some background and more detailed information about parts ### Static Code Analysis The openHAB Maven build includes [tooling for static code analysis](https://github.com/openhab/static-code-analysis) that will validate your code against the Coding Guidelines and some additional best practices. -Information about the checks can be found [here](https://github.com/openhab/static-code-analysis/blob/master/docs/included-checks.md). +Information about the checks can be found [here](https://github.com/openhab/static-code-analysis/blob/main/docs/included-checks.md). The tool will generate an individual report for each bundle that you can find in `path/to/bundle/target/code-analysis/report.html` file and a report for the whole build that contains links to the individual reports in the `target/summary_report.html`. The tool categorizes the found issues by priority: 1(error),2(warning) or 3(info). @@ -284,6 +289,8 @@ public class MyClass(){} This forces you to think about every field in your class if it can be null at any point, or should rather be default initialized. If you have fields that are neither marked as nullable, nor are initialized, the code will not compile. +When using data transfer objects (DTO), you can move this into a package called dto or append DTO to the class name to get rid of the checkstyle warning about missing NonNullByDefault annotation. + Fields that can be null are to be annotated like this: ```java @@ -322,22 +329,22 @@ In order to not have every binding use a different library, the following packag For XML Processing -* com.thoughtworks.xstream -* com.thoughtworks.xstream.annotations -* com.thoughtworks.xstream.converters -* com.thoughtworks.xstream.io -* com.thoughtworks.xstream.io.xml +- com.thoughtworks.xstream +- com.thoughtworks.xstream.annotations +- com.thoughtworks.xstream.converters +- com.thoughtworks.xstream.io +- com.thoughtworks.xstream.io.xml For JSON Processing -* com.google.gson.* +- com.google.gson.* For HTTP Operations -* org.eclipse.jetty.client.* -* org.eclipse.jetty.client.api.* -* org.eclipse.jetty.http.* -* org.eclipse.jetty.util.* +- org.eclipse.jetty.client.* +- org.eclipse.jetty.client.api.* +- org.eclipse.jetty.http.* +- org.eclipse.jetty.util.* ::: tip Note HttpClient instances should be obtained by the handler factory through the HttpClientFactory service and unless there are specific configuration requirements, the shared instance should be used. @@ -345,8 +352,8 @@ HttpClient instances should be obtained by the handler factory through the HttpC For Web Socket Operations -* org.eclipse.jetty.websocket.client -* org.eclipse.jetty.websocket.api +- org.eclipse.jetty.websocket.client +- org.eclipse.jetty.websocket.api ::: tip Note WebSocketClient instances should be obtained by the handler factory through the WebSocketClientFactory service and unless there are specific configuration requirements, the shared instance should be used. diff --git a/developers/ide/eclipse.md b/developers/ide/eclipse.md index ce7562e9e..f87a0342a 100644 --- a/developers/ide/eclipse.md +++ b/developers/ide/eclipse.md @@ -10,7 +10,7 @@ To make development easier an out-of-the-box setup is available that completely This guide describes the steps to setup Eclipse and how to run and debug an add-on in Eclipse. ::: tip Existing Eclipse Installations -If you already have Eclipse installed it is recommended to perform a separate Eclipse install for OpenHAB to avoid overriding your existing Eclipse configuration. +If you already have Eclipse installed it is recommended to perform a separate Eclipse install for OpenHAB to avoid overriding your existing Eclipse configuration. ::: ## Eclipse IDE Setup @@ -63,12 +63,10 @@ If you already have Eclipse installed it is recommended to perform a separate Ec - `Installation folder name`: This is the directory in the root install folder everything will be installed in. - `GitHub user ID`: This is your GitHub user name used to configure the cloned Git projects. - 1. Click `Next>` and `Finish` to start installation. During install accept licence agreement, "Unsigned Content" for Bndtools, and Eclipse Foundation certificates when requested to complete IDE installation. - 1. At this point the Eclipse installer is finished and the Eclipse IDE is automatically launched to continue the installation process. ::: warning Attention @@ -85,12 +83,12 @@ If you already have Eclipse installed it is recommended to perform a separate Ec 1. After all tasks are finished you are ready to start developing. 1. If you need additional libraries see the [Build System](../buildsystem.html) documentation. -For other libraries supported out-of-the-box check the [Default Libraries](../guidelines.html#default-libraries) on the guidelines page. + For other libraries supported out-of-the-box check the [Default Libraries](../guidelines.html#default-libraries) on the guidelines page. ## Working with Add-ons -To easily run, modify and debug an add-on the `openHAB Development` setup installs and imports a demo project that contains a complete openHAB environment to run and debug an add-on. -This mechanism replaces the add-on installation process via the PaperUI that you would use outside the IDE. +To easily run, modify and debug an add-on the `openHAB Development` setup installs and imports a demo project that contains a complete openHAB environment to run and debug an add-on. +This mechanism replaces the add-on installation process via the UI that you would use outside the IDE. ### Running Add-ons @@ -98,7 +96,7 @@ Under `Infrastructure` you will find the project `org.openhab.demo.app`. This project contains the full configuration to run OpenHAB. The following files are of interest for the execution environment: -``` +```text |- org.openhab.demo.app |--- runtime |------- conf Here you configure the manual text files @@ -109,7 +107,7 @@ The following files are of interest for the execution environment: ``` 1. To let the demo project know about the add-on, the add-on must be added to the demo project `pom.xml`. -Here is an example for the `astro` binding: + Here is an example for the `astro` binding: ```xml @@ -138,21 +136,21 @@ Here is an example for the `astro` binding: 1. Save and click "Resolve": a window with the list of resolved bundles will be shown. Click `Finish` and save the file. - + ::: tip - Watch out - it's easy to miss saving the `app.bndrun` file. - If you see the little asterisk next to `app` in the `app` tab you haven't yet saved. + Watch out - it's easy to miss saving the `app.bndrun` file. + If you see the little asterisk next to `app` in the `app` tab you haven't yet saved. ::: Now the IDE is ready to start openHAB with a minimum set of the openHAB core bindings, UIs and the add-ons you configured. 1. Start openHAB from the IDE by clicking "Run OSGi" (upper right of the `app.bndrun` window). -1. You can check that openHAB is running with your browser by going to: http://localhost:8080/paperui/ (the last `/` is important!) +1. You can check that openHAB is running with your browser by going to: `http://localhost:8080/` (the last `/` is important!) 1. You can check log output in the `Console` tab at the bottom. -1. Check the chosen binding is active in `Paper UI > Configuration > Bindings` +1. Check the chosen binding is active in `UI > Settings > Bindings` View all the above steps in a single animation: @@ -160,27 +158,27 @@ View all the above steps in a single animation: ### Modifying and Debugging Add-ons -If you don't just want to run an add-on, but also want to modify and debug it you need to install sources for the add-on and build them locally. +If you don't just want to run an add-on, but also want to modify and debug it you need to install sources for the add-on and build them locally. 1. Install Sources - Sources are installed by cloning the [openHAB Add-ons](https://github.com/openhab/openhab-addons/) repository. + Sources are installed by cloning the [openHAB Add-ons](https://github.com/openhab/openhab-addons/) repository. If you select `openHAB Add-ons` during installation the installer automatically clones the [openHAB Add-ons](https://github.com/openhab/openhab-addons/) repository into `git\openhab-addons` under your installation folder. - If you didn't install `openHAB Add-ons` you can manually clone the [openHAB Add-ons](https://github.com/openhab/openhab-addons/) repository by executing `git clone https://github.com/openhab/openhab-addons.git` in the `git` folder under your installation folder. + If you didn't install `openHAB Add-ons` you can manually clone the [openHAB Add-ons](https://github.com/openhab/openhab-addons/) repository by executing `git clone https://github.com/openhab/openhab-addons.git` in the `git` folder under your installation folder. You can now modify add-on sources as needed. 1. Build Sources - Add the add-on as an Eclipse project so that Eclipse will build it automatically. - Import the add-on project via `File > Import... > Maven > Existing Maven Projects`. - Specify your add-on's source root folder (e.g. `git\openhab-addons\bundles\org.openhab.binding.astro` under the installation folder) as the root folder in the wizard. + Add the add-on as an Eclipse project so that Eclipse will build it automatically. + Import the add-on project via `File > Import... > Maven > Existing Maven Projects`. + Specify your add-on's source root folder (e.g. `git\openhab-addons\bundles\org.openhab.binding.astro` under the installation folder) as the root folder in the wizard. 1. Start a Debug Session - Simply start your debug session by clicking "Debug OSGi" (upper right of the `app.bndrun` window). - You can now use breakpoints and all other Eclipse debug tools. + Simply start your debug session by clicking "Debug OSGi" (upper right of the `app.bndrun` window). + You can now use breakpoints and all other Eclipse debug tools. ::: tip Where do add-on jar files come from? If you just run an add-on following the above steps then the required add-on jar files are retrieved through your Maven repository folder `.m2/repository` (e.g. `.m2\repository\org\openhab\addons\bundles\org.openhab.binding.astro`). @@ -190,9 +188,9 @@ If you imported your add-on as a project then the jar file is no longer retrieve ### Using New Bindings If you want to develop a new binding read about the [Skeleton Script](../#develop-a-new-binding) to generate the base for your binding and create all required files. -Then follow the above steps to build your sources and to configure the demo app to run your binding. +Then follow the above steps to build your sources and to configure the demo app to run your binding. ## Updating OpenHAB -You can update the OpenHAB version you are running in the IDE at any time simply by updating your git repos under your install folder. -For example to update to the latest version run `git checkout` in each repo folder under your `git` folder in the installation folder. +You can update the OpenHAB version you are running in the IDE at any time simply by updating your git repos under your install folder. +For example to update to the latest version run `git checkout` in each repo folder under your `git` folder in the installation folder. diff --git a/developers/ide/examples/vscode/settings.json b/developers/ide/examples/vscode/settings.json index 3adcba8a2..cb3a9a7a4 100644 --- a/developers/ide/examples/vscode/settings.json +++ b/developers/ide/examples/vscode/settings.json @@ -7,7 +7,7 @@ "java.saveActions.organizeImports": true, "java.configuration.checkProjectSettingsExclusions": false, "java.codeGeneration.generateComments": true, - "java.format.settings.url": "https://raw.githubusercontent.com/openhab/static-code-analysis/master/codestyle/src/main/resources/openhab_codestyle.xml", + "java.format.settings.url": "https://raw.githubusercontent.com/openhab/static-code-analysis/main/codestyle/src/main/resources/openhab_codestyle.xml", "java.format.settings.profile": "openHAB", "[java]": { "editor.defaultFormatter": "redhat.java", @@ -17,4 +17,4 @@ "[xml]": { "editor.defaultFormatter": "redhat.vscode-xml" } -} \ No newline at end of file +} diff --git a/developers/ide/examples/vscode/tasks.json b/developers/ide/examples/vscode/tasks.json index 66726c278..f902f64aa 100644 --- a/developers/ide/examples/vscode/tasks.json +++ b/developers/ide/examples/vscode/tasks.json @@ -1,12 +1,12 @@ { - "version": "2.0.0", + "version": "3.0.0", "options": { "env": { - "openhab_home": "c://openhab2", - "openhab_runtime": "c://openhab2/runtime", - "openhab_addons": "c://openhab2/addons", - "openhab_logs": "C://openhab2/userdata/logs", - "dist" : "org.openhab.binding.sony-2.5.0-SNAPSHOT.jar" + "openhab_home": "c://openhab", + "openhab_runtime": "c://openhab/runtime", + "openhab_addons": "c://openhab/addons", + "openhab_logs": "C://openhab/userdata/logs", + "dist" : "org.openhab.binding.something-3.0.0-SNAPSHOT.jar" } }, "tasks": [ @@ -100,7 +100,7 @@ "args": [ "-n", "50", - "-f", + "-F", "$openhab_logs/events.log" ], "windows": { @@ -126,7 +126,7 @@ "args": [ "-n", "50", - "-f", + "-F", "$openhab_logs/openhab.log" ], "windows": { diff --git a/developers/ide/images/ide_debug_eclipse_1_bndtools.png b/developers/ide/images/ide_debug_eclipse_1_bndtools.png index c543144a2..87a5933f9 100644 Binary files a/developers/ide/images/ide_debug_eclipse_1_bndtools.png and b/developers/ide/images/ide_debug_eclipse_1_bndtools.png differ diff --git a/developers/ide/images/ide_debug_eclipse_2_appbndrun.png b/developers/ide/images/ide_debug_eclipse_2_appbndrun.png index c615375bc..8e76a6aad 100644 Binary files a/developers/ide/images/ide_debug_eclipse_2_appbndrun.png and b/developers/ide/images/ide_debug_eclipse_2_appbndrun.png differ diff --git a/developers/ide/images/ide_setup_eclipse_1_installer.png b/developers/ide/images/ide_setup_eclipse_1_installer.png index 48ce69de0..2f16c1c5f 100644 Binary files a/developers/ide/images/ide_setup_eclipse_1_installer.png and b/developers/ide/images/ide_setup_eclipse_1_installer.png differ diff --git a/developers/ide/images/ide_setup_eclipse_2_advanced.png b/developers/ide/images/ide_setup_eclipse_2_advanced.png index 39c3e8ac6..b4b652420 100644 Binary files a/developers/ide/images/ide_setup_eclipse_2_advanced.png and b/developers/ide/images/ide_setup_eclipse_2_advanced.png differ diff --git a/developers/ide/images/ide_setup_eclipse_3_select_ide.png b/developers/ide/images/ide_setup_eclipse_3_select_ide.png index 74f9f7dd6..40afc5ab8 100644 Binary files a/developers/ide/images/ide_setup_eclipse_3_select_ide.png and b/developers/ide/images/ide_setup_eclipse_3_select_ide.png differ diff --git a/developers/ide/images/ide_setup_eclipse_4_openhab.png b/developers/ide/images/ide_setup_eclipse_4_openhab.png index d84d0fc6a..d01e2f727 100644 Binary files a/developers/ide/images/ide_setup_eclipse_4_openhab.png and b/developers/ide/images/ide_setup_eclipse_4_openhab.png differ diff --git a/developers/ide/images/ide_setup_eclipse_5_variables.png b/developers/ide/images/ide_setup_eclipse_5_variables.png index b3527fbf6..a33a1f01b 100644 Binary files a/developers/ide/images/ide_setup_eclipse_5_variables.png and b/developers/ide/images/ide_setup_eclipse_5_variables.png differ diff --git a/developers/ide/images/ide_setup_eclipse_6_tasks_finished.png b/developers/ide/images/ide_setup_eclipse_6_tasks_finished.png index 8993fb321..1037f0418 100644 Binary files a/developers/ide/images/ide_setup_eclipse_6_tasks_finished.png and b/developers/ide/images/ide_setup_eclipse_6_tasks_finished.png differ diff --git a/developers/ide/images/ide_setup_intellij_debug_configuration.png b/developers/ide/images/ide_setup_intellij_debug_configuration.png index eda73d56e..7ff3a6cdb 100644 Binary files a/developers/ide/images/ide_setup_intellij_debug_configuration.png and b/developers/ide/images/ide_setup_intellij_debug_configuration.png differ diff --git a/developers/ide/images/ide_setup_vscode_folder.png b/developers/ide/images/ide_setup_vscode_folder.png index 795d3e26b..c3f364004 100644 Binary files a/developers/ide/images/ide_setup_vscode_folder.png and b/developers/ide/images/ide_setup_vscode_folder.png differ diff --git a/developers/ide/images/ide_setup_vscode_folder_launch.png b/developers/ide/images/ide_setup_vscode_folder_launch.png index fc4780268..1825b5011 100644 Binary files a/developers/ide/images/ide_setup_vscode_folder_launch.png and b/developers/ide/images/ide_setup_vscode_folder_launch.png differ diff --git a/developers/ide/images/ide_setup_vscode_folder_tasks.png b/developers/ide/images/ide_setup_vscode_folder_tasks.png index f0abfbb96..97c97ee39 100644 Binary files a/developers/ide/images/ide_setup_vscode_folder_tasks.png and b/developers/ide/images/ide_setup_vscode_folder_tasks.png differ diff --git a/developers/ide/images/ide_setup_vscode_launch.png b/developers/ide/images/ide_setup_vscode_launch.png index 69cf0badc..b3194ae27 100644 Binary files a/developers/ide/images/ide_setup_vscode_launch.png and b/developers/ide/images/ide_setup_vscode_launch.png differ diff --git a/developers/ide/images/ide_setup_vscode_settings.png b/developers/ide/images/ide_setup_vscode_settings.png index 700c626b3..53c051910 100644 Binary files a/developers/ide/images/ide_setup_vscode_settings.png and b/developers/ide/images/ide_setup_vscode_settings.png differ diff --git a/developers/ide/images/ide_setup_vscode_tasks.png b/developers/ide/images/ide_setup_vscode_tasks.png index 1b378cb8d..fde35be08 100644 Binary files a/developers/ide/images/ide_setup_vscode_tasks.png and b/developers/ide/images/ide_setup_vscode_tasks.png differ diff --git a/developers/ide/intellij.md b/developers/ide/intellij.md index 989ee604f..0e00b9135 100644 --- a/developers/ide/intellij.md +++ b/developers/ide/intellij.md @@ -6,36 +6,49 @@ title: IntelliJ # IntelliJ IDE ## Prerequisities - - git, Maven, IntelliJ and Java 11 are installed + +- git, Maven, IntelliJ and Java 11 are installed ## Install OpenHAB distribution + 1. Install the official [openHAB distribution](https://www.openhab.org/download/) 1. Start the distribution **in debug mode** (use `./start_debug.sh` instead of `./start.sh` in step 4) This article refers to the directory where you installed the distribution as ``. ## Build the addons repostory -1. fork and clone the [openhab addons repository](https://www.github.com/openhab/openhab-addons) into a new directory (Reference `` from now on for this arcticle) - - `git clone https://github.com//openhab-addons` (replace git user name accordingly) + +1. fork and clone the [openhab addons repository](https://www.github.com/openhab/openhab-addons) into a new directory (Reference `` from now on for this arcticle) with `git clone https://github.com//openhab-addons` (replace git user name accordingly) + 1. open IntelliJ and create a new Project from existing sources (File | New | Project from existing sources) and pick ``/pom.xml - - IntelliJ will start importing, indexing and building, it will take while, wait until finished (see status bar) + + IntelliJ will start importing, indexing and building, it will take while, wait until finished (see status bar) + 1. Use Maven to clean & install the addons project + - mvn clean install in the root of `` using commandline Maven (or IntelliJ Maven view) - some of the addons might fail to build - if it's not the one, you're interested in that should not bother you - when the Maven project finished, you should find the freshly built addon JAR in the target directory ## Debug your addon + 1. copy the addon JAR to Openhab distribution created before + - `cp target/.jar /addons` + 1. The running instance of the openhab distribution should pick up your new addon & start it + - you can type `log:tail` in the openhab console to stream the openhab logs + 1. create a Remote Debug runtime configuration in IntelliJ: + - Open menu Run | Edit configurations - click the + sign to add a "Remote" configuration - adapt the module setting to the root (org.openhab.addons.reactor) - click OK - start the debug configuration - the IntelliJ console should log: `Connected to the target VM, address: 'localhost:5005', transport: 'socket'` + ![Remote Debug Run Configuration](images/ide_setup_intellij_debug_configuration.png) You can now add breakpoints to your project now and your test distro should stop there. diff --git a/developers/ide/vscode.md b/developers/ide/vscode.md index 00cebebd3..d6ad39994 100644 --- a/developers/ide/vscode.md +++ b/developers/ide/vscode.md @@ -11,102 +11,101 @@ The following shows the steps for building a bundle using Visual Studio Code (VS The following steps will only need to be done once to setup both VSCode and your environment. -1. Install Java Extension Pack for VSCode (https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) - -1. Clone the addons (https://github.com/openhab/openhab-addons.git or preferably your own fork) to %BASE%\openhab-addons - -3. On Windows, VSCode should be configured to use powershell instead of the classic command line. -If not configured already, add the following to the VSCode settings: - +1. Install Java Extension Pack for VSCode () + +1. Clone the addons ( or preferably your own fork) to %BASE%\openhab-addons + +1. On Windows, VSCode should be configured to use powershell instead of the classic command line. + + If not configured already, add the following to the VSCode settings: + ```"terminal.integrated.automationShell.windows": "C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell.exe"``` Either globally define the options via the global ```settings.json```. You can also define them local to a specific bundle by putting those lines in the ```.vscode/settings.json``` file in the bundle (similar to ```tasks.json```/```launch.json``` below). 1. If you want to setup openHAB code formatting guidelines, add the following to the VSCode settings: - + ![define .vscode](images/ide_setup_vscode_settings.png) Either globally define the formatting options via ```Files->Preferences->Settings->Extendions->Java configuration``` (or in the global ```settings.json```). You can also define them local to a specific bundle by putting those lines in the ```.vscode/settings.json``` file in the bundle (similar to ```tasks.json```/```launch.json``` below). - Download [settings.json](https://raw.githubusercontent.com/openhab/openhab-docs/master/developers/ide/examples/vscode/settings.json) for the recommended settings (or simply wish to copy the URLs in the above image). + Download [settings.json](https://raw.githubusercontent.com/openhab/openhab-docs/main/developers/ide/examples/vscode/settings.json) for the recommended settings (or simply wish to copy the URLs in the above image). ## Steps for each Bundle The following steps will show you how to setup a specific bundle for development with VSCode. These steps will show how to setup the Russound bundle but are generic to any bundle in the system. 1. Ensure the bundle builds correctly (natively with maven) + 1. Open console to the bundle location (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound`) - 2. `mvn clean install -DskipChecks` in the console to build the bundle - 3. Should produce a jar file in the 'target' directory of the bundle(example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\target\org.openhab.binding.russound-2.5.0-SNAPSHOT.jar`) - -2. Open VSCode and then open the folder of the bundle. From VSCode - use `File->Open Folder->choose bundle directory` (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound`) - -3. Create a ".vscode" directory under the bundle (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode`) - + 1. `mvn clean install -DskipChecks` in the console to build the bundle + 1. Should produce a jar file in the 'target' directory of the bundle(example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\target\org.openhab.binding.russound-2.5.0-SNAPSHOT.jar`) + +1. Open VSCode and then open the folder of the bundle. From VSCode - use `File->Open Folder->choose bundle directory` (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound`) + +1. Create a ".vscode" directory under the bundle (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode`) + ![define .vscode](images/ide_setup_vscode_folder.png) -4. Download [tasks.json](https://raw.githubusercontent.com/openhab/openhab-docs/master/developers/ide/examples/vscode/tasks.json) to the .vscode directory (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode\tasks.json`) - +1. Download [tasks.json](https://raw.githubusercontent.com/openhab/openhab-docs/main/developers/ide/examples/vscode/tasks.json) to the .vscode directory (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode\tasks.json`) + ![define tasks.json](./images/ide_setup_vscode_folder_tasks.png) - -5. Edit tasks.json and ... - + +1. Edit tasks.json and ... + ![tasks.json changes](./images/ide_setup_vscode_tasks.png) - 1. Set `openhab_*` to the directories for your openHAB installation - 2. Set `dist` to the name of the JAR file maven is producing in the target directory - 3. Save and close tasks.json - -6. Stop any openHAB instance (if it's running). - -7. Start the openHAB instance with the debug option - `start.bat debug` from a console in the openHAB home directory. You should see the following line printed somewhere in the karaf console: - `Listening for transport dt_socket at address: xxxx` (where xxxx should be 5005) + 1. Set `openhab_*` to the directories for your openHAB installation + 1. Set `dist` to the name of the JAR file maven is producing in the target directory + 1. Save and close tasks.json -8. Download [launch.json](https://raw.githubusercontent.com/openhab/openhab-docs/master/developers/ide/examples/vscode/launch.json) to the .vscode directory (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode\launch.json`) +1. Stop any openHAB instance (if it's running). + +1. Start the openHAB instance with the debug option - `start.bat debug` from a console in the openHAB home directory. You should see the following line printed somewhere in the karaf console: + `Listening for transport dt_socket at address: xxxx` (where xxxx should be 5005) + +1. Download [launch.json](https://raw.githubusercontent.com/openhab/openhab-docs/main/developers/ide/examples/vscode/launch.json) to the .vscode directory (example: `%BASE%\openhab-addons\bundles\org.openhab.binding.russound\.vscode\launch.json`) ![define launch.json](./images/ide_setup_vscode_folder_launch.png) -9. Edit launch.json and ... - - ![launch.json changes](./images/ide_setup_vscode_launch.png) +1. Edit launch.json and ...
![launch.json changes](./images/ide_setup_vscode_launch.png) 1. Set the `port` to xxxx (from step 7). This can be skipped if xxxx was 5005 from step 7. - 2. Set the `hostName` to the hostname running openHAB. This can be skipped if running locally (localhost) - 3. Save and close launch.json + 1. Set the `hostName` to the hostname running openHAB. This can be skipped if running locally (localhost) + 1. Save and close launch.json + +1. Verify that VSCode can build the system and connect to a debug instance of openHAB: -10. Verify that VSCode can build the system and connect to a debug instance of openHAB: - 1. Shutdown any instances of openHAB - 2. Press `CTRL-SHIFT-P -> Tasks: Run Task -> Start openHAB (Debug)` to start an openHAB instance in debug mode. You should see openHAB startup in a new VSCode terminal. - 3. Press F5 (or bring up debug in VSCode and choose the "Debug (Attach) - openHAB" configuration) and the following should occur in the VSCode terminal - + 1. Press `CTRL-SHIFT-P -> Tasks: Run Task -> Start openHAB (Debug)` to start an openHAB instance in debug mode. You should see openHAB startup in a new VSCode terminal. + 1. Press F5 (or bring up debug in VSCode and choose the "Debug (Attach) - openHAB" configuration) and the following should occur in the VSCode terminal 1. The maven compile occuring (successfully) - 2. The resulting JAR is copied to the openHAB addons directory (`openhab_addons`) - 3. Connecting to the openHAB instance (the debug call stack should show a bunch of openHAB type threads running) - + 1. The resulting JAR is copied to the openHAB addons directory (`openhab_addons`) + 1. Connecting to the openHAB instance (the debug call stack should show a bunch of openHAB type threads running) + You can now make changes, set breakpoints, etc. ## Notes 1. May take openHAB a few seconds to realize there is a new bundle and to reinitilize it after it's been copied. Be a little bit patient. -2. You must run the `mvn Compile (Online)` task atleast once to allow the offline compile to occur. You should use the `mvn Compile (Offline)` task for most of your development as it's quicker since it uses the cache files. When you are ready to commit (or release a test bundle) - you should run the `mvn Compile (Release)` task to include code checks (and resolve them). -3. Win10+ allows forward slashes as part of its path. If you use backward slashes instead - you will need to double up on them since tasks.json uses a backward slash as a delimiter. Example: `c:\\\\openhab` - +1. You must run the `mvn Compile (Online)` task atleast once to allow the offline compile to occur. You should use the `mvn Compile (Offline)` task for most of your development as it's quicker since it uses the cache files. When you are ready to commit (or release a test bundle) - you should run the `mvn Compile (Release)` task to include code checks (and resolve them). +1. Win10+ allows forward slashes as part of its path. If you use backward slashes instead - you will need to double up on them since tasks.json uses a backward slash as a delimiter. Example: `c:\\\\openhab` + ## Tasks The [tasks.json](examples/vscode/tasks.json) defines the following tasks that you may use withing VSCode (`CTRL-SHIFT-P > Tasks: Run Task`): 1. **Start openHAB (Debug)** - this task will start a new instance of openHAB in debug mode (allowing VSCode to connect to it). Please shut down any other instances of openHAB prior to running this (see next task). This will open a **new** terminal for openHAB to run in. Formally, this will call `start.bat debug` (or `start.sh debug` on osx/linux) in the `openhab_home` directory. -2. **Stop openHAB** - this task will stop any running instance. Please note this will stop an instance started outside of VSCode as well on the same machine. Formally, this will call `stop.bat` (or `stop.sh` on osx/linux) in the `openhab_runtime/bin` directory. -3. **mvn Compile (Online)** - this task will run a online maven compile skipping code checks. Formally, will run `mvn clean install -DskipChecks` -4. **mvn Compile (Offline)** - this task will run a offline maven compile skipping code checks (assumes you have run a online compile atleast once). Formally, will run `mvn -o clean install -DskipChecks` -5. **mvn Compile (Release)** - this task will run a online maven compile with code checks. Formally, will run `mvn clean install` -6. **Copy Distribution to Addons** - this task will run the 'mvn Compile (Offline)' task and then copy the resulting target file (as defined by `dist`) to your openHAB addons directory (defined by `openhab_addons`) -7. **Build** - this is an alias for `Copy Distribution to Addons` task. -8. **Tail events.log** - this will tail the events.log in a new terminal. -9. **Tail openhab.log** - this will tail the openhab.log in a new terminal. - +1. **Stop openHAB** - this task will stop any running instance. Please note this will stop an instance started outside of VSCode as well on the same machine. Formally, this will call `stop.bat` (or `stop.sh` on osx/linux) in the `openhab_runtime/bin` directory. +1. **mvn Compile (Online)** - this task will run a online maven compile skipping code checks. Formally, will run `mvn clean install -DskipChecks` +1. **mvn Compile (Offline)** - this task will run a offline maven compile skipping code checks (assumes you have run a online compile atleast once). Formally, will run `mvn -o clean install -DskipChecks` +1. **mvn Compile (Release)** - this task will run a online maven compile with code checks. Formally, will run `mvn clean install` +1. **Copy Distribution to Addons** - this task will run the 'mvn Compile (Offline)' task and then copy the resulting target file (as defined by `dist`) to your openHAB addons directory (defined by `openhab_addons`) +1. **Build** - this is an alias for `Copy Distribution to Addons` task. +1. **Tail events.log** - this will tail the events.log in a new terminal. +1. **Tail openhab.log** - this will tail the openhab.log in a new terminal. + ## Additional References 1. [VSCode with Java](https://code.visualstudio.com/docs/languages/java) -2. [VSCode with Java debugging](https://code.visualstudio.com/docs/java/java-debugging) +1. [VSCode with Java debugging](https://code.visualstudio.com/docs/java/java-debugging) diff --git a/developers/index.md b/developers/index.md index c31653df4..57950ef81 100644 --- a/developers/index.md +++ b/developers/index.md @@ -22,16 +22,16 @@ The different guides of this chapter assume that you are somewhat familiar with openHAB allows you to build upon the following concepts: -* **Bindings**: A binding connects to external services or devices. -* **Automation engine module**: A trigger, condition, or action that can be used in automation rules (or scripts). -* **Transformation / Profiles**: Can be used to transform a *Thing Channel* value before it is assigned to an *Item*. -* **An IO service**: Exposes openHAB internals via a defined interface (for example the REST interface, HomeKit or Hue Emulation Service). -* **A Persistence service**: Persist item state updates and/or changes and allows them to be retrieved for specific points in time. -* **Natural language processing skill**: +- **Bindings**: A binding connects to external services or devices. +- **Automation engine module**: A trigger, condition, or action that can be used in automation rules (or scripts). +- **Transformation / Profiles**: Can be used to transform a *Thing Channel*- value before it is assigned to an *Item*. +- **An IO service**: Exposes openHAB internals via a defined interface (for example the REST interface, HomeKit or Hue Emulation Service). +- **A Persistence service**: Persist item state updates and/or changes and allows them to be retrieved for specific points in time. +- **Natural language processing skill**: Executes something depending on the understood Intents and returns something back to the user. -* **Audio sinks/sources**: +- **Audio sinks/sources**: Control where audio can be played or implement audio sources. -* and many more (not covered yet). +- and many more (not covered yet). First think about what you want to achieve! Check our [community forum](https://community.openhab.org) and discuss your concept. @@ -39,7 +39,7 @@ Sometimes it may not even be worth writing a binding or other addon if you can a For example, you may be better off using an http action in a rule or script to retrieve some values. Find the right abstraction and the corresponding link on the left navigation panel. -General [coding guidelines](docs/developer/guidelines.html) apply to all types of addon development. +General [coding guidelines](guidelines.html) apply to all types of addon development. ## Setup the Development Environment @@ -84,33 +84,42 @@ This script is specific for binding addons. Follow these steps to generate your 1. From the command line in `openhab-addons/bundles` directory to create a skeleton of a new binding `mynewbinding` run: On Linux: - ``` + + ```bash ./create_openhab_binding_skeleton.sh MyNewBinding "" ``` On Windows: - ``` + + ```bash create_openhab_binding_skeleton.cmd MyNewBinding "" ``` + Add your binding to the `bundles/pom.xml` file + _Use your full name for ``_. 1. Accept with `Y` when the skeleton configuration asks for it. 1. From `openhab-addons` root you can build only your binding with maven using the `-pl` option: - ``` + + ```bash mvn clean install -pl :org.openhab.binding.mynewbinding ``` + Where `mynewbinding` is the name of your new binding. Some additional maven options that may help: - * `-U`: Forces all dependencies to be downloaded again. - * `-am`: Builds all projects in openhab-addons your project dependends on. - * `-o`: Won't update any dependencies. - * `-DskipChecks`: Skips the static analysis checks - * `-DskipTests`: Skips the unit tests + - `-U`: Forces all dependencies to be downloaded again. + - `-am`: Builds all projects in openhab-addons your project dependends on. + - `-o`: Won't update any dependencies. + - `-DskipChecks`: Skips the static analysis checks + - `-DskipTests`: Skips the unit tests + - `-Dspotless.check.skip=true` : Skips the spotless file formatting checks + - `-Dohc.version=3.0.2` : The version of openhab you are building for 1. To start your new binding it's a good practise to commit your code on a new git branch: - ``` + + ```bash git checkout -b ``` @@ -119,3 +128,12 @@ This script is specific for binding addons. Follow these steps to generate your Now you can start developing your NEW binding. We're looking forward to your pull request! In case the new binding has dependencies to other bundles/libraries see [Adding Dependencies](buildsystem.html#adding-dependencies) for more information. + +If developing on Windows, git will convert line endings from LF to CRLF automatically. The repo uses LF, +and spotless will object, and throw errors. If you use `mnv spotless:apply` to fix formatting, it will add CRLF +to all files dirtying the entire branch. Adding a `.gitattributes` file to the openhab-addons folder with the +following will tell git and spotless to use LF endings: + +```text +* text eol=lf +``` diff --git a/developers/ioservices/index.md b/developers/ioservices/index.md index 0ffeec5b8..50d2a5d5b 100644 --- a/developers/ioservices/index.md +++ b/developers/ioservices/index.md @@ -3,8 +3,6 @@ layout: developersguide title: IO Services --- -{% include base.html %} - # Developing an IO Service TODO diff --git a/developers/module-types/index.md b/developers/module-types/index.md index 1ef80a0a9..949c18ce9 100644 --- a/developers/module-types/index.md +++ b/developers/module-types/index.md @@ -3,15 +3,15 @@ layout: developersguide title: Automation Modules --- -{% include base.html %} - # Developing Automation Modules + {:.no_toc} In this section you will be guided through developing *Module Types* and corresponding *Module Handlers* for the automation engine of openHAB. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## Module Types and Module Handlers @@ -178,9 +178,9 @@ The Condition that we are going to implement in the Condition Handler latter on Notice that our output is of type "State" instead of a fully qualified class name like `java.lang.String`. The following openHAB classes have short forms: -* "State" (an *Item* state) -* "Event" (an openHAB event from the event bus) -* "Command" (a command targeting an *Item*) +- "State" (an *Item* state) +- "Event" (an openHAB event from the event bus) +- "Command" (a command targeting an *Item*) And now let's have a look at the Action type. @@ -237,21 +237,21 @@ A module type file can contain one or multiple type descriptions. For our scenario we go with one file: ```json -{ +{ "triggers":[ - { + { "uid":"TemperatureTriggerType", "label":"Temperature Trigger", "description":"This triggers when the temperature has reached a certain value", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"temperature", "type":"INTEGER", "label":"Temperature", "description":"Trigger temperature", "required":true }, - { + { "name":"operator", "type":"TEXT", "label":"Operator", @@ -260,8 +260,8 @@ For our scenario we go with one file: "default": "above" } ], - "outputs":[ - { + "outputs":[ + { "name":"temperature", "type":"java.lang.Integer", "label":"Current Temperature", @@ -270,13 +270,13 @@ For our scenario we go with one file: ] } ], - "conditions":[ - { + "conditions":[ + { "uid":"PresenceConditionType", "label":"Presence Condition", "description":"This condition is satisfied when the configure presence item is in ON state", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"presence", "type":"TEXT", "label":"Presence item", @@ -284,8 +284,8 @@ For our scenario we go with one file: "required":true } ], - "outputs":[ - { + "outputs":[ + { "name":"presence", "type":"State", "label":"Output value", @@ -294,20 +294,20 @@ For our scenario we go with one file: ] } ], - "actions":[ - { + "actions":[ + { "uid":"AirConditionerActionType", "label":"Switch an air conditioner", "description":"Control an air conditioner. Depending on the configuration and inputs it is switched into different power levels", - "configDescriptions":[ - { + "configDescriptions":[ + { "name":"level1_min_temp", "type":"INTEGER", "label":"Temperature for level 1", "description":"Level 1 on the given temperature in celsius", "required":true }, - { + { "name":"level2_min_temp", "type":"INTEGER", "label":"Temperature for level 2", @@ -315,8 +315,8 @@ For our scenario we go with one file: "required":true } ], - "inputs":[ - { + "inputs":[ + { "name":"temperature", "type":"java.lang.Integer", "label":"Current Temperature", @@ -334,9 +334,9 @@ You now have semantically described your modules. The pieces of code that actually -* trigger, in case of Trigger types, -* decide on condition satisfaction for Condition types or -* execute something in case of Action types +- trigger, in case of Trigger types, +- decide on condition satisfaction for Condition types or +- execute something in case of Action types are called *Module handlers*. @@ -408,7 +408,7 @@ public class TemperatureTriggerHandler extends BaseTriggerModuleHandler String tempOp = (String) context.get(TemperatureTriggerType.CONFIG_OPERATOR); onAbove = (tempOp != null && "below".equals(tempOp)) ? false : true; - + } // Setup your triggering stuff in here @@ -426,7 +426,7 @@ public class TemperatureTriggerHandler extends BaseTriggerModuleHandler // Event from our imaginary temperature device. Triggers connected rules if temp is // over the configured threshold. - @Override + @Override public void tempChangedOnImaginaryDevice(int tempInCelsius) { if ( (tempInCelsius>temperature && onAbove) || @@ -438,7 +438,6 @@ public class TemperatureTriggerHandler extends BaseTriggerModuleHandler } ``` - ### Condition Handler Condition Handler serves to help the Automation Engine to decide if it continues with the execution of the rule or to terminate it. @@ -470,6 +469,7 @@ public class PresenceConditionHandler extends BaseModuleHandler imple } ``` + ### Action Handler Action Handler is used to help the Automation Engine to execute the specific Actions. @@ -490,17 +490,17 @@ The automation engine reads rule json files from the `{openhab-dir}/automation/* The rule that implements our application is declaratively described in the json format like this: ```json -[ - { +[ + { "uid":"JsonDemoRule", "name":"DemoRule", "triggers":[ - { + { "id":"RuleTrigger", "label":"Item State Change Trigger", "description":"This triggers a rule if an items state changed", "type":"ItemStateChangeTrigger", - "configuration":{ + "configuration":{ "itemName":"DemoSwitch" } } @@ -508,12 +508,12 @@ The rule that implements our application is declaratively described in the json "conditions":[ ], "actions":[ - { + { "id":"RuleAction", "label":"Post command to an item", "description":"Posts commands on items", "type":"ItemPostCommandAction", - "configuration":{ + "configuration":{ "itemName":"DemoDimmer", "command":"ON" } diff --git a/developers/osgi/configadmin.md b/developers/osgi/configadmin.md index 1f512256b..634ee0924 100644 --- a/developers/osgi/configadmin.md +++ b/developers/osgi/configadmin.md @@ -3,21 +3,17 @@ layout: developersguide title: Configuration Admin --- -{% include base.html %} - # Configuration Admin Service As defined in the [OSGi Compendium Release 7][OSGi-cmpn] *configuration is the process of defining the configuration data of bundles and assuring that those bundles receive that data when they are active in the OSGi Service Platform.* -### Configuration Admin Service - In OSGi, configurations are stored in a central database that is being managed by a special service - the *Configuration Admin Service*(`org.osgi.service.cm.ConfigurationAdmin`). This service monitors the service registry and **provides a configuration to the services** that are registered with a *service.pid* property. Configuration changes are first made persistent, and then are passed to the target service. It is important to understand that **the target bundle receives updates from the Configuration Admin service**. Implementations should be aware that the update reception could be delayed if the Configuration Admin service is missing. -### Configuration properties +## Configuration properties Each configuration is uniquely identified by a PID (Persistent IDentifier) and stores properties. The properties can be edited, or new properties could be added during runtime by other bundle that uses the Configuration Admin service. @@ -121,12 +117,12 @@ import org.osgi.service.component.annotations.Reference; @NonNullByDefault public class TimeEventHandler { - @Reference - private @NonNullByDefault({}) ConfigurationAdmin configurationAdmin; + private final ConfigurationAdmin configurationAdmin; // Here we perform a configuration update as soon as this service gets activated @Activate - protected void activate() { + public TimeEventHandler(@Reference ConfigurationAdmin configurationAdmin) { + this.configurationAdmin = configurationAdmin; try { Configuration config = configurationAdmin.getConfiguration("com.example.handler", null); Dictionary props = config.getProperties(); diff --git a/developers/osgi/equinox.md b/developers/osgi/equinox.md index 67a365982..83e52c21f 100644 --- a/developers/osgi/equinox.md +++ b/developers/osgi/equinox.md @@ -3,9 +3,8 @@ layout: developersguide title: Equinox --- -{% include base.html %} - # Equinox + {:.no_toc} [Equinox][Equinox] is considered to be a reference implementation of the [OSGi Core Release 7][OSGi-core]. @@ -16,24 +15,25 @@ The openHAB bundles are deployed on an Equinox runtime. Knowledge about how to start the runtime and execute basic commands will help you to speedup the development process. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## Start Equinox Runtime from Eclipse 1. Go to "Run" -> "Run Configurations". -2. From the list in the left panel choose "OSGi Framework". Right click on it and choose "New". -3. After you've been created a new configuration, select the bundles that you need from the workspace. -4. Then make sure that the following bundles from the target platform are selected, otherwise the OSGi console will not be available: +1. From the list in the left panel choose "OSGi Framework". Right click on it and choose "New". +1. After you've been created a new configuration, select the bundles that you need from the workspace. +1. Then make sure that the following bundles from the target platform are selected, otherwise the OSGi console will not be available: org.apache.felix.gogo.runtime org.apache.felix.gogo.shell org.apache.felix.gogo.command org.eclipse.equinox.console -5. Click on "Add Required Bundles". Eclipse will resolve all dependencies of the bundles listed above and include new bundles to the configuration. -6. Click on "Validate Bundles" and make sure that "No problems were detected" is displayed. -7. You can start Equinox with the "Run" button. +1. Click on "Add Required Bundles". Eclipse will resolve all dependencies of the bundles listed above and include new bundles to the configuration. +1. Click on "Validate Bundles" and make sure that "No problems were detected" is displayed. +1. You can start Equinox with the "Run" button. ![Run Configurations dialog window](images/runconfiguration.png) @@ -45,9 +45,9 @@ If you have compiled openHAB once either via command line (`mvn install`) or the Find it in your maven cache directory (linux `~/.m2/repository/org/eclipse/platform/org.eclipse.osgi/3.15.0/org.eclipse.osgi-3.15.0.jar` and windows `C:\Users\your.name\.m2\..`). - 1. Create `configuration` folder in that directory. - 2. Inside the `configuration` folder create a file `config.ini`. - 3. Save the following content in the `config.ini` file: +1. Create `configuration` folder in that directory. +1. Inside the `configuration` folder create a file `config.ini`. +1. Save the following content in the `config.ini` file: ```ini osgi.bundles=\ @@ -67,7 +67,7 @@ and windows `C:\Users\your.name\.m2\..`). eclipse.consoleLog=true ``` - 6. Use the following command line to run Equinox: +1. Use the following command line to run Equinox: ```shell java -jar org.eclipse.osgi-3.x.x.jar -console -configuration configuration diff --git a/developers/osgi/eventadmin.md b/developers/osgi/eventadmin.md index 6887e44f4..a392b2d20 100644 --- a/developers/osgi/eventadmin.md +++ b/developers/osgi/eventadmin.md @@ -3,8 +3,6 @@ layout: developersguide title: Event Admin --- -{% include base.html %} - # Introduction In a dynamic environment like OSGi, communication with events has a wide variety of use cases. @@ -64,8 +62,8 @@ public class LogEventHandler implements EventHandler { } ``` -* You can register a handler for multiple topics by separating them by comma: `event.topics=some/topic,other/topic` -* You can register for all events with `*`. +- You can register a handler for multiple topics by separating them by comma: `event.topics=some/topic,other/topic` +- You can register for all events with `*`. ## Send Events @@ -78,9 +76,9 @@ The service contains two methods for sending events: ## Further Reading - - [OSGi Compendium Release 7][OSGi-cmpn] - - - - +- [OSGi Compendium Release 7][OSGi-cmpn] +- +- [fig1]:images/event-admin.png diff --git a/developers/osgi/images/delayedcomponent.png b/developers/osgi/images/delayedcomponent.png index e2be7fbe8..2ffbd5fb7 100644 Binary files a/developers/osgi/images/delayedcomponent.png and b/developers/osgi/images/delayedcomponent.png differ diff --git a/developers/osgi/images/edittarget.png b/developers/osgi/images/edittarget.png index 5f172333b..069c8a41c 100644 Binary files a/developers/osgi/images/edittarget.png and b/developers/osgi/images/edittarget.png differ diff --git a/developers/osgi/images/event-admin.png b/developers/osgi/images/event-admin.png index 0d4a71434..b90d05d7d 100644 Binary files a/developers/osgi/images/event-admin.png and b/developers/osgi/images/event-admin.png differ diff --git a/developers/osgi/images/immediatecomponent.png b/developers/osgi/images/immediatecomponent.png index 2f9aeb8dc..8b04267ec 100644 Binary files a/developers/osgi/images/immediatecomponent.png and b/developers/osgi/images/immediatecomponent.png differ diff --git a/developers/osgi/images/layeringosgi.png b/developers/osgi/images/layeringosgi.png index 247a77925..608fa98fd 100644 Binary files a/developers/osgi/images/layeringosgi.png and b/developers/osgi/images/layeringosgi.png differ diff --git a/developers/osgi/images/runconfiguration.png b/developers/osgi/images/runconfiguration.png index 8610436bd..1081fc340 100644 Binary files a/developers/osgi/images/runconfiguration.png and b/developers/osgi/images/runconfiguration.png differ diff --git a/developers/osgi/images/services.png b/developers/osgi/images/services.png index 672658dba..1e1b162bc 100644 Binary files a/developers/osgi/images/services.png and b/developers/osgi/images/services.png differ diff --git a/developers/osgi/images/states.png b/developers/osgi/images/states.png index 3a707e45f..da6716af2 100644 Binary files a/developers/osgi/images/states.png and b/developers/osgi/images/states.png differ diff --git a/developers/osgi/images/targetplatform.png b/developers/osgi/images/targetplatform.png index b885d4a78..e2c70c460 100644 Binary files a/developers/osgi/images/targetplatform.png and b/developers/osgi/images/targetplatform.png differ diff --git a/developers/osgi/osgi.md b/developers/osgi/osgi.md index f4c283ccd..35ca2bec2 100644 --- a/developers/osgi/osgi.md +++ b/developers/osgi/osgi.md @@ -3,16 +3,16 @@ layout: developersguide title: OSGi --- -{% include base.html %} - # OSGi Overview + {:.no_toc} openHAB is being based on [OSGi][OSGi] and understanding of OSGi modular architecture is very important. This page is aimed to help developers, that are going to use OSGi for the first time and contains a basic overview of the OSGi technology. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## Concepts @@ -31,11 +31,11 @@ Key features of OSGi are: The OSGi framework consist of several layers build on top of each other (See Fig. 1): - - **Module Layer** - it is responsible for managing dependencies between bundles and for class loading ([See Bundles Section](#bundles)); - - **Life Cycle Layer** - controls the lifecycle of the bundles ([See Lifecycle Section](#lifecycle)); - - **Service Layer** - defines a dynamic model (publish/find/bind) of communication between different modules ([See Services Section](#services)); - - **Actual Services** (Bundles on Fig.1) - this is the application layer, using all other layers; - - **Security Layer** - optional layer, based on the Java 2 security architecture, that manages permissions for different modules. +- **Module Layer** - it is responsible for managing dependencies between bundles and for class loading ([See Bundles Section](#bundles)); +- **Life Cycle Layer** - controls the lifecycle of the bundles ([See Lifecycle Section](#lifecycle)); +- **Service Layer** - defines a dynamic model (publish/find/bind) of communication between different modules ([See Services Section](#services)); +- **Actual Services** (Bundles on Fig.1) - this is the application layer, using all other layers; +- **Security Layer** - optional layer, based on the Java 2 security architecture, that manages permissions for different modules. ![OSGi Layers][fig1] Fig.1 OSGi Layering (Source:) @@ -168,12 +168,12 @@ We will list the most popular OSGi containers with a short description of their ## Further Reading - - [OSGi Core Release 7][OSGi-core] - - [OSGi API](https://osgi.org/javadoc/osgi.core/7.0.0/) - - [OSGi Vogella guide](http://www.vogella.com/tutorials/OSGi/article.html) - - [Lifecycle of a bundle](https://developer.atlassian.com/docs/atlassian-platform-common-components/plugin-framework/behind-the-scenes-in-the-plugin-framework/lifecycle-of-a-bundle) - - [OSGi enRoute](https://enroute.osgi.org/) - - +- [OSGi Core Release 7][OSGi-core] +- [OSGi API](https://osgi.org/javadoc/osgi.core/7.0.0/) +- [OSGi Vogella guide](http://www.vogella.com/tutorials/OSGi/article.html) +- [Lifecycle of a bundle](https://developer.atlassian.com/docs/atlassian-platform-common-components/plugin-framework/behind-the-scenes-in-the-plugin-framework/lifecycle-of-a-bundle) +- [OSGi enRoute](https://enroute.osgi.org/) +- [OSGi]: https://www.osgi.org/ [OSGi-core]: https://osgi.org/download/r7/osgi.core-7.0.0.pdf diff --git a/developers/osgi/osgids.md b/developers/osgi/osgids.md index 35dfa5747..32b529769 100644 --- a/developers/osgi/osgids.md +++ b/developers/osgi/osgids.md @@ -3,9 +3,8 @@ layout: developersguide title: OSGi Declarative Services --- -{% include base.html %} - # Declarative Services + {:.no_toc} In the [OSGi Overview article](osgi.html) we have mentioned that a bundle can register, unregister, get and unget services from a central point - the Service Registry. @@ -13,15 +12,17 @@ In the [OSGi Overview article](osgi.html) we have mentioned that a bundle can re In order to simplify the usage of services the [OSGi Alliance](https://www.osgi.org/about-us/) has developed a model of managing services dynamically called *Declarative Services*. {::options toc_levels="2"/} -* TOC + +- TOC + {:toc} ## Model & Terms In order to understand this model, we will have to first explain a few terms, used below: -- **Declarative Services Container** (we will use the shorthand **DS**) - a module that is managing the [lifecycle](#vii-component-lifecycle) of a *service component* dynamically. - It activates and deactivates different components, basing its decisions on the information contained in the *component description*; +- **Declarative Services Container** (we will use the shorthand **DS**) - a module that is managing the [lifecycle](#vii-component-lifecycle) of a *service component- dynamically. + It activates and deactivates different components, basing its decisions on the information contained in the _component description_; - **Service Component** (or also **component**) - an object whose lifecycle is managed, usually by a component framework such as Declarative Services (DS). A component may publish itself as an OSGi service or consume OSGi services. @@ -41,7 +42,7 @@ This ensures that service components are managed dynamically. ## Components -It is important to understand the difference between a *component* and a *service*. +It is important to understand the difference between a *component** and a *service*. A component is a normal Java class, that can reference services and provide services. What makes a component specific is that it is declared in a XML file and is managed completely by DS. That means that DS instantiates the component, calls method on this component and manages the lifecycle of a component. @@ -112,16 +113,16 @@ public class MyService { Let's take a look at some configuration parameters, that we can apply: - **immediate**: - - *true* - the component is activated as soon as all dependencies are satisfied. Adding this option will ensure that the component will be activated right after the bundle is activated and the component is satisfied; - - *false* - the component has lazy activation. The activation of the component is delayed(lazy activation) until the service is requested. This is the default value; + - *true- - the component is activated as soon as all dependencies are satisfied. Adding this option will ensure that the component will be activated right after the bundle is activated and the component is satisfied; + - *false- - the component has lazy activation. The activation of the component is delayed(lazy activation) until the service is requested. This is the default value; - **cardinality**: - - *1..1* - single service reference, that is mandatory. If your referenced service gets inactive, DS deactivates your service component as well (default value); - - *0..1* - single service reference(not mandatory). You have to be aware that you might not have your reference resolved, your component can live with the absence; - - *0..n* - multiple service references (not mandatory). The referenced service can be implemented multiple times, so they are added to a list in your component implementation; - - *1..n* = like the above, but mandatory; + - *1..1- - single service reference, that is mandatory. If your referenced service gets inactive, DS deactivates your service component as well (default value); + - *0..1- - single service reference(not mandatory). You have to be aware that you might not have your reference resolved, your component can live with the absence; + - *0..n- - multiple service references (not mandatory). The referenced service can be implemented multiple times, so they are added to a list in your component implementation; + - *1..n- = like the above, but mandatory; - **policy**: - - *static* - the default policy. Component configuration are deactivated every time, when a reference with static policy becomes unavailable. This causes the activating and deactivating of the component. It can be very expensive, when we have multiple bound services, or when a service is often unregistered and re-registered; - - *dynamic* - with this policy the component is not deactivated, when a referenced service is changed. It is slightly more complex, as the component implementation has to properly handle changes in the set of bound services. + - *static- - the default policy. Component configuration are deactivated every time, when a reference with static policy becomes unavailable. This causes the activating and deactivating of the component. It can be very expensive, when we have multiple bound services, or when a service is often unregistered and re-registered; + - *dynamic- - with this policy the component is not deactivated, when a referenced service is changed. It is slightly more complex, as the component implementation has to properly handle changes in the set of bound services. ### Method Injection @@ -208,7 +209,7 @@ You can find more information in the [OSGi Compendium Release 7, Chapter 112.2: A component goes through several states in his lifecycle: - **UNSATISFIED** - initial state of the Service Component, after the bundle is started; -- **REGISTERED** - temporary state. Only *delayed* components go through this state; +- **REGISTERED** - temporary state. Only *delayed- components go through this state; - **ACTIVE** - the component is active and component instance is created. @@ -229,8 +230,8 @@ The next step is to satisfy the component configuration. The component **configuration is satisfied** when: - - component is **enabled**; - - all the **component references are satisfied**. +- component is **enabled**; +- all the **component references are satisfied**. A reference is satisfied when the reference specifies optional cardinality or there is at least one target service for the reference. If the component has lazy initialization (the component is *delayed*), it is moved to the REGISTERED state and it is waiting to be activated, when the service is requested (see Fig.2). Otherwise (the component is *immediate*) as soon as its dependencies are satisfied, the component is activated (see Fig.1). @@ -245,15 +246,15 @@ Activation consists of following steps: - The method that is annotated with `@Activate` is called, if present After the activation, the component is in ACTIVE state. -From this state the component can go back to the *REGISTERED* state (or to the *UNSATISFIED* state), if the component configuration becomes unsatisfied. +From this state the component can go back to the *REGISTERED- state (or to the*UNSATISFIED- state), if the component configuration becomes unsatisfied. ### Deactivation Deactivation consists of the following actions: - - The method that is annotated with `@Deactivate` is called, if present - - All `@Reference`d services are unbound - - Release all references to the component instance. +- The method that is annotated with `@Deactivate` is called, if present +- All `@Reference`d services are unbound +- Release all references to the component instance. ## Troubleshooting diff --git a/developers/persistence/index.md b/developers/persistence/index.md index 5f5255e7b..402a4c130 100644 --- a/developers/persistence/index.md +++ b/developers/persistence/index.md @@ -3,8 +3,6 @@ layout: developersguide title: Persistence Service --- -{% include base.html %} - # Developing a Persistence Service -TODO \ No newline at end of file +TODO diff --git a/developers/tests.md b/developers/tests.md index 0f3c72c5a..73fa95766 100644 --- a/developers/tests.md +++ b/developers/tests.md @@ -3,8 +3,6 @@ layout: developersguide title: Writing tests --- -{% include base.html %} - # Tests There are two approaches for testing: @@ -42,9 +40,9 @@ assertThat(pt.toString(), is(equalTo("0.0001"))); ### Mockito -In order to keep tests as focused as possible we use the mocking framework [https://github.com/mockito/mockito Mockito]. +In order to keep tests as focused as possible we use the mocking framework [ Mockito]. Mockito lets us verify interactions between supporting classes and the unit under test and additionally supports stubbing of method calls for these classes. -Please read the very short but expressive introduction on the [https://site.mockito.org/ Mockito homepage] in addition to this small example: +Please read the very short but expressive introduction on the [ Mockito homepage] in addition to this small example: ```java public class MyBindingHandlerTest { @@ -199,9 +197,9 @@ At the end the mock is unregistered again. ## Common errors -### Failed to execute goal org.eclipse.tycho:tycho-surefire-plugin:XXX:test (default-test) on project XXX: No tests found. +### Failed to execute goal org.eclipse.tycho:tycho-surefire-plugin:XXX:test (default-test) on project XXX: No tests found Maven might report this error when building your project, it means that the maven surefire plugin cannot find any tests to execute, please check the following details: -* Did you add any test classes with a class-name which ends with `Test` (singular) -* Did you annotate any methods with `@Test` +- Did you add any test classes with a class-name which ends with `Test` (singular) +- Did you annotate any methods with `@Test` diff --git a/developers/transformations/index.md b/developers/transformations/index.md index b93c2d874..2f500fcd1 100644 --- a/developers/transformations/index.md +++ b/developers/transformations/index.md @@ -3,8 +3,6 @@ layout: developersguide title: Transformations / Profiles --- -{% include base.html %} - # Developing a Transformation Service Transformations and Profiles (see next section) are very similar in their nature. Usually @@ -42,7 +40,6 @@ Next you implement the `transform` method. You are given a user configuration an In our case we do not use the `config` parameter. Other services like the regex or map transformation are using this parameter for the regex ("`.*=(\\d*.\\d*).*`") or the map (`mapfile.map`) for example. - Our implementation is as simple as this: ```java @@ -61,28 +58,28 @@ just like transformations. But in contrast to transformations, if one Channel is linked to several Items it also will have several profile instances. Each instance handling the communication to exactly one of these Items. -The same applies for the situation where one Item is linked to multiple Channels. +The same applies for the situation where one Item is linked to multiple Channels. -Profiles are created by ProfileFactories and are retained for the lifetime of their link. +Profiles are created by ProfileFactories and are retained for the lifetime of their link. This means that they are, in contrast to transformations, allowed to retain a transient state, -like e.g. the timestamp of the the last event or the last state. +like e.g. the timestamp of the the last event or the last state. With this, it is possible to take into account the temporal dimension when calculating the appropriate action in any situation. There exist two different kinds of profiles: state and trigger profiles. ## State Profiles -State profiles are responsible for communication between Items and their corresponding state Channels (`ChannelKind.STATE`). +State profiles are responsible for communication between Items and their corresponding state Channels (`ChannelKind.STATE`). Their purpose is to forward state updates and commands to and from the Thing handlers. ## Trigger Profiles -Trigger Channels (`ChannelKind.TRIGGER`) by themselves do not maintain a state (as by their nature they only fire events). -With the help of trigger profiles they can be linked to Items anyway. -Hence the main purpose of a trigger profile is to calculate a state based on the fired events. -This state then is forwarded to the linked Item by sending `ItemStateEvents`. +Trigger Channels (`ChannelKind.TRIGGER`) by themselves do not maintain a state (as by their nature they only fire events). +With the help of trigger profiles they can be linked to Items anyway. +Hence the main purpose of a trigger profile is to calculate a state based on the fired events. +This state then is forwarded to the linked Item by sending `ItemStateEvents`. -Trigger profiles are powerful means to implement some immediate, straight-forward logic without the need to write any rules. +Trigger profiles are powerful means to implement some immediate, straight-forward logic without the need to write any rules. Apart from that, they do not pass any commands or state updates to and from the Thing handler as by their nature trigger Channels are not capable of handling these. diff --git a/developers/utils/events.md b/developers/utils/events.md index 7c5cc043e..dec075166 100644 --- a/developers/utils/events.md +++ b/developers/utils/events.md @@ -3,9 +3,8 @@ layout: developersguide title: Event Bus --- -{% include base.html %} - # Event Bus + {:.no_toc} The openHAB framework provides an event bus for inter-component communication. @@ -16,7 +15,8 @@ This section introduces the event API and illustrates how to receive such events Furthermore, the sending of events and the implementation of new event types will be described. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## API Introduction @@ -171,19 +171,19 @@ Each event subscriber must be registered via OSGi Declarative Services (DS) unde The listing below summarizes some best practices in order to implement event subscribers: - To subscribe to only one event type openHAB provides the `org.openhab.core.events.AbstractTypedEventSubscriber` implementation. -To receive an already cast event the `receiveTypedEvent(T)` method must be implemented. -To provide an event filter the method `getEventFilter()` can be overridden. + To receive an already cast event the `receiveTypedEvent(T)` method must be implemented. + To provide an event filter the method `getEventFilter()` can be overridden. - openHAB provides an `AbstractItemEventSubscriber` class in order to receive `ItemStateEvents` and `ItemCommandEvents` (more information can be obtained in the next chapter). - To filter events based on a topic the `org.openhab.core.events.TopicEventFilter` implementation from the openHAB core bundle can be used. -The filtering is based on [Java regular expression](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html). + The filtering is based on [Java regular expression](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html). - The subscribed event types and the filter should be stored as class members (see example above) due to performance reasons. - If the subscribed event types are sufficient in order to receive all interested events, do not return any filter (in that case the method getFilter() returns null) due to performance reasons. - Avoid the creation of too many event subscribers. -Similar event types can be received in one event subscriber. + Similar event types can be received in one event subscriber. - Handle exceptions in event subscriber implementation and throw only serious exceptions. -Thrown exceptions will be handled in the framework by logging an error message with the cause. + Thrown exceptions will be handled in the framework by logging an error message with the cause. - The receive method should terminate quickly, since it blocks other event subscribers. -Create a thread for long running operations. + Create a thread for long running operations. ### Receive ItemStateEvents and ItemCommandEvents @@ -280,7 +280,7 @@ public class SunriseEvent extends AbstractEvent { The listing below summarizes some coding guidelines as illustrated in the example above: - Events should only be created by event factories. -Constructors do not have any access specifier in order to make the class package private. + Constructors do not have any access specifier in order to make the class package private. - The serialization of the payload into a data transfer object (e.g. `SunriseDTO`) should be part of the event factory and will be assigned to a class member via the constructor. - A public member `TYPE` represents the event type as string representation and is usually the name of the class. - The `toString()` method should deliver a meaningful string since it is used for event logging. @@ -328,14 +328,14 @@ public class SunEventFactory extends AbstractEventFactory { The listing below summarizes some guidelines as illustrated in the example above: - Provide the supported event types (`SunriseEvent.TYPE`) via an `AbstractEventFactory` constructor call. -The supported event types will be returned by the `AbstractEventFactory.getSupportedEventTypes()` method. + The supported event types will be returned by the `AbstractEventFactory.getSupportedEventTypes()` method. - The event factory defines the topic (`SUNRISE_EVENT_TOPIC`) of the supported event types. -Please ensure that the topic format follows the topic structure of the openHAB core events, similar to a REST URI (`{namespace}/{entityType}/{entity}/{sub-entity-1}/.../{sub-entity-n}/{action}`). -The namespace must be `openhab`. + Please ensure that the topic format follows the topic structure of the openHAB core events, similar to a REST URI (`{namespace}/{entityType}/{entity}/{sub-entity-1}/.../{sub-entity-n}/{action}`). + The namespace must be `openhab`. - Implement the method `createEventByType(String eventType, String topic, String payload, String source)` to create a new event based on the topic and the payload, determined by the event type. -This method will be called by the framework in order to dispatch received events to the corresponding event subscribers. -If the payload is serialized with JSON, the method `deserializePayload(String payload, Class classOfPayload)` can be used to deserialize the payload into a data transfer object. + This method will be called by the framework in order to dispatch received events to the corresponding event subscribers. + If the payload is serialized with JSON, the method `deserializePayload(String payload, Class classOfPayload)` can be used to deserialize the payload into a data transfer object. - Provide a static method to create event instances based on a domain object (Item, Thing, or in the example above `Sunrise`). -This method can be used by components in order to create events based on domain objects which should be sent by the EventPublisher. -If the data transfer object should be serialized into a JSON payload, the method `serializePayload(Object payloadObject)` can be used. -Custom event factories must be registered as an OSGi Service (eg. by using the @Component annotation) in order to receive the custom events. + This method can be used by components in order to create events based on domain objects which should be sent by the EventPublisher. + If the data transfer object should be serialized into a JSON payload, the method `serializePayload(Object payloadObject)` can be used. + Custom event factories must be registered as an OSGi Service (eg. by using the @Component annotation) in order to receive the custom events. diff --git a/developers/utils/i18n.md b/developers/utils/i18n.md index 8a1226e04..e028105e2 100644 --- a/developers/utils/i18n.md +++ b/developers/utils/i18n.md @@ -3,15 +3,15 @@ layout: developersguide title: Internationalization --- -{% include base.html %} - # Internationalization + {:.no_toc} In this chapter the openHAB support for internationalization is described. {::options toc_levels="2,3"/} -* TOC + +- TOC {:toc} ## Folder and File Structure @@ -20,7 +20,7 @@ All texts can be internationalized by using Java i18n properties files. For each language a specific file with a postfix notation is used. The postfix consists of a language code and an optional region code (country code). -``` +```text Format: any__.properties Example: any_de_DE.properties ``` @@ -30,7 +30,7 @@ The region code (country code) consists of two uppercase letters that are confor The search order for those files is the following: -``` +```text any__.properties any_.properties any.properties @@ -40,13 +40,13 @@ You can find detailed information about Java internationalization support and a The properties files have to be placed in the following directory of the bundle: -``` +```text OH-INF/i18n ``` Example files: -``` +```text |- OH-INF |---- i18n |------- yahooweather.properties @@ -75,7 +75,7 @@ XML file (`binding.xml`): YahooWeather Binding The Yahoo Weather Binding requests the Yahoo Weather Service - to show the current temperature, humidity and pressure. + to show the current temperature, humidity and pressure. Kai Kreuzer ``` diff --git a/developers/utils/tools.md b/developers/utils/tools.md index 6072458d5..3754ffebc 100644 --- a/developers/utils/tools.md +++ b/developers/utils/tools.md @@ -23,7 +23,7 @@ The id is provided through a static method and can be retrieved through The `NetworkAddressService` is an OSGi service that can be used like any other OSGi service by adding a service reference to it. Its OSGi service name is `org.openhab.core.network`. -A user can configure his default network address via Paper UI under `Configuration -> System -> Network Settings`. +A user can configure his default network address via UI under `Settings -> Network Settings`. One can obtain the configured address via the `getPrimaryIpv4HostAddress()` method on the service. This service is useful for example in the `ThingHandlerFactory` or an `AudioSink` where one needs a specific IP address of the host system to provide something like a `callback` URL. @@ -45,7 +45,7 @@ The framework provides some caching solutions for common scenarios. A common usage case is in a `ThingHandler` to encapsulate one value of an internal state and attach an expire time on that value. A cache action will be called to refresh the value if it is expired. This is what `ExpiringCache` implements. -If `handleCommand(ChannelUID channelUID, Command command)` is called with the "RefreshType" command, you just return `cache.getValue()`. +If `handleCommand(ChannelUID channelUID, Command command)` is called with the "RefreshType" command, you just return `cache.getValue()`. It is a good practice to return as fast as possible from the `handleCommand(ChannelUID channelUID, Command command)` method to not block callers especially UIs. Use this type of cache only, if your refresh action is a quick to compute, blocking operation. @@ -58,7 +58,6 @@ If the state is too old, we need to fetch it first and this may involve network A common usage case of the `ExpiringCacheAsync` cache type is in a `ThingHandler` to encapsulate one value of an internal state and attach an expire time on that value. - A **handleCommand** implementation with the interesting *RefreshType* could look like this: ```java @@ -91,7 +90,7 @@ and mark the Future as *complete*. ```java class FetchValueFromDevice implements Supplier>, DeviceStateUpdateListener { CompletableFuture c; - + @Override CompletableFuture get() { if (c != null) { @@ -100,7 +99,7 @@ class FetchValueFromDevice implements Supplier>, Devic } return c; } - + // Here you process the callback from your device refresh method @Override void asyncCallbackFromDeviceStateRefresh(double newValue) { @@ -112,5 +111,6 @@ class FetchValueFromDevice implements Supplier>, Devic } } ``` + If you deal with a newer implementation with a CompletableFuture support, it is even easier. You would just return your CompletableFuture. diff --git a/images/addons/acer.png b/images/addons/acer.png index ab0005cab..6cf5ddc3e 100644 Binary files a/images/addons/acer.png and b/images/addons/acer.png differ diff --git a/images/addons/airq.png b/images/addons/airq.png new file mode 100644 index 000000000..07b546473 Binary files /dev/null and b/images/addons/airq.png differ diff --git a/images/addons/airquality.png b/images/addons/airquality.png index 85da4161f..5b2f81243 100644 Binary files a/images/addons/airquality.png and b/images/addons/airquality.png differ diff --git a/images/addons/airvisualnode.png b/images/addons/airvisualnode.png index eb25d7b84..0317d146e 100644 Binary files a/images/addons/airvisualnode.png and b/images/addons/airvisualnode.png differ diff --git a/images/addons/akm8681.png b/images/addons/akm8681.png index cb84505a1..aa2e0b0bd 100644 Binary files a/images/addons/akm8681.png and b/images/addons/akm8681.png differ diff --git a/images/addons/allplay.png b/images/addons/allplay.png index 41c95a404..a13e6e01e 100644 Binary files a/images/addons/allplay.png and b/images/addons/allplay.png differ diff --git a/images/addons/amazon-echo.png b/images/addons/amazon-echo.png index 835db412f..d7f67dbfd 100644 Binary files a/images/addons/amazon-echo.png and b/images/addons/amazon-echo.png differ diff --git a/images/addons/amazondashbutton.png b/images/addons/amazondashbutton.png index 5358fb125..0ce1b8d53 100644 Binary files a/images/addons/amazondashbutton.png and b/images/addons/amazondashbutton.png differ diff --git a/images/addons/amazonechocontrol.png b/images/addons/amazonechocontrol.png index 5afc996ad..b66e5a248 100644 Binary files a/images/addons/amazonechocontrol.png and b/images/addons/amazonechocontrol.png differ diff --git a/images/addons/ambientweather.png b/images/addons/ambientweather.png index 91a4355f6..14178cff7 100644 Binary files a/images/addons/ambientweather.png and b/images/addons/ambientweather.png differ diff --git a/images/addons/anel.png b/images/addons/anel.png index 49f17463e..d153c0b96 100644 Binary files a/images/addons/anel.png and b/images/addons/anel.png differ diff --git a/images/addons/asterisk.png b/images/addons/asterisk.png index 43ba47a31..c3c13fc1d 100644 Binary files a/images/addons/asterisk.png and b/images/addons/asterisk.png differ diff --git a/images/addons/atlona.png b/images/addons/atlona.png index db30d3984..17e5e464d 100644 Binary files a/images/addons/atlona.png and b/images/addons/atlona.png differ diff --git a/images/addons/autelis.png b/images/addons/autelis.png index 7c8be8acd..a827be3eb 100644 Binary files a/images/addons/autelis.png and b/images/addons/autelis.png differ diff --git a/images/addons/avmfritz.png b/images/addons/avmfritz.png index c7547521f..9d826559a 100644 Binary files a/images/addons/avmfritz.png and b/images/addons/avmfritz.png differ diff --git a/images/addons/azureiothub.png b/images/addons/azureiothub.png index 96a381ea4..f1afbcb79 100644 Binary files a/images/addons/azureiothub.png and b/images/addons/azureiothub.png differ diff --git a/images/addons/benqprojector.png b/images/addons/benqprojector.png index bb20a338c..04e869fad 100644 Binary files a/images/addons/benqprojector.png and b/images/addons/benqprojector.png differ diff --git a/images/addons/bigassfan.png b/images/addons/bigassfan.png index 00ff9700e..5f6b72e13 100644 Binary files a/images/addons/bigassfan.png and b/images/addons/bigassfan.png differ diff --git a/images/addons/bluetooth.airthings.png b/images/addons/bluetooth.airthings.png index 996c17962..afc6ca8c2 100644 Binary files a/images/addons/bluetooth.airthings.png and b/images/addons/bluetooth.airthings.png differ diff --git a/images/addons/bluetooth.bluegiga.png b/images/addons/bluetooth.bluegiga.png index 6758335cb..19eb981ca 100644 Binary files a/images/addons/bluetooth.bluegiga.png and b/images/addons/bluetooth.bluegiga.png differ diff --git a/images/addons/bluetooth.bluez.png b/images/addons/bluetooth.bluez.png index 4aa93e575..5571a9a85 100644 Binary files a/images/addons/bluetooth.bluez.png and b/images/addons/bluetooth.bluez.png differ diff --git a/images/addons/bluetooth.blukii.png b/images/addons/bluetooth.blukii.png index 043ded533..2a39df87d 100644 Binary files a/images/addons/bluetooth.blukii.png and b/images/addons/bluetooth.blukii.png differ diff --git a/images/addons/bluetooth.png b/images/addons/bluetooth.png index b5afd5940..6c3acc68e 100644 Binary files a/images/addons/bluetooth.png and b/images/addons/bluetooth.png differ diff --git a/images/addons/bluetooth.ruuvitag.png b/images/addons/bluetooth.ruuvitag.png index 421ade508..4f178b10a 100644 Binary files a/images/addons/bluetooth.ruuvitag.png and b/images/addons/bluetooth.ruuvitag.png differ diff --git a/images/addons/bmwconnecteddrive.png b/images/addons/bmwconnecteddrive.png new file mode 100644 index 000000000..689d65584 Binary files /dev/null and b/images/addons/bmwconnecteddrive.png differ diff --git a/images/addons/boschindego.png b/images/addons/boschindego.png index dcb3407b8..1c8d1af18 100644 Binary files a/images/addons/boschindego.png and b/images/addons/boschindego.png differ diff --git a/images/addons/bosesoundtouch.png b/images/addons/bosesoundtouch.png index a4530d4eb..d864f42b6 100644 Binary files a/images/addons/bosesoundtouch.png and b/images/addons/bosesoundtouch.png differ diff --git a/images/addons/bsblan.png b/images/addons/bsblan.png new file mode 100644 index 000000000..5405bf41f Binary files /dev/null and b/images/addons/bsblan.png differ diff --git a/images/addons/bticino.png b/images/addons/bticinosmarther.png similarity index 100% rename from images/addons/bticino.png rename to images/addons/bticinosmarther.png diff --git a/images/addons/buienradar.png b/images/addons/buienradar.png index a67b924d2..0ca049366 100644 Binary files a/images/addons/buienradar.png and b/images/addons/buienradar.png differ diff --git a/images/addons/cardio2e1.png b/images/addons/cardio2e1.png index 1aef21de8..bfdd23632 100644 Binary files a/images/addons/cardio2e1.png and b/images/addons/cardio2e1.png differ diff --git a/images/addons/cm11a.png b/images/addons/cm11a.png index a5c83282c..6e9acdd19 100644 Binary files a/images/addons/cm11a.png and b/images/addons/cm11a.png differ diff --git a/images/addons/comfoair.png b/images/addons/comfoair.png new file mode 100644 index 000000000..2ea040d33 Binary files /dev/null and b/images/addons/comfoair.png differ diff --git a/images/addons/comfoair1.png b/images/addons/comfoair1.png deleted file mode 100644 index e3ad14dbf..000000000 Binary files a/images/addons/comfoair1.png and /dev/null differ diff --git a/images/addons/daikin.png b/images/addons/daikin.png index 308a75b30..78f4173c0 100644 Binary files a/images/addons/daikin.png and b/images/addons/daikin.png differ diff --git a/images/addons/darksky.png b/images/addons/darksky.png index 2c7920404..360b80f8f 100644 Binary files a/images/addons/darksky.png and b/images/addons/darksky.png differ diff --git a/images/addons/davis.png b/images/addons/davis.png index 39e3911bf..efe6733b4 100644 Binary files a/images/addons/davis.png and b/images/addons/davis.png differ diff --git a/images/addons/ddwrt.png b/images/addons/ddwrt.png index 4e4b2eca3..9a300e79c 100644 Binary files a/images/addons/ddwrt.png and b/images/addons/ddwrt.png differ diff --git a/images/addons/denon.png b/images/addons/denon.png index 0957e9b00..50a5cb437 100644 Binary files a/images/addons/denon.png and b/images/addons/denon.png differ diff --git a/images/addons/denonmarantz.png b/images/addons/denonmarantz.png index c179d8ca1..23391b678 100644 Binary files a/images/addons/denonmarantz.png and b/images/addons/denonmarantz.png differ diff --git a/images/addons/digitalstrom.png b/images/addons/digitalstrom.png index d2d28a96b..4bcd80e44 100644 Binary files a/images/addons/digitalstrom.png and b/images/addons/digitalstrom.png differ diff --git a/images/addons/dlink.png b/images/addons/dlink.png index b9f62481b..15fed6513 100644 Binary files a/images/addons/dlink.png and b/images/addons/dlink.png differ diff --git a/images/addons/dlinksmarthome.png b/images/addons/dlinksmarthome.png index d6ff9047b..13a72fd7d 100644 Binary files a/images/addons/dlinksmarthome.png and b/images/addons/dlinksmarthome.png differ diff --git a/images/addons/dropbox.png b/images/addons/dropbox.png index 7342cf756..11a23f80d 100644 Binary files a/images/addons/dropbox.png and b/images/addons/dropbox.png differ diff --git a/images/addons/dscalarm.png b/images/addons/dscalarm.png index ed456ee82..0c6033f23 100644 Binary files a/images/addons/dscalarm.png and b/images/addons/dscalarm.png differ diff --git a/images/addons/eclipseiotmarketplace.png b/images/addons/eclipseiotmarketplace.png index fccb058b4..17c9f9a00 100644 Binary files a/images/addons/eclipseiotmarketplace.png and b/images/addons/eclipseiotmarketplace.png differ diff --git a/images/addons/ecobee.png b/images/addons/ecobee.png index b4fa36394..416732e54 100644 Binary files a/images/addons/ecobee.png and b/images/addons/ecobee.png differ diff --git a/images/addons/edimax.png b/images/addons/edimax.png index d9f0e510b..4a494574a 100644 Binary files a/images/addons/edimax.png and b/images/addons/edimax.png differ diff --git a/images/addons/ekey.png b/images/addons/ekey.png index cf0de4109..142ea12c4 100644 Binary files a/images/addons/ekey.png and b/images/addons/ekey.png differ diff --git a/images/addons/energenie.png b/images/addons/energenie.png index 046365c5b..15656bef8 100644 Binary files a/images/addons/energenie.png and b/images/addons/energenie.png differ diff --git a/images/addons/enocean.png b/images/addons/enocean.png index ab4c2cbbd..f153b57cd 100644 Binary files a/images/addons/enocean.png and b/images/addons/enocean.png differ diff --git a/images/addons/epsonprojector.png b/images/addons/epsonprojector.png index c98484358..f9598675c 100644 Binary files a/images/addons/epsonprojector.png and b/images/addons/epsonprojector.png differ diff --git a/images/addons/fatekplc.png b/images/addons/fatekplc.png index 302113e2c..3447d602a 100644 Binary files a/images/addons/fatekplc.png and b/images/addons/fatekplc.png differ diff --git a/images/addons/fmiweather.png b/images/addons/fmiweather.png index 67938e565..d7d6f4624 100644 Binary files a/images/addons/fmiweather.png and b/images/addons/fmiweather.png differ diff --git a/images/addons/folding.png b/images/addons/folding.png index 3d0563bf7..2cd0d6496 100644 Binary files a/images/addons/folding.png and b/images/addons/folding.png differ diff --git a/images/addons/foscam.png b/images/addons/foscam.png index 91b979d6c..5c7d2e8a9 100644 Binary files a/images/addons/foscam.png and b/images/addons/foscam.png differ diff --git a/images/addons/free.png b/images/addons/free.png index 47ac74943..ee7f19b2e 100644 Binary files a/images/addons/free.png and b/images/addons/free.png differ diff --git a/images/addons/freebox.png b/images/addons/freebox.png index 1bf863e41..82077fc17 100644 Binary files a/images/addons/freebox.png and b/images/addons/freebox.png differ diff --git a/images/addons/fritzbox.png b/images/addons/fritzbox.png index b96cc226c..c083003ec 100644 Binary files a/images/addons/fritzbox.png and b/images/addons/fritzbox.png differ diff --git a/images/addons/fronius.png b/images/addons/fronius.png index cdbe7f9b2..181012a62 100644 Binary files a/images/addons/fronius.png and b/images/addons/fronius.png differ diff --git a/images/addons/frontiersiliconradio.png b/images/addons/frontiersiliconradio.png index 559abd556..b82cc4bf4 100644 Binary files a/images/addons/frontiersiliconradio.png and b/images/addons/frontiersiliconradio.png differ diff --git a/images/addons/fsinternetradio.png b/images/addons/fsinternetradio.png index 559abd556..b82cc4bf4 100644 Binary files a/images/addons/fsinternetradio.png and b/images/addons/fsinternetradio.png differ diff --git a/images/addons/garadget.png b/images/addons/garadget.png index 19acfdf20..9738c4162 100644 Binary files a/images/addons/garadget.png and b/images/addons/garadget.png differ diff --git a/images/addons/gardena.png b/images/addons/gardena.png index ca176b9dd..33c9cb59b 100644 Binary files a/images/addons/gardena.png and b/images/addons/gardena.png differ diff --git a/images/addons/gcal.png b/images/addons/gcal.png index 14db175c1..6138bfd44 100644 Binary files a/images/addons/gcal.png and b/images/addons/gcal.png differ diff --git a/images/addons/googletts.png b/images/addons/googletts.png index ca7aab1d6..a4a0ab734 100644 Binary files a/images/addons/googletts.png and b/images/addons/googletts.png differ diff --git a/images/addons/gpstracker.png b/images/addons/gpstracker.png index d3b432c5d..493808541 100644 Binary files a/images/addons/gpstracker.png and b/images/addons/gpstracker.png differ diff --git a/images/addons/grafana.png b/images/addons/grafana.png index feed58656..ff2602cff 100644 Binary files a/images/addons/grafana.png and b/images/addons/grafana.png differ diff --git a/images/addons/groheondus.png b/images/addons/groheondus.png index 6646f370b..8cb7aa290 100644 Binary files a/images/addons/groheondus.png and b/images/addons/groheondus.png differ diff --git a/images/addons/haassohnpelletstove.png b/images/addons/haassohnpelletstove.png new file mode 100644 index 000000000..1306704d7 Binary files /dev/null and b/images/addons/haassohnpelletstove.png differ diff --git a/images/addons/harmony.png b/images/addons/harmony.png index fb6e8008d..1712fc2af 100644 Binary files a/images/addons/harmony.png and b/images/addons/harmony.png differ diff --git a/images/addons/harmonyhub.png b/images/addons/harmonyhub.png index 937603efb..ce6fdba4e 100644 Binary files a/images/addons/harmonyhub.png and b/images/addons/harmonyhub.png differ diff --git a/images/addons/hdanywhere.png b/images/addons/hdanywhere.png index 923cfa80a..87a84f4a9 100644 Binary files a/images/addons/hdanywhere.png and b/images/addons/hdanywhere.png differ diff --git a/images/addons/heatmiser.png b/images/addons/heatmiser.png index c233f428d..c46f22bdc 100644 Binary files a/images/addons/heatmiser.png and b/images/addons/heatmiser.png differ diff --git a/images/addons/homekit.png b/images/addons/homekit.png index dbbed3d8b..5e8199eee 100644 Binary files a/images/addons/homekit.png and b/images/addons/homekit.png differ diff --git a/images/addons/homematic.png b/images/addons/homematic.png index 9ba597ccc..c4cee6dc4 100644 Binary files a/images/addons/homematic.png and b/images/addons/homematic.png differ diff --git a/images/addons/http.png b/images/addons/http.png index b41c02175..d1f132370 100644 Binary files a/images/addons/http.png and b/images/addons/http.png differ diff --git a/images/addons/hue.png b/images/addons/hue.png index d4d1d7294..5911619e6 100644 Binary files a/images/addons/hue.png and b/images/addons/hue.png differ diff --git a/images/addons/icloud.png b/images/addons/icloud.png index d35d1c520..005484659 100644 Binary files a/images/addons/icloud.png and b/images/addons/icloud.png differ diff --git a/images/addons/innogysmarthome.png b/images/addons/innogysmarthome.png index 502ec60bf..bc8a7b2ae 100644 Binary files a/images/addons/innogysmarthome.png and b/images/addons/innogysmarthome.png differ diff --git a/images/addons/insteon.png b/images/addons/insteon.png index ec8f9ef2d..12287b540 100644 Binary files a/images/addons/insteon.png and b/images/addons/insteon.png differ diff --git a/images/addons/insteonplm.png b/images/addons/insteonplm.png index ec8f9ef2d..12287b540 100644 Binary files a/images/addons/insteonplm.png and b/images/addons/insteonplm.png differ diff --git a/images/addons/javascript.png b/images/addons/javascript.png index 952ab4f68..7bce6930b 100644 Binary files a/images/addons/javascript.png and b/images/addons/javascript.png differ diff --git a/images/addons/jdbc.png b/images/addons/jdbc.png index 5385bc616..55631df00 100644 Binary files a/images/addons/jdbc.png and b/images/addons/jdbc.png differ diff --git a/images/addons/jsonpath.png b/images/addons/jsonpath.png index 23912f36a..f000dfe65 100644 Binary files a/images/addons/jsonpath.png and b/images/addons/jsonpath.png differ diff --git a/images/addons/knx.png b/images/addons/knx.png index 0fe374a8c..8a9b4b29a 100644 Binary files a/images/addons/knx.png and b/images/addons/knx.png differ diff --git a/images/addons/kodi.png b/images/addons/kodi.png index 1557c5bd2..775ef2913 100644 Binary files a/images/addons/kodi.png and b/images/addons/kodi.png differ diff --git a/images/addons/konnected.png b/images/addons/konnected.png index 1342f4f18..761bc93ea 100644 Binary files a/images/addons/konnected.png and b/images/addons/konnected.png differ diff --git a/images/addons/kostalinverter.png b/images/addons/kostalinverter.png index c57fe568e..ea9138a13 100644 Binary files a/images/addons/kostalinverter.png and b/images/addons/kostalinverter.png differ diff --git a/images/addons/koubachi.png b/images/addons/koubachi.png index 31a6c5e50..775738236 100644 Binary files a/images/addons/koubachi.png and b/images/addons/koubachi.png differ diff --git a/images/addons/lametrictime.png b/images/addons/lametrictime.png index 954d12b86..d28dad4dc 100644 Binary files a/images/addons/lametrictime.png and b/images/addons/lametrictime.png differ diff --git a/images/addons/lcn.png b/images/addons/lcn.png index 6248aeeda..0be06b8ba 100644 Binary files a/images/addons/lcn.png and b/images/addons/lcn.png differ diff --git a/images/addons/leapmotion.png b/images/addons/leapmotion.png index 2373493f5..83a961143 100644 Binary files a/images/addons/leapmotion.png and b/images/addons/leapmotion.png differ diff --git a/images/addons/lg.png b/images/addons/lg.png index 7ca0cc5b4..c758f5b6d 100644 Binary files a/images/addons/lg.png and b/images/addons/lg.png differ diff --git a/images/addons/lgtv.png b/images/addons/lgtv.png index 7ca0cc5b4..c758f5b6d 100644 Binary files a/images/addons/lgtv.png and b/images/addons/lgtv.png differ diff --git a/images/addons/lgtvserial.png b/images/addons/lgtvserial.png index fc77841ab..c5aebcd67 100644 Binary files a/images/addons/lgtvserial.png and b/images/addons/lgtvserial.png differ diff --git a/images/addons/lgwebos.png b/images/addons/lgwebos.png index 978548a83..00ce26969 100644 Binary files a/images/addons/lgwebos.png and b/images/addons/lgwebos.png differ diff --git a/images/addons/lifx.png b/images/addons/lifx.png index 35ef17cbb..a65bb8e14 100644 Binary files a/images/addons/lifx.png and b/images/addons/lifx.png differ diff --git a/images/addons/loxone.png b/images/addons/loxone.png index c17d773e4..e3dd72326 100644 Binary files a/images/addons/loxone.png and b/images/addons/loxone.png differ diff --git a/images/addons/lutron.png b/images/addons/lutron.png index b8037a8af..39aa7f468 100644 Binary files a/images/addons/lutron.png and b/images/addons/lutron.png differ diff --git a/images/addons/mactts.png b/images/addons/mactts.png deleted file mode 100644 index e0f2ee419..000000000 Binary files a/images/addons/mactts.png and /dev/null differ diff --git a/images/addons/mactts.svg b/images/addons/mactts.svg new file mode 100644 index 000000000..45df4152b --- /dev/null +++ b/images/addons/mactts.svg @@ -0,0 +1,4 @@ + + + + diff --git a/images/addons/marytts.png b/images/addons/marytts.png index e90812ef5..1222174dd 100644 Binary files a/images/addons/marytts.png and b/images/addons/marytts.png differ diff --git a/images/addons/max.png b/images/addons/max.png index 2ac6a5823..ff612e71b 100644 Binary files a/images/addons/max.png and b/images/addons/max.png differ diff --git a/images/addons/miele.png b/images/addons/miele.png index 646b9bbac..92d025005 100644 Binary files a/images/addons/miele.png and b/images/addons/miele.png differ diff --git a/images/addons/mihome.png b/images/addons/mihome.png index ef3292baa..b7b3835e1 100644 Binary files a/images/addons/mihome.png and b/images/addons/mihome.png differ diff --git a/images/addons/minecraft.png b/images/addons/minecraft.png index 640d98026..3ae5b4789 100644 Binary files a/images/addons/minecraft.png and b/images/addons/minecraft.png differ diff --git a/images/addons/modbus.e3dc.png b/images/addons/modbus.e3dc.png new file mode 100644 index 000000000..85272a897 Binary files /dev/null and b/images/addons/modbus.e3dc.png differ diff --git a/images/addons/modbus.png b/images/addons/modbus.png index 074d46006..97a67cca0 100644 Binary files a/images/addons/modbus.png and b/images/addons/modbus.png differ diff --git a/images/addons/modbus.studer.png b/images/addons/modbus.studer.png index cd54be4c6..dc0542df0 100644 Binary files a/images/addons/modbus.studer.png and b/images/addons/modbus.studer.png differ diff --git a/images/addons/mongodb.png b/images/addons/mongodb.png index 6cb8b3045..fc0593269 100644 Binary files a/images/addons/mongodb.png and b/images/addons/mongodb.png differ diff --git a/images/addons/mqtt.generic.png b/images/addons/mqtt.generic.png deleted file mode 100644 index 8229bf3a1..000000000 Binary files a/images/addons/mqtt.generic.png and /dev/null differ diff --git a/images/addons/mqtt.png b/images/addons/mqtt.png index 6ea68d06d..68ac974e2 100644 Binary files a/images/addons/mqtt.png and b/images/addons/mqtt.png differ diff --git a/images/addons/mqttitude.png b/images/addons/mqttitude.png index 116ae7ced..079889be5 100644 Binary files a/images/addons/mqttitude.png and b/images/addons/mqttitude.png differ diff --git a/images/addons/mysensors.png b/images/addons/mysensors.png index 902e7db3c..708b232fb 100644 Binary files a/images/addons/mysensors.png and b/images/addons/mysensors.png differ diff --git a/images/addons/mysql.png b/images/addons/mysql.png index 13682f8c6..838a79902 100644 Binary files a/images/addons/mysql.png and b/images/addons/mysql.png differ diff --git a/images/addons/mystrom.png b/images/addons/mystrom.png index 497c76822..64f56acea 100644 Binary files a/images/addons/mystrom.png and b/images/addons/mystrom.png differ diff --git a/images/addons/nanoleaf.png b/images/addons/nanoleaf.png index c2e8e81f9..576243058 100644 Binary files a/images/addons/nanoleaf.png and b/images/addons/nanoleaf.png differ diff --git a/images/addons/neato.png b/images/addons/neato.png index 511f0286f..bf25effc6 100644 Binary files a/images/addons/neato.png and b/images/addons/neato.png differ diff --git a/images/addons/neeo.png b/images/addons/neeo.png index 36d9d3d9b..8c1456bba 100644 Binary files a/images/addons/neeo.png and b/images/addons/neeo.png differ diff --git a/images/addons/netatmo.png b/images/addons/netatmo.png index 450bdba15..ebcc5ce47 100644 Binary files a/images/addons/netatmo.png and b/images/addons/netatmo.png differ diff --git a/images/addons/nibeheatpump.png b/images/addons/nibeheatpump.png index cb38ccf60..265fbbc62 100644 Binary files a/images/addons/nibeheatpump.png and b/images/addons/nibeheatpump.png differ diff --git a/images/addons/nibeuplink.png b/images/addons/nibeuplink.png index 717d5acd9..265fbbc62 100644 Binary files a/images/addons/nibeuplink.png and b/images/addons/nibeuplink.png differ diff --git a/images/addons/nikohomecontrol.png b/images/addons/nikohomecontrol.png index 646a1603a..cea9bb25d 100644 Binary files a/images/addons/nikohomecontrol.png and b/images/addons/nikohomecontrol.png differ diff --git a/images/addons/nuki.png b/images/addons/nuki.png index 5edae4daa..46343d7da 100644 Binary files a/images/addons/nuki.png and b/images/addons/nuki.png differ diff --git a/images/addons/oceanic.png b/images/addons/oceanic.png index 2d360fa3f..7ff53866b 100644 Binary files a/images/addons/oceanic.png and b/images/addons/oceanic.png differ diff --git a/images/addons/omnilink.png b/images/addons/omnilink.png new file mode 100644 index 000000000..68e8f0e5e Binary files /dev/null and b/images/addons/omnilink.png differ diff --git a/images/addons/onebusaway.png b/images/addons/onebusaway.png index 010d7b135..cc9ee293e 100644 Binary files a/images/addons/onebusaway.png and b/images/addons/onebusaway.png differ diff --git a/images/addons/onkyo.png b/images/addons/onkyo.png index 9f86c5e81..65aa73684 100644 Binary files a/images/addons/onkyo.png and b/images/addons/onkyo.png differ diff --git a/images/addons/opensprinkler.png b/images/addons/opensprinkler.png index f18533243..5990cf57a 100644 Binary files a/images/addons/opensprinkler.png and b/images/addons/opensprinkler.png differ diff --git a/images/addons/openuv.png b/images/addons/openuv.png index 319f0018c..0c4bd3ec2 100644 Binary files a/images/addons/openuv.png and b/images/addons/openuv.png differ diff --git a/images/addons/openweathermap.png b/images/addons/openweathermap.png index 4a7ec3df0..4846c8b3d 100644 Binary files a/images/addons/openweathermap.png and b/images/addons/openweathermap.png differ diff --git a/images/addons/openwebnet.png b/images/addons/openwebnet.png new file mode 100644 index 000000000..afc32608d Binary files /dev/null and b/images/addons/openwebnet.png differ diff --git a/images/addons/openwrt.png b/images/addons/openwrt.png index d772b5e0b..5f8b08b28 100644 Binary files a/images/addons/openwrt.png and b/images/addons/openwrt.png differ diff --git a/images/addons/orvibo.png b/images/addons/orvibo.png index 75a7f06e9..845b42ea5 100644 Binary files a/images/addons/orvibo.png and b/images/addons/orvibo.png differ diff --git a/images/addons/owntracks.png b/images/addons/owntracks.png index 30f7ff031..079889be5 100644 Binary files a/images/addons/owntracks.png and b/images/addons/owntracks.png differ diff --git a/images/addons/panasonic.png b/images/addons/panasonic.png index 5a4bc6bf2..9e977aa39 100644 Binary files a/images/addons/panasonic.png and b/images/addons/panasonic.png differ diff --git a/images/addons/pioneeravr.png b/images/addons/pioneeravr.png index 368d87baf..14ffdcca6 100644 Binary files a/images/addons/pioneeravr.png and b/images/addons/pioneeravr.png differ diff --git a/images/addons/plex.png b/images/addons/plex.png index 323f46184..ef58fcd31 100644 Binary files a/images/addons/plex.png and b/images/addons/plex.png differ diff --git a/images/addons/plugwise.png b/images/addons/plugwise.png index 2a9f28b8e..d20420bf7 100644 Binary files a/images/addons/plugwise.png and b/images/addons/plugwise.png differ diff --git a/images/addons/pulseaudio.png b/images/addons/pulseaudio.png index 063f2591a..b917f10ee 100644 Binary files a/images/addons/pulseaudio.png and b/images/addons/pulseaudio.png differ diff --git a/images/addons/pushbullet.png b/images/addons/pushbullet.png index cbe58d2f0..1bb2678a7 100644 Binary files a/images/addons/pushbullet.png and b/images/addons/pushbullet.png differ diff --git a/images/addons/pushover.png b/images/addons/pushover.png index d8426b4b4..4b46539d7 100644 Binary files a/images/addons/pushover.png and b/images/addons/pushover.png differ diff --git a/images/addons/qbus.png b/images/addons/qbus.png new file mode 100644 index 000000000..3c7d51fa3 Binary files /dev/null and b/images/addons/qbus.png differ diff --git a/images/addons/rfxcom.png b/images/addons/rfxcom.png index 2f32f0290..77f08ec5b 100644 Binary files a/images/addons/rfxcom.png and b/images/addons/rfxcom.png differ diff --git a/images/addons/roku.png b/images/addons/roku.png index 38910c29c..9a038536e 100644 Binary files a/images/addons/roku.png and b/images/addons/roku.png differ diff --git a/images/addons/russound.png b/images/addons/russound.png index 5ab5e7f20..f337281e5 100644 Binary files a/images/addons/russound.png and b/images/addons/russound.png differ diff --git a/images/addons/samsungtv.png b/images/addons/samsungtv.png index 0edff7777..d68884911 100644 Binary files a/images/addons/samsungtv.png and b/images/addons/samsungtv.png differ diff --git a/images/addons/silvercrestwifisocket.png b/images/addons/silvercrestwifisocket.png index 254978304..2d86260c5 100644 Binary files a/images/addons/silvercrestwifisocket.png and b/images/addons/silvercrestwifisocket.png differ diff --git a/images/addons/sleepiq.png b/images/addons/sleepiq.png index 5f5b1eea0..445e792b1 100644 Binary files a/images/addons/sleepiq.png and b/images/addons/sleepiq.png differ diff --git a/images/addons/smaenergymeter.png b/images/addons/smaenergymeter.png index 428ff284c..d352112d2 100644 Binary files a/images/addons/smaenergymeter.png and b/images/addons/smaenergymeter.png differ diff --git a/images/addons/smartthings.png b/images/addons/smartthings.png index da2815f93..007383adf 100644 Binary files a/images/addons/smartthings.png and b/images/addons/smartthings.png differ diff --git a/images/addons/solaredge.png b/images/addons/solaredge.png index bfed8aace..eeffd98da 100644 Binary files a/images/addons/solaredge.png and b/images/addons/solaredge.png differ diff --git a/images/addons/solarlog.png b/images/addons/solarlog.png index ae8e235f8..c0547a843 100644 Binary files a/images/addons/solarlog.png and b/images/addons/solarlog.png differ diff --git a/images/addons/somfytahoma.png b/images/addons/somfytahoma.png index ef08e8a7d..fce5203b2 100644 Binary files a/images/addons/somfytahoma.png and b/images/addons/somfytahoma.png differ diff --git a/images/addons/sonyaudio.png b/images/addons/sonyaudio.png index 6f3ce8db0..292943e23 100644 Binary files a/images/addons/sonyaudio.png and b/images/addons/sonyaudio.png differ diff --git a/images/addons/soundtouch.png b/images/addons/soundtouch.png index c21d70ed5..09c8603f0 100644 Binary files a/images/addons/soundtouch.png and b/images/addons/soundtouch.png differ diff --git a/images/addons/squeezebox.png b/images/addons/squeezebox.png index 16e0d9aeb..3c22f2934 100644 Binary files a/images/addons/squeezebox.png and b/images/addons/squeezebox.png differ diff --git a/images/addons/tado.png b/images/addons/tado.png index 665127443..2d6e19406 100644 Binary files a/images/addons/tado.png and b/images/addons/tado.png differ diff --git a/images/addons/tankerkoenig.png b/images/addons/tankerkoenig.png index 4ed017ef3..5247a6aba 100644 Binary files a/images/addons/tankerkoenig.png and b/images/addons/tankerkoenig.png differ diff --git a/images/addons/telegram.png b/images/addons/telegram.png index a1336d2c9..7bc051a93 100644 Binary files a/images/addons/telegram.png and b/images/addons/telegram.png differ diff --git a/images/addons/tellstick.png b/images/addons/tellstick.png index 93d2bb7ad..24d77fff6 100644 Binary files a/images/addons/tellstick.png and b/images/addons/tellstick.png differ diff --git a/images/addons/tesla.png b/images/addons/tesla.png index 28a4f6838..ff11411a6 100644 Binary files a/images/addons/tesla.png and b/images/addons/tesla.png differ diff --git a/images/addons/tinkerforge.png b/images/addons/tinkerforge.png index 93477bb4f..2bdc6cb58 100644 Binary files a/images/addons/tinkerforge.png and b/images/addons/tinkerforge.png differ diff --git a/images/addons/tplinksmarthome.png b/images/addons/tplinksmarthome.png index fb1df4a41..5419d5d34 100644 Binary files a/images/addons/tplinksmarthome.png and b/images/addons/tplinksmarthome.png differ diff --git a/images/addons/tradfri.png b/images/addons/tradfri.png index d0364c772..3ea1a0d87 100644 Binary files a/images/addons/tradfri.png and b/images/addons/tradfri.png differ diff --git a/images/addons/twitter.png b/images/addons/twitter.png index 2c792ff38..878170c14 100644 Binary files a/images/addons/twitter.png and b/images/addons/twitter.png differ diff --git a/images/addons/unifi.png b/images/addons/unifi.png index 87dd72bbb..448417a32 100644 Binary files a/images/addons/unifi.png and b/images/addons/unifi.png differ diff --git a/images/addons/upb.png b/images/addons/upb.png new file mode 100644 index 000000000..ba2da5122 Binary files /dev/null and b/images/addons/upb.png differ diff --git a/images/addons/upb1.png b/images/addons/upb1.png deleted file mode 100644 index 75d05c53b..000000000 Binary files a/images/addons/upb1.png and /dev/null differ diff --git a/images/addons/velbus.png b/images/addons/velbus.png index 4763333cb..9ab175e4b 100644 Binary files a/images/addons/velbus.png and b/images/addons/velbus.png differ diff --git a/images/addons/vitotronic.png b/images/addons/vitotronic.png index 47a590e18..f654e6ab3 100644 Binary files a/images/addons/vitotronic.png and b/images/addons/vitotronic.png differ diff --git a/images/addons/weatherunderground.png b/images/addons/weatherunderground.png index a68cf5dc4..e59c878be 100644 Binary files a/images/addons/weatherunderground.png and b/images/addons/weatherunderground.png differ diff --git a/images/addons/wemo.png b/images/addons/wemo.png index e3584606a..3ca301ae3 100644 Binary files a/images/addons/wemo.png and b/images/addons/wemo.png differ diff --git a/images/addons/windcentrale.png b/images/addons/windcentrale.png index d9991db95..c8c85ca0e 100644 Binary files a/images/addons/windcentrale.png and b/images/addons/windcentrale.png differ diff --git a/images/addons/withings.png b/images/addons/withings.png index 6f5fad8ca..d91788fec 100644 Binary files a/images/addons/withings.png and b/images/addons/withings.png differ diff --git a/images/addons/wunderground.png b/images/addons/wunderground.png index 3b680cfd7..2d590de74 100644 Binary files a/images/addons/wunderground.png and b/images/addons/wunderground.png differ diff --git a/images/addons/xbmc.png b/images/addons/xbmc.png index 1557c5bd2..775ef2913 100644 Binary files a/images/addons/xbmc.png and b/images/addons/xbmc.png differ diff --git a/images/addons/xiaomi.png b/images/addons/xiaomi.png index 12262414d..38de46043 100644 Binary files a/images/addons/xiaomi.png and b/images/addons/xiaomi.png differ diff --git a/images/addons/yahooweather.png b/images/addons/yahooweather.png deleted file mode 100644 index 412c551be..000000000 Binary files a/images/addons/yahooweather.png and /dev/null differ diff --git a/images/addons/yeelight.png b/images/addons/yeelight.png index 70f1cc4b8..bf428e3f0 100644 Binary files a/images/addons/yeelight.png and b/images/addons/yeelight.png differ diff --git a/images/addons/zigbee.png b/images/addons/zigbee.png index 305499bda..f30019405 100644 Binary files a/images/addons/zigbee.png and b/images/addons/zigbee.png differ diff --git a/images/addons/zoneminder.png b/images/addons/zoneminder.png index ba5634728..7072c1b40 100644 Binary files a/images/addons/zoneminder.png and b/images/addons/zoneminder.png differ diff --git a/images/addons/zwave.png b/images/addons/zwave.png index 60b585405..c13c564bc 100644 Binary files a/images/addons/zwave.png and b/images/addons/zwave.png differ diff --git a/images/contribution_link.png b/images/contribution_link.png index 601b238c5..e8fa6c71b 100644 Binary files a/images/contribution_link.png and b/images/contribution_link.png differ diff --git a/images/dashboard.png b/images/dashboard.png index 3cb305394..af7526d3e 100644 Binary files a/images/dashboard.png and b/images/dashboard.png differ diff --git a/images/distro.png b/images/distro.png index ed1d1144d..5023865ab 100644 Binary files a/images/distro.png and b/images/distro.png differ diff --git a/images/logo.png b/images/logo.png index 6312a8c59..ae3f4de62 100644 Binary files a/images/logo.png and b/images/logo.png differ diff --git a/installation/CHANGELOG.md b/installation/CHANGELOG.md new file mode 100644 index 000000000..946aa34ff --- /dev/null +++ b/installation/CHANGELOG.md @@ -0,0 +1,169 @@ +## deCONZ / Phoscon companion app added ## May 10, 2021 +There's a new menu option to install the deCONZ software / Phoscon companion app +to support the popular Dresden Elektronik Conbee and Raspbee ZigBee controllers. +Note you will need to use the [deconz binding](https://www.openhab.org/addons/bindings/deconz/) +and pair your devices using the Phoscon web interface running on port 8081. + +## New `openhabian.conf` option `initialconfig` ## May 9, 2021 +This new option allows to automatically import an openHAB 3 backup from a file +or URL. + +## Removal of `master` branch ## May 6, 2021 +As now the `master` branch has been removed and will no longer work in any +installations, please use menu option 01 to switch the the `stable` branch if +you have a need for openHAB 2 support. Please note that the `stable` branch will +not receive regular updates anymore only targeted patches that are deemed +necessary by openHABian maintainers, to receive regular patches please migrate +to openHAB 3 using menu option 42. + +## Bintray shutdown ## May 3, 2021 +Bintray, the hosting service formerly used for the openHAB stable distribution, +has shutdown their service effective May 1st, 2021. As a result any APT +repositories using the Bintray service need to be replaced. For openHAB, we have +moved to using Artifactory as our hosting service, `openhabian-config` will ask +you on startup about automatically replacing the openHAB stable repository for +you. Check `/etc/apt/sources.list.d/*` afterwards for any other APT repositories +using Bintray as they will not be automatically replaced. + +## Future of master branch ## January 20, 2021 +We will no longer make regular updates to the master branch as we migrate away +from supporting openHAB 2. As such in the coming months we will make bug fixes +directly to the `stable` branch for openHA 2. With that said, please migrate off +of the `master` branch as it will be deleted soon. You can change branches at +any time using menu option 01. + + +## openHAB 3 released ## December 21, 2020 +In the darkest of times (midwinter for most of us), openHAB 3 was released. +See [documentation](openhabian.md#on-openhab-2-and-3) and +[www.openhab.org](https://www.openhab.org) for details. + +Merry Christmas and a healthy New Year! + + +## WiFi hotspot ## November 14, 2020 +Whenever your system has a WiFi interface that fails to initialize on +installation or startup, openHABian will now launch a +[WiFi hotspot](openhabian.md#WiFi-Hotspot) you can use to bootstrap WiFi i.e. to +connect your system to an existing WiFi network. + + +## openHAB 3 readiness ## October 28, 2020 +openHABian now provides menu options 4X to upgrade your system to openHAB3 and +to downgrade back to current openHAB 2 See [documentation](openhabian.md) for +details. Please be aware that openHAB3 as well as openHABian are not thoroughly +tested so be prepared to meet bugs and problems in the migration process as +well. Don't migrate your production system unless you're fully aware of the +consequences. + + +## Tailscale VPN network ## October 6, 2020 +Tailscale is a management toolset to establish a WireGuard based VPN between +multiple systems if you want to connect to openHAB(ian) instances outside your +LAN over Internet. It'll take care to detect and open ports when you and your +peers are located behind firewalls. Don't worry, for private use it's free of +charge. + + +## Offline installation ## October 1, 2020 +We now allow for deploying openHABian to destination networks without Internet +connectivity. While the optional components still require access to download, +the openHABian core is fully contained in the download image and can be +installed and run without Internet. This will also provide a failsafe +installation when any of the online sources for the tools we need to download is +unavailable for whatever reason. + + +## Auto-backup ## August 29, 2020 +openHABian can automatically take daily syncs of your internal SD card to +another card in an external port. This allows for fast swapping of cards to +reduce impact of a failed SD card. The remaining space on the external device +can also be used to setup openHABian's Amanda backup system. + + +## Wireguard VPN ## July 4, 2020 +Wireguard can be deployed to enable for VPN access to your openHABian box when +it's located in some remote location. +You need to install the Wireguard client from +to your local PC or mobile device that you want to use for access. +Copy the configuration file `/etc/wireguard/wg0-client.conf` from this box or +transmit QR code to load the tunnel. +Any feedback is highly appreciated on the forum. + + +### New Java providers now out of beta +Java 11 has been proven to work with openHAB 2.5. + + +## End support for PINE A64(+) and older Linux distributions ## June 17, 2020 +`openhabian-config` will now issue a warning if you start on unsupported +hardware or OS releases. See [README](../README.md) for supported HW and OS. + +In short, PINE A64 is no longer supported and OS releases other than the current +`stable` and the previous one are deprecated. Running on any of those may still +work or not. + +The current and previous Debian / Raspberry Pi OS (previously called Raspbian) +releases are 10 ("buster") and 9 ("stretch"). The most current Ubuntu LTS +releases are 20.04 ("focal") and 18.04 ("bionic"). + + +## New parameters in `openhabian.conf` ## June 10, 2020 +See `/etc/openhabian.conf` for a number of new parameters such as the useful +`debugmode`, a fake hardware mode, the option to disable ipv6 and the ability to +update from a custom repository other than the `master` and `stable` branches. + +In case you are not aware, there is a Debug Guide in the `docs/` directory. + + +### New Java options +Preparing for openHAB 3, new options for the JDK that runs openHAB are now +available: + +- Java Zulu 8 32-Bit OpenJDK (default on ARM based platforms) +- Java Zulu 8 64-Bit OpenJDK (default on x86 based platforms) +- Java Zulu 11 32-Bit OpenJDK +- Java Zulu 11 64-Bit OpenJDK +- AdoptOpenJDK 11 OpenJDK (potential replacement for Zulu) + +openHAB 3 will be Java 11 only. 2.5.X is supposed to work on both, Java 8 and +Java 11. Running the current openHAB 2.X on Java 11 however has not been tested +on a wide scale. Please be aware that there is a small number of known issues in +this: v1 bindings may or may not work. + +Please participate in beta testing to help create a smooth transition user +experience for all of us. + +See [announcement thread](https://community.openhab.org/t/Java-testdrive/99827) +on the community forum. + + +## Stable branch ## May 31, 2020 +Introducing a new versioning scheme to openHABian. Please welcome the `stable` +branch. + +Similar to openHAB where there's releases and snapshots, you will from now on be +using the stable branch. It's the equivalent of an openHAB release. We will keep +providing new changes to the master branch first as soon as we make them +available, just like we have been doing in the past. If you want to keep living +on the edge, want to make use of new features fast or volunteer to help a little +in advancing openHABian, you can choose to switch back to the master branch. +Anybody else will benefit from less frequent but well better tested updates to +happen to the stable branch in batches, whenever the poor daring people to use +`master` have reported their trust in these changes to work flawlessly. + +You can switch branches at any time using the menu option 01. + + +### Zram enabled by default +Swap, logs and persistence files are now put into zram per default. +See [zram status thread](https://community.openhab.org/t/zram-status/80996) for +more information. + + +### Supported hardware and Operating Systems +openHABian now fully supports all Raspberry Pi SBCs with our fast-start image. +As an add-on package, it is supposed to run on all Debian based OSs. + +Check the [README](../README.md) to see what "supported" actually means and what +you can do if you want to run on other HW or OS. diff --git a/installation/armbian.md b/installation/armbian.md index fd181f0ed..1f44573a5 100644 --- a/installation/armbian.md +++ b/installation/armbian.md @@ -3,8 +3,6 @@ layout: documentation title: Armbian --- -{% include base.html %} - # Armbian ## What is Armbian? @@ -23,13 +21,11 @@ Armbian is a base operating system platform for single board computers. OpenHab will run on any Armbian [supported hardware](https://www.armbian.com/download/?device_support=Supported) but it is recommended to choose boards that have at least: - - 512 Kb of memory (on minimal or server image) - eMMC or a [quality SD card](https://docs.armbian.com/User-Guide_Getting-Started/#how-to-prepare-a-sd-card) - 4 core - wired networking - ![Armbian](images/boards1.png) ## Supported images @@ -42,14 +38,14 @@ You can [download](https://www.armbian.com/download/?device_support=Supported) a 1. Prepare Armbian as usual - [login as root / 1234, change root password, create username. You don't need to perform any other steps](https://docs.armbian.com/User-Guide_Getting-Started/). -2. Update +1. Update ```shell sudo apt-get update sudo apt-get upgrade ``` -3. Run armbian-config +1. Run armbian-config ```shell sudo armbian-config diff --git a/installation/docker.md b/installation/docker.md index 7cb987332..daec44c8d 100644 --- a/installation/docker.md +++ b/installation/docker.md @@ -3,8 +3,6 @@ layout: documentation title: Docker --- -{% include base.html %} - # openHAB inside a Docker Container Docker is the most popular among a collection of tools that provide containerization. @@ -69,11 +67,8 @@ Note that the software running inside a Docker container cannot follow the symbo Make sure the `openhab` user owns these directories. ```bash -mkdir /opt/openhab -mkdir /opt/openhab/conf -mkdir /opt/openhab/userdata -mkdir /opt/openhab/addons -chown -R openhab:openhab /opt/openhab +sudo mkdir -p /opt/openhab/{conf,userdata,addons} +sudo chown -R openhab:openhab /opt/openhab ``` ### Running the Container as a Service Managed by Docker @@ -94,6 +89,7 @@ docker run \ -d \ -e USER_ID= \ -e GROUP_ID= \ + -e CRYPTO_POLICY=unlimited \ --restart=always \ openhab/openhab:- ``` @@ -122,7 +118,7 @@ To change the runtime parameters stop the container then execute the long comman Note, always review the README on [Docker Hub](https://hub.docker.com/r/openhab/openhab/) for the most up to date set of recommended arguments and environment variables. If running on a Systemd based Linux distro (Ubuntu 16.04 to be specific). -The following openhab2.service file will start a new openHAB container every time it starts the service and destroy that container when the service stops. +The following `openhab.service` file will start a new openHAB container every time it starts the service and destroy that container when the service stops. What that means is any data that you want to preserve between restarts of openHAB (e.g. configuration, databases, etc.) must be mounted from your host file system into the container. Creating a new container on every run greatly simplifies the upgrade and update process. @@ -146,6 +142,7 @@ ExecStart=/usr/bin/docker run --name=%n --net=host \ --device=/dev/ttyUSB0 \ -e USER_ID= \ -e GROUP_ID= \ + -e CRYPTO_POLICY=unlimited \ openhab/openhab:- ExecStop=/usr/bin/docker stop -t 2 %n ; /usr/bin/docker rm -f %n @@ -157,15 +154,16 @@ Where `` is the user ID number for the `openhab` user which you can obtain It is important that the ID number is passed in. The ID for the `openhab` user inside the container will not match the ID of the user on your host system and file permissions may be a bit odd (e.g. why does www-data own my openHAB config files?). -Place this openhab2.service file into `/etc/systemd/system`. +Place this `openhab.service` file into `/etc/systemd/system`. -Then run `sudo systemctl enable openhab2.service`. +Then run `sudo systemctl enable openhab.service`. -Finally run `sudo systemctl start openhab2.service` to start openHAB running. +Finally run `sudo systemctl start openhab.service` to start openHAB running. ## Explanation of Arguments Passed to Docker Note, always review the README on [Docker Hub](https://hub.docker.com/r/openhab/openhab/) for the most up to date set of recommended arguments and environment variables. + - `/usr/bin/docker run` : create a new container from the passed in Image (last argument) - `--name=openhab` : give the container a human remember able name - `--net=host` : by default Docker will place a container into its own network stack. However, openHAB requires UPnP discovery so this parameter makes the Docker container use the host's network stack. @@ -173,7 +171,7 @@ Note, always review the README on [Docker Hub](https://hub.docker.com/r/openhab/ - `-v /etc/timezone:/etc/timezone:ro` : ties the timezone of the container to the host's time zone, read only so the container cannot change the host's time zone - `-v /opt/openhab/conf:/openhab/conf` : location of the conf folder for openHAB configurations (*Note:* you must create these folders on the host before running the container) - `-v /opt/openhab/userdata:/openhab/userdata` : location for logs, cache, persistence databases, etc. -- `-v /opt/openhab/addons:/openhab/addons` : only needed if installing addons unavailable via PaperUI or the Karaf Console +- `-v /opt/openhab/addons:/openhab/addons` : only needed if installing addons unavailable via UI or the Karaf Console - `-v /opt/openhab/.java:/openhab/.java` : needed by the Nest 1.x binding (and others?), location of the security token - `--device=/dev/ttyUSB0` : location of my zwave controller, change and/or add more --device tags to pass all your devices needed by openHAB to the container - `--restart=always` : if the container crashes or the system reboots the container is restarted @@ -238,7 +236,6 @@ docker exec \ /bin/chmod o+rw /dev/ttyACM0 ``` - This command changes permissions of the specific device as expected (readable and writable for everyone). ::: tip Note diff --git a/installation/exim.md b/installation/exim.md new file mode 100644 index 000000000..9c4dc4d8d --- /dev/null +++ b/installation/exim.md @@ -0,0 +1,19 @@ +## Mail Transfer Agent configuration + +When you choose the "Mail Transfer Agent" install option in `openhabian-config` menu to install `exim4` as the mail transfer agent on your system, you will be presented with a number of questions on how to relay emails through a public service such as Google gmail. +In case you enter anything wrong you can re-initiate the installation process from the openHABian menu +Here's what you will need to enter: + +* Mail server type: mail sent by smarthost (received via SMTP or fetchmail) +* System mail name: FQDN (your full hostname including the domain part) +* IPs that should be allowed by the server: 127.0.0.1; ::1; 192.168.xxx.yyy (replace with your hosts's IP) +* Other destinations for which mail is accepted: ` . ` +* Machines to relay mail for: Leave empty +* IP address or host name of the outgoing smarthost: `smtp.gmail.com::587` +* Hide local mail name in outgoing mail: No +* Keep number of DNS-queries minimal: No +* Delivery method: Select: Maildir format in home directory +* Split configuration into small files: Yes +* List of smarthost(s) to use your account for: `*` +* Mail username of the public service to relay all outgoing mail to: + Your username for the mail relay service to use such as `my_id@gmail.com` diff --git a/installation/images/Accueil_Openhab_2.png b/installation/images/Accueil_Openhab_2.png index 4aa2c5083..a336ad79a 100644 Binary files a/installation/images/Accueil_Openhab_2.png and b/installation/images/Accueil_Openhab_2.png differ diff --git a/installation/images/Home_OH_adminCreate.png b/installation/images/Home_OH_adminCreate.png index 30c2bf259..8e2c2dbd9 100644 Binary files a/installation/images/Home_OH_adminCreate.png and b/installation/images/Home_OH_adminCreate.png differ diff --git a/installation/images/Home_Openhab_3.png b/installation/images/Home_Openhab_3.png index d8e8f7cea..b1b228a56 100644 Binary files a/installation/images/Home_Openhab_3.png and b/installation/images/Home_Openhab_3.png differ diff --git a/installation/images/Home_Openhab_4.png b/installation/images/Home_Openhab_4.png new file mode 100644 index 000000000..ca9deaeb3 Binary files /dev/null and b/installation/images/Home_Openhab_4.png differ diff --git a/installation/images/JAVA_HOME.png b/installation/images/JAVA_HOME.png index 01d7bcd8d..9531814af 100644 Binary files a/installation/images/JAVA_HOME.png and b/installation/images/JAVA_HOME.png differ diff --git a/installation/images/Karaf_Windows.png b/installation/images/Karaf_Windows.png index 1b6e60c8f..3347b93a9 100644 Binary files a/installation/images/Karaf_Windows.png and b/installation/images/Karaf_Windows.png differ diff --git a/installation/images/Wrapper_Start_Windows.png b/installation/images/Wrapper_Start_Windows.png index 5645e3546..c167ea6f0 100644 Binary files a/installation/images/Wrapper_Start_Windows.png and b/installation/images/Wrapper_Start_Windows.png differ diff --git a/installation/images/armbian-step1.png b/installation/images/armbian-step1.png index 2973aae62..7e3e55092 100644 Binary files a/installation/images/armbian-step1.png and b/installation/images/armbian-step1.png differ diff --git a/installation/images/armbian-step2.png b/installation/images/armbian-step2.png index 33b4ad788..628980b35 100644 Binary files a/installation/images/armbian-step2.png and b/installation/images/armbian-step2.png differ diff --git a/installation/images/armbian-step3.png b/installation/images/armbian-step3.png index 68f45809a..56650b816 100644 Binary files a/installation/images/armbian-step3.png and b/installation/images/armbian-step3.png differ diff --git a/installation/images/armbian-step4.png b/installation/images/armbian-step4.png index 4fbcf7ca3..164b5c038 100644 Binary files a/installation/images/armbian-step4.png and b/installation/images/armbian-step4.png differ diff --git a/installation/images/armbian-step5.png b/installation/images/armbian-step5.png index 4aa26ade8..d03fb0824 100644 Binary files a/installation/images/armbian-step5.png and b/installation/images/armbian-step5.png differ diff --git a/installation/images/boards1.png b/installation/images/boards1.png index 01fa4cf36..08a50ea00 100644 Binary files a/installation/images/boards1.png and b/installation/images/boards1.png differ diff --git a/installation/images/openHAB_Folders.png b/installation/images/openHAB_Folders.png index 8dd99f9f7..d5adc28f8 100644 Binary files a/installation/images/openHAB_Folders.png and b/installation/images/openHAB_Folders.png differ diff --git a/installation/images/openHABian-SSH-MotD.png b/installation/images/openHABian-SSH-MotD.png index 7060f29eb..eb5137d40 100644 Binary files a/installation/images/openHABian-SSH-MotD.png and b/installation/images/openHABian-SSH-MotD.png differ diff --git a/installation/images/openHABian-config.png b/installation/images/openHABian-config.png index af38dc362..c843f54c6 100644 Binary files a/installation/images/openHABian-config.png and b/installation/images/openHABian-config.png differ diff --git a/installation/images/openHABian-install-failed.png b/installation/images/openHABian-install-failed.png index 40cb4534f..2c9db9d72 100644 Binary files a/installation/images/openHABian-install-failed.png and b/installation/images/openHABian-install-failed.png differ diff --git a/installation/images/openHABian-install-log.png b/installation/images/openHABian-install-log.png index 8b5c79bb9..a3493ab77 100644 Binary files a/installation/images/openHABian-install-log.png and b/installation/images/openHABian-install-log.png differ diff --git a/installation/images/pine64.png b/installation/images/pine64.png index 359e63254..b892d14d5 100644 Binary files a/installation/images/pine64.png and b/installation/images/pine64.png differ diff --git a/installation/images/rpi2b.png b/installation/images/rpi2b.png index 71b0fee66..ef7cdf9b2 100644 Binary files a/installation/images/rpi2b.png and b/installation/images/rpi2b.png differ diff --git a/installation/index.md b/installation/index.md index e2ba4b783..36d7630cd 100644 --- a/installation/index.md +++ b/installation/index.md @@ -3,8 +3,6 @@ layout: documentation title: Installation Overview --- -{% include base.html %} - # Installation Overview openHAB is written completely in Java. @@ -17,10 +15,10 @@ Always keep this in mind when searching for help and solutions. ## Platform Recommendations -1. You are **new to openHAB** and want to give it a try? You are in luck: +1. You are **new to openHAB** and want to give it a try? You are in luck: - Set up openHAB on your local PC or Mac in just a few steps. -1. You've gained some experience and want to use openHAB to seriously control your home? +1. You've gained some experience and want to use openHAB to seriously control your home? Typical hardware and software requirements are: - **24/7 availability:** A dedicated system connected by Ethernet and running continuously. - **Energy and space efficient:** A device capable of performing the task at hand without being excessive for your needs. @@ -74,12 +72,12 @@ OpenJDK 64-Bit Server VM Zulu11.43+55-CA (build 11.0.9.1+1-LTS, mixed mode) Before you can start, two decisions have to be made: -1. openHAB is available as a platform independent archive file or through a package repository: +1. openHAB is available as a platform independent archive file or through a package repository: - **Manual setup:** Download and extract a platform independent zip archive: [macOS](macos.html), [Windows](windows.html), [Linux](linux.html#manual-installation) - **Package setup:** Install from a package repository, using a package manager such as apt or yum. This option is only available for certain Linux distributions such as Debian or Ubuntu derivatives, but allows you to take advantage of automatic updates and is the recommended choice: [Linux (apt/deb)](linux.html#package-repository-installation) -2. Stable release or cutting edge: +1. Stable release or cutting edge: - **Stable:** Use the latest official release [hosted on Bintray](https://bintray.com/openhab/mvn/openhab-distro) (recommended for new users). - **Snapshot:** Benefit from the latest changes in the daily created snapshot ([hosted on openhab.org](https://ci.openhab.org/)). @@ -87,13 +85,42 @@ Before you can start, two decisions have to be made: Please follow the instructions in the installation article matching your platform (see the menu to the left). +### Getting installation info + +For many actions you need to know the pathes where openHAB checks for files, or where you need to install additional packages. +To find out where these locations are, e.g. where `$OPENHAB_CONF` points to, use the [console](https://www.openhab.org/docs/administration/console.html): + +```shell +openhab-cli info +``` + +will result in e.g. for an [openHABian](https://www.openhab.org/docs/installation/openhabian.html) installation + +```shell +Version: 3.0.0 (Build) + +User: openhab (Active Process 7466) +User Groups: openhab tty dialout audio bluetooth gpio + +Directories: Folder Name | Path | User:Group + ----------- | ---- | ---------- + OPENHAB_HOME | /usr/share/openhab | openhab:openhab + OPENHAB_RUNTIME | /usr/share/openhab/runtime | openhab:openhab + OPENHAB_USERDATA | /var/lib/openhab | openhab:openhab + OPENHAB_CONF | /etc/openhab | openhab:openhab + OPENHAB_LOGDIR | /var/log/openhab | openhab:openhab + +URLs: http://169.254.63.209:8080 + https://169.254.63.209:8443 +``` + ## Additional Steps After you get openHAB set up and running, there are a few additional setup steps you should consider: -- Configure a network share on your openHAB host system using [Linux Samba Share](linux.html#network-sharing) for easier remote editing of configuration files. +- Configure a network share on your openHAB host system using [Linux Samba Share](linux.html#network-sharing) for easier remote editing of configuration files. -- Install [Visual Studio Code](https://code.visualstudio.com/Download) and the [openHAB VS Code Extension]({{base}}/configuration/editors.html#openhab-vs-code-extension) on your local machine, to manage your (remote) configuration files. +- Install [Visual Studio Code](https://code.visualstudio.com/Download) and the [openHAB VS Code Extension]({{base}}/configuration/editors.html#openhab-vs-code-extension) on your local machine, to manage your (remote) configuration files. The openHAB VS Code Extension comes with built-in support for the openHAB syntax and elements. ## Getting started diff --git a/installation/linux.md b/installation/linux.md index 6d2788614..5a79954b8 100644 --- a/installation/linux.md +++ b/installation/linux.md @@ -3,8 +3,6 @@ layout: documentation title: openHAB on Linux --- -{% include base.html %} - # openHAB on Linux The following instructions will guide you through the process of setting up openHAB and recommended packages for both .DEB (Ubuntu, Debian etc.) and .RPM (RedHat, CentOS, Fedora etc.) Linux systems. @@ -27,7 +25,8 @@ Linux file permissions is one of the biggest sources of issues, Linux novices ru If you find yourself in a situation, where you have **no write access** to the openHAB configuration or system files wrong permissions and/or the incorrect use of `sudo` are often the cause. Train your understanding of Linux permissions at [linuxjourney.com/lesson/file-permissions](https://linuxjourney.com/lesson/file-permissions). -## Meeting the Requirements: ## +## Meeting the Requirements + As a first step, please verify, that your system meets the [prerequisites](index.html#prerequisites). You may want to install Zulu, a fully certified Java build [as a package or manually](https://docs.azul.com/zulu/zuludocs/ZuluUserGuide/InstallingZulu/InstallZulu.htm). @@ -43,9 +42,10 @@ Make sure to download Zulu or Java **11**. ## Installation openHAB can be installed through - - the openHABian project **(easiest method, ships with the openHABian configuration tool)** - - a package repository (apt, yum) - - manually from file. + +- the openHABian project **(easiest method, ships with the openHABian configuration tool)** +- a package repository (apt, yum) +- manually from file. The installation through the **openHABian project** and the use of the provided openHABian configuration tool is recommended for end users. @@ -54,6 +54,7 @@ Installing using the provided **package repository** (using `apt`, `apt-get`, `y The manual installation through a platform independent archive file is suited for users who know what they are doing. ### openHABian project + The easy step by step instruction can be found [here](openhabian.html). ### Package Repository Installation @@ -68,26 +69,26 @@ Alternatively resort to the [manual installation approach](#manual-installation) {% include collapsible/body.html %} -First, add the openHAB Bintray repository key to your package manager and allow Apt to use the HTTPS Protocol: +First, add the openHAB repository key to your package manager and allow Apt to use the HTTPS Protocol: ```shell -wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add - +wget -qO - 'https://openhab.jfrog.io/artifactory/api/gpg/key/public' | sudo apt-key add - sudo apt-get install apt-transport-https ``` Then, you can choose between, *Official (Stable)*, *Beta* or *Snapshot* builds: -- **Stable Release** +- **Stable Release** The stable builds contain the latest official release with tested features. Add the **openHAB Stable Repository** to your systems apt sources list: ```shell - echo 'deb https://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab.list + echo 'deb https://openhab.jfrog.io/artifactory/openhab-linuxpkg stable main' | sudo tee /etc/apt/sources.list.d/openhab.list ``` -- **Testing Release** +- **Testing Release** The beta and release candidate builds come out less frequently, but will contain new features that are currently in the testing phase. @@ -97,7 +98,7 @@ Then, you can choose between, *Official (Stable)*, *Beta* or *Snapshot* builds: echo 'deb https://openhab.jfrog.io/artifactory/openhab-linuxpkg testing main' | sudo tee /etc/apt/sources.list.d/openhab.list ``` -- **Snapshot Release** +- **Snapshot Release** The snapshot build is created [almost daily](https://ci.openhab.org/job/openhab-linuxpkg/), and include the latest changes to the openHAB core and add-ons. These changes are often unstable, so you should use this branch only for testing or development purposes. @@ -138,20 +139,20 @@ sudo apt-get install openhab-addons The RPM repo information should be defined inside a file, make a new file at `/etc/yum.repos.d/openhab.repo` with the following contents depending on your choice of release. You may add all three to the same file, but make sure the desired repo is is set to `enabled=1`: -- **Stable Release** +- **Stable Release** The stable builds contain the latest official release with tested features. ```text [openHAB-Stable] name=openHAB Stable - baseurl=https://dl.bintray.com/openhab/rpm-repo2/stable + baseurl=https://openhab.jfrog.io/artifactory/openhab-linuxpkg-rpm/stable gpgcheck=1 - gpgkey=https://bintray.com/user/downloadSubjectPublicKey?username=openhab + gpgkey="https://openhab.jfrog.io/artifactory/api/gpg/key/public" enabled=1 ``` -- **Testing Release** +- **Testing Release** The beta or release candidate builds come out less frequently, but will contain new features that are currently in the testing phase. @@ -164,7 +165,7 @@ You may add all three to the same file, but make sure the desired repo is is set enabled=1 ``` -- **Snapshot Release** +- **Snapshot Release** The snapshot build is created [almost daily](https://ci.openhab.org/job/openhab-linuxpkg/), and include the latest changes to the openHAB core and add-ons. These changes are often unstable, so you should use this branch only for testing or development purposes. @@ -260,8 +261,8 @@ sudo systemctl enable openhab.service The first start may take **up to 15 minutes**, this is a good time to reward yourself with hot coffee or a freshly brewed tea! -You should be able to reach the openHAB Dashboard at [http://openhab-device:8080]() at this point. -If you're new to openHAB, then you should checkout the [beginner's tutorial]({{base}}/tutorials/beginner/1sttimesetup.html)! +You should be able to reach the openHAB Dashboard at `http://openhab-device:8080` at this point. +If you're new to openHAB, then you should checkout the [beginner's tutorial]({{base}}/tutorial/first_steps.html)! ![The openHAB Dashboard page](images/Home_Openhab_3.png) @@ -450,22 +451,22 @@ We are going to download a platform independent archive file and extract it to t Choose between the latest Beta release or a Snapshot with all incoming contributions, created daily. As openHAB is still in an evolving state, the snapshot may be the **preferred choice**. -- **Official Release** +- **Official Release** Download and extract the latest offical stable version of openHAB from [our downloadpage](https://www.openhab.org/download/) to your host: ```shell cd /tmp - wget -O openhab-download.zip https://bintray.com/... # Insert download link here + wget -O openhab-download.zip https://www.openhab.org/download/releases... # Insert download link here sudo unzip openhab-download.zip -d /opt/openhab rm openhab-download.zip ``` -- **Beta/RC Release** +- **Beta/RC Release** If available, beta or release candidate builds of openHAB can also be downloaded from [our downloadpage](https://www.openhab.org/download/) and extracted to your host as shown above. -- **Snapshot Release** +- **Snapshot Release** Download and extract the latest snapshot version of openHAB from [our downloadpage](https://www.openhab.org/download/) to your host. The process is analogue to above. @@ -477,7 +478,7 @@ sudo chown -hR openhab:openhab /opt/openhab ``` Everything is ready for a first test run. -**Execute** openHAB and you should be able to reach the openHAB Dashboard at [http://openhab-device:8080]() after a few minutes: +**Execute** openHAB and you should be able to reach the openHAB Dashboard at `http://openhab-device:8080` after a few minutes: ```shell # execute as restricted user openhab: @@ -563,7 +564,7 @@ This is especially important if you are working with the latest snapshot as chan openHAB uses a script to update to any other version, or from stable to snapshot and visa-versa. Your personal configuration will be retained on upgrades, but you should **stop openHAB** and perform a backup first. -- **Versions 2.1.0 and Above** +- **Versions 2.1.0 and Above** From version 2.1.0, openHAB is distributed with the update script included. This script should be called from within openHAB's root directory. @@ -587,14 +588,14 @@ Your personal configuration will be retained on upgrades, but you should **stop sudo runtime/bin/update 2.2.0-SNAPSHOT ``` -- **Older Versions** +- **Older Versions** If you're using a version earlier than 2.1.0, then you can use the following commands in Terminal to download the script and run it. Assuming the openHAB directory is in `/opt/openhab`: ```bash cd /opt/openhab - sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/openhab/openhab-distro/master/distributions/openhab/src/main/resources/bin/update)" -- 2.1.0 + sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/openhab/openhab-distro/main/distributions/openhab/src/main/resources/bin/update)" -- 2.1.0 ``` #### Uninstall @@ -625,7 +626,7 @@ sudo systemctl daemon-reload ## Backup and Restore It is recommended to make a backup of your configuration before *any* major change. -To make a backup of openHAB2, you need to retain your configuration and userdata files. +To make a backup of openHAB 2 or higher, you need to retain your configuration and userdata files. openHAB comes with scripts for storing your configuration in a zip file which is saved in `/var/lib/openhab/backups` for automatic installs and `openhab/backups` for manual installs. You can change the default path by setting the $OPENHAB_BACKUPS environment variable. @@ -732,7 +733,7 @@ Next, add the desired share configurations to the end of the file: -- Package repository based installation: +- Package repository based installation: ```ini [openHAB-userdata] @@ -766,7 +767,7 @@ Next, add the desired share configurations to the end of the file: directory mask=0777 ``` -- Manual installation: +- Manual installation: ```ini [openHAB-files] diff --git a/installation/macos.md b/installation/macos.md index 1d38db3fb..822eeadbc 100644 --- a/installation/macos.md +++ b/installation/macos.md @@ -3,8 +3,6 @@ layout: documentation title: macOS --- -{% include base.html %} - # Installation on macOS This page is structured as follows: @@ -22,19 +20,21 @@ If you're unfamiliar with using the macOS terminal, then feel free to follow the openHAB is packaged as a platform independent `zip` archive. Installation is as simple as unziping it into a unique folder. First, make sure that your system meets the [prerequisites](index.html#prerequisites). +When you are running macOS BigSur or higher, make sure +that you select the right platform depending on your hardware (x86 or ARM 64-bit). You have the choice to use the current stable version or the latest snapshot build: -- **Stable** +- **Stable** The stable builds have undergone testing, it is the recommended version to download. - Download the latest `openhab-2.x.x.zip` [here](https://www.openhab.org/download/). + Download the latest `openhab-3.x.x.zip` [here](https://www.openhab.org/download/). -- **Snapshot (Unstable)** +- **Snapshot (Unstable)** Snapshots are built daily, and contain the latest changes to openHAB's source code. These changes haven't undergone the same amount of testing as the stable releases, so only use them if you **need** a new feature. - Download the latest `openhab-2.x.x-SNAPSHOT.zip` [here](https://www.openhab.org/download/). + Download the latest `openhab-3.x.x-SNAPSHOT.zip` [here](https://www.openhab.org/download/). The following instructions are performed in a terminal window. At first launch of the terminal, you will be inside your home directory. @@ -50,7 +50,7 @@ Next, unzip the file downloaded earlier. Assuming that you have downloaded the **stable** build to your download folder, the command will be: ```shell -unzip ~/Downloads/openhab-2.x.x.zip -d . +unzip ~/Downloads/openhab-3.x.x.zip -d . ``` Check that the zip extraction was successful by using the `ls` command in order to check the contents of the folder. @@ -73,28 +73,27 @@ From inside openHAB's root directory (e.g. `~/openhab/), run openHAB's startup s The first run may take a while to process, wait until the "`openhab>`" prompt appears, for example: -```shell_session -user:openhab $ sudo ./start.sh +```shell +$ ./start.sh Launching the openHAB runtime... - __ _____ ____ - ____ ____ ___ ____ / / / / | / __ ) - / __ \/ __ \/ _ \/ __ \/ /_/ / /| | / __ | -/ /_/ / /_/ / __/ / / / __ / ___ |/ /_/ / -\____/ .___/\___/_/ /_/_/ /_/_/ |_/_____/ - /_/ 2.0.0 ... + _ _ _ ____ + ___ ___ ___ ___ | | | | / \ | __ ) + / _ \ / _ \ / _ \ / _ \ | |_| | / _ \ | _ \ + | (_) | (_) | __/| | | || _ | / ___ \ | |_) ) + \___/| __/ \___/|_| |_||_| |_|/_/ \_\|____/ + |_| 3.0.0 - Release Build - -Hit '' for a list of available commands +Use '' for a list of available commands and '[cmd] --help' for help on a specific command. -Hit '' or type 'system:shutdown' or 'logout' to shutdown openHAB. +To exit, use '' or 'logout'. + openhab> ``` -Without closing the terminal, open your favorite web browser and type the following URL: [http://localhost:8080](http://localhost:8080), you should see the openHAB welcome screen, and you're all set to [using openHAB]({{base}}/tutorials/beginner/1sttimesetup.html). - -![](images/Accueil_Openhab_2.png) +Without closing the terminal, open your favorite web browser and type the following URL: `http://localhost:8080`, you should see the openHAB welcome screen, and you're all set to [using openHAB]({{base}}/tutorial/first_steps.html). +If you installed openHAB on a different device, replace localhost with the IP address of the device. ## Updating openHAB @@ -111,17 +110,18 @@ cd ~/openhab sudo runtime/bin/update ``` -You can also specify any version as a parameter. For example, to switch back to 2.0.0: +You can also specify any version as a parameter. +For example, to switch back to 2.5.11: ```shell -sudo runtime/bin/update 2.0.0 +sudo runtime/bin/update 2.5.11 ``` You may also change to openHAB's more frequent, but less stable snapshot builds. Just append "-SNAPSHOT" to the target version, e.g.: ```shell -sudo runtime/bin/update 2.2.0-SNAPSHOT +sudo runtime/bin/update 2.5.12-SNAPSHOT ``` ### Older Versions @@ -131,14 +131,14 @@ Assuming the openHAB directory is in `~/openhab` simply run the following comman ```shell cd ~/openhab -sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/openhab/openhab-distro/master/distributions/openhab/src/main/resources/bin/update)" -- 2.1.0 +sudo sh -c "$(curl -fsSL https://raw.githubusercontent.com/openhab/openhab-distro/main/distributions/openhab/src/main/resources/bin/update)" -- 2.1.0 ``` ## Backup and Restore To make a backup of your openHAB system, you need to retain your configuration and userdata files. As of version 2.2.0, you can use openHAB's scripts for storing your configuration in a zip file. From the terminal: -By default, the script saves the zip file in `/var/lib/openhab2/backups` for automatic installs and `openhab2/backups` for manual installs. +By default, the script saves the zip file in `/var/lib/openhab/backups` for automatic installs and `openhab/backups` for manual installs. You can change the default path by setting the $OPENHAB_BACKUPS environment variable. ```shell diff --git a/installation/openhabian-DEBUG.md b/installation/openhabian-DEBUG.md new file mode 100644 index 000000000..48e255293 --- /dev/null +++ b/installation/openhabian-DEBUG.md @@ -0,0 +1,142 @@ +--- +layout: documentation +title: openHABian +source: https://github.com/openhab/openhabian/blob/main/docs/openhabian-DEBUG.md +--- + + + +This document is meant to give a guiding hand to users when their openHABian install fails either on initial image installation or later on when running menu options that install or configure optional components. + +::: tip [TLDR](https://www.howtogeek.com/435266/what-does-tldr-mean-and-how-do-you-use-it/) +Set `debugmode=maximum`in `/etc/openhabian.conf` and see `/boot/first-boot.log` for image installation else record the terminal output. +::: + +**Do not ask for help on the forum unless you have _FULLY_ read this guide.** + +**Attention:** +If you do not use the image but use `openhabian-config` manually - either to run `openhabian-config unattended` or interactive use -, **there is no logfile**. +To record output in this case, you need to configure your terminal client to record and save the command line output. +In PuTTy there's a field called 'Lines of scrollback' under the 'Window' option in settings that you should increase to at least some thousand lines else you might not capture everything you need to. +Configure any other terminal client likewise. + +Keep in mind that parts of the following information such as for example WiFi and IPv6 setup don't apply to manually installed systems because they happen at or before boot time. + +## Prerequisites +First, please make sure you use the proper host hardware that is supported as per [README](https://github.com/openhab/openhabian/blob/main/README.md). + +openHABian requires a minimum of 1GB of RAM to run well. While you can get away with a 512MB box like a RPi0W, you must not run anything other than openHAB itself, in particular do **not** run memory hogs such as InfluxDB or Grafana. + +openHABian requires you to provide direct Internet access. +Using private IP addresses is fine as long as your router properly provides NAT (Network Address Translation) services. +Either Ethernet or WiFi is supported at install time, however, Ethernet tends to be more reliable and WiFi requires user configuration prior to the first boot of openHABian. +To configure WiFi, simply edit the `wifi_password=` and `wifi_ssid=` fields in the `boot/openhabian.conf` file on your new SD card. + +Your router (or a different device) needs to to provide properly configured DHCP services so your openHABian box gets an IP address assigned when you boot it for the first time. +The DHCP server also has to announce which DNS resolver to use so your box knows how to translate DNS names into IP addresses. +It also needs to announce which IP address to use as the default gateway to the internet - a typical access router is also the DHCP server will announce it's own address here. +Finally, the DHCP server should also announce the NTP server(s) to use for proper time services. +Lack thereof will not break the installation procedure but can lead to all sorts of long term issues so we recommend to setup DHCP to announce a reachable and working NTP server. + +A note on IPv6: openHABian was reported failing to boot in some environments that make use of IPv6. +If basic IP initialization fails (you cannot `ping` your box) or installation gets stuck trying to download software packages, you might want to try disabling IPv6. +You can also do that before the very first install attempt if you're sure you don't need any IPv6 connectivity on your openHABian box. +See [this section of openhabian.md](https://github.com/openhab/openhabian/blob/main/docs/openhabian.md#ipv6-notes) how to disable IPv6 on your system. +Note that this is just a summary to cover the most commonly encountered cases. +The full boot procedure and how to obtain IP addresses, DNS resolver, default route and NTP server addresses are highly complex and widely customizable and a comprehensive description on how to properly configure your Internet access and router are out of scope of openHABian. +Please use an internet search to find more on your own. + +## Install +Proceed to installation: Etch-Burn-d(isk)d(ump)-Flash-whatever the image to an SD card. + +NOW, read [openhabian.md](https://github.com/openhab/openhabian/blob/main/docs/openhabian.md#openhabianconf)how to mount your SD card and how to modify the openHABian config file. +Some parameters are self-explanatory but please nonetheless read the full explanation in the linked document. +Given that you're already reading the debug guide, the most important parameter to set is likely `debugmode=maximum`. +Once you have passed the first time boot initialization phase and you can login to the system, `/etc/openhabian.conf` will be used from there on. +You can change it at any time to get output on future boot runs or if you use `openhabian-config` interactively. + +_At this stage, read the first paragraph on the logfile and interactive use again._ +To see debug output during the image installation process, you need to use the procedure from your PC **before** you power your box on. + +If you have a console available (monitor and keyboard), attach it to follow the install process. +Now insert the SD card and turn on your system. +If you don't have any console, try to access the web console at `http://:80/`. +It will display the contents of `/boot/first-log.boot` at intervals of some seconds while installing. +Mind you that if installation fails, network access may or may not be possible so you might need to access the box via console anyway in order to find out what went wrong. + +Login to your box via network using `ssh openhabian@`. +The default hostname is `openhabian`, and the default username and password both are `openhabian` unless you changed either of these in `openhabian.conf` before you started the installation run. +If that step fails, try to `ping openhabian`. +If that's failing, find out the system's IP address (usually by looking at your router's running configuration or using the command `arp -a` which is available on either Windows or Linux). +If you can login, there probably is an issue with your DHCP server. +If you cannot ping the system's IP address, try to login on the console. +In this case you will have to resort to debug the network setup which is beyond the scope of this document. +There's nothing specific about networking though - openHABian just uses the setup of the underlying OS, Raspi OS for RPis that is or whatever OS you chose to manually install upon. +So again, use an internet search to find more on your own. + +Once logged in, enter `sudo bash` to become the root user. +Check if your install fails at some stage (also if it seems to hang forever): there will exist a file either `/opt/openHABian-install-failed` or `/opt/openHABian-install-inprogress` to reflect these states (to check, `ls -l /opt/openHABian-install*`). +As a first troubleshooting step, you should reboot your box to see if the same problems occurs on a second attempt. + +## Debug +If the problem persists after booting succeeded at least in principle, login and check `/boot/first-boot.log` to get an indication what went wrong in the install process. +You can avoid openHABian to start reinstalling on future reboots by removing the status file, i.e. `rm -f /opt/openHABian-install*`, **but** be aware that your installation is incomplete and that you should not run openHAB on a box in that state. +You can use this state to debug, you can also use the menu options in `openhabian-config` to manually install everything that failed or is missing. +See `/opt/openhabian/openhabian-setup.sh` and the corresponding code in `/opt/openhabian/functions/*.bash` what usually gets installed on an unattended installation. +Note that if you keep or recreate the status file (just `touch /opt/openhabian-install-failed`), you can reboot at any time to continue unattended installation. +So if say Java install fails (Java being a prerequisite to installation of openHAB), you can use `openhabian-config` or manual install, then continue installation by rebooting. +Should you succeed at some point in time - great! Let us know what you did to make it work please through a Github issue (see below). +As we cannot be sure everything on your box is 100% the same what an unattended install gets you, please also do a complete reinstall before you start operating openHAB. +If possible start with the flash step. +If that does not work, at least delete all the packages that openhabian-setup had installed before you reboot. +Use `apt purge` (and not just `apt remove`). + +### Create a debug log +You can put openHABian into a more verbose debug level **at any time** after the very first installation run: edit the config file `/etc/openhabian.conf` using the editor of your choice (use `nano` if you have no idea) and change the `debugmode` parameter to either `on` or `maximum` right away (default is `off`). +Specifying `maximum` is usually your best choice as it will have `openhabian-config` show every single command it executes so you might spot the problem right away. +If you open an issue, always provide the maintainers with a logfile at `maximum` detail level. + +Your next boot run will also exhibit much more verbose logging. +Remember boot time output will be appended to `/boot/first-boot.log`. +If installation still fails to finish, please retrieve that file from your box, open a GitHub issue (see next paragraph), thoroughly describe the environment conditions and your findings so far and upload the log. + +### How to open a Github issue +While written for openHAB, the guideline at also applies to openHABian issues. +Please proceed as told there. +openHABian has its own repository at . +Search the issues listed there first if 'your' problem has already been seen and eventually opened as an issue by someone else (you should remove the `is:open` filter from the search bar to let you see closed issues). +If so, you may leave a "me too" comment there but please do not open another issue to avoid duplicates. +You can reference other issues (eventually also request to reopen closed ones) and Pull Requests by their number (just type #XXX along with your text, GitHub will insert the proper link). +If you open an issue, we kindly ask you to deliver as much information as possible. +It is awkward and annoying if we need to spend time asking and asking what the real problem is about. +Please avoid that situation, be proactive and tell us in the first place. +Once you opened the issue, copy `/boot/first-boot.log` from your openHABian box over to your desktop and upload it to GitHub. +If you succeed logging on and get to see a banner with system information, please also copy that as part of your issue. + +If you're able to help in producing a fix to problems, we happily take any Pull Request. +Explaining git and Github unfortunately is out of our scope (the internet is your friend). +See the guidelines outlined in [CONTRIBUTING.md](https://github.com/openhab/openhabian/blob/main/CONTRIBUTING.md) as well. +For simple fixes to a single file only, you can click through the source starting at and edit the file online, GitHub will then offer to create the PR. +You can also clone the openHABian repository, make your changes locally and use git to check in your changes and upload them to a repo copy of yours, then follow the git-offered link to create the PR. + +## Checkpoint +Remember to always let `openhabian-config` update itself on start. + +If you want to change anything to work around some not yet fixed bug, you can directly edit the files in and below `/opt/openhabian` on your box. +Just do not let `openhabian-config` update itself on start as that would overwrite your changes. +You can also clone (download) a different openHABian version than the most current one, e.g. if a maintainer or contributor to openHABian offers or asks you to test-drive a development version. +Set the `clonebranch` parameter in `/etc/openhabian.conf` to the branch name to load, then update `openhabian-config` on start. +**Note**: You must not modify `repositoryurl` to point elsewhere than the official repo. +openHABian will only ever update from there so you can only test drive a test branch that a developer has provided you on the official site. + +The main program is in `openhabian-setup.sh`. +If the initial unattended install fails again and again at the same step (say Java installation), you may try to comment that step out. +But mind the code in `build-image/first-boot.bash` towards the end starting with `git clone`. +This is where openHABian updates itself. +If you don't comment that out as well, it'll overwrite your changes on the next install run. + +## Disclaimer +For obvious reasons, changing openHABian code is not a supported procedure. +We just want to give you a hint what you _could_ try doing if your install fails and you're sitting there, desperately looking for a fix. +Search the internet and learn for yourself how to edit a file, learn to understand shell programming basics, you're on your own here. +If you change openHABian code on your box, remember for the time it takes to get openHABian officially fixed, you must not let `openhabian-config` update itself on start as that would overwrite your changes. diff --git a/installation/openhabian-amanda.md b/installation/openhabian-amanda.md new file mode 100644 index 000000000..2f27ee5ab --- /dev/null +++ b/installation/openhabian-amanda.md @@ -0,0 +1,616 @@ +# How to backup your openHABian server using Amanda + +## The need for recovery + +First, make yourself aware how important a comprehensive backup and recovery concept is. +Yes, this text is the README on the backup software part for openHABian that you're reading, but take a couple of minutes to read and think about recovery in a generic sense first. +This might avoid a LOT of frustration. + +So you have your smart home working thanks to openHAB(ian).... but what if a component of your system fails? +First thing is: you need spare hardware of EVERY component that needs to work for your smart home to work. +Think of EVERY relevant component and not just the obvious ones. +Think of your Internet router, switch, server, NAS and required addons such as a ZWave or 433MHz radio or WiFi USB stick, proper power supplies and the SD card writer. + +Now think of a recovery concept for each of these components: what do you have to do if it fails? +If the SD card in your RPi fails because of SD corruption (a very common problem), you need to have a PREinstalled, at least somewhat current clone SD card that contains all your current OS packages, including all helper programs you might be using (such as say mosquitto or any scripts you might have installed yourself), and your matching CURRENT openHAB config, and more. +If you believe "in case of SD card crash, I'll simply reinstall my server from scratch", then think first! +How long will that take you? +Are you even capable of doing that? +Will the latest version of openHABian/Linux packages be guaranteed to work with each other and with your hardware? +Do you REALLY remember all the parts and places of your system where you configured something related to your server/home network and smart home? +If you're honest to yourself, the answer will often be **NO**. +Yes, you can get your smart home back up working somehow, but it will take several hours, and it will not be a complete restoration of all features and setups you used to have in operation before the crash. + +**A specific word of WARNING:** +If you run a ZWave network like many openHAB users do, think what you need to do if the controller breaks and you need to replace it. +A new controller has a different Home ID, so all of your devices will not talk to it unless you re-include all of them (and to physically access devices in quite a number of cases means you need to open your walls!!). +Even if you have easy access, it can take many hours, even more so if it's dark and your ... no I'm **NOT** joking, and I'm not overdoing things. +This is what happened to several people, and it can happen to you, too. +We have seen people be so frustrated that they gave up on openHAB or smart home altogether because of this. +For RaZberry/zwave.me USB stick, you can run the Z-Way software to backup and restore the ZWave network data including the controller. +For the Aeon Gen5 stick, there's a Windows tool available for download. + +**NOTE: you will face the same type of problem if you run a gateway unit to control commercial systems such as a HomeMatic CCU or Insteon controller.** + +Remember Murphy's law: When your system fails and you need to restore your system for the first time, you'll notice your backup is broken. +So dive into and ensure you have a working restore procedure and don't just believe it'll work BUT TEST IT, and repeat every now and then. + +### SD card issues + +The most common setup for a openHAB smart home server is to run a Raspberry Pi off its internal SD card, so we provide a backup concept for that one. +But it will also work on most other SBCs (single board computers) and modified configurations (such as if you moved your OS or parts thereof). +Pay special attention to SD card size: different models slightly differ in size. +Any replacement gear must have _at least_ the size of the original card so best is to get two identical cards right in the first place. +If you don't, ensure at least you use the smaller one as your main and the larger one as the replacement card. + +**Another word of WARNING:** +Moving your system off the internal SD card does NOT solve SD corruption problems or increase reliability in any other way. +SD cards and USB sticks use the same technology, and SSDs / HDDs still can get corrupted as well, and they can crash, too. +You may or may not want to use Internet / cloud services for various reasons (privacy, bandwidth, cost), so we provide you with one solution that is designed to run on local hardware only. +We provide a config to use a directory as the backup destination. +This can be a directory mounted from your NAS (if you have one), a USB-attached storage stick, hard drive, or other device. +We also provide a config to store your most important data on Amazon Web Services if you are not afraid of that. +We believe this will cover most openHAB backup use cases. +NOTE: don't use CIFS (Windows sharing). +If you have a NAS, use NFS instead. +It does not work with CIFS because of issues with symlinks, and it doesn't make sense to use a Windows protocol to share a disk from a UNIX server (all NAS) to a UNIX client (openHABian) at all. +If you don't have a NAS, DON'T use your Windows box as the storage server. +Attach a USB stick to your Pi instead for storage. +There's many more possible configurations, the software is very flexible and you can tailor it to your own needs if those offers do not match your needs. +You could even use it to backup all of your servers (if any) and desktop PCs, including Windows machines. +Either way, it's not one-or-the-other, you can run multiple configs in parallel. +But in any case, you will need to have a clone SD card with your CURRENT config. + +Now all that being said, let's turn to what what you're here for: how to accomplish the software side of backup and restoration. + +## Some Amanda background + +Best is to read up on and understand some of the basic Amanda concepts over at . +That's not a mandatory step but it will probably help you understand a couple of things better. +The world of UNIX and backup IS complex and in the end, there's no way to fully hide that from a user. +Here's a couple of those concepts, but this is not a comprehensive list. +I cannot understand the system for you, that's something you have to accomplish on your own. +Read and understand the Amanda docs. + +* It's helpful to know that Amanda was originally built to use magnetic tape changer libraries as backup storage in professional data center installations. + It can operate multiple tape drives in parallel, and the tapes used to be commonly stored in what's called a 'slot' inside the tape library cabinet. +* The default dumpcycle for an openHABian installation is 2 weeks. + Amanda will run a 'level 0' dump (that means to backup EVERYTHING) once in a dumpcycle and will run 'level 1' dumps for the rest of the time (that means to only backup files that have CHANGED since the last level 0 dump was done, also called an 'incremental' backup). + Amanda will combine level 0 of some devices with level 1 or 2 of others, aiming to have the more or less same amount of data to be backed up every day (every invocation, actually). + No, you cannot have it do level 0 on weekends and level 1 else, [see FAQ](https://wiki.zmanda.com/index.php/FAQ:How_do_I_make_Amanda_do_full_backups_on_weekends_and_incrementals_during_the_week%3F). +* Note for _raw_ devices to backup such as `/dev/mmcblk0` (which is the internal SD card reader of a RPi), nothing but a level 0 dump will work because there is no efficient way to determine what has been changed since the last full dump. + So if you include `/dev/mmcblk0` in your disklist, it'll be backed up on EACH run. + If you don't want that (as it'll likely consume the by far largest part of your backup run time and capacity) then remove it from the disklist. + You can create a second Amanda configuration to only include that raw device and run it say just once every month. + Essentially you need to create a copy of the /etc/amanda.conf/openhab-dir directory and contents, but a full explanation is out of scope for these docs. +* Typically, for a backup system to use this methodology, you need the amount of storage to be 2-3 times as large as the amount of data to be backed up. + The number of tapes and their capacity (both of which are sort of artificially set when you store to a filesystem) determines how long your storage capacity will last until Amanda starts to overwrite old backups. + By asking you to enter the total size of the storage area, the Amanda installation routine will compute the maximum amount of data that Amanda will store into each tape subdirectory as (storage size) divided by (number of tapes, 15 by default). + The ability to backup to a directory was added later, but the 'slot', 'drive' and 'tape' concepts were kept. + That's why here, as a deployment inside openHABian, we will have 'virtual' tapes and slots which are implemented as subdirectories (one for each 'tape') and filesystem links (two by default config, drive0 and drive1) to point to a virtual tape. + If you have the drive1 link point to the slot3 directory, it effectively means that tape 3 is currently inserted in drive 1). +* Amanda was built on top of UNIX and makes use of its user and rights system, so it is very useful and you should familiarize yourself with that. + As a general good UNIX practice, you shouldn’t use functional users such as “backup” (the OS uses functional users to execute tasks with specific access rights) for administration tasks. + Use your personal user instead (that you have created at the beginning of your openHABian installation or `openhabian` by default). + Installation tasks including post-package-installation changes (edits) of the Amanda config files, require to use the `root` user. + Any ordinary user (such as your personal one) can execute commands on behalf of root (and with root permission) by prepending `sudo` to the command. + As yourself, prepend "sudo -u backup" to execute the following commands as the "backup" user. + +# Installation + +These notes were written for an interactive installation run. +Note openHABian provides the new ["auto backup" feature](https://github.com/openhab/openhabian/blob/main/docs/openhabian.md#auto-backup). +It'll essentially mirror your internal SD card to another (bigger) card in an external card reader and uses the remaining space as your Amanda storage area. +We highly recommend you to make use of this feature on initial openHABian installation, but you can also setup Amanda later on as well. + +## Storage preparation + +Now once you read up on all of this and feel you have understood this stuff, the next step will be to prepare your storage. + +*** +HEADS UP: You need to provide your storage BEFORE you install Amanda. +*** + +That is, you have to mount the USB stick or disk from your NAS to a directory that is LOCAL to your openHABian box. +Specifically for Windows users: if you are not familiar with the UNIX filesystem concept and what it means 'to mount' storage, read up on it NOW. +Various tutorials can be found on the net such as . +The internet is your friend, but make sure you ask search for specific things such as “how to mount a NAS disk on a Raspberry Pi” to match your use case. +So NOW, prepare your storage by creating a directory somewhere and by then mounting the USB device or disk you've previously exported (= shared, i.e. made available for mounting) on that directory. +This is your mountpoint. + +*For Windows fans: Let's be clear here. +This only works if client AND server side are UNIX machines. +And it only works to use NFS. +If you want to use Windows sharing (CIFS), you can try to use the `nounix` mount option in /etc/fstab of your openHAB machine, but this is known to not work in various cases and to cause trouble. +You are COMPLETELY on your own here. +Using CIFS is **NOT SUPPORTED**. +Let alone it also does not make sense as NFS can do the same but any Windows machine will not run 24x7 as a RPi or NAS will do. + +Another specific thing to watch out for when configuring your export share on the NFS server is to add the `no_root_squash` option (that's the name on a generic Linux box, depending on your server OS or UI it might have a different name but it'll be available, too). +Its function is to NOT map accesses of userID 0 (root) to some other UID as your server will do by default. + +Here's examples how to mount a NAS (to have the DNS name "nas" and IP address 192.168.1.100) and two partitions from an attached USB stick identified as `/dev/sda8` (Linux ext4) and `/dev/sda1` and Windows vfat(FAT-32) filesystems. + +HEADS UP: These are just EXAMPLES. +Device and directory names will be different on your system. +Do not deploy these commands unless you are fully aware what they will do to your system, using a command with a wrong device name can destroy your system. + +### NAS mount example + +``` +----- EXAMPLE ONLY ----- Don't use unless you understand what these commands do! ----- EXAMPLE ONLY ----- + +pi@pi:~ $ sudo bash +root@pi:/home/pi# host nas +nas.fritz.box has address 192.168.1.100 +root@pi:/home/pi# +root@pi:/home/pi# mkdir -p /storage/server +root@pi:/home/pi# echo "192.168.1.100://share/freespace /storage/server nfs nolock,noatime 0 0" >> /etc/fstab +root@pi:/home/pi# mount /storage/server +root@pi:/home/pi# df -k /server +Filesystem 1K-blocks Used Available Use% Mounted on +192.168.1.100://share/freespace 2882740768 2502091488 380649280 87% /storage/server +root@pi:/home/pi# + +----- EXAMPLE ONLY ----- Don't use unless you understand what these commands do! ----- EXAMPLE ONLY ----- +``` + +### USB storage mount example + +Note that this is showing two alternative versions, for FAT16/VFAT filesystems (i.e. the original MS-DOS and the improved Windows filesystems that you usually use for USB sticks) and another version to use the ext4 native Linux filesystem. +You can use ext4 on a stick or USB-attached hard drive. +Either way, you just need one or the other. + +``` +root@pi:/home/pi# fdisk -l /dev/sda +Disk /dev/sda: 14,8 GiB, 15836643328 bytes, 30930944 sectors +Units: sectors of 1 * 512 = 512 bytes +Sector size (logical/physical): 512 bytes / 512 bytes +I/O size (minimum/optimal): 512 bytes / 512 bytes +Disklabel : dos +Disk identifier: 0x000210ce + +Device Boot Start End Sectors Size Id Type +/dev/sda1 8192 2357421 2349230 1,1G e W95 FAT16 (LBA) +/dev/sda2 2357422 31116287 28758866 13,7G 85 Linux extended +/dev/sda5 2359296 2424829 65534 32M 83 Linux +/dev/sda6 2424832 2553855 129024 63M c W95 FAT32 (LBA) +/dev/sda7 2555904 30056445 27500542 13,1G 83 Linux +/dev/sda8 30056448 31105023 1048576 512M 83 Linux +root@pi:/# mke2fs -t ext4 /dev/sda8 +mke2fs 1.43.3 (04-Sep-2016) +/dev/sda8 contains a ext4 file system + created on Sun Oct 29 00:17:48 2017 +Proceed anyway? (y,n) y +Creating filesystem with 437248 1k blocks and 109728 inodes +Filesystem UUID: edb36b80-f363-434c-a50e-ca4a81a6bb7d +Superblock backups stored on blocks: + 8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409 + +Allocating group tables: done +Writing inode tables: done +Creating journal (8192 blocks): done +Writing superblocks and filesystem accounting information: done +root@pi:/# mkfs.vfat -v /dev/sda1 +mkfs.fat 4.1 (2017-01-24) +/dev/sda1 has 4 heads and 32 sectors per track, +hidden sectors 0x2000; +logical sector size is 512, +using 0xf8 media descriptor, with 524288 sectors; +drive number 0x80; +filesystem has 2 16-bit FATs and 8 sectors per cluster. +FAT size is 256 sectors, and provides 65467 clusters. +There are 8 reserved sectors. +Root directory contains 512 slots and uses 32 sectors. +Volume ID is 3604a1e5, no volume label. + +root@pi:/home/pi# mkdir -p /storage/usbstick-linux /storage/usbstick-msdos +root@pi:/home/pi# echo "/dev/sda8 /storage/usbstick-linux ext4 defaults,noatime 0 1" >> /etc/fstab +root@pi:/home/pi# echo "/dev/sda1 /storage/usbstick-msdos vfat noatime,noauto,user,uid=backup 0 1" >> /etc/fstab +root@pi:/home/pi# mount /storage/usbstick-linux +root@pi:/home/pi# mount /storage/usbstick-msdos +root@pi:/home/pi# df -k /storage/usbstick-linux /storage/usbstick-msdos +Filesystem 1K-blocks Used Available Use% Mounted on +/dev/sda8 13403236 8204144 4495196 65% /storage/usbstick-linux +/dev/sda1 13403236 9018464 3680876 72% /storage/usbstick-msdos +root@pi:/home/pi# +``` + +## Software installation + +First, mount/prepare your storage (see examples). +Next, double check that your `backup` user has write access to all of the storage area (preferrably, he `owns` the directory): _Create_ a file there (`touch /path/to/storage/file`), check its ownership (`ls -l /path/to/storage/file`), then delete it +(`rm /path/to/storage/file`). +If that does not work as expected (to produce a file that is owned by the `backup` user), you need to change export options on your NAS/NFS server. +See also [paragraph on `no_root_squash`](#storage-preparation) above. + +Now finally, install Amanda using the openHABian menu. +When you start the Amanda installation from the openHABian menu, the install routine will create a directory/link structure in the directory you tell it. +Your local user named "backup" will need to have write access there. +Amanda install routine should do that for you, but it only CAN do it for you if you created/mounted it before you ran the installation. + +Installation will ask you a couple of questions. +* "What's the directory to store backups into?" + Here you need to enter the _local_ directory of your openHABian box, also known as _the mount point_. + This is where you have mounted your USB storage or NAS disk share (which in above example for the NAS is `/storage/server` and for the USB stick is either `/storage/usbstick-linux` or `/storage/usbstick-msdos`). +* "How much storage do you want to dedicate to your backup in megabytes?" + Amanda will use at most this number of megabytes in total as its storage for backup. + If you choose to include the raw device in the backup cycle (next question), that means you should enter 3 times the size of your SD disk NOW. + If you choose not to include it (or selected the AWS S3 variant which omits raw SD backups per default), it's a lot less data and you need to estimate it by adding up the size of the config directories that are listed in the `disklist` file. + If you don't have any idea and chose to NOT backup your SD card, enter 1024 (= 1 GByte). + If you chose to backup it, the number should be larger than the SD capacity in megabytes plus 1024. + You can change it in the Amanda config file at any later time (the entry below the line reading `define tapetype DIRECTORY {`). +* "Backup raw SD card?" (not asked if you selected AWS S3 storage) + Answer "yes" if you want to create raw disk backups of your SD card. + This is only recommended if your SD card is 8GB or less in size, otherwise the backup can take too long. + You can always add/remove this by editing `${confdir}/disklist` at a later time. + +All of your input will be used to create the initial Amanda config files, but you are free to change them later on. +HEADS UP: if you re-run the install routine, it will OVERWRITE the config files at any time so if you make changes there, remember these changes and store them elsewhere, too. +Once you're done installing openHABian and Amanda, proceed to the usage guide chapter below. + +Finally, another HEADS UP: The first thing you should do after your first backup run ended successfully is to create a clone of your active server SD card by restoring the backup to a blank SD card as shown below as an `amfetchdump` example for recovery of a raw device's contents. +`/dev/mmcblk0` is the RPi's internal SD reader device, and from an Amanda perspective, this is a raw device to be backed up to have that same name. +You will have two Amanda config directories (located in `/etc/amanda`) called `openhab-dir` and `openhab-AWS` if you choose to setup both of them. +If any of your Amanda backup or recovery runs fail (particularly if you try to use the S3 backup), you should try getting it to work following the guides and knowledge base available on the web at . +There's online documentation including tutorials and FAQs at . +In case you come across inherent problems or improvements, please let us (openHABian authors) know through a GitHub issue, but please don't expect us to guide you through Amanda, which is a rather complex system, and we're basically just users only, too. + + +# Operating Amanda - a (yes, very brief) usage guide + +The overall config is to be found in `/etc/amanda/openhab-/amanda.conf`. +You are free to change this file, but doing so is at your own risk. +You can specify files, directories and raw devices (such as HDD partitions or SD cards) that you want to be backed up in `/etc/amanda/openhab-/disklist`. +You are free to add more lines here to have Amanda also take backup of other directories of yours. + +Note: the raw SD card backup was left out for the AWS S3 config, as that would require a lot of bandwidth and runtime. + +openHABian setup routine will create systemd timers in `/etc/systemd/system/` to start all backups you select every night at around 01:00AM. + +## Backup + +Find below a terminal session log of a manually started backup run. +It's showing the three most important commands to use. +They all can be started as user _backup_ only, interactively, via systemd.timer or cron, and you always need to specify the config to use. +You can have multiple backup configs in parallel use. + +The `amcheck` command is meant to remind you to put in the right removeable storage medium such as a tape or SD card, but for the AWS and local/NAS-mounted directory based backup configs, we don't have removable media. +So don't get confused, `amcheck` is not a required step. + +The `amdump` command will start the backup run itself. +The result will be mailed to you (once your mail system was setup - see openHABian menu option 2C). + +You can run `amreport [-l=logfile] ` at any time to see a report on the last backup run for that config. +Use -l with a filename of /var/log/amanda//log* to get reports of past dumps. + +**Reminder:** you have to be logged in or use `sudo -u backup` to execute commands as the `backup` user. +To accomplish that, you can also login as your ordinary user and use the `sudo` (execute commands with superuser privileges) and `su` (switch user) commands as shown below. + +``` +pi@pi:/etc/amanda/openhab-dir $ sudo su - backup +backup@pi:~$ +backup@pi:~$ amcheck openhab-dir + + Amanda Tape Server Host Check + ----------------------------- + slot 3: contains an empty volume + Will write label 'openhab-openhab-dir-001' to new volume in slot 3. + NOTE: skipping tape-writable test + NOTE: host info dir /var/lib/amanda/openhab-dir/curinfo/pi does not exist + NOTE: it will be created on the next run. + NOTE: index dir /var/lib/amanda/openhab-dir/index/pi does not exist + NOTE: it will be created on the next run. + Server check took 2.218 seconds + + Amanda Backup Client Hosts Check + -------------------------------- + Client check: 1 host checked in 5.705 seconds. 0 problems found. + + (brought to you by Amanda 3.3.6) + + backup@pi:~$ amreport openhab-dir + nothing to report on! + backup@pi:~$ amdump openhab-dir + backup@pi:~$ amreport openhab-dir + Hostname: pi + Org : openHABian openhab-dir + Config : openhab-dir + Date : März 30, 2017 + + These dumps were to tape openhab-openhab-dir-001. + The next tape Amanda expects to use is: 1 new tape. + + STATISTICS: + Total Full Incr. Level:# + -------- -------- -------- -------- + Estimate Time (hrs:min) 0:12 + Run Time (hrs:min) 1:31 + Dump Time (hrs:min) 1:19 1:19 0:00 + Output Size (meg) 7951.1 7951.1 0.0 + Original Size (meg) 15581.6 15581.6 0.0 + Avg Compressed Size (%) 51.0 51.0 -- + DLEs Dumped 4 4 0 + Avg Dump Rate (k/s) 1723.1 1723.1 -- + + Tape Time (hrs:min) 1:19 1:19 0:00 + Tape Size (meg) 7951.1 7951.1 0.0 + Tape Used (%) 8.0 8.0 0.0 + DLEs Taped 4 4 0 + Parts Taped 4 4 0 + Avg Tp Write Rate (k/s) 1722.4 1722.4 -- + + USAGE BY TAPE: + Label Time Size % DLEs Parts + openhab-openhab-dir-001 1:19 8141884k 8.0 4 4 + + NOTES: + planner: Adding new disk pi:/dev/mmcblk0. + planner: Adding new disk pi:/etc/openhab. + planner: Adding new disk pi:/var/lib/openhab/persistence. + planner: Adding new disk pi:/var/lib/openhab/zwave. + planner: WARNING: no history available for pi:/var/lib/openhab/zwave; guessing that size will be 1000000 KB + planner: WARNING: no history available for pi:/var/lib/openhab/persistence; guessing that size will be 1000000 KB + planner: WARNING: no history available for pi:/etc/openhab; guessing that size will be 1000000 KB + taper: Slot 3 without label can be labeled + taper: tape openhab-openhab-dir-001 kb 8141884 fm 4 [OK] + big estimate: pi /etc/openhab 0 + est: 1000032k out 259820k + big estimate: pi /var/lib/openhab/persistence 0 + est: 1000032k out 48720k + big estimate: pi /var/lib/openhab/zwave 0 + est: 1000032k out 1370k + + + DUMP SUMMARY: + DUMPER STATS TAPER STATS + HOSTNAME DISK L ORIG-kB OUT-kB COMP% MMM:SS KB/s MMM:SS KB/s + -------------------------------------------- ----------------------- -------------- ------------- + pi /dev/mmcblk0 0 15645696 7831974 50.1 78:01 1673.2 77:59 1673.9 + pi /etc/openhab 0 259820 259820 -- 0:32 8077.0 0:34 7641.8 + pi /var/lib/openhab/persistence 0 48720 48720 -- 0:11 4501.6 0:13 3747.7 + pi /var/lib/openhab/zwave 0 1370 1370 -- 0:01 1156.1 0:01 1370.0 + + (brought to you by Amanda version 3.3.6) +``` + +## Restore + +### Locating a backup + +Depending on the type of storage medium, you may need to locate which volume a wanted backup is stored on. +You can use the `amadmin` and `amtape` commands to do this: + +``` +[14:24:16] backup@openhabianpi:~$ amadmin openhab-dir find openhabianpi /dev/mmcblk0 /var/lib/openhab + +date host disk lv storage pool tape or file file part status +2019-12-06 01:00:02 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-005 5 1/1 OK +2019-12-07 01:00:02 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-008 5 1/1 OK +2019-12-08 01:00:02 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-009 5 1/1 OK +2019-12-09 01:00:03 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-010 5 1/1 OK +2019-12-10 01:00:06 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-011 5 1/1 OK +2019-12-11 01:00:03 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-012 5 1/1 OK +2019-12-12 01:00:04 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-013 5 1/1 OK +2019-12-13 01:00:04 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-014 5 1/1 OK +2019-12-14 01:00:03 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-015 5 1/1 OK +2019-12-15 01:00:06 openhabianpi /dev/mmcblk0 0 0 -1/-1 FAILED (planner) "[/usr/lib/amanda/application/amraw terminated with signal 15: see /var/log/amanda/client/openhab-dir/sendsize.20191215010011.debug]" +2019-12-16 01:00:03 openhabianpi /dev/mmcblk0 0 0 -1/-1 FAILED (planner) "[missing result for /dev/mmcblk0 in openhabianpi response]" +2019-12-17 01:00:03 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-018 5 1/1 OK +2019-12-18 01:00:02 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-019 5 1/1 OK +2019-12-19 01:00:02 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-006 5 1/1 OK +2019-12-30 01:00:03 openhabianpi /dev/mmcblk0 0 openhab-dir openhab-dir openhab-dir-007 5 1/1 OK +2019-12-06 01:00:02 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-005 1 1/1 OK +2019-12-07 01:00:02 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-008 1 1/1 OK +2019-12-08 01:00:02 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-009 1 1/1 OK +2019-12-09 01:00:03 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-010 1 1/1 OK +2019-12-10 01:00:06 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-011 1 1/1 OK +2019-12-11 01:00:03 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-012 1 1/1 OK +2019-12-12 01:00:04 openhabianpi /var/lib/openhab 1 openhab-dir openhab-dir openhab-dir-013 2 1/1 OK +2019-12-13 01:00:04 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-014 1 1/1 OK +2019-12-14 01:00:03 openhabianpi /var/lib/openhab 1 openhab-dir openhab-dir openhab-dir-015 2 1/1 OK +2019-12-15 01:00:06 openhabianpi /var/lib/openhab 1 openhab-dir openhab-dir openhab-dir-016 2 1/1 OK +2019-12-17 01:00:03 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-018 1 1/1 OK +2019-12-18 01:00:02 openhabianpi /var/lib/openhab 1 openhab-dir openhab-dir openhab-dir-019 1 1/1 OK +2019-12-19 01:00:02 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-006 1 1/1 OK +2019-12-30 01:00:03 openhabianpi /var/lib/openhab 0 openhab-dir openhab-dir openhab-dir-007 1 1/1 OK +``` + +`amtape` can show which volume is in which slot: + +``` + [13:59:15] backup@openhabianpi:~$ amtape openhab-dir show + scanning all 15 slots in changer: + slot 1: date 20191215010006 label openhab-dir-016 + slot 2: date 20191216010003 label openhab-dir-017 + slot 3: date 20191217010003 label openhab-dir-018 + slot 4: date 20191218010002 label openhab-dir-019 + slot 5: in use + slot 6: date 20191219010002 label openhab-dir-006 + slot 7: date 20191230010003 label openhab-dir-007 + slot 8: date 20191207010002 label openhab-dir-008 + slot 9: date 20191208010002 label openhab-dir-009 + slot 10: date 20191209010003 label openhab-dir-010 + slot 11: date 20191210010006 label openhab-dir-011 + slot 12: date 20191211010003 label openhab-dir-012 + slot 13: date 20191212010004 label openhab-dir-013 + slot 14: date 20191213010004 label openhab-dir-014 + slot 15: date 20191214010003 label openhab-dir-015 +``` + +### Restoring a file + +To restore a file, you need to use the `amrecover` command as the `root` user. +Note that since Amanda is designed to restore ANY file of the system, you are required to run `amrecover` as the root user to have the appropriate file access rights everywhere (neither the `backup` nor your personal user are allowed to write everywhere). +Remember in openHABian you can _execute_ commands as root using `sudo `. + +`amrecover` sort of provides a shell-like interface to allow for navigating through the stored files. +Here's another terminal session log to show how a couple of files are restored into a target directory `/server/temp`. + +``` + pi@pi:/etc/amanda/openhab-dir $ sudo bash + root@pi:/etc/amanda/openhab-dir# amrecover openhab-dir + AMRECOVER Version 3.3.6. Contacting server on localhost ... + 220 pi AMANDA index server (3.3.6) ready. + Setting restore date to today (2017-03-30) + 200 Working date set to 2017-03-30. + 200 Config set to openhab-dir. + 200 Dump host set to pi. + Use the setdisk command to choose dump disk to recover + amrecover> listdisk + 200- List of disk for host pi + 201- /dev/mmcblk0 + 201- /etc/openhab + 201- /var/lib/openhab/persistence + 201- /var/lib/openhab/zwave + 200 List of disk for host pi + amrecover> setdisk /etc/openhab + 200 Disk set to /etc/openhab. + amrecover> ls + 2017-03-30-13-25-29 quartz.properties + 2017-03-30-13-25-29 login.conf + 2017-03-30-13-25-29 logback_debug.xml + 2017-03-30-13-25-29 logback.xml + 2017-03-30-13-25-29 jetty/ + 2017-03-30-13-25-29 configurations/ + 2017-03-30-13-25-29 . + amrecover> add quartz.properties + Added file /quartz.properties + amrecover> add logb* + Added file /logback_debug.xml + Added file /logback.xml + amrecover> lcd /server/temp + amrecover> pwd + /etc/openhab + amrecover> lpwd + /server/temp + amrecover> extract + + Extracting files using tape drive changer on host localhost. + The following tapes are needed: openhab-openhab-dir-001 + + Extracting files using tape drive changer on host localhost. + Load tape openhab-openhab-dir-001 now + Continue [?/Y/n/s/d]? Y + Restoring files into directory /server/temp + All existing files in /server/temp can be deleted + Continue [?/Y/n]? Y + + ./logback.xml + ./logback_debug.xml + ./quartz.properties + amrecover>quit + root@pi:/etc/amanda/openhab-dir# cd /server/temp + root@pi:/server/temp# ls -l + insgesamt 12 + -rw-rw-r-- 1 openhab openhab 2515 Feb 19 2016 logback_debug.xml + -rw-rw-r-- 1 openhab openhab 3573 Mär 30 06:45 logback.xml + -rw-r--r-- 1 openhab openhab 302 Feb 3 2016 quartz.properties + root@pi:/server/temp# +``` + +### Restoring a partition + +To restore a raw disk partition, you need to use `amfetchdump` command. +Unlike `amdump`, you have to run amfetchdump as user backup, though. +Here’s another terminal session log to use `amfetchdump` to first retrieve the backup image from your backup storage to image called `openhabianpi-image` on `/server/temp/`. + +**Reminder:** you have to be logged in as the `backup` user. + +``` +backup@pi:/server/temp$ amfetchdump -p openhab-dir openhabianpi /dev/mmcblk0 20191218010002 > /server/temp/openhabianpi-image + 1 volume(s) needed for restoration + The following volumes are needed: openhab-openhab-dir-001 + Press enter when ready +``` + +Remember to specify the date. +If you don't, Amanda will restore ALL available dumps. +That likely is not what you want. +When the partition(s) you specify to restore are stored across multiple (virtual) tapes, Amanda will eventually ask you to mount a specific volume (put a virtual tape into a virtual tape drive). +Be prepared and have another terminal window open as the backup user. +Use `amadmin` (see above) to find out where a specific backup is located. +When in need, you can instruct Amanda to load a specific volume like this: + +``` +backup@pi:/server/temp$ amtape openhab-dir slot 1 +slot 1: time 20170322084708 label openhab-openhab-dir-001 +changed to slot 1 +``` + +Finally you can go back to the first terminal window and press Enter. +Amanda will automatically pick up the other files if the backup consists of more than one file. + +``` +amfetchdump: 4: restoring split dumpfile: date 20170322084708 host pi disk /dev/mmcblk0 part 1/UNKNOWN lev 0 comp N program APPLICATION + 927712 kb +``` + +You can also provide amfetchdump with the date of the backup that you want to restore by adding the date parameter (format e.g. 20180327). + +``` +backup@pi:/server/temp$ amfetchdump -p openhab-dir pi /dev/mmcblk0 > /server/temp/openhabianpi-image 20180327 +``` + +This line also shows how to restore this image file to a SD card from Linux. +In this example, we have an external SD card writer with a (blank) SD card attached to /dev/sdd. + +``` +backup@pi:/server/temp$ dd bs=4M if=/server/temp/openhabianpi-image of=/dev/sdd +``` + +You could also move that temporary recovered image file to your Windows PC that has a card writer, rename the file to have a .raw extension, and use Etcher or other tool in order to write the image to the card. + + +### A final word on when things have gone badly... + +If your SD card that contains the Amanda database is broken: you don't have to give up. +Whenever you use a directory as the storage area, openHABian Amanda by default creates a copy of its config and index files (to know what's stored where) in your storage directory once a day (see `/etc/systemd/system/amandaBackupDB.service`). +So you can reinstall openHABian including Amanda from scratch and copy back those files. +See `amadmin import` option. +Even if you fail to recover your index files, you can still access the files in your storage area. +The `amindex` command can be used to regenerate the database. +How to apply unfortunately is out of scope for this document so please use and internet search if needed. +There's also a manual way: Amanda storage files are tar files of the destination directory or compressed raw copies of partitions, both have an additional 32KB header. +If you just want to retrieve some files from a partition backup file, you can mount that file. +See . +Here's examples how to decode them: + +``` +[18:13:29] root@openhabianpi:/volatile/backup/slots/slot7# ls -l +insgesamt 2196552 +-rw-rw----+ 1 backup backup 32768 Mär 29 09:29 00000.openhab-dir-007 +-rw-rw----+ 1 backup backup 16857088 Mär 29 09:29 00001.openhab._etc.0 +-rw-rw----+ 1 backup backup 370219008 Mär 29 09:30 00002.openhab._var_lib_openhab.0 +-rw-rw----+ 1 backup backup 22673408 Mär 29 09:30 00003.openhab._boot.0 +-rw-rw----+ 1 backup backup 1839450239 Mär 29 09:55 00004.openhab._dev_mmcblk0.0 +[18:13:29] root@openhabianpi:/volatile/backup/slots/slot7# head -14 *001* +AMANDA: SPLIT_FILE 20180329091738 openhab /etc part 1/-1 lev 0 comp N program /bin/tar +DLE=< + GNUTAR + /etc + 0 + BSDTCP + YES + YES + AMANDA + +ENDDLE +To restore, position tape at start of file and run: + dd if= bs=32k skip=1 | /bin/tar -xpGf - ... +[18:14:49] root@openhabianpi:/volatile/backup/slots/slot7# dd if=00001.openhab._etc.0 bs=32k skip=1 | tar tvf - +drwxr-xr-x root/root 2139 2018-03-29 08:50 ./ +drwxr-xr-x root/root 15 2018-03-26 17:23 ./.java/ +drwxr-xr-x root/root 35 2018-03-26 17:23 ./.java/.systemPrefs/ +drwxr-xr-x root/root 31 2018-03-26 17:20 ./PackageKit/ +drwxr-xr-x root/root 85 2018-03-26 17:23 ./X11/ +drwxr-xr-x root/root 9 2018-03-26 17:23 ./X11/Xreset.d/ + +... + +[18:14:49] root@openhabianpi:/volatile/backup/slots/slot7# dd if=00004.openhab._dev_mmcblk0.0 bs=32k skip=1 | zcat | dd of=/volatile/temp/restore_file + + +... +``` diff --git a/installation/openhabian-exim.md b/installation/openhabian-exim.md new file mode 100644 index 000000000..e4a2d1ba9 --- /dev/null +++ b/installation/openhabian-exim.md @@ -0,0 +1,27 @@ +## Mail Transfer Agent configuration + +When you choose the "Mail Transfer Agent" install option in `openhabian-config` menu to install `exim4` as the mail transfer agent on your system, you will be presented with a number of questions on how to relay emails through a public service such as Google gmail. +In case you enter anything wrong you can re-initiate the installation process from the openHABian menu. + +::: tip if you relay via mail.gmail.com or mail.gmx.net +Both of these freemailers will only forward your mail when you authenticate with your Google/GMX username first. +Additionally, GMX requires the "From:" address to be your GMX mail address. +Google allows for arbitrary From: but will override any From: with your Gmail address. +::: + +Here is what you will need to enter: + +* Mail server type: mail sent by smarthost (received via SMTP or fetchmail) +* System mail name: FQDN (your full hostname including the domain part) +* IPs that should be allowed by the server: 127.0.0.1; ::1; 192.168.1.100 + (replace the last address with your openHABian server interface IP>) +* Other destinations for which mail is accepted: ` . ` +* Machines to relay mail for: Leave empty or 192.168.xxx.0/24 (replace with your local network) +* IP address or host name of the outgoing smarthost: `smtp.gmail.com::587` +* Hide local mail name in outgoing mail: No +* Keep number of DNS-queries minimal: No +* Delivery method: Select: Maildir format in home directory +* Split configuration into small files: Yes +* List of smarthost(s) to use your account for: `*` +* Mail username of the public service to relay all outgoing mail to: + Your username for the mail relay service to use such as `my_id@gmail.com` diff --git a/installation/openhabian.md b/installation/openhabian.md index c6b10614a..af24b907e 100644 --- a/installation/openhabian.md +++ b/installation/openhabian.md @@ -1,45 +1,51 @@ --- layout: documentation title: openHABian -source: https://github.com/openhab/openhabian/blob/master/docs/openhabian.md +source: https://github.com/openhab/openhabian/blob/main/docs/openhabian.md --- {% include base.html %} - + + +::: tip TLDR +([what does TLDR mean?](https://www.howtogeek.com/435266/what-does-tldr-mean-and-how-do-you-use-it/)) +You may jump to [install instructions](#raspberry-pi-prepackaged-sd-card-image) but please note that we expect you to have read the _full_ docs _before_ you ask for help. +::: # openHABian - Hassle-free openHAB Setup -The Raspberry Pi and other small single-board computers are quite famous platforms for openHAB. -However, setting up a fully working Linux system with all recommended packages and openHAB recommendations is a **boring task**, takes a lot of time and **Linux newcomers** shouldn't need to worry about technical details like these. + +The Raspberry Pi is quite a famous platform for openHAB. +However, setting up a fully working Linux system with all recommended packages and openHAB recommendations is a **boring task**, takes a lot of time and **Linux newcomers** are challenged in a number of ways although all they want is to run openHAB and not some server.

A home automation enthusiast doesn't have to be a Linux enthusiast!

-openHABian aims to provide a **self-configuring** Linux system setup specific to the needs of every openHAB user. -To that end, the project provides two things: +openHABian is a **self-configuring** Linux system setup to meet the needs of every openHAB user. +It provides: -* Complete **SD-card images pre-configured with openHAB** and many other openHAB- and Hardware-specific preparations for the Raspberry Pi -* The openHABian Configuration Tool to set up and configure openHAB and many related things on any Debian based system +* Complete **SD-card images pre-configured with openHAB** for the Raspberry Pi line of SBCs +* The openHABian configuration tool to set up and configure openHAB and many related things on any Debian based system #### Table of Contents -{::options toc_levels="2..3"/} +{::options toc_levels="2..3"/} - TOC {:toc} ## Features -The following features are provided by the openHABian image out of the box: -- Hassle-free setup without a display or keyboard, connected via Ethernet or [WiFi](#wifi-based-setup-notes) -- the latest stable version of openHAB 2 -- Zulu Embedded OpenJDK Java 8, 11 or AdoptOpenJDK +Out of the box, the openHABian image provides: + +- Hassle-free setup without a display or keyboard, connected via Ethernet or [Wi-Fi](#wi-fi-based-setup-notes) +- All versions of openHAB to select from, including the latest stable one as the default +- Zulu Embedded OpenJDK Java 11 or AdoptOpenJDK - [openHABian Configuration Tool](#openhabian-configuration-tool) including updater functionality -- web based openHAB Log Viewer (based on [frontail](https://github.com/mthenw/frontail)) +- Web based openHAB Log Viewer (based on [frontail](https://github.com/mthenw/frontail)) - Samba file sharing [pre-configured to use shares](https://www.openhab.org/docs/installation/linux.html#mounting-locally) -- Useful Linux packages pre-installed, including `vim, mc, screen, htop, ...` +- Lots of useful Linux packages and settings pre-installed - Login information screen, powered by [FireMotD](https://github.com/OutsideIT/FireMotD) -- Customized Bash shell experience, settings and openHAB syntax highlighting for [vim](https://github.com/cyberkov/openhab-vim) and [nano](https://github.com/airix1/openhabnano) -- [Mosquitto](https://mosquitto.org) MQTT broker -- the [InfluxDB](https://www.influxdata.com/) database to store home automation data and [Grafana](https://grafana.com/) to visualize it +- The [Mosquitto](https://mosquitto.org) MQTT broker +- The [InfluxDB](https://www.influxdata.com/) database to store home automation data and [Grafana](https://grafana.com/) to visualize it - FIND, the [Framework for Internal Navigation and Discovery](https://www.internalpositioning.com/) - [Tailscale](https://tailscale.com/blog/how-tailscale-works/) VPN and [WireGuard](https://www.wireguard.com/) for remote VPN access @@ -47,46 +53,112 @@ The included **openHABian Configuration Tool** [`openhabian-config`](#openhabian ![openHABian-config menu](images/openHABian-config.png) -- Switch openHAB versions 2 vs 3 and select the latest *Release*, *Milestone* or *Snapshot* [*unstable/SNAPSHOT* build](https://www.openhab.org/docs/installation/linux.html#changing-versions) version -- Install and Setup a [reverse proxy](security.html#nginx-reverse-proxy) with password authentication and/or HTTPS access (incl. [Let's Encrypt](https://letsencrypt.org) certificate) for self-controlled remote access -- manually set up a WiFi connection -- Setup [Backup](#backup) for your system -- Easily install and preconfigure [Optional Components](#optional-components) of your choice -- configure Raspberry Pi specific functions +- Install and setup a [reverse proxy](security.html##running-openhab-behind-a-reverse-proxy) with password authentication and/or HTTPS access (incl. [Let's Encrypt](https://letsencrypt.org) certificate) for self-controlled remote access +- Comprehensive [backup](#availability-and-backup) for your system +- Easily install and preconfigure [optional components](#optional-components) of your choice +- Configure Raspberry Pi specific functions - Prepare the serial port for the use with extension boards like RaZberry, Enocean Pi, ... - - Use ZRAM to mitigate SD card wearout due to excessive writes + - Use zram to mitigate SD wear due to excessive writes - Move the system partition to an external USB stick or drive + ... and much more -## Quick Start +## Hardware -*** -FIRST, check the [README](https://github.com/openhab/openhabian/blob/master/README.md) if your hardware and OS are supported -*** +### Hardware recommendation + +Let's put this first: our current recommendation is to get a RPi 4 with 2 or 4 GB of RAM, a 3A power supply and a 16 GB SD card. +Also get another 32 GB or larger SD card and a USB card reader to make use of the ["auto backup" feature](openhabian.md#auto-backup). + +### Hardware support +As of openHABian version 1.6 and later, all Raspberry Pi models are supported as hardware. +Anything x86 based may work or not. +Anything else ARM based such as ODroids, OrangePis and the like may work or not. +NAS servers such as QNAP and Synology boxes will not work. +Support for PINEA64 was dropped in this current release. +We strongly recommend that users choose Raspberry Pi 2, 3 or 4 systems that have 1 GB of RAM or more. +RPi 1 and 0/0W only have a single CPU core and 512 MB of RAM. +This can be sufficient to run a smallish openHAB setup, but it will not be enough to run a full-blown system with many bindings and memory consuming openHABian features/components such as zram, InfluxDB or Grafana. +We do not actively prohibit installation on any hardware, including unsupported systems, but we might skip or deny to install specific extensions such as those memory hungry applications named above. + +Supporting hardware means testing every single patch and every release. +There are simply too many combinations of SBCs, peripherals and OS flavors that maintainers do not have available, or, even if they did, the time to spend on the testing efforts that is required to make openHABian a reliable system. +Let's make sure you understand the implications of these statements: it means that to run on hardware other than RPi 2/3/4 or (bare metal i.e. not virtualized) x86 Debian may work but this is **not** supported. + +It may work to install and run openHABian on unsupported hardware. +If it does not, you are welcome to find out what's missing and contribute it back to the community with a GitHub pull request. +It is sometimes simple things like a naming string. +We'll be happy to include that in openHABian so you can use your box with openHABian unless there's a valid reason to change or remove it. +However, that does not make your box a "supported" one as we don't have it available for our further development and testing. +So there remains a risk that future openHABian releases will fail to work on your SBC because we changed a thing that broke support for your HW - unintentionally, however inevitably. + +For ARM hardware that we don't support, you can try any of the [fake hardware parameters](openhabian.md/#fake-hardware-mode) to 'simulate' RPi hardware and Raspberry Pi OS. + +### OS support +Going beyond what the RPi image provides, as a manually installed set of scripts, we support running openHABian on x86 hardware on generic Debian. +On ARM, we only support Raspberry Pi OS. +These are what we develop and test openHABian against. +We provide code that is reported "as-is" to run on Ubuntu but we do **not support Ubuntu** so please don't open issues for this (PRs then again are welcome). +Several optional components though, such as WireGuard or Homegear, are known to expose problems on Ubuntu. + +We expect you to use the current stable distribution: 'buster' for Raspberry Pi OS (ARM) and Debian (x86), with 'focal' for Ubuntu (x86). +To install openHABian on anything older or newer may work or not. +If you encounter issues, you may need to upgrade first or to live with the consequences of running an OS on the edge of software development. + +### 64 bit? + +RPi 3 and 4 have a 64 bit processor and you may want to run openHAB in 64 bit. +We provide a 64bit version of the image but it is unsupported and just provided as-is so use it at your own risk. +Be aware that to run in 64 bit has a major drawback: increased memory usage. +That is not a good idea on a heavily memory constrained platform like a RPi. +Also remember openHABian makes use of Raspberry Pi OS which as per today still is a 32 bit OS. +We are closely observing development and will adapt openHABian once it will +reliably work on 64 bit. + +On x86 hardware, 64 bit is the standard. + +### Networking + +The scripted use (i.e. the non-image version) of openHABian does not change anything about your OS' networking setup (except if you deploy a VPN from the menu, of course) so you have to take care of that yourself. +For image based installations, openHABian re-uses the TCP/IP networking setup Raspberry Pi OS is coming with. + +A properly working DHCP server is a mandatory prerequisite to openHABian's networking setup. +We recommend you configure your DHCP server to always assign the same IP based based on your Pi's MAC address. +That'll effectively get you a fixed IP address. +Most DHCP servers are part of your Internet router and have an option to allow for this type of mapping. +For example in AVM Fritz!boxes (popular in Germany), it's a simple checkbox you can tick - note it only appears after the address was assigned to a client (your openHABian box) for the first time. +Note it is NOT supported to setup openHABian with a static IP address as described in the Raspberry Pi OS documentation as that can interfere with openHABian functionality. +For reference, the RPi OS process is documented over here: . +If you are getting an `169.*` IP address it means DHCP didn't work. + +When you boot a flashed image for the first time, openHABian will setup and use the Ethernet port if that one is connected with a cable to your LAN. +It'll also use the `wifi_ssid` and `wifi_password` parameters from `/etc/openhabian.conf` to determine whether and how to setup the Wi-Fi interface. +After these stages it checks for connectivity to the Internet and if that fails, it'll open a [Wi-Fi hotspot](#Wi-Fi-Hotspot) that lets you manually connect your system to a WLAN (Wi-Fi) of yours to jumpstart networking. +Remember that once the hotspot is started, it'll hide once you have successfully used it to connect your Wi-Fi interface but it'll return should your Wi-Fi connectivity break down. + + +## Raspberry Pi prepackaged SD card image -### Raspberry Pi (Prepackaged SD Card Image) **Flash, plug, wait, enjoy:** -The provided image is based on the [Raspberry Pi OS Lite](https://www.raspberrypi.org/downloads/raspberry-pi-os/) (previously called Raspbian) standard system. -On first boot, the system will set up openHAB and the mentioned settings and tools. -All packages will be downloaded in their newest version and configured to work without further modifications. -The whole process will take a few minutes, then openHAB and all other needed tools to get started will be ready to use without further configuration steps. +The provided image is based on the [Raspberry Pi OS Lite](https://www.raspberrypi.org/software/operating-systems/#raspberry-pi-os-32-bit) (previously called Raspbian) standard system. openHABian is designed as a headless system, you will not need a display or a keyboard. +On first boot, the system will set up openHAB, its tools and settings. +Packages will be downloaded in their newest version and configured. +The whole process will take a few minutes, then openHAB and all other tools needed to get started will be ready to use without further configuration steps. **Setup:** -- [Download the latest "openHABian" SD card image file](https://github.com/openhab/openhabian/releases) (Note: the file is *xz* compressed) -- Write the image to your SD card (e.g. with [Etcher](https://www.balena.io/etcher/), able to directly work with *xz* files) -- Insert the SD card into your Raspberry Pi, connect Ethernet ([WiFi also supported](#wifi-based-setup-notes)) and power on. -- Wait approximately **15-45 minutes** for openHABian to do its magic.
(You can check the progress in your web-browser [here](http://openhabiandevice).) -- Enjoy! - -- The device will be accessible by its IP or via the local DNS name `openhabiandevice` (or whatever you changed 'hostname' in `openhabian.conf` to) -- [Connect to the openHAB 2 dashboard](https://www.openhab.org/docs/configuration/packages.html): [http://openhabiandevice:8080](http://openhabiandevice:8080) -- [Connect to the Samba network shares](https://www.openhab.org/docs/installation/linux.html#mounting-locally) with username `openhabian` and password `openhabian` -- Connect to the openHAB Log Viewer (frontail): [http://openhabiandevice:9001](http://openhabiandevice:9001) +- [Download the latest "openHABian" SD card image file](https://github.com/openhab/openhabian/releases) (Note: the file is _xz_ compressed) +- Write the image to your SD card (e.g. with [Etcher](https://www.balena.io/etcher/) or official [Raspberry Pi Imager](https://www.raspberrypi.org/software/), both able to directly work with _xz_ files +- Insert the SD card into your Raspberry Pi, connect your Ethernet cable - [Wi-Fi is also supported](#wi-fi-based-setup-notes) - and power on +- Wait approximately **15-45 minutes** for openHABian to do its magic, you can watch the install progress from within your browser. +- The system will be accessible by its IP or via the local DNS name `openhabian` (or whatever you changed 'hostname' in `openhabian.conf` to) +- Connect to the openHAB UI at [http://openhabian:8080](http://openhabian:8080) +- [Connect to the Samba network shares](https://www.openhab.org/docs/installation/linux.html#mounting-locally) +- Connect to the openHAB Log Viewer (frontail): [http://openhabian:9001](http://openhabian:9001) - If you encounter any setup problem, [please continue here](#successful) -You can stop reading now, openHABian has installed and configured your openHAB system and you can start to use it right away. +You can stop reading for the time being, openHABian has installed and configured your openHAB system and you can start to use it right away. If you want to get in touch with the system or want to install one of the previously mentioned optional features, come back here later. Ready for more? @@ -99,153 +171,182 @@ You will see the following welcome screen: ### Other Linux Systems (add openHABian just like any other software) -Going beyond what the RPi image provides, we support running openHABian on x86 hardware on top of any existing -Debian installation. -Note that although the core parts of openHABian were reported to work on there, Ubuntu is not supported and untested. -See the [README](https://github.com/openhab/openhabian#hardware-and-os-support) for details on supported hardware and OSs before you proceed. -*** + +Going beyond what the RPi image provides, you can also install openHABian on x86 hardware on top of any existing Debian installation. +Please note that the unattended install is tailored to work for Raspberries. +We cannot test HW/OS combos beyond RPis upfront so there is no promise for this work. +Note that although the core parts of openHABian were reported to work on Ubuntu, it is not supported and untested. +If you try and fail, please help and drop us a note on GitHub with debug log enabled, see [DEBUG guide](openhabian-DEBUG.md). Start with a fresh installation of your operating system, login and run -```shell +``` bash # start shell as root user sudo bash ``` then start installation -```shell +``` bash # install git - you can skip this if it's already installed apt-get update apt-get install git # download, link and create config file -git clone -b stable https://github.com/openhab/openhabian.git /opt/openhabian +git clone -b openHAB3 https://github.com/openhab/openhabian.git /opt/openhabian ln -s /opt/openhabian/openhabian-setup.sh /usr/local/bin/openhabian-config -cp /opt/openhabian/openhabian.conf.dist /etc/openhabian.conf +cp /opt/openhabian/build-image/openhabian.conf /etc/openhabian.conf ``` -#### Interactive Install on generic Linux -Start `openhabian-config` to get into the openHABian configuration tool. -➜ Continue at the ["openHABian Configuration Tool"](#openhabian-configuration-tool) chapter below! +Edit `/etc/openhabian.conf` to match your needs, then finally use -#### Unattended Install on generic Linux -BEWARE:
-This install method is only for experts that already know to handle and debug openHABian. -As a beginner, use the interactive `openhabian-config` tool ! - -That being said, you actually _can_ install openHABian in an unattended mode. - -To do so, edit `/etc/openhabian.conf` to match your needs, then use - -```shell +``` bash openhabian-config unattended ``` -to get the automated openHABian installation going. +to install. -Please note that we cannot test HW/OS combos beyond RPis upfront so there is no support / no promise for this work as explained in the [README](https://github.com/openhab/openhabian#hardware-and-os-support). +#### Interactive install on generic x86 Linux + +We strongly recommend you to use the automated install but you actually _can_ walk through the interactive tool. +Start `openhabian-config`. +Get the bare minimum you will _need_ installed by selecting menu option 03. +To install the recommended components that automated install will get in one go select menu options 33, 32, 31, 11, 12, 15, Zulu 11 OpenJDK 64-bit (in menu 4X), 13, 16, 14, 21, 38, 53, 52. +We try to make install options independent of each other but there may be dependencies we are not aware of left so any other order may or may not work. + +➜ Continue at the ["openHABian Configuration Tool"](#openhabian-configuration-tool) chapter below ## openHABian Configuration Tool -The following instructions are targeted at a Raspberry Pi but should be applicable to all openHABian environments. -Once connected to the command line console of your system, please execute the openHABian configuration tool by typing the following command. -(Hint: sudo executes a command with elevated rights and will hence ask for your password: `openhabian`). +The following instructions are developed for a Raspberry Pi but should be applicable to all hardware / all openHABian environments. +Once connected to the command line console of your system, please execute the openHABian configuration tool by typing the following command: -```shell +(Hint: sudo executes a command with elevated rights and will hence ask for your password. The default is `openhabian`). + +``` bash sudo openhabian-config ``` ![openHABian-config menu](images/openHABian-config.png) The configuration tool is the heart of openHABian. -It is not only a menu with a set of options, it's also used in a special unattended mode to automate the setup run, -as either part of the RPi image as well as in a manual install. +It is not only a menu with a set of options, it's also used in a special unattended mode to automate the setup run, either as part of the RPi image or in a manual install run. ⌨ - A quick note on menu navigation. -Use the cursor keys to navigate, Enter to execute, Space to select and Tab to jump to the actions on the bottom of the screen. Press Esc twice to exit the configuration tool. +Use the cursor keys to navigate, Enter to execute, Space to select and Tab to jump to the actions on the bottom of the screen. +Press Esc twice to exit the configuration tool. ### Linux Hints -If you are unfamiliar with Linux, SSH and the Linux console or if you want to improve your skills, read up on these important topics. -A lot of helpful articles can be found on the internet, for example: + +Many helpful articles can be found on the internet, for example: - "Learn the ways of Linux-fu, for free" interactively with exercises at [linuxjourney.com](https://linuxjourney.com). - The official Raspberry Pi help articles over at [raspberrypi.org](https://www.raspberrypi.org/help) - "Now what?", Tutorial on the Command line console at [LinuxCommand.org](http://linuxcommand.org/index.php) -*The good news:* openHABian helps you to stay away from Linux - *The bad news:* not for long... +_The good news:_ openHABian helps you to stay away from Linux - _The bad news:_ not for long... Regardless of if you want to copy some files or are on the search for a solution to a problem, sooner or later you'll have to know some Linux. Take a few minutes to study the above Tutorials and get to know the most basic commands and tools to be able to navigate on your Linux system, edit configurations, check the system state or look at log files. It's not complicated and something that doesn't hurt on one's résumé. -### First Steps with openHAB +### First steps with openHAB + After your first setup of openHABian is successful and you are able to access the openHAB dashboard, you should dig into the possibilites. Install [Bindings](https://www.openhab.org/addons/), discover your devices, and [configure your smart home](https://www.openhab.org/docs/configuration/). You might want to start defining [Items](https://www.openhab.org/docs/configuration/items.html), [Sitemap](https://www.openhab.org/docs/configuration/sitemaps.html) and [HABPanel](https://www.openhab.org/docs/configuration/habpanel.html) dashboard for your home, but these are just some first hints. Be sure to read up on the [Configuration](https://www.openhab.org/docs/configuration/) section of the documentation pages to learn more. -### Further Configuration Steps +### Further configuration steps + openHABian is supposed to provide a ready-to-use openHAB base system. There are a few things, however, we need you to decide and act on right now at the beginning: -- **Delayed Rules Loading** openHAB startup times can be annoyingly long. There's an optimization available that *delays* loading the rules. It quickly renames rules forth and back after 2 minutes, *effectively speeding up* openHAB startup. This is setup by default, you can disable this via \[menu option: 44\]. -- **Time Zone:** The time zone of your openHABian system will be determined based on your internet connection. In some cases you might have to adjust that setting. -- **Language:** The `locale` setting of the openHABian base system is set to "en_US.UTF-8". While this setting will not do any harm, you might prefer e.g. console errors in German or Spanish. Change the locale settings accordingly. Be aware, that error solving might be easier when using the English error messages as search phrases. -- **Passwords:** Relying on default passwords is a security concern you should care about! The openHABian system is preconfigured with a few passwords you should change to ensure the security of your system. This is especially important if your system is accessible from outside your private subnet. +- **Timezone:** The time zone of your openHABian system will be determined based on your internet connection. + In some cases you might have to adjust that setting. +- **Language:** The `locale` setting of the openHABian base system is set to "en_US.UTF-8". + While this setting will not do any harm, you might prefer e.g. console errors in German or Spanish. + Change the locale settings accordingly. + Be aware, that error solving might be easier when using the English error messages as search phrases. +- **Passwords:** Relying on default passwords is a security concern you should care about! + The openHABian system is preconfigured with a few passwords you should change to ensure the security of your system. + This is especially important if your system is accessible from outside your private subnet. -All of these settings **can easily be changed** via the openHABian Configuration Tool. +All of these settings can be changed via the openHABian configuration tool. Here are the passwords in question with their respective default "username:password" values. -All password can be changed from openHABian menu. +They can be changed from openHABian menu. ### Passwords + - User password needed for SSH or sudo (e.g. "openhabian:openhabian") - Samba share password (e.g. "openhabian:openhabian") - openHAB remote console (e.g. "openhab:habopen") - Amanda backup password (no default, applied when installing) -- Nginx reverse proxy login (no default, applied when installing) *For manual configuration see [here](https://www.openhab.org/docs/installation/security.html#adding-or-removing-users).* +- Nginx reverse proxy login (no default, applied when installing) _For manual configuration see [here](https://www.openhab.org/docs/installation/security.html#adding-or-removing-users)._ - InfluxDB (No password set by default) - Grafana visualization ("admin:admin") ## Availability and Backup + openHAB is designed to reliably run 24 hours a day, seven days a week - and so should be your server. -This is the right time to prepare your system for disasters such as getting hit by the SD card wearout/corruption problem which is quite common among users of single board computers such as Raspberry Pis. openHABian has a number of features built in to enhance resilience: +This is the right time to prepare your system for disasters such as getting hit by the SD card wear-out/corruption problem which is quite common among users of single board computers such as Raspberry Pis. openHABian has a number of features built in to enhance resilience: -1. the ZRAM feature moves write intensive parts of openHABian into RAM to mitigate the risk of SD card corruption. See [community thread](https://community.openhab.org/t/zram-status/80996) for more up to date information. -WARNING: power failure will result in some data to get lost (albeit the system should continue to run). Get an UPS. -ZRAM is enabled by default for swap, logs and persistence data. You can toggle use in \[menu option 38\]. -2. Move the root filesystem to USB-attached memory. WARNING: USB sticks are as susceptible to flash wearout as SD cards are, making ZRAM the better choice for a standard Pi to run off its internal SD card. But you can use this option to migrate your system to a safe medium such as an SSD or HDD. \[menu option 37\] -3. Use the openHAB integrated [openhab-cli tool](https://community.openhab.org/t/recommended-way-to-backup-restore-oh2-configurations-and-things/7193/82) to interactively backup/restore your openHAB **config** \[menu option 50/51\]. -4. Use [Amanda Network Backup](http://www.amanda.org/) for full system backups, documentation [here](https://github.com/openhab/openhabian/blob/master/docs/openhabian-amanda.md). \[menu option 52\] +1. The zram feature moves write intensive parts of openHABian into RAM to mitigate the risk of SD card corruption. See [community thread](https://community.openhab.org/t/zram-status/80996) for more up to date information. + WARNING: power failure will result in some data to get lost (albeit the system should continue to run). + Get an UPS. + Zram is enabled by default for swap, logs and persistence data. + You can toggle use in \[menu option 38\]. +2. You can have openHABian mirror your SD card. See [auto backup](#auto-backup) documentation. You can activate mirroring using \[menu option 53\]. +3. Move the root filesystem to USB-attached devices. + WARNING 1: USB sticks are as susceptible to flash wear-out as SD cards are, making zram the better choice for a standard Pi to run off its internal SD card. + WARNING 2: It will NOT work out of the box to also _boot_ from the USB device. + As a Linux or openHAB beginner, you should NOT try this. + Using this is NOT recommended to anyone except those to **know** Linux well enough **to manually apply** all the required modifications. + See \[menu option 37\]. +4. Use the openHAB integrated [openhab-cli tool](https://community.openhab.org/t/recommended-way-to-backup-restore-oh2-configurations-and-things/7193/82) to interactively backup/restore your openHAB **config** \[menu option 50/51\]. +5. Use [Amanda Network Backup](http://www.amanda.org/) for full system backups, documentation [here](openhabian-amanda.md). + See \[menu option 52\]. -Standard openHABian install enables ZRAM by default (#1). Once you attach a *safe* external medium to your system (such as an SSD), you can disable ZRAM (#1) and move the system over using menu options 37 (#2). -Finally, we strongly suggest you install Amanda (#4) right after you finish your setup. Amanda is to take care to backup the whole system to be able to quickly restore it when in need. -This is not done by default because it requires a number of user inputs, but you should not skip it for your own safety ! +Standard openHABian install enables zram by default (#1). +Once you attach a _safe_ external medium to your system (such as an SSD), you can disable zram (#1) and move the system over using menu options 37 (#2). +Finally, we strongly suggest you install Amanda (#4) right after you finish your setup. +Amanda is to take care to backup the whole system to be able to quickly restore it when in need. +This is not done by default because it requires a number of user inputs, but you should not skip it for your own safety! -Delayed rules load will also be enabled by default. This is renaming the rules files, then after 2 minutes it renames them back. You can toggle to use this feature in menu option 44. +`Delayed rules load` will be enabled by default in openHAB 2 but disabled in openHAB 3 (which has a new start-level system). +This function will rename the rules files so they get ignored by the starting openHAB instance, then after 2 minutes they're renamed back. +You can toggle to use this feature in menu option 44. ## Setup notes +### On openHAB 2 and 3 -### On openHAB3 -Starting with its general release, openHABian will install **openHAB 3** by default. -There's some big changes also to openHABian such as to install Java 11 and to use changed file and directory names. +openHABian will install **openHAB 3** by default. +When openHAB3 was released, there have been some big changes also to openHABian such as to install Java 11 and to use changed file and directory names. Most directory names `... /openhab2/ ...` will become `... /openhab/ ...` (NOTE: not `openhab3`) plus there's changes in a number of places, often subtle ones like the name of Samba export shares to change. -As openHABian users will be running openHAB 2.X by the time 3.0 gets released, `openhabian-config` offers to migrate the openHABian environment and install openHAB3 for you. -Menu option 42 will do the upgrade. Be aware that it isn't the universal answer to all your migration needs - there is ONLY an openHAB upgrade path. You cannot downgrade from OH3 to OH2. +For openHABian users running openHAB 2.X, `openhabian-config` offers to migrate the openHABian environment and install openHAB3 for you. +Menu option 42 will do the upgrade. +Be aware that it isn't the [answer to the ultimate question](https://en.wikipedia.org/wiki/Phrases_from_The_Hitchhiker%27s_Guide_to_the_Galaxy#The_Answer_to_the_Ultimate_Question_of_Life,_the_Universe,_and_Everything_is_42): there is ONLY an openHAB upgrade path, you cannot downgrade from openHAB 3 to openHAB 2. ::: warning No downgrades -Take an openHAB config backup BEFORE you upgrade from openHAB v2 to v3. You should also take a system level backup ! +Take an openHAB config backup BEFORE you upgrade from openHAB v2 to v3. You should also take a system level backup! ::: -Menu option 42 can also do the downgrade and change the environment back to match openHAB 2 **BUT** it'll ONLY exchange the binary packages. There is no migration to change your configuration back to a OH2 compatible one. So it is essential that you take a backup before you upgrade. You will have to restore your setup from that backup after a downgrade using menu option 51 or by manually using `openhab-cli restore `. -Note option 42 will also not downgrade Java. openHAB 2 however is known to run with Zulu Java 11 as well. + +Menu option 42 can also do the downgrade and change the _environment_ back to match openHAB 2 **BUT** it'll ONLY exchange the binary packages. +There is no migration to change your configuration back to a openHAB 2 compatible one. +So it is essential that you take a backup before you upgrade. +You will have to restore your setup from that backup after a downgrade using menu option 51 or by manually using `openhab-cli restore `. +Note option 42 will also not downgrade Java. +openHAB 2 however is known to run with Java 11 as well. ### `openhabian.conf` -You can actually set a number of parameters _before_ you run an unattended installation. This applies to the RPi image on an SD card as well as to a manual installation. + +You can actually set a number of parameters _before_ you run an unattended installation. +This applies to the RPi image on an SD card as well as to a manual installation. You can also try with a different set of parameters if your initial attempt fails: - Flash the system image to your micro SD card as described, do not remove the SD card yet -- Access the first SD card partition. It's a vfat/FAT-32 (Windows) filesystem so just use the file explorer of your client PC. +- Access the first SD card partition (it's a vfat/FAT-32 (Windows) filesystem so just use the file explorer of your client PC) - Open the file `openhabian.conf` in a text editor - Uncomment and complete the lines to contain the parameters you want to set - Save, unmount/eject, remove and insert into the RPi and boot it @@ -254,97 +355,118 @@ You can also try with a different set of parameters if your initial attempt fail Mind the comments for each configuration parameter. Browse the next documentation section for more explanations. #### Administration user + Raspberry Pi OS images include a Linux user (`pi`) that you can use for openHAB administration. openHABian renames the user to what you specify in the `username` parameter and assigns the `userpw` password first, then it proceeds and makes various settings that are either useful (such as some aliases) or required to run openHAB. You can also make use of this if you don't use the image but unattended installation on non-RPi hardware, openHABian will then _create_ that user for you if it does not yet exist. -#### admin key -Make the `adminkeyurl` point to an URL to contain a public SSH key. This will be included with your administration -user's `.ssh/authorized_keys` and the openHAB console so the admin user (yourself, usually) can login after installation. +#### Admin key -#### WiFi based setup notes -If you own a RPi3, RPi3+, RPi4, a RPi0W or any other model with a compatible WiFi dongle you can set up and use openHABian via WiFi only. -For the WiFi based setup to work, you'll need to make your SSID and password known to the system before the first boot. -So in addition to the setup instructions given above, uncomment and complete the lines reading `wifi_ssid=""` and `wifi_psk=""` in `openhabian.conf`. +Make the `adminkeyurl` point to an URL to contain a public SSH key. +This will be included with your administration user's `.ssh/authorized_keys` and the openHAB console so the admin user (yourself, usually) can login after installation. -#### WiFi Hotspot -Whenever the WiFi interface wlan0 exists but does not have connectivity, openHABian will launch a **Hotspot**. -When you use your mobile phone to scan for WiFi networks, you should be seeing a new network called `openHABian-`. +#### Wi-Fi based setup notes + +If you own a RPi3, RPi3+, RPi4, a RPi0W or any other model with a compatible Wi-Fi dongle you can set up and use openHABian via Wi-Fi only. +For the Wi-Fi based setup to work, you'll need to make your SSID and password known to the system before the first boot. +So in addition to the setup instructions given above, uncomment and complete the lines reading `wifi_ssid=""` and `wifi_password=""` in `openhabian.conf`. + +#### Wi-Fi Hotspot + +Whenever the Wi-Fi interface wlan0 exists but does not have connectivity, openHABian will launch a **Hotspot**. +When you use your mobile phone to scan for Wi-Fi networks, you should be seeing a new network called `openHABian-`. Connecting will work without a password. Once connected, open your browser and point it at `http://raspberrypi.local` or `http://comitup-`. -This may or may not work for your mobile browser as it requires Bonjour/ZeroConf abilities. If you cannot connect to this address, go to `http://10.42.0.1`. -On that page you can select the SSID of the network you want to connect your system to. Provide the password and press the button. -Note that as soon as you do, the wlan0 IP address changes so your mobile browser will not be able to provide you any feedback if that worked out. -Try to ping the new system's hostname (default is `openHABianDevice`) or check DHCP on your router if your openHABian system appeared there. -For more information on this feature see [comitup-cli](https://davesteele.github.io/comitup/). +This may or may not work for your mobile browser as it requires Bonjour/ZeroConf abilities. +If you cannot connect to this address, go to `http://10.41.0.1`. +On that page you can select the SSID of the network you want to connect your system to. +Provide the password and press the button. +Note that as soon as you do, the wlan0 IP address of your system changes so your mobile browser will not be able to provide you any feedback if that worked out. +Try to ping the new system's hostname (default is `openhabian`) or check DHCP on your router if your openHABian system appeared there. You can use `sudo comitup-cli` inside openHABian to change networks and eventually remove network credentials. Note the hotspot may not only become available during installation: it will remain on standby and will show up again every time your `wlan0` interface is losing connectivity. -The hotspot feature is known to work on RPi 0W, 3 and 4 but is known to often expose problems with WiFi USB adapters. +For more information on hotspot functions see [comitup-cli](https://davesteele.github.io/comitup/). Most behavior can be tweaked by setting parameters (such as a default password) in `/etc/comitup.conf`. +The hotspot feature is known to work on RPi0W, RPi3, and RPi4 but is known to often expose problems with Wi-Fi USB adapters. -#### Disable ZRAM -ZRAM is activated by default on fresh installations on ARM hardware except on a 8GB RPi4 as that is known to be incompatible at the time of writing, leading to kernel crashes. -If you want to disable ZRAM for a different reason, use `zraminstall=disable` in `openhabian.conf` to install without. +#### Disable zram + +Zram is activated by default on fresh installations on ARM hardware. +If you want to disable zram for some reason, use `zraminstall=disable` in `openhabian.conf` to install without. #### Debug mode -See [Troubleshooting](#Troubleshooting) section if you run into trouble installing. If you want to turn on debug mode, -edit `openhabian.conf` and set the `debugmode=` parameter to either `off`, `on` or `maximum`. -Mind you that if you intend to open an issue, we need you to provide the output of `debugmode=maximum`. -#### Auto-backup -You might want to setup openHABian to automatically backup and mirror your internal SD card to an external unit. -We suggest to use another SD card in an external card writer device so that in case your internal SD card fails, -you can switch SD cards to get the system back up running fast. -Note most "16GB" cards are not _exactly_ 16 GB and your new one mustn't have less bytes than the old one so -openHABian enforces the second card to have at least twice the size of your internal card. -We make use of that extra space as storage for the backup system. +See [Troubleshooting](#troubleshooting) section if you run into trouble installing. +If you want to turn on debug mode edit `openhabian.conf` and set the `debugmode=` parameter to either `off`, `on` or `maximum`. +Mind you that if you intend to open an issue, we need you to provide the output of `debugmode=maximum` so if you're in interactive mode, set your terminal to record output. -To setup right at installation time: +#### Auto backup + +Auto backup is a marketing name for two distinct features that you can deploy in one go at _unattended_ installation time on a RPi (when you deploy the image). +Technically it is a "low-cost" version of disk mirroring PLUS the setup of the Amanda backup system which all by itself has been available in a long time. +So don't let the name confuse you. If you didn't choose to set this up at installation time, you can also individually select these functions via `openhabian-config` menu options 53 (mirroring) and 52 (Amanda). +Note mirroring is untested (and hardly makes sense to deploy) if you don't run RPi hardware while Amanda is known to work on a lot of other hardware and is well meant to be used as the backup system there as well. + +To setup openHABian to automatically backup and mirror your internal SD card to an external storage unit, we suggest to use another SD card in an external card writer device so that in case your internal SD card fails, you can switch SD cards to get the system back up running fast. + +We recommend to put in another card that has at least _twice_ the size of the internal card. We can make use of that extra space as storage for the backup system. +Note most "16GB" cards are not _exactly_ 16 GB and your mirror mustn't have less bytes than the internal one so at setup time, openHABian ensures the second card has at least the same size as your internal card. + +::: tip No Do-It-Yourself mirroring +Note you must NOT use `dd` or any other tool to copy a SD card or partition on your own. If you do and boot with source and destination cards plugged in, they will have the same partition IDs and this will likely mess up and can irreversibly devastate your whole system. Use the `blkid` command in shell to see those IDs. +So don't take _mirrors_ of the _mirror_. +Also be aware that only the first two partitions are mirrored - the storage (3rd) parition will never be mirrored even if you have set that up for use as backup area. +::: + +To setup mirroring right during unattended installation of a RPi (using the image flash method):
Define `backupdrive=/dev/sdX` (replace X with the proper character) to enable this functionality right during unattended installation. -Eventually change `storagedir=/storage` to any other name. The first attached disk type device is usually called `/dev/sda`. -openHABian will create partitions 1 and 2 to be mirrors of your internal card and will assign the remaining space -to a storage partition. -Full mirroring will take place semiannually and for the 2nd partition (Linux root), changes will be synced once a week. -See `systemctl list-timers`, timers are defined in `/etc/systemd/system/sd*.timer`. -The unattended install routine will also setup Amanda to take daily backups and store them to that third partition. Use `storagecapacity=xxx` to override how much space to consume at most for Amanda backup storage (in MB). -If you choose to skip this during system installation, you can still setup both, mirroring and Amanda, at -any later time using the 5X menu options. +openHABian will create partitions 1 and 2 to be mirrors of your internal card and will assign the remaining space to another partition that you can use for storage. +NOTE: if you do and _if_ the remaining space is sufficient, selecting this will also result in setting up the Amanda backup system on that extra space. +Note you can change where it stores its backup data via `storagedir=/storage`, but you cannot unselect the Amanda setup at this stage. +If you want to setup mirroring only and Amanda anywhere else but on the extra SD space, you must not use unattended installation method (i.e. do not define `backupdrive`). +You can still setup both, mirroring and Amanda, separately at any later time using the 53 (mirroring) and 52 (Amanda) menu options. -Menu 5X provides interactive access to the aforementioned functions: -`53 Setup SD monitoring` prepares the partitions on an SD card and sets up timers to execute both, a full mirroring -and complementary rsync 'diff' runs in a backup schedule. +Full mirroring will take place semiannually and for the 2nd partition (Linux root), changes will be synced once every day. +See `systemctl list-timers`, timers are defined in `/etc/systemd/system/sd*.timer`. + + +Menu 5X provides interactive access to the aforementioned functions:
+`52 Amanda System Backup` will will prepare an existing directory as your backup storage and make Amanda launch once a day. See the separate [Amanda setup document](openhabian-amanda.md). +`53 Setup SD mirroring` prepares the partitions on an SD card and sets up timers to execute both, a full mirroring and complementary rsync 'diff' runs. `54 Raw copy SD` is a one-time raw copy (mirror) run. `55 Sync SD` proagates (syncs) differences from your main SD card to your external card. -Should you need to switch over to your backup card, get a another new SD card to match the size of the broken card and use menu option 54 to copy your active backup card back to the new one and switch cards back as soon as possible. +Should you need to switch over to your backup card, get another new SD card that matches the size of the broken card and use menu option 54 to copy your active backup card back to the new one and switch cards back as soon as possible. #### Tailscale VPN network -Tailscale is a management toolset to establish a WireGuard based VPN between multiple systems if you want -to connect to openHAB(ian) instances outside your LAN over Internet. + +Tailscale is a management toolset to establish a WireGuard based VPN between multiple systems if you want to connect to openHAB(ian) instances outside your LAN over Internet. It'll take care to detect and open ports when you and your peers are located behind firewalls. -[Download the client](https://tailscale.com/download) and eventually get the Solo service plan from Tailscale, -that's free for private use. This free service will automatically be selected when you fire up your first VPN node. -The Windows client has a link to the admin console where you can create pre-auth one-time keys. These you can put -as the `preauthkey` into `openhabian.conf` to automatically deploy remote openHABian nodes (unattended install) -and have them join the VPN. +[Download the client](https://tailscale.com/download) and eventually get the Solo service plan from Tailscale, that's free for private use. +This free service will automatically be selected when you fire up your first VPN node. +The Windows client has a link to the admin console where you can create pre-auth one-time keys. +These you can put as the `preauthkey` into `openhabian.conf` to automatically deploy remote openHABian nodes (unattended install) and have them join the VPN. #### IPv6 notes + You might encounter problems when you make use of IPv6 on some networks and systems. openHABian installation may stop or hang forever. -In that case *or if you are sure that you do not need IPv6 on your openHABian server*, you can disable IPv6. +In that case _or if you are sure that you do not need IPv6 on your openHABian server_, you can disable IPv6. Follow the instructions in the previous section and insert a line into `openhabian.conf` reading `ipv6=disable`. #### Fake hardware mode + If to install openHABian fails because you have a non-supported hardware or run an unsupported OS release, you can "fake" your hardware and OS to make openHABian behave as if you did own that HW/OS. -In `openhabian.conf`, uncomment and complete the lines reading `hw=`, `hwarch=` and/or `release=` with the hw and os versions you want to attempt installation with. +In `openhabian.conf`, uncomment and complete the lines reading `hw=`, `hwarch=` and/or `osrelease=` with the hw and os versions you want to attempt installation with. ## Optional Components + openHABian comes with a number of additional routines to quickly install and set up home automation related software. You'll find all of these in the [openHABian Configuration Tool](#openhabian-configuration-tool) -- [Frontail](https://github.com/mthenw/frontail) - openHAB Log Viewer accessible from [http://openhab:9001](http://openhab:9001) -- [InfluxDB and Grafana](https://community.openhab.org/t/influxdb-grafana-persistence-and-graphing/13761/1) - persistence and graphing available from [http://openhab:3000](http://openhab:3000) +- [Frontail](https://github.com/mthenw/frontail) - openHAB Log Viewer accessible from [http://openhabian:9001](http://openhabian:9001) +- [InfluxDB and Grafana](https://community.openhab.org/t/influxdb-grafana-persistence-and-graphing/13761/1) - persistence and graphing available from [http://openhabian:3000](http://openhabian:3000) - [Eclipse Mosquitto](http://mosquitto.org) - Open Source MQTT v3.1/v3.1.1 Broker -- [Node-RED](https://nodered.org) - "Flow-based programming for the Internet of Things", with preinstalled [openHAB 2](https://flows.nodered.org/node/node-red-contrib-openhab2) and [BigTimer](https://flows.nodered.org/node/node-red-contrib-bigtimer) add-ons. Accessible from [http://openhab:1880](http://openhab:1880) +- [Node-RED](https://nodered.org) - "Flow-based programming for the Internet of Things". Access at [http://openhabian:1880](http://openhabian:1880). - [Homegear](https://www.homegear.eu/index.php/Main_Page) - Homematic control unit emulation - [KNXd](http://michlstechblog.info/blog/raspberry-pi-eibknx-ip-gateway-and-router-with-knxd) - KNX daemon running at `224.0.23.12:3671/UDP` - [OWServer](http://owfs.org/index.php?page=owserver_protocol) - 1wire control system @@ -353,9 +475,8 @@ You'll find all of these in the [openHABian Configuration Tool](#openhabian-conf - Tellstick core ## Troubleshooting -If you're having problems to get openHABian to install properly, check out the [debug guide](https://github.com/openhab/openhabian/blob/master/docs/openhabian-DEBUG.md). It's also available on your system as [/opt/openhabian/docs/openhabian-DEBUG.md](openhabian-DEBUG.md). -Do not hesitate to ask for help on the [openHABian community forum](https://community.openhab.org/) when the debug guide doesn't help. -Remember to [mind the rules](https://community.openhab.org/t/how-to-ask-a-good-question-help-us-help-you/58396) please. +If you're having problems with getting openHABian to install properly, check out the [debug guide](openhabian-DEBUG.md). It's also available on your system as `/opt/openhabian/docs/openhabian-DEBUG.md`. +You can ask for help on the [openHABian community forum](https://community.openhab.org/) when the debug guide doesn't help but please first, read and [mind the rules](https://community.openhab.org/t/how-to-ask-a-good-question-help-us-help-you/58396). If you want to get involved, you found a bug, or just want to see what's planned for the future, visit us on GitHub: @@ -364,23 +485,23 @@ If you want to get involved, you found a bug, or just want to see what's planned ### Where can I find a changelog for openHABian? Official announcements are co-located with the download links [here](https://github.com/openhab/openhabian/releases). -If you want to stay in touch with all the latest code changes under the hood, see the [commit history](https://github.com/openhab/openhabian/commits/master) for openHABian. +If you want to stay in touch with all the latest code changes under the hood, see [commit history](https://github.com/openhab/openhabian/commits/main) for openHABian. You'll also see commits "fly by" when executing the "Update" function within the openHABian Configuration Tool. ### Did my Installation succeed? What to do in case of a problem? -Don't panic ;-) -openHABian setup will take 15 up to 45 minutes to complete all steps, depending on your device's performance and a number of external factors such as your internet connection. +openHABian setup will take 15 up to 45 minutes to complete all steps, depending on your device's performance and your internet connection. -Watch the progress on the console or the web interface at https:/// or if that name has become available. +Watch the progress on the console or the web interface at or if that name has become available. Double-check the IP address and name with your router while you wait. -If there is absolutely no output for more than 10 minutes, your installation has failed in the first initialization phase. There probably is a problem -with the way your router or local network are setup. -Read on in the [Troubleshooting](#Troubleshooting) section or move on to the [DEBUG guide](https://github.com/openhab/openhabian/blob/master/docs/openhabian-DEBUG.md). +If there is absolutely no output for more than 10 minutes, your installation has failed in the first initialization phase. +There probably is a problem with the way your router or local network are setup. +Read on in the [Troubleshooting](#troubleshooting) section or move on to the [DEBUG guide](openhabian-DEBUG.md). +You can set `debugmode=on` (or even = `maximum`) right on first install, too, to get to see what openHABian is doing. After a few minutes of boot up time, you can [connect to the SSH console](https://www.raspberrypi.org/documentation/remote-access/ssh/windows.md) of your device. During the setup process you'll be redirected to the live progress report of the setup (you can Ctrl-C to get into the shell). -The report can also be checked for errors at any time, see `/boot/first-boot.log` +The report can also be checked for errors at any time, see `/boot/first-boot.log`. The progress of a successful installation will look like this: @@ -389,6 +510,7 @@ The progress of a successful installation will look like this: Wait till the log tells you that the setup was "successful", then reconnect to the device. #### SSH Login Screen + If the installation was **successful** you will see the normal login screen as shown in the first screenshot. If the installation was **not successful** you will see a warning and further instructions as shown in the second screenshot. @@ -398,48 +520,53 @@ If the installation was **not successful** you will see a warning and further in #### openHAB Dashboard + After the installation of openHABian was successful, you should be able to access the openHAB dashboard: -- Raspberry Pi image setup: [http://openhab:8080](http://openhab:8080) +- Raspberry Pi image setup: [http://openhabian:8080](http://openhabian:8080) - In any case: [http://your-device-hostname:8080](http://your-device-hostname:8080) or [http://192.168.0.2:8080](http://192.168.0.2:8080) (replace name/IP with yours) #### What's next? -If you are not able to access your system via the openHAB dashboard or SSH after more than one hour, chances are high that your hardware setup is the problem. Consult the [debug guide](openhabian-DEBUG.md) and move on from there. + +If you are not able to access your system via the openHAB dashboard or SSH after more than one hour, chances are high that your hardware setup is the problem. +Consult the [debug guide](openhabian-DEBUG.md) and move on from there. -#### Can I switch from openHAB 2 stable to the testing or unstable branch? -openHABian installs the latest stable build of openHAB 2. -If you want to switch over to the snapshot or milestone release, please do so via the openHABian Configuration Tool. -Switching from stable to newer development releases might introduce changes and incompatibilities, so please be sure to make a full openHAB backup first! +#### Can I switch openHAB 2 and 3 via openHABian branches? -Check the Linux installation article for all needed details: [Linux: Changing Versions](https://www.openhab.org/docs/installation/linux.html#changing-versions) +openHABian installs the latest stable build of openHAB. +The standard openHABian `openHAB3` and `main` branches will install the new openHAB version 3 and the old `stable` branch will install the old openHAB version 2. +You can migrate between versions by selecting the corresponding 4X menu option. +That should also result in an openHABian branch change. +If you want to choose from stable, snapshot or milestone releases, please do so via `openhabian-config` tool (also menu 4X). +Note this will **not** result in any openHABian branch change. +Switching from stable to newer development releases might introduce changes and incompatibilities, so please be sure to make a full openHAB backup first! +Check the Linux installation article for all needed details: [Linux: Changing Versions](linux.html#changing-versions) #### Where is the graphical user interface? + I've just installed openHABian and now I'm confused. -No fancy login screen, no windows, no mouse support. What did I get into? +No fancy login screen, no windows, no mouse support. +What did I get into? -You are not the first one to get confused about the **intended use case of openHABian**. +You are not the first one to get confused about the intended use case of openHABian. Maybe it helps to not think of the RPi as a PC as we know it. -An RPi is not (well, not *necessarily*) to be used with a keyboard and display. +An RPi is not (well, not _necessarily_) to be used with a keyboard and display. Its intended use case is to sit in a corner and provide a service reliably 24 hours a day, 7 days a week. -You already own a **powerful PC or Mac** to work on. -It would be a shame to have a powerful computer at your fingertips and then have to **restrict yourself** to a very limited graphical frontend on another device, wouldn't you agree? +You already own a powerful PC or Mac to work on. -Moving on. -What we actually want openHABian to be is a **dedicated headless system** to **reliably execute openHAB** and to **expose all interfaces** needed to interact and configure it (PaperUI, BasicUI, HABPanel, openHAB LogViewer, Samba Network Shares, openHABian Configuration Tool, SSH, you-name-it). +What we actually want openHABian to be is a **dedicated, headless system** to **reliably run openHAB** and to **expose all interfaces** needed to interact and configure it (MainUI, HABPanel, openHAB LogViewer, Samba Network Shares, openHABian Configuration Tool, SSH, you-name-it). If you know how to work with these interfaces, you are set for a way better experience than the alternatives. -The main challenge is to **get used to the Linux command line**, not even a GUI (like Pixel, see below) will relieve you from that in the long run. +The main challenge is to **get used to the Linux command line**, not even a GUI will relieve you from that in the long run. If you are not willing to teach yourself a few fundamental Linux skills you will not become happy with any Linux system and should resort to a e.g. Windows machine. However as you are willing to tinker with smart home technology, I'm sure you are ready to **teach yourself new stuff** and expand your experience. -**If** the above didn't convince you, execute the following commands to get the graphical user interface [Pixel](https://www.raspberrypi.org/blog/introducing-pixel) installed. -You have been warned, if there came any warranty with openHABian to begin with, it would end here. - #### Can I use openHABian on ...? -See the [README](https://github.com/openhab/openhabian/blob/master/README.md) for a list of supported HW and OS. + +See the [README](https://github.com/openhab/openhabian/blob/main/README.md#hardware-and-os-support) for a list of supported HW and OS. openHABian is developed for Debian based systems. If your operating system is based on these or if your hardware supports one, your chances are high openHABian can be used. Check out the [Manual Setup](#manual-setup) instructions for guidance and consult the [debug guide](openhabian-DEBUG.md) if you run into problems. -Do not hesitate to ask for help on the [openHABian community forum](https://community.openhab.org/) ! +Do not hesitate to ask for help on the [openHABian community forum](https://community.openhab.org/)! diff --git a/installation/qnap.md b/installation/qnap.md index 5d6b5996d..0c29203e0 100644 --- a/installation/qnap.md +++ b/installation/qnap.md @@ -2,49 +2,43 @@ layout: documentation title: QNAP NAS --- - -{% include base.html %} # QNAP NAS The [QNAP NAS](https://www.qnap.com) is a NAS server solution for your home, allowing the installation of additional packages. Please find all details about the openHAB package for QNAP [here](https://github.com/openhab/openhab-qnap-qpkg). -![AppCenter enabled](https://github.com/openhab/openhab-qnap-qpkg/raw/master/docs/QTS_4.2.0_AppCenter%20enabled.png) - ## How to install Check that your NAS has the most recent firmware version. Follow the instructions shown if a new version is announced when opening the admin GUI. -1. Download the QPKG from the [releases section over on GitHub](https://github.com/openhab/openhab-qnap-qpkg/releases). +1. Download the QPKG from the [releases section over on GitHub](https://github.com/openhab/openhab-qnap-qpkg/releases). -2. Create a directory for your addons, configurations and userdata, by either +1. Create a directory for your addons, configurations and userdata, by either - Creating a share called "openHAB" (recommended) - Creating a folder called "openHAB" inside the "Public" share - Not creating any of them and therefore using `.qpkg/openHAB2/distribution` for all data (for testing or demonstration) -3. Go to your NAS's App Center and make sure you have got "JRE" (for x86-CPU based NAS) or "JRE_ARM" (for ARM-CPU based NAS) installed. +1. Go to your NAS's App Center and make sure you have got "JRE" (for x86-CPU based NAS) or "JRE_ARM" (for ARM-CPU based NAS) installed. If that is not the case, go to the "Developer-Tools" section of the App Center, install the appropriate version and wait for a while until the Java installation has finished. -4. Open the "Install manually" dialog in the App Center by clicking the gear-wheel on the upper-right corner of the App Center and choose the `qpkg` you have downloaded. +1. Open the "Install manually" dialog in the App Center by clicking the gear-wheel on the upper-right corner of the App Center and choose the `qpkg` you have downloaded. - ![AppCenter choose](https://github.com/openhab/openhab-qnap-qpkg/raw/master/docs/QTS_4.2.0_AppCenter%20choose.png) + ![AppCenter choose](https://raw.githubusercontent.com/openhab/openhab-qnap-qpkg/main/docs/QTS_4.2.0_AppCenter%20choose.png) -5. Confirm the installation +1. Confirm the installation - ![AppCenter confirm](https://github.com/openhab/openhab-qnap-qpkg/raw/master/docs/QTS_4.2.0_AppCenter%20confirm.png) + ![AppCenter confirm](https://raw.githubusercontent.com/openhab/openhab-qnap-qpkg/main/docs/QTS_4.2.0_AppCenter%20confirm.png) -6. Wait while the package is being installed +1. Wait while the package is being installed - ![AppCenter installing](https://github.com/openhab/openhab-qnap-qpkg/raw/master/docs/QTS_4.2.0_AppCenter%20installing.png) - -7. When finished just close the dialog and wait for a while until openHAB has completely started. +1. When finished just close the dialog and wait for a while until openHAB has completely started. This may take several minutes. - ![AppCenter finished](https://github.com/openhab/openhab-qnap-qpkg/raw/master/docs/QTS_4.2.0_AppCenter%20finished.png) + ![AppCenter finished](https://raw.githubusercontent.com/openhab/openhab-qnap-qpkg/main/docs/QTS_4.2.0_AppCenter%20finished.png) -8. Access openHAB via "[http://NAS_IP_or_DNS_address:8090](#)". +1. Access openHAB via `http://NAS_IP_or_DNS_address:8090`. If the interface does not start, retry after another minute. The initial startup takes some time. @@ -52,9 +46,9 @@ Follow the instructions shown if a new version is announced when opening the adm If you want to keep configuration files, copy them to a save place outside of the openhab-path. -1. Go to the "App Center" and remove the app like any other. +1. Go to the "App Center" and remove the app like any other. -2. Additionally if wanted or needed, please remove the folders "addons", "conf" and "userdata" from the your directory, eg. "openHAB2" share or "Public"/openHAB2 +1. Additionally if wanted or needed, please remove the folders "addons", "conf" and "userdata" from the your directory, eg. "openHAB2" share or "Public"/openHAB2 If you have installed openHAB2 to `.qpkg` (see "How to install", third option) then all files get removed automatically. ## Known issues diff --git a/installation/rasppi.md b/installation/rasppi.md deleted file mode 100644 index c31794889..000000000 --- a/installation/rasppi.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -layout: documentation -title: Raspberry Pi ---- - -{% include base.html %} - -# Raspberry Pi - -Because of its **low price**, its **small form factor** and the **low energy consumption**, the [Raspberry Pi](https://www.raspberrypi.org) is a quite popular platform for openHAB. -It is favored amongst existing users and a recommended choice for newcomers. - -![Raspberry Pi 2 Model B](images/rpi2b.png) - -If you want to learn more about the possibilities of the Raspberry Pi and Linux in general, many tutorials can be found on the internet. -These including the official [raspberrypi.org help articles](https://www.raspberrypi.org/help) or the in-detail articles at [eLinux.org](https://elinux.org/RPi_Tutorials). - -Recommendations for a ["headless"](https://en.wikipedia.org/wiki/Headless_computer) hardware setup: - -- [Raspberry Pi 2 or better](https://en.wikipedia.org/wiki/Raspberry_Pi#Specifications), compare your existing device [here](https://en.wikipedia.org/wiki/Raspberry_Pi#Connectors) if you are unsure. -- SD card (16GB or more to support [wear-leveling](https://en.wikipedia.org/wiki/Wear_leveling)) -- Steady power supply -- Ethernet connection -- *No connected display or keyboard needed* - -## Recommended Setup - -We are proud to provide a **preconfigured image** for the Raspberry Pi, with the latest build of openHAB and many useful software components (like Samba, Grafana or Mosquitto) as optional setup steps. -The image provided by the **openHABian** projects is based on Raspbian and under constant improvement. - -Check out more details about [openHABian, the hassle-free openHAB setup](openhabian.html). - -## Manual Setup - -If you want or need to set up openHAB on a Raspberry Pi by yourself, please follow these recommendations. -For the beginning, we recommend to [download](https://www.raspberrypi.org/downloads/raspbian) and [install](https://www.raspberrypi.org/documentation/installation/installing-images/README.md) the latest Raspbian SD card image. -You may choose the "Lite" version. - -**Attention:** -As of the November 2016 release, Raspbian has the SSH server disabled by default. -You will have to enable it manually. -For headless setup, SSH can be enabled by placing a file named "ssh", without any extension, onto the boot partition of the SD card. - -**Connecting:** -Get your SD card and network cable plugged in and power up. -Booting up takes up to 10 minutes. -To connect with an SSH client (like [Putty](https://www.raspberrypi.org/documentation/remote-access/ssh/windows.md)), you need to know the IP address or hostname of your device. -A standard Raspbian setup should be reachable either by the hostname "raspberrypi" or though the local domain name "raspberrypi.local". -If you are not able to connect, check your routers web frontend for newly connected devices. - -**First Steps:** -Connected via SSH, execute the Raspbian configuration menu by running `sudo raspi-config`. -Go through the following steps: - -- Expand the file system -- Change your password -- (Change the host name if you wish, e.g. "openhabpi") -- From the advanced menu, change the memory split for the GPU to "16" -- Restart - -As a good practice, run a full upgrade and install packages you like or need (a set of helpful packages is given as an example): - -```shell -sudo apt-get update -sudo apt-get upgrade - -sudo apt-get install screen mc vim git htop -``` - -**Note on Java:** -Raspbian in the latest full version already includes Oracle Java 11. -However, at the time of this writing, the installed revision is lower than the [recommended](index.html#prerequisites). -Raspbian Lite comes without Java to begin with. - -Please refer to the Linux article for instructions on [how to install the latest Java 11 revision](linux.html). - -**Installation:** -Finally install openHAB on your Raspberry Pi, just as it is described in the [openHAB on Linux](linux.html) article: - -- [Package Repository based Installation on Linux](linux.html#package-repository-installation) diff --git a/installation/security.md b/installation/security.md index 66f1f4898..6ad4ec69b 100644 --- a/installation/security.md +++ b/installation/security.md @@ -3,14 +3,12 @@ layout: documentation title: Securing Communication and Access --- -{% include base.html %} - # Securing access to openHAB openHAB has mainly two ways to be accessed: 1. Through the command line console, which is done through SSH and thus always authenticated and encrypted. You will find all details about this in the [Console documentation](/docs/administration/console.html). -2. Through HTTP(S), which we will look at in the following. +1. Through HTTP(S), which we will look at in the following. {::options toc_levels="2..3"/} @@ -22,10 +20,10 @@ openHAB has mainly two ways to be accessed: ### Webserver Ports openHAB has a built-in webserver, which listens on port 8080 for HTTP and 8443 for HTTPS requests. -In general, it is advised to use HTTPS communication over HTTP. +In general, it is advised to use HTTPS in perefence to HTTP. The default ports 8080 and 8443 can be changed by setting the environment variables `OPENHAB_HTTP_PORT` resp. `OPENHAB_HTTPS_PORT`. -In an apt installation, you would best do this in the file `/etc/default/openhab2`. +In an apt installation, you would best do this in the file `/etc/default/openhab`. ### SSL Certificates @@ -33,6 +31,9 @@ On the very first start, openHAB generates a personal (self-signed, 256-bit ECC) This process makes sure that every installation has an individual certificate, so that nobody else can falsely mimic your server. Note that on slow hardware, this certificate generation can take up to several minutes, so be patient on a first start - it is all for your own security. +If you wish, you can import your own certificate into this keystore. +Please ensure that you remove the old certificate and give the new certificate the same alias as the old one (otherwise, the App might still be presented the old certificate). + ## Authentication and Access Control openHAB does not (yet) support restricting access through HTTP(S) for certain users - there is no authentication in place, nor is there a limitation of functionality or information that different users can access. @@ -62,12 +63,13 @@ There are many different solutions for VPN, so we cannot give any specific advic ### myopenHAB Cloud Service -You can use an [openHAB Cloud](https://github.com/openhab/openhab-cloud/blob/master/README.md) instance to which openHAB creates a tunnel connection and which forwards all requests through this tunnel. +You can use an [openHAB Cloud](https://github.com/openhab/openhab-cloud/blob/main/README.md) instance to which openHAB creates a tunnel connection and which forwards all requests through this tunnel. openHAB will see these incoming requests as originating from the local loopback interface. The simplest way to get hold of such an openHAB Cloud is to register an account at [myopenHAB.org](https://www.myopenhab.org/), which is operated by the [openHAB Foundation](https://www.openhabfoundation.org/). {: #nginx-reverse-proxy} + ### Running openHAB Behind a Reverse Proxy A reverse proxy simply directs client requests to the appropriate server. @@ -105,11 +107,13 @@ The good news is that [openHABian](openhabian) already offers the possibility to - [Further Reading](#nginx-further-reading) {: #nginx-setup} + #### Setting up NGINX These are the steps required to use [**NGINX**](https://nginx.org), a lightweight HTTP server, although you can use **Apache HTTP** server or any other HTTP server which supports reverse proxying. {: #nginx-setup-install} + ##### Installation NGINX runs as a service in most Linux distributions, installation should be as simple as: @@ -122,6 +126,7 @@ Once installed, you can test to see if the service is running correctly by going If you don't, you may need to check your firewall or ports and check if port 80 (and 443 for HTTPS later) is not blocked and that services can use it. {: #nginx-setup-config} + ##### Basic Configuration NGINX configures the server when it starts up based on configuration files. @@ -135,12 +140,19 @@ server { listen 80; server_name mydomain_or_myip; + # Cross-Origin Resource Sharing + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow_Credentials' 'true' always; + add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always; + location / { proxy_pass http://localhost:8080/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 3600; } } ``` @@ -168,17 +180,14 @@ sudo service nginx restart ...and then go to `http://mydomain_or_myip` to see your openHAB server. {: #nginx-auth} + #### Authentication with NGINX For further security, you may wish to ask for a **username and password** before users have access to openHAB. This is fairly simple in NGINX once you have the reverse proxy setup, you just need to provide the server with a basic authentication user file. -::: tip Note -There is currently an issue with Proxy Authentication and HABmin when using some browsers. -If you require HABmin, consider connecting locally or using Safari for now. -::: - {: #nginx-auth-user} + ##### Creating the First User You will be using *htpasswd* to generate a username/password file, this utility can be found in the apache2-utils package: @@ -197,6 +206,7 @@ You will receive a prompt to create a password for this username, once finished You're then free to reference the file to NGINX. {: #nginx-auth-file} + ##### Referencing the File in the NGINX Configuration Now the configuration file (`/etc/nginx/sites-enabled/openhab`) needs to be edited to use this password. @@ -207,9 +217,20 @@ Open the configuration file and **add** the following lines underneath the proxy auth_basic_user_file /etc/nginx/.htpasswd; ``` +##### Add authorization and cookie directives in NGINX Configuration + +This is an important new requirment in openHAB 3.0 and later versions. +This is not required prior to openHAB 3.0. You must add the following two directives underneath the `add_header` (in the `server` block) and `proxy_set_header` (in the `location /` block) items respectively: + +```nginx + add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1; + proxy_set_header Authorization ""; +``` + Once done, **test and restart your NGINX service** and authentication should now be enabled on your server! {: #nginx-auth-users} + ##### Adding or Removing users To add new users to your site, you must use following command, **do not** use the `-c` modifier again as this will remove all previously created users: @@ -227,6 +248,7 @@ sudo htpasswd -D /etc/nginx/.htpasswd username Once again, any changes you make to these files **must be followed with restarting the NGINX service** otherwise no changes will be made. {: #nginx-satisfy} + #### Making Exceptions for Specific IP addresses It is often desirable to allow specific IPs (e.g. the local network) to access openHAB without needing to prompt for a password or to block everyone else entirely. @@ -244,6 +266,7 @@ NGINX will allow anyone within the 192.168.0.0/24 range **and** the localhost to If you have setup a password following the previous section, then the rest will be prompted for a password for access. {: #nginx-domain} + #### Setting up a Domain To generate a trusted certificate, you need to own a domain. To acquire your own domain, you can use one of the following methods: @@ -255,6 +278,7 @@ To generate a trusted certificate, you need to own a domain. To acquire your own | Using a "Dynamic DNS" sevice | [No-IP](https://www.noip.com), [Dyn](https://www.dyn.com/dns), [FreeDNS](https://freedns.afraid.org) | Uses a client to automatically update your IP to a domain of you choice, some Dynamic DNS services (like FreeDNS) offer a free domain too. | {: #nginx-https} + #### Enabling HTTPS Encrypting the communication between client and the server is important because it protects against eavesdropping and possible forgery. @@ -264,6 +288,7 @@ If you have a **valid domain and can change the DNS** to point towards your IP, If you need to use an internal or external IP to connect to openHAB, follow the [instructions for OpenSSL](#nginx-openssl) {: #nginx-openssl} + #### Using OpenSSL to Generate Self-Signed Certificates OpenSSL is also packaged for most Linux distributions, installing it should be as simple as: @@ -288,6 +313,7 @@ You will be prompted for some information which you will need to fill out for th Common Name (e.g. server FQDN or YOUR name) []: xx.xx.xx.xx {: #nginx-openssl-add} + ##### Adding the Certificates to Your Proxy Server The certificate and key should have been placed in `/etc/ssl/`. @@ -300,13 +326,17 @@ In the NGINX configuration, place the following underneath your `server_name` va ``` {: #nginx-letsencrypt} + #### Using Let's Encrypt to Generate Trusted Certificates -**Skip this step if you have no domain name or have already followed the instructions for OpenSSL** +::: tip +Skip this step if you have no domain name or have already followed the instructions for OpenSSL +::: Let's Encrypt is a service that allows anyone with a valid domain to automatically generate a trusted certificate, these certificates are usually accepted by a browser without any warnings. {: #nginx-letsencrypt-generation} + ##### Setting up the NGINX Proxy Server to Handle the Certificate Generation Procedure Let's Encrypt needs to validate that the server has control of the domain. @@ -328,6 +358,7 @@ Next add the new location parameter to your NGINX config, this should be **place ``` {: #nginx-letsencrypt-certbot} + ##### Using Certbot Certbot is a tool which simplifies the process of obtaining secure certificates. @@ -339,6 +370,7 @@ sudo certbot certonly --webroot -w /var/www/mydomain -d mydomain ``` {: #nginx-letsencrypt-add} + ##### Adding the Certificates to Your Proxy Server The certificate and key should have been placed in `/etc/letsencrypt/live/mydomain_or_myip`. @@ -352,6 +384,7 @@ In the NGINX configuration, place the following underneath your server_name vari ``` {: #nginx-https-listen} + #### Setting Your NGINX Server to Listen to the HTTPS Port Regardless of the option you choose, make sure you change the port to listen in on HTTPS traffic. @@ -366,6 +399,7 @@ You can check by going to `https://mydomain_or_myip` and confirming with your br If you want to keep hold of a HTTP server for some reason, just add `listen 80;` and remove the Strict-Transport-Security line. {: #nginx-httpredirect} + #### Redirecting HTTP Traffic to HTTPS You may want to redirect all HTTP traffic to HTTPS, you can do this by adding the following to the NGINX configuration. @@ -391,6 +425,7 @@ server { ``` {: #nginx-summary} + #### Putting it All Together After following all the steps on this page, you *should* have a NGINX server configuration (`/etc/nginx/sites-enabled/openhab`) that looks like this: @@ -405,6 +440,15 @@ server { listen 443 ssl; server_name mydomain_or_myip; + # Cross-Origin Resource Sharing. + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow_Credentials' 'true' always; + add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always; + + # openHAB 3 api authentication + add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1; + ssl_certificate /etc/letsencrypt/live/mydomain/fullchain.pem; # or /etc/ssl/openhab.crt ssl_certificate_key /etc/letsencrypt/live/mydomain/privkey.pem; # or /etc/ssl/openhab.key add_header Strict-Transport-Security "max-age=31536000"; # Remove if using self-signed and are having trouble. @@ -417,6 +461,7 @@ server { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; + proxy_set_header Authorization ""; satisfy any; allow 192.168.0.0/24; allow 127.0.0.1; @@ -431,7 +476,9 @@ server { } } ``` + {: #synology-remote-config} + #### Configuration on Synology DiskStation Synology DSM (as of 6.2) has the ability to automatically acquire certificates from Let's Encrypt and renew them every 90 days as required. @@ -479,7 +526,7 @@ Create two reverse proxies as follows: |Destination Hostname: |localhost | |Destination Port: |8080 (or whichever HTTP port your openHAB instance is on)| -Verify that the reverse proxy is working as expected - try http://your-hostname.com and https://your-hostname.com - you should end up at the openHAB landing page in both cases, but will get a security warning for the https site. +Verify that the reverse proxy is working as expected - try and - you should end up at the openHAB landing page in both cases, but will get a security warning for the https site. Next, acquire certificates from Let's Encrypt using the GUI in DSM. @@ -509,7 +556,7 @@ If it's not selected, update it. |etc etc |synology.com | Once this is done, update the CAA record for your-hostname.com with your registrar (exact process will vary by registrar). -Within an hour or so, you should not receive the security warning for https://your-hostname.com. +Within an hour or so, you should not receive the security warning for . Next, you must add authentication to the reverse proxy. There's no GUI way to do this, so we need to create another small NGINX virtual host on the DiskStation. @@ -517,9 +564,11 @@ There's no GUI way to do this, so we need to create another small NGINX virtual Log into your DiskStation by SSH. Use the admin username and password. Create a .htpasswd file in your openHAB userdata folder (your userdata location may vary, update accordingly): + ```shell htpasswd -c /volume1/openHAB/userdata/.htpasswd username ``` + Next, add a very simple NGINX configuration similar to that created above, but without the SSL parameters. DSM comes with vi installed by default, but you may wish to [install nano](https://anto.online/other/how-to-install-nano-on-your-synology-nas/) @@ -542,6 +591,12 @@ server { listen 7443 ssl; #This is simply an unused port, it can be any number server_name your_domain.com; + add_header 'Access-Control-Allow-Origin' '*' always; + add_header 'Access-Control-Allow_Credentials' 'true' always; + add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range' always; + add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always; + add_header Set-Cookie X-OPENHAB-AUTH-HEADER=1; + location / { proxy_pass https://localhost:8443/; #Update the port number if needed proxy_set_header Host $http_host; @@ -550,6 +605,7 @@ server { proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; + proxy_set_header Authorization ""; satisfy any; allow 192.168.1.0/24; allow 127.0.0.1; @@ -560,11 +616,13 @@ server { } ``` + Once you are done, save the file, restart and test NGINX: ```shell sudo nginx -s reload && sudo nginx -t ``` + As above, the first part of the file redirects any HTTP queries to HTTPS directly. If you don't get any errors, update the reverse proxy settings in the DSM GUI to point to these new endpoints. Back in the GUI, go to Control Panel > Application Portal > Reverse Proxy, make the updates below: @@ -581,15 +639,18 @@ Back in the GUI, go to Control Panel > Application Portal > Reverse Proxy, make We do this 'double' redirect to take advantage of the GUI certificate handling in DSM - this is the equivalent of CertBot for a linux installation. ::: -Give it a try again - you should now get redirected to https://your-hostname.com from http://your-hostname.com, and should receive a username and password prompt before you see the openHAB landing page. +Give it a try again - you should now get redirected to `https://your-hostname.com` from `http://your-hostname.com`, and should receive a username and password prompt before you see the openHAB landing page. If you need to troubleshoot the nginx server, SSH into your DiskStation, and check the NGINX error log: + ```shell sudo tail -f /var/log/nginx/error.log ``` + This log will update in real-time, so do whatever it was that you were having issues with again, and you'll see the error. {: #nginx-https-security} + #### Additional HTTPS Security To test your security settings [SSL Labs](https://www.ssllabs.com/ssltest/) provides a tool for testing your domain against ideal settings (Make sure you check "Do not show the results on the boards" if you dont want your domain seen). @@ -624,6 +685,7 @@ Feel free to test the new configuration again on [SSL Labs](https://www.ssllabs. If you're achieving A or A+ here, then your client-openHAB communication is very secure. {: #nginx-further-reading} + #### Further Reading The setup above is a suggestion for high compatibility with an A+ rating at the time of writing, however flaws in these settings (particularly the cyphers) may become known overtime. diff --git a/installation/synology.md b/installation/synology.md index d1e6fcab5..514d7ebf1 100644 --- a/installation/synology.md +++ b/installation/synology.md @@ -3,8 +3,6 @@ layout: documentation title: Synology DiskStation --- -{% include base.html %} - # Synology DiskStation The [DiskStation by Synology](https://www.synology.com/en-us/dsm) is a famous NAS server solution for your home, allowing the installation of additional packages. @@ -41,12 +39,12 @@ Download the latest SPK package: [Releases](https://github.com/openhab/openhab-s The SPK is a wrapper to download the latest openHAB release and does not contain openHAB itself. 1. Login and open the DiskStation Manager. -2. Go to Control Panel → User → Advanced → User Home and check 'Enable user home service' -3. Go to Main Menu → Package Center. -4. Click on the Manual Install button. -5. Click "Choose File" and select the previously downloaded openHAB `.spk` file. -6. On the confirmation page: If you would like the package to run immediately after installation, make sure the box next to "Run after Installation" is ticked. -7. Click Apply to start installation. +1. Go to Control Panel → User → Advanced → User Home and check 'Enable user home service' +1. Go to Main Menu → Package Center. +1. Click on the Manual Install button. +1. Click "Choose File" and select the previously downloaded openHAB `.spk` file. +1. On the confirmation page: If you would like the package to run immediately after installation, make sure the box next to "Run after Installation" is ticked. +1. Click Apply to start installation. If your NAS cannot connect to the internet, the installer will tell you to download and place the ZIP file into your NAS public folder. @@ -54,8 +52,8 @@ If your NAS cannot connect to the internet, the installer will tell you to downl The location of configuration files by openHAB differs depending on wether or not a shared folder named `public` exists: -* with public share folder: `/volume1/public/openHAB2/conf/` -* without public share folder: `/volume1/@appstore/openHAB2/conf/` +- with public share folder: `/volume1/public/openHAB/conf/` +- without public share folder: `/volume1/@appstore/openHAB/conf/` For certain Synology models the `public` folder is created automatically during the first setup. The administrator can also create a public shared folder if desired. @@ -65,11 +63,11 @@ Refer to the Synology knowlegde base article on [Shared Folder](https://www.syno ## Logging -The openHAB2 log files can be found here: -`/volume1/@appstore/openHAB2/userdata/logs/`. +The openHAB log files can be found here: +`/volume1/@appstore/openHAB/userdata/logs/`. From Version openHAB-2.2.0.006 the SPK generates two log files located at `/var/log/`. -The first log file `openHAB2-install.log` will be generated during the installation. If you can't install the openHAB2 SPK, please have a look inside the file. +The first log file `openHAB-install.log` will be generated during the installation. If you can't install the openHAB SPK, please have a look inside the file. -The second log `openHAB2-start-stop.log` will be generated by starting and stopping openHAB2 inside the Package Manager. +The second log `openHAB-start-stop.log` will be generated by starting and stopping openHAB inside the Package Manager. diff --git a/installation/windows.md b/installation/windows.md index 97ae33a3b..cacdf5973 100644 --- a/installation/windows.md +++ b/installation/windows.md @@ -3,8 +3,6 @@ layout: documentation title: Windows --- -{% include base.html %} - # openHAB on Windows The following instructions will guide you through the process of setting up openHAB. @@ -16,38 +14,41 @@ This page is structured as follows: - TOC {:toc} -## Preparation of the environment. +## Preparation of the environment ### Before you start + Please be sure you have installed the required supporting applications as described in [Prerequisites]({{base}}/installation/index.html#prerequisites). +### Set the `JAVA_HOME` System Environment Variable in Windows -### Set the `JAVA_HOME` System Environment Variable in Windows. - - Navigate to: Control Panel ➡️ System and Security ➡️ System ➡️ Advanced System Settings ➡️ Environment Variables ➡️ System Variables - - Create a New System Variable named JAVA_HOME (or update the existing one) to match the installation directory of the Java Platform chosen and installed in the step [Prerequisites]({{base}}/installation/index.html#prerequisites). +- Navigate to: Control Panel ➡️ System and Security ➡️ System ➡️ Advanced System Settings ➡️ Environment Variables ➡️ System Variables +- Create a New System Variable named JAVA_HOME (or update the existing one) to match the installation directory of the Java Platform chosen and installed in the step [Prerequisites]({{base}}/installation/index.html#prerequisites). ![JAVA_HOME](images/JAVA_HOME.png) -### Choose a folder name for the openHAB installation. +### Choose a folder name for the openHAB installation + The name must **contain no spaces**. On this page, we will be using `C:\openHAB` as an example. ## Installation ### Install openHAB + The openHAB runtime is distributed using a platform-independent zip file. To install it, follow these simple steps: -1. Download the latest Windows Stable or Snapshot ZIP archive file for manual installation from the [Download](https://www.openhab.org/download/) page. +1. Download the latest Windows Stable or Snapshot ZIP archive file for manual installation from the [Download](https://www.openhab.org/download/) page. -2. Unzip the file in your chosen directory (e.g. `C:\openHAB`) +1. Unzip the file in your chosen directory (e.g. `C:\openHAB`) ![openHAB Folders](images/openHAB_Folders.png) -3. Start the server: Launch the runtime by executing the script `C:\openHAB\start.bat` and wait a while for it to start and complete. +1. Start the server: Launch the runtime by executing the script `C:\openHAB\start.bat` and wait a while for it to start and complete. ![Karaf_Windows](images/Karaf_Windows.png) -4. Point your browser to `http://localhost:8080`. +1. Point your browser to `http://localhost:8080`. You should be looking at the openHAB page requesting you to set up an administrator username and password: ![Home_OH_adminCreate](images/Home_OH_adminCreate.png) @@ -63,10 +64,11 @@ By installing the openHAB process as a service in Windows, you can: - Launch it automatically upon system startup - Run it in the background -**Windows Service Installation Steps** +#### Windows Service Installation Steps + +1. Complete the [prerequisites](#prerequisites) and regular [installation](#installation) steps. +1. Issue the following two commands in your openHAB console: -1. Complete the [prerequisites](#prerequisites) and regular [installation](#installation) steps. -2. Issue the following two commands in your openHAB console: ```shell feature:install service-wrapper wrapper:install --name "openHAB" --display "openHAB" --description "openHAB Service" @@ -74,12 +76,12 @@ By installing the openHAB process as a service in Windows, you can: ![Wrapper Install_Windows](images/Wrapper_Install_Windows.jpg) -3. Shutdown the openHAB instance by typing `logout` in the currently running console. +1. Shutdown the openHAB instance by typing `logout` in the currently running console. -4. Update the newly created `C:\openHAB\userdata\etc\openHAB-wrapper.conf` to include all necessary parameters: +1. Update the newly created `C:\openHAB\userdata\etc\openHAB-wrapper.conf` to include all necessary parameters: - - Copy all the config text from the below section and paste it in your `openHAB-wrapper.conf`, replacing all existing content. - - Adapt the first entry (`OPENHAB_HOME`) to match your openHAB installation directory. + 1. Copy all the config text from the below section and paste it in your `openHAB-wrapper.conf`, replacing all existing content. + 1. Adapt the first entry (`OPENHAB_HOME`) to match your openHAB installation directory. ```conf #******************************************************* @@ -121,7 +123,7 @@ By installing the openHAB process as a service in Windows, you can: wrapper.java.additional.8=-Dopenhab.home="%OPENHAB_HOME%" wrapper.java.additional.9=-Dopenhab.conf="%OPENHAB_HOME%\conf" wrapper.java.additional.10=-Dopenhab.runtime="%OPENHAB_HOME%\runtime" - wrapper.java.additional.11-Dopenhab.userdata="%OPENHAB_HOME%\userdata" + wrapper.java.additional.11=-Dopenhab.userdata="%OPENHAB_HOME%\userdata" wrapper.java.additional.12=-Dopenhab.logdir="%OPENHAB_USERDATA%\logs" wrapper.java.additional.13=-Dfelix.cm.dir="%OPENHAB_HOME%\userdata\config" wrapper.java.additional.14=-Dorg.osgi.service.http.port=8080 @@ -150,7 +152,7 @@ By installing the openHAB process as a service in Windows, you can: wrapper.ntservice.interactive=false ``` -5. Open an elevated command prompt and type the following commands: +1. Open an elevated command prompt and type the following commands: ```text C:\openHAB\userdata\bin\openHAB-service.bat install @@ -161,18 +163,13 @@ By installing the openHAB process as a service in Windows, you can: ![Wrapper_Start_Windows](images/Wrapper_Start_Windows.jpg) -6. Your openHAB Windows service is now installed and running. - Validate proper operations by: +1. Your openHAB Windows service is now installed and running. - - Browsing to [http://localhost:8080](http://localhost:8080) - - - Verifying that the Windows Service is running and set to Automatic Startup type. - Use `services.msc` and find the `openHAB` service. - - ![Windows Service](images/Windows_Service.jpg) - - - Logging in with an SSH client to the console (see info below) + Validate proper operations by browsing to `http://localhost:8080` and verifying that the Windows Service is running and set to Automatic Startup type. + Use `services.msc` and find the `openHAB` service. + Or by logging in with an SSH client to the console (see info below) + ![Windows Service](images/Windows_Service.jpg) ### File Locations @@ -188,13 +185,14 @@ Assuming a successful install, you will now have various folders inside `C:\open | Service configuration | `C:\openHAB\userdata\etc` | ## What next? + You can: + - continue reading the [Additional steps]({{base}}/installation/index.md#additional-steps) section of the Installation overview - read more about how to handle basic maintenance tasks, in the section below ## Maintenance - ### Backup Make sure that you make regular backups of the **conf** and **userdata** folders, you can zip and unzip these folders too and from openHAB installations (even across most versions). @@ -211,15 +209,19 @@ cd C:\openHAB . .\runtime\bin\update.ps1 Update-openHAB -OHVersion x.x.x ``` + Now that openHAB has updated, you only need to run the above commands again for future versions. ### Uninstallation + - perform a backup as described above - uninstall openHAB as a Windows service: run PowerShell as an administrator and use the following commands -``` + +```text net stop openHAB C:\openHAB\userdata\bin\openHAB-service.bat remove ``` + - you can delete the whole contents of the C:\openHAB\ folder. ### Connecting to the openHAB console @@ -227,13 +229,16 @@ C:\openHAB\userdata\bin\openHAB-service.bat remove You can connect to openHAB's console using the the `C:\openHAB\runtime\bin\client.bat` script on the local machine. Alternatively, you can use a standard SSH client: -- Install an SSH client application, e.g., [Putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html), [KiTTY](http://kitty.9bis.net/) or [Xshell 5](https://www.netsarang.com/products/xsh_overview.html) +1. Install an SSH client application, e.g., [Putty](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html), [KiTTY](http://kitty.9bis.net/) or [Xshell 5](https://www.netsarang.com/products/xsh_overview.html) -- Setup a session with the following parameters: - - Host: 127.0.0.1 - - Port: 8101 - - Username: `openhab` - - Password: `habopen` +1. Setup a session with the following parameters: + + ```text + Host: 127.0.0.1 + Port: 8101 + Username: openhab + Password: habopen + ``` ![SSH Connection 1](images/SSH_Connection_1.jpg) diff --git a/introduction.md b/introduction.md index 17eab09e6..cb7e85263 100644 --- a/introduction.md +++ b/introduction.md @@ -38,10 +38,10 @@ Some of openHAB's strengths are: Home automation is fascinating and requires a considerable investment of your time. Here are some key considerations especially for new users. To be successful, you will need to: -* Start slowly and proceed one step at a time -* Be prepared to learn -* Remain flexible in how you want to achieve your goal -* Celebrate all the small successes +- Start slowly and proceed one step at a time +- Be prepared to learn +- Remain flexible in how you want to achieve your goal +- Celebrate all the small successes Remember, openHAB is just a computer program. The computer will only do what *you* tell it to do. @@ -51,9 +51,9 @@ openHAB is fully customizable, but doing so will require substantial effort on y After you have read the documentation for openHAB, you will have: -* Identified a computer on which to run openHAB -* Learned how to install openHAB, as well as all other software that is needed to run openHAB (e.g. Java) -* Learned how your smart devices communicate with openHAB; how to make openHAB give commands to your smart devices; and how you can interact with openHAB +- Identified a computer on which to run openHAB +- Learned how to install openHAB, as well as all other software that is needed to run openHAB (e.g. Java) +- Learned how your smart devices communicate with openHAB; how to make openHAB give commands to your smart devices; and how you can interact with openHAB Keep your focus. For almost everything, there is more than one way in openHAB to achieve a goal or perform a task. @@ -163,13 +163,13 @@ Once you have got a first overview, it is time to practice. Here a short list of the steps that you will need to consider to get openHAB up and running as your home automation system: 1. Install openHAB -2. If you already own a smart device, search the addons for the brand or technology used by that device (or simply browse the list of [add-ons](/addons/) for any technologies or services you may recognize) -3. Install a binding (in openHAB) -4. Define a “thing” -5. Add a “channel” to the “thing” if not created by the binding -6. Define an “item” -7. Link the “channel” to your “item” -8. Establish a sitemap +1. If you already own a smart device, search the addons for the brand or technology used by that device (or simply browse the list of [add-ons](/addons/) for any technologies or services you may recognize) +1. Install a binding (in openHAB) +1. Define a “thing” +1. Add a “channel” to the “thing” if not created by the binding +1. Define an “item” +1. Link the “channel” to your “item” +1. Establish a sitemap Most of the above can be done in openHAB through point-and-click processes in a graphical user interface. But remember, there is always more than one way to achieve your goal in openHAB. diff --git a/package-lock.json b/package-lock.json index 1b51abba0..073d607a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,400 +1,14176 @@ { "name": "openhab-docs", "version": "3.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, - "dependencies": { - "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", - "requires": { - "@babel/highlight": "7.9.0" - } - }, - "@babel/compat-data": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.6.tgz", - "integrity": "sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==", - "requires": { - "browserslist": "4.12.0", - "invariant": "2.2.4", - "semver": "5.7.1" - } - }, - "@babel/core": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", - "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", - "requires": { - "@babel/code-frame": "7.8.3", - "@babel/generator": "7.9.6", - "@babel/helper-module-transforms": "7.9.0", - "@babel/helpers": "7.9.6", - "@babel/parser": "7.9.6", - "@babel/template": "7.8.6", - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6", - "convert-source-map": "1.7.0", - "debug": "4.1.1", - "gensync": "1.0.0-beta.1", - "json5": "2.1.3", - "lodash": "4.17.15", - "resolve": "1.12.0", - "semver": "5.7.1", - "source-map": "0.5.7" - }, + "packages": { + "": { + "version": "3.0.0", + "license": "EPL-2.0", "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } + "vue-tabs-component": "^1.5.0", + "vuepress": "^1.5.0", + "vuepress-plugin-container": "^2.1.4", + "vuepress-plugin-tabs": "^0.3.0", + "webpack-serve": "^3.1.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + }, + "node_modules/@babel/core": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", + "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.15", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.14", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "dependencies": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", + "dependencies": { + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", + "dependencies": { + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", + "dependencies": { + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", + "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz", + "integrity": "sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.11", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", + "dependencies": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", + "dependencies": { + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", + "dependencies": { + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", + "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", + "dependencies": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.14", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", + "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", + "dependencies": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/@babel/traverse": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", + "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.15", + "@babel/types": "^7.13.14", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/types": { + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'" + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained" + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dependencies": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.scandir/node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "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==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + }, + "node_modules/@types/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" + }, + "node_modules/@types/node": { + "version": "14.14.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", + "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.5.tgz", + "integrity": "sha512-Jtipy7oI0am5e1q5Ahunm/cCcCh5ssf5VkMQsLR383S3un5Qh7NBfxgSK9kmWf4IXJEhDeYp9kHv8G/EnMai9A==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.12.tgz", + "integrity": "sha512-8q67ORQ9O0Ms0nlqsXTVhaBefRBaLrzPxOewAZhdcO7onHwcO5/wRdWtHhZgfpCZlhY7NogkU16z3WnorSSkEA==", + "dependencies": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.0.0-0" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true } } }, - "@babel/generator": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", - "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "node_modules/@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/@vuepress/core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.8.2.tgz", + "integrity": "sha512-lh9BLC06k9s0wxTuWtCkiNj49fkbW87enp0XSrFZHEoyDGSGndQjZmMMErcHc5Hx7nrW1nzc33sPH1NNtJl0hw==", + "dependencies": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.8.2", + "@vuepress/markdown-loader": "1.8.2", + "@vuepress/plugin-last-updated": "1.8.2", + "@vuepress/plugin-register-components": "1.8.2", + "@vuepress/shared-utils": "1.8.2", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", + "webpackbar": "3.2.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@vuepress/markdown": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.8.2.tgz", + "integrity": "sha512-zznBHVqW+iBkznF/BO/GY9RFu53khyl0Ey0PnGqvwCJpRLNan6y5EXgYumtjw2GSYn5nDTTALYxtyNBdz64PKg==", + "dependencies": { + "@vuepress/shared-utils": "1.8.2", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "node_modules/@vuepress/markdown-loader": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.8.2.tgz", + "integrity": "sha512-mWzFXikCUcAN/chpKkqZpRYKdo0312hMv8cBea2hvrJYV6y4ODB066XKvXN8JwOcxuCjxWYJkhWGr+pXq1oTtw==", + "dependencies": { + "@vuepress/markdown": "1.8.2", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "node_modules/@vuepress/plugin-active-header-links": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.8.2.tgz", + "integrity": "sha512-JmXAQg8D7J8mcKe2Ue3BZ9dOCzJMJXP4Cnkkc/IrqfDg0ET0l96gYWZohCqlvRIWt4f0VPiFAO4FLYrW+hko+g==", + "dependencies": { + "lodash.debounce": "^4.0.8" + } + }, + "node_modules/@vuepress/plugin-last-updated": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.8.2.tgz", + "integrity": "sha512-pYIRZi52huO9b6HY3JQNPKNERCLzMHejjBRt9ekdnJ1xhLs4MmRvt37BoXjI/qzvXkYtr7nmGgnKThNBVRTZuA==", + "dependencies": { + "cross-spawn": "^6.0.5" + } + }, + "node_modules/@vuepress/plugin-nprogress": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.8.2.tgz", + "integrity": "sha512-3TOBee2NM3WLr1tdjDTGfrAMggjN+OlEPyKyv8FqThsVkDYhw48O3HwqlThp9KX7UbL3ExxIFBwWRFLC+kYrdw==", + "dependencies": { + "nprogress": "^0.2.0" + } + }, + "node_modules/@vuepress/plugin-register-components": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.8.2.tgz", + "integrity": "sha512-6SUq3nHFMEh9qKFnjA8QnrNxj0kLs7+Gspq1OBU8vtu0NQmSvLFZVaMV7pzT/9zN2nO5Pld5qhsUJv1g71MrEA==", + "dependencies": { + "@vuepress/shared-utils": "1.8.2" + } + }, + "node_modules/@vuepress/plugin-search": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.8.2.tgz", + "integrity": "sha512-JrSJr9o0Kar14lVtZ4wfw39pplxvvMh8vDBD9oW09a+6Zi/4bySPGdcdaqdqGW+OHSiZNvG+6uyfKSBBBqF6PA==" + }, + "node_modules/@vuepress/shared-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.8.2.tgz", + "integrity": "sha512-6kGubc7iBDWruEBUU7yR+sQ++SOhMuvKWvWeTZJKRZedthycdzYz7QVpua0FaZSAJm5/dIt8ymU4WQvxTtZgTQ==", + "dependencies": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + } + }, + "node_modules/@vuepress/theme-default": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.8.2.tgz", + "integrity": "sha512-rE7M1rs3n2xp4a/GrweO8EGwqFn3EA5gnFWdVmVIHyr7C1nix+EqjpPQF1SVWNnIrDdQuCw38PqS+oND1K2vYw==", + "dependencies": { + "@vuepress/plugin-active-header-links": "1.8.2", + "@vuepress/plugin-nprogress": "1.8.2", + "@vuepress/plugin-search": "1.8.2", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "dependencies": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/algoliasearch/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/algoliasearch/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/algoliasearch/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dependencies": { + "string-width": "^3.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "dependencies": { + "immediate": "^3.2.3" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "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==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/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==" + }, + "node_modules/boxen/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/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==", + "dependencies": { + "has-flag": "^4.0.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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/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" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", + "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001208", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.712", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/buffer/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.2.tgz", + "integrity": "sha512-w0bH1IF9rEjdi0a6lTtlXYT+vBZEJL9oytaXXRdsD68MH6+SrZGOGsu7s2saHQvYXqwo/wBdkW75tt8wFpj+mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cache-loader/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cache-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cache-loader/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001211", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001211.tgz", + "integrity": "sha512-v3GXWKofIkN3PkSidLI5d1oqeKNsam9nQkqieoMhP87nxOY0RPDC8X2+jcv8pjV4dRozPLSoMqNii9sDViOlIg==" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "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==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/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==", + "engines": { + "node": ">=0.10.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==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.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==", + "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/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cookies/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "node_modules/copy-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.2.tgz", + "integrity": "sha512-W+2oVYeNghuBr3yTzZFQ5rfmjZtYB/Ubg87R5YOmlGrIb+Uw9f7qjUbhsj+/EkXhcV7eOD3jiM4+sgraX3FZUw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.2.tgz", + "integrity": "sha512-IGHnpuaM1N++gLSPI1F1wu3WXICPxSyj/Q++clcwsIOnUVp5uKUIPl/+6h0TQ112KU3fMiSxqJuM+OrCyKj5+A==", + "dependencies": { + "browserslist": "^4.16.4", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.10.2.tgz", + "integrity": "sha512-uu18pVHQ21n4mzfuSlCXpucu5VKsck3j2m5fjrBOBqqdgWAxwdCgUuGWj6cDDPN1zLj/qtiqKvBMxWgDeeu49Q==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dependencies": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/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==", + "engines": { + "node": ">=0.10.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==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", + "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "dependencies": { + "xregexp": "^4.2.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "dependencies": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "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==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", + "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "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==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dependencies": { + "esprima": "^4.0.0", + "through": "~2.3.4" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "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==" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.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==", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "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==", + "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.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + }, + "node_modules/gray-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", + "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", + "dependencies": { + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/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" + } + ] + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=", + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hogan.js/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "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==", + "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.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", + "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "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": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "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==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "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==", + "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-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" + }, + "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==" + }, + "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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "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==" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/koa": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "node_modules/koa-compress": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", + "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", + "dependencies": { + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "koa-is-json": "^1.0.0", + "statuses": "^1.0.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/koa-connect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/koa-connect/-/koa-connect-2.1.0.tgz", + "integrity": "sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==" + }, + "node_modules/koa-convert": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", + "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/koa-convert/node_modules/koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" + }, + "node_modules/koa-route": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", + "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", + "dependencies": { + "debug": "*", + "methods": "~1.1.0", + "path-to-regexp": "^1.2.0" + } + }, + "node_modules/koa-route/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/koa-route/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/node_modules/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/koa/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/koa/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "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==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha1-BJGTngvuVkPuSUp+PaPSuscMbKQ=" + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevelnext": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-3.0.1.tgz", + "integrity": "sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA==", + "engines": { + "node": ">= 6.14.4" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dependencies": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "peerDependencies": { + "markdown-it": "*" + } + }, + "node_modules/markdown-it-chain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", + "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", + "dependencies": { + "webpack-chain": "^4.9.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "markdown-it": ">=5.0.0" + } + }, + "node_modules/markdown-it-chain/node_modules/javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=" + }, + "node_modules/markdown-it-chain/node_modules/webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + }, + "node_modules/markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha1-ABm0P9Au7+zi8ZYKKJX7qBpARpU=" + }, + "node_modules/markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=" + }, + "node_modules/markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", + "engines": { + "node": ">6.4.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dependencies": { + "mime-db": "1.47.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "node_modules/nanoid": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "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==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/node-releases": { + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", + "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==", + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "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==", + "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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz", + "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/postcss/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "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==", + "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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "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/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", + "dependencies": { + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg/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==", + "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/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "dependencies": { + "object-keys": "^1.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "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==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "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": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "dependencies": { + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/resolve-path/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "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==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/smoothscroll-polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", + "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "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": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", + "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", + "dependencies": { + "ci-info": "^3.0.0" + } + }, + "node_modules/std-env/node_modules/ci-info": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz", + "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==" + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "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": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dependencies": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + }, + "peerDependencies": { + "stylus": ">=0.52.4" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/superstruct": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.12.2.tgz", + "integrity": "sha512-yu+WNa/nSbFa+VBeR2KibfCeIQSKh/aD7G5eFD4Rx4W36MWE3G6SzU3BixDOArLv56u2bz6YEePsHSsioojuXw==" + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/terser-webpack-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha1-hzivi9lxIK0dQEeXKtpVY7+UebE=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "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==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, + "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==", + "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==" + }, + "node_modules/uglify-js/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "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==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "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==", + "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/update-notifier/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==" + }, + "node_modules/update-notifier/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/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==", + "dependencies": { + "has-flag": "^4.0.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": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dependencies": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "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": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/vue": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" + }, + "node_modules/vue-loader": { + "version": "15.9.6", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", + "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==" + }, + "node_modules/vue-server-renderer": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz", + "integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==", + "dependencies": { + "chalk": "^1.1.3", + "hash-sum": "^1.0.2", + "he": "^1.1.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.2.0", + "serialize-javascript": "^3.1.0", + "source-map": "0.5.6" + } + }, + "node_modules/vue-server-renderer/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/vue-server-renderer/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-server-renderer/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-tabs-component": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/vue-tabs-component/-/vue-tabs-component-1.5.0.tgz", + "integrity": "sha512-ld4p+hv49Fimw+zv/7GQqMhbjAHjpbWF3UiJtmMaSnvLKbsB1ysfs9dQH0SZ8NvdYpqqKay/VLIqR9yXgse1Sg==", + "peerDependencies": { + "vue": "^2.3.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" + }, + "node_modules/vuepress": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.8.2.tgz", + "integrity": "sha512-BU1lUDwsA3ghf7a9ga4dsf0iTc++Z/l7BR1kUagHWVBHw7HNRgRDfAZBDDQXhllMILVToIxaTifpne9mSi94OA==", + "hasInstallScript": true, + "dependencies": { + "@vuepress/core": "1.8.2", + "@vuepress/theme-default": "1.8.2", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "bin": { + "vuepress": "cli.js" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/vuepress-html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "engines": { + "node": "*" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/vuepress-plugin-container": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", + "dependencies": { + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" + } + }, + "node_modules/vuepress-plugin-smooth-scroll": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", + "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", + "dependencies": { + "smoothscroll-polyfill": "^0.4.3" + } + }, + "node_modules/vuepress-plugin-tabs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/vuepress-plugin-tabs/-/vuepress-plugin-tabs-0.3.0.tgz", + "integrity": "sha512-jooDlcMdBqhXgIaF1awFSaOTM56mleP6bbCiGxyQxTZexfvCfDvZhNLGpyXqMQA50ZmNGmvLrK82YYb63k1jfA==" + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack/node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/watchpack/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/watchpack/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==", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchpack/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==", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/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==", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/watchpack/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==", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-plugin-ramdisk": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/webpack-plugin-ramdisk/-/webpack-plugin-ramdisk-0.1.8.tgz", + "integrity": "sha512-JXIZZHKEeYA45yNPp5XDJ/VSt+j3yV2/zw5trF30I4lYcrWRnQ/45yKrmeu8dtPe4Wxm36os20XAtN6u1NAfqQ==", + "dependencies": { + "chalk": "^4.1.0", + "execa": "^4.0.3", + "superstruct": "^0.12.1" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "webpack": "^4.20.0" + } + }, + "node_modules/webpack-plugin-ramdisk/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/webpack-plugin-ramdisk/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/webpack-plugin-ramdisk/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==" + }, + "node_modules/webpack-plugin-ramdisk/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/webpack-plugin-ramdisk/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==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-plugin-ramdisk/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-ramdisk/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-plugin-serve": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/webpack-plugin-serve/-/webpack-plugin-serve-0.12.1.tgz", + "integrity": "sha512-q/MOuTcEvK98leIbOM5JvHrKACG9nMKILA/Pbv/3G8P7sAvRuDCk6NgWX7Hzpj5Y/DsoZIgtGSQRsHSq+sW4cA==", + "dependencies": { + "@hapi/joi": "^15.1.0", + "chalk": "^2.4.1", + "connect-history-api-fallback": "^1.5.0", + "globby": "^10.0.1", + "http-proxy-middleware": "^0.19.0", + "is-path-cwd": "^2.2.0", + "is-promise": "^2.1.0", + "koa": "^2.5.3", + "koa-compress": "^3.0.0", + "koa-connect": "^2.0.1", + "koa-route": "^3.2.0", + "koa-static": "^5.0.0", + "loglevelnext": "^3.0.0", + "nanoid": "^2.0.0", + "onetime": "^5.1.0", + "opn": "^6.0.0", + "p-defer": "^3.0.0", + "read-pkg-up": "^6.0.0", + "rimraf": "^2.6.3", + "strip-ansi": "^5.0.0", + "webpack-plugin-ramdisk": "^0.1.2", + "ws": "^7.1.0" + }, + "engines": { + "node": ">= 10.0.0 < 10.14.0 || >= 10.15.0" + }, + "peerDependencies": { + "webpack": "^4.20.2" + } + }, + "node_modules/webpack-plugin-serve/node_modules/@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-plugin-serve/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/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==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-plugin-serve/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-plugin-serve/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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/webpack-plugin-serve/node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/webpack-plugin-serve/node_modules/opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", + "deprecated": "The package has been renamed to `open`", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-plugin-serve/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-plugin-serve/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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/webpack-plugin-serve/node_modules/ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-serve": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-serve/-/webpack-serve-3.2.0.tgz", + "integrity": "sha512-voK36uw1PpW4jYHjSthUNVeghlfNdnO56iyKdMw7P/MKPmD6WbzwslwnjgDMz33IDRlfAiT+EVVNSa+14TAkJQ==", + "dependencies": { + "chalk": "^2.4.2", + "decamelize": "^3.0.0", + "import-local": "^3.0.1", + "is-plain-obj": "^2.0.0", + "object-path": "^0.11.4", + "pkg-conf": "^3.0.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.0.2", + "webpack-plugin-serve": "^0.12.1", + "yargs-parser": "^14.0.0" + }, + "bin": { + "webpack-serve": "bin/webpack-serve" + }, + "engines": { + "node": ">= 8.0.0 < 9.0.0 || >= 10.0.0 < 10.14.0 || >= 10.15.0" + }, + "peerDependencies": { + "webpack": "^4.29.0" + } + }, + "node_modules/webpack-serve/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-serve/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-serve/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-serve/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "dependencies": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "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==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "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==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dependencies": { + "async-limiter": "~1.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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xregexp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", + "dependencies": { + "@babel/runtime-corejs3": "^7.12.1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-14.0.0.tgz", + "integrity": "sha512-zn/Mnx+tbFjkCFUodEpjXckNS65NfpB5oyqOkDDEG/8uxlfLZJu2IoBLQFjukUkn9rBbGkVYNzrDh6qy4NUd3g==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha1-4Se9nmb9hGvl6rSME5SIL3wOT5g=" + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "requires": { - "@babel/types": "7.9.6", - "jsesc": "2.5.2", - "lodash": "4.17.15", - "source-map": "0.5.7" + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.15.tgz", + "integrity": "sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==" + }, + "@babel/core": { + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.15.tgz", + "integrity": "sha512-6GXmNYeNjS2Uz+uls5jalOemgIhnTMeaXo+yBUA72kC2uX/8VW6XyhVIo2L8/q0goKQA3EVKx0KOQpVKSeWadQ==", + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-module-transforms": "^7.13.14", + "@babel/helpers": "^7.13.10", + "@babel/parser": "^7.13.15", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.15", + "@babel/types": "^7.13.14", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.13.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", + "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "requires": { + "@babel/types": "^7.13.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", - "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.12.13" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", - "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "requires": { - "@babel/helper-explode-assignable-expression": "7.8.3", - "@babel/types": "7.9.6" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-compilation-targets": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz", - "integrity": "sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==", + "version": "7.13.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz", + "integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==", "requires": { - "@babel/compat-data": "7.9.6", - "browserslist": "4.12.0", - "invariant": "2.2.4", - "levenary": "1.1.1", - "semver": "5.7.1" + "@babel/compat-data": "^7.13.12", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz", - "integrity": "sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow==", + "version": "7.13.11", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz", + "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==", "requires": { - "@babel/helper-function-name": "7.9.5", - "@babel/helper-member-expression-to-functions": "7.8.3", - "@babel/helper-optimise-call-expression": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-replace-supers": "7.9.6", - "@babel/helper-split-export-declaration": "7.8.3" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.13.0", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", - "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz", + "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==", "requires": { - "@babel/helper-annotate-as-pure": "7.8.3", - "@babel/helper-regex": "7.8.3", - "regexpu-core": "4.7.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", - "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "@babel/helper-define-polyfill-provider": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz", + "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==", "requires": { - "@babel/helper-function-name": "7.9.5", - "@babel/types": "7.9.6", - "lodash": "4.17.15" + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" } }, "@babel/helper-explode-assignable-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", - "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz", + "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==", "requires": { - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6" + "@babel/types": "^7.13.0" } }, "@babel/helper-function-name": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", - "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", "requires": { - "@babel/helper-get-function-arity": "7.8.3", - "@babel/template": "7.8.6", - "@babel/types": "7.9.6" + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/helper-get-function-arity": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", - "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.12.13" } }, "@babel/helper-hoist-variables": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", - "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz", + "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==", "requires": { - "@babel/types": "7.9.6" + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", - "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", + "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-imports": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", - "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", + "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.13.12" } }, "@babel/helper-module-transforms": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", - "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz", + "integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==", "requires": { - "@babel/helper-module-imports": "7.8.3", - "@babel/helper-replace-supers": "7.9.6", - "@babel/helper-simple-access": "7.8.3", - "@babel/helper-split-export-declaration": "7.8.3", - "@babel/template": "7.8.6", - "@babel/types": "7.9.6", - "lodash": "4.17.15" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.13", + "@babel/types": "^7.13.14" } }, "@babel/helper-optimise-call-expression": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", - "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.12.13" } }, "@babel/helper-plugin-utils": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", - "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==" - }, - "@babel/helper-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", - "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", - "requires": { - "lodash": "4.17.15" - } + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz", + "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", - "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz", + "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==", "requires": { - "@babel/helper-annotate-as-pure": "7.8.3", - "@babel/helper-wrap-function": "7.8.3", - "@babel/template": "7.8.6", - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helper-replace-supers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz", - "integrity": "sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", + "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", "requires": { - "@babel/helper-member-expression-to-functions": "7.8.3", - "@babel/helper-optimise-call-expression": "7.8.3", - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6" + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" } }, "@babel/helper-simple-access": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", - "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", + "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", "requires": { - "@babel/template": "7.8.6", - "@babel/types": "7.9.6" + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "requires": { + "@babel/types": "^7.12.1" } }, "@babel/helper-split-export-declaration": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", - "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", "requires": { - "@babel/types": "7.9.6" + "@babel/types": "^7.12.13" } }, "@babel/helper-validator-identifier": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", - "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==" + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", + "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==" }, "@babel/helper-wrap-function": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", - "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz", + "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==", "requires": { - "@babel/helper-function-name": "7.9.5", - "@babel/template": "7.8.6", - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/helpers": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz", - "integrity": "sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", + "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", "requires": { - "@babel/template": "7.8.6", - "@babel/traverse": "7.9.6", - "@babel/types": "7.9.6" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.0" } }, "@babel/highlight": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", - "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", + "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", "requires": { - "@babel/helper-validator-identifier": "7.9.5", - "chalk": "2.4.2", - "js-tokens": "4.0.0" + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", - "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==" + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.15.tgz", + "integrity": "sha512-b9COtcAlVEQljy/9fbcMHpG+UIW9ReF+gpaxDHTlZd0c6/UU9ng8zdySAW9sRTzpvcdCHn6bUcbuYUgGzLAWVQ==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz", + "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.13.12" + } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", - "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz", + "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-remap-async-to-generator": "7.8.3", - "@babel/plugin-syntax-async-generators": "7.8.4" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", - "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz", + "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==", "requires": { - "@babel/helper-create-class-features-plugin": "7.9.6", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", - "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz", + "integrity": "sha512-ibAMAqUm97yzi+LPgdr5Nqb9CMkeieGHvwPg1ywSGjZrZHQEGqE01HmOio8kxRpA/+VtOHouIVy2FMpBbtltjA==", "requires": { - "@babel/helper-create-class-features-plugin": "7.9.6", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-decorators": "7.8.3" + "@babel/helper-create-class-features-plugin": "^7.13.11", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-decorators": "^7.12.13" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", - "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz", + "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-dynamic-import": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", - "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz", + "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-json-strings": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz", + "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==", + "requires": { + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz", + "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", - "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-numeric-separator": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz", - "integrity": "sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz", + "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-transform-parameters": "7.9.5" + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz", + "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", - "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "version": "7.13.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz", + "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-syntax-optional-chaining": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz", + "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", - "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.8.8", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-async-generators": { @@ -402,15 +14178,23 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-decorators": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.8.3.tgz", - "integrity": "sha512-8Hg4dNNT9/LcA1zQlfwuKR8BUc/if7Q7NkTam9sGTcJphLwpf2g4S42uhspQrIrR+dpzE0dtTqBVFoHl8GtnnQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz", + "integrity": "sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-dynamic-import": { @@ -418,7 +14202,15 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-json-strings": { @@ -426,15 +14218,23 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz", - "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz", + "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { @@ -442,15 +14242,15 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", - "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { @@ -458,7 +14258,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { @@ -466,7 +14266,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { @@ -474,450 +14274,482 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", - "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", - "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz", + "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", - "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz", + "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==", "requires": { - "@babel/helper-module-imports": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-remap-async-to-generator": "7.8.3" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-remap-async-to-generator": "^7.13.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", - "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", - "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "lodash": "4.17.15" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-classes": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz", - "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz", + "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==", "requires": { - "@babel/helper-annotate-as-pure": "7.8.3", - "@babel/helper-define-map": "7.8.3", - "@babel/helper-function-name": "7.9.5", - "@babel/helper-optimise-call-expression": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-replace-supers": "7.9.6", - "@babel/helper-split-export-declaration": "7.8.3", - "globals": "11.12.0" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-replace-supers": "^7.13.0", + "@babel/helper-split-export-declaration": "^7.12.13", + "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", - "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz", + "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz", - "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz", + "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", - "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.8.8", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", - "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", - "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-for-of": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", - "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz", + "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", - "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "requires": { - "@babel/helper-function-name": "7.9.5", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", - "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", - "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz", - "integrity": "sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz", + "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==", "requires": { - "@babel/helper-module-transforms": "7.9.0", - "@babel/helper-plugin-utils": "7.8.3", - "babel-plugin-dynamic-import-node": "2.3.3" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz", - "integrity": "sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz", + "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==", "requires": { - "@babel/helper-module-transforms": "7.9.0", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-simple-access": "7.8.3", - "babel-plugin-dynamic-import-node": "2.3.3" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-simple-access": "^7.12.13", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz", - "integrity": "sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==", + "version": "7.13.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz", + "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==", "requires": { - "@babel/helper-hoist-variables": "7.8.3", - "@babel/helper-module-transforms": "7.9.0", - "@babel/helper-plugin-utils": "7.8.3", - "babel-plugin-dynamic-import-node": "2.3.3" + "@babel/helper-hoist-variables": "^7.13.0", + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-identifier": "^7.12.11", + "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", - "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz", + "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==", "requires": { - "@babel/helper-module-transforms": "7.9.0", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-module-transforms": "^7.13.0", + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", - "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.8.8" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", - "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-object-super": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", - "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-replace-supers": "7.9.6" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" } }, "@babel/plugin-transform-parameters": { - "version": "7.9.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz", - "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz", + "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==", "requires": { - "@babel/helper-get-function-arity": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-property-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", - "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-regenerator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", - "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz", + "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==", "requires": { - "regenerator-transform": "0.14.4" + "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", - "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz", - "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz", + "integrity": "sha512-d+ezl76gx6Jal08XngJUkXM4lFXK/5Ikl9Mh4HKDxSfGJXmZ9xG64XT2oivBzfxb/eQ62VfvoMkaCZUKJMVrBA==", "requires": { - "@babel/helper-module-imports": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3", - "resolve": "1.12.0", - "semver": "5.7.1" + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "semver": "^6.3.0" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", - "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", - "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz", + "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", - "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/helper-regex": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-template-literals": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", - "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz", + "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==", "requires": { - "@babel/helper-annotate-as-pure": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.13.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", - "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "requires": { - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", - "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "7.8.8", - "@babel/helper-plugin-utils": "7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/preset-env": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", - "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.15.tgz", + "integrity": "sha512-D4JAPMXcxk69PKe81jRJ21/fP/uYdcTZ3hJDF5QX2HSI9bBxxYw/dumdR6dGumhjxlprHPE4XWoPaqzZUVy2MA==", "requires": { - "@babel/compat-data": "7.9.6", - "@babel/helper-compilation-targets": "7.9.6", - "@babel/helper-module-imports": "7.8.3", - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-proposal-async-generator-functions": "7.8.3", - "@babel/plugin-proposal-dynamic-import": "7.8.3", - "@babel/plugin-proposal-json-strings": "7.8.3", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-proposal-numeric-separator": "7.8.3", - "@babel/plugin-proposal-object-rest-spread": "7.9.6", - "@babel/plugin-proposal-optional-catch-binding": "7.8.3", - "@babel/plugin-proposal-optional-chaining": "7.9.0", - "@babel/plugin-proposal-unicode-property-regex": "7.8.8", - "@babel/plugin-syntax-async-generators": "7.8.4", - "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-syntax-json-strings": "7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "7.8.3", - "@babel/plugin-syntax-numeric-separator": "7.8.3", - "@babel/plugin-syntax-object-rest-spread": "7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "7.8.3", - "@babel/plugin-syntax-optional-chaining": "7.8.3", - "@babel/plugin-syntax-top-level-await": "7.8.3", - "@babel/plugin-transform-arrow-functions": "7.8.3", - "@babel/plugin-transform-async-to-generator": "7.8.3", - "@babel/plugin-transform-block-scoped-functions": "7.8.3", - "@babel/plugin-transform-block-scoping": "7.8.3", - "@babel/plugin-transform-classes": "7.9.5", - "@babel/plugin-transform-computed-properties": "7.8.3", - "@babel/plugin-transform-destructuring": "7.9.5", - "@babel/plugin-transform-dotall-regex": "7.8.3", - "@babel/plugin-transform-duplicate-keys": "7.8.3", - "@babel/plugin-transform-exponentiation-operator": "7.8.3", - "@babel/plugin-transform-for-of": "7.9.0", - "@babel/plugin-transform-function-name": "7.8.3", - "@babel/plugin-transform-literals": "7.8.3", - "@babel/plugin-transform-member-expression-literals": "7.8.3", - "@babel/plugin-transform-modules-amd": "7.9.6", - "@babel/plugin-transform-modules-commonjs": "7.9.6", - "@babel/plugin-transform-modules-systemjs": "7.9.6", - "@babel/plugin-transform-modules-umd": "7.9.0", - "@babel/plugin-transform-named-capturing-groups-regex": "7.8.3", - "@babel/plugin-transform-new-target": "7.8.3", - "@babel/plugin-transform-object-super": "7.8.3", - "@babel/plugin-transform-parameters": "7.9.5", - "@babel/plugin-transform-property-literals": "7.8.3", - "@babel/plugin-transform-regenerator": "7.8.7", - "@babel/plugin-transform-reserved-words": "7.8.3", - "@babel/plugin-transform-shorthand-properties": "7.8.3", - "@babel/plugin-transform-spread": "7.8.3", - "@babel/plugin-transform-sticky-regex": "7.8.3", - "@babel/plugin-transform-template-literals": "7.8.3", - "@babel/plugin-transform-typeof-symbol": "7.8.4", - "@babel/plugin-transform-unicode-regex": "7.8.3", - "@babel/preset-modules": "0.1.3", - "@babel/types": "7.9.6", - "browserslist": "4.12.0", - "core-js-compat": "3.6.5", - "invariant": "2.2.4", - "levenary": "1.1.1", - "semver": "5.7.1" + "@babel/compat-data": "^7.13.15", + "@babel/helper-compilation-targets": "^7.13.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/helper-validator-option": "^7.12.17", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-async-generator-functions": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-dynamic-import": "^7.13.8", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.13.8", + "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.13.8", + "@babel/plugin-proposal-optional-catch-binding": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-proposal-private-methods": "^7.13.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.13.0", + "@babel/plugin-transform-async-to-generator": "^7.13.0", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.13.0", + "@babel/plugin-transform-computed-properties": "^7.13.0", + "@babel/plugin-transform-destructuring": "^7.13.0", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.13.0", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.13.0", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/plugin-transform-modules-systemjs": "^7.13.8", + "@babel/plugin-transform-modules-umd": "^7.13.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.13.0", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.13.15", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.13.0", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.13.0", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.13.14", + "babel-plugin-polyfill-corejs2": "^0.2.0", + "babel-plugin-polyfill-corejs3": "^0.2.0", + "babel-plugin-polyfill-regenerator": "^0.2.0", + "core-js-compat": "^3.9.0", + "semver": "^6.3.0" } }, "@babel/preset-modules": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", - "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", "requires": { - "@babel/helper-plugin-utils": "7.8.3", - "@babel/plugin-proposal-unicode-property-regex": "7.8.8", - "@babel/plugin-transform-dotall-regex": "7.8.3", - "@babel/types": "7.9.6", - "esutils": "2.0.3" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, "@babel/runtime": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", - "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.10.tgz", + "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==", "requires": { - "regenerator-runtime": "0.13.5" + "regenerator-runtime": "^0.13.4" } }, - "@babel/runtime-corejs2": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.5.5.tgz", - "integrity": "sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==", + "@babel/runtime-corejs3": { + "version": "7.13.10", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz", + "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==", "requires": { - "core-js": "2.6.9", - "regenerator-runtime": "0.13.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - } + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "requires": { - "@babel/code-frame": "7.8.3", - "@babel/parser": "7.9.6", - "@babel/types": "7.9.6" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", - "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "version": "7.13.15", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.15.tgz", + "integrity": "sha512-/mpZMNvj6bce59Qzl09fHEs8Bt8NnpEDQYleHUPZQ3wXUMvXi+HJPLars68oAbmp839fGoOkv2pSL2z9ajCIaQ==", "requires": { - "@babel/code-frame": "7.8.3", - "@babel/generator": "7.9.6", - "@babel/helper-function-name": "7.9.5", - "@babel/helper-split-export-declaration": "7.8.3", - "@babel/parser": "7.9.6", - "@babel/types": "7.9.6", - "debug": "4.1.1", - "globals": "11.12.0", - "lodash": "4.17.15" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - } + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.13.9", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.13.15", + "@babel/types": "^7.13.14", + "debug": "^4.1.0", + "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.9.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", - "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "version": "7.13.14", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz", + "integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==", "requires": { - "@babel/helper-validator-identifier": "7.9.5", - "lodash": "4.17.15", - "to-fast-properties": "2.0.0" + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==" + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "requires": { + "@hapi/hoek": "^8.3.0" } }, "@mrmlnc/readdir-enhanced": { @@ -925,8 +14757,24 @@ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "requires": { - "call-me-maybe": "1.0.1", - "glob-to-regexp": "0.3.0" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + } } }, "@nodelib/fs.stat": { @@ -934,6 +14782,15 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -944,38 +14801,37 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "requires": { - "defer-to-connect": "1.1.3" + "defer-to-connect": "^1.0.1" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" - }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" - }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "requires": { - "@types/events": "3.0.0", - "@types/minimatch": "3.0.3", - "@types/node": "12.6.9" + "@types/minimatch": "*", + "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" + }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==" }, "@types/node": { - "version": "12.6.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.6.9.tgz", - "integrity": "sha512-+YB9FtyxXGyD54p8rXwWaN1EWEyar5L58GlGWgtH2I9rGmLGBQcw63+0jw+ujqVavNuO47S1ByAjm9zdHMnskw==" + "version": "14.14.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.41.tgz", + "integrity": "sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g==" + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" }, "@types/q": { "version": "1.5.4", @@ -983,117 +14839,177 @@ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==" }, "@vue/babel-helper-vue-jsx-merge-props": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz", - "integrity": "sha512-6tyf5Cqm4m6v7buITuwS+jHzPlIPxbFzEhXR5JGZpbrvOcp1hiQKckd305/3C7C36wFekNTQSxAtgeM0j0yoUw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==" }, - "@vue/babel-plugin-transform-vue-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz", - "integrity": "sha512-YfdaoSMvD1nj7+DsrwfTvTnhDXI7bsuh+Y5qWwvQXlD24uLgnsoww3qbiZvWf/EoviZMrvqkqN4CBw0W3BWUTQ==", + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==" + }, + "@vue/babel-plugin-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.5.tgz", + "integrity": "sha512-Jtipy7oI0am5e1q5Ahunm/cCcCh5ssf5VkMQsLR383S3un5Qh7NBfxgSK9kmWf4IXJEhDeYp9kHv8G/EnMai9A==", "requires": { - "@babel/helper-module-imports": "7.8.3", - "@babel/plugin-syntax-jsx": "7.8.3", - "@vue/babel-helper-vue-jsx-merge-props": "1.0.0", - "html-tags": "2.0.0", - "lodash.kebabcase": "4.1.1", - "svg-tags": "1.0.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" } }, - "@vue/babel-preset-app": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.3.1.tgz", - "integrity": "sha512-iNkySkbRWXGUA+Cvzj+/gEP0Y0uVAwwzfn21S7hkggSeIg9LJyZ+QzdxgKO0wgi01yTdb2mYWgeLQAfHZ65aew==", + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", "requires": { - "@babel/core": "7.9.6", - "@babel/helper-compilation-targets": "7.9.6", - "@babel/helper-module-imports": "7.8.3", - "@babel/plugin-proposal-class-properties": "7.8.3", - "@babel/plugin-proposal-decorators": "7.8.3", - "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-syntax-jsx": "7.8.3", - "@babel/plugin-transform-runtime": "7.9.6", - "@babel/preset-env": "7.9.6", - "@babel/runtime": "7.9.6", - "@vue/babel-preset-jsx": "1.1.2", - "babel-plugin-dynamic-import-node": "2.3.3", - "core-js": "3.6.5", - "core-js-compat": "3.6.5" + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" }, "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" } } }, - "@vue/babel-preset-jsx": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz", - "integrity": "sha512-zDpVnFpeC9YXmvGIDSsKNdL7qCG2rA3gjywLYHPCKDT10erjxF4U+6ay9X6TW5fl4GsDlJp9bVfAVQAAVzxxvQ==", + "@vue/babel-preset-app": { + "version": "4.5.12", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.12.tgz", + "integrity": "sha512-8q67ORQ9O0Ms0nlqsXTVhaBefRBaLrzPxOewAZhdcO7onHwcO5/wRdWtHhZgfpCZlhY7NogkU16z3WnorSSkEA==", "requires": { - "@vue/babel-helper-vue-jsx-merge-props": "1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "1.1.2", - "@vue/babel-sugar-functional-vue": "1.1.2", - "@vue/babel-sugar-inject-h": "1.1.2", - "@vue/babel-sugar-v-model": "1.1.2", - "@vue/babel-sugar-v-on": "1.1.2" + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-functional-vue": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz", - "integrity": "sha512-YhmdJQSVEFF5ETJXzrMpj0nkCXEa39TvVxJTuVjzvP2rgKhdMmQzlJuMv/HpadhZaRVMCCF3AEjjJcK5q/cYzQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", "requires": { - "@babel/plugin-syntax-jsx": "7.8.3" + "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-inject-h": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz", - "integrity": "sha512-VRSENdTvD5htpnVp7i7DNuChR5rVMcORdXjvv5HVvpdKHzDZAYiLSD+GhnhxLm3/dMuk8pSzV+k28ECkiN5m8w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", "requires": { - "@babel/plugin-syntax-jsx": "7.8.3" + "@babel/plugin-syntax-jsx": "^7.2.0" } }, "@vue/babel-sugar-v-model": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz", - "integrity": "sha512-vLXPvNq8vDtt0u9LqFdpGM9W9IWDmCmCyJXuozlq4F4UYVleXJ2Fa+3JsnTZNJcG+pLjjfnEGHci2339Kj5sGg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", "requires": { - "@babel/plugin-syntax-jsx": "7.8.3", - "@vue/babel-helper-vue-jsx-merge-props": "1.0.0", - "@vue/babel-plugin-transform-vue-jsx": "1.1.2", - "camelcase": "5.3.1", - "html-tags": "2.0.0", - "svg-tags": "1.0.0" + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" + } } }, "@vue/babel-sugar-v-on": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz", - "integrity": "sha512-T8ZCwC8Jp2uRtcZ88YwZtZXe7eQrJcfRq0uTFy6ShbwYJyz5qWskRFoVsdTi9o0WEhmQXxhQUewodOSCUPVmsQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", "requires": { - "@babel/plugin-syntax-jsx": "7.8.3", - "@vue/babel-plugin-transform-vue-jsx": "1.1.2", - "camelcase": "5.3.1" + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } } }, "@vue/component-compiler-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz", - "integrity": "sha512-QLq9z8m79mCinpaEeSURhnNCN6djxpHw0lpP/bodMlt5kALfONpryMthvnrQOlTcIKoF+VoPi+lPHUYeDFPXug==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", "requires": { - "consolidate": "0.15.1", - "hash-sum": "1.0.2", - "lru-cache": "4.1.5", - "merge-source-map": "1.1.0", - "postcss": "7.0.30", - "postcss-selector-parser": "6.0.2", - "prettier": "1.19.1", - "source-map": "0.6.1", - "vue-template-es2015-compiler": "1.9.1" + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" }, "dependencies": { "lru-cache": { @@ -1101,8 +15017,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "source-map": { @@ -1118,155 +15034,141 @@ } }, "@vuepress/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.5.0.tgz", - "integrity": "sha512-GYMFKR1Nzy3ArxcSc7HRTvYTiosAmAI8nGBhYKcxdp/ZTIzCkgUkyk1OCKvl/7c2H3Iv1AmvwM2DEXTXrfS5Mw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.8.2.tgz", + "integrity": "sha512-lh9BLC06k9s0wxTuWtCkiNj49fkbW87enp0XSrFZHEoyDGSGndQjZmMMErcHc5Hx7nrW1nzc33sPH1NNtJl0hw==", "requires": { - "@babel/core": "7.9.6", - "@vue/babel-preset-app": "4.3.1", - "@vuepress/markdown": "1.5.0", - "@vuepress/markdown-loader": "1.5.0", - "@vuepress/plugin-last-updated": "1.5.0", - "@vuepress/plugin-register-components": "1.5.0", - "@vuepress/shared-utils": "1.5.0", - "autoprefixer": "9.8.0", - "babel-loader": "8.1.0", - "cache-loader": "3.0.1", - "chokidar": "2.1.8", - "connect-history-api-fallback": "1.6.0", - "copy-webpack-plugin": "5.1.1", - "core-js": "3.6.5", - "cross-spawn": "6.0.5", - "css-loader": "2.1.1", - "file-loader": "3.0.1", - "js-yaml": "3.14.0", - "lru-cache": "5.1.1", + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.8.2", + "@vuepress/markdown-loader": "1.8.2", + "@vuepress/plugin-last-updated": "1.8.2", + "@vuepress/plugin-register-components": "1.8.2", + "@vuepress/shared-utils": "1.8.2", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", "mini-css-extract-plugin": "0.6.0", - "optimize-css-assets-webpack-plugin": "5.0.3", - "portfinder": "1.0.26", - "postcss-loader": "3.0.0", - "postcss-safe-parser": "4.0.2", - "toml": "3.0.0", - "url-loader": "1.1.2", - "vue": "2.6.11", - "vue-loader": "15.9.2", - "vue-router": "3.2.0", - "vue-server-renderer": "2.6.11", - "vue-template-compiler": "2.6.11", - "vuepress-html-webpack-plugin": "3.2.0", - "vuepress-plugin-container": "2.1.4", - "webpack": "4.43.0", - "webpack-chain": "6.4.0", - "webpack-dev-server": "3.11.0", - "webpack-merge": "4.2.2", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", "webpackbar": "3.2.0" - }, - "dependencies": { - "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" - } } }, "@vuepress/markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.5.0.tgz", - "integrity": "sha512-dSIRa3kLz0hjEbl1XN70Uqz7MFiK8Nx7bHxXF9uhN8b870R2Hs1vQlWVgDfyC4NICb5aVhks4q7W2TDIOIgjtw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.8.2.tgz", + "integrity": "sha512-zznBHVqW+iBkznF/BO/GY9RFu53khyl0Ey0PnGqvwCJpRLNan6y5EXgYumtjw2GSYn5nDTTALYxtyNBdz64PKg==", "requires": { - "@vuepress/shared-utils": "1.5.0", - "markdown-it": "8.4.2", - "markdown-it-anchor": "5.3.0", - "markdown-it-chain": "1.3.0", - "markdown-it-emoji": "1.4.0", - "markdown-it-table-of-contents": "0.4.4", - "prismjs": "1.20.0" + "@vuepress/shared-utils": "1.8.2", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" } }, "@vuepress/markdown-loader": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.5.0.tgz", - "integrity": "sha512-Qu9mkH736yNN1a7Si6UhbUcLGOoHg76hnpWvgaCvHEIGdGKiJopNO0Sjgioo9n4OwS21dtefjhafsmp9nZqYoQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.8.2.tgz", + "integrity": "sha512-mWzFXikCUcAN/chpKkqZpRYKdo0312hMv8cBea2hvrJYV6y4ODB066XKvXN8JwOcxuCjxWYJkhWGr+pXq1oTtw==", "requires": { - "@vuepress/markdown": "1.5.0", - "loader-utils": "1.4.0", - "lru-cache": "5.1.1" + "@vuepress/markdown": "1.8.2", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" } }, "@vuepress/plugin-active-header-links": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.5.0.tgz", - "integrity": "sha512-jVMOo4mgGpRe7dNopsLEsoUvQQFDIZmM1IhOJi9bsv6NLRPP3Ej2MwIYV+JQ1akSQn9zmGB8t6aO9DKRaK8J3g==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.8.2.tgz", + "integrity": "sha512-JmXAQg8D7J8mcKe2Ue3BZ9dOCzJMJXP4Cnkkc/IrqfDg0ET0l96gYWZohCqlvRIWt4f0VPiFAO4FLYrW+hko+g==", "requires": { - "lodash.debounce": "4.0.8" + "lodash.debounce": "^4.0.8" } }, "@vuepress/plugin-last-updated": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.5.0.tgz", - "integrity": "sha512-qZpxJ0BDofyMdrALuJI4dqtSbP1uSK6X4/kh+P+eLKCWongRIvPCq5eH75xTbn94EIH6N65AgqCbPiZCN4eOKA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.8.2.tgz", + "integrity": "sha512-pYIRZi52huO9b6HY3JQNPKNERCLzMHejjBRt9ekdnJ1xhLs4MmRvt37BoXjI/qzvXkYtr7nmGgnKThNBVRTZuA==", "requires": { - "cross-spawn": "6.0.5" + "cross-spawn": "^6.0.5" } }, "@vuepress/plugin-nprogress": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.5.0.tgz", - "integrity": "sha512-0xs5Y0igCpA03/WXBvo01crJLVkirglh+JAIZY+daJUdjY38u4FXtrxe4/Nq7Nwo++Qy/OGFCWoilukgzpL8tA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.8.2.tgz", + "integrity": "sha512-3TOBee2NM3WLr1tdjDTGfrAMggjN+OlEPyKyv8FqThsVkDYhw48O3HwqlThp9KX7UbL3ExxIFBwWRFLC+kYrdw==", "requires": { - "nprogress": "0.2.0" + "nprogress": "^0.2.0" } }, "@vuepress/plugin-register-components": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.5.0.tgz", - "integrity": "sha512-TtiCzf3DyErltxz1fdXnLultkdiOw6UMLEwkr02Bf8CtzZCrPxMPiLmXqy/i7h/Ef+0s/LUtwpSL97YYOeZUtA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.8.2.tgz", + "integrity": "sha512-6SUq3nHFMEh9qKFnjA8QnrNxj0kLs7+Gspq1OBU8vtu0NQmSvLFZVaMV7pzT/9zN2nO5Pld5qhsUJv1g71MrEA==", "requires": { - "@vuepress/shared-utils": "1.5.0" + "@vuepress/shared-utils": "1.8.2" } }, "@vuepress/plugin-search": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.5.0.tgz", - "integrity": "sha512-zZ7awYWzube+FwYQP2GcrCeoGUxcOWQm6cOaxQ9BiEn+M8sj4/fn18sKjGkzREQ+BVJguxHw0y29gUlvHALPhQ==" + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.8.2.tgz", + "integrity": "sha512-JrSJr9o0Kar14lVtZ4wfw39pplxvvMh8vDBD9oW09a+6Zi/4bySPGdcdaqdqGW+OHSiZNvG+6uyfKSBBBqF6PA==" }, "@vuepress/shared-utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.5.0.tgz", - "integrity": "sha512-YKMMuiODPmk09vGnXrpGFCuDIyltZSM4K3OUZoxViZWiYhWxbBS7YY6CVScrcQxG59rk+OPXQb1mP/ItIvOEow==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.8.2.tgz", + "integrity": "sha512-6kGubc7iBDWruEBUU7yR+sQ++SOhMuvKWvWeTZJKRZedthycdzYz7QVpua0FaZSAJm5/dIt8ymU4WQvxTtZgTQ==", "requires": { - "chalk": "2.4.2", - "diacritics": "1.3.0", - "escape-html": "1.0.3", - "fs-extra": "7.0.1", - "globby": "9.2.0", - "gray-matter": "4.0.2", - "hash-sum": "1.0.2", - "semver": "6.3.0", - "upath": "1.2.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" } }, "@vuepress/theme-default": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.5.0.tgz", - "integrity": "sha512-qdV0TVuKt0N9s0sVKRPmrW9o1aLcW2AZvkHATdDmAjKk8R34JC7Gqa0QiBsGLrIr7dUvEVYXy9T0r6IG2Z+dog==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.8.2.tgz", + "integrity": "sha512-rE7M1rs3n2xp4a/GrweO8EGwqFn3EA5gnFWdVmVIHyr7C1nix+EqjpPQF1SVWNnIrDdQuCw38PqS+oND1K2vYw==", "requires": { - "@vuepress/plugin-active-header-links": "1.5.0", - "@vuepress/plugin-nprogress": "1.5.0", - "@vuepress/plugin-search": "1.5.0", - "docsearch.js": "2.6.3", - "lodash": "4.17.15", - "stylus": "0.54.7", - "stylus-loader": "3.0.2", - "vuepress-plugin-container": "2.1.4", - "vuepress-plugin-smooth-scroll": "0.0.3" + "@vuepress/plugin-active-header-links": "1.8.2", + "@vuepress/plugin-nprogress": "1.8.2", + "@vuepress/plugin-search": "1.8.2", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" } }, "@webassemblyjs/ast": { @@ -1336,7 +15238,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { @@ -1446,14 +15348,14 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "2.1.24", + "mime-types": "~2.1.24", "negotiator": "0.6.2" } }, "acorn": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", - "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" }, "agentkeepalive": { "version": "2.2.0", @@ -1461,46 +15363,48 @@ "integrity": "sha1-xdG9SxKQCPEWPyNvhuX66iAm4u8=" }, "ajv": { - "version": "6.12.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", - "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "fast-deep-equal": "3.1.1", - "fast-json-stable-stringify": "2.1.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} }, "ajv-keywords": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} }, "algoliasearch": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", "requires": { - "agentkeepalive": "2.2.0", - "debug": "2.6.9", - "envify": "4.1.0", - "es6-promise": "4.2.8", - "events": "1.1.1", - "foreach": "2.0.5", - "global": "4.4.0", - "inherits": "2.0.4", - "isarray": "2.0.5", - "load-script": "1.0.0", - "object-keys": "1.1.1", - "querystring-es3": "0.2.1", - "reduce": "1.0.2", - "semver": "5.7.1", - "tunnel-agent": "0.6.0" + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" }, "dependencies": { "debug": { @@ -1511,20 +15415,15 @@ "ms": "2.0.0" } }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -1538,7 +15437,42 @@ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "requires": { - "string-width": "3.1.0" + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "ansi-colors": { @@ -1547,17 +15481,17 @@ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", - "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "requires": { - "type-fest": "0.11.0" + "type-fest": "^0.21.3" }, "dependencies": { "type-fest": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", - "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" } } }, @@ -1567,16 +15501,16 @@ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "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==", "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "any-promise": { @@ -1589,8 +15523,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { "normalize-path": { @@ -1598,7 +15532,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } } } @@ -1613,7 +15547,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -1641,7 +15575,7 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -1659,23 +15593,24 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "~2.1.0" } }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "requires": { - "bn.js": "4.11.9", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -1684,7 +15619,7 @@ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "requires": { - "object-assign": "4.1.1", + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -1718,7 +15653,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.14" } }, "async-each": { @@ -1746,21 +15681,21 @@ "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", "requires": { - "immediate": "3.2.3" + "immediate": "^3.2.3" } }, "autoprefixer": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", - "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", "requires": { - "browserslist": "4.12.0", - "caniuse-lite": "1.0.30001065", - "chalk": "2.4.2", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "7.0.30", - "postcss-value-parser": "4.1.0" + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" } }, "aws-sign2": { @@ -1769,27 +15704,19 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "babel-loader": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", - "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "requires": { - "find-cache-dir": "2.1.0", - "loader-utils": "1.4.0", - "mkdirp": "0.5.5", - "pify": "4.0.1", - "schema-utils": "2.6.6" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" } }, "babel-plugin-dynamic-import-node": { @@ -1797,26 +15724,53 @@ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { - "object.assign": "4.1.0" + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz", + "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz", + "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0", + "core-js-compat": "^3.9.1" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz", + "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.0" } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.2", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1824,51 +15778,15 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -1880,7 +15798,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -1908,9 +15826,9 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { "version": "1.19.0", @@ -1918,17 +15836,22 @@ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { "bytes": "3.1.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.2", + "depd": "~1.1.2", "http-errors": "1.7.2", "iconv-lite": "0.4.24", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.7.0", "raw-body": "2.4.0", - "type-is": "1.6.18" + "type-is": "~1.6.17" }, "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1937,27 +15860,15 @@ "ms": "2.0.0" } }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -1966,12 +15877,12 @@ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "requires": { - "array-flatten": "2.1.2", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" } }, "boolbase": { @@ -1984,37 +15895,36 @@ "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", "requires": { - "ansi-align": "3.0.0", - "camelcase": "5.3.1", - "chalk": "3.0.0", - "cli-boxes": "2.2.0", - "string-width": "4.2.0", - "term-size": "2.2.0", - "type-fest": "0.8.1", - "widest-line": "3.1.0" + "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" }, "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "1.1.1", - "color-convert": "2.0.1" + "color-convert": "^2.0.1" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "chalk": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "ansi-styles": "4.2.1", - "supports-color": "7.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "color-convert": { @@ -2022,7 +15932,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "color-name": "1.1.4" + "color-name": "~1.1.4" } }, "color-name": { @@ -2030,51 +15940,18 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "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==" - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "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==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "8.0.0", - "is-fullwidth-code-point": "3.0.0", - "strip-ansi": "6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "5.0.0" - } - }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "4.0.0" + "has-flag": "^4.0.0" } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" } } }, @@ -2083,7 +15960,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2092,26 +15969,16 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" } }, "brorand": { @@ -2124,12 +15991,12 @@ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -2137,9 +16004,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -2147,42 +16014,35 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.1", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "requires": { - "bn.js": "4.11.9", - "randombytes": "2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" - } + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "requires": { - "bn.js": "5.1.2", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.2", - "inherits": "2.0.4", - "parse-asn1": "5.1.5", - "readable-stream": "3.6.0", - "safe-buffer": "5.2.1" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { "readable-stream": { @@ -2190,9 +16050,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "safe-buffer": { @@ -2207,18 +16067,19 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "requires": { - "pako": "1.0.11" + "pako": "~1.0.5" } }, "browserslist": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", - "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz", + "integrity": "sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==", "requires": { - "caniuse-lite": "1.0.30001065", - "electron-to-chromium": "1.3.451", - "node-releases": "1.1.56", - "pkg-up": "2.0.0" + "caniuse-lite": "^1.0.30001208", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.712", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" } }, "buffer": { @@ -2226,9 +16087,16 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "requires": { - "base64-js": "1.3.1", - "ieee754": "1.1.13", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } } }, "buffer-from": { @@ -2257,35 +16125,35 @@ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cac": { - "version": "6.5.10", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.5.10.tgz", - "integrity": "sha512-uxyxsID5p5kYlFFnhw86A4c8K5QTLRp6JM4AY2OtCq5lnnn4DGxV8YI1Z5rlt6KUjEKpA4qM+WZQshMoJY6dQQ==" + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.2.tgz", + "integrity": "sha512-w0bH1IF9rEjdi0a6lTtlXYT+vBZEJL9oytaXXRdsD68MH6+SrZGOGsu7s2saHQvYXqwo/wBdkW75tt8wFpj+mw==" }, "cacache": { "version": "12.0.4", "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "requires": { - "bluebird": "3.7.2", - "chownr": "1.1.4", - "figgy-pudding": "3.5.2", - "glob": "7.1.4", - "graceful-fs": "4.2.0", - "infer-owner": "1.0.4", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.5", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, "cache-base": { @@ -2293,22 +16161,15 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.3.0", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.1", - "to-object-path": "0.3.0", - "union-value": "1.0.1", - "unset-value": "1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "cache-content-type": { @@ -2316,8 +16177,8 @@ "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", "requires": { - "mime-types": "2.1.24", - "ylru": "1.2.1" + "mime-types": "^2.1.18", + "ylru": "^1.2.0" } }, "cache-loader": { @@ -2325,23 +16186,85 @@ "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", "requires": { - "buffer-json": "2.0.0", - "find-cache-dir": "2.1.0", - "loader-utils": "1.4.0", - "mkdirp": "0.5.5", - "neo-async": "2.6.1", - "schema-utils": "1.0.0" + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -2350,21 +16273,21 @@ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "requires": { - "clone-response": "1.0.2", - "get-stream": "5.1.0", - "http-cache-semantics": "4.1.0", - "keyv": "3.1.0", - "lowercase-keys": "2.0.0", - "normalize-url": "4.5.0", - "responselike": "1.0.2" + "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" }, "dependencies": { "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "lowercase-keys": { @@ -2379,6 +16302,15 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2389,7 +16321,7 @@ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "requires": { - "callsites": "2.0.0" + "callsites": "^2.0.0" } }, "caller-path": { @@ -2397,7 +16329,7 @@ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "requires": { - "caller-callsite": "2.0.0" + "caller-callsite": "^2.0.0" } }, "callsites": { @@ -2410,30 +16342,30 @@ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "requires": { - "browserslist": "4.12.0", - "caniuse-lite": "1.0.30001065", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, "caniuse-lite": { - "version": "1.0.30001065", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001065.tgz", - "integrity": "sha512-DDxCLgJ266YnAHQv0jS1wdOaihRFF52Zgmlag39sQJVy2H46oROpJp4hITstqhdB8qnHSrKNoAEkQA9L/oYF9A==" + "version": "1.0.30001211", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001211.tgz", + "integrity": "sha512-v3GXWKofIkN3PkSidLI5d1oqeKNsam9nQkqieoMhP87nxOY0RPDC8X2+jcv8pjV4dRozPLSoMqNii9sDViOlIg==" }, "caseless": { "version": "0.12.0", @@ -2445,9 +16377,9 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chokidar": { @@ -2455,18 +16387,18 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.13", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "chownr": { @@ -2475,25 +16407,22 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "requires": { - "tslib": "1.13.0" - } + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -2501,10 +16430,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -2512,13 +16441,59 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -2527,7 +16502,7 @@ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "requires": { - "source-map": "0.6.1" + "source-map": "~0.6.0" }, "dependencies": { "source-map": { @@ -2538,19 +16513,19 @@ } }, "cli-boxes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", - "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, "clipboard": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz", - "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", "optional": true, "requires": { - "good-listener": "1.2.2", - "select": "1.1.2", - "tiny-emitter": "2.1.0" + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" } }, "cliui": { @@ -2558,9 +16533,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "3.1.0", - "strip-ansi": "5.2.0", - "wrap-ansi": "5.1.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { @@ -2568,12 +16543,32 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -2583,7 +16578,7 @@ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "co": { @@ -2596,9 +16591,9 @@ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "requires": { - "@types/q": "1.5.4", - "chalk": "2.4.2", - "q": "1.5.1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" } }, "collection-visit": { @@ -2606,17 +16601,17 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", - "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "color-convert": "^1.9.1", + "color-string": "^1.5.4" } }, "color-convert": { @@ -2633,20 +16628,25 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", + "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -2665,11 +16665,11 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "mime-db": "1.40.0" + "mime-db": ">= 1.43.0 < 2" } }, "compression": { @@ -2677,20 +16677,15 @@ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.17", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "1.0.2", + "on-headers": "~1.0.2", "safe-buffer": "5.1.2", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2716,10 +16711,10 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.4", - "readable-stream": "2.3.7", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -2727,27 +16722,12 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { - "dot-prop": "5.2.0", - "graceful-fs": "4.2.0", - "make-dir": "3.1.0", - "unique-string": "2.0.0", - "write-file-atomic": "3.0.3", - "xdg-basedir": "4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "semver": "6.3.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "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" } }, "connect-history-api-fallback": { @@ -2756,9 +16736,9 @@ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "consola": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.12.1.tgz", - "integrity": "sha512-aEkkju9ZcEa9y2MhzNhfmTUws/CEZZ0LKu0FxftSU3HygPfVMMIMSYyYct+xBN6XNRhsaDZjw2HAv3m2ammXSA==" + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" }, "console-browserify": { "version": "1.2.0", @@ -2770,7 +16750,7 @@ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", "requires": { - "bluebird": "3.7.2" + "bluebird": "^3.1.1" } }, "constants-browserify": { @@ -2796,7 +16776,7 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.1" } }, "cookie": { @@ -2810,12 +16790,19 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookies": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", - "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", "requires": { - "depd": "1.1.2", - "keygrip": "1.0.3" + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "copy-concurrently": { @@ -2823,12 +16810,12 @@ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.5", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -2837,35 +16824,60 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-webpack-plugin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", - "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", "requires": { - "cacache": "12.0.4", - "find-cache-dir": "2.1.0", - "glob-parent": "3.1.0", - "globby": "7.1.1", - "is-glob": "4.0.1", - "loader-utils": "1.4.0", - "minimatch": "3.0.4", - "normalize-path": "3.0.0", - "p-limit": "2.3.0", - "schema-utils": "1.0.0", - "serialize-javascript": "2.1.2", - "webpack-log": "2.0.0" + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "requires": { - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "glob": "7.1.4", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "ignore": { @@ -2873,29 +16885,60 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-try": "2.2.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -2904,16 +16947,16 @@ } }, "core-js": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", - "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.10.2.tgz", + "integrity": "sha512-W+2oVYeNghuBr3yTzZFQ5rfmjZtYB/Ubg87R5YOmlGrIb+Uw9f7qjUbhsj+/EkXhcV7eOD3jiM4+sgraX3FZUw==" }, "core-js-compat": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", - "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.10.2.tgz", + "integrity": "sha512-IGHnpuaM1N++gLSPI1F1wu3WXICPxSyj/Q++clcwsIOnUVp5uKUIPl/+6h0TQ112KU3fMiSxqJuM+OrCyKj5+A==", "requires": { - "browserslist": "4.12.0", + "browserslist": "^4.16.4", "semver": "7.0.0" }, "dependencies": { @@ -2924,6 +16967,11 @@ } } }, + "core-js-pure": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.10.2.tgz", + "integrity": "sha512-uu18pVHQ21n4mzfuSlCXpucu5VKsck3j2m5fjrBOBqqdgWAxwdCgUuGWj6cDDPN1zLj/qtiqKvBMxWgDeeu49Q==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -2934,25 +16982,25 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.14.0", - "parse-json": "4.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" } }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "requires": { - "bn.js": "4.11.9", - "elliptic": "6.5.2" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -2961,11 +17009,11 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.4", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -2973,12 +17021,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.4", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -2986,11 +17034,18 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.7.1", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "crypto-browserify": { @@ -2998,17 +17053,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.2.0", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.4", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.1.0", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "crypto-random-string": { @@ -3021,10 +17076,10 @@ "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", "requires": { - "inherits": "2.0.4", - "source-map": "0.6.1", - "source-map-resolve": "0.5.2", - "urix": "0.1.0" + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" }, "dependencies": { "source-map": { @@ -3044,8 +17099,8 @@ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "requires": { - "postcss": "7.0.30", - "timsort": "0.3.0" + "postcss": "^7.0.1", + "timsort": "^0.3.0" } }, "css-loader": { @@ -3053,19 +17108,24 @@ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", "requires": { - "camelcase": "5.3.1", - "icss-utils": "4.1.1", - "loader-utils": "1.4.0", - "normalize-path": "3.0.0", - "postcss": "7.0.30", - "postcss-modules-extract-imports": "2.0.0", - "postcss-modules-local-by-default": "2.0.6", - "postcss-modules-scope": "2.2.0", - "postcss-modules-values": "2.0.0", - "postcss-value-parser": "3.3.1", - "schema-utils": "1.0.0" + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" }, "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", @@ -3076,9 +17136,9 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -3088,7 +17148,7 @@ "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", "requires": { - "css": "2.2.4" + "css": "^2.0.0" } }, "css-select": { @@ -3096,10 +17156,10 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "requires": { - "boolbase": "1.0.0", - "css-what": "3.2.1", - "domutils": "1.7.0", - "nth-check": "1.0.2" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "css-select-base-adapter": { @@ -3113,7 +17173,7 @@ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", "requires": { "mdn-data": "2.0.4", - "source-map": "0.6.1" + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -3124,9 +17184,9 @@ } }, "css-what": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", - "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==" + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" }, "cssesc": { "version": "3.0.0", @@ -3134,51 +17194,51 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "cssnano": { - "version": "4.1.10", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", - "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", "requires": { - "cosmiconfig": "5.2.1", - "cssnano-preset-default": "4.0.7", - "is-resolvable": "1.1.0", - "postcss": "7.0.30" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" } }, "cssnano-preset-default": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", - "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", "requires": { - "css-declaration-sorter": "4.0.1", - "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.30", - "postcss-calc": "7.0.2", - "postcss-colormin": "4.0.3", - "postcss-convert-values": "4.0.1", - "postcss-discard-comments": "4.0.2", - "postcss-discard-duplicates": "4.0.2", - "postcss-discard-empty": "4.0.1", - "postcss-discard-overridden": "4.0.1", - "postcss-merge-longhand": "4.0.11", - "postcss-merge-rules": "4.0.3", - "postcss-minify-font-values": "4.0.2", - "postcss-minify-gradients": "4.0.2", - "postcss-minify-params": "4.0.2", - "postcss-minify-selectors": "4.0.2", - "postcss-normalize-charset": "4.0.1", - "postcss-normalize-display-values": "4.0.2", - "postcss-normalize-positions": "4.0.2", - "postcss-normalize-repeat-style": "4.0.2", - "postcss-normalize-string": "4.0.2", - "postcss-normalize-timing-functions": "4.0.2", - "postcss-normalize-unicode": "4.0.1", - "postcss-normalize-url": "4.0.1", - "postcss-normalize-whitespace": "4.0.2", - "postcss-ordered-values": "4.1.2", - "postcss-reduce-initial": "4.0.3", - "postcss-reduce-transforms": "4.0.2", - "postcss-svgo": "4.0.2", - "postcss-unique-selectors": "4.0.1" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" } }, "cssnano-util-get-arguments": { @@ -3196,7 +17256,7 @@ "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "cssnano-util-same-parent": { @@ -3205,26 +17265,26 @@ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" }, "csso": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", - "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "requires": { - "css-tree": "1.0.0-alpha.39" + "css-tree": "^1.1.2" }, "dependencies": { "css-tree": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", - "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "requires": { - "mdn-data": "2.0.6", - "source-map": "0.6.1" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" } }, "mdn-data": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", - "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "source-map": { "version": "0.6.1", @@ -3243,7 +17303,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "de-indent": { @@ -3252,17 +17312,20 @@ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=" }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } }, "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", + "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "requires": { + "xregexp": "^4.2.4" + } }, "decode-uri-component": { "version": "0.2.0", @@ -3274,13 +17337,21 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", "requires": { - "mimic-response": "1.0.1" + "mimic-response": "^1.0.0" } }, "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } }, "deep-extend": { "version": "0.6.0", @@ -3297,8 +17368,8 @@ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", "requires": { - "execa": "1.0.0", - "ip-regex": "2.1.0" + "execa": "^1.0.0", + "ip-regex": "^2.1.0" } }, "defer-to-connect": { @@ -3311,7 +17382,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "requires": { - "object-keys": "1.1.1" + "object-keys": "^1.0.12" } }, "define-property": { @@ -3319,46 +17390,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" } }, "del": { @@ -3366,13 +17399,13 @@ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "requires": { - "@types/glob": "7.1.1", - "globby": "6.1.0", - "is-path-cwd": "2.2.0", - "is-path-in-cwd": "2.1.0", - "p-map": "2.1.0", - "pify": "4.0.1", - "rimraf": "2.7.1" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" }, "dependencies": { "globby": { @@ -3380,11 +17413,11 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "requires": { - "array-union": "1.0.2", - "glob": "7.1.4", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { @@ -3393,11 +17426,6 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" } } }, @@ -3427,8 +17455,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -3437,29 +17465,24 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" - }, - "diacritics": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/diacritics/-/diacritics-1.3.0.tgz", - "integrity": "sha1-PvqHMj67hj5mls67AILUj/PW96E=" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", + "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==" }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { - "bn.js": "4.11.9", - "miller-rabin": "4.0.1", - "randombytes": "2.1.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -3468,7 +17491,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "requires": { - "path-type": "3.0.0" + "path-type": "^3.0.0" } }, "dns-equal": { @@ -3481,8 +17504,8 @@ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.2" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -3490,7 +17513,7 @@ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "docsearch.js": { @@ -3498,13 +17521,13 @@ "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", "requires": { - "algoliasearch": "3.35.1", + "algoliasearch": "^3.24.5", "autocomplete.js": "0.36.0", - "hogan.js": "3.0.2", - "request": "2.88.2", - "stack-utils": "1.0.2", - "to-factory": "1.0.0", - "zepto": "1.2.0" + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" } }, "dom-converter": { @@ -3512,7 +17535,7 @@ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "requires": { - "utila": "0.4.0" + "utila": "~0.4" } }, "dom-serializer": { @@ -3520,19 +17543,19 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "requires": { - "domelementtype": "2.0.1", - "entities": "2.0.2" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, "entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz", - "integrity": "sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" } } }, @@ -3556,7 +17579,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1.3.1" + "domelementtype": "1" } }, "domutils": { @@ -3564,16 +17587,16 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "requires": { - "dom-serializer": "0.2.2", - "domelementtype": "1.3.1" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", - "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "requires": { - "is-obj": "2.0.0" + "is-obj": "^2.0.0" } }, "duplexer3": { @@ -3586,10 +17609,10 @@ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "requires": { - "end-of-stream": "1.4.4", - "inherits": "2.0.4", - "readable-stream": "2.3.7", - "stream-shift": "1.0.1" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "ecc-jsbn": { @@ -3597,8 +17620,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1", - "safer-buffer": "2.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { @@ -3607,35 +17630,35 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.451", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.451.tgz", - "integrity": "sha512-2fvco0F2bBIgqzO8GRP0Jt/91pdrf9KfZ5FsmkYkjERmIJG585cFeFZV4+CO6oTmU3HmCTgfcZuEa7kW8VUh3A==" + "version": "1.3.717", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz", + "integrity": "sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==" }, "elliptic": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", - "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "requires": { - "bn.js": "4.11.9", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "emojis-list": { "version": "3.0.0", @@ -3652,17 +17675,17 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", - "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "requires": { - "graceful-fs": "4.2.0", - "memory-fs": "0.5.0", - "tapable": "1.1.3" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" }, "dependencies": { "memory-fs": { @@ -3670,8 +17693,8 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.7" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } @@ -3686,21 +17709,21 @@ "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", "requires": { - "esprima": "4.0.1", - "through": "2.3.8" + "esprima": "^4.0.0", + "through": "~2.3.4" } }, "envinfo": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", - "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==" + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -3708,30 +17731,30 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, - "error-inject": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", - "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" - }, "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", "requires": { - "es-to-primitive": "1.2.1", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.1", - "is-callable": "1.1.5", - "is-regex": "1.0.5", - "object-inspect": "1.7.0", - "object-keys": "1.1.1", - "object.assign": "4.1.0", - "string.prototype.trimleft": "2.1.2", - "string.prototype.trimright": "2.1.2" + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" } }, "es-to-primitive": { @@ -3739,9 +17762,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "requires": { - "is-callable": "1.1.5", - "is-date-object": "1.0.2", - "is-symbol": "1.0.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es6-promise": { @@ -3749,6 +17772,11 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -3769,8 +17797,8 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.3.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -3779,11 +17807,18 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "requires": { - "estraverse": "4.3.0" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } } }, "estraverse": { @@ -3802,21 +17837,21 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", - "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", "requires": { - "original": "1.0.2" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -3824,8 +17859,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -3833,13 +17868,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.3", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -3847,13 +17882,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "debug": { @@ -3869,17 +17904,60 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "is-extendable": "0.1.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3892,36 +17970,36 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", "content-disposition": "0.5.3", - "content-type": "1.0.4", + "content-type": "~1.0.4", "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.2", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.3", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.6", + "proxy-addr": "~2.0.5", "qs": "6.7.0", - "range-parser": "1.2.1", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", "send": "0.17.1", "serve-static": "1.14.1", "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "type-is": "1.6.18", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { "array-flatten": { @@ -3942,10 +18020,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" } } }, @@ -3955,22 +18033,11 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "2.0.4" - } - } + "is-extendable": "^0.1.0" } }, "extglob": { @@ -3978,14 +18045,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -3993,47 +18060,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.3" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.3" - } - }, - "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==" } } }, @@ -4043,316 +18071,21 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "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==" }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "requires": { - "@mrmlnc/readdir-enhanced": "2.2.1", - "@nodelib/fs.stat": "1.1.3", - "glob-parent": "3.1.0", - "is-glob": "4.0.1", - "merge2": "1.2.4", - "micromatch": "3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" } }, "fast-json-stable-stringify": { @@ -4360,12 +18093,20 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "fastq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", + "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", "requires": { - "websocket-driver": "0.6.5" + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "requires": { + "websocket-driver": ">=0.5.1" } }, "figgy-pudding": { @@ -4378,7 +18119,7 @@ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-loader": { @@ -4386,8 +18127,8 @@ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", "requires": { - "loader-utils": "1.4.0", - "schema-utils": "1.0.0" + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" }, "dependencies": { "schema-utils": { @@ -4395,9 +18136,9 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -4413,20 +18154,10 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" } }, "finalhandler": { @@ -4435,12 +18166,12 @@ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.3", - "statuses": "1.5.0", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -4459,21 +18190,22 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "requires": { - "commondir": "1.0.1", - "make-dir": "2.1.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" } }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "requires": { - "locate-path": "2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "flush-write-stream": { @@ -4481,17 +18213,14 @@ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "requires": { - "debug": "3.2.6" - } + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", + "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" }, "for-in": { "version": "1.0.2", @@ -4513,9 +18242,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.8", - "mime-types": "2.1.24" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "forwarded": { @@ -4528,7 +18257,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { @@ -4541,8 +18270,8 @@ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-extra": { @@ -4550,9 +18279,9 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "requires": { - "graceful-fs": "4.2.0", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-write-stream-atomic": { @@ -4560,10 +18289,10 @@ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "requires": { - "graceful-fs": "4.2.0", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.7" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fs.realpath": { @@ -4577,8 +18306,8 @@ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "optional": true, "requires": { - "bindings": "1.5.0", - "nan": "2.12.1" + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, "function-bind": { @@ -4587,21 +18316,31 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gensync": { - "version": "1.0.0-beta.1", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", - "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "get-value": { @@ -4614,20 +18353,20 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -4635,8 +18374,8 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -4644,7 +18383,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -4659,16 +18398,16 @@ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "requires": { - "min-document": "2.19.0", - "process": "0.11.10" + "min-document": "^2.19.0", + "process": "^0.11.10" } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", "requires": { - "ini": "1.3.5" + "ini": "1.3.7" } }, "globals": { @@ -4681,21 +18420,14 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", "requires": { - "@types/glob": "7.1.1", - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "fast-glob": "2.2.7", - "glob": "7.1.4", - "ignore": "4.0.6", - "pify": "4.0.1", - "slash": "2.0.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" } }, "good-listener": { @@ -4704,7 +18436,7 @@ "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", "optional": true, "requires": { - "delegate": "3.2.0" + "delegate": "^3.1.2" } }, "got": { @@ -4712,40 +18444,33 @@ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "requires": { - "@sindresorhus/is": "0.14.0", - "@szmarczak/http-timer": "1.1.2", - "cacheable-request": "6.1.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.1.0", - "to-readable-stream": "1.0.0", - "url-parse-lax": "3.0.0" + "@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" } }, "graceful-fs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", - "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" }, "gray-matter": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz", "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==", "requires": { - "js-yaml": "3.14.0", - "kind-of": "6.0.3", - "section-matter": "1.0.0", - "strip-bom-string": "1.0.0" - }, - "dependencies": { - "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==" - } + "js-yaml": "^3.11.0", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" } }, "handle-thing": { @@ -4759,12 +18484,12 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "6.12.2", - "har-schema": "2.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" } }, "has": { @@ -4772,7 +18497,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -4780,34 +18505,39 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } } }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -4815,34 +18545,16 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -4857,9 +18569,9 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "requires": { - "inherits": "2.0.4", - "readable-stream": "3.6.0", - "safe-buffer": "5.2.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { "readable-stream": { @@ -4867,9 +18579,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "safe-buffer": { @@ -4889,8 +18601,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "he": { @@ -4908,9 +18620,9 @@ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hogan.js": { @@ -4929,15 +18641,20 @@ } } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "requires": { - "inherits": "2.0.4", - "obuf": "1.1.2", - "readable-stream": "2.3.7", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, "hsl-regex": { @@ -4950,46 +18667,41 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "html-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", - "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" }, "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==", "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.3", - "commander": "2.17.1", - "he": "1.2.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.10" + "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" } }, "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.4.2", - "domutils": "1.7.0", - "entities": "1.1.2", - "inherits": "2.0.4", - "readable-stream": "3.6.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { "readable-stream": { @@ -4997,9 +18709,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -5009,8 +18721,15 @@ "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", "requires": { - "deep-equal": "1.0.1", - "http-errors": "1.7.3" + "deep-equal": "~1.0.1", + "http-errors": "~1.7.2" + }, + "dependencies": { + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + } } }, "http-cache-semantics": { @@ -5024,25 +18743,37 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { - "depd": "1.1.2", - "inherits": "2.0.4", + "depd": "~1.1.2", + "inherits": "2.0.3", "setprototypeof": "1.1.1", - "statuses": "1.5.0", + "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { - "eventemitter3": "3.1.2", - "follow-redirects": "1.7.0", - "requires-port": "1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, "http-proxy-middleware": { @@ -5050,286 +18781,10 @@ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { - "http-proxy": "1.17.0", - "is-glob": "4.0.1", - "lodash": "4.17.15", - "micromatch": "3.1.10" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "http-signature": { @@ -5337,9 +18792,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.16.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -5347,12 +18802,17 @@ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "icss-replace-symbols": { @@ -5365,13 +18825,13 @@ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.14" } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "iferr": { "version": "0.1.5", @@ -5384,16 +18844,16 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, "immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" }, "import-cwd": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "requires": { - "import-from": "2.1.0" + "import-from": "^2.1.0" } }, "import-fresh": { @@ -5401,8 +18861,8 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "import-from": { @@ -5410,7 +18870,7 @@ "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "import-lazy": { @@ -5419,63 +18879,50 @@ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "requires": { - "pkg-dir": "4.2.0", - "resolve-cwd": "3.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "5.0.0", - "path-exists": "4.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "4.1.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "2.2.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "2.2.0" + "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { - "find-up": "4.1.0" + "find-up": "^3.0.0" } } } @@ -5500,8 +18947,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -5510,25 +18957,17 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==" }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "requires": { - "default-gateway": "4.2.0", - "ipaddr.js": "1.9.1" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "1.4.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, "ip": { @@ -5552,11 +18991,19 @@ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" }, "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" } }, "is-arrayish": { @@ -5564,12 +19011,25 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "1.13.1" + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "requires": { + "call-bind": "^1.0.0" } }, "is-buffer": { @@ -5578,23 +19038,16 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { - "ci-info": "2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - } + "ci-info": "^2.0.0" } }, "is-color-stop": { @@ -5602,20 +19055,28 @@ "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "requires": { - "css-color-names": "0.0.4", - "hex-color-regex": "1.1.0", - "hsl-regex": "1.0.0", - "hsla-regex": "1.0.0", - "rgb-regex": "1.0.1", - "rgba-regex": "1.0.0" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" } }, "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^6.0.0" } }, "is-date-object": { @@ -5624,20 +19085,13 @@ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" }, "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-directory": { @@ -5656,21 +19110,21 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "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==" }, "is-generator-function": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", - "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.8.tgz", + "integrity": "sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==" }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-installed-globally": { @@ -5678,17 +19132,15 @@ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "requires": { - "global-dirs": "2.0.1", - "is-path-inside": "3.0.2" - }, - "dependencies": { - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" - } + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, "is-npm": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", @@ -5699,9 +19151,24 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, "is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -5717,16 +19184,23 @@ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "requires": { - "is-path-inside": "2.1.0" + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } } }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "requires": { - "path-is-inside": "1.0.2" - } + "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==" }, "is-plain-obj": { "version": "1.1.0", @@ -5738,27 +19212,21 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + "isobject": "^3.0.1" } }, "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", "requires": { - "has": "1.0.3" + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" } }, "is-resolvable": { @@ -5771,20 +19239,17 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "1.1.2" - } + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "requires": { - "has-symbols": "1.0.1" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -5808,17 +19273,9 @@ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.1.1" - } + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "isexe": { "version": "2.0.0", @@ -5836,9 +19293,9 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "javascript-stringify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", - "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==" }, "js-tokens": { "version": "4.0.0", @@ -5846,12 +19303,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -5874,6 +19331,11 @@ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, + "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==" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -5895,11 +19357,11 @@ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "requires": { - "minimist": "1.2.5" + "minimist": "^1.2.5" } }, "jsonfile": { @@ -5907,7 +19369,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { - "graceful-fs": "4.2.0" + "graceful-fs": "^4.1.6" } }, "jsprim": { @@ -5922,9 +19384,12 @@ } }, "keygrip": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", - "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } }, "keyv": { "version": "3.1.0", @@ -5940,42 +19405,38 @@ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "koa": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.7.0.tgz", - "integrity": "sha512-7ojD05s2Q+hFudF8tDLZ1CpCdVZw8JQELWSkcfG9bdtoTDzMmkRF6BQBU7JzIzCCOY3xd3tftiy/loHBUYaY2Q==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", + "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", "requires": { - "accepts": "1.3.7", - "cache-content-type": "1.0.1", - "content-disposition": "0.5.3", - "content-type": "1.0.4", - "cookies": "0.7.3", - "debug": "3.1.0", - "delegates": "1.0.0", - "depd": "1.1.2", - "destroy": "1.0.4", - "error-inject": "1.0.0", - "escape-html": "1.0.3", - "fresh": "0.5.2", - "http-assert": "1.4.1", - "http-errors": "1.7.3", - "is-generator-function": "1.0.7", - "koa-compose": "4.1.0", - "koa-convert": "1.2.0", - "koa-is-json": "1.0.0", - "on-finished": "2.3.0", - "only": "0.0.2", - "parseurl": "1.3.3", - "statuses": "1.5.0", - "type-is": "1.6.18", - "vary": "1.1.2" + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "~3.1.0", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^1.2.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" }, "dependencies": { "debug": { @@ -5986,10 +19447,10 @@ "ms": "2.0.0" } }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "ms": { "version": "2.0.0", @@ -5999,36 +19460,43 @@ } }, "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "requires": { - "any-promise": "1.3.0" - } + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" }, "koa-compress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.0.0.tgz", - "integrity": "sha512-xol+LkNB1mozKJkB5Kj6nYXbJXhkLkZlXl9BsGBPjujVfZ8MsIXwU4GHRTT7TlSfUcl2DU3JtC+j6wOWcovfuQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", + "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", "requires": { - "bytes": "3.1.0", - "compressible": "2.0.17", - "koa-is-json": "1.0.0", - "statuses": "1.5.0" + "bytes": "^3.0.0", + "compressible": "^2.0.0", + "koa-is-json": "^1.0.0", + "statuses": "^1.0.0" } }, "koa-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/koa-connect/-/koa-connect-2.0.1.tgz", - "integrity": "sha512-MNaiK5og8aj4I+tx8l+jSW24QX7aaQyZemV821VPY+AOJ8XUbrrAj9AzrpZKDQp5jTmylAZW2sXhTz2+SRqZog==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/koa-connect/-/koa-connect-2.1.0.tgz", + "integrity": "sha512-O9pcFafHk0oQsBevlbTBlB9co+2RUQJ4zCzu3qJPmGlGoeEZkne+7gWDkecqDPSbCtED6LmhlQladxs6NjOnMQ==" }, "koa-convert": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", "requires": { - "co": "4.6.0", - "koa-compose": "3.2.1" + "co": "^4.6.0", + "koa-compose": "^3.0.0" + }, + "dependencies": { + "koa-compose": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", + "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", + "requires": { + "any-promise": "^1.1.0" + } + } } }, "koa-is-json": { @@ -6041,9 +19509,72 @@ "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz", "integrity": "sha1-dimLmaa8+p44yrb+XHmocz51i84=", "requires": { - "debug": "3.2.6", - "methods": "1.1.2", - "path-to-regexp": "1.7.0" + "debug": "*", + "methods": "~1.1.0", + "path-to-regexp": "^1.2.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "last-call-webpack-plugin": { @@ -6051,8 +19582,8 @@ "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", "requires": { - "lodash": "4.17.15", - "webpack-sources": "1.4.3" + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" } }, "latest-version": { @@ -6060,28 +19591,20 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "requires": { - "package-json": "6.5.0" + "package-json": "^6.3.0" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" - }, - "levenary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", - "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", - "requires": { - "leven": "3.1.0" - } + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "linkify-it": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "requires": { - "uc.micro": "1.0.6" + "uc.micro": "^1.0.1" } }, "load-json-file": { @@ -6089,17 +19612,17 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "requires": { - "graceful-fs": "4.2.0", - "parse-json": "4.0.0", - "pify": "4.0.1", - "strip-bom": "3.0.0", - "type-fest": "0.3.1" + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" } } }, @@ -6118,9 +19641,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "requires": { - "big.js": "5.2.2", - "emojis-list": "3.0.0", - "json5": "1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" }, "dependencies": { "json5": { @@ -6128,24 +19651,23 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "requires": { - "minimist": "1.2.5" + "minimist": "^1.2.0" } } } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -6177,8 +19699,8 @@ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.2.0" + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { @@ -6186,7 +19708,7 @@ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.uniq": { @@ -6195,17 +19717,14 @@ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, "loglevel": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", - "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==" + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "4.0.0" - } + "loglevelnext": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-3.0.1.tgz", + "integrity": "sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA==" }, "lower-case": { "version": "1.1.4", @@ -6222,23 +19741,15 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "yallist": "3.1.1" + "yallist": "^3.0.2" } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "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==", "requires": { - "pify": "4.0.1", - "semver": "5.7.1" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } + "semver": "^6.0.0" } }, "map-cache": { @@ -6251,7 +19762,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "markdown-it": { @@ -6259,33 +19770,39 @@ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", "requires": { - "argparse": "1.0.10", - "entities": "1.1.2", - "linkify-it": "2.2.0", - "mdurl": "1.0.1", - "uc.micro": "1.0.6" + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" } }, "markdown-it-anchor": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", - "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==" + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "requires": {} }, "markdown-it-chain": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", "requires": { - "webpack-chain": "4.12.1" + "webpack-chain": "^4.9.0" }, "dependencies": { + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha1-FC0RHzpuPa6PSpr9d9RYVbWpzOM=" + }, "webpack-chain": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", "requires": { - "deepmerge": "1.5.2", - "javascript-stringify": "1.6.0" + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" } } } @@ -6310,9 +19827,9 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "requires": { - "hash-base": "3.1.0", - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdn-data": { @@ -6335,8 +19852,8 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.7" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "merge-descriptors": { @@ -6349,7 +19866,7 @@ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", "requires": { - "source-map": "0.6.1" + "source-map": "^0.6.1" }, "dependencies": { "source-map": { @@ -6359,10 +19876,15 @@ } } }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, "merge2": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", - "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -6374,25 +19896,37 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.3", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { - "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==" + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } } } }, @@ -6401,39 +19935,39 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "requires": { - "bn.js": "4.11.9", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, "mime": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", - "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", "requires": { - "mime-db": "1.40.0" + "mime-db": "1.47.0" } }, "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mimic-response": { "version": "1.0.1", @@ -6445,7 +19979,7 @@ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { - "dom-walk": "0.1.2" + "dom-walk": "^0.1.0" } }, "mini-css-extract-plugin": { @@ -6453,10 +19987,10 @@ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", "requires": { - "loader-utils": "1.4.0", - "normalize-url": "2.0.1", - "schema-utils": "1.0.0", - "webpack-sources": "1.4.3" + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" }, "dependencies": { "schema-utils": { @@ -6464,9 +19998,9 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -6486,7 +20020,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -6499,16 +20033,16 @@ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.4", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.2.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -6516,8 +20050,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -6525,7 +20059,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -6535,7 +20069,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "1.2.5" + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -6543,12 +20077,12 @@ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.5", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -6561,8 +20095,8 @@ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "requires": { - "dns-packet": "1.3.1", - "thunky": "1.1.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -6570,59 +20104,51 @@ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "1.3.0", - "object-assign": "4.1.1", - "thenify-all": "1.6.0" - } - }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", "optional": true }, "nanoid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.0.3.tgz", - "integrity": "sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw==" + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-2.1.11.tgz", + "integrity": "sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==" }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } } } }, @@ -6632,9 +20158,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "nice-try": { "version": "1.0.5", @@ -6646,44 +20172,49 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-forge": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", - "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "requires": { - "assert": "1.5.0", - "browserify-zlib": "0.2.0", - "buffer": "4.9.2", - "console-browserify": "1.2.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.1.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.1", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.7", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.11", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.11.1", - "vm-browserify": "1.1.2" + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -6692,16 +20223,34 @@ } }, "node-releases": { - "version": "1.1.56", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.56.tgz", - "integrity": "sha512-EVo605FhWLygH8a64TjgpjyHYOihkxECwX1bHHr8tETJKWEiWS2YJjPbvsX2jFjnjTNEgBCmk9mLjKG1Mf11cw==" + "version": "1.1.71", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", + "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==" }, "nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "requires": { - "abbrev": "1.1.1" + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "normalize-path": { @@ -6719,9 +20268,9 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", "requires": { - "prepend-http": "2.0.0", - "query-string": "5.1.1", - "sort-keys": "2.0.0" + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" } }, "npm-run-path": { @@ -6729,7 +20278,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "nprogress": { @@ -6742,7 +20291,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -6765,9 +20314,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -6775,15 +20324,65 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" } } } }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", + "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } }, "object-keys": { "version": "1.1.1", @@ -6791,43 +20390,37 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-path": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", - "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=" + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", + "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==" }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + "isobject": "^3.0.0" } }, "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1", - "has-symbols": "1.0.1", - "object-keys": "1.1.1" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", + "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2" } }, "object.pick": { @@ -6835,25 +20428,18 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } + "isobject": "^3.0.1" } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz", + "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5", - "function-bind": "1.1.1", - "has": "1.0.3" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" } }, "obuf": { @@ -6879,7 +20465,15 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" } }, "only": { @@ -6888,25 +20482,25 @@ "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" }, "opencollective-postinstall": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", - "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==" }, "opn": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimize-css-assets-webpack-plugin": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz", - "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz", + "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==", "requires": { - "cssnano": "4.1.10", - "last-call-webpack-plugin": "3.0.0" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" } }, "original": { @@ -6914,7 +20508,7 @@ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "requires": { - "url-parse": "1.4.7" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -6928,9 +20522,9 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" }, "p-finally": { "version": "1.0.0", @@ -6938,19 +20532,19 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { - "p-try": "1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "requires": { - "p-limit": "1.3.0" + "p-limit": "^2.2.0" } }, "p-map": { @@ -6963,30 +20557,23 @@ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", "requires": { - "retry": "0.12.0" + "retry": "^0.12.0" } }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "requires": { - "got": "9.6.0", - "registry-auth-token": "4.1.1", - "registry-url": "5.1.0", - "semver": "6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" } }, "pako": { @@ -6999,9 +20586,9 @@ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "requires": { - "cyclist": "1.0.1", - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "param-case": { @@ -7009,20 +20596,19 @@ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.1.2" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-json": { @@ -7030,8 +20616,8 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "parseurl": { @@ -7055,9 +20641,9 @@ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", @@ -7080,38 +20666,35 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } } }, "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { @@ -7120,14 +20703,14 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==" }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", @@ -7139,7 +20722,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-conf": { @@ -7147,8 +20730,8 @@ "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", "requires": { - "find-up": "3.0.0", - "load-json-file": "5.3.0" + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" }, "dependencies": { "find-up": { @@ -7156,7 +20739,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "locate-path": { @@ -7164,16 +20747,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "requires": { - "p-try": "2.2.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "p-locate": { @@ -7181,80 +20756,42 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "2.2.0" + "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" } } }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "requires": { - "find-up": "3.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "2.2.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "requires": { - "p-limit": "2.3.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - } - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "requires": { - "find-up": "2.1.0" + "find-up": "^4.0.0" } }, "portfinder": { - "version": "1.0.26", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", - "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { - "async": "2.6.3", - "debug": "3.2.6", - "mkdirp": "0.5.5" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "posix-character-classes": { @@ -7263,13 +20800,13 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.30.tgz", - "integrity": "sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==", + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { "source-map": { @@ -7282,19 +20819,19 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } }, "postcss-calc": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", - "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", "requires": { - "postcss": "7.0.30", - "postcss-selector-parser": "6.0.2", - "postcss-value-parser": "4.1.0" + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" } }, "postcss-colormin": { @@ -7302,11 +20839,11 @@ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "requires": { - "browserslist": "4.12.0", - "color": "3.1.2", - "has": "1.0.3", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7321,8 +20858,8 @@ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "requires": { - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7337,7 +20874,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { @@ -7345,7 +20882,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "postcss-discard-empty": { @@ -7353,7 +20890,7 @@ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "postcss-discard-overridden": { @@ -7361,16 +20898,16 @@ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "postcss-load-config": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", - "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", "requires": { - "cosmiconfig": "5.2.1", - "import-cwd": "2.1.0" + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" } }, "postcss-loader": { @@ -7378,10 +20915,10 @@ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "requires": { - "loader-utils": "1.4.0", - "postcss": "7.0.30", - "postcss-load-config": "2.1.0", - "schema-utils": "1.0.0" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" }, "dependencies": { "schema-utils": { @@ -7389,9 +20926,9 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } @@ -7402,9 +20939,9 @@ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "requires": { "css-color-names": "0.0.4", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1", - "stylehacks": "4.0.3" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7419,12 +20956,12 @@ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "requires": { - "browserslist": "4.12.0", - "caniuse-api": "3.0.0", - "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.30", - "postcss-selector-parser": "3.1.2", - "vendors": "1.0.4" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -7432,9 +20969,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "5.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -7444,8 +20981,8 @@ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "requires": { - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7460,10 +20997,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "requires": { - "cssnano-util-get-arguments": "4.0.0", - "is-color-stop": "1.1.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7478,12 +21015,12 @@ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "requires": { - "alphanum-sort": "1.0.2", - "browserslist": "4.12.0", - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7498,10 +21035,10 @@ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "7.0.30", - "postcss-selector-parser": "3.1.2" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -7509,9 +21046,9 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "5.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -7521,7 +21058,7 @@ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.5" } }, "postcss-modules-local-by-default": { @@ -7529,9 +21066,9 @@ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", "requires": { - "postcss": "7.0.30", - "postcss-selector-parser": "6.0.2", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" }, "dependencies": { "postcss-value-parser": { @@ -7546,8 +21083,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", "requires": { - "postcss": "7.0.30", - "postcss-selector-parser": "6.0.2" + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" } }, "postcss-modules-values": { @@ -7555,8 +21092,8 @@ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "7.0.30" + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" } }, "postcss-normalize-charset": { @@ -7564,7 +21101,7 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.0" } }, "postcss-normalize-display-values": { @@ -7572,9 +21109,9 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7589,10 +21126,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "requires": { - "cssnano-util-get-arguments": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7607,10 +21144,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "requires": { - "cssnano-util-get-arguments": "4.0.0", - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7625,9 +21162,9 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "requires": { - "has": "1.0.3", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7642,9 +21179,9 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7659,9 +21196,9 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "requires": { - "browserslist": "4.12.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7676,10 +21213,10 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "3.3.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "normalize-url": { @@ -7699,8 +21236,8 @@ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "requires": { - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7715,9 +21252,9 @@ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "requires": { - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7732,10 +21269,10 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "requires": { - "browserslist": "4.12.0", - "caniuse-api": "3.0.0", - "has": "1.0.3", - "postcss": "7.0.30" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" } }, "postcss-reduce-transforms": { @@ -7743,10 +21280,10 @@ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "requires": { - "cssnano-util-get-match": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7761,28 +21298,26 @@ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", "requires": { - "postcss": "7.0.30" + "postcss": "^7.0.26" } }, "postcss-selector-parser": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", - "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz", + "integrity": "sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg==", "requires": { - "cssesc": "3.0.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { - "is-svg": "3.0.0", - "postcss": "7.0.30", - "postcss-value-parser": "3.3.1", - "svgo": "1.3.2" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" }, "dependencies": { "postcss-value-parser": { @@ -7797,9 +21332,9 @@ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "requires": { - "alphanum-sort": "1.0.2", - "postcss": "7.0.30", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" } }, "postcss-value-parser": { @@ -7819,12 +21354,12 @@ "optional": true }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "requires": { - "renderkid": "2.0.3", - "utila": "0.4.0" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "pretty-time": { @@ -7833,18 +21368,13 @@ "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" }, "prismjs": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.20.0.tgz", - "integrity": "sha512-AEDjSrVNkynnw6A+B1DsFkd6AVdTnp+/WoUixFRULlCLZVRZlVQMVWio/16jv7G1FscUxQxOQhWwApgbnxr6kQ==", + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", "requires": { - "clipboard": "2.0.6" + "clipboard": "^2.0.0" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -7865,7 +21395,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { - "forwarded": "0.1.2", + "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" } }, @@ -7889,18 +21419,18 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "requires": { - "bn.js": "4.11.9", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.5", - "randombytes": "2.1.0", - "safe-buffer": "5.1.2" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -7909,8 +21439,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "end-of-stream": "1.4.4", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -7918,9 +21448,9 @@ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.4", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { "pump": { @@ -7928,8 +21458,8 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "requires": { - "end-of-stream": "1.4.4", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -7940,11 +21470,11 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "requires": { - "escape-goat": "2.1.1" + "escape-goat": "^2.0.0" } }, "q": { @@ -7953,18 +21483,18 @@ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "query-string": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "requires": { - "decode-uri-component": "0.2.0", - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -7978,16 +21508,21 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, "querystringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", - "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -7995,8 +21530,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "requires": { - "randombytes": "2.1.0", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { @@ -8015,22 +21550,10 @@ "unpipe": "1.0.0" }, "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": "1.5.0", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" } } }, @@ -8039,10 +21562,56 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.5", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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==", + "requires": { + "@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" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-6.0.0.tgz", + "integrity": "sha512-odtTvLl+EXo1eTsMnoUHRmg/XmXdTkwXVxy4VFE9Kp6cCq7b3l7QMdBndND3eAFzrbSAXC/WCUOQQ9rLjifKZw==", + "requires": { + "find-up": "^4.0.0", + "read-pkg": "^5.1.1", + "type-fest": "^0.5.0" + }, + "dependencies": { + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + } } }, "readable-stream": { @@ -8050,13 +21619,20 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } } }, "readdirp": { @@ -8064,9 +21640,9 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { - "graceful-fs": "4.2.0", - "micromatch": "3.1.10", - "readable-stream": "2.3.7" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "rechoir": { @@ -8074,7 +21650,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", "requires": { - "resolve": "1.12.0" + "resolve": "^1.9.0" } }, "reduce": { @@ -8082,34 +21658,33 @@ "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", "requires": { - "object-keys": "1.1.1" + "object-keys": "^1.1.0" } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "requires": { - "regenerate": "1.4.0" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", - "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "regenerator-transform": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", - "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "requires": { - "@babel/runtime": "7.9.6", - "private": "0.1.8" + "@babel/runtime": "^7.8.4" } }, "regex-not": { @@ -8117,29 +21692,57 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpu-core": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", - "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "8.2.0", - "regjsgen": "0.5.2", - "regjsparser": "0.6.4", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.2.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "registry-auth-token": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", - "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "requires": { - "rc": "1.2.8" + "rc": "^1.2.8" } }, "registry-url": { @@ -8147,7 +21750,7 @@ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "requires": { - "rc": "1.2.8" + "rc": "^1.2.8" } }, "regjsgen": { @@ -8156,11 +21759,11 @@ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", + "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -8181,48 +21784,36 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "requires": { - "css-select": "1.2.0", - "dom-converter": "0.2.0", - "htmlparser2": "3.10.1", - "strip-ansi": "3.0.1", - "utila": "0.4.0" + "css-select": "^2.0.2", + "dom-converter": "^0.2", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" }, "dependencies": { - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", - "domutils": "1.5.1", - "nth-check": "1.0.2" - } + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "dom-serializer": "0.2.2", - "domelementtype": "1.3.1" + "ansi-regex": "^2.0.0" } } } }, "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" }, "repeat-string": { "version": "1.6.1", @@ -8234,33 +21825,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.10.0", - "caseless": "0.12.0", - "combined-stream": "1.0.8", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.3", - "har-validator": "5.1.3", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.24", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.5.0", - "tunnel-agent": "0.6.0", - "uuid": "3.4.0" - }, - "dependencies": { - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-directory": { @@ -8279,26 +21863,20 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { - "path-parse": "1.0.6" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "requires": { - "resolve-from": "5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" - } + "resolve-from": "^3.0.0" } }, "resolve-from": { @@ -8311,7 +21889,7 @@ "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", "integrity": "sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=", "requires": { - "http-errors": "1.6.3", + "http-errors": "~1.6.2", "path-is-absolute": "1.0.1" }, "dependencies": { @@ -8320,10 +21898,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "inherits": { @@ -8348,7 +21926,7 @@ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", "requires": { - "lowercase-keys": "1.0.1" + "lowercase-keys": "^1.0.0" } }, "ret": { @@ -8361,6 +21939,11 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, "rgb-regex": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", @@ -8376,7 +21959,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "requires": { - "glob": "7.1.4" + "glob": "^7.1.3" } }, "ripemd160": { @@ -8384,8 +21967,16 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "3.1.0", - "inherits": "2.0.4" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "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==", + "requires": { + "queue-microtask": "^1.2.2" } }, "run-queue": { @@ -8393,7 +21984,7 @@ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -8406,7 +21997,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { @@ -8420,12 +22011,13 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { - "version": "2.6.6", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", - "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "requires": { - "ajv": "6.12.2", - "ajv-keywords": "3.4.1" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" } }, "section-matter": { @@ -8433,23 +22025,8 @@ "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", "requires": { - "extend-shallow": "2.0.1", - "kind-of": "6.0.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - }, - "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==" - } + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" } }, "select": { @@ -8464,31 +22041,24 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" }, "selfsigned": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", - "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", "requires": { - "node-forge": "0.9.0" + "node-forge": "^0.10.0" } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "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==", "requires": { - "semver": "6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } + "semver": "^6.3.0" } }, "send": { @@ -8497,18 +22067,18 @@ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.7.3", + "http-errors": "~1.7.2", "mime": "1.6.0", "ms": "2.1.1", - "on-finished": "2.3.0", - "range-parser": "1.2.1", - "statuses": "1.5.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { "debug": { @@ -8539,22 +22109,25 @@ } }, "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } }, "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "requires": { - "accepts": "1.3.7", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.24", - "parseurl": "1.3.3" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, "dependencies": { "debug": { @@ -8570,10 +22143,10 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "requires": { - "depd": "1.1.2", + "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", - "statuses": "1.5.0" + "statuses": ">= 1.4.0 < 2" } }, "inherits": { @@ -8598,9 +22171,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.3", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", "send": "0.17.1" } }, @@ -8614,20 +22187,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "0.1.1" - } - } + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" } }, "setimmediate": { @@ -8645,8 +22208,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -8654,7 +22217,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -8672,7 +22235,7 @@ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "requires": { - "is-arrayish": "0.3.2" + "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { @@ -8697,14 +22260,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "debug": { @@ -8720,17 +22283,60 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "is-extendable": "0.1.1" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -8743,9 +22349,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -8753,44 +22359,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" } } }, @@ -8799,38 +22369,48 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.4.0", - "websocket-driver": "0.6.5" + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" } }, "sockjs-client": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", - "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.1.tgz", + "integrity": "sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==", "requires": { - "debug": "3.2.6", - "eventsource": "1.0.7", - "faye-websocket": "0.11.3", - "inherits": "2.0.4", - "json3": "3.3.3", - "url-parse": "1.4.7" + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.1" }, "dependencies": { - "faye-websocket": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", - "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "requires": { - "websocket-driver": "0.6.5" + "ms": "^2.1.1" } } } @@ -8840,7 +22420,7 @@ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -8854,15 +22434,15 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -8870,8 +22450,8 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -8882,30 +22462,48 @@ } }, "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { - "debug": "4.1.1", - "handle-thing": "2.0.1", - "http-deceiver": "1.2.7", - "select-hose": "2.0.0", - "spdy-transport": "3.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - } + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" } }, "spdy-transport": { @@ -8913,30 +22511,22 @@ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "requires": { - "debug": "4.1.1", - "detect-node": "2.0.4", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "3.6.0", - "wbuf": "1.7.3" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "inherits": "2.0.4", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -8946,7 +22536,26 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "sprintf-js": { @@ -8959,23 +22568,23 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "requires": { - "asn1": "0.2.4", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.2", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { - "figgy-pudding": "3.5.2" + "figgy-pudding": "^3.5.1" } }, "stable": { @@ -8984,17 +22593,27 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stack-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", - "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + } + } }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -9002,8 +22621,59 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -9013,11 +22683,18 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "std-env": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.2.1.tgz", - "integrity": "sha512-IjYQUinA3lg5re/YMlwlfhqNRTzMZMqE+pezevdcTaHceqx8ngEi1alX9nNCk9Sc81fy1fLDeQoaCzeiW1yBOQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.0.tgz", + "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==", "requires": { - "ci-info": "1.6.0" + "ci-info": "^3.0.0" + }, + "dependencies": { + "ci-info": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.1.1.tgz", + "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==" + } } }, "stream-browserify": { @@ -9025,8 +22702,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.7" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-each": { @@ -9034,8 +22711,8 @@ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "requires": { - "end-of-stream": "1.4.4", - "stream-shift": "1.0.1" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -9043,11 +22720,11 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.4", - "readable-stream": "2.3.7", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.2" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-shift": { @@ -9060,83 +22737,48 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "7.0.3", - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "5.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "4.1.0" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5" - } - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5", - "string.prototype.trimstart": "1.0.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5", - "string.prototype.trimend": "1.0.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5" - } - }, "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==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -9154,6 +22796,11 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -9164,9 +22811,9 @@ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "requires": { - "browserslist": "4.12.0", - "postcss": "7.0.30", - "postcss-selector-parser": "3.1.2" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -9174,26 +22821,26 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "requires": { - "dot-prop": "5.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, "stylus": { - "version": "0.54.7", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", - "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", "requires": { - "css-parse": "2.0.0", - "debug": "3.1.0", - "glob": "7.1.4", - "mkdirp": "0.5.5", - "safer-buffer": "2.1.2", - "sax": "1.2.4", - "semver": "6.3.0", - "source-map": "0.7.3" + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" }, "dependencies": { "debug": { @@ -9204,16 +22851,16 @@ "ms": "2.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -9226,17 +22873,22 @@ "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", "requires": { - "loader-utils": "1.4.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" } }, + "superstruct": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.12.2.tgz", + "integrity": "sha512-yu+WNa/nSbFa+VBeR2KibfCeIQSKh/aD7G5eFD4Rx4W36MWE3G6SzU3BixDOArLv56u2bz6YEePsHSsioojuXw==" + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svg-tags": { @@ -9249,19 +22901,19 @@ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", "requires": { - "chalk": "2.4.2", - "coa": "2.0.2", - "css-select": "2.1.0", - "css-select-base-adapter": "0.1.1", + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.37", - "csso": "4.0.3", - "js-yaml": "3.14.0", - "mkdirp": "0.5.5", - "object.values": "1.1.1", - "sax": "1.2.4", - "stable": "0.1.8", - "unquote": "1.1.1", - "util.promisify": "1.0.1" + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" } }, "tapable": { @@ -9270,18 +22922,18 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" }, "terser": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", - "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "requires": { - "commander": "2.20.3", - "source-map": "0.6.1", - "source-map-support": "0.5.19" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" }, "dependencies": { "commander": { @@ -9297,31 +22949,93 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", "requires": { - "cacache": "12.0.4", - "find-cache-dir": "2.1.0", - "is-wsl": "1.1.0", - "schema-utils": "1.0.0", - "serialize-javascript": "2.1.2", - "source-map": "0.6.1", - "terser": "4.7.0", - "webpack-sources": "1.4.3", - "worker-farm": "1.7.0" + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -9334,22 +23048,6 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, - "thenify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", - "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", - "requires": { - "any-promise": "1.3.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": "3.3.0" - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9360,8 +23058,8 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { - "readable-stream": "2.3.7", - "xtend": "4.0.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "thunky": { @@ -9370,11 +23068,11 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "timsort": { @@ -9408,7 +23106,17 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-readable-stream": { @@ -9421,10 +23129,29 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "to-regex-range": { @@ -9432,18 +23159,8 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "requires": { - "kind-of": "3.2.2" - } - } + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toidentifier": { @@ -9466,14 +23183,14 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "psl": "1.8.0", - "punycode": "2.1.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, - "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, "tty-browserify": { "version": "0.0.0", @@ -9485,7 +23202,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -9494,9 +23211,9 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" }, "type-is": { "version": "1.6.18", @@ -9504,7 +23221,7 @@ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.24" + "mime-types": "~2.1.24" } }, "typedarray": { @@ -9517,7 +23234,7 @@ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "requires": { - "is-typedarray": "1.0.0" + "is-typedarray": "^1.0.0" } }, "uc.micro": { @@ -9530,8 +23247,8 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "requires": { - "commander": "2.19.0", - "source-map": "0.6.1" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "dependencies": { "commander": { @@ -9546,6 +23263,17 @@ } } }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", @@ -9556,8 +23284,8 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "requires": { - "unicode-canonical-property-names-ecmascript": "1.0.4", - "unicode-property-aliases-ecmascript": "1.1.0" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { @@ -9575,10 +23303,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "2.0.1" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" } }, "uniq": { @@ -9596,7 +23324,7 @@ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "requires": { - "unique-slug": "2.0.2" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -9604,7 +23332,7 @@ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unique-string": { @@ -9612,7 +23340,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "requires": { - "crypto-random-string": "2.0.0" + "crypto-random-string": "^2.0.0" } }, "universalify": { @@ -9635,8 +23363,8 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -9644,9 +23372,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -9664,10 +23392,10 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, @@ -9677,32 +23405,31 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" }, "update-notifier": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", - "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", "requires": { - "boxen": "4.2.0", - "chalk": "3.0.0", - "configstore": "5.0.1", - "has-yarn": "2.1.0", - "import-lazy": "2.1.0", - "is-ci": "2.0.0", - "is-installed-globally": "0.3.2", - "is-npm": "4.0.0", - "is-yarn-global": "0.3.0", - "latest-version": "5.1.0", - "pupa": "2.0.1", - "semver-diff": "3.1.1", - "xdg-basedir": "4.0.0" + "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" }, "dependencies": { "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "@types/color-name": "1.1.1", - "color-convert": "2.0.1" + "color-convert": "^2.0.1" } }, "chalk": { @@ -9710,8 +23437,8 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "ansi-styles": "4.2.1", - "supports-color": "7.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "color-convert": { @@ -9719,7 +23446,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "color-name": "1.1.4" + "color-name": "~1.1.4" } }, "color-name": { @@ -9733,11 +23460,11 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "4.0.0" + "has-flag": "^4.0.0" } } } @@ -9748,11 +23475,11 @@ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -9781,9 +23508,9 @@ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "requires": { - "loader-utils": "1.4.0", - "mime": "2.4.5", - "schema-utils": "1.0.0" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" }, "dependencies": { "schema-utils": { @@ -9791,20 +23518,20 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", "requires": { - "querystringify": "2.1.1", - "requires-port": "1.0.0" + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "url-parse-lax": { @@ -9812,7 +23539,7 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { - "prepend-http": "2.0.0" + "prepend-http": "^2.0.0" } }, "use": { @@ -9845,10 +23572,10 @@ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.17.5", - "has-symbols": "1.0.1", - "object.getownpropertydescriptors": "2.1.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, "utila": { @@ -9867,9 +23594,18 @@ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", - "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } }, "vary": { "version": "1.1.2", @@ -9886,9 +23622,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -9897,9 +23633,9 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "vue": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", - "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" }, "vue-hot-reload-api": { "version": "2.3.4", @@ -9907,37 +23643,42 @@ "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==" }, "vue-loader": { - "version": "15.9.2", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.2.tgz", - "integrity": "sha512-oXBubaY//CYEISBlHX+c2YPJbmOH68xXPXjFv4MAgPqQvUsnjrBAjCJi8HXZ/r/yfn0tPL5VZj1Zcp8mJPI8VA==", + "version": "15.9.6", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", + "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", "requires": { - "@vue/component-compiler-utils": "3.1.2", - "hash-sum": "1.0.2", - "loader-utils": "1.4.0", - "vue-hot-reload-api": "2.3.4", - "vue-style-loader": "4.1.2" + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" } }, "vue-router": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.2.0.tgz", - "integrity": "sha512-khkrcUIzMcI1rDcNtqkvLwfRFzB97GmJEsPAQdj7t/VvpGhmXLOkUfhc+Ah8CvpSXGXwuWuQO+x8Sy/xDhXZIA==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz", + "integrity": "sha512-RRQNLT8Mzr8z7eL4p7BtKvRaTSGdCbTy2+Mm5HTJvLGYSSeG9gDzNasJPP/yOYKLy+/cLG/ftrqq5fvkFwBJEw==" }, "vue-server-renderer": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.11.tgz", - "integrity": "sha512-V3faFJHr2KYfdSIalL+JjinZSHYUhlrvJ9pzCIjjwSh77+pkrsXpK4PucdPcng57+N77pd1LrKqwbqjQdktU1A==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.12.tgz", + "integrity": "sha512-3LODaOsnQx7iMFTBLjki8xSyOxhCtbZ+nQie0wWY4iOVeEtTg1a3YQAjd82WvKxrWHHTshjvLb7OXMc2/dYuxw==", "requires": { - "chalk": "1.1.3", - "hash-sum": "1.0.2", - "he": "1.2.0", - "lodash.template": "4.5.0", - "lodash.uniq": "4.5.0", - "resolve": "1.12.0", - "serialize-javascript": "2.1.2", + "chalk": "^1.1.3", + "hash-sum": "^1.0.2", + "he": "^1.1.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.2.0", + "serialize-javascript": "^3.1.0", "source-map": "0.5.6" }, "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", @@ -9948,11 +23689,19 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "requires": { + "randombytes": "^2.1.0" } }, "source-map": { @@ -9960,6 +23709,14 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -9968,26 +23725,27 @@ } }, "vue-style-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", - "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", "requires": { - "hash-sum": "1.0.2", - "loader-utils": "1.4.0" + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" } }, "vue-tabs-component": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/vue-tabs-component/-/vue-tabs-component-1.5.0.tgz", - "integrity": "sha512-ld4p+hv49Fimw+zv/7GQqMhbjAHjpbWF3UiJtmMaSnvLKbsB1ysfs9dQH0SZ8NvdYpqqKay/VLIqR9yXgse1Sg==" + "integrity": "sha512-ld4p+hv49Fimw+zv/7GQqMhbjAHjpbWF3UiJtmMaSnvLKbsB1ysfs9dQH0SZ8NvdYpqqKay/VLIqR9yXgse1Sg==", + "requires": {} }, "vue-template-compiler": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz", - "integrity": "sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", "requires": { - "de-indent": "1.0.2", - "he": "1.2.0" + "de-indent": "^1.0.2", + "he": "^1.1.0" } }, "vue-template-es2015-compiler": { @@ -9996,16 +23754,16 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==" }, "vuepress": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.5.0.tgz", - "integrity": "sha512-Th07IdRtD6EiDGtlNwohQqfYorkDVdUkOHjLEC+T6k79Vfj7f0vv3tswmLrFb+sZvRxdfESOHDlpatxUZDjSmA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.8.2.tgz", + "integrity": "sha512-BU1lUDwsA3ghf7a9ga4dsf0iTc++Z/l7BR1kUagHWVBHw7HNRgRDfAZBDDQXhllMILVToIxaTifpne9mSi94OA==", "requires": { - "@vuepress/core": "1.5.0", - "@vuepress/theme-default": "1.5.0", - "cac": "6.5.10", - "envinfo": "7.5.1", - "opencollective-postinstall": "2.0.2", - "update-notifier": "4.1.0" + "@vuepress/core": "1.8.2", + "@vuepress/theme-default": "1.8.2", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" } }, "vuepress-html-webpack-plugin": { @@ -10013,12 +23771,12 @@ "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", "requires": { - "html-minifier": "3.5.21", - "loader-utils": "0.2.17", - "lodash": "4.17.15", - "pretty-error": "2.1.1", - "tapable": "1.1.3", - "toposort": "1.0.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", "util.promisify": "1.0.0" }, "dependencies": { @@ -10042,10 +23800,10 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } }, "util.promisify": { @@ -10053,18 +23811,19 @@ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.1.0" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } } } }, "vuepress-plugin-container": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.4.tgz", - "integrity": "sha512-l+EkeL+rC6DJch1wAZUFIkNDaz2TNOg4NQTHa3yMAsYkC+QaSRubGdN6YwOSmfjxVmM9s9D3gwBWw0O7OBhqRg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", "requires": { - "markdown-it-container": "2.0.0" + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" } }, "vuepress-plugin-smooth-scroll": { @@ -10072,7 +23831,7 @@ "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", "requires": { - "smoothscroll-polyfill": "0.4.4" + "smoothscroll-polyfill": "^0.4.3" } }, "vuepress-plugin-tabs": { @@ -10081,30 +23840,30 @@ "integrity": "sha512-jooDlcMdBqhXgIaF1awFSaOTM56mleP6bbCiGxyQxTZexfvCfDvZhNLGpyXqMQA50ZmNGmvLrK82YYb63k1jfA==" }, "watchpack": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", - "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "requires": { - "chokidar": "3.4.0", - "graceful-fs": "4.2.0", - "neo-async": "2.6.1", - "watchpack-chokidar2": "2.0.0" + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" }, "dependencies": { "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "optional": true, "requires": { - "normalize-path": "3.0.0", - "picomatch": "2.2.2" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, "binary-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", - "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "optional": true }, "braces": { @@ -10113,23 +23872,23 @@ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "optional": true, "requires": { - "fill-range": "7.0.1" + "fill-range": "^7.0.1" } }, "chokidar": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", - "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "optional": true, "requires": { - "anymatch": "3.1.1", - "braces": "3.0.2", - "fsevents": "2.1.3", - "glob-parent": "5.1.1", - "is-binary-path": "2.1.0", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "readdirp": "3.4.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" } }, "fill-range": { @@ -10138,22 +23897,22 @@ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "optional": true, "requires": { - "to-regex-range": "5.0.1" + "to-regex-range": "^5.0.1" } }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "optional": true, "requires": { - "is-glob": "4.0.1" + "is-glob": "^4.0.1" } }, "is-binary-path": { @@ -10162,7 +23921,7 @@ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "optional": true, "requires": { - "binary-extensions": "2.0.0" + "binary-extensions": "^2.0.0" } }, "is-number": { @@ -10172,12 +23931,12 @@ "optional": true }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "optional": true, "requires": { - "picomatch": "2.2.2" + "picomatch": "^2.2.1" } }, "to-regex-range": { @@ -10186,18 +23945,18 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "optional": true, "requires": { - "is-number": "7.0.0" + "is-number": "^7.0.0" } } } }, "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", "optional": true, "requires": { - "chokidar": "2.1.8" + "chokidar": "^2.1.8" } }, "wbuf": { @@ -10205,37 +23964,37 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "1.0.1" + "minimalistic-assert": "^1.0.0" } }, "webpack": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", - "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/wasm-edit": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "6.4.1", - "ajv": "6.12.2", - "ajv-keywords": "3.4.1", - "chrome-trace-event": "1.0.2", - "enhanced-resolve": "4.1.1", - "eslint-scope": "4.0.3", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.4.0", - "loader-utils": "1.4.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.5", - "neo-async": "2.6.1", - "node-libs-browser": "2.2.1", - "schema-utils": "1.0.0", - "tapable": "1.1.3", - "terser-webpack-plugin": "1.4.3", - "watchpack": "1.7.2", - "webpack-sources": "1.4.3" + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" }, "dependencies": { "schema-utils": { @@ -10243,132 +24002,108 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } }, "webpack-chain": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.4.0.tgz", - "integrity": "sha512-f97PYqxU+9/u0IUqp/ekAHRhBD1IQwhBv3wlJo2nvyELpr2vNnUqO3XQEk+qneg0uWGP54iciotszpjfnEExFA==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", "requires": { - "deepmerge": "1.5.2", - "javascript-stringify": "2.0.1" - }, - "dependencies": { - "javascript-stringify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", - "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==" - } + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", "requires": { - "memory-fs": "0.4.1", - "mime": "2.4.5", - "mkdirp": "0.5.5", - "range-parser": "1.2.1", - "webpack-log": "2.0.0" + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", "requires": { "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "2.1.8", - "compression": "1.7.4", - "connect-history-api-fallback": "1.6.0", - "debug": "4.1.1", - "del": "4.1.1", - "express": "4.17.1", - "html-entities": "1.3.1", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", - "import-local": "2.0.0", - "internal-ip": "4.3.0", - "ip": "1.1.5", - "is-absolute-url": "3.0.3", - "killable": "1.0.1", - "loglevel": "1.6.8", - "opn": "5.5.0", - "p-retry": "3.0.1", - "portfinder": "1.0.26", - "schema-utils": "1.0.0", - "selfsigned": "1.10.7", - "semver": "6.3.0", - "serve-index": "1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", - "spdy": "4.0.2", - "strip-ansi": "3.0.1", - "supports-color": "6.1.0", - "url": "0.11.0", - "webpack-dev-middleware": "3.7.2", - "webpack-log": "2.0.0", - "ws": "6.2.1", - "yargs": "13.3.2" + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "2.1.2" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" - } + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "is-absolute-url": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "requires": { - "resolve-from": "3.0.0" - } - }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "requires": { - "ajv": "6.12.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } }, "supports-color": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -10378,8 +24113,8 @@ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "requires": { - "ansi-colors": "3.2.4", - "uuid": "3.4.0" + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" } }, "webpack-merge": { @@ -10387,164 +24122,345 @@ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.15" + } + }, + "webpack-plugin-ramdisk": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/webpack-plugin-ramdisk/-/webpack-plugin-ramdisk-0.1.8.tgz", + "integrity": "sha512-JXIZZHKEeYA45yNPp5XDJ/VSt+j3yV2/zw5trF30I4lYcrWRnQ/45yKrmeu8dtPe4Wxm36os20XAtN6u1NAfqQ==", + "requires": { + "chalk": "^4.1.0", + "execa": "^4.0.3", + "superstruct": "^0.12.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "requires": { + "color-name": "~1.1.4" + } + }, + "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==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "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==", + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } } }, "webpack-plugin-serve": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/webpack-plugin-serve/-/webpack-plugin-serve-0.11.0.tgz", - "integrity": "sha512-5ZokdVdq5m+JnYYgtuiipg8cjs1f3eyXXX+gbRpftlYEvmzpI9SWEWj3imBTUDSxFbMWSBsoqiW5N3oAY8N1Nw==", + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/webpack-plugin-serve/-/webpack-plugin-serve-0.12.1.tgz", + "integrity": "sha512-q/MOuTcEvK98leIbOM5JvHrKACG9nMKILA/Pbv/3G8P7sAvRuDCk6NgWX7Hzpj5Y/DsoZIgtGSQRsHSq+sW4cA==", "requires": { - "chalk": "2.4.2", - "connect-history-api-fallback": "1.6.0", - "globby": "9.2.0", - "http-proxy-middleware": "0.19.1", - "is-promise": "2.1.0", - "joi": "14.3.1", - "koa": "2.7.0", - "koa-compress": "3.0.0", - "koa-connect": "2.0.1", - "koa-route": "3.2.0", - "koa-static": "5.0.0", - "loglevelnext": "3.0.1", - "nanoid": "2.0.3", - "onetime": "3.0.0", - "opn": "5.5.0", - "p-defer": "1.0.0", - "strip-ansi": "5.2.0", - "ws": "6.2.1" + "@hapi/joi": "^15.1.0", + "chalk": "^2.4.1", + "connect-history-api-fallback": "^1.5.0", + "globby": "^10.0.1", + "http-proxy-middleware": "^0.19.0", + "is-path-cwd": "^2.2.0", + "is-promise": "^2.1.0", + "koa": "^2.5.3", + "koa-compress": "^3.0.0", + "koa-connect": "^2.0.1", + "koa-route": "^3.2.0", + "koa-static": "^5.0.0", + "loglevelnext": "^3.0.0", + "nanoid": "^2.0.0", + "onetime": "^5.1.0", + "opn": "^6.0.0", + "p-defer": "^3.0.0", + "read-pkg-up": "^6.0.0", + "rimraf": "^2.6.3", + "strip-ansi": "^5.0.0", + "webpack-plugin-ramdisk": "^0.1.2", + "ws": "^7.1.0" }, "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, - "globby": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", - "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "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==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "@types/glob": "7.1.1", - "array-union": "1.0.2", - "dir-glob": "2.2.2", - "fast-glob": "2.2.7", - "glob": "7.1.4", - "ignore": "4.0.6", - "pify": "4.0.1", - "slash": "2.0.0" + "fill-range": "^7.0.1" } }, - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" }, - "joi": { - "version": "14.3.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-14.3.1.tgz", - "integrity": "sha512-LQDdM+pkOrpAn4Lp+neNIFV3axv1Vna3j38bisbQhETPMANYRbFJFUyOZcOClYvM/hppMhGWuKSFEK9vjrB+bQ==", + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { - "hoek": "6.1.3", - "isemail": "3.2.0", - "topo": "3.0.3" + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, - "koa-send": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.0.tgz", - "integrity": "sha512-90ZotV7t0p3uN9sRwW2D484rAaKIsD8tAVtypw/aBU+ryfV+fR2xrcAwhI8Wl6WRkojLUs/cB9SBSCuIb+IanQ==", + "opn": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-6.0.0.tgz", + "integrity": "sha512-I9PKfIZC+e4RXZ/qr1RhgyCnGgYX0UEIlXgWnCOVACIvFgaC9rz6Won7xbdhoHrd8IIhV7YEpHjreNUNkqCGkQ==", "requires": { - "debug": "3.2.6", - "http-errors": "1.7.3", - "mz": "2.7.0", - "resolve-path": "1.4.0" + "is-wsl": "^1.1.0" } }, - "koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "requires": { - "debug": "3.2.6", - "koa-send": "5.0.0" - } - }, - "loglevelnext": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-3.0.1.tgz", - "integrity": "sha512-JpjaJhIN1reaSb26SIxDGtE0uc67gPl19OMVHrr+Ggt6b/Vy60jmCtKgQBrygAH0bhRA2nkxgDvM+8QvR8r0YA==" - }, - "onetime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-3.0.0.tgz", - "integrity": "sha512-t2j1nTo7vb2m/ZQAq5rcWjQgAglF/2rnvlO0cxkZ1GFOSEt0sQBHaytm5tC1ZNUlmKZAp5XF44kolGL9W/XJ2w==", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "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==", "requires": { - "hoek": "6.1.3" + "is-number": "^7.0.0" } + }, + "ws": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "requires": {} } } }, "webpack-serve": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/webpack-serve/-/webpack-serve-3.1.1.tgz", - "integrity": "sha512-8alr/2EJSwv9MN1Q5IAazfDPcUSQeEEkv1J70+xmcrzXa4IxZxkFhkoYGZ4aghS/2Rc3c0Kg5gd/ou8XMTti5w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-serve/-/webpack-serve-3.2.0.tgz", + "integrity": "sha512-voK36uw1PpW4jYHjSthUNVeghlfNdnO56iyKdMw7P/MKPmD6WbzwslwnjgDMz33IDRlfAiT+EVVNSa+14TAkJQ==", "requires": { - "chalk": "2.4.2", - "decamelize": "3.2.0", - "import-local": "3.0.2", - "is-plain-obj": "2.0.0", - "object-path": "0.11.4", - "pkg-conf": "3.1.0", - "rechoir": "0.7.0", - "v8-compile-cache": "2.0.3", - "webpack-plugin-serve": "0.11.0", - "yargs-parser": "13.1.1" + "chalk": "^2.4.2", + "decamelize": "^3.0.0", + "import-local": "^3.0.1", + "is-plain-obj": "^2.0.0", + "object-path": "^0.11.4", + "pkg-conf": "^3.0.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.0.2", + "webpack-plugin-serve": "^0.12.1", + "yargs-parser": "^14.0.0" }, "dependencies": { - "decamelize": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-3.2.0.tgz", - "integrity": "sha512-4TgkVUsmmu7oCSyGBm5FvfMoACuoh9EOidm7V5/J2X2djAwwt57qb3F2KMP2ITqODTCSwb+YRV+0Zqrv18k/hw==", + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "requires": { - "xregexp": "4.2.4" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "is-plain-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.0.0.tgz", - "integrity": "sha512-EYisGhpgSCwspmIuRHGjROWTon2Xp8Z7U03Wubk/bTL5TTRC5R1rGVgyjzBrk9+ULdH6cRD06KRcw/xfqhVYKQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" } } }, @@ -10553,8 +24469,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -10569,28 +24485,30 @@ "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", "requires": { - "ansi-escapes": "4.3.1", - "chalk": "2.4.2", - "consola": "2.12.1", - "figures": "3.2.0", - "pretty-time": "1.1.0", - "std-env": "2.2.1", - "text-table": "0.2.0", - "wrap-ansi": "5.1.0" + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "requires": { - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "when": { "version": "3.6.4", @@ -10602,7 +24520,19 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" } }, "which-module": { @@ -10615,42 +24545,7 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "requires": { - "string-width": "4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "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==" - }, - "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==" - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "requires": { - "emoji-regex": "8.0.0", - "is-fullwidth-code-point": "3.0.0", - "strip-ansi": "6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "5.0.0" - } - } + "string-width": "^4.0.0" } }, "worker-farm": { @@ -10658,7 +24553,7 @@ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -10666,9 +24561,9 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "ansi-styles": "3.2.1", - "string-width": "3.1.0", - "strip-ansi": "5.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { "ansi-regex": { @@ -10676,12 +24571,32 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "4.1.0" + "ansi-regex": "^4.1.0" } } } @@ -10696,10 +24611,10 @@ "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==", "requires": { - "imurmurhash": "0.1.4", - "is-typedarray": "1.0.0", - "signal-exit": "3.0.3", - "typedarray-to-buffer": "3.1.5" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { @@ -10707,7 +24622,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { - "async-limiter": "1.0.1" + "async-limiter": "~1.0.0" } }, "xdg-basedir": { @@ -10716,11 +24631,11 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" }, "xregexp": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.2.4.tgz", - "integrity": "sha512-sO0bYdYeJAJBcJA8g7MJJX7UrOZIfJPd8U2SC7B2Dd/J24U0aQNoGp33shCaBSWeb0rD5rh6VBUIXOkGal1TZA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.4.1.tgz", + "integrity": "sha512-2u9HwfadaJaY9zHtRRnH6BY6CQVNQKkYm3oLtC9gJXXzfsbACg5X5e4EZZGVAH+YIfa+QA9lsFQTTe3HURF3ag==", "requires": { - "@babel/runtime-corejs2": "7.5.5" + "@babel/runtime-corejs3": "^7.12.1" } }, "xtend": { @@ -10729,9 +24644,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, "yallist": { "version": "3.1.1", @@ -10743,41 +24658,58 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "cliui": "5.0.0", - "find-up": "3.0.0", - "get-caller-file": "2.0.5", - "require-directory": "2.1.1", - "require-main-filename": "2.0.0", - "set-blocking": "2.0.0", - "string-width": "3.1.0", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "13.1.2" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "2.2.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "p-locate": { @@ -10785,32 +24717,62 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { - "p-limit": "2.3.0" + "p-limit": "^2.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } }, "yargs-parser": { "version": "13.1.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-14.0.0.tgz", + "integrity": "sha512-zn/Mnx+tbFjkCFUodEpjXckNS65NfpB5oyqOkDDEG/8uxlfLZJu2IoBLQFjukUkn9rBbGkVYNzrDh6qy4NUd3g==", "requires": { - "camelcase": "5.3.1", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + } } }, "ylru": { diff --git a/pom.xml b/pom.xml index 923d4c661..0ad032159 100644 --- a/pom.xml +++ b/pom.xml @@ -245,9 +245,12 @@ ${basedir}/.external-resources/openhabian/docs - openhabian.md + *.md images/*.png + + NEWSLOG.md + diff --git a/prepare-docs.rb b/prepare-docs.rb index d2f5e36c6..32c9f3212 100644 --- a/prepare-docs.rb +++ b/prepare-docs.rb @@ -8,7 +8,7 @@ require "rexml/document" # require "nokogiri" $docs_repo = "https://github.com/openhab/openhab-docs" -$docs_repo_root = $docs_repo + "/blob/master" +$docs_repo_root = $docs_repo + "/blob/main" $docs_repo_branch = "final" $esh_repo = "https://github.com/eclipse/smarthome" $esh_repo_root = $esh_repo + "/blob/master/docs/documentation" diff --git a/search.html b/search.html index d165301b3..da04e3e42 100644 --- a/search.html +++ b/search.html @@ -2,7 +2,7 @@ layout: intro title: openHAB 2 - Search Results --- -{% include base.html %} +

Search Results

diff --git a/styleguide.md b/styleguide.md index a29b19996..2ee5a18a5 100644 --- a/styleguide.md +++ b/styleguide.md @@ -3,8 +3,6 @@ layout: documentation title: openhab-docs Markdown StyleGuide --- -{% include base.html %} - # openHAB Documentation Style Guide ## General Remarks @@ -16,7 +14,7 @@ First and foremost we are following the recommendations given at: [https://www.c An ordered list: 1. Some text -2. Some more text +1. Some more text An unordered list: @@ -25,9 +23,9 @@ An unordered list: An unordered loose list (applied if bigger or with nested lists): -- Some text - - An indented item, making the list "loose" +- Some text + - An indented item, making the list "loose" -- Some more text +- Some more text -- And even more text that could also strech over multiple lines +- And even more text that could also strech over multiple lines diff --git a/tutorials/getting_started/auto_overview.md b/tutorials/getting_started/auto_overview.md new file mode 100644 index 000000000..12a3e7274 --- /dev/null +++ b/tutorials/getting_started/auto_overview.md @@ -0,0 +1,204 @@ +--- +layout: documentation +title: Pages - Overview Page +--- + +# Automatically Generated Overview Tabs + +MainUI will automatically generate an Overview page (id:overview). +This Overview page has four tabs: Overview, Locations, Equipment, and Properties. + +{::options toc_levels="2..4"/} + +- TOC +{:toc} + +## Overview Page + +This is a page that is automatically created as soon as openHAB is installed. +It cannot be deleted, but it can be customized. + +### Overview Tab + +When first starting with openHAB, this page will be blank with a link to documentation and this tutorial. +This is the very first page your users will see when accessing openHAB. +It is a great place to put the most commonly accessed controls and information. +However, this tab is completely custom built so instructions for configuring it are covered in the next pages of this tutorial. + +### Location Tab + +The semantic model is really starting to pay off here! +All of the Locations from your model that have Equipment or Point Items directly in them will have their own card presented. +For some types of Properties, a badge with a summary of that property at that location is shown on the card itself. +Clicking on the card will bring up a list showing all the Equipment and Properties at that location. +Equipment is represented as a gray bar with the name of the Equipment, and each Point/Property is shown with its default list widget. + +![Locations tab](images/locations_tab.png) + +A Location's card is separated into two tabs, Equipment and Properties. +The Properties tab shows those Point/Property Items from the model that are direct members of this Location and not a part of an Equipment. + +![living room card](images/livingroom_card_equip.png) + +The badges shown on the card summarize all of the Properties in that card and present that summary as a single badge. +When there is nothing to present, the badge is not shown. +For example, if no lights are on, the lights badge will not be shown. +When one light is on the light badge will be shown. +When two or more lights are on, the light badge will be shown with a number indicating how many lights are on. +For other types of sensors like temperature, the average of all the Items tagged with a Temperature Property tag will be shown. + +### Equipment Tab + +Each equipment type is represented by a card showing a list similar to that shown on the Locations card. +Each instance of the equipment is shown with a gray bar, and the equipment name and each Point/Property is shown in a list under that title. + +![Equipment tab](images/equipment_tab.png) + +![Equipment card](images/equipment_card.png) + +Also notice how an Equipment can be an abstract concept where necessary. +In this case the sun is modeled as an Equipment. + +### Properties Tab + +Each Point Item that has a Property tag is represented by a card showing each instance of that Property in the list. +Unlike the other tabs, the gray bars here represent the Point tags and each Item with that Point is listed under that. +What this means is for something like the Temperature Property one will have a set of all the temperature Measurements grouped together, and then all the temperature Setpoints grouped together, all on the same Temperature card. + +![Properties tab](images/properties_tab.png) + +![Temperature card](images/properties_card.png) + +On the bottom of each card in the properties tab there is an "Analyze All" button. +Clicking on that will bring up a chart showing the history of all the Items on that card over time. +You can hide Items from the chart if it is too busy and change many other chart settings in the control tab under the chart. + +![Properties chart](images/properties_chart.png) + +Now persistence is starting to pay off! + +If you've customized the chart and want to return to the same chart again, you can save it and a new [Chart Page]({{base}}/ui/chart-pages.html) will be created showing those Items with those settings. + +## Customization / Page Configuration + +MainUI does a pretty good job of guessing a decent default method to present information to you. +But what's the fun in just accepting the default? +Luckily there are a lot of opportunities for customization. +You've already seen some customizations to the Locations tab above. + +### Page Layout + +On any given tab the order of the cards can be adjusted and spacers inserted to group like cards together. +For example, in the Locations tab screen shot above, all the rooms on a floor are grouped together and a spacer added to indicate which floor is represented. + +To adjust those settings, while logged in as an administration user, click on the pencil icon in the upper right corner of the Locations tab. +This will open the customization page. + +![Pencil icon](images/pencil_icon.png) + +![Overview edit page](images/overview_edit_page.png) + +There are a few global settings for the overview page itself, and then each of the three auto generated tabs have their own settings. + +Field | Purpose +-|- +Display model cards to | Controls what type of user can see the cards. If Administrators is checked, only an administrator user can see the card's tabs. +Allow chat input box to | If HABot is installed, this controls what sort of user can access the HABot chat box. +Hidden Model Tabs | Allows the Locations, Equipment, and/or Properties tabs to be hidden from all users in case they are not used. + +Below these settings one can select one of the three tabs to customize. +This will list all the possible cards that can be shown on that tab based on your model. +MainUI will only show those cards that have something in them, even if that card is selected to be shown. +Unchecking a card will prevent it from being shown on that tab even if it does have entries in it. + +Next to each card entry there is a black and white icon that will open that card's customization form when clicked. + +#### Reorder + +To change the order of cards, click the "Reorder" button (upper right corner of the list of cards) and drag and drop the card you want to move via the handle (=) to the very right of that card. + +#### Separators + +To visually group cards on the Page, insert a separator. In the screen shot above you can see a separator for Ground Floor has been inserted. +To insert a separator, click on the menu icon of the card you want to be the first below the separator and select "Add Separator Before." + +![add separator before](images/add_separator.png) + +Give the separator a name. +Now on the page you will now see a section heading with the entered name, and all the Items below the separator grouped under that section heading. + +![separators](images/separators.png) + +Tip 1 - Make sure to save before clicking "Back" or otherwise leaving the page. +You will have to reload the page to pick up the changes. + +Tip 2 - Open two separate tabs in your browser where you edit and view your page. +Alternatively, hit CTRL-R to force a reload and show the changes. + +#### Card Customization + +There are a number of customization options for a card available through the customization menu. +More advanced customizations can be added by editing the card's YAML directly. + +To customize a given card, click on the menu icon and select "Configure Card". +This will open a form with customization options. + +![customize location card form](images/Customize_location_card_form.png) + +##### Basic Settings + +Instead of using the Item's Label and parent Group as the Title and Subtitle of the card, these can be overridden and manually set. +[Expressions]({{base}}/ui/building-pages.html#dynamically-configuring-components-with-expressions) can be used to make the Title and Subtitle change based on the states of Items or other conditions. + +By default a background color is chosen based on the semantic tag. +This default can be overridden here. + +##### Background Image + +Using this feature may require a bit more work. + +If you find a picture on the Internet that allows cross linking, all you need to do is put the URL of that picture in this field and MainUI will load it and use it as the background for the card. +You may also wish to use your own images instead of something downloaded from the Internet. +However, remember that text and icons will be displayed on top of the image. +So regardless of the source, you might need to modify the original image to make it look good. +For example, one might use high contrast images (e.g. architectural drawings and water color paintings) as background images. +However, those images tend to be very light with very high contrast which makes both white and black text unreadable in many cases. + +There are two approaches you can use to deal with this. +You can edit the image to lower the contrast and/or brightness or crop the image to a less busy portion. +Alternatively, you can open the YAML for a given card and adjust the brightness down in the settings. +Click the config icon and choose "Edit YAML". +Here I show adjusting the image brightness down to 60%. + +```yaml +component: oh-location-card +config: + backgroundImage: /static/garage.jpg + backgroundImageStyle: + filter: brightness(60%) + invertText: false +``` + +Place your custom imge files in `$OH_CONF/html`. +Once they are there, you can use the relative path `/static/image.name` as the URL to the image. +For example, I placed the file `garage.jpg` in `/etc/openhab/html` and referenced it as you see in the YAML above. +This is how you use a custom image as the background of a card. +You can see some stock images used as backgrounds for the cards on the Locations tab in the demo and screen shots above. + +Note: Even though it is possible and tempting to just link to an absolute URL on the Internet, as it doesn't require you to save the image file to openHAB's server, doing so is highly discouraged for security, link dependency, image sizing, and other reasons. + +##### Badges + +Badges are only available on the Location cards. + +If you want to not show any badges at all toggle "Disable badges". + +If you want to suppress only certain badges, select those that you want to show under "Enable Badges". + +##### Advanced Configuration + +To edit an individual card, or to edit the Page itself, one can switch to show the YAML code. +Many actions like reordering the cards and inserting separators will be faster to do through the code. + +Any advanced customization of the cards themselves through editing of the code directly is beyond the scope of this tutorial. +See the [UI Docs]({{base}}/ui/index.html) for a detailed reference. diff --git a/tutorials/getting_started/custom_widgets.md b/tutorials/getting_started/custom_widgets.md new file mode 100644 index 000000000..b9988030e --- /dev/null +++ b/tutorials/getting_started/custom_widgets.md @@ -0,0 +1,466 @@ +--- +layout: documentation +title: Pages - Custom Widgets +--- + +# Custom Default Item Widgets + +As mentioned on the previous page, MainUI allows for the creation of custom widgets. +These custom widgets can be reused for multiple Items in a given openHAB setup, and better still they can be shared with the community. +A growing number of very impressive custom widgets have been posted to [Add-ons -> UI on the forum](https://community.openhab.org/c/add-ons/uis/30). +This page provides just a few examples of custom widgets with an emphasis on the overall approach to developing your own. +For a comprehensive reference on creating widgets, please see the [Building Pages]({{base}}/ui/building-pages.html) guide in the docs. + +{::options toc_levels="2..4"/} + +- TOC +{:toc} + +## Where to Create Custom Widgets + +In MainUI under Developer Tools there is a "Widgets" option. +Opening this will present a page with a list of all your custom widgets. +Clicking the + icon will open the editor, which is a window split in half with a text entry area on the left and a preview on the right. + +![custom widget editor](images/custom_widget_editor.png) + +Note that when creating a custom list widget, the preview page will not render the widget in progress. +You will have to apply the widget to an Item and refresh a page after saving the changes for that type of Item. + +## Building Custom Widgets + +As you are learning how widgets work and all of the available options, it might be easier to create the widget using the form presented when adding the Item metadata and then copying the YAML from the code tab to the Custom Widget editor. +When doing this make sure to fill out *all* the fields, because when using the defaults no value is added to the YAML in the code tab. +So, for example, be sure to enter in the Item field. + +Here is a filled-out form customizing a list Item widget for a light. + +![light list item widget form](images/light_list_widget_form.png) + +Clicking on the code tab shows the following YAML. + +```yaml +value: oh-toggle-item +config: + icon: f7:lightbulb + iconColor: '=(items.AllLights.state == "ON") ? "yellow" : "gray"' + title: All Lights + color: '=(items.AllLights.state == "ON") ? "yellow" : "gray"' + item: AllLights +``` + +Now go to Widgets under Developer Tools and create a new custom widget. +The YAML will be prepopulated with a skeleton configuration. + +```yaml +uid: widget_5c7a60b74f +props: + parameterGroups: [] + parameters: + - name: prop1 + label: Prop 1 + type: TEXT + description: A text prop + - name: item + label: Item + type: TEXT + context: item + description: An item to control +tags: [] +component: f7-card +config: + title: '=(props.item) ? "State of " + props.item : "Set props to test!"' + footer: =props.prop1 + content: =items[props.item].displayState || items[props.item].state +``` + +Give your new widget a meaningful name and tags. +Each widget needs to have a unique name, and that name is what will appear in the list when you apply it to an Item. + +Now replace the value of "component" in the custom widget with the "value" from the YAML you generated above. +Then replace everything under "config" in the custom widget with everything under "config" from the YAML you generated above. + +```yaml +uid: test_light_list +props: + parameterGroups: [] + parameters: + - name: prop1 + label: Prop 1 + type: TEXT + description: A text prop + - name: item + label: Item + type: TEXT + context: item + description: An item to control +tags: + - lights + - list +component: oh-toggle-item +config: + icon: f7:lightbulb + iconColor: '=(items.AllLights.state == "ON") ? "yellow" : "gray"' + title: All Lights + color: '=(items.AllLights.state == "ON") ? "yellow" : "gray"' + item: AllLights +``` + +Now we want to create some properties so that the widget can be customized for the any light Item. +We can leave the Item property alone as that's what we want so we will change prop1 to be used for the title. +Then we will change the config to use the properties instead of the hard coded values. + +```yaml +uid: test_light_list +props: + parameterGroups: [] + parameters: + - name: title + label: Widget Title + type: TEXT + description: Used as the label for the widget. + - name: item + label: Item + type: TEXT + context: item + description: The item to control +tags: + - lights + - list +component: oh-toggle-item +config: + icon: f7:lightbulb + iconColor: '=(items[props.item].state == "ON") ? "yellow" : "gray"' + title: =props.title + color: '=(items[props.item].state == "ON") ? "yellow" : "gray"' + item: props.item +``` + +Save the widget and return to one of the Items that should use this widget. +Select "test_light_list" as the widget type and you will be presented with a form to enter the title and select the Item. + +![applying custom list widget](images/applying_custom_list_widget.png) + +Whenever a custom widget is changed, every Item that uses that custom widget will be updated with the change. +This is a powerful tool to create and maintain the look and feel of your UIs. + +## A More Complex List Item Widget + +Here is an example widget that combines two Items into one widget. +In this case it's a widget that represents a garage door and combines the sensor that indicates the opened/closed status of the door and the actuator to trigger the garage door opener. + +![garage list widget](images/garage_list_widget.png) + +```yaml +uid: garagedoor_list +tags: + - list + - garagedoor +props: + parameters: + - description: Door name + label: Name + name: name + required: false + type: TEXT + - context: item + description: Control Item + label: Control Item + name: control_item + required: false + type: TEXT + - context: item + description: Sensor Item + label: Sensor Item + name: sensor_item + required: false + type: TEXT + parameterGroups: [] +timestamp: Feb 5, 2021, 2:01:31 PM +component: oh-list-item +config: + icon: '=(items[props.sensor_item].state == "CLOSED") ? "f7:house" : "f7:house_fill"' + iconColor: '=(items[props.sensor_item].state == "CLOSED") ? "green" : "red"' + title: =props.name + action: command + actionItem: =props.control_item + actionCommand: ON + badgeColor: '=(items[props.sensor_item].state == "CLOSED") ? "green" : "red"' + badge: '=(items[props.sensor_item].state == "CLOSED") ? "CLOSED" : "OPEN"' + +``` + +Notice how the sensor_item prop is used to control the icon, badge and color and the control_item is used as the Item that gets commanded by the Action. + +## Custom Stand Alone Widgets + +Up to this point the tutorial has focused on list item widgets because as someone who is just getting started, making minor tweaks to what is automatically generated will likely be your primary focus. +However, there is that Overview tab that needs to be manually populated too. +This page will be populated with stand-alone widgets or card widgets. + +Often, one will want to have one single stand-alone widget to represent a single Equipment, for example a thermostat or a Chomecast. +These will be a single card that provides the display and interaction with many Items. +If one has more than one Equipment that will use the same widget, or the widget is complex, create a custom widget for these. +Once created, apply the custom widget to the Equipment Group Item in the model. +Then on your Overview tab or any other page, you can select "Add from Model", select the Equipment, and it will drop the unified widget onto the page. + +## Example Stand Alone Widget + +This is a widget to represent a Chromecast. + +![Chromecast widget](images/chromecast_widget.png) + +```yaml +uid: chromecast_widget +tags: + - card +props: + parameters: + - description: How all the Items associated with this chromecast starts + label: Item prefix + name: prefix + required: false + type: TEXT + - description: Title for the widget + label: Static Title + name: title + required: false + parameterGroups: [] +timestamp: Feb 2, 2021, 12:15:54 PM +component: f7-card +config: + title: =props.title +slots: + default: + - component: f7-row + slots: + default: + - component: oh-image + config: + item: =props.prefix+"_Image" + style: + width: 100% + height: auto + - component: f7-row + config: + class: + - justify-content-left + slots: + default: + - component: f7-col + slots: + default: + - component: Label + config: + class: + - text-align-center + text: =items[props.prefix+"_MediaArtist"].state + - component: f7-col + slots: + default: + - component: Label + config: + class: + - text-align-center + text: =items[props.prefix+"_MediaTitle"].state + - component: f7-row + config: + class: + - padding-top + - padding-bottom + slots: + default: + - component: f7-col + slots: + default: + - component: oh-player-controls + config: + item: =props.prefix+"_MediaControl" + - component: f7-col + slots: + default: + - component: oh-slider + config: + item: =props.prefix+"_Volume" + min: 0 + max: 100 + step: 10 + unit: "%" + label: true + - component: oh-button + config: + text: Stop + iconF7: stop + fill: true + color: red + action: command + actionCommand: ON + actionFeedback: Media Stopped + actionItem: =props.prefix+"_Stop" + class: + - margin-top + - component: f7-row + config: + class: + - justify-content-center + slots: + default: + - component: Label + config: + text: =items[props.prefix+"_App"].state +``` + +A full explanation of the widget is outside the scope of this tutorial, but there are a few key take-aways. +As with the list widget, it might be easier to create the widget on the Page editor first and then copy that to the custom widget as described above. +First notice that not all the components used start with "oh". +When building a complicated custom widget, one has more flexibility when using the base "f7" widgets instead. + +Notice how the only property related to Items is a prefix. +If one is consistent in their Item naming, one can define a prefix and the widget can build the Item names for each relevant Item using the prefix. +This can greatly simplify the configuration of a widget. +In this case the widget uses seven different Items that can all be obtained from that one property. + +As you create a widget that uses properties, you will notice that the preview does not get rendered correctly. + +![Chromecast widget no props](images/chromecast_widget_noprops.png) + +At the bottom of the widget editor there is a "Set Props" option, which can also be accessed by typing CTRL-p. +This will bring up a form where the props can be set for the preview. + +![Chromecast widget props set](images/chromecast_props_set.png) + +Once created, apply the custom widget to the Equipment Group Item in the model by selecting it as the default stand-alone widget. + +## Dynamic Widgets + +It is also possible to create widgets that are dynamically populated from the model. +This is particularly useful to present a functional widget, such as one widget to control all the lights in the house. +For this, the [oh-repeater]({{base}}/ui/components/oh-repeater.html) component is very useful. +This component allows one to set up a loop to iterate over a bunch of things, such as all the Items with a given semantic properties tag, and create a widget element for each one. + +For example, here is a widget that shows all the Items with a Switch and Light tag, filtering out those that have "Christmas" in the name unless the TisTheSeason Switch is ON. + +![all lights widget](images/all_lights_widget.png) + +```yaml +uid: all_lights +tags: + - card + - lights +props: + parameters: + - description: A text prop + label: Prop 1 + name: prop1 + required: false + type: TEXT + - context: item + description: An item to control + label: Item + name: item + required: false + type: TEXT + parameterGroups: [] +timestamp: Feb 11, 2021, 3:03:59 PM +component: f7-card +config: + title: Lights +slots: + default: + - component: oh-list + slots: + default: + - component: oh-repeater + config: + fragement: true + for: item + sourceType: itemsWithTags + itemTags: Switch,Light + filter: loop.item.label.includes("Christmas") == false || items.TisTheSeason.state == "ON" + slots: + default: + - component: oh-toggle-item + config: + icon: f7:lightbulb + iconColor: '=(loop.item.state == "ON") ? "yellow" : "gray"' + color: '=(loop.item.state == "ON") ? "yellow" : "gray"' + title: =loop.item.label + item: =loop.item.name +``` + +There are a number of options for looping. +Please see the docs for more details. + +## Adding Widgets to Pages + +Now that the widgets are created, it's time to put them on a Page. +We will focus on the Overview tab of the Overview page. + +To edit any Page go to Settings -> Pages in MainUI. There will be a grayed-out entry which represents the customized Locations, Equipment, and Properties tabs, and there will be an Overview entry. +That entry represents the Overview tab. +Clicking on it will bring up a configuration page that allows you to configure the Overview tab with your custom widgets. +You can build the widgets here, but it's more flexible to create custom widgets and add them to this page. + +A full description on how to build the page is beyond the scope of this tutorial. +See the [Layout Pages docs]({{base}}/ui/layout-pages.html) for details. + +You will be presented with a page similar to the following. + +![blank overview](images/blank_overview.png) + +Because this is the first thing your users will see when accessing openHAB, the most commonly use actuators and widgets should be on this page. + +To get started, click "Add Block", then "Add Row" and finally add however many columns you want. +Repeat for additional rows. +For this tutorial we will have two rows and three columns. + +![Overview row and columns](images/overview_row_and_columns.png) + +Now we will add a custom widget to that first columnn. +In this case we will add a garage door widget that includes a camera feed, shows the door status, and allows triggering two garage doors. +Click on the + in that first cell and select the desired widget from the list. +This is a simple widget that doesn't use any properties, so we are done. + +Next we'll add the all lights widget from above. +Click on the second cell and select the desired widget from the list. +This is a dynamic widget, but also doesn't have any properties, so we are done with it. + +Finally we will add a services status widget which shows any home automation related devices or services that are offline. +This one is also a dynamic widget without properties. +The Page currently looks as follows. + +![Overview row one populates](images/overview_row1_config.png) + +Now we will fill out the bottom row with some widgets from the model. +The Chromecast widget was applied to all the Chromecast Equipment Group Items as the default stand-along widget. +Click on the first cell in the second row and this time select "Add from Model". +Navigate to the Equipment Item desired and "Pick" it. + +Alternativly, you can select the custom widget from the list and set the properties instead of adding from the model. +When you add the widget this way, the widget will look just like it does in the preview when the properties are not yet set. +To set the properties here, click on the edit icon and select "Configure Widget". +You will be presented with a form to enter the values for the properties, in this case the Item prefix and title. + +![Kitchen Chromecast Widget Props](images/kitchen_widget_props.png) + +To preview the configuration in progress there is a toggle at the bottom of the page for "Run mode", or you can press CTRL-R. + +![Overview preview](images/overview_preview.png) + +Once you are happy, save the page and that will become your Overview page. + +## Responsive Pages + +The Page will be viewed on a variety of screen sizes, from computers to tablets to phones. +To make the page adapt to the different screen widths there is a "Column Settings" option in a given column's setting icon. + +![Column Settings](images/column_options.png) + +This lets you define what percentage of a row a given column takes up based on the size of the screen the Page is being displayed on. +The above configuration is set for all the columns, and consequently each card will take up the full width of the screen unless it is a very wide screen (e.g. a computer screen). + +## Additional Pages + +You can create any number of additional pages as desired. +Layout Pages like the Overview tab on the Overview Page are not the only types of pages that can be created. +[Chart pages]({{base}}/ui/chart-pages.html), [Floorplan pages]({{base}}/ui/floorplan-pages.html), [Map pages]({{base}}/ui/map-pages.html), and [Tabbed pages]({{base}}/ui/tabbed-pages.html) are also available. diff --git a/tutorials/getting_started/first_steps.md b/tutorials/getting_started/first_steps.md index c9f3c0f4c..e975c04d1 100644 --- a/tutorials/getting_started/first_steps.md +++ b/tutorials/getting_started/first_steps.md @@ -3,11 +3,9 @@ layout: documentation title: Getting Started - First Steps --- -{% include base.html %} - # First Steps -The following instructions will guide you through the initial steps to take after first installing openHAB. +The following instructions will guide you through the initial steps after first installing openHAB. {::options toc_levels="2..4"/} @@ -15,70 +13,67 @@ The following instructions will guide you through the initial steps to take afte {:toc} ## Create the Admin User -Once openHAB is installed and started, launch the user interface by navigating to [http://localhost:8080]() (if not running locally, replace localhost with the server's address or hostname accordingly). -If you installed from the openHABian image, you can use [http://openhab:8080](). + +Once openHAB is installed and started, launch the user interface by navigating to `http://localhost:8080` (if not running locally, replace localhost with the server's address or hostname accordingly). +If you installed from the openHABian image, you can use `http://openhabianpi:8080`. By default, the administration pages can only be accessed if you are logged in with an administrator account. Since there are no users yet, openHAB will ask you to create an administrator account. -The following screen should appear: -![](images/create_user.png) +![create user](images/create_user.png) -After creating a first admin user you will be guided trough a first time setup wizard. +### Add geographic information -You have to add some geographical information and start (or skip) the setup wizard. +After creating an admin user, you will be guided through a first-time setup wizard. +Start by setting your language, region, and time zone. You can also set your location, or skip this step and complete it later. -![](images/wizard_geo.png) +![geo wizard](images/wizard_geo.png) -![](images/wizard_location.png) +![location wizard](images/wizard_location.png) -You have the ability to install some addons if you already know that you will need them later. +### Install add-ons -![](images/wizard_addons.png) +You now have the option to install openHAB add-ons. +Do this if you already know that you'll need specific add-ons (e.g. if you're upgrading from an older openHAB system), or skip this step if you prefer to install add-ons individually. +You can always install/remove add-ons in the future, enabling you to modify and improve your system over time. + +![addons wizard](images/wizard_addons.png) After finishing the wizard you will get a welcome message and be redirected to your dashboard. +![welcome wizard](images/wizard_welcome.png) +![welcome page](images/welcome_page.png) -![](images/wizard_welcome.png) +### Log into the dashboard -![](images/welcome_page.png) - -### Log in into dashboard with an existing user - -To log in with an existing user you can do the following. -Click on the shield icon in the lower-left corner of the sidebar: - -![](images/shield.png) - -If you don't see it, click on the menu icon ![](menu_icon.png) located at the top-left corner to reveal the sidebar. -Once you have successfully created the admin account, you will be taken back to the previous screen, except the Administration area will now be accessible in the sidebar: - -![](images/administrator.png) +You'll be automatically logged into your dashboard using your administrator when the setup wizard is completed. +openHAB doesn't require you to sign in, but you can only access the settings if you're logged in as an administrator. Currently the only way to add additional users or manage existing ones (including changing passwords and attributing roles) is with the [Console]({{base}}/administration/console.html). -If you need to sign out, or check what sessions are open with this account with the option to terminate them, click on the account option which has replaced the "Unlock administration" shield: +## Modify Settings -![](images/account_option.png) +You already completed the required steps of choosing your language, region, and time zone in the setup wizard, and are now logged in as an administrator. +If you didn't add a geographic location during setup, you can do so via the Settings. +You can also set your preferred measurement system (openHAB defaults to the Metric system). -Note that by default, using openHAB doesn't require you to sign in. -Only administrative operations require a user with an administrator role to be logged in. +### Set your geographic location (latitude and longitude) and measurement system -## Initial Settings +1. In the left-hand menu under Administration, select Settings to open the Settings page. -Most of the needed settings have already been accomplished, when you have followed the wizard. -For further configuration (e.g. the measurement system) click on Settings. + ![initial settings](images/initial_settings.png) -![](images/initial_settings.png) +1. Under System Settings, select Regional Settings. -Click on Regional Settings under System Services. + ![regional settings](images/regional_settings.png) -![](images/regional_settings.png) +1. Under Location, click the Map button to add your geographic coordinates. -If you're not using the metric system, click "Show advanced" and change the measurement system. +1. If you also want to set your measurement system, click "Show advanced" and choose between Metric and Imperial. -![](images/units_settings.png) + ![unit settings](images/units_settings.png) ## Additional Settings + The following settings are available but not covered by this tutorial. Setting | Purpose diff --git a/tutorials/getting_started/images/Customize_location_card_form.png b/tutorials/getting_started/images/Customize_location_card_form.png new file mode 100644 index 000000000..cbdf59be5 Binary files /dev/null and b/tutorials/getting_started/images/Customize_location_card_form.png differ diff --git a/tutorials/getting_started/images/account_option.png b/tutorials/getting_started/images/account_option.png index f1fcafb69..e29d99063 100644 Binary files a/tutorials/getting_started/images/account_option.png and b/tutorials/getting_started/images/account_option.png differ diff --git a/tutorials/getting_started/images/add_hue_bridge.png b/tutorials/getting_started/images/add_hue_bridge.png index c1bf929f8..6e5930642 100644 Binary files a/tutorials/getting_started/images/add_hue_bridge.png and b/tutorials/getting_started/images/add_hue_bridge.png differ diff --git a/tutorials/getting_started/images/add_members_change.png b/tutorials/getting_started/images/add_members_change.png new file mode 100644 index 000000000..6da55dd31 Binary files /dev/null and b/tutorials/getting_started/images/add_members_change.png differ diff --git a/tutorials/getting_started/images/add_metadata_model.png b/tutorials/getting_started/images/add_metadata_model.png new file mode 100644 index 000000000..06d839a18 Binary files /dev/null and b/tutorials/getting_started/images/add_metadata_model.png differ diff --git a/tutorials/getting_started/images/add_separator.png b/tutorials/getting_started/images/add_separator.png new file mode 100644 index 000000000..84045868a Binary files /dev/null and b/tutorials/getting_started/images/add_separator.png differ diff --git a/tutorials/getting_started/images/admin_user.png b/tutorials/getting_started/images/admin_user.png new file mode 100644 index 000000000..4f1595fb2 Binary files /dev/null and b/tutorials/getting_started/images/admin_user.png differ diff --git a/tutorials/getting_started/images/administrator.png b/tutorials/getting_started/images/administrator.png index 8aeb414dd..451cdb5e2 100644 Binary files a/tutorials/getting_started/images/administrator.png and b/tutorials/getting_started/images/administrator.png differ diff --git a/tutorials/getting_started/images/all_lights_widget.png b/tutorials/getting_started/images/all_lights_widget.png new file mode 100644 index 000000000..1984f5f58 Binary files /dev/null and b/tutorials/getting_started/images/all_lights_widget.png differ diff --git a/tutorials/getting_started/images/applying_custom_list_widget.png b/tutorials/getting_started/images/applying_custom_list_widget.png new file mode 100644 index 000000000..dbdbe98fa Binary files /dev/null and b/tutorials/getting_started/images/applying_custom_list_widget.png differ diff --git a/tutorials/getting_started/images/blank_overview.png b/tutorials/getting_started/images/blank_overview.png new file mode 100644 index 000000000..541f78625 Binary files /dev/null and b/tutorials/getting_started/images/blank_overview.png differ diff --git a/tutorials/getting_started/images/choose_binding.png b/tutorials/getting_started/images/choose_binding.png index 36cbb0cd2..35d0af53e 100644 Binary files a/tutorials/getting_started/images/choose_binding.png and b/tutorials/getting_started/images/choose_binding.png differ diff --git a/tutorials/getting_started/images/choose_transformation.png b/tutorials/getting_started/images/choose_transformation.png index 7a1798123..32db34e04 100644 Binary files a/tutorials/getting_started/images/choose_transformation.png and b/tutorials/getting_started/images/choose_transformation.png differ diff --git a/tutorials/getting_started/images/chromecast_props_set.png b/tutorials/getting_started/images/chromecast_props_set.png new file mode 100644 index 000000000..9f3d75584 Binary files /dev/null and b/tutorials/getting_started/images/chromecast_props_set.png differ diff --git a/tutorials/getting_started/images/chromecast_widget.png b/tutorials/getting_started/images/chromecast_widget.png new file mode 100644 index 000000000..efc16a19f Binary files /dev/null and b/tutorials/getting_started/images/chromecast_widget.png differ diff --git a/tutorials/getting_started/images/chromecast_widget_noprops.png b/tutorials/getting_started/images/chromecast_widget_noprops.png new file mode 100644 index 000000000..99add6682 Binary files /dev/null and b/tutorials/getting_started/images/chromecast_widget_noprops.png differ diff --git a/tutorials/getting_started/images/column_options.png b/tutorials/getting_started/images/column_options.png new file mode 100644 index 000000000..527431079 Binary files /dev/null and b/tutorials/getting_started/images/column_options.png differ diff --git a/tutorials/getting_started/images/create_equipment_model.png b/tutorials/getting_started/images/create_equipment_model.png index e4a5d6daf..9c5349662 100644 Binary files a/tutorials/getting_started/images/create_equipment_model.png and b/tutorials/getting_started/images/create_equipment_model.png differ diff --git a/tutorials/getting_started/images/create_equipment_model_added.png b/tutorials/getting_started/images/create_equipment_model_added.png index 456a8654f..8c48a080c 100644 Binary files a/tutorials/getting_started/images/create_equipment_model_added.png and b/tutorials/getting_started/images/create_equipment_model_added.png differ diff --git a/tutorials/getting_started/images/create_equipment_model_channels.png b/tutorials/getting_started/images/create_equipment_model_channels.png index c0f8d5851..411498747 100644 Binary files a/tutorials/getting_started/images/create_equipment_model_channels.png and b/tutorials/getting_started/images/create_equipment_model_channels.png differ diff --git a/tutorials/getting_started/images/create_equipment_things_added.png b/tutorials/getting_started/images/create_equipment_things_added.png index 3489fa87f..3010f4e6a 100644 Binary files a/tutorials/getting_started/images/create_equipment_things_added.png and b/tutorials/getting_started/images/create_equipment_things_added.png differ diff --git a/tutorials/getting_started/images/create_equipment_things_channels.png b/tutorials/getting_started/images/create_equipment_things_channels.png index 082e25b7f..adef5f9a2 100644 Binary files a/tutorials/getting_started/images/create_equipment_things_channels.png and b/tutorials/getting_started/images/create_equipment_things_channels.png differ diff --git a/tutorials/getting_started/images/create_equipment_things_location.png b/tutorials/getting_started/images/create_equipment_things_location.png index 28cd6ba91..6f3a6caf4 100644 Binary files a/tutorials/getting_started/images/create_equipment_things_location.png and b/tutorials/getting_started/images/create_equipment_things_location.png differ diff --git a/tutorials/getting_started/images/create_equipment_things_parent.png b/tutorials/getting_started/images/create_equipment_things_parent.png index 440505bb9..df580ff9f 100644 Binary files a/tutorials/getting_started/images/create_equipment_things_parent.png and b/tutorials/getting_started/images/create_equipment_things_parent.png differ diff --git a/tutorials/getting_started/images/create_item.png b/tutorials/getting_started/images/create_item.png new file mode 100644 index 000000000..742569fd5 Binary files /dev/null and b/tutorials/getting_started/images/create_item.png differ diff --git a/tutorials/getting_started/images/create_link.png b/tutorials/getting_started/images/create_link.png new file mode 100644 index 000000000..696c55e11 Binary files /dev/null and b/tutorials/getting_started/images/create_link.png differ diff --git a/tutorials/getting_started/images/create_location.png b/tutorials/getting_started/images/create_location.png index 3f54714a7..d41fdd981 100644 Binary files a/tutorials/getting_started/images/create_location.png and b/tutorials/getting_started/images/create_location.png differ diff --git a/tutorials/getting_started/images/create_user.png b/tutorials/getting_started/images/create_user.png index 85044ffb6..d4567cf2d 100644 Binary files a/tutorials/getting_started/images/create_user.png and b/tutorials/getting_started/images/create_user.png differ diff --git a/tutorials/getting_started/images/custom_widget_editor.png b/tutorials/getting_started/images/custom_widget_editor.png new file mode 100644 index 000000000..e3aae989f Binary files /dev/null and b/tutorials/getting_started/images/custom_widget_editor.png differ diff --git a/tutorials/getting_started/images/discovered_hue_things.png b/tutorials/getting_started/images/discovered_hue_things.png index 0e1abf20b..04f32c562 100644 Binary files a/tutorials/getting_started/images/discovered_hue_things.png and b/tutorials/getting_started/images/discovered_hue_things.png differ diff --git a/tutorials/getting_started/images/empty_things_menu.png b/tutorials/getting_started/images/empty_things_menu.png index 294704d18..dec887380 100644 Binary files a/tutorials/getting_started/images/empty_things_menu.png and b/tutorials/getting_started/images/empty_things_menu.png differ diff --git a/tutorials/getting_started/images/equipment_card.png b/tutorials/getting_started/images/equipment_card.png new file mode 100644 index 000000000..e75eab5d2 Binary files /dev/null and b/tutorials/getting_started/images/equipment_card.png differ diff --git a/tutorials/getting_started/images/equipment_tab.png b/tutorials/getting_started/images/equipment_tab.png new file mode 100644 index 000000000..a20a9bd03 Binary files /dev/null and b/tutorials/getting_started/images/equipment_tab.png differ diff --git a/tutorials/getting_started/images/example_model.png b/tutorials/getting_started/images/example_model.png index 8a2f76411..060148b0f 100644 Binary files a/tutorials/getting_started/images/example_model.png and b/tutorials/getting_started/images/example_model.png differ diff --git a/tutorials/getting_started/images/expression_tester.png b/tutorials/getting_started/images/expression_tester.png new file mode 100644 index 000000000..60f66798f Binary files /dev/null and b/tutorials/getting_started/images/expression_tester.png differ diff --git a/tutorials/getting_started/images/garage_list_widget.png b/tutorials/getting_started/images/garage_list_widget.png new file mode 100644 index 000000000..bf4afdefc Binary files /dev/null and b/tutorials/getting_started/images/garage_list_widget.png differ diff --git a/tutorials/getting_started/images/habot_text.png b/tutorials/getting_started/images/habot_text.png new file mode 100644 index 000000000..cf5776e09 Binary files /dev/null and b/tutorials/getting_started/images/habot_text.png differ diff --git a/tutorials/getting_started/images/hidden_points.png b/tutorials/getting_started/images/hidden_points.png new file mode 100644 index 000000000..9cfa3f046 Binary files /dev/null and b/tutorials/getting_started/images/hidden_points.png differ diff --git a/tutorials/getting_started/images/hue_bridge_config_error.png b/tutorials/getting_started/images/hue_bridge_config_error.png index 907b2bf6a..beabc984a 100644 Binary files a/tutorials/getting_started/images/hue_bridge_config_error.png and b/tutorials/getting_started/images/hue_bridge_config_error.png differ diff --git a/tutorials/getting_started/images/hue_bridge_offline.png b/tutorials/getting_started/images/hue_bridge_offline.png index 82ea9d82a..ff4e3d88b 100644 Binary files a/tutorials/getting_started/images/hue_bridge_offline.png and b/tutorials/getting_started/images/hue_bridge_offline.png differ diff --git a/tutorials/getting_started/images/hue_bridge_online.png b/tutorials/getting_started/images/hue_bridge_online.png index 896d41989..372f870e7 100644 Binary files a/tutorials/getting_started/images/hue_bridge_online.png and b/tutorials/getting_started/images/hue_bridge_online.png differ diff --git a/tutorials/getting_started/images/hue_bulk_add.png b/tutorials/getting_started/images/hue_bulk_add.png index b310856fe..6f2e9650d 100644 Binary files a/tutorials/getting_started/images/hue_bulk_add.png and b/tutorials/getting_started/images/hue_bulk_add.png differ diff --git a/tutorials/getting_started/images/hue_inbox.png b/tutorials/getting_started/images/hue_inbox.png index f3a8d326c..62de50850 100644 Binary files a/tutorials/getting_started/images/hue_inbox.png and b/tutorials/getting_started/images/hue_inbox.png differ diff --git a/tutorials/getting_started/images/hue_individual_add.png b/tutorials/getting_started/images/hue_individual_add.png index 85dfe6ab6..f2f8e221e 100644 Binary files a/tutorials/getting_started/images/hue_individual_add.png and b/tutorials/getting_started/images/hue_individual_add.png differ diff --git a/tutorials/getting_started/images/hue_things_added.png b/tutorials/getting_started/images/hue_things_added.png index b5db51eac..f51a85eb7 100644 Binary files a/tutorials/getting_started/images/hue_things_added.png and b/tutorials/getting_started/images/hue_things_added.png differ diff --git a/tutorials/getting_started/images/hue_things_discover_bridge.png b/tutorials/getting_started/images/hue_things_discover_bridge.png index 4434d4252..5f3d4df70 100644 Binary files a/tutorials/getting_started/images/hue_things_discover_bridge.png and b/tutorials/getting_started/images/hue_things_discover_bridge.png differ diff --git a/tutorials/getting_started/images/initial_settings.png b/tutorials/getting_started/images/initial_settings.png index 44201ddac..f92139283 100644 Binary files a/tutorials/getting_started/images/initial_settings.png and b/tutorials/getting_started/images/initial_settings.png differ diff --git a/tutorials/getting_started/images/install_hue.png b/tutorials/getting_started/images/install_hue.png index 594d0a3f4..352188602 100644 Binary files a/tutorials/getting_started/images/install_hue.png and b/tutorials/getting_started/images/install_hue.png differ diff --git a/tutorials/getting_started/images/install_jsonpath.png b/tutorials/getting_started/images/install_jsonpath.png index f668f9cee..ec18d16d3 100644 Binary files a/tutorials/getting_started/images/install_jsonpath.png and b/tutorials/getting_started/images/install_jsonpath.png differ diff --git a/tutorials/getting_started/images/install_zwave.png b/tutorials/getting_started/images/install_zwave.png index 51d209e5e..e762154a2 100644 Binary files a/tutorials/getting_started/images/install_zwave.png and b/tutorials/getting_started/images/install_zwave.png differ diff --git a/tutorials/getting_started/images/installed_hue.png b/tutorials/getting_started/images/installed_hue.png index 4434d4252..5f3d4df70 100644 Binary files a/tutorials/getting_started/images/installed_hue.png and b/tutorials/getting_started/images/installed_hue.png differ diff --git a/tutorials/getting_started/images/installed_zwave.png b/tutorials/getting_started/images/installed_zwave.png index a6ef110fb..04ddefdfd 100644 Binary files a/tutorials/getting_started/images/installed_zwave.png and b/tutorials/getting_started/images/installed_zwave.png differ diff --git a/tutorials/getting_started/images/installing_hue.png b/tutorials/getting_started/images/installing_hue.png index fa9bc12ac..dcc5e7b20 100644 Binary files a/tutorials/getting_started/images/installing_hue.png and b/tutorials/getting_started/images/installing_hue.png differ diff --git a/tutorials/getting_started/images/installing_zwave.png b/tutorials/getting_started/images/installing_zwave.png index d6259fc4d..07d6e9431 100644 Binary files a/tutorials/getting_started/images/installing_zwave.png and b/tutorials/getting_started/images/installing_zwave.png differ diff --git a/tutorials/getting_started/images/kitchen_widget_props.png b/tutorials/getting_started/images/kitchen_widget_props.png new file mode 100644 index 000000000..fca9c8d0d Binary files /dev/null and b/tutorials/getting_started/images/kitchen_widget_props.png differ diff --git a/tutorials/getting_started/images/light_list_widget_form.png b/tutorials/getting_started/images/light_list_widget_form.png new file mode 100644 index 000000000..147613dd0 Binary files /dev/null and b/tutorials/getting_started/images/light_list_widget_form.png differ diff --git a/tutorials/getting_started/images/livingroom_card_equip.png b/tutorials/getting_started/images/livingroom_card_equip.png new file mode 100644 index 000000000..57c8c657b Binary files /dev/null and b/tutorials/getting_started/images/livingroom_card_equip.png differ diff --git a/tutorials/getting_started/images/locations_model.png b/tutorials/getting_started/images/locations_model.png index ed6ae7666..cf4fcb300 100644 Binary files a/tutorials/getting_started/images/locations_model.png and b/tutorials/getting_started/images/locations_model.png differ diff --git a/tutorials/getting_started/images/locations_tab.png b/tutorials/getting_started/images/locations_tab.png new file mode 100644 index 000000000..e2c1ddf15 Binary files /dev/null and b/tutorials/getting_started/images/locations_tab.png differ diff --git a/tutorials/getting_started/images/menu_icon.png b/tutorials/getting_started/images/menu_icon.png index 70765bb85..fb2f45549 100644 Binary files a/tutorials/getting_started/images/menu_icon.png and b/tutorials/getting_started/images/menu_icon.png differ diff --git a/tutorials/getting_started/images/mqtt_bridge_config.png b/tutorials/getting_started/images/mqtt_bridge_config.png index cec0ad8d0..28e2e67e2 100644 Binary files a/tutorials/getting_started/images/mqtt_bridge_config.png and b/tutorials/getting_started/images/mqtt_bridge_config.png differ diff --git a/tutorials/getting_started/images/mqtt_config_channel.png b/tutorials/getting_started/images/mqtt_config_channel.png index 6588ed69f..a95d2afcc 100644 Binary files a/tutorials/getting_started/images/mqtt_config_channel.png and b/tutorials/getting_started/images/mqtt_config_channel.png differ diff --git a/tutorials/getting_started/images/mqtt_generic_thing.png b/tutorials/getting_started/images/mqtt_generic_thing.png index 54e80263c..071b66c83 100644 Binary files a/tutorials/getting_started/images/mqtt_generic_thing.png and b/tutorials/getting_started/images/mqtt_generic_thing.png differ diff --git a/tutorials/getting_started/images/mqtt_temp_channel.png b/tutorials/getting_started/images/mqtt_temp_channel.png index 2a244c58e..712cc1c52 100644 Binary files a/tutorials/getting_started/images/mqtt_temp_channel.png and b/tutorials/getting_started/images/mqtt_temp_channel.png differ diff --git a/tutorials/getting_started/images/mqtt_temp_channel_created.png b/tutorials/getting_started/images/mqtt_temp_channel_created.png index c837cf989..5370bb112 100644 Binary files a/tutorials/getting_started/images/mqtt_temp_channel_created.png and b/tutorials/getting_started/images/mqtt_temp_channel_created.png differ diff --git a/tutorials/getting_started/images/mqtt_things.png b/tutorials/getting_started/images/mqtt_things.png index c49ee8314..7ff29a995 100644 Binary files a/tutorials/getting_started/images/mqtt_things.png and b/tutorials/getting_started/images/mqtt_things.png differ diff --git a/tutorials/getting_started/images/now_visible_points.png b/tutorials/getting_started/images/now_visible_points.png new file mode 100644 index 000000000..4fec0d436 Binary files /dev/null and b/tutorials/getting_started/images/now_visible_points.png differ diff --git a/tutorials/getting_started/images/other_apps.png b/tutorials/getting_started/images/other_apps.png new file mode 100644 index 000000000..513a5d527 Binary files /dev/null and b/tutorials/getting_started/images/other_apps.png differ diff --git a/tutorials/getting_started/images/overview_edit_page.png b/tutorials/getting_started/images/overview_edit_page.png new file mode 100644 index 000000000..eaef5a06c Binary files /dev/null and b/tutorials/getting_started/images/overview_edit_page.png differ diff --git a/tutorials/getting_started/images/overview_preview.png b/tutorials/getting_started/images/overview_preview.png new file mode 100644 index 000000000..5f23ca2f6 Binary files /dev/null and b/tutorials/getting_started/images/overview_preview.png differ diff --git a/tutorials/getting_started/images/overview_row1_config.png b/tutorials/getting_started/images/overview_row1_config.png new file mode 100644 index 000000000..1e339af0f Binary files /dev/null and b/tutorials/getting_started/images/overview_row1_config.png differ diff --git a/tutorials/getting_started/images/overview_row_and_columns.png b/tutorials/getting_started/images/overview_row_and_columns.png new file mode 100644 index 000000000..8e8ca98f1 Binary files /dev/null and b/tutorials/getting_started/images/overview_row_and_columns.png differ diff --git a/tutorials/getting_started/images/pencil_icon.png b/tutorials/getting_started/images/pencil_icon.png new file mode 100644 index 000000000..aa473e40d Binary files /dev/null and b/tutorials/getting_started/images/pencil_icon.png differ diff --git a/tutorials/getting_started/images/properties_card.png b/tutorials/getting_started/images/properties_card.png new file mode 100644 index 000000000..7c722eee2 Binary files /dev/null and b/tutorials/getting_started/images/properties_card.png differ diff --git a/tutorials/getting_started/images/properties_chart.png b/tutorials/getting_started/images/properties_chart.png new file mode 100644 index 000000000..deedfd495 Binary files /dev/null and b/tutorials/getting_started/images/properties_chart.png differ diff --git a/tutorials/getting_started/images/properties_tab.png b/tutorials/getting_started/images/properties_tab.png new file mode 100644 index 000000000..d9cf403f8 Binary files /dev/null and b/tutorials/getting_started/images/properties_tab.png differ diff --git a/tutorials/getting_started/images/regional_settings.png b/tutorials/getting_started/images/regional_settings.png index f6e6b722f..54596f472 100644 Binary files a/tutorials/getting_started/images/regional_settings.png and b/tutorials/getting_started/images/regional_settings.png differ diff --git a/tutorials/getting_started/images/regular_user.png b/tutorials/getting_started/images/regular_user.png new file mode 100644 index 000000000..ff7a3eb80 Binary files /dev/null and b/tutorials/getting_started/images/regular_user.png differ diff --git a/tutorials/getting_started/images/remove_from_model.png b/tutorials/getting_started/images/remove_from_model.png new file mode 100644 index 000000000..bd18376e3 Binary files /dev/null and b/tutorials/getting_started/images/remove_from_model.png differ diff --git a/tutorials/getting_started/images/select_members.png b/tutorials/getting_started/images/select_members.png new file mode 100644 index 000000000..beadda0d3 Binary files /dev/null and b/tutorials/getting_started/images/select_members.png differ diff --git a/tutorials/getting_started/images/separators.png b/tutorials/getting_started/images/separators.png new file mode 100644 index 000000000..cc7d31116 Binary files /dev/null and b/tutorials/getting_started/images/separators.png differ diff --git a/tutorials/getting_started/images/shield.png b/tutorials/getting_started/images/shield.png index e5558e1d9..1c7d5d392 100644 Binary files a/tutorials/getting_started/images/shield.png and b/tutorials/getting_started/images/shield.png differ diff --git a/tutorials/getting_started/images/start_model.png b/tutorials/getting_started/images/start_model.png index 25b789d1a..87007374f 100644 Binary files a/tutorials/getting_started/images/start_model.png and b/tutorials/getting_started/images/start_model.png differ diff --git a/tutorials/getting_started/images/state_description.png b/tutorials/getting_started/images/state_description.png new file mode 100644 index 000000000..4788f504b Binary files /dev/null and b/tutorials/getting_started/images/state_description.png differ diff --git a/tutorials/getting_started/images/units_settings.png b/tutorials/getting_started/images/units_settings.png index 9cf380544..5205f0493 100644 Binary files a/tutorials/getting_started/images/units_settings.png and b/tutorials/getting_started/images/units_settings.png differ diff --git a/tutorials/getting_started/images/welcome_page.png b/tutorials/getting_started/images/welcome_page.png index ea2aee9b9..a96deaffc 100644 Binary files a/tutorials/getting_started/images/welcome_page.png and b/tutorials/getting_started/images/welcome_page.png differ diff --git a/tutorials/getting_started/images/wizard_addons.png b/tutorials/getting_started/images/wizard_addons.png index 7917ee561..0f8d16885 100644 Binary files a/tutorials/getting_started/images/wizard_addons.png and b/tutorials/getting_started/images/wizard_addons.png differ diff --git a/tutorials/getting_started/images/wizard_geo.png b/tutorials/getting_started/images/wizard_geo.png index af7541a68..6fd6c43fa 100644 Binary files a/tutorials/getting_started/images/wizard_geo.png and b/tutorials/getting_started/images/wizard_geo.png differ diff --git a/tutorials/getting_started/images/wizard_location.png b/tutorials/getting_started/images/wizard_location.png index 2de065bf2..2989dfe57 100644 Binary files a/tutorials/getting_started/images/wizard_location.png and b/tutorials/getting_started/images/wizard_location.png differ diff --git a/tutorials/getting_started/images/wizard_welcome.png b/tutorials/getting_started/images/wizard_welcome.png index df076df6c..6efaa1afe 100644 Binary files a/tutorials/getting_started/images/wizard_welcome.png and b/tutorials/getting_started/images/wizard_welcome.png differ diff --git a/tutorials/getting_started/images/zwave_add_controller.png b/tutorials/getting_started/images/zwave_add_controller.png index f8eb25db2..afe6dbba6 100644 Binary files a/tutorials/getting_started/images/zwave_add_controller.png and b/tutorials/getting_started/images/zwave_add_controller.png differ diff --git a/tutorials/getting_started/images/zwave_port_config.png b/tutorials/getting_started/images/zwave_port_config.png index 31b639284..ae99f822e 100644 Binary files a/tutorials/getting_started/images/zwave_port_config.png and b/tutorials/getting_started/images/zwave_port_config.png differ diff --git a/tutorials/getting_started/index.md b/tutorials/getting_started/index.md index 50ca4698a..7dd66867d 100644 --- a/tutorials/getting_started/index.md +++ b/tutorials/getting_started/index.md @@ -3,30 +3,34 @@ layout: documentation title: Getting Started - Introduction --- -{% include base.html %} +# Welcome -# Welcome! - -Welcome to openHAB 3! +Welcome to openHAB. We hope that your journey with openHAB is a rewarding one. If you encounter problems or simply cannot figure something out on your own, please do not hesitate to post a question on [the forum](https://community.openhab.org). -There are many fellow openHAB users ready and willing to help as much as possible. -Most requests for help receive a response within a couple of hours. +There are many fellow openHAB users ready to help out, and polite constructive feedback can help us to improve this documentation for the next new user. +Most requests for help usually receive a response within a couple of hours, but please use the search on the forum to check if the topic has already been discussed. -First, a word on the order of the sections in the docs. -This tutorial assumes users have read the concepts and installation guides already. -Thus it assumes at least a basic knowledge of the concepts of openHAB. -The tutorial also assumes that the user has already installed openHAB and confirmed it is working. +This new user tutorial assumes that you have at least a basic understanding of the [concepts of openHAB](https://www.openhab.org/docs/concepts/), and already have a working installation of openHAB. ## File-based vs. UI-driven Configuration -Early on the user must choose between a text file based configuration or a User Interface driven configuration. -Switching from one approach to the other later on is not trivial. +Early on you must choose between either textual (file) based configuration, or the easier to use User Interface (UI) method for your setting up and configuration needs. +This getting started tutorial will only cover the easier UI method, however since many areas of the documentation give textual examples (often marked as `Full Example`), it is important to recognize that these examples do not apply if you have chosen to use the UI. +If this does not make sense at the moment, don't worry, just continue on with this tutorial to learn how to use the UI method first, as you can always come back and learn how to use file based configuration. + +When using the UI method you will notice that most configuration screens will have a "Code" tab. +If you run into problems or want to share something that you've created through the UI, click on the "Code" tab and post that YAML to the forum ( [using code fences](https://community.openhab.org/t/how-to-use-code-fences/38383) ) instead of, or in addition to using screen shots. + +You can review the reference documentation for details on the text based approach here . +Whilst it is possible to mix the two, for example use the UI for things and files for items, doing this is not recommended as it increases complexity. To help you choose between the two approaches, the following is a summary of the pros & cons for each: ### File-based + Pros: + - File based has been the only really practical way to define most objects (things excluded) in previous versions, so a lot of examples in the docs and the forum will assume that approach. However, as time passes there will be more and more UI driven examples. - With file based configs it is easier to make bulk changes and bulk updates, to duplicate similar objects, and to separate domains into distinct files. - The config files can be treated as source files, easing backups and version control. Though that does not mean that source control, backups, and version control cannot be done with UI driven configs. @@ -34,39 +38,33 @@ Pros: - Easier to share configurations between multiple openHAB instances. Cons: + - Config files are more prone to errors. The slightest typo leads to a syntax error that could cause the file to become invalid, which will result in everything defined in that file being removed from the system until you fix it. - The syntax for the config files can be a little overwhelming for novice users, as you have to learn and understand the syntax in addition to openHAB concepts and home automation technologies. - You will see most objects defined in files in the UI but you won't be able to edit them (those objects will have a lock besides their name/label :lock:). - You need to sit in front of a computer with access to the files to make changes. ### UI-driven + Pros: -- Easier to understand for novices. The UI assists you with built in documents and help. There's fewer opportunities to make mistakes since the syntax is almost impossible to get wrong. + +- Easier to understand for novices. The UI assists you with its built in documents and help. There are fewer opportunities to make mistakes since the syntax is almost impossible to get wrong. - All objects can be altered from anywhere the UI can be reached (including on mobile). - Things can be auto-discovered. -- Items can be auto-created from Things (with a chance to edit). -- The internal database is somewhat faster, especially on resource-limited devices (e.g. Raspberry Pis) than the file parsing. +- Items can be auto-created from Things (with the ability to edit). +- The internal database is somewhat faster, especially on resource-limited devices (e.g. Raspberry Pis) compared to reading the file based contents. - A backup of the internal database is created on every change. Cons: -- Can be slower to reach one's goals if you already know what you're doing and if there's a lot of bulk changes or duplicating required. + +- Can be slower to reach one's goal if you already know what you're doing and if there's a lot of bulk changes or duplicating required. - Harder to remove obsolete stuff. - Some things cannot be configured with the UI yet (e.g. persistence). - You need to sit in front of a device with access to the UI to make changes. -It's possible to mix the two, for example use the UI for things and files for items, but avoid using both techniques at the same time in other cases. -This tutorial targets new users. -Therefore the tutorial will present a purely UI-driven approach. -Review the reference documentation for details on the text based approach. - -When building a configuration through the UI, one still has access to a text based YAML formatted representation of their configs. -On most of the configuration screens there will be two tabs, a "Design" tab anda "Code" tab. -If you run into problems or want to share something you've created through the UI, click on the "Code" tab and post that YAML to the forum using code fences instead of or in addition to screen shots. - ## Table of Contents -This tutorial presents a series of steps that build upon one another so please review the tutorial in order. -There may be concepts or steps that are presented earlier that are required to understand the parts of the tutorial presented later. +This tutorial presents a series of concepts and steps that build upon one another, so please review the tutorial in the recommended order. [First Steps]({{base}}/tutorial/first_steps.html): Initial configuration @@ -76,17 +74,19 @@ There may be concepts or steps that are presented earlier that are required to u [Adding Things: Advanced]({{base}}/tutorial/things_advanced.html): Manual creation of Things -[Items and the Semantic Model]({{base}}/tutorial/model.html): Creating Items and putting them into a semantic model +[Items and the Semantic Model]({{base}}/tutorial/model.html): Creating Items and Putting Them into a Semantic Model -[Persistence]({{base}}/tutorial/persistence.html): Saving and retrieving historic data +[Persistence]({{base}}/tutorial/persistence.html): Saving and Retrieving Historic Data + +[Intro to Pages]({{base}}/tutorial/pages_intro.html): Visualizing and Using the Home Automation + +[Overview Page]({{base}}/tutorial/auto_overview.html): Automatically Generated Overview Page + +[Item Widget Customization]({{base}}/tutorial/item_widgets.html): Customize How Items Appear in Cards + +[Custom Item Widgets]({{base}}/tutorial/custom_widgets.html): Creating your own widgets We have an Indoor location which has a House. @@ -52,9 +69,12 @@ The House has a Ground Floor and the Ground Floor has rooms including a Living R The Living Room has a Rollershutter equipment which in turn has a Control and Power point Item. The locations and equipment are Group Items and Control and Power are other types of Items. -One key feature of the this example model is that you are not required to *only* use the semantic model. +As discussed, one is not required to *only* use the semantic model. It is possible and encouraged to create Groups and Items that are outside of the model where necessary. -In this example, the Rollershutter in the Living Room is a member of the AllRollershutters Group which could be used to determine if any are OPEN and send commands to all the rollershutters in the house at once. +In this example, the Rollershutter in the Living Room is a member of the `AllRollershutters` Group which could be used to determine if any are OPEN and send commands to all the rollershutters in the house at once. +But this functional cross cutting Group is not an Equipment nor is it a Location and it violates the restrictions of the model. +A typical installation may only have 60%-80% of all the Items in the model. +More about creating Items and Groups outside of the model is below. You can use as few or as many layers of Locations as you wish to model your home. For instance if you live in a flat (apartment) your root Locations might just be the rooms. @@ -77,11 +97,11 @@ Using the example above, the Z-Wave plug might be modeled as a subequipment of t From the Settings screen, click on Model. -![](images/start_model.png) +![start model](images/start_model.png) Let's start with a hierarchy of Locations. Click on Add Location. -![](images/create_location.png) +![create location](images/create_location.png) Add your first item, a Group representing the ground floor. Give it a name, but choose carefully as you cannot change it afterward. @@ -89,9 +109,9 @@ Choose a label, a category (it mostly defines the default icon), and then specia Here we use "GroundFloor". Once it's created, make sure it's still selected on the left, and click on "Add Location" again. -This will add another location _within_ the first floor. +This will add another location _within_ the ground floor. Typically rooms are directly under floor locations. -Add an item representing the living room, calling it `Living`. +Add an item representing the living room, calling it `LivingRoom`. Set the `sofa` category and the `LivingRoom` semantic class. Now let's add the kitchen. Make sure to select Ground Floor again and choose Add Location to add the third item (name: `Kitchen`, category: kitchen, semantic class: Kitchen). @@ -102,7 +122,7 @@ Add the ground floor and its rooms (master bedroom, bathroom, etc...) to your mo You should end up with something resembling this: -![](images/locations_model.png) +![model locations](images/locations_model.png) ## Modeling Equipment @@ -114,16 +134,16 @@ If the Equipment you're adding is one of the Things that you have already added, Select where in the model you want to add the Equipment, for instance the kitchen, and click on Create Equipment from Thing. -![](images/create_equipment_model.png) +![model create equipment](images/create_equipment_model.png) Select the Thing you want to create the Equipment from, and alter the details of the Equipment item that will be created. -If you don't find an appropriate Equipment class, choose Equipment. +If you don't find an appropriate Semantic Class, choose **Equipment**. Below are all the Channels defined by the Thing. Sometimes Things will have hundreds of channels, so here you have the opportunity of choosing which ones will be linked to new Points items. Check the channels you're interested in and only those. -![](images/create_equipment_model_channels.png) +![model create equipment channels](images/create_equipment_model_channels.png) For the plant sensor Thing added earlier, we have an opportunity to change the default basic Number types and make them quantifiable. Quantity types (Number with a dimension) provide conversion facilities between Units of Measurement, and the default persistence is more granular. @@ -134,7 +154,7 @@ Also set the semantic class to Measurement and choose an appropriate related pro When you're finished, click Add in the title bar. The Equipment and Points should be added to the model where you wanted. -![](images/create_equipment_model_added.png) +![model created equipment added](images/create_equipment_model_added.png) The "Plant Sensor" Equipment has now been created under the Kitchen location, and all the selected Points represent the selected Channels of the Thing. @@ -143,25 +163,25 @@ The "Plant Sensor" Equipment has now been created under the Kitchen location, an From the Settings, click on Things and then click on the Thing you wish to add to the model. Switch to the Channels tab. -![](images/create_equipment_things_channels.png) +![create equipment things channels](images/create_equipment_things_channels.png) Click on Add Equipment to Model below the list. You'll encounter a similar screen to the one above. The difference is, rather than selecting the Thing, you have to select where in the model you want to add the Equipment. -![](images/create_equipment_things_location.png) +![create equipment things location](images/create_equipment_things_location.png) Select Pick From Model in the Parent Group section, and the tree view of the Locations and Equipments will appear. Select the parent group, for instance Living Room, then choose Pick in the top-right corner of the dialog box. If this equipment is a part of another equipment, choose that equipment as the parent instead of a location. -![](images/create_equipment_things_parent.png) +![create equipment things parent](images/create_equipment_things_parent.png) Then do the same as above, configure the Equipment item and the Points, then click Add. -Go back to the Model by choosing Model in the sidebar and verify that the Equipment added to the model from the thing page is effectively there as well as its Points. +Go back to the Model by choosing Model in the sidebar and verify that the Equipment added to the model from the thing page is effectively there as well as, its Points. -![](images/create_equipment_things_added.png) +![create equipment things added](images/create_equipment_things_added.png) Note how the Channel Links section lists the link to the Thing/Channel, and you also have a control widget to control the item. Since it's linked to the Color channel of the Hue bulb, the light will reflect the state of the item. @@ -169,6 +189,7 @@ Since it's linked to the Color channel of the Hue bulb, the light will reflect t Finish adding Equipment and Points from your Things. ## Retrofitting Existing Items to the Model + There may be times where a user needs to add existing Items to their model. Perhaps they are migrating from an older version of OH, they did not follow the advice above to start with the model to begin with, or they are following a tutorial or example that doesn't include the model. In this case all is not lost. @@ -178,8 +199,108 @@ Then add the Point as a member of the appropriate Equipment or Location Group. If the Equipment Group doesn't exist yet, create a Group and use the appropriate Equipment semantic tag first and add the Equipment to the appropriate Location Group. ## Modifying the Model + As illustrated here, the model consists mainly of Group membership and tags on Items. To change the location of an equipment or room, simply change the parent Group. To change the type of an equipment or point, simply edit the tags. Some of these edits are possible from the Model Page itself. Where that's not supported, you can make the changes through the Item's Page. + +## Badges + +This is a table describing the Equipment, Point and Property classes needed to enable the display of status and measurement badges on the location cards. + +| Badge | Type | Equipment | Point | Property | +|--------------|-------------|------------------------------------------------------------|------------------------------------|-------------| +| Lights | Status | *Any* | Control, Switch | Light | +| Windows | Status | Window | OpenState | *Any* | +| Doors | Status | Door, FrontDoor, BackDoor, InnerDoor, CellarDoor, SideDoor | OpenState | *Any* | +| Garage Doors | Status | GarageDoor | OpenState | *Any* | +| Blinds | Status | Blinds | OpenState | *Any* | +| Presence | Status | *Any* | Status | Presence | +| Lock | Status | Lock | Status, OpenState, Control, Switch | *Any* | +| Climate | Status | HVAC | Status, Control, Switch | *Any* | +| Screens | Status | Screen, Television | Status, Control, Switch | Power | +| Speakers | Status | Receiver, Speaker | Status, Control, Switch | Power | +| Projectors | Status | Projector | Status, Control, Switch | Power | +| Alarms | Status | *Any* | Alarm | *Any* | +| Luminance | Measurement | *Any* | Measurement | Light | +| Temperature | Measurement | *Any* | Measurement | Temperature | +| Humidity | Measurement | *Any* | Measurement | Humidity | + +This table is based off the sources: + +- +- + +# Non-semantic Items and Groups + +As discussed above, many Items and Groups are expected to be outside of the semantic model. +Perhaps they are only supporting Items only used for Rules. +Maybe they are the raw Items that feed a proxy Item or summarizing Group. +If they are a Group, perhaps they are functionally based instead of physically based, e.g. `AllLights`. + +As discussed above, existing Items can be added to the model. +The reverse is also true, an Item can be removed from the model simply by removing their semantic tags by setting them to "None". +Note, when removing a Point/Property pair of tags, remove the Property first or else the Property tag will remain on the Item. + +## Creating Non-semantic Items + +Note that a Group is a special type of Item. +It can only be created from the Items Settings Page (when not created from the model), but the process to create a Group is the same as any other Item. + +### From the Model Page + +Selecting an existing Item and remove the sematic tags by clicking on "Edit" and setting the semantic tags to "None".. +This is particularly useful if one has created an Equipment from a Thing but only some of the Items created are to be a part of the model. + +![Remove Item from Model](images/remove_from_model.png) + +### From the Things's Page + +Select a Things and click on the "Channels" tab. +Click on the Channel from which the Item is to be created. +Click on "Add Link to Item..." and select "Create new Item". +Fill out the information about the Item to be created, omitting the semantic tags. +Finally click on "Create Link". + +![Create Item from Channel](images/create_link.png) + +### From the Items Settings Page + +Under "Administration" click on "Settings" and then on "Items". +All the Items defined in the system are listed. +The list of Items can be filtered by using the search box at the top of the list. +One can search by Item name, Item Label, or Item type (e.g. show all the Switch Items). + +At the bottom of this page there is a blue "+" icon which when clicked allows the creation of an Item. +Clicking on this offers two options: "Add Items from textual definition" which allows one to import one or more Items based on the [textual configuration syntax]({{base}}/configuration/items.html), and "Add Item" which allows the creation of the UI by filling in a form. + +![Create Item Form](images/create_item.png) + +Again, leave out the semantic tags and the Item will not become a part of the model. + +## Group Membership + +Once a Group is created, other Items can be added as members of the Group. +Note that this process also works for semantically tagged Groups. +Navigate to or search for the Group on the Items Settings page and select the Group. +In the middle of the page will be a field labeled "Direct Group Members". +Click on "Change" and then "Members". + +![Change Group Members](images/add_members_change.png) + +This brings up a searchable list of your Items. +Find and add a check next to those that should be a member of this Group. +Remove the check for those that should not be a member of the Group. + +![Select Group Members](images/select_members.png) + +Click "close" when done and then click "Apply" to change the Group's members. + +# Items Best Practices + +- Only include Items in the model that make sense. Not all Items can nor should they be in the model. +- Use meaningful and unique labels for Items. If all the Temperature Items are just labeled "Temperature" there will be no way to tell which one is which when using the search on the Items settings page or in the UI. +- Use manually created Groups that are outside the model to create functional capabilities such as a way to send a command to all the lights in the house with one tap or see the maximum temperature in the house. +- Groups have the option to apply an aggregation function. One can semantically tag these Groups using a Point/Property tag and put the Group into an Equipment or Location. This can be useful in cases where a number of Items are logically controllable as one device, such as three smart bulbs in one lamp. diff --git a/tutorials/getting_started/pages_intro.md b/tutorials/getting_started/pages_intro.md new file mode 100644 index 000000000..517a7901c --- /dev/null +++ b/tutorials/getting_started/pages_intro.md @@ -0,0 +1,69 @@ +--- +layout: documentation +title: Pages - Introduction +--- + +# Introduction to Pages + +openHAB 3 introduces a new unified user interface called MainUI. +Almost everything that can be configured in openHAB can be configured through MainUI. + +In addition to being used for the administration of openHAB, MainUI can serve as the interface presented to the users of your home automation system. +You can find an example of the MainUI on the [demo page](https://demo.openhab.org/#!/). + +{::options toc_levels="2..4"/} + +- TOC +{:toc} + +## Role Based Access + +MainUI presents two different views to users depending on the type of user they log in as. +The two types of users are regular users and administrators. + +### Regular Users + +Regular users are those who have either not logged in or who have not been configured to be administrators. +These users can see all of the interactive parts of the UI (i.e. Pages) and can open other apps (icon at the upper right hand corner of the screen), but they cannot see any of the administration interfaces nor can they access the administration functions through the REST API. + +![regular user view](images/regular_user.png) + +Notice that none of the administration menus are shown, only the user Pages defined to interact with your home automation. + +The sidebar menu can be hidden by clicking the push pin icon right above the openHAB logo. + +By default, these menus can be accessed by anyone on your network whether or not they are logged in. + +### Administration Users + +You will recall that back in "First Steps" the first thing you did was create an administration user. +These users have full access to all parts of openHAB. +Their list of available menu options includes Settings, Developer Tools, and the Developer Sidebar. +These are most of the parts of openHAB that you have been interacting with thus far. + +![admin user view](images/admin_user.png) + +Notice the new Settings and Developer Tools menus are accessible to administrators. + +## Other User Interfaces + +Every openHAB deployment is unique. +Consequently every administrator of an openHAB instance will need to create a custom interface for the users of their bespoke home automation system. +openHAB 3 provides a number of options to supports this in addition to MainUI Pages. + +Interface | Purpose | How the UI is Defined | Notes +-|-|-|- +[Sitemaps]({{base}}/ui/sitemaps.html) | A simple declaritive way to define a simple user interface | Created using .sitemap files or through MainUI. | Used by BasicUI and the phone apps by default. +[HABPanel]({{base}}/ui/habpanel/habpanel.html) | UI designed for fixed wall mounted tablets and similar touch screen displays using a blocks interface (e.g. the Windows 10 start menu) with a lot of customization options. | Built graphically though the browser. A number of custom widgets are defined and installable. +[HABot]({{base}}/ui/habot/) | Provides a basic chatbot interface to interact with your home automation through natural langauge. | Requires the configuration of the semantic model. +[Pages]({{base}}/ui/index.html) | Built into MainUI. Allows for a rich set of options to present your home automation. | Can be built automatically through the semantic model as well as cutomized. + +Once installed, any non-Pages UI can be accessed in the "Other Apps" menu that pops up when clicking on the square icon in the upper right corner of the MainUI Overview page (the first page you see when first accessing openHAB). + +![other apps menu](images/other_apps.png) + +In addition, HABot will add a text box to the top of your Pages where one can start a conversation with openHAB. + +![HABot text entry](images/habot_text.png) + +The rest of this tutorial will focus on Pages. diff --git a/tutorials/getting_started/persistence.md b/tutorials/getting_started/persistence.md index c9a95f8e4..c03c585ba 100644 --- a/tutorials/getting_started/persistence.md +++ b/tutorials/getting_started/persistence.md @@ -3,8 +3,6 @@ layout: documentation title: Persistence --- -{% include base.html %} - # Persistence There are many times in home automation where one wants to keep, chart, and otherwise use the historic states of their Items. @@ -26,8 +24,10 @@ Note that Persistence only saves Item states. {:toc} ## Persistence Concepts + As previously mentioned, Persistence saves Item states. But the question is, when does it save those Item states? + - Every time the Item changes? - Every time the Item is updated (an update does not necessarily result in the Item changing state)? - Only when the Item receives a command? @@ -41,6 +41,7 @@ One special persistence strategy is `restoreOnStartup` which will update the Ite The good news here is that if you don't know what you may want to use persistence for, you can just keep the defaults and move to the next step. ## Persistence Configuration + Each persistence add-on comes with it's own default persistence strategy. See the documentation for the specific persistence add-on for what the default strategy is. This default can be overridden. @@ -54,12 +55,14 @@ One may not even want to save all their Items, or may want to save different Ite For example, a common approach would be to use [`MapDB`]({{base}}/addons/persistence/mapdb/) only for those Items that should be restored on startup, [`rrd4j`]({{base}}/addons/persistence/rrd4j) with an `everyChange` and every minute strategy for number and binary (Switch, Contact) type Items that are to be charted, and [`Influxdb`]({{base}}/addons/persistence/influxdb) with an `everyUpdate` strategy for analysis with external tools. ## Default Persistence + openHAB ships with [`rrdj4`]({{base}}/addons/persistence/rrd4j) as the default persistence database and comes with a default persistence strategy of `everyChange`, `everyMinute`, and `restoreOnStartup` for every supported Item. The good thing about `rrd4j` is that the database never grows beyond a given size, so you never have to clean it up. However, the way it achieves this (replacing ten readings with the average of the ten readings as the data gets older) makes the database not work for all Item types. If you need to `restoreOnStartup` unsupported Item types, `MapDB` might be a better choice for you. -## Why Bother with Persitence? +## Why Bother with Persistence? + The reason one would set up both the Model discussed in the previous tutorial and Persistence is that it will make creating your user interfaces much easier and much more rich. For example, a set of UI pages will be created automatically in MainUI based on the model. And just about anyplace you can interact with an Item in MainUI, there will be an "Analyze" button that will generate a chart based on the data saved in persistence. diff --git a/tutorials/getting_started/things_advanced.md b/tutorials/getting_started/things_advanced.md index d22cba80e..e711e5f90 100644 --- a/tutorials/getting_started/things_advanced.md +++ b/tutorials/getting_started/things_advanced.md @@ -3,8 +3,6 @@ layout: documentation title: Adding Things - Advanced --- -{% include base.html %} - # Adding Things - Advanced Some bindings and technologies simply do not support automatic discovery. @@ -22,28 +20,31 @@ Instead, it is publishing metrics regularly on a preconfigured MQTT topic in a s ```json {"light": 5424, "moisture": 30, "temperature": 21.4, "conductivity": 1020, "battery": 100} ``` + {::options toc_levels="2..4"/} - TOC {:toc} ## Prerequisites + - A basic understanding of how MQTT works (HiveMQ provides a good [tutorial](https://www.hivemq.com/blog/mqtt-essentials-part-3-client-broker-connection-establishment/) - An installed and configured MQTT Broker (e.g. Mosquitto, which can be installed through openHABian if that is how you installed openHAB) - A MiFlora device configured to connect to the MQTT Broker, or an MQTT client application (e.g. [MQTT Explorer](https://mqtt-explorer.com/), [MQTT.fx](http://mqttfx.org/) that allows one to publish and subscribe to MQTT topics ## Install the Binding and Transformation + This device publishes JSON formatted messages, so we need to install an add-on that can process JSON: the JSONPath Transformation. A Transformation takes incoming data and transformes is somehow. In this case it will extract certain fields from the JSON. From Settings, click on Transformations under Add-ons. -![](images/choose_transformation.png) +![choose transformation](images/choose_transformation.png) Click on the blue "+" button and find JSONPath Transformation. Click on it, then click Install. -![](images/install_jsonpath.png) +![install_jsonpath](images/install_jsonpath.png) Wait for it to disappear from the list, then click back twice to go back to Settings. @@ -52,6 +53,7 @@ Click on it, then click Install. Wait for it to disappear from the list, then go back twice to return to the main Settings screen. ## Create the Bridge Thing + First we need to add the broker, which is a Bridge. Click on Things. @@ -59,15 +61,16 @@ Click on the blue "+" button. Choose "MQTT Binding", then choose "MQTT Broker". -![](images/mqtt_things.png) +![mqtt things](images/mqtt_things.png) Fill in the details to connect to the broker. You may also alter its ID and name. If you need credentials to connect to the broker, click on "Show advanced" to reveal additional options, including Username and Password. -![](images/mqtt_bridge_config.png) +![mqtt bridge config](images/mqtt_bridge_config.png) ## Create the Generic MQTT Thing + Now we have to add the plant sensor itself as a generic Thing. On the Things page, first verify that the broker is indeed present and online; if so, click on the blue "+" button then on the MQTT Binding. @@ -86,7 +89,7 @@ Back on the Things page, choose the Thing you created. It should be marked online, but it will not have any Channels on the Channel tab. You have to configure them yourself. -![](images/mqtt_generic_thing.png) +![mqtt generic thing](images/mqtt_generic_thing.png) Click on Add Channel. @@ -102,16 +105,16 @@ Click on "Show advanced" above MQTT State Topic to reveal more settings. Scroll down, find the "Incoming Value Transformations" setting, and specify the transformation to apply there: -``` +```json JSONPATH:$.temperature ``` -![](images/mqtt_temp_channel.png) +![mqtt temp channel](images/mqtt_temp_channel.png) Click Done in the title bar to add the channel. It should now be added to the Channels tab. -![](images/mqtt_temp_channel_created.png) +![mqtt temp channel created](images/mqtt_temp_channel_created.png) Repeat the procedure for the other channels: @@ -126,7 +129,7 @@ All channels should specify the MQTT topic where the JSON message is published. If you want to check the configuration for a channel, or if you made a mistake while adding it, open the channel details by clicking on it, and choose Configure Channel. -![](images/mqtt_config_channel.png) +![mqtt config channel](images/mqtt_config_channel.png) Note that you cannot change the channel type if you picked the wrong one. In that case, remove the channel by clicking on Remove Channel and then add it again. diff --git a/tutorials/getting_started/things_intermediate.md b/tutorials/getting_started/things_intermediate.md index db26d9a83..9446189ba 100644 --- a/tutorials/getting_started/things_intermediate.md +++ b/tutorials/getting_started/things_intermediate.md @@ -3,7 +3,6 @@ layout: documentation title: Adding Things - Intermediate --- -{% include base.html %} Previous: [Adding Things - Simple]({{base}}/tutorial/things_simple.html) # Adding Things - Intermediate @@ -18,36 +17,39 @@ Scenario: you have some Z-Wave devices, including a wall plug and a rollershutte {:toc} ## Install the Binding + From Settings, go to Things, then click the blue "+" button. We need to install the Z-Wave binding. Click "Install More Bindings". -![](images/install_zwave.png) +![install zwave](images/install_zwave.png) Find the Z-Wave binding, click on it, then click Install. -![](images/installing_zwave.png) +![installing zwave](images/installing_zwave.png) Wait for it to disappear from the list, then go back. -![](images/installed_zwave.png) +![installed zwave](images/installed_zwave.png) ## Create the Bridge Thing + Click on the new option: Z-Wave Binding. Click on Z-Wave Serial Controller to add the controller. -![](images/zwave_add_controller.png) +![add zwave controller](images/zwave_add_controller.png) We need to specify one required parameter, the serial port. In certain cases, depending on your system, you will be provided with a list of options for this setting. -![](images/zwave_port_config.png) +![zwave port config](images/zwave_port_config.png) Choose the correct port, alter the name and/or ID of the controller Thing, then click Add in the top-right corner. ## Discover Things + Once back on the Things screen, click on the "+" button then on Z-Wave Binding again. Click scan and all the devices already paired with the Zwave controller will be discovered and appear in the Inbox. To pair a new device, while on this screen, perform the procedure specific to the device to include it in your network. diff --git a/tutorials/getting_started/things_simple.md b/tutorials/getting_started/things_simple.md index 1081eaea2..deb26d6eb 100644 --- a/tutorials/getting_started/things_simple.md +++ b/tutorials/getting_started/things_simple.md @@ -3,11 +3,9 @@ layout: documentation title: Adding Things - Simple --- -{% include base.html %} - # Adding Things - Simple -As covered in the [concepts section]({{base}}/docs/concepts/index.html) of the openHAB Docs, a binding is an add-on to openHAB that understands how to communicate with a specific home automation technology or API. +As covered in the [concepts section]({{base}}/concepts/index.html) of the openHAB Docs, a binding is an add-on to openHAB that understands how to communicate with a specific home automation technology or API. A Thing represents a single device in openHAB. Each sensor (information provided by the device) or actuator (control on the device that causes it to do something) is represented by a Channel on the Thing. Things are the connection between openHAB and your external device or API using the binding. @@ -27,18 +25,17 @@ In this case, the Hue binding supports auto-discovery of both the bridge and the - TOC {:toc} - ## Install the Binding After logging in as an administrator, click on `Settings` from the sidebar, then click on `Things`. -![](images/empty_things_menu.png) +![empty things menu](images/empty_things_menu.png) Click on the blue "+" button located at the bottom-right corner. Since you have no bindings, this screen will appear: -![](images/choose_binding.png) +![choose binding](images/choose_binding.png) Click on `Install Bindings`. @@ -46,17 +43,17 @@ Look for the Hue binding. Note the search bar at the top can help find bindings quickly by filtering the long list. Click on the binding, then on Install. -![](images/install_hue.png) +![install hue](images/install_hue.png) It will take from a few seconds to a minute for the binding to install... -![](images/installing_hue.png) +![installing hue](images/installing_hue.png) Wait for it to disappear from the list, then click < Back (or use the browser controls). The Hue binding will now appear on the previous screen. You will notice that the auto-discovery has already detected something (note the red "1" badge). -![](images/installed_hue.png) +![installed hue](images/installed_hue.png) ## Accept the Discovered Bridge Thing @@ -65,35 +62,35 @@ Click on the binding. The bridge has indeed been detected and appears under Discovered Things. If not, you can try again by clicking the `Scan Again` button. -![](images/hue_things_discover_bridge.png) Thing +![hue things discover bridge](images/hue_things_discover_bridge.png) Thing Click on the discovered `Hue Bridge`. -![](images/add_hue_bridge.png) +![add hue bridge](images/add_hue_bridge.png) openHAB will ask you to confirm or change the label/name. Click OK after naming the new Thing. You will be taken back to the Things page, where the Hue Bridge should now appear. -![](images/hue_bridge_offline.png) +![hue bridge offline](images/hue_bridge_offline.png) However, we can see that it's marked offline. To find out why we can click on the `Hue Bridge`. -![](images/hue_bridge_config_error.png) +![hue bridge config error](images/hue_bridge_config_error.png) The error description below the status gives some more information: You have to press the physical button on the device to let openHAB authenticate to it. Once you've done this, the Thing will become online. -![](images/hue_bridge_online.png) +![hue bridge online](images/hue_bridge_online.png) ## Accept the Light Bulb Things Go back to Things. You will notice a new red button on that screen. -![](images/hue_inbox.png) +![hue inbox](images/hue_inbox.png) This means that there are newly discovered devices that you can add. Since the Hue bridge is now working, the binding has detected all the Hue devices (bulbs, switches and so on) attached to it. @@ -103,15 +100,16 @@ Alternatively, you can also click on the "+" button to get a per-binding view an Click Inbox. -![](images/discovered_hue_things.png) +![dicsovered hue things](images/discovered_hue_things.png) You can either click on an individual thing to see actions related to it, or you can click on Select in the top-right corner to add check boxes beside items, which will allow you to perform actions on several inbox entries at once. -![](images/hue_individual_add.png) +![hue individual add](images/hue_individual_add.png) -![](images/hue_bulk_add.png) +![hue bulk add](images/hue_bulk_add.png) These actions are: + - Approve: To promote the candidate from the Inbox to a Thing. - Ignore: To hide the candidate from the list (you will be able to see it again and un-ignore it by clicking on "Show ignored" above the list). - Remove: To remove the candidate from the Inbox (it might be detected again later). @@ -119,7 +117,7 @@ These actions are: Now go back to Things. The newly approved Hue Things should appear on the list. -![](images/hue_things_added.png) +![hue things added](images/hue_things_added.png) You now have the Bridge Thing and the two light bulbs added to openHAB. Thankfully most of the bindings you will work with in openHAB will work in this simple way. diff --git a/tutorials/index.html b/tutorials/index.html index a697a2e58..8d4807035 100644 --- a/tutorials/index.html +++ b/tutorials/index.html @@ -3,8 +3,6 @@ layout: raw title: Tutorials --- -{% include base.html %} -

Tutorials

Choose one of the options below to learn more about openHAB, either by following along a tutorial or by looking at a few examples.

diff --git a/ui/building-pages.md b/ui/building-pages.md new file mode 100644 index 000000000..f989a1864 --- /dev/null +++ b/ui/building-pages.md @@ -0,0 +1,409 @@ +--- +title: Building Pages - Components & Widgets +--- + +# Building Pages: Components & Widgets + +[[toc]] + +## UI Components: introduction and structure + +**UI components** are the basic building blocks for many UIs in openHAB 3. +The Main UI Pages and Personal Widgets are notable UI components, but Sitemaps that were created in the UI and HABPanel dashboards are as well. + +These structures make up hierarchies that notably define the pages in their entirety are relatively simple: + +Each component has: + +- A **type** +- Most of the time, a set of **configuration properties** +- Optionally, a set of **named slots** which hold collections of more components. By putting components into slots, we therefore define a hierarchy. +Slots are optional, and have a name; usually when there’s slots involved there’s a `default` slot but not always. + +The semantics of both the config properties and the slots depend on the component type, as well as the allowed sub-component types in the slots. +The Component Reference provide details on what you can put in a certain component's config & slots. + +Sometimes, the slots can be seen as different placeholders within a component where new components may be added. For instance, cell widgets have a `header` slot which represents the part of the cell when not expanded. +The `default` slot is the space in the cell which becomes visible when the cell is expanded. + +In various parts of the UI page designers you can "focus" on a particular component usually by selecting the **Edit YAML** item in a black context menu. + +Below is a typical component as represented in YAML: + +```yaml +component: oh-type +config: + prop1: value1 + prop2: value2 + prop3: =expression + ... +slots: + default: + - component: ... + config: ... + slots: ... + - component: ... + anotherSlot: + - component: ... + ... + ... +``` + +## Root Components & Props + +At the top of the component tree there’s we can find a **root component**. +Pages are examples of root components. +They have additional attributes: + +```yaml +uid: component1 +props: + parameterGroups: + - name: group1 + label: Property group + ... + parameters: + - name: prop1 + label: Prop 1 + type: BOOLEAN + groupName: group1 + description: What prop1 does + - name: prop2 + label: Prop 2 + type: TEXT + context: item + description: Choose an item for this prop + - name: prop3 + type: INTEGER + advanced: true + ... +tags: ["tag1", "tag2"] +component: ... +config: ... +slots: ... +``` + +- an **uid** (its Unique IDentifier) +- a **props** structure describing its own properties; props define parameters and parameter groups following a subset of the configuration description schema found in bindings, services and throughout openHAB: see [Configuration Descriptions](/docs/developer/bindings/config-xml.html) +- a set of **tags** + +## Widgets: Definition & Usage + +Widgets are nothing more than discrete components that can be added to a Page. + +No matter which type of page you’re editing, the designer will feature black buttons beside most widgets, that open a contextual menu for the widget in question. + +These menus will in most cases allow you to: + +- configure the documented parameters with a config sheet (“Configure Widget” or similar) +- open the part of the page’s YAML representation pertaining to the widget (“Edit YAML”), that is, a subgraph of the page’s component tree with that widget as its root component +- perform cut/copy/paste operations, if supported (you can only do that in the same page currently, to copy or move widgets between pages, you may use the YAML view) +- reorder the widget within its parent slot (these options are usually named “Move Up” and “Move Down” although you may occasionally encounter other labels, like “Move Left”/“Move Right”) +- remove the widget + +Configuring the widget with the config sheet is of course more user-friendly than editing the YAML, as the options are usually organized logically in groups and feature a description: + +![Configuring a Widget](./images/widget_config_sheet.png) + +However, it's important to know that there are limitations and sometimes editing the YAML directly will be best, because: + +1. not all options are described, since widgets are often wrappers for a similar concept in the library it's based on, either Framework7, ECharts, Leaflet, or other specialized libraries. + This means that in these cases, these underlying concepts will usually be passed the key/values of the (openHAB) widget component's config so that more parameters can be accepted than those which are documented in the widget's definition. + Sometimes it will be indicated somewhere when configuring the widget, or in the openHAB documentation itself, on the other hand some options won't be available for use (for instance, because they expect a callback function and you cannot define those in the widget's config) or need some transformation. + +1. Sometimes you'll want to use an expression to configure the property, but the UI will get in your way - for instance, it will display an item picker while your intention is to set the prop value to be `=props.item1`. + See below to learn more about expressions. + +1. To quickly and efficiently duplicate similar widgets with only a few differences, it is always way easier to copy/paste the relevant YAML in the editor. + +1. The YAML is the best way of sharing complete or partial component structures like pages or widgets with others in the forum. + +Besides, there are several options that virtually all widgets in layout pages, map pages and plan pages accept, all of which are not currently available in the config sheet: + +- `visible`: you can specify a `false` boolean to this option to hide the widget. This powerful feature, combined with expressions (see below), allows you to dynamically show widgets or even entire sections (if you use it on layout widgets containing other widgets), depending on the state of your items +Example: `visible: =items.TV_Powered.state === 'ON' && items.TV_Input.state === 'HDMI1'` +- `visibleTo`: this accepts an array of strings like `role:administrator`, `role:user`, or `user:`, allowing the widget to be only visible to specific users or those with a certain role. +Example: `visibleTo: ["user:scott", "role:administrator"]` +- `class` and `style` are [standard Vue.js attributes](https://vuejs.org/v2/guide/class-and-style.html) and can be used to either alter the CSS classes or add inline styling to the component. +See "Styling" below. + +### Types of Widgets + +To help you define usable pages, there are a number of built-in widgets that you can use - most of which will be in layout pages. Those built-in widgets revolve around several libraries: + +- the **System** library includes "crude" controls that you cannot add with the designers - for instance `oh-button`, `oh-slider`, `oh-colorpicker`. Instead, you're more likely use them within some container (card, list item...) provided by a widget of the Standard library; but when designing a personal widget with a complex layout you may want to use one or several of them directly. You may also use them in a slot of another widget, for those which define some, in order to add additional controls to that widget. +- the **Standard** library, which has several classes of widgets: + - **layout widgets**, examples: `oh-block`, `oh-masonry`, `oh-grid-row`, `oh-grid-col` that you usually add with the designer to a layout page + - **standalone widgets**, examples: `oh-label-card`, `oh-slider-card`, `oh-player-card` - usually not much more than widgets from the System library wrapped in a card + - **list item widgets**, examples: `oh-list-item`, `oh-stepper-item`, `oh-toggle-item` - widgets that are thinner than the standalone ones, which you can only add a part of a list (`oh-list` or `oh-list-card`) + - **cell widgets**, examples: `oh-cell`, `oh-knob-cell`, `oh-colorpicker-cell`: these widgets are fixed-size cells that you can only add to a `oh-cells` container widget immediately below a `oh-block` in a layout page - they will either perform an action - switching a light on & off - or expanding to reveal additional controls + - **page-specific widgets**, for instance map pages have `oh-map-marker` or `oh-map-circle-marker`, charts have different types of widgets than the rest to represent axes, series etc. + +See the [Component Reference](./components/) for details about the different libraries of components. + +## Dynamically Configuring Components with Expressions + +Virtually everywhere - with the notable exception of chart pages - every time you need a config prop to be dynamically updated, you can use an expression to configure it. +Expressions are string literals beginning with the symbol `=` and everything after it is evaluated using a syntax very similar to JavaScript, you can use arithmetic or string operations etc., the [conditional (ternary) operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator), as well as the following objects (subject to evolutions): + +- `items` is a dynamic key/value dictionary allowing you to retrieve the state of items; the result of `items.Item1` will be an object like `{ state: '23', displayState: '23 °C' }` (`displayState` may be omitted). You can therefore use `items.Item1.state` to use the current state of Item1 in your expression, if it changes, it will be reevaluated +- `props` is a dictionary of the key/values of self-defined props for the current personal widget, or page (pages, like any root UI components, may indeed have props). It is indispensable to use props in expressions when developing a personal widget +- `vars` is a dictionary of variables (see below) that are available in the component's context +- `loop` is a dictionary containing iteration information when you're repeating components from a source collection, it is defined only when in the context of a `oh-repeater` component +- the JavaScript `Math` object (so you can use `Math.floor(...)`, `Math.round(...)` and the like) +- the JavaScript `JSON` object to parse or produce JSON; +- `dayjs` to build instances of the [day.js library](https://day.js.org/docs/en/parse/now) that you can use to parse or manipulate date & time +- `theme` which holds the current theme: `ios`, `md` or `aurora` +- `themeOptions` and `device` allow to use the relevant objects that you can see in the About page, Technical information, View details, under `clientInfo` + +Expressions are particularly useful in cases where one wants to combine the states of more than one Item, or use the state of more than one Item in a single widget element. +For example, the icon of an Item can be based on the state of a different Item. + +### Examples + +```js +=(items.Color1.state.split(',')[2] !== '0') ? 'On ' + '(' + items.Color1.state.split(',')[2] + '%)' : 'Off' +``` + +Translates the third part of the HSB state (brightness) of the Color1 item to On or Off. + +```js +icon: =(items[props.item].state === 'ON') ? 'f7:lightbulb_fill' : 'f7:lightbulb' +``` + +Use a filled icon of a lightbulb but only if the state of the items passed in the prop `item` is ON. + +```js += (items.xxx.state === '0') ? 'Off' : (items.xxx.state === '1') ? 'Heat' : (items.xxx.state === '11') ? 'Economy Heat' : (items.xxx.state === '15') ? 'Full Power': (items.xxx.state === '31') ? 'Manual' : 'Not Set' +``` + +Stacked ternary statements to translate a value to a description. + +```js +=dayjs(items.DateItem.state).subtract(1, 'week').fromNow() +``` + +Substracts one week from the state of `DateTime` and return a relative time representation in the current locale ("3 weeks ago"). + +### Debugging Expressions + +Expressions can be tested in the Widgets Expression Tester found in the Developer Sidebar +(Shift+Alt+D). + +## Actions + +When configuring a widget, you will encounter options related to actions (usually, when something is clicked or touched, but there might be several actions configured for a single widget, for instance, clicking on different parts or a long tap with a touch device); regardless, they will all have the same options: + +![Actions](./images/widget_actions.png) + +These action options allow you to configure the interactivity within your pages, as well as the relation between them, in an extensive way. You can navigate to another page, display additional controls, popups and other modals, send commands to items every time a widget allows you to choose an action. +For instance, a floor plan marker might either open another page in a popup, or toggle an item. +Configuring the action type reveal more options in the action sheet: + +![Action Configuration](./images/widget_action_configuration.png) + +### Types of Actions + +Action | What it does +-|- +Navigate to page | Opens a different Page with an optional transition. +Send command | Issues a command to an Item. +Toggle Item | Alternate an item between two states by sending commands (regular command if the item's state is different, or an alternative command if the state is equal to the regular command). Typically used with ON/OFF. +Command options | Issues a command to the configured Item based on a comma-separated locally-defined list of options, or on the Item's State Description. +Run rule | Trigger a rule directly. +Open popup | Open a Page or personal widget in a popup which will be displayed fullscreen on phones and in a 630x630-pixel modal dialog on larger screens. +Open popover | Open a Page or personal widget in a small "callout" comic-like bubble +Open sheet | Open a Page or personal widget in a drawer appearing from the bottom of the screen. +Open photo browser | Displays a full screen interface to view one of several images +Group details | Used with Group items to open a popup with an automatically-generated list of the members of the group, represented by their default list item widget. For Groups with a base type like Switch, a standard card widget will also be shown for the Group itself. +Analyze Item(s) | Opens the Analyzer window for the specified item(s) and period +External URL | Open an external web page +Set Variable | Set a variable that you can use in other parts of the page or widget. + +::: tip + +In your own personal widgets (see below), you can define a parameter group with an `action` context to automatically define implicit props that you can pass "en masse" to built-in components that accept actions with the `actionPropsParameterGroup` property: + +```yaml +props: + parameterGroups: + - name: myaction + label: My Action + context: action +... + component: oh-button + config: + actionPropsParameterGroup: myaction +``` + +
+How the implicit props are named + +The property names will be in the following format: `{groupName}_{actionPropName}` + +The list of `actionPropNames` can be found in the Component Reference (they’re always the same), for instance in the [oh-button](./components/oh-button.html#action) reference. + +:warning: The `groupName` prefix is the name of the parameter group, but occurrences of the word "action" will be removed from it. +If you name the parameter group `action` there won't be a prefix anymore so the underscore will be removed too. + +Examples: + +| Group Name | Prop Name Examples | +|------------|--------------------| +| action | `action, actionItem, actionCommand, actionCommandAlt` | +| tapAction | `tap_action, tap_actionItem, tap_actionCommand, tap_actionCommandAlt` | +| sceneOne | `sceneOne_action, sceneOne_actionItem, sceneOne_actionCommand, sceneOne_actionCommandAlt` | + +You can dump the `props` objects in JSON to verify the names like in the following example (or just use `=JSON.stringify(props)` wherever you can display text in your widget): + +```yaml +uid: dump_props_as_json +props: + parameterGroups: + - name: sceneOne + context: action + label: Scene One + - name: sceneTwo + context: action + label: Scene Two + - name: tapAction + context: action + label: Tap Action + - name: action + context: action + label: Tap Action + parameters: + - name: prop1 + label: Prop 1 + type: TEXT + description: A text prop +tags: [] +component: f7-row +config: + tag: pre +slots: + default: + - component: Label + config: + text: =JSON.stringify(props, null, 4) +``` + +
+ +::: + +## Variables + +Varibles are a way to allow more complex scenarios in pages & personal widget development. + +Variables can be used using several methods: + +- the `variable` config parameter of `oh-gauge` (read-only), + `oh-input`, `oh-knob`, `oh-slider`, `oh-stepper`, `oh-toggle` + will accept a variable name and control it instead of + sending commands to items if set. + The "item" parameter can + still be set to set the widget to the item's state, when + the variable has no value. +- the `vars`object available in expressions (for example + `=vars.var1` will evaluate to the value of the variable `var1`. +- the `variable` action allows to set a fixed or computed + (using an expression) value to a variable. + +`oh-button` & `oh-link` have a special parameter `clearVariable` +which allows to unset a version when clicked, after performing +the action. +This is useful when "validating" a variable e.g. +send a command to an item with the variable value then reset it. + +## Techniques for Styling Widgets + +### Predefined CSS Classes + +As seen before, you can use CSS classes in the `class` property (as an array) or set CSS properties in the `style` property (as a dictionary) on your components. + +You cannot define new CSS classes, but you can use classes from Framework7, for instance: + +- [Typography](https://v5.framework7.io/docs/typography.html) +- [Color Themes](https://v5.framework7.io/docs/color-themes.html#apply-color-themes) +- [Hairlines](https://v5.framework7.io/docs/hairlines.html) +- [Elevation](https://v5.framework7.io/docs/elevation.html) + +### CSS Variables + +Another interesting technique is to override the many [CSS Variables](https://v5.framework7.io/docs/css-variables.html) defined by the framework to suit your particular component's needs. +The override will be applied to all descendants in the HTML DOM tree, in case of the Framework7 variables the underlying components which use them will use the new value. +It is recommended to use Framework7 CSS variables in your components too, when appropriate, so that way you'll be sure the properties change according to the current theme and dark mode setting. + +To redefine a CSS variable for the component and its descendants, use this syntax: + +```yaml +style: + --f7-button-border-color: rgb(255, 0, 0) +``` + +To reuse a CSS variable, use: + +```yaml + border-color: var(--f7-button-border-color) +``` + +You can even define your own CSS variables and use them in your components: + +```yaml +config: + style: + --my-color: =props.color +slots: + ... + ... + ... + config: + style: + background-color: var(--my-color) +``` + +### Applying CSS Properties Directly + +Applying CSS properties like `border-color` directly on components is sometimes enough; but contrary to CSS variables like `--f7-button-border-color` which will be inherited to descendants in the tree, either by your own components or by f7 components (or their OH derivatives) that make use of these variables, they will only work on the element where you put the style configuration. + +There are hundreds of [CSS properties](https://www.w3schools.com/cssref/) you can use to design your widgets. +Use the resources at [W3Schools](https://www.w3schools.com/css/default.asp) or the [CSS-Tricks Properties Almanac](https://css-tricks.com/almanac/properties/) to learn more about CSS properties and techniques - these resources will provide code in HTML and classes definitions but you can most of the time adapt them for usage in components' YAML definitions. + +While the Layout components (`oh-block`, `oh-grid-row`, `oh-grid-col`) can help you with the placement of your widgets, to lay out sub-components _within_ a widget, you shouldn't use them because they include design mode controls that you don't need. +While can use their `f7-block`, `f7-row` and `f7-col` equivalents instead, in many cases this is still "overkill": consider applying directly the Flexbox or Grid properties to the components. + +These resources will help you with Flexbox and Grid: + +- [A Complete Guide to Flexbox](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) +- [justify-content "Play it"](https://www.w3schools.com/cssref/playit.asp?filename=playcss_justify-content&preval=flex-start) and others found in the reference +- [A Complete Guide to Grid](https://css-tricks.com/snippets/css/complete-guide-grid/) +- [Grid Tutorial on W3Schools](https://www.w3schools.com/css/css_grid.asp) + +## Personal Widgets + +You can extend the library of widgets you have at your disposal by creating personal ones, either by yourself, or copy-pasting from examples by the community; then you can reuse them on pages, multiple times if need be, simply configuring their props to your needs. +To add a new personal widget, as an admin, go to **Developer Tools > Widgets**, then use the '+' button to create a new one. + +The view features a code (YAML) editor and a live preview, you can change the orientation with the button in the center of the bottom toolbar. + +::: warning WARNING + +Don't forget to change the `uid` right away because you won't be able to alter it afterwards. + +::: + +Sometimes the live preview will fail to update, you may want to hit the Redraw button or Ctrl-R/Cmd-R regularly when designing your widget. + +To actually see how the config sheet would look like, and specify props for your widget for the live preview, click on Set props (Ctrl-P) and configure them as needed. + +After saving the widget, you will have it as an option (under "Personal widgets") to add it to a layout page, or display in a modal like a popover, or use it as the default representation of an item. + +Note the special `widget:` syntax for the component type to specify "use this personal widget here", the `config` being the value to wish to assign to the widget props: + +```yaml +component: widget:widget_0a26c10a4d +config: + prop1: Test + item: Color1 +``` diff --git a/ui/chart-pages.md b/ui/chart-pages.md new file mode 100644 index 000000000..b2da0ca76 --- /dev/null +++ b/ui/chart-pages.md @@ -0,0 +1,64 @@ +--- +title: Chart Pages +--- + +# Chart Pages + +Chart Pages can display historical values in a full-screen `oh-chart` component. + +![Chart Example](./images/chart_example.png) + +## Anatomy of a Chart Page + +Charts are based on the Apache ECharts library. +The [Cheat Sheet](https://echarts.apache.org/en/cheat-sheet.html) on EChart's website offers an interactive illustration of the concepts used in it. +The openHAB UI currently supports only a subset of those: + +- Series: Bar, Line, Pie, Heatmap, Scatter, Gauge +- Coordinates: Grid, Calendar +- Other Components: Title, Legend, Tooltip, MarkPoint, MarkLine, MarkArea, DataZoon, VisualMap, Toolbox + +The `oh-chart` and `oh-chart-page` normally configure charts using components such as `oh-grid`, `oh-time-series`, `oh-value-axis`, and others, placed in the appropriate slots. +See their documentation for more details. +Additionally, you can merge raw options as they're defined in ECharts in the root `options` parameter. + +## Building a Chart Page + +### From the Analyzer + +Throughout the UI you may encounter places where you can click a widget to call the Analyzer window, which lets you build a chart of one or several item(s) persisted data and change some settings with simple controls. +Sometimes you'll get a result that you like and would like to save. +You can do exactly that: use the Save button on the title bar on the right, give it an identifier, and it will be saved as a Chart Page. +You can then customize it further from the Chart Page Designer. + +::: tip TIP + +Once you've saved the Analyzer result as a Chart Page, you can display this page like you would any other, but the controls that you used to configure the chart in the Analyzer will not be available. +Chart Pages cannot be configured by the user (except changing the period, zooming, or by using the toolbox). + +You can, however, launch the Analyzer with a predetermined set of item(s), chart type and period with the "Analyze" widget action. + +::: + +### From the Chart Page Designer + +From the Pages section in Settings, click "+" then Create Chart, or choose an existing Chart Page, to bring up the Chart Page Designer. + +You can choose the period type and initial period in the Page Configuration section, and then add **Coordinate Systems**, **Axes**, **Series**, and **other chart components**. + +Usually, you will first add a **Grid**, then either directly one or more **Time Series** (default axes will be created for you), or first Axes and an **Aggregate Series**. + +When doing aggregations, you have to be careful to add the right type of axes based on the period that you chose (Aggregate Series don't support Dynamic period as chart type). + +Examples: + +- For bars representing hourly aggregates, use a value Y axis and a category axis configured as "Hours of day". +Then click Add Aggregate Series, choose the item, the Bar type, and "Hour of Day" as first dimension. +- For a 2-dimension heatmap representing hours for an entire month, add a category Y axis configured as "days of month" and a category X axis configured as "hours of day". +Then click Add Aggregate Series, choose the item, the Heatmap type, "Day of Month" as first dimension, "Hours of Day" as second dimension. +Since the "outer" (first) dimension is on the Y axis, make sure you also enable "Transpose" to reflect that fact. +Lastly, also make sure you add a Visual Map component to the chart since the Heatmap needs one as its color scale - even if it's hidden. + +In the **Other Components** section you will have badges in the buttons representing the number of components of that type. +You can indeed add several of these components, when appropriate. +Below the title bar of the dialog to edit the component type, use the "+" tab to add one more, or use the Remove button at the bottom to remove the currently displayed component. diff --git a/ui/floorplan-pages.md b/ui/floorplan-pages.md new file mode 100644 index 000000000..95aa69394 --- /dev/null +++ b/ui/floorplan-pages.md @@ -0,0 +1,34 @@ +--- +title: Floorplan Pages +--- + +# Floorplan Pages + +Floorplan Pages can display markers or other elements over a custom image of your choice that you can zoom & pan. + +![Floorplan Example](./images/floorplan_example.png) + +## Anatomy of a Floorplan Page + +Floorplan pages have some configuration properties that you mostly can define in the Design mode. +You can also add markers on it. + +Markers can display an icon, and a tooltip either when they're hovered on, or clicked/tapped, and also perform an action. + +With the `useTooltipAsLabel` property, markers can also be a text label directly displayed over the background - without the icon. + +The `tooltipStyles` property can be configured in YAML to set additional CSS properties to the tooltip/label. + +## Building a Floorplan Page + +In the Design view, configure the properties below Page Configuration. + +To add markers, you can do it either: + +- in Design mode under Markers: click **Add marker**, then click on the newly added entry to configure the marker. +Using the black context menu, you can reorder or remove existing markers. + +- in Run mode: click **Add marker** and drag the new marker to the desired position. +While it's "selected", a popover toolbar will appear, allowing you to configure it, edit its YAML, copy it (a Paste button will then appear besides **Add Marker**), or remove it. + +To position markers accurately, it's usually best to do it in Run mode, while the Markers area in Design mode is best for an overview of the markers on the page. diff --git a/ui/images/add_from_model.png b/ui/images/add_from_model.png new file mode 100644 index 000000000..0257b33c7 Binary files /dev/null and b/ui/images/add_from_model.png differ diff --git a/ui/images/chart_example.png b/ui/images/chart_example.png new file mode 100644 index 000000000..56820233b Binary files /dev/null and b/ui/images/chart_example.png differ diff --git a/ui/images/floorplan_example.png b/ui/images/floorplan_example.png new file mode 100644 index 000000000..a3c5def66 Binary files /dev/null and b/ui/images/floorplan_example.png differ diff --git a/ui/images/homepage_example.png b/ui/images/homepage_example.png new file mode 100644 index 000000000..eef3fbb20 Binary files /dev/null and b/ui/images/homepage_example.png differ diff --git a/ui/images/layout_example.png b/ui/images/layout_example.png new file mode 100644 index 000000000..d4ea10b14 Binary files /dev/null and b/ui/images/layout_example.png differ diff --git a/ui/images/map_example.png b/ui/images/map_example.png new file mode 100644 index 000000000..d79f2719c Binary files /dev/null and b/ui/images/map_example.png differ diff --git a/ui/images/responsive1.png b/ui/images/responsive1.png new file mode 100644 index 000000000..0f17181e1 Binary files /dev/null and b/ui/images/responsive1.png differ diff --git a/ui/images/responsive2.gif b/ui/images/responsive2.gif new file mode 100644 index 000000000..11c6482e6 Binary files /dev/null and b/ui/images/responsive2.gif differ diff --git a/ui/images/sitemap_demo_colorpicker.png b/ui/images/sitemap_demo_colorpicker.png new file mode 100644 index 000000000..1015c4b4f Binary files /dev/null and b/ui/images/sitemap_demo_colorpicker.png differ diff --git a/ui/images/sitemap_demo_colors.png b/ui/images/sitemap_demo_colors.png new file mode 100644 index 000000000..2a4fac742 Binary files /dev/null and b/ui/images/sitemap_demo_colors.png differ diff --git a/ui/images/sitemap_demo_frame.png b/ui/images/sitemap_demo_frame.png new file mode 100644 index 000000000..b8bb1a56e Binary files /dev/null and b/ui/images/sitemap_demo_frame.png differ diff --git a/ui/images/sitemap_demo_fullexample.png b/ui/images/sitemap_demo_fullexample.png new file mode 100644 index 000000000..25358c5d5 Binary files /dev/null and b/ui/images/sitemap_demo_fullexample.png differ diff --git a/ui/images/sitemap_demo_group.png b/ui/images/sitemap_demo_group.png new file mode 100644 index 000000000..f2ad12b61 Binary files /dev/null and b/ui/images/sitemap_demo_group.png differ diff --git a/ui/images/sitemap_demo_image.png b/ui/images/sitemap_demo_image.png new file mode 100644 index 000000000..069887e85 Binary files /dev/null and b/ui/images/sitemap_demo_image.png differ diff --git a/ui/images/sitemap_demo_mapview.png b/ui/images/sitemap_demo_mapview.png new file mode 100644 index 000000000..54d0598ca Binary files /dev/null and b/ui/images/sitemap_demo_mapview.png differ diff --git a/ui/images/sitemap_demo_selection.png b/ui/images/sitemap_demo_selection.png new file mode 100644 index 000000000..4d6b4f3bf Binary files /dev/null and b/ui/images/sitemap_demo_selection.png differ diff --git a/ui/images/sitemap_demo_setpoint.png b/ui/images/sitemap_demo_setpoint.png new file mode 100644 index 000000000..b2d2b36a8 Binary files /dev/null and b/ui/images/sitemap_demo_setpoint.png differ diff --git a/ui/images/sitemap_demo_slider.png b/ui/images/sitemap_demo_slider.png new file mode 100644 index 000000000..db89a1dd0 Binary files /dev/null and b/ui/images/sitemap_demo_slider.png differ diff --git a/ui/images/sitemap_demo_switch1.png b/ui/images/sitemap_demo_switch1.png new file mode 100644 index 000000000..98b0f166a Binary files /dev/null and b/ui/images/sitemap_demo_switch1.png differ diff --git a/ui/images/sitemap_demo_switch2.png b/ui/images/sitemap_demo_switch2.png new file mode 100644 index 000000000..b360ecf83 Binary files /dev/null and b/ui/images/sitemap_demo_switch2.png differ diff --git a/ui/images/sitemap_demo_text.png b/ui/images/sitemap_demo_text.png new file mode 100644 index 000000000..d24ec2366 Binary files /dev/null and b/ui/images/sitemap_demo_text.png differ diff --git a/ui/images/sitemap_demo_video.png b/ui/images/sitemap_demo_video.png new file mode 100644 index 000000000..0e254e8c2 Binary files /dev/null and b/ui/images/sitemap_demo_video.png differ diff --git a/ui/images/sitemap_demo_webview.png b/ui/images/sitemap_demo_webview.png new file mode 100644 index 000000000..a8730e93a Binary files /dev/null and b/ui/images/sitemap_demo_webview.png differ diff --git a/ui/images/tabbed_example.png b/ui/images/tabbed_example.png new file mode 100644 index 000000000..f978ede18 Binary files /dev/null and b/ui/images/tabbed_example.png differ diff --git a/ui/images/widget_action_configuration.png b/ui/images/widget_action_configuration.png new file mode 100644 index 000000000..fad8c44e6 Binary files /dev/null and b/ui/images/widget_action_configuration.png differ diff --git a/ui/images/widget_actions.png b/ui/images/widget_actions.png new file mode 100644 index 000000000..4bfc6a4f0 Binary files /dev/null and b/ui/images/widget_actions.png differ diff --git a/ui/images/widget_config_sheet.png b/ui/images/widget_config_sheet.png new file mode 100644 index 000000000..ff21de6b8 Binary files /dev/null and b/ui/images/widget_config_sheet.png differ diff --git a/ui/images/widget_context_menu.png b/ui/images/widget_context_menu.png new file mode 100644 index 000000000..fe2ce8fcb Binary files /dev/null and b/ui/images/widget_context_menu.png differ diff --git a/ui/index.md b/ui/index.md new file mode 100644 index 000000000..84b1aa9c5 --- /dev/null +++ b/ui/index.md @@ -0,0 +1,157 @@ +--- +title: User Interface Design Overview +--- + +# User Interface Design Overview + +Following the previous sections, you should have a working installation, with several Things, Items and Rules. +You also ideally built a model to represent your home, and can succesfully operate your items individually within the administration area. +You may now want to present them a little more nicely, to yourself or your family members, so they can interact with them or check their status easily without requiring access to these administration screens. + +To do that, openHAB puts different options at your disposal; they are commonly referred to as **Pages**. + +## Types of Pages + +Several types of pages are available: + +### The Home Page + +The main's UI **home page** consists of 4 tabs: + +- an overview which you can customize entirely from scratch; +- 3 tabs representing a generated view of your model oriented by **Location**, **Equipment** and **Properties**. + +In these 3 model-oriented tabs, expandable cards will appear **automatically** as you build your model, allowing you to get different perspectives on your home. +For instance, you may want to see everything in a particular location, or everything pertaining to a certain class of equipment, like heating, or see a consolidated view of all items related to a certain property like temperature or humidity. +Clicking on the card will make it expand and reveal its contents. +Some of these cards will also feature glance badges that will extract some predefined information from your model and display it without you having to open the card. + +### Sitemaps + +[**Sitemaps**](./sitemaps.html) are hierarchies of pages and sub-pages that are comprised of simple controls from a well-defined, limited set. +They have existed in openHAB since its first versions, therefore you will probably encounter a lot of examples referring to them throughout the documentation and in the older community discussions. + +As they have less customization options than the other types of pages, notably as compared to the more powerful layout pages, they are also arguably easier to learn. +You can define them either in configuration files, with a special textual syntax, or in the Pages section of the administration area; however, **be aware that the main web UI is not currently able to display them**. + +Fortunately, there are however several other mature apps, notably the mobile apps for Android and iOS devices, but also Basic UI for the web, which are primarily dedicated to rendering sitemaps. + +### Layout Pages + +[**Layout pages**](./layout-pages.html), introduced in openHAB 3, are the most common and versatile way of displaying information in the main UI. +They have extensive options to control how they are laid out, and can display [**Widgets**](./building-pages.html) coming from the built-in libraries or widgets that you have designed or imported in your personal library. + +### Maps & Floorplans + +[**Maps**](./map-pages.html) and [**Floorplans**](./floorplan-pages.html) are Pages dedicated to displaying markers and other elements on a background overlay. + +In case of floorplans, the background will be a custom image defined by you; in case of maps, it will be a zoomable view of the world from a provider service, either an actual map layer or a satellite view, centered on the markers that you defined. + +### Charts + +[**Chart**](./chart-pages.html) pages are meant for interactive visualization of persisted data in the main UI. +Options include displaying time series, aggregates, heatmaps, calendars, with the ability to select the period and date to show. + +You can either start them from scratch by creating a new Chart page from the Pages section, or, when in the Analyzer, you can save the result of a analyzing session to a chart page for further customization and retaining the current view. + +### Tabbed Pages + +[**Tabbed Pages**](./tabbed-pages.html) are Pages used to combine several other Pages and render them in tabs. + +You simply configure the Pages that you wish to show, choose a few details about the tabs themselves (label, icon...) and can then consider the result as a single Page. + +### Summary + +The table below summarizes the different types of Pages and their compatibility: + +|Type|Designed in|Viewed in|Stored in| +|----|-----------|---------|---------| +|Home|main UI|main UI|JSON DB| +|[Sitemap](./sitemaps.html)|main UI or `.sitemap` file|Basic UI, iOS/Android apps and others|Configuration folder or JSON DB| +|[Layout](./layout-pages.html)|main UI|main UI|JSON DB| +|[Map](./map-pages.html)|main UI|main UI|JSON DB| +|[Floorplan](./floorplan-pages.html)|main UI|main UI|JSON DB| +|[Chart](./chart-pages.html)|main UI|main UI|JSON DB| +|[Tabbed](./tabbed-pages.html)|main UI|main UI|JSON DB| + +## Designing Pages + +You can see the list of your Pages in the administration area of the main UI under **Settings > Pages**, and from there, create new ones, as well as modify or remove existing ones. + +::: warning ATTENTION + +Sitemaps that you created in configuration files (`sitemaps/*.sitemap` files) are not displayed in this list. + +::: + +Every type of Page has its own designer but all of them with feature a **Design** tab and a **Code** tab. + +In the Design tab, you have a view of the Page that easily allows you to add [Widgets](./building-pages.html) in various parts. Every designer also has a _"general settings"_ table that will allow you to specify the identifier, the label, as well as some common settings. + +You will often find black buttons denoting that the component beside or beneath it can be customized. Some will open menus, that allow to open the configuration sheet for this particular component, reorder them, copy or paste them, remove them, or bring up the part of the YAML structure describing it and its descendents. + +![Widget Context Menu](./images/widget_context_menu.png) + +In the Code tab, you will be able to alter the component structure of the page, either with the sitemap syntax, or with YAML. In case of YAML, you can trigger autocompletion in many places of the YAML code: + +- at the root or component level, hit Ctrl+Space to start a `config` section, a `slots` section, or a `slots` section with a `default` slot; +- at the `config` level, hit Ctrl+Space before the property name to display a list of properties and add one of them; +- at the start of a property's value in `config`, hit Ctrl+Space to display a list of options if the property has some (including items). + +Some of the designers will also have a Run mode that you can activate with the switch on the bottom toolbar if present, or the Ctrl+R keyboard shortcut. It will allow you to preview the page as it would be rendered (some actions will still not work in Run mode). + +## Organizing & Displaying Pages + +Whereas in sitemaps, the entirety of the hierarchy is constrained within the sitemap definition, other types of pages are standalone, but can link to each other. + +You can indeed navigate from one page to the next, either with standard full-screen replacement, or in a modal window: you do that by configuring appropriate actions on some of the source page widgets, referencing the next. +For instance, clicking on a marker on a Floor plan page can open a popup, displaying a Tabbed page itself containing a Chart page, a Layout page and a Map page. + +By carefully designing the navigation & interaction between pages, you can make up a coherent and complex user interface system. +You have two entry points to this system at your disposal: + +1. the Overview page; +1. Pages that you promote to the main UI's Sidebar. + +### The Overview Page + +A Layout Page named **Overview** (id: `overview`) is automatically created when you start. +The contents of this page will be shown on the Overview tab of the home page (see above): this page will be displayed when you open the main UI with the default URL. + +As a result, it's arguably the most important of them all, because that's what yourself, your household members and your eventual guests will see first, possibly on their narrow mobile screens. + +You should therefore make good use of this page and carefully design it to be as straightforward as possible, and restrict it to the most important controls only instead of cramming it with information that might not be always useful or relevant; common examples include scenes for the entire home, buttons to indicate presence, various alerts, or dynamically displayed information based on context. +You can also use it as the starting point of a more elaborate menu system made of other Pages. + +You will likely notice, the more you use the user interface, that when you use it at all, you always come back to the same controls: that's because you (hopefully) made comprehensive automation rules to make sure all you need to get to the state that you want is triggering those rules - and this can be done with a mere button. Those are the critical controls that you should focus on when designing your home page. + +Of course, you will also probably need to dive into details from time to time, but everything doesn't have to fit on this overview page, so you can also create more of them that will be displayed upon clicking on a button. + +### The Sidebar + +Another entry point to start navigating your Pages is to put some of them on the main UI's Sidebar: they will appear on the left side, or in the left drawer on smaller screens, just below the openHAB logo. + +To put a page on the Sidebar, open the _Sidebar & Visibility_ option in a Page's general settings, and enable the **Show on Sidebar** toggle. + +**Sidebar order** allows to reorder the sidebar menu, choose an integer for each page on the sidebar, the lower values will make the page higher in the menu. + +## Additional Properties + +You can put additional properties on a page's root component config which will influence its display. + +### Visibility Restriction + +The `visibleTo` property allows you to control whether the page will be viewable based on the current user's role. +The built-in roles `user` and `administrator` will be configurable in the Design tab, but you can also use YAML, in which case an array of `role:(role)` and/or `user:(userid)` strings is to be specified. + +::: warning + +Do not be fooled into assuming the “visible only to” feature gives you any security, it’s only a way to restrict the visibility; it can be enough for non tech-savvy users but there are many ways to circumvent this restriction and talk to your items anyways. + +::: + +### Additional Styling + +The `pageStyle` and `modalStyle` properties can be used on a Page component itself to set additional CSS properties to the parent responsible for displaying the page, normally not accessible. +The styling will be applied to the `f7-page` component (in the former case, for pages displayed full screen, in the latter case, for pages displayed in a modal like a popup window). +These properties are useful for instance to configure the background, or alter some CSS properties for the entire page. diff --git a/ui/layout-pages.md b/ui/layout-pages.md new file mode 100644 index 000000000..f9d28704d --- /dev/null +++ b/ui/layout-pages.md @@ -0,0 +1,133 @@ +--- +title: Layout Pages +--- + +# Layout Pages + +Layout Pages are used in the main web user interface to display widgets in an organized manner. +You can choose among several layouts, based on whether you want to control the layout completely, or let the container decide where to place the widgets. + +![Layout Page Example](./images/layout_example.png) + +## Anatomy of a Layout Page + +A layout page can host one or multiple **blocks**, optionally followed by a **masonry** layout. + +In every block there could be an arbitrary set of **rows** or **cells** containers. + +In a cell container, you may add widgets from the standard cell widget library (or personal widgets, provided they're based on a `oh-cell` widget or derivative). + +In a row, you may add **columns** which will spread across the row, possibly wrapping their contents to another row (but still within the same `oh-grid-row`). +Each column can host one widget from the standard standalone widget library, or a personal one. + +The masonry container will decide how many columns it has based on the screen width, and will try to arrange the widgets automatically to form a compact layout. + +## Designing Responsive Layout Pages + +When you're designing a layout page, it's important to remember how this page will be used. +Sometimes, it will be on a phone, and other times on a bigger screen. + +With that in mind, it is advisable to build the page for the narrow screens first, and then make sure it expands gracefully to the wider ones, instead of thinking the other way around. If you plan to share the UI you built, you can expect them to access it with mobile devices rather than desktop computers. + +For cells and masonry, you don't have to worry about it, it will be handled for you. However, when you choose to keep control of the layout by making use of rows and columns, you need to take extra care about the responsive breakpoints. + +These are controlled using the parameters on the column (`oh-grid-col`) components - you can configure them in the Design tab with the *Column Options* menu entries, or in YAML with the Code tab or a "Edit YAML" options on a parent component. + +![Column Options](./images/responsive1.png) + +Using code, you can quickly duplicate the breakpoints for similar columns. + +The breakpoints work like this: the `width` property of the column is the default width that will be applied for the smallest screen, then `xsmall`, `small`, `medium`, `large`, `xlarge` width will apply on wider screens appropriately: + +| Property | Minimum screen width | Examples of devices | +|----------|----------------------|---------------------| +| `width` | No minimum, default | All devices including phones | +| `xsmall` | >= 480px | Smartphones in landscape mode | +| `small` | >= 568px | Smaller tablets (Nexus 7...) in portrait mode | +| `medium` | >= 768px | Most tablets in portrait mode | +| `large` | >= 1024px | Smaller/regular tablets (iPad, iPad Mini...) in landscape mode* | +| `xlarge` | >= 1200px | High-end tablets (iPad Pro...), desktops | + +* Note that the sidebar will potentially be displayed and has a width of 260px + +If you don't specify any width or breakpoints, the column will spread evenly on the row, without wrapping. This is fine for a couple of columns and simple widgets only, since on a small smartphone screen, you will rapidly get out of room. +That's why you may find yourself wanting to let a column be 100% by default, so that it occupies the entire screen, and then reduce the width for `medium` or `large` breakpoints. + +For example, given this set of rows & cols: + +```yaml +config: + label: Overview +blocks: + - component: oh-block + config: {} + slots: + default: + - component: oh-grid-row + config: {} + slots: + default: + - component: oh-grid-col + config: + width: "100" + small: "50" + medium: "33" + slots: + default: [] + - component: oh-grid-col + config: + width: "100" + small: "50" + medium: "33" + slots: + default: [] + - component: oh-grid-col + config: + width: "100" + medium: "33" + slots: + default: [] +``` + +This is how the layout will adapt depending on the width of the screen: + +![Responsive Layout](./images/responsive2.gif) + +## How to Build a Layout Page + +### Defining the Layout + +When you create a new Layout Page, you'll notice the 2 buttons **Add Block** and **Add Masonry**. +Clicking either will add the respective container to the page. +If you have multiple blocks, you can use the black context button (or the Code view) to reorder them with the Move Up/Move Down menu options. +You can also copy it and paste it as another block after they've been designed, if you wish to have multiple similar blocks. +You can also give a title to the block which will be displayed above it. + +Blocks are also good candidates to use the conditional visibility features on, with the `visible` and `visibleTo` properties. +You can restrict what's displayed on the page based on an expression, or who is currently viewing the page. +In Design mode, _you will not be able to see the effect of these properties_, notably `visible`, but in Run mode they will be taken into account. + +Under blocks, as explained above, you can have a mix of cells or rows. The 2 buttons **Add Row** and **Add Cells** will let you add more of them. +They will be added at the end of the block, but as for the blocks themselves, you can reorder them, or duplicate them, using the context menus or the YAML. + +In Design mode, rows will feature an additional step before you can actually add widgets: adding columns: the **Add Column** serves this purpose. + +### Adding Widgets + +Big gray placeholders with a "+" sign will appear where you can add Widgets. + +Depending on the type of containers, different widgets from the Standard library will be offered in the menu, as well as widgets from your personal library. + +You will also get an additional option: **Add from Model...**. This option will display your semantic model, and let you pick one or several items, then add them in the container. The Widget that will be added will be the _default widget_ for the item for that type of container which can be controlled with metadata: + +- for columns or masonry, the _default standalone widget_; +- for items inside list cards, the _default list item widget_; +- for cell containers, the _default cell widget_. + +![Add from Model](./images/add_from_model.png) + +::: tip REMARK + +The widget that will be put on the page is a _copy_ of the current widget as defined in metadata at the time of the addition; if you change this definition for an item, widgets that were already put on a page with the **Add from Model...** feature will **NOT** be updated. + +::: diff --git a/ui/map-pages.md b/ui/map-pages.md new file mode 100644 index 000000000..26a91be89 --- /dev/null +++ b/ui/map-pages.md @@ -0,0 +1,26 @@ +--- +title: Map Pages +--- + +# Map Pages + +Map Pages can display either fixed markers or markers representating items of type Location, on a map. + +![Map Example](./images/map_example.png) + +## Anatomy of a Map Page + +Map pages have some configuration properties that you mostly can define in the Design mode. +You can also add two types of markers in the Markers area. + +- A Marker is an icon that will represent a position; you can define an icon, a label, and either a fixed position or a Location item. You can also define an action that will be performed with the marker is clicked. +- A Circle Marker is a marker that will be represented as a circle on the map; it's useful for representing ranges. Instead of definining an icon, you can define a fixed radius in meters, or use the state of an item to control this radius. You can alter the look of the circle marker in the `markerConfig` YAML-only config property; it will be forwarded to the [LCircle](https://vue2-leaflet.netlify.app/components/LCircle.html#demo) component as props. + +## Building a Map Page + +In the Design view, configure the properties below Page Configuration. +Some of them, like the background tiles or overlay providers, will indicate that some additional properties may need to be defined in YAML, for instance to set an OpenWeatherMap API key for the associated overlays to work. + +To add markers, under Markers, click either **Add marker** or **Add circle marker** as necessary. Then click on the newly added entry to configure the marker. using the black context menu, you can reorder or remove existing markers. + +Use the Run mode to preview the page. diff --git a/configuration/sitemaps.md b/ui/sitemaps.md similarity index 81% rename from configuration/sitemaps.md rename to ui/sitemaps.md index 7a43e0824..f8968a4b6 100644 --- a/configuration/sitemaps.md +++ b/ui/sitemaps.md @@ -3,8 +3,6 @@ layout: documentation title: Sitemaps --- -{% include base.html %} - # Sitemaps In openHAB a collection of [Things]({{base}}/concepts/things.html) and [Items]({{base}}/concepts/items.html) represent physical or logical objects in the user's home automation setup. @@ -23,7 +21,7 @@ Sitemaps follow the syntax described in this article. For easy editing of sitemap definition files, we suggest to use one of the [openHAB supporting editors]({{base}}/configuration/editors.html). These provide full IDE support for sitemap files, including syntax checking and auto-completion. -The openHAB runtime distribution comes with a demo configuration package containing a sitemap file named [`demo.sitemap`](https://github.com/openhab/openhab-distro/blob/master/features/distro-resources/src/main/resources/sitemaps/demo.sitemap). +The openHAB runtime distribution comes with a demo configuration package containing a sitemap file named [`demo.sitemap`](https://github.com/openhab/openhab-distro/blob/main/features/distro-resources/src/main/resources/sitemaps/demo.sitemap). You may find it useful to use this file as a starting point in creating a sitemap that fits your personal home setup. The following example illustrates what a typical Sitemap definition might look like: @@ -85,7 +83,7 @@ openHAB supports these dependencies by providing parameters for dynamic behavior Be sure to check out the [Dynamic Sitemaps](#dynamic-sitemaps) chapter. For the technically interested: The Sitemap definition language is an -Xtext Domain Specific Language and the sitemap file model can be found [here](https://github.com/openhab/openhab-core/blob/master/bundles/org.openhab.core.model.sitemap/src/org/openhab/core/model/sitemap/Sitemap.xtext). +Xtext Domain Specific Language and the sitemap file model can be found [here](https://github.com/openhab/openhab-core/blob/main/bundles/org.openhab.core.model.sitemap/src/org/openhab/core/model/sitemap/Sitemap.xtext). ### Special Element 'sitemap' @@ -133,18 +131,18 @@ This provides the flexibility to present Items in the way desired in your home a **General remarks on parameters:** -- In the following definitions, parameters in `[square brackets]` are optional. +- In the following definitions, parameters in `[square brackets]` are optional. -- Parameters must be supplied in the order shown. +- Parameters must be supplied in the order shown. -- Common parameters, also known from [items definition](items.html#item-syntax): - - `item` defines the name of the Item you want to present (e.g. `Temperature`), [more details](items.html#item-name). - - `label` sets the textual description displayed next to the preprocessed Item data (e.g. "`Now [%s °C]`"), [more details](items.html#item-label). - - `icon` chooses the name of the icon file to show next to the element, [more details](items.html#icons). +- Common parameters, also known from [items definition](items.html#item-syntax): + - `item` defines the name of the Item you want to present (e.g. `Temperature`), [more details](items.html#item-name). + - `label` sets the textual description displayed next to the preprocessed Item data (e.g. "`Now [%s °C]`"), [more details](items.html#item-label). + - `icon` chooses the name of the icon file to show next to the element, [more details](items.html#icons). -- When an [Item]({{base}}/configuration/items.html) is defined, you have the opportunity to assign a label and/or an icon at that point. -If no label or icon are specified in the Sitemap, then the label and/or icon you assigned to the Item will be displayed. -Setting a value for `label` or `icon` of a Sitemap element will override the values defined for the linked Item. +- When an [Item]({{base}}/configuration/items.html) is defined, you have the opportunity to assign a label and/or an icon at that point. + If no label or icon are specified in the Sitemap, then the label and/or icon you assigned to the Item will be displayed. + Setting a value for `label` or `icon` of a Sitemap element will override the values defined for the linked Item. It has to be considered that if the label defined in a Channel or an Item contains text and state, these representations have to be overwritten separately in the Sitemap. In the following example a Item which has a label and state defined is overwritten. @@ -163,9 +161,10 @@ sitemap demo label="My home automation" { } } ``` + UoM = [Units of Measurment]({{base}}/concepts/units-of-measurement.html) -- Additional parameters such as `mappings` and `valuecolor` are described below. +- Additional parameters such as `mappings` and `valuecolor` are described below. ### Element Type 'Frame' @@ -197,7 +196,6 @@ Default item= [label=""] [icon=""] Presents an Item using the default UI representation specified by the type of the given Item. E.g., a `Dimmer` Item will be represented as a [Slider](#element-type-slider) element while a `Player` Item will be rendered with player button controls (Previous/Pause/Play/Next). - ### Element Type 'Text' ```perl @@ -307,16 +305,16 @@ Slider item= [label=""] [icon=""] [sendFrequency= This type presents a value as a user-adjustable control which slides from left (0) to right (100). -- `sendFrequency` is used to distinguish between long and short button presses in the classic (web) frontend. +- `sendFrequency` is used to distinguish between long and short button presses in the classic (web) frontend. This parameter defines the interval in milliseconds for sending increase/decrease requests. -- `switchSupport` is a parameter without an assignment. - - Classic UI: If specified, a short press on the "up" or "down" button switches the item "on" or "off" (0 or 100) respectively. - - Android app: If specified, a short press on the item row (except the slider itself) switches the item "on" or "off". - - This parameter has no effect in other UIs. +- `switchSupport` is a parameter without an assignment. + - Classic UI: If specified, a short press on the "up" or "down" button switches the item "on" or "off" (0 or 100) respectively. + - Android app: If specified, a short press on the item row (except the slider itself) switches the item "on" or "off". + - This parameter has no effect in other UIs. -- `minValue` (defaults to 0) and `maxValue` (defaults to 100) limit the possible range of the value (both included in the range). -- `step` (defaults to 1) defines the distance between two possible/selectable datapoints on the slider. +- `minValue` (defaults to 0) and `maxValue` (defaults to 100) limit the possible range of the value (both included in the range). +- `step` (defaults to 1) defines the distance between two possible/selectable datapoints on the slider. **Example:** @@ -336,7 +334,6 @@ This element is a combined control for something like a rgb or rgbw light where The down-button decreases brightness to zero and switches the light off. The up-button sets brightness to full but keeps the previous color (hue). The middle button opens an overlay to finetune your color. A color wheel let you pick the hue and a slider allows to set the brightness. - - `sendFrequency` is used to distinguish between long and short button presses in the classic (web) frontend. This parameter defines the interval in milliseconds for sending increase/decrease requests. @@ -393,7 +390,7 @@ Image [item=] [icon=""] url="" [label=":8080/static/YourImageFile.png. +Alternatively, the image file (e.g. YourImageFile.png) may be stored locally in the $OPENHAB_CONF/html folder, and will be accessible through the static route, `https://:8080/static/YourImageFile.png`. - `item` can refer to either an Image Item whose state is the raw data of the image, or a String Item whose state is an URL that points to an image. Some clients may not (yet) consider `item`. - `url` is the default URL from which to retrieve the image, if there is no associated Item or if the associated item's state is not a URL. @@ -444,18 +441,18 @@ Chart [item=] [icon=""] [label=""] [refresh=xxxx] Adds a time-series chart object for the display of logged data. -- `refresh` defines the refresh period of the Image (in milliseconds). +- `refresh` defines the refresh period of the Image (in milliseconds). -- `service` sets the persistence service to use. -If no service is specified, openHAB will use the first queryable persistence service it finds. -Therefore, for an installation with only a single persistence service, this is not required. +- `service` sets the persistence service to use. + If no service is specified, openHAB will use the first queryable persistence service it finds. + Therefore, for an installation with only a single persistence service, this is not required. -- `period` is the scale of the time axis. Valid values are `h, 4h, 8h, 12h, D, 2D, 3D, W, 2W, M, 2M, 4M or Y`. +- `period` is the scale of the time axis. Valid values are `h, 4h, 8h, 12h, D, 2D, 3D, W, 2W, M, 2M, 4M or Y`. -- `begin` / `end` sets the beginning and end of the time axis. -Valid values are in the format: "yyyyMMddHHmm" (yyyy = year, MM = month, dd = day, HH = hour (0-23), mm = minutes). +- `begin` / `end` sets the beginning and end of the time axis. + Valid values are in the format: `yyyyMMddHHmm` (`yyyy` = year, `MM` = month, `dd` = day, `HH` = hour (0-23), `mm` = minutes). -- `legend` is used to show or to hide the chart legend. +- `legend` is used to show or to hide the chart legend. Valid values are `true` (always show the legend) and `false` (never show the legend). If this parameter is not set, the legend is hidden if there is only one chart series. @@ -499,7 +496,6 @@ Its power state is represented by a binary Switch Item. Its channel number is a discrete number Item that may only be set to one of three states. By using a Switch or Selection element with a mappings array, you can replace these meaningless values with user-friendly descriptions for display on the user interface. - This mapping changes the displayed power state of the TV from "ON" and "OFF" to the more accurate terms, "on" and "standby". Similarly, mapping above changes the numbers "1", "2", and "3" to "DasErste", "BBC One", and "Cartoon Network" respectively. @@ -654,105 +650,31 @@ sitemap demo label="My home automation" { Explanation: -- The Sitemap "demo" with the shown title "My home automation" is defined. +- The Sitemap "demo" with the shown title "My home automation" is defined. -- One first Frame with a date stamp is shown. +- One first Frame with a date stamp is shown. -- Another Frame with a visual label "Demo" is presented, containing: +- Another Frame with a visual label "Demo" is presented, containing: - - A Switch for the Item "Lights" + - A Switch for the Item "Lights" - - A Text element showing a temperature in a given format + - A Text element showing a temperature in a given format - - A Group element. Upon clicking the element, a new view containing all "Heating" Items will be shown. + - A Group element. Upon clicking the element, a new view containing all "Heating" Items will be shown. - - Another Text element showing a "Multimedia" summary, e.g. "Currently playing". + - Another Text element showing a "Multimedia" summary, e.g. "Currently playing". The element is additionally the host for a nested block. By clicking in the element, a new view with two elements is presented: - - A Selection presenting four options in a modal dialog prompt - - A Slider to set the volume (e.g. 0-100%) + - A Selection presenting four options in a modal dialog prompt + - A Slider to set the volume (e.g. 0-100%) ## Further notes and comparison details -- String comparisons are case sensitive, so `==ON` is not the same as `==on`. +- String comparisons are case sensitive, so `==ON` is not the same as `==on`. -- DateTime comparisons are relative to the current time and specified in seconds. +- DateTime comparisons are relative to the current time and specified in seconds. So the expression `Lights_On_Time > 300` will return true if the DateTime Item is set to a value that's newer than the past 5 minutes (300 seconds). -- Further examples for defining Sitemaps can be found in our [openHAB-Samples](https://github.com/openhab/openhab/wiki/Samples-Sitemap-Definitions) section. - - +- Further examples for defining Sitemaps can be found in our [openHAB-Samples](https://github.com/openhab/openhab/wiki/Samples-Sitemap-Definitions) section. diff --git a/ui/tabbed-pages.md b/ui/tabbed-pages.md new file mode 100644 index 000000000..cb2c5fb78 --- /dev/null +++ b/ui/tabbed-pages.md @@ -0,0 +1,18 @@ +--- +title: Tabbed Pages +--- + +# Tabbed Pages + +Tabbed Pages are composite Pages which are able to display other Pages in tabs. + +![Tabbed Example](./images/tabbed_example.png) + +## Anatomy of a Tabbed Page + +Tabbed pages are very simple: you can only add `oh-tabs` components which will have a label, icon, and a reference to another Page. +The tabs will be displayed in the order they're defined. + +## Building a Tabbed Page + +In the Design view, under Tabs, click **Add tab** to add another tab. Then click on the newly added entry to configure the tab. using the black context menu, you can reorder or remove existing tabs. diff --git a/update-external-resources.sh b/update-external-resources.sh index 3fa14c250..d8a66bf67 100755 --- a/update-external-resources.sh +++ b/update-external-resources.sh @@ -48,16 +48,16 @@ pull_or_clone_repo() { } # Pull or clone the repo with a specified branch into the given folder -pull_or_clone_repo "openhab-distro" "openhab/openhab-distro.git" master +pull_or_clone_repo "openhab-distro" "openhab/openhab-distro.git" main pull_or_clone_repo "openhab-addons" "openhab/openhab-addons.git" main -pull_or_clone_repo "openhabian" "openhab/openhabian.git" master -pull_or_clone_repo "openhab-alexa" "openhab/openhab-alexa.git" master -pull_or_clone_repo "openhab-mycroft" "openhab/openhab-mycroft.git" master -pull_or_clone_repo "openhab-android" "openhab/openhab-android.git" master -pull_or_clone_repo "openhab-google-assistant" "openhab/openhab-google-assistant.git" master -pull_or_clone_repo "openhab-webui" "openhab/openhab-webui.git" master -pull_or_clone_repo "openhab-addons/bundles/org.openhab.binding.zigbee" "openhab/org.openhab.binding.zigbee.git" master -pull_or_clone_repo "openhab-addons/bundles/org.openhab.binding.zwave" "openhab/org.openhab.binding.zwave.git" master +pull_or_clone_repo "openhabian" "openhab/openhabian.git" main +pull_or_clone_repo "openhab-alexa" "openhab/openhab-alexa.git" main +pull_or_clone_repo "openhab-mycroft" "openhab/openhab-mycroft.git" main +pull_or_clone_repo "openhab-android" "openhab/openhab-android.git" main +pull_or_clone_repo "openhab-google-assistant" "openhab/openhab-google-assistant.git" main +pull_or_clone_repo "openhab-webui" "openhab/openhab-webui.git" main +pull_or_clone_repo "openhab-addons/bundles/org.openhab.binding.zigbee" "openhab/org.openhab.binding.zigbee.git" main +pull_or_clone_repo "openhab-addons/bundles/org.openhab.binding.zwave" "openhab/org.openhab.binding.zwave.git" main # copy zigbee readme to where the groovy script will see it cp $resourcefolder/openhab-addons/bundles/org.openhab.binding.zigbee/org.openhab.binding.zigbee/README.md $resourcefolder/openhab-addons/bundles/org.openhab.binding.zigbee/ #rm -rf openhab-addons/bundles/org.openhab.binding.zwave @@ -68,7 +68,7 @@ echo_process "Fetching feature.xml file from the snapshot repository..." # Getting all possibly relevant xml files wget -r -l 2 -npdH -A '*3.0.*.xml' -P "$resourcefolder/jfrog-files" "https://openhab.jfrog.io/openhab/libs-snapshot/org/openhab/distro/openhab-addons/" # Copy the latest feature file into the finally used feature.xml -cp `ls .external-resources/jfrog-files/openhab-addons-3.0.*-*-features.xml | sort | tail -1` .external-resources/jfrog-files/feature.xml +cp `ls .external-resources/jfrog-files/openhab-addons-3.0.*-features.xml | sort | tail -1` .external-resources/jfrog-files/feature.xml echo_process "Running Maven.... " mvn clean
PropertyDescription
group.nameThe group name - this is used to link the parameters into the group, along with the groupName option in the parameter (mandatory).